From 2571ce38d7c9b2d05d2ff5d09e11090a103178fc Mon Sep 17 00:00:00 2001 From: keiichi Date: Wed, 30 Sep 1998 05:23:57 +0000 Subject: [PATCH] Sync up with Semi-gnus 6.8.19 --- lisp/ChangeLog | 1176 +++++++- lisp/Makefile.in | 3 + lisp/base64.el | 274 -- lisp/date.el | 124 - lisp/dgnushack.el | 10 +- lisp/drums.el | 186 -- lisp/gnus-agent.el | 246 +- lisp/gnus-art.el | 290 +- lisp/gnus-bcklg.el | 3 +- lisp/gnus-cache.el | 41 +- lisp/gnus-draft.el | 19 +- lisp/gnus-eform.el | 3 +- lisp/gnus-ems.el | 83 +- lisp/gnus-group.el | 95 +- lisp/gnus-i18n.el | 18 +- lisp/gnus-int.el | 11 +- lisp/gnus-kill.el | 9 +- lisp/gnus-logic.el | 6 +- lisp/gnus-mh.el | 2 +- lisp/gnus-msg.el | 162 +- lisp/gnus-range.el | 2 +- lisp/gnus-salt.el | 157 +- lisp/gnus-score.el | 38 +- lisp/gnus-soup.el | 11 +- lisp/gnus-spec.el | 18 +- lisp/gnus-srvr.el | 50 +- lisp/gnus-start.el | 74 +- lisp/gnus-sum.el | 278 +- lisp/gnus-topic.el | 28 +- lisp/gnus-util.el | 126 +- lisp/gnus-uu.el | 332 ++- lisp/gnus-win.el | 52 +- lisp/gnus-xmas.el | 111 +- lisp/gnus.el | 151 +- lisp/ietf-drums.el | 242 -- lisp/mail-parse.el | 65 - lisp/mailcap.el | 847 ------ lisp/message.el | 315 ++- lisp/messcompat.el | 5 + lisp/mm-decode.el | 134 - lisp/mm-encode.el | 202 -- lisp/mm-util.el | 144 - lisp/mm-view.el | 104 - lisp/mm.el | 1283 --------- lisp/nnagent.el | 13 +- lisp/nndir.el | 6 +- lisp/nndoc.el | 161 +- lisp/nndraft.el | 2 - lisp/nneething.el | 12 +- lisp/nnheader.el | 1 - lisp/nnkiboze.el | 4 +- lisp/nnmail.el | 201 +- lisp/nnmh.el | 8 +- lisp/nntp.el | 108 +- lisp/nnvirtual.el | 17 +- lisp/pop3-fma.el | 111 +- lisp/qp.el | 90 - lisp/rfc1522.el | 276 -- lisp/rfc2047.el | 289 -- lisp/rfc2231.el | 142 - lisp/smtp.el | 2 +- lisp/time-date.el | 138 - texi/ChangeLog | 123 +- texi/Makefile.in | 35 +- texi/emacs-mime.texi | 755 ------ texi/gnus-faq-ja.texi | 468 ++++ texi/gnus-ja.texi | 7135 ++++++++++++++++++++++++++++++++++++++++++++++--- texi/gnus-terms.ja | 23 +- texi/gnus.texi | 671 +++-- texi/message-ja.texi | 1314 +++++++++ texi/message.texi | 51 +- 71 files changed, 12370 insertions(+), 7316 deletions(-) delete mode 100644 lisp/base64.el delete mode 100644 lisp/date.el delete mode 100644 lisp/drums.el delete mode 100644 lisp/ietf-drums.el delete mode 100644 lisp/mail-parse.el delete mode 100644 lisp/mailcap.el delete mode 100644 lisp/mm-decode.el delete mode 100644 lisp/mm-encode.el delete mode 100644 lisp/mm-util.el delete mode 100644 lisp/mm-view.el delete mode 100644 lisp/mm.el delete mode 100644 lisp/qp.el delete mode 100644 lisp/rfc1522.el delete mode 100644 lisp/rfc2047.el delete mode 100644 lisp/rfc2231.el delete mode 100644 lisp/time-date.el delete mode 100644 texi/emacs-mime.texi create mode 100644 texi/gnus-faq-ja.texi create mode 100644 texi/message-ja.texi diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 68e3957..881cffe 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,901 @@ +Thu Sep 24 19:29:43 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.44 is released. + +1998-09-23 20:34:27 Markus Rost + + * gnus.el: Extend autoloads. + +1998-09-15 18:57:48 Lars Magne Ingebrigtsen + + * gnus-draft.el (gnus-draft-send): Bind required headers to nil. + (gnus-draft-send): No. + +1998-09-14 15:16:42 Lars Magne Ingebrigtsen + + * message.el (message-fix-before-sending): Comment out invisible + text things. + +1998-09-14 14:30:09 Tatsuya Ichikawa + + * gnus-agent.el (gnus-agent-file-coding-system): Renamed. + +1998-09-13 Mike McEwan + + * gnus-agent.el (gnus-agent-expire): Stop expiry barfing on killed + groups. + +1998-09-13 07:02:04 Lars Magne Ingebrigtsen + + * gnus-agent.el (gnus-agent-save-group-info): Create proper active + lines. + +1998-09-10 02:40:28 Lars Magne Ingebrigtsen + + * gnus-draft.el (gnus-draft-edit-message): Save the buffer. + +Sun Sep 6 20:09:36 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.43 is released. + +1998-09-06 19:41:54 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-remove-thread): Unhide threads before + removing. + (gnus-data-compute-positions): Ditto. + +1998-08-31 11:40:13 Shuhei KOBAYASHI + + * nnmail.el (nnmail-date-to-time): Parse time locally if no + timezone. + +1998-08-31 11:21:53 Lars Magne Ingebrigtsen + + * gnus-srvr.el (gnus-browse-foreign-server): Protect against + out-of-range articles. + + * gnus-msg.el (gnus-summary-reply): Don't inhibit posting styles. + +1998-08-30 22:33:33 Lars Magne Ingebrigtsen + + * gnus-score.el (gnus-summary-increase-score): Temporary third + majuscle. + +1998-08-30 22:32:31 Dan Christensen + + * gnus-score.el (gnus-summary-increase-score): Score thread on + Message-ID. + +1998-08-29 02:46:00 Simon Josefsson + + * gnus-sum.el (gnus-summary-mark-article-as-read): + (gnus-summary-mark-article-as-unread): + (gnus-summary-mark-article): Call gnus-request-update-mark. + +1998-08-29 Mike McEwan + + * gnus-agent.el (gnus-agent-fetch-headers): Cater for when there's + no .agentview, all articles have been expired, or everything bar a + few downloaded arts have been expired. + (gnus-agent-expire): Mark *all* expired articles as read. + +Sat Aug 29 19:17:19 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.42 is released. + +1998-08-29 17:06:27 Simon Josefsson + + * gnus-sum.el (gnus-summary-make-menu-bar): Typo. + +1998-08-29 12:47:42 Tatsuya Ichikawa + + * gnus-agent.el: Use nnheader-insert-file-contents. + +1998-08-29 12:18:18 Lars Magne Ingebrigtsen + + * nnvirtual.el (nnvirtual-request-group): Update the right group. + +1998-08-27 16:46:38 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-data-compute-positions): Didn't work on hidden + threads. + + * nnvirtual.el (nnvirtual-request-group): Work when always + updating. + (nnvirtual-always-rescan): Default to t. + +Thu Aug 27 11:03:59 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.41 is released. + +1998-08-27 Mike McEwan + + * gnus-agent.el (gnus-agent-fetch-group-1): Leave the calculation + of `articles' to `gnus-agent-fetch-headers'. + (gnus-agent-fetch-headers): We only want headers that are after + the last entry in `gnus-group-alist'. + +1998-08-27 09:45:42 Lars Magne Ingebrigtsen + + * Makefile.in (warn): New. + + * gnus.el: Removed unreferenced bound variables all over. + + * gnus-group.el (gnus-update-group-mark-positions): Removed topic. + + * gnus-cus.el (gnus-group-customize): No part. + + * gnus-agent.el (gnus-category-line-format-alist): Renamed specs. + (gnus-category-insert-line): Use it. + +Thu Aug 27 09:29:53 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.40 is released. + +1998-08-27 09:19:31 Lars Magne Ingebrigtsen + + * gnus-agent.el (gnus-agent-mode): Only toggle plugged in group + mode. + +1998-08-27 07:25:47 Lars Balker Rasmussen + + * message.el (message-supersede): Check the right headers. + +1998-08-26 13:51:18 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-sort-threads): Changed level. + +1998-08-26 Mike McEwan + + * gnus-sum.el (gnus-build-all-threads): `save-excursion' and + `set-buffer' back to `gnus-summary-buffer' in order to access + buffer-local variables. + +1998-08-26 06:00:44 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-data-compute-positions): More and faster. + +1998-08-26 05:41:15 Matt Pharr + + * message.el (message-wash-subject): Remove more. + +1998-08-25 11:33:28 Tatsuya Ichikawa + + * gnus-cache.el (gnus-cache-overview-coding-system): New + variable. + +1998-08-25 08:23:05 Albert L. Ting + + * gnus-group.el (gnus-fetch-group-other-frame): New command. + +1998-08-25 07:24:51 Lars Magne Ingebrigtsen + + * gnus-uu.el (gnus-uu-grab-articles): Check for pseudos. + + * gnus-art.el (gnus-ignored-headers): More headers. + + * gnus-sum.el (gnus-summary-move-article): Update the right + group. + +1998-08-23 14:31:31 Lars Magne Ingebrigtsen + + * gnus-art.el (gnus-ignored-headers): More headers. + +1998-08-23 Mike McEwan + + * gnus-agent.el (gnus-agent-copy-nov-line): Return to beginning of + line before next read. + (gnus-agent-braid-nov): Remove redundant `let'. + +1998-08-22 10:40:54 Lars Magne Ingebrigtsen + + * gnus-art.el (article-display-x-face): Allow multiple X-Faces + under XEmacs. + +Sat Aug 22 10:28:25 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.39 is released. + +1998-08-22 10:06:03 Lars Magne Ingebrigtsen + + * gnus-art.el (gnus-ignored-headers): Added more headers. + +1998-08-21 02:49:56 Lars Magne Ingebrigtsen + + * nnweb.el (nnweb-type): Doc fix. + + * gnus-sum.el (gnus-summary-set-process-mark): Move to the right + article. + +1998-08-20 23:10:01 Lars Magne Ingebrigtsen + + * nnmail.el (nnmail-spool-file): Allow lists of files. + +1998-08-20 Per Starback + + * gnus/gnus-start.el (gnus-check-first-time-used): Change current + buffer before creating help group. + +1998-08-20 01:33:08 Lars Magne Ingebrigtsen + + * gnus-msg.el (gnus-message-style-insertions): New variable. + (gnus-message-insert-stylings): New function. + (gnus-configure-posting-styles): Use them. + + * gnus-topic.el (gnus-topic-mode): Don't alter summary-exit-hook. + + * gnus-sum.el (gnus-select-newsgroup): Don't update group. + + * gnus-msg.el (gnus-setup-message): Bind message-mode-hook. + (gnus-inhibit-posting-styles): New variable. + (gnus-summary-reply): Use it. + (gnus-configure-posting-styles): Ditto. + + * gnus-group.el (gnus-group-suspend): Don't kill dribble buffer. + +Thu Aug 20 00:28:35 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.38 is released. + +1998-08-20 00:02:50 Lars Magne Ingebrigtsen + + * message.el (message-mail): Doc fix. + +1998-08-19 23:22:02 Bill Pringlemeir + + * messcompat.el (message-send-mail-function): Initialized from + send-mail-function. + +1998-08-19 23:20:42 Martin Larose + + * message.el (message-send-coding-system): New variable. + +1998-08-19 19:00:37 Lars Magne Ingebrigtsen + + * gnus-msg.el (gnus-configure-posting-styles): Reinstated most of + old code. + + * gnus-start.el (gnus-save-newsrc-file): Use coding system. + +1980-06-08 03:53:56 Mike McEwan + + * gnus-agent.el (gnus-agent-braid-nov): Go to right place. + +1980-06-08 03:01:48 Shuhei KOBAYASHI + + * gnus-group.el (gnus-group-suspend): Fix. + +1998-08-18 00:25:11 Lars Magne Ingebrigtsen + + * gnus-cite.el (gnus-cited-opened-text-button-line-format-alist): + New n spec. + + * gnus-group.el (gnus-group-suspend): Use mapcar. + +1998-08-17 14:35:33 Lars Magne Ingebrigtsen + + * gnus-ems.el (gnus-add-minor-mode): Set mode var. + + * gnus-start.el (gnus-slave-mode): New function. + + * gnus-msg.el (gnus-post-method): Work with current in nndraft. + +1998-08-16 23:30:14 Lars Magne Ingebrigtsen + + * gnus-art.el (gnus-request-article-this-buffer): Allow recursive + selection of nneething groups. + + * nneething.el (nneething-address): Renamed from directory. + +Sun Aug 16 18:59:41 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.37 is released. + +1998-08-16 14:52:43 Lars Magne Ingebrigtsen + + * gnus.el: Autoload gnus-summary-wide-reply. + + * gnus-sum.el (gnus-get-newsgroup-headers): Return the value of + In-Reply-To. + + * gnus-msg.el (gnus-setup-message): Posting styles have to be + configured in message-mode-hook. + + * nntp.el (nntp-connection-timeout): Restored. + (nntp-open-connection): Use it. + +1998-08-15 22:46:49 Lars Magne Ingebrigtsen + + * gnus-group.el (gnus-group-make-useful-group): Doc fix. + + * gnus-art.el (gnus-article-push-button): Place point where you + click. + +1998-08-15 Mike McEwan + + * gnus-agent.el (gnus-agent-save-group-info): Update "groups" file + if `nntp-server-list-active-group' is nil. + +1998-08-15 00:35:03 Lars Magne Ingebrigtsen + + * gnus-score.el (gnus-summary-increase-score): Swap t and r. + + * gnus-sum.el (gnus-remove-thread): Didn't work with sparse + threads. + +1998-08-14 François Pinard + + * nndoc.el (nndoc-generate-mime-parts-head): Use original Subject, + Message-ID, and References in fully blown articles. + +Fri Aug 14 23:03:51 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.36 is released. + +1998-08-14 21:49:22 Lars Magne Ingebrigtsen + + * gnus.el (load): Push onto list. + + * gnus-group.el (gnus-group-get-new-news-this-group): Store active + info. + +Fri Aug 14 21:41:59 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.35 is released. + +1998-08-14 00:00:15 Lars Magne Ingebrigtsen + + * gnus-srvr.el (gnus-server-scan-server): Error better. + + * nndir.el: Make independent of nnmh. + Revert. + + * message.el (message-remove-text-with-property): New function. + (message-fix-before-sending): Check for invisible text. + + * gnus.el (load): Create the Gnus buffer even when no splash. + + * gnus-msg.el (gnus-setup-message): Add buffer to list. + + * gnus-win.el (gnus-remove-some-windows): Use new buffer system. + (gnus-delete-windows-in-gnusey-frames): Ditto. + + * gnus.el (gnus-add-buffer): New function. + +1998-08-13 23:38:21 Lars Magne Ingebrigtsen + + * gnus-xmas.el (gnus-buffer-list): Removed. + + * gnus.el (gnus-buffers): New variable. + (gnus-get-buffer-create): New function; used throughout. + (gnus-buffers): New function. + + * gnus-msg.el (gnus-configure-posting-styles): Go to eoh + reliably. + + * message.el (message-goto-eoh): New command. + +1998-08-13 23:13:53 Simon Josefsson + + * gnus-msg.el (gnus-setup-message): use message-setup-hook + instead + (gnus-configure-posting-styles): new posting-style 'body + (gnus-configure-posting-styles): insert headers immediately + +1998-08-13 13:05:36 Lars Magne Ingebrigtsen + + * gnus-score.el (gnus-summary-increase-score): Change thread to + "r". + + * gnus-sum.el (gnus-summary-scroll-down): New command and + keystroke. + + * gnus-agent.el (gnus-agent-expire): Check that directories + exist. + +1998-08-12 20:56:41 Simon Josefsson + + * gnus-cache.el (gnus-uncacheable-groups): doc change + (gnus-cacheable-groups): new variable + (gnus-cache-possibly-enter-article): use it + +1998-08-12 22:30:16 Lars Magne Ingebrigtsen + + * nntp.el (nntp-encode-text): Too much text. + +1998-08-12 21:58:50 Matt Pharr + + * message.el (message-make-forward-subject-function): New + variable. + (message-wash-forwarded-subjects): Ditto. + +Wed Aug 12 21:09:58 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.34 is released. + +1998-08-12 13:32:38 Lars Magne Ingebrigtsen + + * gnus-msg.el (gnus-post-method): Don't use `current' in drafts. + + * gnus-score.el (gnus-summary-increase-score): Changed T to h and + downcase. + +Tue Aug 11 20:46:25 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.33 is released. + +1998-08-11 20:07:55 Lars Magne Ingebrigtsen + + * gnus-group.el (gnus-group-apropos): Check symbol value. + + * gnus-cite.el (gnus-cited-closed-text-button-line-format): + Changed. + +Tue Aug 11 19:42:42 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.32 is released. + +1998-08-11 13:36:56 Lars Magne Ingebrigtsen + + * nndoc.el (nndoc-type-alist): Do MIME digests before multiparts. + + * gnus.el (gnus-predefined-server-alist): Expand vars. + +1998-08-09 Dave Love + + * gnus-art.el (article-display-x-face): Don't try (and fail) to + display multiple faces. + +1998-08-11 11:41:43 Lars Magne Ingebrigtsen + + * gnus-art.el (gnus-header-newsgroups-face): Don't bold so much. + + * gnus-group.el (gnus-group-rename-group): Remove old group name + from list of killed groups. + + * gnus-int.el (gnus-get-function): Error better. + + * gnus-art.el (gnus-article-narrow-to-signature): Inhibit motion + hooks. + (article-hide-pgp): Delete text instead of hiding it. + + * gnus-group.el (gnus-group-find-new-groups): Ditto. + + * gnus-start.el (gnus-find-new-newsgroups): Accept C-u C-u as a + total query. + +1998-08-10 09:31:36 Lars Magne Ingebrigtsen + + * gnus-art.el (gnus-article-prepare): Place point at the beginning + of the body. + + * gnus-cite.el (gnus-cite-attribution-face): Changed to italic. + + * gnus-art.el (gnus-article-edit-article): Delete "annotation" + text. + (gnus-insert-prev-page-button): Mark as annotation. + (gnus-insert-next-page-button): Ditto. + + * gnus-cite.el (gnus-cited-closed-text-button-line-format): New + variable. + (gnus-cited-closed-text-button-line-format-alist): Ditto. + (gnus-article-toggle-cited-text): Toggle between different + symbols. + +1998-08-09 19:58:36 Lars Magne Ingebrigtsen + + * gnus.el (gnus-version): Remove backend info. + +Sun Aug 9 19:37:40 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.31 is released. + +1998-08-09 François Pinard + + * nndoc.el: Split MIME multipart messages, maybe recursively. + (nndoc-mime-parts-type-p, nndoc-transform-mime-parts, + nndoc-generate-mime-parts-head, nndoc-dissect-mime-parts, + nndoc-dissect-mime-parts-sub): New functions. + + * nndoc.el: Quoting boundaries is optional, for multipart digests. + +1998-08-09 17:51:25 Lars Magne Ingebrigtsen + + * gnus-agent.el (gnus-agent-save-group-info): Check whether file + exists. + + * message.el (message-goto-signature): Return nil if no sig. + (message-delete-not-region): Delete properly if no sig. + +1998-08-09 17:26:30 Simon Josefsson + + * gnus-srvr.el (gnus-browse-make-menu-bar): select did read + +1998-08-09 15:51:43 Lars Magne Ingebrigtsen + + * gnus-sum.el (t): Added keystroke for W W C. + + * gnus-cite.el (gnus-article-hide-citation-maybe): hiden->hidden. + +Sun Aug 9 15:46:16 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.30 is released. + +1998-08-09 10:48:31 Lars Magne Ingebrigtsen + + * message.el (message-cite-original-without-signature): Peel off + blank lines. + + * gnus-art.el (gnus-article-maybe-highlight): Doc fix. + + * gnus-sum.el (gnus-data-enter-list): Threw away all new list data + at the beginning of the buffer. + +1998-08-07 01:41:29 Gareth Jones + + * gnus-score.el (gnus-summary-increase-score): Don't downcase + before lookin in char-to-header. + +1998-08-07 01:33:22 Lars Magne Ingebrigtsen + + * gnus.el (gnus-predefined-server-alist): Too many parentheses. + +1998-08-06 11:20:08 Lars Magne Ingebrigtsen + + * gnus.el (gnus-continuum-version): Include quassia. + + * gnus-sum.el (gnus-data-enter-list): Check before entering list. + +1998-08-06 11:13:56 Francois Felix Ingrand + + * gnus-salt.el (gnus-generate-vertical-tree): Don't go too far to + the left. + +Thu Aug 6 07:58:17 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.29 is released. + +1998-08-06 07:10:31 Lars Magne Ingebrigtsen + + * gnus-agent.el (gnus-agent-expire): Check whether (caar + gnus-agent-article-alist) is nil. + + * gnus.el (gnus-read-method): Allow selecting predefined servers. + + * gnus-topic.el (gnus-topic-update-topic-line): Compute right + number when inserting missing topic lines. + + * gnus-start.el (gnus-get-unread-articles): Check that the group + is alive. + + * gnus-score.el (gnus-score-load-score-alist): Better error + messaging. + +Tue Aug 4 09:42:31 1998 Kurt Swanson + + * gnus-salt.el (gnus-pick-mouse-pick-region): Fix picking bug due + to use of gnus-read-event-char. + +1998-07-28 Dave Love + + * gnus-group.el (gnus-group-fetch-faq): Don't mung dots in group + name. + +1998-07-27 Dave Love + + * gnus-topic.el (gnus-topic-mode-map): Provide Emacs tty + alternatives to [tab], [(meta tab)]. + +1998-08-06 04:41:38 Lars Magne Ingebrigtsen + + * gnus-start.el (gnus-startup-file-coding-system): New variable. + (gnus-read-init-file): Use it. + (gnus-read-newsrc-el-file): Ditto. + + * gnus-sum.el (gnus-thread-ignore-subject): Changed default. + +1998-08-06 04:38:02 Richard Stallman + + * message.el (sendmail): Required. + +1998-08-06 02:11:37 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-auto-select-same): Dix fix. + +1998-08-04 Mike McEwan + + * gnus-sum.el (gnus-select-newsgroup): Set + `gnus-newsgroup-unselected' when selecting specific articles via + SELECT-ARTICLE - there may be more headers to fetch if + `gnus-fetch-old-headers' is non-nil. + (gnus-summary-read-group): pass SELECT-ARTICLE to + `gnus-summary-read-group-1' and reset to nil when going to next group. + (gnus-summary-read-group): Change `select-article' to + `select-articles' for consistency. + +Tue Aug 4 05:25:01 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.28 is released. + +1998-08-03 22:00:25 Lars Magne Ingebrigtsen + + * nndoc.el (nndoc-set-delims): Removed article-end. + (nndoc-dissect-buffer): Use eobp. + +1998-08-03 19:59:36 Trung Tran-Duc + + * nntp.el (nntp-open-connection): Bind coding-system-for-write. + +1998-07-31 16:45:36 Lars Magne Ingebrigtsen + + * gnus-group.el (gnus-group-read-ephemeral-group): Make the server + unique. + +1998-07-28 François Pinard + + * gnus-uu.el (gnus-uu-reginize-string): Consider the number of + parts as part of the fixed subject, instead of a wild quantity. + +1998-07-30 21:47:23 Lars Magne Ingebrigtsen + + * gnus-cache.el (gnus-summary-insert-cached-articles): Sort + articles. + + * nndir.el (nndir): Use nnml functions. + +Mon Jul 27 03:26:00 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.27 is released. + +1998-07-27 02:27:11 Lars Magne Ingebrigtsen + + * gnus-topic.el (gnus-topic-update-unreads): New function. + + * gnus-sum.el (gnus-summary-limit): Update mode line. + + * gnus-soup.el (gnus-soup-add-article): Update mode line. + + * gnus-group.el (gnus-group-make-menu-bar): Bug. + + * gnus-art.el (gnus-article-make-menu-bar): Menu. + + * gnus-sum.el (gnus-summary-make-menu-bar): Bug reports. + + * gnus-topic.el (gnus-topic-mode-map): h -> H. + +1998-07-19 16:59 Simon Josefsson + + * gnus-util.el (gnus-netrc-syntax-table): @ is whitespace + +1998-07-17 Gordon Matzigkeit + + * gnus-uu.el (gnus-uu-reginize-string): Simplify by looking + from back to front for part numbers, rather than skipping + leading ``version numbers.'' + + (gnus-uu-part-number): Make consistent with + gnus-uu-reginize-string. + +1998-07-26 19:01:58 Lars Magne Ingebrigtsen + + * gnus-art.el (gnus-request-article-this-buffer): Pass along + header. + + * gnus-sum.el (gnus-summary-update-article): Don't pass along + iheader to regeneration routine. + +1998-07-27 KOSEKI Yoshinori + + * nnmail.el (nnmail-move-inbox): Clear nnmail-internal-password, + when supplied Password is incorrect. + +Sat Jul 25 19:31:36 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.26 is released. + +1998-07-25 14:53:24 Lars Magne Ingebrigtsen + + * gnus-salt.el (gnus-pick-mouse-pick-region): Use + gnus-read-event-char. + +Sat Jul 25 02:43:35 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.25 is released. + +1998-07-25 00:03:24 Lars Magne Ingebrigtsen + + * gnus-group.el (gnus-group-read-ephemeral-group): Ditto. + + * gnus-sum.el (gnus-summary-read-group-1): Ditto. + + * gnus-group.el (gnus-group-read-group): Accept article list. + +1998-07-24 14:35:02 Lars Magne Ingebrigtsen + + * gnus-msg.el (gnus-configure-posting-styles): Quote some. + + * message.el (message-ignored-supersedes-headers): Added X-Trace + and X-Complaints-To. + + * nnmail.el (gnus-util): Required. + +1998-07-21 23:03:13 Lars Magne Ingebrigtsen + + * gnus.el (gnus-news-group-p): Bogosity in params. + +1998-07-21 16:14:32 Robert Bihlmeyer + + * gnus-util.el (gnus-globalify-regexp): New function. + +1998-07-18 21:49:01 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-list-of-unread-articles): Peel off articles + outside active range. + +1998-07-15 10:47:39 Lars Magne Ingebrigtsen + + * nnvirtual.el (nnvirtual-request-type): Handle non-numerical + articles. + + * gnus.el (gnus-news-group-p): Do something sensible with negative + articlies. + +Wed Jul 15 10:27:05 1998 Lars Magne Ingebrigtsen + + * gnus-salt.el (gnus-tree-minimize-window): Allow numbers. + +Wed Jul 15 10:25:29 1998 Lars Magne Ingebrigtsen + + * gnus-agent.el (gnus-agent-expire): Ignored ticks. + +Wed Jul 15 10:15:28 1998 Hallvard B. Furuseth + + * nntp.el (nntp-send-authinfo): Message better and stuff. + +Wed Jul 15 10:10:07 1998 Lars Magne Ingebrigtsen + + * gnus.el (gnus-message-archive-group): Allow sexp. + +Wed Jul 15 09:56:47 1998 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-select-newsgroup): Accept select-articles + para, + +1998-07-13 Mike McEwan + + * gnus-sum.el (gnus-select-newsgroup): Don't call the Agent to + mark articles as read until *all* headers have been retrieved. + +Wed Jul 15 09:06:18 1998 Lars Magne Ingebrigtsen + + * nndir.el (nndir): Use nnml to request article. + +1998-07-11 SL Baur + + * gnus-topic.el (gnus-topic-mode-map): Use modern key syntax. + +Sun Jul 12 04:01:22 1998 Lars Magne Ingebrigtsen + + * gnus-score.el (gnus-current-home-score-file): New function. + +1998-07-11 Mike McEwan + + * gnus-agent.el (gnus-agent-fetch-headers): Note last fetched + headers per sesion to aid expiry in `headers only' groups. + + * gnus-agent.el (gnus-agent-expire): Update group info to add + expired articles to list of read articles and prevent + re-fetching. + +1998-07-12 Lars Magne Ingebrigtsen + + * nnmail.el (nnmail-active-file-coding-system): Changed to + binary. + +Sun Jul 12 03:16:18 1998 Lars Magne Ingebrigtsen + + * gnus-score.el (gnus-score-load-file): Specify which alist to + decay. + +1998-07-12 Lars Magne Ingebrigtsen + + * gnus-start.el (gnus-startup-file-coding-system): New variable. + (gnus-read-newsrc-el-file): Use it. + +Sat Jul 11 03:03:53 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.24 is released. + +Fri Jul 10 04:23:24 1998 Hallvard B. Furuseth + + * gnus-util.el (gnus-parse-netrc): Allow "default" values. + +Fri Jul 10 04:15:35 1998 Lars Magne Ingebrigtsen + + * nntp.el (nntp-server-opened-hook): Doc change. + +Fri Jul 10 03:03:48 1998 François Pinard + + * gnus-sum.el (gnus-summary-respool-trace): New command and + keystroke. + +Fri Jul 10 02:18:01 1998 Lars Magne Ingebrigtsen + + * gnus-util.el (gnus-prin1): Bind print-escape-multibyte to nil. + +Mon Jul 6 01:02:59 1998 Simon Josefsson + + * gnus-range.el (gnus-sorted-complement): Fix comments. + +Thu Jul 2 11:16:14 1998 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-summary-iterate): New macro. + + * message.el (message-pop-to-buffer): Clone locals. + + * gnus-msg.el (gnus-posting-styles): Reinstated. + (gnus-posting-style-alist): Ditto. + +Wed Jul 1 18:02:31 1998 Lars Magne Ingebrigtsen + + * gnus-int.el (gnus-get-function): Set funct to nil. + +1998-07-01 16:57:38 Simon Josefsson + + * gnus-int.el (gnus-get-function): returned non-nil when + function wasn't bound, if noerror=t + +Wed Jul 1 17:30:41 1998 Lars Magne Ingebrigtsen + + * gnus-topic.el (gnus-topic-mode-map): Bind TAB and M-TAB. + + * gnus-sum.el (gnus-build-sparse-threads): Make sure no dates are + nil. + (gnus-summary-limit-mark-excluded-as-read): Use the intersection. + + * gnus-msg.el (gnus-setup-message): Clone all local variables from + the summary buffer. + +Wed Jul 1 14:03:52 1998 Richard Stallman + + * message.el (message-cite-original): Use mail-citation-hook. + (message-cite-function): Ditto. + +Wed Jul 1 14:00:53 1998 Rajappa Iyer + + * gnus-salt.el (gnus-pick-mode-map): Changed keymap. + +Wed Jul 1 13:33:26 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.23 is released. + +Wed Jul 1 12:52:32 1998 Lars Magne Ingebrigtsen + + * nntp.el (nntp-record-command): Give more precise time info. + (nntp-next-result-arrived-p): Look for the end of error lines. + +Wed Jul 1 12:24:06 1998 François Pinard + + * gnus-util.el (gnus-delete-if): Would do the opposite. + +Wed Jul 1 01:53:31 1998 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-build-sparse-threads): Didn't work at all. + +Tue Jun 30 15:56:54 1998 Lars Magne Ingebrigtsen + + * nntp.el (nntp-send-authinfo): Store the user name. + (nntp-authinfo-user): New variable. + + * gnus-sum.el (gnus-summary-limit-mark-excluded-as-read): Would + mark some articles as unread. + + * gnus-agent.el (gnus-agent-expire): Don't sort lines. + +Tue Jun 30 15:56:31 1998 Mike McEwan + + * gnus-agent.el (gnus-agent-expire): Use a fresh hash table. + Mon Jun 29 22:49:49 1998 Lars Magne Ingebrigtsen * gnus.el: Gnus v5.6.22 is released. @@ -15,7 +913,7 @@ Mon Jun 29 21:22:46 1998 Lars Magne Ingebrigtsen Sun Jun 28 14:32:08 1998 Lars Magne Ingebrigtsen - * gnus-spec.el (gnus-face-face-function): Double quoting removed. + * gnus-spec.el (gnus-face-face-function): Double quoting removed. Sun Jun 28 09:54:52 1998 Lars Magne Ingebrigtsen @@ -27,7 +925,7 @@ Sun Jun 28 08:51:39 1998 Lars Magne Ingebrigtsen a temp buffer before replacing. * gnus-msg.el (gnus-post-news): Treat broken-reply-to in - followups. + followups. * gnus-sum.el (gnus-summary-goto-subject): Position point. @@ -41,7 +939,7 @@ Sat Jun 27 09:19:20 1998 Lars Magne Ingebrigtsen * gnus-util.el (gnus-put-text-properties-excluding-characters-with-faces): New - function. + function. Sat Jun 27 08:56:08 1998 Lars Magne Ingebrigtsen @@ -54,7 +952,7 @@ Sat Jun 27 08:49:51 1998 Arne Georg Gleditsch Sat Jun 27 08:45:09 1998 Lars Magne Ingebrigtsen * message.el (message-check-news-body-syntax): Buggy checksum - check. + check. Sat Jun 27 07:59:22 1998 Lars Magne Ingebrigtsen @@ -71,7 +969,7 @@ Sat Jun 27 03:18:57 1998 Lars Magne Ingebrigtsen * nnfolder.el (nnfolder-request-replace-article): Check all X-From headers. - * gnus-sum.el (gnus-update-marks): Don't nix out cache lists. + * gnus-sum.el (gnus-update-marks): Don't nix out cache lists. * nngateway.el (nngateway-mail2news-header-transformation): Changed semantics. @@ -103,7 +1001,7 @@ Fri Jun 26 13:45:24 1998 Lars Magne Ingebrigtsen * gnus-util.el (gnus-delete-alist): New function. * gnus-sum.el (gnus-update-marks): Don't save list of cached - articles. + articles. * message.el (message-mode-menu): Include kill-buffer. @@ -120,7 +1018,7 @@ Fri Jun 26 13:45:09 1998 Richard Stallman Fri Jun 26 13:30:42 1998 Kevin Christian * gnus-score.el (gnus-score-string): Do updating of scores after - fuzzies. + fuzzies. Fri Jun 26 07:26:03 1998 Lars Magne Ingebrigtsen @@ -138,7 +1036,7 @@ Fri Jun 26 04:29:44 1998 Lars Magne Ingebrigtsen * gnus-score.el (gnus-score-load-file): Would ignore all score files without un-advanced rules. - * gnus-ems.el ((fboundp 'split-string)): Use it where it exists. + * gnus-ems.el ((fboundp 'split-string)): Use it where it exists. Fri Jun 26 04:23:12 1998 Lars Magne Ingebrigtsen @@ -147,7 +1045,7 @@ Fri Jun 26 04:23:12 1998 Lars Magne Ingebrigtsen Fri Jun 26 03:39:32 1998 Lars Magne Ingebrigtsen * nnfolder.el (nnfolder-request-replace-article): Delete old - delimiter. + delimiter. * gnus-msg.el (gnus-summary-reply): Use it. @@ -172,9 +1070,9 @@ Thu Jun 25 10:35:48 1998 Lars Magne Ingebrigtsen * gnus-sum.el (gnus-summary-limit-to-age): Reverse logic. * gnus-score.el (gnus-summary-score-entry): Removed interactive - spec. + spec. ((gnus-summary-score-map "V" gnus-summary-mode-map)): Removed - keystroke. + keystroke. * gnus-art.el (gnus-article-show-summary): Position point. @@ -198,7 +1096,7 @@ Thu Jun 25 05:13:31 1998 Lars Magne Ingebrigtsen * gnus-salt.el (gnus-pick-mode-map): Reinstated keymap. * gnus-sum.el (gnus-build-sparse-threads): Put the proper date - in. + in. Wed Jun 24 07:52:30 1998 Lars Magne Ingebrigtsen @@ -211,12 +1109,12 @@ Wed Jun 24 07:47:04 1998 Lars Magne Ingebrigtsen Wed Jun 24 07:33:17 1998 Vladimir Alexiev * nnvirtual.el (nnvirtual-update-xref-header): Regexp-quote group - name. + name. Wed Jun 24 06:15:27 1998 Lars Magne Ingebrigtsen * gnus-sum.el (gnus-build-sparse-threads): Give all the sparse - articles the date of the current child. + articles the date of the current child. * gnus-topic.el (gnus-group-topic-parameters): Didn't compute. @@ -247,7 +1145,7 @@ Wed Jun 24 03:04:05 1998 Kim-Minh Kaplan Wed Jun 24 02:49:57 1998 Castor - * nntp.el (nntp-open-ssl-stream): + * nntp.el (nntp-open-ssl-stream): Wed Jun 24 02:31:46 1998 Lars Magne Ingebrigtsen @@ -257,7 +1155,7 @@ Wed Jun 24 02:31:46 1998 Lars Magne Ingebrigtsen Wed Jun 24 01:43:26 1998 Decklin Foster * nngateway.el (nngateway-mail2news-header-transformation): New - function. + function. Wed Jun 24 00:25:45 1998 Lars Magne Ingebrigtsen @@ -271,18 +1169,18 @@ Wed Jun 24 00:25:45 1998 Lars Magne Ingebrigtsen Tue Jun 23 23:58:48 1998 Lars Magne Ingebrigtsen * gnus-topic.el (gnus-topic-prepare-topic): Respect visible topic - param. + param. (gnus-topic-hierarchical-parameters): New function. 1998-06-02 Didier Verna * gnus-picon.el (gnus-get-buffer-name): use get-buffer-create - instead of get-buffer + instead of get-buffer Wed Jun 3 04:41:45 1998 Lars Magne Ingebrigtsen * nnkiboze.el (nnkiboze-request-delete-group): Delete .newsrc - file. + file. * nnmail.el (nnmail-article-group): Nuke looong lines. @@ -371,7 +1269,7 @@ Sat May 23 19:44:43 1998 Lars Magne Ingebrigtsen Tue May 19 04:11:33 1998 Yoshiki Hayashi * nnheader.el (nnheader-translate-file-chars): Don't change - string. + string. Tue May 19 03:07:45 1998 P. E. Jareth Hein @@ -388,7 +1286,7 @@ Tue May 12 06:12:42 1998 Lars Magne Ingebrigtsen Sun May 10 19:08:28 1998 Lars Magne Ingebrigtsen * gnus-group.el (gnus-group-read-ephemeral-group): Don't add - `address'. + `address'. Sun May 3 18:01:01 1998 Lars Magne Ingebrigtsen @@ -421,7 +1319,7 @@ Sat May 2 01:36:37 1998 Lars Magne Ingebrigtsen `find-file-hooks' to nil. * nnmail.el (nnmail-process-unix-mail-format): Don't use - `find-file-noselect'. + `find-file-noselect'. * gnus-group.el (gnus-group-make-menu-bar): Typo. @@ -453,7 +1351,7 @@ Fri May 1 16:56:32 1998 Lars Magne Ingebrigtsen buffer. * gnus-soup.el (gnus-soup-parse-areas): Check whether the file - exists. + exists. * gnus-draft.el (gnus-draft-send): Use meta-information. @@ -465,7 +1363,7 @@ Fri May 1 16:56:32 1998 Lars Magne Ingebrigtsen Fri May 1 16:43:35 1998 Paul Franklin * message.el (message-generate-headers): Insert Sender when - required. + required. Fri May 1 15:28:55 1998 Lars Magne Ingebrigtsen @@ -475,10 +1373,10 @@ Fri May 1 15:28:55 1998 Lars Magne Ingebrigtsen when hiding. * gnus-msg.el (gnus-post-method): Allow ARG to override - `current'. + `current'. * gnus-sum.el (gnus-remove-thread): Remove the dummy root - properly. + properly. * nnfolder.el (nnfolder-goto-article): New function. (nnfolder-retrieve-headers): Use it. @@ -496,7 +1394,7 @@ Wed Apr 29 20:54:35 1998 Lars Magne Ingebrigtsen dummy roots. * gnus-cache.el (gnus-cache-enter-article): Update marks - properly. + properly. * gnus-xmas.el (gnus-xmas-draft-menu-add): New function. @@ -512,22 +1410,22 @@ Wed Apr 29 20:54:35 1998 Lars Magne Ingebrigtsen Wed Apr 29 20:18:45 1998 Kurt Swanson * gnus-art.el (article-update-date-lapsed): Bind - `deactivate-mark'. + `deactivate-mark'. * gnus-salt.el (gnus-pick-mode-map): Moved keys around to avoid - shadowing. + shadowing. * gnus-art.el (gnus-article-read-summary-keys): New version. - * gnus-sum.el (gnus-summary-make-menu-bar): New for article mode. + * gnus-sum.el (gnus-summary-make-menu-bar): New for article mode. * gnus-msg.el (gnus-post-method): `current' custom. Wed Apr 29 19:04:27 1998 Lars Magne Ingebrigtsen * gnus-sum.el (gnus-summary-set-local-parameters): Ignore - quit-config. - (gnus-select-newsgroup): Use the value of gnus-fetch-old-headers. + quit-config. + (gnus-select-newsgroup): Use the value of gnus-fetch-old-headers. * message.el (message-post-method): Doc fix. @@ -546,7 +1444,7 @@ Tue Apr 28 03:15:50 1998 Hallvard B. Furuseth Tue Apr 28 03:00:16 1998 Lars Magne Ingebrigtsen * gnus-sum.el (gnus-parent-headers): Don't infloop on nil - References. + References. * gnus-art.el (gnus-article-mode): Don't kill local vars. @@ -601,9 +1499,9 @@ Sun Apr 26 14:34:06 1998 Lars Magne Ingebrigtsen * gnus-sum.el (gnus-summary-update-info): Don't nix out scores. * gnus-start.el (gnus-active-to-gnus-format): Removed "." from - quoting. + quoting. - * gnus.el (gnus-cache-directory): Moved here. + * gnus.el (gnus-cache-directory): Moved here. (gnus-predefined-server-alist): Use. * message.el (message-autosave-directory): Put back in. @@ -626,7 +1524,7 @@ Sun Apr 26 14:34:06 1998 Lars Magne Ingebrigtsen Sun Apr 26 14:05:40 1998 Frank Bennett * nnmail.el (nnmail-move-inbox): Push error'ed mailboxes onto the - list. + list. Sun Apr 26 13:01:53 1998 Lars Magne Ingebrigtsen @@ -698,7 +1596,7 @@ Wed Apr 1 16:01:44 1998 Lars Magne Ingebrigtsen Sun Mar 29 11:54:33 1998 Lars Magne Ingebrigtsen * nnkiboze.el (nnkiboze-generate-group): Would mess up newsrs - hashtb. + hashtb. (nnkiboze-enter-nov): Created bogus Xrefs headers. * gnus-agent.el (gnus-agent-save-group-info): New function. @@ -708,7 +1606,7 @@ Sun Mar 29 11:54:33 1998 Lars Magne Ingebrigtsen * message.el (message-expand-group): Allow completion from in the middle of strings. (message-font-lock-keywords): Work when mail-header-separator is - "". + "". Sun Mar 29 09:56:00 1998 Lars Magne Ingebrigtsen @@ -763,7 +1661,7 @@ Thu Mar 19 15:09:14 1998 Wes Hardaker 1998-03-17 Per Abrahamsen * gnus-uu.el (gnus-uu-digest-headers): Add `Content-Type' and - `Content-Transfer-Encoding'. + `Content-Transfer-Encoding'. 1998-03-18 Per Abrahamsen @@ -791,7 +1689,7 @@ Thu Mar 19 12:44:12 1998 Lars Magne Ingebrigtsen * gnus-msg.el: Would use nil group names. * nntp.el (nntp-send-authinfo): Send authinfo to "force"d - servers. + servers. * gnus-util.el (gnus-parse-netrc): Accept the "force" token. @@ -828,7 +1726,7 @@ Fri Mar 13 22:07:17 1998 Shenghuo ZHU Fri Mar 13 21:10:24 1998 Lars Magne Ingebrigtsen - * nnvirtual.el (nnvirtual-request-group): Force updating of info. + * nnvirtual.el (nnvirtual-request-group): Force updating of info. Sun Mar 8 20:46:51 1998 Lars Magne Ingebrigtsen @@ -841,7 +1739,7 @@ Sun Mar 8 14:05:25 1998 Lars Magne Ingebrigtsen Sun Mar 8 00:35:09 1998 Lars Magne Ingebrigtsen * gnus-picon.el (gnus-get-buffer-name): Look in the assoc for the - variable. + variable. * nntp.el (nntp-wait-for): Check more for dead connections. @@ -901,7 +1799,7 @@ Sat Mar 7 15:01:57 1998 Lars Magne Ingebrigtsen Sat Mar 7 15:00:05 1998 Wes Hardaker * gnus-art.el (gnus-article-prepare): Mark articles as - downloadable. + downloadable. Wed Mar 4 22:33:27 1998 Ken Raeburn @@ -950,10 +1848,10 @@ Sat Feb 28 13:35:26 1998 Lars Magne Ingebrigtsen (nntp-record-commands): New variable. (nntp-record-command): New function. - * gnus-agent.el (gnus-agent-group-path): Use real name of group. + * gnus-agent.el (gnus-agent-group-path): Use real name of group. * gnus-sum.el (gnus-summary-insert-subject): Don't allow nil - articles. + articles. (gnus-summary-read-group): Respect backward movement. 1998-03-01 Kim-Minh Kaplan @@ -987,7 +1885,7 @@ Sat Feb 28 08:17:37 1998 Lars Magne Ingebrigtsen Sat Feb 28 08:10:27 1998 Lars Magne Ingebrigtsen * gnus-picon.el (gnus-picons-display-x-face): `buf' -- unbound - var. + var. Sat Feb 28 08:03:23 1998 François Pinard @@ -999,7 +1897,7 @@ Sat Feb 28 07:43:00 1998 Nelson Jose dos Santos Ferreira - * gnus-start.el (gnus-ask-server-for-new-groups): Message more. + * gnus-start.el (gnus-ask-server-for-new-groups): Message more. Fri Feb 27 13:26:34 1998 Lars Magne Ingebrigtsen @@ -1020,7 +1918,7 @@ Mon Feb 23 18:26:48 1998 Lars Magne Ingebrigtsen * gnus-ems.el (gnus-ems-redefine): Define 'gnus-summary-set-display-table as a function that takes no - params. + params. * gnus.el (gnus-interactive): Don't use gnus-sum macros. (gnus-valid-select-methods): Include nnlistserv. @@ -1084,7 +1982,7 @@ Sat Feb 21 00:09:14 1998 Lars Magne Ingebrigtsen the mark doesn't change. * gnus-art.el (gnus-article-prepare): Don't enter article into - cache. + cache. * gnus-sum.el (gnus-summary-reparent-thread): Don't mark as read. (gnus-summary-mark-article): Don't do cache things here. @@ -1094,7 +1992,7 @@ Sat Feb 21 00:09:14 1998 Lars Magne Ingebrigtsen Fri Feb 20 22:56:22 1998 Lars Magne Ingebrigtsen * gnus-srvr.el (gnus-browse-unsubscribe-group): Wouldn't allow - unsubscription. + unsubscription. * gnus-sum.el (gnus-summary-insert-subject): Allow inserting articles outside limits. @@ -1102,7 +2000,7 @@ Fri Feb 20 22:56:22 1998 Lars Magne Ingebrigtsen * gnus-start.el (gnus-dribble-enter): Update mode line. * gnus-srvr.el (gnus-browse-unsubscribe-group): Allow - unsubscription. + unsubscription. * gnus-picon.el (gnus-article-display-picons): Check that the extents are live first. @@ -1118,7 +2016,7 @@ Thu Feb 19 02:28:17 1998 Jens-Ulrik Holger Petersen * gnus-sum.el (gnus-get-newsgroup-headers): Just use the header - value. + value. (gnus-summary-exit): Set global vars. Tue Feb 17 07:17:49 1998 Lars Magne Ingebrigtsen @@ -1134,7 +2032,7 @@ Tue Feb 17 07:00:43 1998 Lars Magne Ingebrigtsen Tue Feb 17 06:15:03 1998 Lars Magne Ingebrigtsen * nnmail.el (nnmail-purge-split-history): List of alists, not - alist. + alist. Mon Feb 16 20:22:04 1998 Lars Magne Ingebrigtsen @@ -1143,10 +2041,10 @@ Mon Feb 16 20:22:04 1998 Lars Magne Ingebrigtsen 1998-02-16 Lars Magne Ingebrigtsen * message.el (message-dont-send): Make sure the article really is - saved. + saved. * nnmail.el (nnmail-purge-split-history): Alist; not a list of - alists. + alists. 1998-02-16 Hrvoje Niksic @@ -1161,7 +2059,7 @@ Mon Feb 16 20:22:04 1998 Lars Magne Ingebrigtsen 1998-02-16 Lars Magne Ingebrigtsen * gnus-util.el (gnus-run-hooks): Use unwind-protect instead of - save-excursion. + save-excursion. 1998-02-16 Per Abrahamsen @@ -1193,7 +2091,7 @@ Sun Feb 15 19:41:14 1998 Lars Magne Ingebrigtsen Sun Feb 15 19:35:11 1998 Kurt Swanson * gnus-art.el (gnus-article-read-summary-keys): Go to top on - some. + some. Sun Feb 15 19:26:21 1998 SeokChan LEE @@ -1226,14 +2124,14 @@ Sun Feb 15 14:23:51 1998 Lars Magne Ingebrigtsen * message.el (message-mode): Set font-lock things before running mode hook. - * gnus-agent.el (gnus-agent-group-path): Respect long file names. + * gnus-agent.el (gnus-agent-group-path): Respect long file names. Sat Feb 14 21:31:25 1998 Lars Magne Ingebrigtsen * gnus-sum.el (gnus-summary-goto-last-article): Force jumping to articles outside limit. - * gnus-agent.el (gnus-agent-toggle-plugged): un/plug before hook. + * gnus-agent.el (gnus-agent-toggle-plugged): un/plug before hook. Sat Feb 14 21:08:03 1998 Kim-Minh Kaplan @@ -1250,7 +2148,7 @@ Sat Feb 14 19:28:01 1998 Lars Magne Ingebrigtsen Sat Feb 14 18:40:55 1998 Lars Magne Ingebrigtsen - * gnus-agent.el (gnus-agent-directory): Translate file chars. + * gnus-agent.el (gnus-agent-directory): Translate file chars. * gnus-sum.el (gnus-summary-print-article): Don't display all headers. @@ -1261,7 +2159,7 @@ Sat Feb 14 18:40:55 1998 Lars Magne Ingebrigtsen Sat Feb 14 18:39:45 1998 Fred Oberhauser * nnmail.el (nnmail-process-babyl-mail-format): Fix point - movement. + movement. Sat Feb 14 18:31:39 1998 Lars Magne Ingebrigtsen @@ -1298,7 +2196,7 @@ Sat Feb 14 17:41:44 1998 Lars Magne Ingebrigtsen * gnus-sum.el (gnus-summary-work-articles): change buffer before looking at marked articles (gnus-summary-work-articles): better check of marked articles - + Sat Feb 14 15:10:36 1998 Lars Magne Ingebrigtsen * nntp.el (nntp-send-authinfo): Use new .netrc functionality. @@ -1312,10 +2210,10 @@ Sat Feb 14 15:10:36 1998 Lars Magne Ingebrigtsen * gnus.el (gnus-expert-user): Dix fox. - * nnmail.el (nnmail-article-group): Remove duplicates from split. + * nnmail.el (nnmail-article-group): Remove duplicates from split. * message.el (message-check-news-header-syntax): Check more on - Message-ID. + Message-ID. * nnmh.el: Don't call nnmail-activate. @@ -1373,7 +2271,7 @@ Fri Feb 13 17:10:31 1998 Lars Magne Ingebrigtsen (gnus-cite-parse-maybe): Use it. * gnus-sum.el (gnus-summary-move-article): Move back to summary - buffer. + buffer. * nnfolder.el (nnfolder-request-accept-article): Save excursion. (nnfolder-request-move-article): Ditto. @@ -1406,12 +2304,12 @@ Tue Feb 10 21:59:53 1998 Lars Magne Ingebrigtsen * gnus-agent.el (gnus-agent-fetch-session): Reversed reversal. * gnus-topic.el (gnus-topic-rename): Check whether the new name - exists. + exists. Tue Feb 10 21:39:47 1998 dave edmondson * message.el (message-font-lock-keywords): Allow : as a citation - ending. + ending. Tue Feb 10 20:09:02 1998 Lars Magne Ingebrigtsen @@ -1422,11 +2320,11 @@ Mon Feb 9 17:02:09 1998 Lars Magne Ingebrigtsen * message.el (message-fill-header): Fill to column 990. * gnus-score.el (gnus-score-load-file): Exclude all excluded - files. + files. Mon Feb 9 16:55:41 1998 jari aalto - * gnus-art.el (gnus-article-time-format): Extended variable. + * gnus-art.el (gnus-article-time-format): Extended variable. Mon Feb 9 16:27:59 1998 Lars Magne Ingebrigtsen @@ -1458,7 +2356,7 @@ Sun Feb 8 18:13:58 1998 Lars Magne Ingebrigtsen Sun Feb 8 17:20:40 1998 Lars Magne Ingebrigtsen - * gnus-group.el (gnus-update-group-mark-positions): Bind `topic'. + * gnus-group.el (gnus-update-group-mark-positions): Bind `topic'. * message.el (message-expand-group): Added doc string. @@ -1468,7 +2366,7 @@ Sun Feb 8 17:20:40 1998 Lars Magne Ingebrigtsen Sun Feb 8 16:44:36 1998 Richard Hoskins * message.el (message-kill-to-signature): Don't kill the - delimiter. + delimiter. Sun Feb 8 16:15:33 1998 Lars Magne Ingebrigtsen @@ -1476,7 +2374,7 @@ Sun Feb 8 16:15:33 1998 Lars Magne Ingebrigtsen (gnus-summary-read-group-1): Use it. * message.el (message-cite-original-without-signature): New - function. + function. (message-cite-function): Added to custom. 1998-01-13 Per Abrahamsen @@ -1499,7 +2397,7 @@ Mon Feb 2 18:56:22 1998 Lars Magne Ingebrigtsen (gnus-agent-fetch-session): Use it. * gnus-art.el (article-strip-all-blank-lines): New command and - keystroke. + keystroke. Sun Feb 1 18:00:54 1998 Lars Magne Ingebrigtsen @@ -1516,7 +2414,7 @@ Sun Feb 1 18:00:54 1998 Lars Magne Ingebrigtsen Thu Jan 15 22:47:38 1998 * gnus-art.el (gnus-request-article-this-buffer): Put it into the - backlog. + backlog. Mon Jan 12 23:30:59 1998 Lars Magne Ingebrigtsen @@ -1574,15 +2472,15 @@ Sun Jan 4 14:28:35 1998 Lars Magne Ingebrigtsen 1997-12-10 Per Abrahamsen * gnus/gnus-msg.el (gnus-inews-insert-mime-headers): Added - documentation. + documentation. (gnus-inews-insert-mime-headers): Made it work with Emacs MULE. (gnus-inews-insert-mime-headers): Added as option to - `message-header-hook'. + `message-header-hook'. 1997-12-22 Per Abrahamsen * gnus/gnus-art.el (gnus-button-alist): Assume msg-id after "in - message". + message". 1997-12-22 Simon Josefsson @@ -1598,9 +2496,9 @@ Sun Jan 4 13:35:14 1998 Lars Magne Ingebrigtsen * nndraft.el (nndraft-request-associate-buffer): Open the damn server first. Sheesh. - * gnus-draft.el (gnus-draft-send): Bind message-send-hook to nil. + * gnus-draft.el (gnus-draft-send): Bind message-send-hook to nil. - * gnus-sum.el (gnus-summary-catchup): Don't nix out downloadable. + * gnus-sum.el (gnus-summary-catchup): Don't nix out downloadable. (gnus-summary-highlight): Highlight down/un as unread. Sun Jan 4 13:27:31 1998 Kim-Minh Kaplan @@ -1610,7 +2508,7 @@ Sun Jan 4 13:27:31 1998 Kim-Minh Kaplan Sun Jan 4 13:18:04 1998 Lars Magne Ingebrigtsen * nnsoup.el (nnsoup-store-reply): Bind mail-header-separator to - "". + "". * gnus-xmas.el (gnus-xmas-agent-server-menu-add): New. @@ -1675,7 +2573,7 @@ Fri Dec 19 21:39:43 1997 Hrvoje Niksic Fri Dec 19 21:26:08 1997 Lars Magne Ingebrigtsen - * gnus-cache.el (gnus-cache-read-active): Check for empty files. + * gnus-cache.el (gnus-cache-read-active): Check for empty files. Sun Dec 14 11:46:50 1997 Lars Magne Ingebrigtsen @@ -1684,7 +2582,7 @@ Sun Dec 14 11:46:50 1997 Lars Magne Ingebrigtsen 1997-12-10 SL Baur - * gnus-start.el (gnus-read-descriptions-file): Really bind and gag + * gnus-start.el (gnus-read-descriptions-file): Really bind and gag Mule. Fri Dec 5 15:15:05 1997 Danny Siu @@ -1698,7 +2596,7 @@ Sun Dec 14 11:11:22 1997 Lars Magne Ingebrigtsen * gnus-uu.el (gnus-uu-pre-uudecode-hook): New hook. * gnus-sum.el (gnus-summary-read-group-1): Set mode line after - configuring. + configuring. Sun Dec 14 11:03:26 1997 Wes Hardaker @@ -1720,7 +2618,7 @@ Sat Dec 6 17:27:04 1997 Kim-Minh Kaplan Sat Dec 6 17:23:26 1997 Christian von Roques * gnus-start.el (gnus-read-descriptions-file): Fix - enable-multibyte-characters. + enable-multibyte-characters. 1997-12-05 Dave Love @@ -1733,7 +2631,7 @@ Sat Dec 6 17:23:26 1997 Christian von Roques Sat Dec 6 17:16:28 1997 Lars Balker Rasmussen - * gnus-art.el (article-make-date-line): Don't add extra newlines. + * gnus-art.el (article-make-date-line): Don't add extra newlines. 1997-11-27 MORIOKA Tomohiko @@ -1748,7 +2646,7 @@ Sat Dec 6 17:04:40 1997 Kim-Minh Kaplan * nnml.el (nnml-parse-head): Out-of-bounds fix. * nndraft.el (nndraft-request-associate-buffer): Get proper file - name. + name. Sat Dec 6 15:35:37 1997 Gary D. Foster @@ -1757,7 +2655,7 @@ Sat Dec 6 15:35:37 1997 Gary D. Foster Thu Nov 27 19:56:59 1997 Lars Magne Ingebrigtsen * gnus-agent.el (gnus-summary-set-agent-mark): Remove marks - properly. + properly. 1997-11-27 Christoph Wedler @@ -1786,7 +2684,7 @@ Wed Nov 26 18:19:29 1997 Lars Magne Ingebrigtsen * nnweb.el (nnweb-type-definition): Rescued dejanewsold. * gnus-mh.el (gnus-summary-save-in-folder): Reverted to old - version. + version. * gnus-sum.el (gnus-kill-or-deaden-summary): Save excursion. @@ -1795,7 +2693,7 @@ Wed Nov 26 18:19:29 1997 Lars Magne Ingebrigtsen * gnus-start.el (gnus-setup-news): Always push archive server. * gnus-sum.el (gnus-read-header): Would bug out on sparse - articles. + articles. Wed Nov 26 17:50:41 1997 Kurt Swanson @@ -1808,16 +2706,16 @@ Wed Nov 26 17:40:57 1997 Lars Magne Ingebrigtsen Wed Nov 26 16:04:25 1997 Lars Magne Ingebrigtsen * gnus-sum.el (gnus-summary-move-article): Don't work on canceled - articles. + articles. * gnus-start.el (gnus-subscribe-hierarchical-interactive): Use - `read-char-exclusive'. + `read-char-exclusive'. * gnus-sum.el (gnus-summary-mode): Localize - gnus-summary-dummy-line-format. + gnus-summary-dummy-line-format. * nnml.el (nnml-open-nov): Check that the file exists before - inserting it. + inserting it. * gnus-art.el (article-date-ut): Insert a newline if needed. @@ -1835,7 +2733,7 @@ Wed Nov 26 15:47:40 1997 Greg Klanderman Wed Nov 26 15:43:53 1997 Lars Magne Ingebrigtsen * gnus-start.el (gnus-setup-news): Protect against nil - gnus-message-archive-method. + gnus-message-archive-method. 1997-11-26 Christoph Wedler @@ -1859,7 +2757,7 @@ Wed Nov 26 13:50:01 1997 Alastair Burt Wed Nov 26 13:45:35 1997 Lars Magne Ingebrigtsen - * gnus-util.el (gnus-kill-all-overlays): Remove check for XEmacs. + * gnus-util.el (gnus-kill-all-overlays): Remove check for XEmacs. 1997-09-30 Dave Love @@ -1889,7 +2787,7 @@ Wed Nov 26 10:31:17 1997 Lars Magne Ingebrigtsen that spanned several lines. * gnus-util.el (gnus-date-iso8601): Didn't pick out the date - header. + header. * gnus-demon.el (gnus-demon-scan-mail): Clean inboxes. @@ -1901,7 +2799,7 @@ Wed Nov 26 10:31:17 1997 Lars Magne Ingebrigtsen Wed Nov 26 08:54:26 1997 Lars Magne Ingebrigtsen * gnus-sum.el (gnus-summary-update-info): Would use wrong group - name. + name. 1997-11-26 Hrvoje Niksic @@ -1926,7 +2824,7 @@ Wed Nov 26 08:54:26 1997 Lars Magne Ingebrigtsen Wed Nov 26 08:31:28 1997 Lars Magne Ingebrigtsen - * gnus-art.el (gnus-stop-date-timer): Cancel instead of delete. + * gnus-art.el (gnus-stop-date-timer): Cancel instead of delete. (gnus-start-date-timer): Use the numerical prefix. Tue Nov 25 20:03:34 1997 Lars Magne Ingebrigtsen @@ -1940,7 +2838,7 @@ Tue Nov 25 19:57:55 1997 Dan Christensen Tue Nov 25 19:54:00 1997 Lars Magne Ingebrigtsen * gnus-move.el (gnus-move-group-to-server): Protect agains - nil-ness. + nil-ness. Tue Nov 25 19:03:38 1997 Lars Magne Ingebrigtsen @@ -1949,7 +2847,7 @@ Tue Nov 25 19:03:38 1997 Lars Magne Ingebrigtsen Tue Nov 25 16:05:01 1997 Lars Magne Ingebrigtsen * gnus-sum.el (gnus-read-header): Remove thread entry before - rebuilding. + rebuilding. * gnus-cite.el (gnus-cite-add-face): Keep track of all overlays. @@ -1959,10 +2857,10 @@ Tue Nov 25 16:05:01 1997 Lars Magne Ingebrigtsen (article-date-ut): Would move around. * gnus-group.el (gnus-group-read-ephemeral-group): Accept server - names. + names. * gnus-srvr.el (gnus-browse-foreign-server): Use proper server - names. + names. * gnus.el (gnus-group-prefixed-name): Give the right result for native groups. @@ -1994,7 +2892,7 @@ Mon Nov 24 18:07:21 1997 Lars Magne Ingebrigtsen Mon Nov 24 17:36:00 1997 Lars Magne Ingebrigtsen * message.el (message-reply): Respect Mail-Copies-To even when - `to-address'. + `to-address'. Mon Nov 24 17:32:47 1997 Thor Kristoffersen @@ -2006,7 +2904,7 @@ Mon Nov 24 16:18:19 1997 Lars Magne Ingebrigtsen entering group. * gnus-start.el (gnus-setup-news): Get correct value of archive - server. + server. Wed Oct 8 20:29:35 1997 Robert Bihlmeyer @@ -2019,7 +2917,7 @@ Mon Nov 24 14:09:00 1997 Lars Magne Ingebrigtsen * gnus-sum.el (gnus-last-newsgroup-variables-set): New variable. (gnus-set-global-variables): Don't do to much; gets run off of - pre-command-hook. + pre-command-hook. Got rid of gnus-set-global-variables throughout. (gnus-summary-exit): Update adaptive scoring here. (gnus-summary-isearch-article): Widen. @@ -2051,12 +2949,12 @@ Sun Nov 23 14:04:07 1997 Lars Magne Ingebrigtsen bound. And gagged. * message.el (message-send-mail-with-mh): Use - `mh-new-draft-name'. + `mh-new-draft-name'. * nnfolder.el (nnfolder-read-folder): Save new buffers. * gnus-sum.el (gnus-summary-make-menu-bar): Removed "write to - file". + file". * gnus-util.el (gnus-byte-code): Use indirect-function. @@ -2065,7 +2963,7 @@ Sun Nov 23 14:04:07 1997 Lars Magne Ingebrigtsen * gnus-sum.el (gnus-summary-reparent-thread): Update thread. * gnus-score.el (gnus-all-score-files): Don't do anything unless - GROUP. + GROUP. * nnmail.el (nnmail-split-it): Save-excursion. (nnmail-group-pathname): Translate file chars. @@ -2073,7 +2971,7 @@ Sun Nov 23 14:04:07 1997 Lars Magne Ingebrigtsen Sun Nov 23 13:41:10 1997 Gunnar Horrigmo * gnus-sum.el (gnus-summary-exit): Don't skip if group - disappeared. + disappeared. Sun Nov 23 13:32:55 1997 Lars Magne Ingebrigtsen @@ -2099,7 +2997,7 @@ Sun Nov 23 12:44:38 1997 Lars Magne Ingebrigtsen Sun Nov 23 12:15:00 1997 Hallvard B. Furuseth * gnus-sum.el (gnus-summary-limit-include-thread): Interactive - fix. + fix. Sun Nov 23 07:06:58 1997 Lars Magne Ingebrigtsen @@ -2120,7 +3018,7 @@ Sat Nov 22 18:04:34 1997 Lars Magne Ingebrigtsen Sat Nov 22 18:01:26 1997 Didier Verna - * gnus-sum.el (gnus-summary-remove-bookmark): Interactive spec. + * gnus-sum.el (gnus-summary-remove-bookmark): Interactive spec. Mon Nov 17 23:50:51 1997 Lars Magne Ingebrigtsen @@ -2138,7 +3036,7 @@ Thu Nov 13 22:57:23 1997 Kenichi Handa Thu Nov 13 22:30:19 1997 seokchan lee * message.el (message-ignored-supersedes-headers): Ignore more - headers. + headers. Thu Nov 13 22:28:13 1997 Lars Magne Ingebrigtsen @@ -2170,15 +3068,15 @@ Thu Nov 6 01:53:51 1997 Stefan Waldherr Thu Nov 6 01:52:43 1997 Lars Magne Ingebrigtsen * gnus-topic.el (gnus-topic-change-level): Really delete multiple - instances. + instances. Wed Nov 5 14:04:54 1997 Lars Magne Ingebrigtsen * gnus-topic.el (gnus-topic-update-topic-line): Possibly fix nil - numbers. + numbers. * gnus-sum.el (gnus-summary-show-article): New command and - keystroke. + keystroke. Tue Nov 4 06:29:58 1997 Lars Magne Ingebrigtsen @@ -2194,7 +3092,7 @@ Sat Oct 25 05:52:22 1997 Lars Magne Ingebrigtsen Sat Oct 25 00:39:42 1997 Lars Balker Rasmussen * gnus-art.el (gnus-article-fill-paragraph): New command and - keystroke. + keystroke. 1997-10-16 Colin Rafferty @@ -2221,7 +3119,7 @@ Mon Oct 13 00:01:35 1997 Lars Magne Ingebrigtsen Sun Oct 12 23:54:55 1997 ISO-2022-JP * gnus-agent.el (gnus-agent-article-file-coding-system): New - variable. + variable. Sun Oct 12 16:46:11 1997 Lars Magne Ingebrigtsen @@ -2249,21 +3147,21 @@ Sat Oct 4 00:16:39 1997 Lars Magne Ingebrigtsen * nnmail.el (nnmail-delete-incoming): Changed default to nil. * gnus-int.el (gnus-request-scan): Don't do anything if - unplugged. + unplugged. Fri Oct 3 21:09:19 1997 Lars Magne Ingebrigtsen * gnus-art.el (gnus-ignored-headers): Doc fix. * gnus-demon.el (gnus-demon-add-nntp-close-connection): New - function. + function. (gnus-demon-nntp-close-connection): Ditto. * nntp.el (nntp-last-command-time): New variable. (nntp-retrieve-data): Use it. * message.el (message-news-p): Messages with Posted-To aren't - news. + news. (message-mode): Heed message-yank-prefix when filling. * nndraft.el (nndraft-request-restore-buffer): Remove Xrefs and @@ -2285,7 +3183,7 @@ Sat Sep 27 12:57:44 1997 Lars Magne Ingebrigtsen * gnus-xmas.el (gnus-xmas-window-edges): New function. * gnus-score.el (gnus-score-edit-current-scores): Don't select - window. + window. Sat Sep 27 12:52:31 1997 Hallvard B. Furuseth @@ -2298,10 +3196,10 @@ Sat Sep 27 09:22:15 1997 Lars Magne Ingebrigtsen * gnus-sum.el (gnus-summary-pop-article): Force. * gnus-art.el (gnus-article-prepare): Push the article onto the - history. + history. * gnus-sum.el (gnus-summary-pop-article): Pop to the right - article. + article. * gnus-demon.el (gnus-demon-scan-news): Save excursion. @@ -2342,7 +3240,7 @@ Sat Sep 27 04:32:45 1997 Lars Magne Ingebrigtsen Sat Sep 27 03:50:12 1997 Lars Magne Ingebrigtsen * message.el (message-send): Post without asking. - (message-mode): Modify paragraphs-start and paragraph-separate. + (message-mode): Modify paragraphs-start and paragraph-separate. (message-newline-and-reformat): New command and keystroke. Thu Sep 25 00:13:41 1997 Lars Magne Ingebrigtsen @@ -2390,17 +3288,17 @@ Tue Sep 23 01:41:04 1997 Lars Magne Ingebrigtsen * dgnushack.el (dgnushack-compile): Check for cus-edit. * message.el (message-included-forward-headers): Include Mime - headers. + headers. (message-send): Allow posting without confirming from Agent. Mon Sep 22 05:43:14 1997 Lars Magne Ingebrigtsen * dgnushack.el (byte-compile-warnings): Don't warn about obsolete - variables. + variables. * gnus-sum.el (gnus-summary-refer-thread): New command and - keystroke. - (gnus-summary-limit-include-thread): New command and keystroke. + keystroke. + (gnus-summary-limit-include-thread): New command and keystroke. (gnus-summary-articles-in-thread): New function. (gnus-articles-in-thread): Renamed. @@ -2435,14 +3333,14 @@ Sun Sep 21 00:14:40 1997 Lars Magne Ingebrigtsen (gnus-current-prefix-symbols): New variable. * gnus-score.el (gnus-summary-increase-score): Take symbolic - prefix. + prefix. * gnus.el (gnus-interactive): Removed. (gnus-interactive): Renamed from gnus-interactive-1. (gnus-symbolic-argument): New command. * gnus-draft.el (gnus-draft-send-message): Disable message - checks. + checks. (gnus-draft-send): Ditto. (gnus-draft-setup): Don't save buffer. @@ -2451,7 +3349,7 @@ Sun Sep 21 00:14:40 1997 Lars Magne Ingebrigtsen * gnus-group.el (gnus-group-iterate): Use gensymmed variables. * pop3.el (pop3-md5): `with-temp-buffer' doesn't exist in Emacs - 19.34. + 19.34. * nneething.el (nneething-directory): Defvarred. @@ -2468,12 +3366,12 @@ Sun Sep 21 00:14:40 1997 Lars Magne Ingebrigtsen throughout. * gnus-sum.el (gnus-summary-edit-article): Supply additional - param. + param. * gnus-group.el (gnus-group-iterate): Undo bogus change. * gnus-agent.el (gnus-agentize): Just call gnus-open-agent - directly. + directly. * gnus.el (gnus-interactive): New macro. (gnus-interactive-1): New function. @@ -2540,12 +3438,12 @@ Thu Sep 18 03:33:54 1997 Lars Magne Ingebrigtsen * gnus-msg.el (gnus-setup-message): Slap a progn around forms. - * nndraft.el (nndraft-articles): Make sure directory exists. + * nndraft.el (nndraft-articles): Make sure directory exists. * message.el (message-mode): Don't delete article. * nnmh.el (nnmh-request-accept-article): Don't save when - noinsert. + noinsert. Wed Sep 17 03:37:59 1997 Lars Magne Ingebrigtsen @@ -2568,10 +3466,10 @@ Wed Sep 17 02:30:04 1997 Lars Magne Ingebrigtsen References. * gnus-agent.el (gnus-agent-fetch-group-1): Separated out into - function. + function. * message.el (message-delete-not-region): New command and - keystroke. + keystroke. Tue Sep 16 00:58:26 1997 Lars Magne Ingebrigtsen @@ -2584,7 +3482,7 @@ Tue Sep 16 00:58:26 1997 Lars Magne Ingebrigtsen * gnus-agent.el (gnus-agentize): Don't set twice. * gnus-art.el (gnus-article-prepare): Go to the right line before - marking. + marking. * gnus-start.el: Renamed the drafts group. @@ -2603,7 +3501,7 @@ Mon Sep 15 00:53:50 1997 Lars Magne Ingebrigtsen (gnus-get-newsgroup-headers): Ditto. * gnus-draft.el (gnus-group-send-drafts): Don't send when - unplugged. + unplugged. * gnus-sum.el (gnus-summary-read-group): Don't show-all when skipping groups. diff --git a/lisp/Makefile.in b/lisp/Makefile.in index cd61fdc..d143e8f 100644 --- a/lisp/Makefile.in +++ b/lisp/Makefile.in @@ -18,6 +18,9 @@ total: all: rm -f *.elc ; $(EMACS) $(FLAGS) -f dgnushack-compile +warn: + rm -f *.elc ; $(EMACS) $(FLAGS) --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" + clever: $(EMACS) $(FLAGS) -f dgnushack-compile diff --git a/lisp/base64.el b/lisp/base64.el deleted file mode 100644 index b96e890..0000000 --- a/lisp/base64.el +++ /dev/null @@ -1,274 +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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; For non-MULE -(if (not (fboundp 'char-int)) - (fset '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)) - -(defun base64-run-command-on-region (start end output-buffer command - &rest arg-list) - (let ((tempfile nil) status errstring) - (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))))) - (condition-case () - (delete-file tempfile) - (error nil))))) - -(defun base64-insert-char (char &optional count ignored buffer) - (condition-case nil - (progn - (insert-char char count ignored buffer) - (fset 'base64-insert-char 'insert-char)) - (wrong-number-of-arguments - (fset 'base64-insert-char 'base64-xemacs-insert-char) - (base64-insert-char char count ignored buffer)))) - -(defun base64-xemacs-insert-char (char &optional count ignored buffer) - (if (and buffer (eq buffer (current-buffer))) - (insert-char char count) - (save-excursion - (set-buffer buffer) - (insert-char char count)))) - -(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 - ((= (point) end) - (if (not (zerop counter)) - (error "at least %d bits missing at end of base64 encoding" - (* (- 4 counter) 6))) - (setq done t)) - ((= (char-after (point)) ?=) - (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) - (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 ((= cols 72) - (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 (> cols 0) - (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) - (save-excursion - (set-buffer (get-buffer-create " *base64-encode*")) - (erase-buffer) - (insert string) - (base64-encode-region (point-min) (point-max)) - (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))))) - -(provide 'base64) diff --git a/lisp/date.el b/lisp/date.el deleted file mode 100644 index b593e1c..0000000 --- a/lisp/date.el +++ /dev/null @@ -1,124 +0,0 @@ -;;; date.el --- Date and time handling functions -;; Copyright (C) 1998 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Masanobu Umeda -;; 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 'timezone) - -(defun parse-time-string (date) - "Convert DATE into time." - (decode-time - (condition-case () - (let* ((d1 (timezone-parse-date date)) - (t1 (timezone-parse-time (aref d1 3)))) - (apply 'encode-time - (mapcar (lambda (el) - (and el (string-to-number el))) - (list - (aref t1 2) (aref t1 1) (aref t1 0) - (aref d1 2) (aref d1 1) (aref d1 0) - (number-to-string - (* 60 (timezone-zone-to-minute (aref d1 4)))))))) - ;; If we get an error, then we just return a 0 time. - (error (list 0 0))))) - -(defun date-to-time (date) - "Convert DATE into time." - (apply 'encode-time (parse-time-string date))) - -(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-day (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-day (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 - -(provide 'date) - -;;; date.el ends here diff --git a/lisp/dgnushack.el b/lisp/dgnushack.el index 37bdb98..a5d1d65 100644 --- a/lisp/dgnushack.el +++ b/lisp/dgnushack.el @@ -32,7 +32,7 @@ (require 'bytecomp) (push "~/lisp/custom" load-path) (push "." load-path) -(load "./lpath.el") +(load "./lpath.el" nil t) (defalias 'device-sound-enabled-p 'ignore) (defalias 'play-sound-file 'ignore) @@ -48,11 +48,11 @@ (fset 'x-defined-colors 'ignore) (fset 'read-color 'ignore))) -(setq byte-compile-warnings - '(free-vars unresolved callargs redefine)) - -(defun dgnushack-compile () +(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 . diff --git a/lisp/drums.el b/lisp/drums.el deleted file mode 100644 index db982b7..0000000 --- a/lisp/drums.el +++ /dev/null @@ -1,186 +0,0 @@ -;;; drums.el --- Functions for parsing RFC822bis headers -;; Copyright (C) 1998 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 and 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: - -(require 'date) - -(defvar drums-no-ws-ctl-token "\001-\010\013\014\016-\037\177" - "US-ASCII control characters excluding CR, LF and white space.") -(defvar drums-text-token "\001-\011\013\014\016-\177" - "US-ASCII characters exlcuding CR and LF.") -(defvar drums-specials-token "()<>[]:;@\\,.\"" - "Special characters.") -(defvar drums-quote-token "\\" - "Quote character.") -(defvar drums-wsp-token " \t" - "White space.") -(defvar drums-fws-regexp - (concat "[" drums-wsp-token "]*\n[" drums-wsp-token "]+") - "Folding white space.") -(defvar drums-atext-token "-^a-zA-Z0-9!#$%&'*+/=?_`{|}~" - "Textual token.") -(defvar drums-dot-atext-token "-^a-zA-Z0-9!#$%&'*+/=?_`{|}~." - "Textual token including full stop.") -(defvar drums-qtext-token - (concat 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 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) - table)) - -(defsubst drums-init (string) - (set-syntax-table drums-syntax-table) - (insert string) - (drums-unfold-fws) - (goto-char (point-min))) - -(defun drums-remove-comments (string) - "Remove comments from STRING." - (with-temp-buffer - (let (c) - (drums-init string) - (while (not (eobp)) - (setq c (following-char)) - (cond - ((eq c ?\") - (forward-sexp 1)) - ((eq c ?\() - (delete-region (point) (progn (forward-sexp 1) (point)))) - (t - (forward-char 1)))) - (buffer-string)))) - -(defun drums-remove-whitespace (string) - "Remove comments from STRING." - (with-temp-buffer - (drums-init string) - (let (c) - (while (not (eobp)) - (setq c (following-char)) - (cond - ((eq c ?\") - (forward-sexp 1)) - ((memq c '(? ?\t)) - (delete-char 1)) - (t - (forward-char 1)))) - (buffer-string)))) - -(defun drums-get-comment (string) - "Return the first comment in STRING." - (with-temp-buffer - (drums-init string) - (let (result c) - (while (not (eobp)) - (setq c (following-char)) - (cond - ((eq c ?\") - (forward-sexp 1)) - ((eq c ?\() - (setq result - (buffer-substring - (1+ (point)) - (progn (forward-sexp 1) (1- (point))))) - (goto-char (point-max))) - (t - (forward-char 1)))) - result))) - -(defun drums-parse-address (string) - "Parse STRING and return a MAILBOX / DISPLAY-NAME pair." - (with-temp-buffer - (let (display-name mailbox c) - (drums-init string) - (while (not (eobp)) - (setq c (following-char)) - (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 "[" drums-atext-token "]")) - (push (buffer-substring (point) (progn (forward-word 1) (point))) - display-name)) - ((eq c ?<) - (setq mailbox - (drums-remove-whitespace - (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-name (mapconcat 'identity (nreverse display-name) " ")) - (setq display-name (drums-get-comment string))) - (when mailbox - (cons mailbox display-name))))) - -(defun drums-parse-addresses (string) - "Parse STRING and return a list of MAILBOX / DISPLAY-NAME pairs." - (with-temp-buffer - (drums-init string) - (let ((beg (point)) - pairs c) - (while (not (eobp)) - (setq c (following-char)) - (cond - ((memq c '(?\" ?< ?\()) - (forward-sexp 1)) - ((eq c ?,) - (push (drums-parse-address (buffer-substring beg (1- (point)))) - pairs) - (setq beg (point))) - (t - (forward-char 1)))) - (nreverse pairs)))) - -(defun drums-unfold-fws () - "Unfold folding white space in the current buffer." - (goto-char (point-min)) - (while (re-search-forward drums-fws-regexp nil t) - (replace-match " " t t)) - (goto-char (point-min))) - -(defun drums-parse-date (string) - "Return an Emacs time spec from STRING." - (encode-time (parse-time-string string))) - -(provide 'drums) - -;;; drums.el ends here diff --git a/lisp/gnus-agent.el b/lisp/gnus-agent.el index 7d40b82..d9c1be9 100644 --- a/lisp/gnus-agent.el +++ b/lisp/gnus-agent.el @@ -92,7 +92,7 @@ If nil, only read articles will be expired." (defvar gnus-agent-spam-hashtb nil) (defvar gnus-agent-file-name nil) (defvar gnus-agent-send-mail-function nil) -(defvar gnus-agent-article-file-coding-system 'no-conversion) +(defvar gnus-agent-file-coding-system 'no-conversion) ;; Dynamic variables (defvar gnus-headers) @@ -107,7 +107,7 @@ If nil, only read articles will be expired." (gnus-agent-read-servers) (gnus-category-read) (setq gnus-agent-overview-buffer - (get-buffer-create " *Gnus agent overview*")) + (gnus-get-buffer-create " *Gnus agent overview*")) (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)) @@ -129,7 +129,7 @@ If nil, only read articles will be expired." "Load FILE and do a `read' there." (nnheader-temp-write nil (ignore-errors - (insert-file-contents file) + (nnheader-insert-file-contents file) (goto-char (point-min)) (read (current-buffer))))) @@ -203,7 +203,8 @@ If nil, only read articles will be expired." (push (cons mode (symbol-value (intern (format "gnus-agent-%s-mode-map" buffer)))) minor-mode-map-alist)) - (gnus-agent-toggle-plugged gnus-plugged) + (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))))) @@ -516,7 +517,7 @@ the actual number of articles toggled is returned." (let* ((gnus-command-method method) (file (gnus-agent-lib-file "active"))) (gnus-make-directory (file-name-directory file)) - (let ((coding-system-for-write gnus-agent-article-file-coding-system)) + (let ((coding-system-for-write gnus-agent-file-coding-system)) (write-region (point-min) (point-max) file nil 'silent)) (when (file-exists-p (gnus-agent-lib-file "groups")) (delete-file (gnus-agent-lib-file "groups")))))) @@ -525,22 +526,32 @@ the actual number of articles toggled is returned." (let* ((gnus-command-method method) (file (gnus-agent-lib-file "groups"))) (gnus-make-directory (file-name-directory file)) - (write-region (point-min) (point-max) file nil 'silent)) + (let ((coding-system-for-write gnus-agent-file-coding-system)) + (write-region (point-min) (point-max) file nil 'silent)) (when (file-exists-p (gnus-agent-lib-file "active")) - (delete-file (gnus-agent-lib-file "active")))) + (delete-file (gnus-agent-lib-file "active"))))) (defun gnus-agent-save-group-info (method group active) (when (gnus-agent-method-p method) (let* ((gnus-command-method method) - (file (gnus-agent-lib-file "active"))) + (file (if nntp-server-list-active-group + (gnus-agent-lib-file "active") + (gnus-agent-lib-file "groups")))) (gnus-make-directory (file-name-directory file)) (nnheader-temp-write file - (insert-file-contents 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) - (gnus-delete-line)) - (insert group " " (number-to-string (cdr active)) " " - (number-to-string (car active)) "\n"))))) + (if nntp-server-list-active-group + (progn + (when (re-search-forward + (concat "^" (regexp-quote group) " ") nil t) + (gnus-delete-line)) + (insert group " " (number-to-string (cdr active)) " " + (number-to-string (car active)) " y\n")) + (when (re-search-forward (concat (regexp-quote group) " ") nil t) + (gnus-delete-line)) + (insert-buffer-substring nntp-server-buffer)))))) (defun gnus-agent-group-path (group) "Translate GROUP into a path." @@ -572,7 +583,7 @@ the actual number of articles toggled is returned." (defun gnus-agent-open-history () (save-excursion (push (cons (gnus-agent-method) - (set-buffer (get-buffer-create + (set-buffer (gnus-get-buffer-create (format " *Gnus agent %s history*" (gnus-agent-method))))) gnus-agent-history-buffers) @@ -587,8 +598,9 @@ the actual number of articles toggled is returned." (save-excursion (set-buffer gnus-agent-current-history) (gnus-make-directory (file-name-directory gnus-agent-file-name)) - (write-region (1+ (point-min)) (point-max) - gnus-agent-file-name nil 'silent))) + (let ((coding-system-for-write gnus-agent-file-coding-system)) + (write-region (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) @@ -646,15 +658,14 @@ the actual number of articles toggled is returned." (gnus-agent-group-path group) "/")) (date (gnus-time-to-day (current-time))) (case-fold-search t) - pos alists crosses id elem) + 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)) (nnheader-temp-write nil - (let ((buf (current-buffer)) - article) + (let (article) (while (setq article (pop articles)) (when (gnus-request-article article group) (goto-char (point-max)) @@ -687,7 +698,7 @@ the actual number of articles toggled is returned." (setq id "No-Message-ID-in-article") (setq id (buffer-substring (match-beginning 1) (match-end 1)))) (let ((coding-system-for-write - gnus-agent-article-file-coding-system)) + gnus-agent-file-coding-system)) (write-region (point-min) (point-max) (concat dir (number-to-string (caar pos))) nil 'silent)) @@ -714,7 +725,7 @@ the actual number of articles toggled is returned." gnus-agent-group-alist)) (setcdr alist (cons (cons (cdar crosses) t) (cdr alist))) (save-excursion - (set-buffer (get-buffer-create (format " *Gnus agent overview %s*" + (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) @@ -730,10 +741,12 @@ the actual number of articles toggled is returned." (save-excursion (while gnus-agent-buffer-alist (set-buffer (cdar gnus-agent-buffer-alist)) - (write-region (point-min) (point-max) - (gnus-agent-article-name ".overview" - (caar gnus-agent-buffer-alist)) - nil 'silent) + (let ((coding-system-for-write + gnus-agent-file-coding-system)) + (write-region (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 (nnheader-temp-write (caar gnus-agent-group-alist) @@ -741,18 +754,14 @@ the actual number of articles toggled is returned." (insert "\n")) (pop gnus-agent-group-alist)))) -(defun gnus-agent-fetch-headers (group articles &optional force) - (gnus-agent-load-alist group) - ;; Find out what headers we need to retrieve. - (when articles - (while (and articles - (assq (car articles) gnus-agent-article-alist)) - (pop articles)) - (let ((arts articles)) - (while (cdr arts) - (if (assq (cadr arts) gnus-agent-article-alist) - (setcdr arts (cddr arts)) - (setq arts (cdr arts))))) +(defun gnus-agent-fetch-headers (group &optional force) + (let ((articles (if (gnus-agent-load-alist group) + (gnus-sorted-intersection + (gnus-list-of-unread-articles group) + (gnus-uncompress-range + (cons (1+ (caar (last gnus-agent-article-alist))) + (cdr (gnus-active group))))) + (gnus-list-of-unread-articles group)))) ;; Fetch them. (when articles (gnus-message 7 "Fetching headers for %s..." group) @@ -760,17 +769,6 @@ the actual number of articles toggled is returned." (set-buffer nntp-server-buffer) (unless (eq 'nov (gnus-retrieve-headers articles group)) (nnvirtual-convert-headers)) - ;; - ;; To gnus-agent-expire work fine with no Xref field in .overview - ;; Tatsuya Ichikawa - (goto-char (point-min)) - (while (not (eobp)) - (goto-char (point-at-eol)) - (insert "\t") - (forward-line 1)) - ;; Tatsuya Ichikawa - ;; To gnus-agent-expire work fine with no Xref field in .overview - ;; ;; Save these headers for later processing. (copy-to-buffer gnus-agent-overview-buffer (point-min) (point-max)) (let (file) @@ -779,9 +777,15 @@ the actual number of articles toggled is returned." (gnus-agent-braid-nov group articles file)) (gnus-make-directory (nnheader-translate-file-chars (file-name-directory file))) - (write-region (point-min) (point-max) file nil 'silent) - (gnus-agent-save-alist group articles nil)) - t)))) + (let ((coding-system-for-write + gnus-agent-file-coding-system)) + (write-region (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))) + (gnus-time-to-day (current-time))) + articles))))) (defsubst gnus-agent-copy-nov-line (article) (let (b e) @@ -789,47 +793,48 @@ the actual number of articles toggled is returned." (setq b (point)) (if (eq article (read (current-buffer))) (setq e (progn (forward-line 1) (point))) - (setq e b)) + (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) - (let (beg end) - (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-min)) - (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)))))) + (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." @@ -840,7 +845,7 @@ the actual number of articles toggled is returned." (gnus-agent-article-name ".agentview" group))))) (defun gnus-agent-save-alist (group &optional articles state dir) - "Load the article-state alist for GROUP." + "Save the article-state alist for GROUP." (nnheader-temp-write (if dir (concat dir ".agentview") (gnus-agent-article-name ".agentview" group)) @@ -890,12 +895,11 @@ the actual number of articles toggled is returned." (let ((gnus-command-method method) gnus-newsgroup-dependencies gnus-newsgroup-headers gnus-newsgroup-scored gnus-headers gnus-score - gnus-use-cache articles score arts + gnus-use-cache articles arts category predicate info marks score-param) ;; Fetch headers. (when (and (or (gnus-active group) (gnus-activate-group group)) - (setq articles (gnus-list-of-unread-articles group)) - (gnus-agent-fetch-headers group articles)) + (setq articles (gnus-agent-fetch-headers group))) ;; Parse them and see which articles we want to fetch. (setq gnus-newsgroup-dependencies (make-vector (length articles) 0)) @@ -963,8 +967,8 @@ the actual number of articles toggled is returned." (defvar gnus-category-buffer "*Agent Category*") (defvar gnus-category-line-format-alist - `((?c name ?s) - (?g groups ?d))) + `((?c gnus-tmp-name ?s) + (?g gnus-tmp-groups ?d))) (defvar gnus-category-mode-line-format-alist `((?u user-defined ?s))) @@ -1040,15 +1044,15 @@ The following commands are available: (defalias 'gnus-category-position-point 'gnus-goto-colon) (defun gnus-category-insert-line (category) - (let* ((name (car category)) - (groups (length (cadddr 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 name)))) + (list 'gnus-category gnus-tmp-name)))) (defun gnus-enter-category-buffer () "Go to the Category buffer." @@ -1060,8 +1064,7 @@ The following commands are available: (defun gnus-category-setup-buffer () (unless (get-buffer gnus-category-buffer) (save-excursion - (set-buffer (get-buffer-create gnus-category-buffer)) - (gnus-add-current-to-buffer-list) + (set-buffer (gnus-get-buffer-create gnus-category-buffer)) (gnus-category-mode)))) (defun gnus-category-prepare () @@ -1265,13 +1268,13 @@ The following commands are available: (interactive) (let ((methods gnus-agent-covered-methods) (day (- (gnus-time-to-day (current-time)) gnus-agent-expire-days)) - (expiry-hashtb (gnus-make-hashtable 1023)) gnus-command-method sym group articles history overview file histories elem art nov-file low info unreads marked article) (save-excursion - (setq overview (get-buffer-create " *expire overview*")) + (setq overview (gnus-get-buffer-create " *expire overview*")) (while (setq gnus-command-method (pop methods)) + (let ((expiry-hashtb (gnus-make-hashtable 1023))) (gnus-agent-open-history) (set-buffer (setq gnus-agent-current-history @@ -1303,7 +1306,7 @@ The following commands are available: info (gnus-get-info group) unreads (ignore-errors (gnus-list-of-unread-articles group)) marked (nconc (gnus-uncompress-range - (cdr (assq 'ticked (gnus-info-marks info)))) + (cdr (assq 'tick (gnus-info-marks info)))) (gnus-uncompress-range (cdr (assq 'dormant (gnus-info-marks info))))) @@ -1330,7 +1333,7 @@ The following commands are available: (< art article))) (if (file-exists-p (gnus-agent-article-name - (number-to-string article) group)) + (number-to-string art) group)) (forward-line 1) ;; Remove old NOV lines that have no articles. (gnus-delete-line))) @@ -1345,13 +1348,17 @@ The following commands are available: (delete-file file)) ;; Schedule the history line for nuking. (push (cdr elem) histories))) - (write-region (point-min) (point-max) nov-file nil 'silent) + (gnus-make-directory (file-name-directory nov-file)) + (let ((coding-system-for-write + gnus-agent-file-coding-system)) + (write-region (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)) + (first prev) + expired) (while (and alist (<= (caar alist) article)) (if (or (not (cdar alist)) @@ -1360,11 +1367,32 @@ The following commands are available: (number-to-string (caar alist)) group)))) - (setcdr prev (setq alist (cdr alist))) + (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)) + (setq gnus-agent-article-alist (cdr first)) + ;;; 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 (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) + ")")))) expiry-hashtb) (set-buffer history) (setq histories (nreverse (sort histories '<))) @@ -1373,7 +1401,7 @@ The following commands are available: (gnus-delete-line)) (gnus-agent-save-history) (gnus-agent-close-history)) - (gnus-message 4 "Expiry...done"))))) + (gnus-message 4 "Expiry...done")))))) ;;;###autoload (defun gnus-agent-batch () diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index 02480f7..7c455a2 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -2,7 +2,7 @@ ;; Copyright (C) 1996,97,98 Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko +;; MORIOKA Tomohiko ;; Keywords: mail, news, MIME ;; This file is part of GNU Emacs. @@ -94,10 +94,25 @@ :group 'gnus-article) (defcustom gnus-ignored-headers - '("^Path:" "^Posting-Version:" "^Article-I.D.:" "^Expires:" - "^Date-Received:" "^References:" "^Control:" "^Xref:" "^Lines:" - "^Posted:" "^Relay-Version:" "^Message-ID:" "^Nf-ID:" "^Nf-From:" - "^Approved:" "^Sender:" "^Received:" "^Mail-from:") + '("^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-Fingerprint:" "^X-Pgp-Key-Id:" + "^X-Pgp-Public-Key-Url:" "^X-Auth:" "^X-From-Line:" + "^X-Gnus-Article-Number:" "^X-Majordomo:" "^X-Url:" "^X-Sender:" + "^X-Mailing-List:" "^MBOX-Line" "^Priority:" "^X-Pgp" "^X400-[-A-Za-z]+:" + "^Status:") "*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." @@ -107,7 +122,7 @@ If `gnus-visible-headers' is non-nil, this variable will be ignored." :group 'gnus-article-hiding) (defcustom gnus-visible-headers - "From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^Followup-To:\\|^Reply-To:\\|^Organization:\\|^Summary:\\|^Keywords:\\|^To:\\|^Cc:\\|^Posted-To:\\|^Mail-Copies-To:\\|^Apparently-To:\\|^Gnus-Warning:\\|^Resent-From:\\|X-Sent:" + "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-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." @@ -364,7 +379,7 @@ be used as possible file names." (sexp :value nil)))) (defcustom gnus-strict-mime t - "*If nil, MIME-decode even if there is no Mime-Version header." + "*If nil, MIME-decode even if there is no MIME-Version header." :group 'gnus-article-mime :type 'boolean) @@ -456,12 +471,12 @@ Obsolete; use the face `gnus-signature-face' for customizations instead." (defface gnus-header-from-face '((((class color) (background dark)) - (:foreground "spring green" :bold t)) + (:foreground "spring green")) (((class color) (background light)) - (:foreground "red3" :bold t)) + (:foreground "red3")) (t - (:bold t :italic t))) + (:italic t))) "Face used for displaying from headers." :group 'gnus-article-headers :group 'gnus-article-highlight) @@ -469,10 +484,10 @@ Obsolete; use the face `gnus-signature-face' for customizations instead." (defface gnus-header-subject-face '((((class color) (background dark)) - (:foreground "SeaGreen3" :bold t)) + (:foreground "SeaGreen3")) (((class color) (background light)) - (:foreground "red4" :bold t)) + (:foreground "red4")) (t (:bold t :italic t))) "Face used for displaying subject headers." @@ -482,12 +497,12 @@ Obsolete; use the face `gnus-signature-face' for customizations instead." (defface gnus-header-newsgroups-face '((((class color) (background dark)) - (:foreground "yellow" :bold t :italic t)) + (:foreground "yellow" :italic t)) (((class color) (background light)) - (:foreground "MidnightBlue" :bold t :italic t)) + (:foreground "MidnightBlue" :italic t)) (t - (:bold t :italic t))) + (:italic t))) "Face used for displaying newsgroups headers." :group 'gnus-article-headers :group 'gnus-article-highlight) @@ -588,7 +603,7 @@ Initialized from `text-mode-syntax-table.") b e (cons 'article-type (cons type gnus-hidden-properties)))) (defun gnus-article-unhide-text-type (b e type) - "Hide text of TYPE between B and E." + "Unhide text of TYPE between B and E." (remove-text-properties b e (cons 'article-type (cons type gnus-hidden-properties))) (when (memq 'intangible gnus-hidden-properties) @@ -667,7 +682,7 @@ always hide." (listp gnus-visible-headers)) (mapconcat 'identity gnus-visible-headers "\\|")))) (inhibit-point-motion-hooks t) - want-list beg) + beg) ;; First we narrow to just the headers. (widen) (goto-char (point-min)) @@ -760,8 +775,8 @@ always hide." from reply-to (ignore-errors (equal - (nth 1 (mail-extract-address-components from)) - (nth 1 (mail-extract-address-components reply-to))))) + (nth 1 (funcall gnus-extract-address-components from)) + (nth 1 (funcall gnus-extract-address-components reply-to))))) (gnus-article-hide-header "reply-to")))) ((eq elem 'date) (let ((date (message-fetch-field "date"))) @@ -902,12 +917,13 @@ characters to translate to." (delete-process "article-x-face")) (let ((inhibit-point-motion-hooks t) (case-fold-search t) - from) + from last) (save-restriction (nnheader-narrow-to-headers) (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) @@ -916,6 +932,12 @@ characters to translate to." from)))) ;; Has to be present. (re-search-forward "^X-Face: " 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)) @@ -958,27 +980,25 @@ always hide." (goto-char (point-min)) ;; Hide the "header". (when (search-forward "\n-----BEGIN PGP SIGNED MESSAGE-----\n" nil t) - (gnus-article-hide-text-type (1+ (match-beginning 0)) - (match-end 0) 'pgp) + (delete-region (1+ (match-beginning 0)) (match-end 0)) (setq beg (point)) ;; Hide the actual signature. (and (search-forward "\n-----BEGIN PGP SIGNATURE-----\n" nil t) (setq end (1+ (match-beginning 0))) - (gnus-article-hide-text-type + (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)) - 'pgp)) + (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) - (gnus-article-hide-text-type - (match-beginning 0) (match-end 0) 'pgp)) + (delete-region + (match-beginning 0) (match-end 0))) (widen)) (gnus-run-hooks 'gnus-article-hide-pgp-hook)))))) @@ -1081,42 +1101,32 @@ always hide." (while (re-search-forward "^[ \t]*\n" nil t) (replace-match "" t t))))) -(defvar mime::preview/content-list) -(defvar mime::preview-content-info/point-min) (defun gnus-article-narrow-to-signature () "Narrow to the signature; return t if a signature is found, else nil." (widen) - (when (and (boundp 'mime::preview/content-list) - mime::preview/content-list) - ;; We have a MIMEish article, so we use the MIME data to narrow. - (let ((pcinfo (car (last mime::preview/content-list)))) - (ignore-errors - (narrow-to-region - (funcall (intern "mime::preview-content-info/point-min") pcinfo) - (point-max))))) - - (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)))) + (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. @@ -1193,8 +1203,7 @@ means show, 0 means toggle." (defun gnus-article-hidden-text-p (type) "Say whether the current buffer contains hidden text of type TYPE." - (let ((start (point-min)) - (pos (text-property-any (point-min) (point-max) 'article-type type))) + (let ((pos (text-property-any (point-min) (point-max) 'article-type type))) (while (and pos (not (get-text-property pos 'invisible))) (setq pos @@ -1409,7 +1418,7 @@ is to run." (unless n (setq n 1)) (gnus-stop-date-timer) - (setq article-lapsed-timer + (setq article-lapsed-timer (nnheader-run-at-time 1 n 'article-update-date-lapsed))) (defun gnus-stop-date-timer () @@ -1843,7 +1852,8 @@ If variable `gnus-use-long-file-name' is non-nil, it is ["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])) + ["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 "" @@ -1890,9 +1900,9 @@ commands: (use-local-map gnus-article-mode-map) (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-page-broken) + (make-local-variable 'gnus-button-marker-list) + (make-local-variable 'gnus-article-current-summary) (gnus-set-default-directory) (buffer-disable-undo (current-buffer)) (setq buffer-read-only t) @@ -1918,23 +1928,20 @@ commands: (gnus-set-global-variables))) ;; Init original article buffer. (save-excursion - (set-buffer (get-buffer-create gnus-original-article-buffer)) + (set-buffer (gnus-get-buffer-create gnus-original-article-buffer)) (buffer-disable-undo (current-buffer)) (setq major-mode 'gnus-original-article-mode) - (gnus-add-current-to-buffer-list) (make-local-variable 'gnus-original-article)) (if (get-buffer name) (save-excursion (set-buffer name) (buffer-disable-undo (current-buffer)) (setq buffer-read-only t) - (gnus-add-current-to-buffer-list) (unless (eq major-mode 'gnus-article-mode) (gnus-article-mode)) (current-buffer)) (save-excursion - (set-buffer (get-buffer-create name)) - (gnus-add-current-to-buffer-list) + (set-buffer (gnus-get-buffer-create name)) (gnus-article-mode) (make-local-variable 'gnus-summary-buffer) (current-buffer))))) @@ -1959,27 +1966,24 @@ commands: (defun gnus-article-display-mime-message () "Article display method for MIME message." + ;; called from `gnus-original-article-buffer'. + (let ((default-mime-charset (save-excursion + (set-buffer gnus-summary-buffer) + default-mime-charset))) + (mime-display-message mime-message-structure + gnus-article-buffer nil gnus-article-mode-map)) + ;; `mime-display-message' changes current buffer to `gnus-article-buffer'. (make-local-variable 'mime-button-mother-dispatcher) (setq mime-button-mother-dispatcher (function gnus-article-push-button)) - (let ((default-mime-charset - (save-excursion - (set-buffer gnus-summary-buffer) - default-mime-charset)) - ) - (mime-display-message mime-message-structure - gnus-article-buffer nil gnus-article-mode-map) - ) - (run-hooks 'gnus-mime-article-prepare-hook) - ) + (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) - )) + (insert-buffer-substring gnus-original-article-buffer))) (defun gnus-article-display-message-with-encoded-word () "Article display method for message with encoded-words." @@ -1991,12 +1995,9 @@ commands: (eword-decode-header charset) (goto-char (point-min)) (if (search-forward "\n\n" nil t) - (decode-mime-charset-region (match-end 0) (point-max) charset)) - ) - (mime-maybe-hide-echo-buffer) - ) - (gnus-run-hooks 'gnus-mime-article-prepare-hook) - ) + (decode-mime-charset-region (match-end 0) (point-max) charset))) + (mime-maybe-hide-echo-buffer)) + (gnus-run-hooks 'gnus-mime-article-prepare-hook)) (defun gnus-article-prepare (article &optional all-headers header) "Prepare ARTICLE in article mode buffer. @@ -2010,7 +2011,7 @@ If ALL-HEADERS is non-nil, no headers are hidden." (setq gnus-summary-buffer (current-buffer)) (let* ((gnus-article (if header (mail-header-number header) article)) (summary-buffer (current-buffer)) - (internal-hook gnus-article-internal-prepare-hook) + (gnus-tmp-internal-hook gnus-article-internal-prepare-hook) (group gnus-newsgroup-name) result) (save-excursion @@ -2037,9 +2038,10 @@ If ALL-HEADERS is non-nil, no headers are hidden." (message "Message marked for downloading")) (gnus-summary-mark-article article gnus-canceled-mark) (unless (memq article gnus-newsgroup-sparse) - (gnus-error 1 + (gnus-error 1 "No such article (may have expired or been canceled)"))))) - (if (or (eq result 'pseudo) (eq result 'nneething)) + (if (or (eq result 'pseudo) + (eq result 'nneething)) (progn (save-excursion (set-buffer summary-buffer) @@ -2072,7 +2074,12 @@ If ALL-HEADERS is non-nil, no headers are hidden." (unless (vectorp gnus-current-headers) (setq gnus-current-headers nil)) (gnus-summary-goto-subject gnus-current-article) - (gnus-summary-show-thread) + (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) @@ -2085,6 +2092,8 @@ If ALL-HEADERS is non-nil, no headers are hidden." (or all-headers gnus-show-all-headers)))) (when (or (numberp article) (stringp article)) + ;; Hooks for getting information from the article. + ;; This hook must be called before being narrowed. (let ((method (if gnus-show-mime (progn @@ -2094,9 +2103,7 @@ If ALL-HEADERS is non-nil, no headers are hidden." gnus-article-display-method-for-mime gnus-article-display-method-for-encoded-word)) gnus-article-display-method-for-traditional))) - ;; Hooks for getting information from the article. - ;; This hook must be called before being narrowed. - (gnus-run-hooks 'internal-hook) + (gnus-run-hooks 'gnus-tmp-internal-hook) (gnus-run-hooks 'gnus-article-prepare-hook) ;; Display message. (funcall method) @@ -2113,6 +2120,8 @@ If ALL-HEADERS is non-nil, no headers are hidden." (gnus-set-mode-line 'article) (gnus-configure-windows 'article) (goto-char (point-min)) + (search-forward "\n\n" nil t) + (set-window-point (get-buffer-window (current-buffer)) (point)) t)))))) (defun gnus-article-wash-status () @@ -2137,7 +2146,9 @@ If ALL-HEADERS is non-nil, no headers are hidden." (if mime ?m ? ) (if emphasis ?e ? ))))) -(defun gnus-article-hide-headers-if-wanted () +(fset '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." (or (save-excursion (set-buffer gnus-summary-buffer) gnus-have-all-headers) @@ -2386,7 +2397,7 @@ If given a prefix, show the hidden text instead." (gnus-article-hide-signature arg)) (defun gnus-article-maybe-highlight () - "Do some article highlighting if `article-visual' is non-nil." + "Do some article highlighting if article highlighting is requested." (when (gnus-visual-p 'article-highlight 'highlight) (gnus-article-highlight-some))) @@ -2399,7 +2410,7 @@ If given a prefix, show the hidden text instead." (defun gnus-request-article-this-buffer (article group) "Get an article and insert it into this buffer." - (let (do-update-line) + (let (do-update-line sparse-header) (prog1 (save-excursion (erase-buffer) @@ -2433,7 +2444,7 @@ If given a prefix, show the hidden text instead." (setq do-update-line article) (setq article (mail-header-id header)) (let ((gnus-override-method gnus-refer-article-method)) - (gnus-read-header article)) + (setq sparse-header (gnus-read-header article))) (setq gnus-newsgroup-sparse (delq article gnus-newsgroup-sparse))) ((vectorp header) @@ -2448,8 +2459,11 @@ If given a prefix, show the hidden text instead." gnus-newsgroup-name))) (when (and (eq (car method) 'nneething) (vectorp header)) - (let ((dir (concat (file-name-as-directory (nth 1 method)) - (mail-header-subject header)))) + (let ((dir (concat + (file-name-as-directory + (or (cadr (assq 'nneething-address method)) + (nth 1 method))) + (mail-header-subject header)))) (when (file-directory-p dir) (setq article 'nneething) (gnus-group-enter-directory dir)))))))) @@ -2498,13 +2512,33 @@ If given a prefix, show the hidden text instead." ;; It was a pseudo. (t article))) + ;; Associate this article with the current summary buffer. + (setq gnus-article-current-summary gnus-summary-buffer) + + ;; Take the article from the original article buffer + ;; and place it in the buffer it's supposed to be in. + (when (and (get-buffer gnus-article-buffer) + (equal (buffer-name (current-buffer)) + (buffer-name (get-buffer gnus-article-buffer)))) + (save-excursion + (if (get-buffer gnus-original-article-buffer) + (set-buffer gnus-original-article-buffer) + (set-buffer (gnus-get-buffer-create gnus-original-article-buffer)) + (buffer-disable-undo (current-buffer)) + (setq major-mode 'gnus-original-article-mode) + (setq buffer-read-only t)) + (let (buffer-read-only) + (erase-buffer) + (insert-buffer-substring gnus-article-buffer)) + (setq gnus-original-article (cons group article)))) + ;; 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) + (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)) @@ -2571,6 +2605,7 @@ groups." (let ((winconf (current-window-configuration))) (set-buffer gnus-article-buffer) (gnus-article-edit-mode) + (gnus-article-delete-text-of-type 'annotation) (gnus-set-text-properties (point-min) (point-max) nil) (gnus-configure-windows 'edit-article) (setq gnus-article-edit-done-function exit-func) @@ -2755,6 +2790,7 @@ call it with the value of the `gnus-data' text property." (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)))) @@ -3113,7 +3149,7 @@ forbidden in URL encoding." ;; Send mail to someone (when (string-match "mailto:/*\\(.*\\)" url) (setq url (substring url (match-beginning 1) nil))) - (let (to args source-url subject func) + (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 @@ -3121,26 +3157,29 @@ forbidden in URL encoding." (setq to (gnus-url-unhex-string url))) (setq args (cons (list "to" to) args) subject (cdr-safe (assoc "subject" args))) - (message-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)))) + (gnus-setup-message 'reply + (message-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-mailto (address) ;; Mail to ADDRESS. (set-buffer (gnus-copy-article-buffer)) - (message-reply address)) + (gnus-setup-message 'reply + (message-reply address))) (defun gnus-button-reply (address) ;; Reply to ADDRESS. - (message-reply address)) + (gnus-setup-message 'reply + (message-reply address))) (defun gnus-button-url (address) "Browse ADDRESS." @@ -3172,7 +3211,8 @@ forbidden in URL encoding." (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)))) + gnus-callback gnus-article-button-prev-page + gnus-type annotation)))) (defvar gnus-next-page-map nil) (unless gnus-next-page-map @@ -3200,9 +3240,10 @@ forbidden in URL encoding." (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)))) + `(gnus-next + t local-map ,gnus-next-page-map + gnus-callback gnus-article-button-next-page + gnus-type annotation)))) (defun gnus-article-button-next-page (arg) "Go to the next page." @@ -3225,7 +3266,7 @@ forbidden in URL encoding." ;;; (defun gnus-article-header-presentation-method (entity situation) - (mime-insert-decoded-header entity nil nil default-mime-charset) + (mime-insert-decoded-header entity) ) (set-alist 'mime-header-presentation-method-alist @@ -3241,9 +3282,6 @@ forbidden in URL encoding." (gnus-summary-select-article nil t) )) -(set-alist 'mime-raw-representation-type-alist - 'gnus-original-article-mode 'binary) - (set-alist 'mime-preview-quitting-method-alist 'gnus-original-article-mode #'gnus-mime-preview-quitting-method) diff --git a/lisp/gnus-bcklg.el b/lisp/gnus-bcklg.el index d9934e5..d370673 100644 --- a/lisp/gnus-bcklg.el +++ b/lisp/gnus-bcklg.el @@ -41,10 +41,9 @@ "Return the backlog buffer." (or (get-buffer gnus-backlog-buffer) (save-excursion - (set-buffer (get-buffer-create gnus-backlog-buffer)) + (set-buffer (gnus-get-buffer-create gnus-backlog-buffer)) (buffer-disable-undo (current-buffer)) (setq buffer-read-only t) - (gnus-add-current-to-buffer-list) (get-buffer gnus-backlog-buffer)))) (defun gnus-backlog-setup () diff --git a/lisp/gnus-cache.el b/lisp/gnus-cache.el index 21e3c50..470fb21 100644 --- a/lisp/gnus-cache.el +++ b/lisp/gnus-cache.el @@ -50,15 +50,33 @@ :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\"." +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.") + ;;; Internal variables. @@ -106,7 +124,9 @@ variable to \"^nnml\"." (set-buffer buffer) (if (> (buffer-size) 0) ;; Non-empty overview, write it to a file. - (gnus-write-buffer overview-file) + (let ((coding-system-for-write + gnus-cache-overview-coding-system)) + (gnus-write-buffer overview-file)) ;; Empty overview file, remove it (when (file-exists-p overview-file) (delete-file overview-file)) @@ -135,11 +155,13 @@ variable to \"^nnml\"." headers (copy-sequence headers)) (mail-header-set-number headers (cdr result)))) (let ((number (mail-header-number headers)) - file dir) + file) (when (and number (> number 0) ; Reffed article. (or force - (and (or (not gnus-uncacheable-groups) + (and (or (not gnus-cacheable-groups) + (string-match gnus-cacheable-groups group)) + (or (not gnus-uncacheable-groups) (not (string-match gnus-uncacheable-groups group))) (gnus-cache-member-of-class @@ -147,7 +169,7 @@ variable to \"^nnml\"." (not (file-exists-p (setq file (gnus-cache-file-name group number))))) ;; Possibly create the cache directory. - (gnus-make-directory (setq dir (file-name-directory file))) + (gnus-make-directory (file-name-directory file)) ;; Save the article in the cache. (if (file-exists-p file) t ; The article already is saved. @@ -347,7 +369,7 @@ Returns the list of articles removed." (defun gnus-summary-insert-cached-articles () "Insert all the articles cached for this group into the current buffer." (interactive) - (let ((cached gnus-newsgroup-cached) + (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")) @@ -371,7 +393,8 @@ Returns the list of articles removed." (save-excursion (setq gnus-cache-buffer (cons group - (set-buffer (get-buffer-create " *gnus-cache-overview*")))) + (set-buffer (gnus-get-buffer-create + " *gnus-cache-overview*")))) (buffer-disable-undo (current-buffer)) ;; Insert the contents of this group's cache overview. (erase-buffer) @@ -459,7 +482,7 @@ Returns the list of articles removed." articles))) (defun gnus-cache-braid-nov (group cached &optional file) - (let ((cache-buf (get-buffer-create " *gnus-cache*")) + (let ((cache-buf (gnus-get-buffer-create " *gnus-cache*")) beg end) (gnus-cache-save-buffers) (save-excursion @@ -491,7 +514,7 @@ Returns the list of articles removed." (kill-buffer cache-buf))) (defun gnus-cache-braid-heads (group cached) - (let ((cache-buf (get-buffer-create " *gnus-cache*"))) + (let ((cache-buf (gnus-get-buffer-create " *gnus-cache*"))) (save-excursion (set-buffer cache-buf) (buffer-disable-undo (current-buffer)) diff --git a/lisp/gnus-draft.el b/lisp/gnus-draft.el index fce8744..7a3ca8a 100644 --- a/lisp/gnus-draft.el +++ b/lisp/gnus-draft.el @@ -96,6 +96,8 @@ (let ((article (gnus-summary-article-number))) (gnus-summary-mark-as-read article gnus-canceled-mark) (gnus-draft-setup article gnus-newsgroup-name) + (set-buffer-modified-p t) + (save-buffer) (push `((lambda () (when (gnus-buffer-exists-p ,gnus-summary-buffer) @@ -132,13 +134,16 @@ (message-remove-header gnus-agent-meta-information-header))) ;; Then we send it. If we have no meta-information, we just send ;; it and let Message figure out how. - (if type - (let ((message-this-is-news (eq type 'news)) - (message-this-is-mail (eq type 'mail)) - (gnus-post-method method) - (message-post-method method)) - (message-send-and-exit)) - (message-send-and-exit)))) + (when (if type + (let ((message-this-is-news (eq type 'news)) + (message-this-is-mail (eq type 'mail)) + (gnus-post-method method) + (message-post-method method)) + (message-send-and-exit)) + (message-send-and-exit)) + (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." diff --git a/lisp/gnus-eform.el b/lisp/gnus-eform.el index ff35a42..6a93242 100644 --- a/lisp/gnus-eform.el +++ b/lisp/gnus-eform.el @@ -88,9 +88,8 @@ It is a slightly enhanced emacs-lisp-mode. Call EXIT-FUNC on exit. Display DOCUMENTATION in the beginning of the buffer." (let ((winconf (current-window-configuration))) - (set-buffer (get-buffer-create gnus-edit-form-buffer)) + (set-buffer (gnus-get-buffer-create gnus-edit-form-buffer)) (gnus-configure-windows 'edit-form) - (gnus-add-current-to-buffer-list) (gnus-edit-form-mode) (setq gnus-prev-winconf winconf) (setq gnus-edit-form-done-function exit-func) diff --git a/lisp/gnus-ems.el b/lisp/gnus-ems.el index 7328093..f798e12 100644 --- a/lisp/gnus-ems.el +++ b/lisp/gnus-ems.el @@ -58,9 +58,7 @@ from to) (goto-line number) (unless (eobp) ; Sometimes things become confused (broken). - (if (boundp 'MULE) - (forward-char (chars-in-string prefix)) - (forward-char (length prefix))) + (forward-char (chars-in-string prefix)) (skip-chars-forward " \t") (setq from (point)) (end-of-line 1) @@ -71,14 +69,6 @@ gnus-cite-overlay-list) (gnus-overlay-put (gnus-make-overlay from to) 'face face)))))) -(defun gnus-mule-max-width-function (el max-width) - (` (let* ((val (eval (, el))) - (valstr (if (numberp val) - (int-to-string val) val))) - (if (> (length valstr) (, max-width)) - (truncate-string valstr (, max-width)) - valstr)))) - (defvar gnus-mule-bitmap-image-file nil) (defun gnus-mule-group-startup-message (&optional x y) "Insert startup message in current buffer." @@ -224,16 +214,56 @@ ;; `emacs-version'. In this case, implementation for XEmacs/mule ;; may be able to share between XEmacs and XEmacs/mule. - (defalias 'gnus-truncate-string 'truncate-string) - (defvar gnus-summary-display-table nil "Display table used in summary mode buffers.") - (fset 'gnus-cite-add-face 'gnus-mule-cite-add-face) - (fset 'gnus-max-width-function 'gnus-mule-max-width-function) (fset 'gnus-summary-set-display-table (lambda ())) (fset 'gnus-encode-coding-string 'encode-coding-string) (fset 'gnus-decode-coding-string 'decode-coding-string) + (if (fboundp 'truncate-string-to-width) + (fset 'gnus-truncate-string 'truncate-string-to-width) + (fset 'gnus-truncate-string 'truncate-string)) + + (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 (> (string-width ,el) ,max) + ,(if (< max-width 0) + `(gnus-truncate-string + ,el (string-width ,el) + (- (string-width ,el) ,max)) + `(gnus-truncate-string ,el ,max)) + ,el) + `(let ((val (eval ,el))) + (if (> (string-width val) ,max) + ,(if (< max-width 0) + `(gnus-truncate-string + val (string-width val) + (- (string-width val) ,max)) + `(gnus-truncate-string val ,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 (> (string-width ,el) ,cut) + ,(if (< cut-width 0) + `(gnus-truncate-string + ,el (- (string-width ,el) ,cut)) + `(gnus-truncate-string + ,el (- (string-width ,el) ,cut) ,cut)) + ,el) + `(let ((val (eval ,el))) + (if (> (string-width val) ,cut) + ,(if (< cut-width 0) + `(gnus-truncate-string + val (- (string-width val) ,cut)) + `(gnus-truncate-string + val (- (string-width val) ,cut) ,cut)) + val))))) + (when window-system (require 'path-util) (if (module-installed-p 'bitmap) @@ -245,23 +275,9 @@ (delq 'long-lines (delq 'control-chars gnus-check-before-posting)))) - (defun gnus-summary-line-format-spec () - (insert gnus-tmp-unread gnus-tmp-replied - gnus-tmp-score-char gnus-tmp-indentation) - (put-text-property - (point) - (progn - (insert - gnus-tmp-opening-bracket - (format "%4d: %-20s" - gnus-tmp-lines - (if (> (length gnus-tmp-name) 20) - (truncate-string gnus-tmp-name 20) - gnus-tmp-name)) - gnus-tmp-closing-bracket) - (point)) - gnus-mouse-face-prop gnus-mouse-face) - (insert " " gnus-tmp-subject-or-nil "\n")) + (when (fboundp 'chars-in-string) + (fset 'gnus-cite-add-face 'gnus-mule-cite-add-face)) + ))) (defun gnus-region-active-p () @@ -274,6 +290,7 @@ (defun gnus-add-minor-mode (mode name map) (if (fboundp 'add-minor-mode) (add-minor-mode mode name map) + (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) @@ -285,7 +302,7 @@ (let ((dir (nnheader-find-etc-directory "gnus")) pixmap file height beg i) (save-excursion - (switch-to-buffer (get-buffer-create gnus-group-buffer)) + (switch-to-buffer (gnus-get-buffer-create gnus-group-buffer)) (let ((buffer-read-only nil)) (erase-buffer) (when (and dir diff --git a/lisp/gnus-group.el b/lisp/gnus-group.el index 3d9fc88..612be02 100644 --- a/lisp/gnus-group.el +++ b/lisp/gnus-group.el @@ -730,6 +730,7 @@ ticked: The number of ticked articles." ["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 t] ["Exit without saving" gnus-group-quit t])) @@ -772,6 +773,8 @@ The following commands are available: (add-hook 'post-command-hook 'gnus-clear-inboxes-moved nil t) (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 () @@ -815,9 +818,8 @@ The following commands are available: (or level gnus-group-default-list-level gnus-level-subscribed)))) (defun gnus-group-setup-buffer () - (set-buffer (get-buffer-create gnus-group-buffer)) + (set-buffer (gnus-get-buffer-create gnus-group-buffer)) (unless (eq major-mode 'gnus-group-mode) - (gnus-add-current-to-buffer-list) (gnus-group-mode) (when gnus-carpal (gnus-carpal-setup-buffer 'group)))) @@ -1150,7 +1152,8 @@ already." 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))) + (when (and entry + (not (gnus-ephemeral-group-p group))) (gnus-dribble-enter (concat "(gnus-group-set-info '" (gnus-prin1-to-string (nth 2 entry)) @@ -1471,12 +1474,12 @@ and with point over the group in question." (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) +(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 @@ -1507,7 +1510,7 @@ group." (cdr (assq 'tick marked))) (gnus-range-length (cdr (assq 'dormant marked))))))) - no-article nil no-display))) + no-article nil no-display nil select-articles))) (defun gnus-group-select-group (&optional all) "Select this newsgroup. @@ -1553,10 +1556,6 @@ be permanent." gnus-summary-mode-hook gnus-select-group-hook (group (gnus-group-group-name)) (method (gnus-find-method-for-group group))) - (setq method - `(,(car method) ,(concat (cadr method) "-ephemeral") - (,(intern (format "%s-address" (car method))) ,(cadr method)) - ,@(cddr method))) (gnus-group-read-ephemeral-group (gnus-group-prefixed-name group method) method))) @@ -1569,30 +1568,41 @@ Returns whether the fetching was successful or not." (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) + 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 is selection was successful." ;; Transform the select method into a unique server. (when (stringp method) (setq method (gnus-server-to-method method))) -;;; (let ((saddr (intern (format "%s-address" (car method))))) -;;; (setq method (gnus-copy-sequence method)) -;;; (require (car method)) -;;; (when (boundp saddr) -;;; (unless (assq saddr method) -;;; (nconc method `((,saddr ,(cadr method)))) -;;; (setf (cadr method) (format "%s-%d" (cadr method) -;;; (incf gnus-ephemeral-group-server)))))) + (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 @@ -1616,7 +1626,7 @@ Return the name of the group is selection was successful." (if request-only group (condition-case () - (when (gnus-group-read-group t t group) + (when (gnus-group-read-group t t group select-articles) group) ;;(error nil) (quit nil))))) @@ -1791,6 +1801,8 @@ ADDRESS." (gnus-read-group "Group name: ") (gnus-read-method "From method: "))) + (when (stringp method) + (setq method (gnus-server-to-method method))) (let* ((meth (when (and method (not (gnus-server-equal method gnus-select-method))) (if address (list (intern method) address) @@ -1903,6 +1915,8 @@ and NEW-NAME will be prompted for." (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))) @@ -1982,6 +1996,7 @@ and NEW-NAME will be prompted for." (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) @@ -1997,8 +2012,7 @@ and NEW-NAME will be prompted for." "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)) - dir) + (file (nnheader-find-etc-directory "gnus-tut.txt" t))) (when (gnus-gethash name gnus-newsrc-hashtb) (error "Documentation group already exists")) (if (not file) @@ -2391,7 +2405,7 @@ If REVERSE, sort in reverse order." (when (gnus-group-native-p (gnus-info-group info)) (gnus-info-clear-data info))) (gnus-get-unread-articles) - (gnus-dribble-enter "") + (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))))) @@ -2915,17 +2929,19 @@ If N is negative, this group and the N-1 previous groups will be checked." (ret (if (numberp n) (- n (length groups)) 0)) (beg (unless n (point))) - group) + group method) (while (setq group (pop groups)) (gnus-group-remove-mark group) ;; Bypass any previous denials from the server. - (gnus-remove-denial (gnus-find-method-for-group group)) + (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)) + (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) @@ -2959,8 +2975,6 @@ to use." (while (and (not found) (setq dir (pop dirs))) (let ((name (gnus-group-real-name group))) - (while (string-match "\\." name) - (setq name (replace-match "/" t t name))) (setq file (concat (file-name-as-directory dir) name))) (if (not (file-exists-p file)) (gnus-message 1 "No such file: %s" file) @@ -3026,6 +3040,7 @@ to use." (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. @@ -3126,12 +3141,14 @@ group." (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.' -If ARG (the prefix), use the `ask-server' method to query -the server for new groups." - (interactive "P") - (gnus-find-new-newsgroups arg) +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." @@ -3161,16 +3178,13 @@ The hook gnus-suspend-gnus-hook is called before actually suspending." (interactive) (gnus-run-hooks 'gnus-suspend-gnus-hook) ;; Kill Gnus buffers except for group mode buffer. - (let* ((group-buf (get-buffer gnus-group-buffer)) - ;; Do this on a separate list in case the user does a ^G before we finish - (gnus-buffer-list - (delete group-buf (delete gnus-dribble-buffer - (append gnus-buffer-list nil))))) - (while gnus-buffer-list - (gnus-kill-buffer (pop gnus-buffer-list))) + (let ((group-buf (get-buffer gnus-group-buffer))) + (mapcar (lambda (buf) + (unless (member buf (list group-buf gnus-dribble-buffer)) + (kill-buffer buf))) + (gnus-buffers)) (gnus-kill-gnus-frames) (when group-buf - (setq gnus-buffer-list (list group-buf)) (bury-buffer group-buf) (delete-windows-on group-buf t)))) @@ -3317,7 +3331,6 @@ and the second element is the address." ;; 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))) - (uncompressed '(score bookmark killed)) marked m) (or (not info) (and (not (setq marked (nthcdr 3 info))) diff --git a/lisp/gnus-i18n.el b/lisp/gnus-i18n.el index 3737fb9..78eeb03 100644 --- a/lisp/gnus-i18n.el +++ b/lisp/gnus-i18n.el @@ -76,15 +76,15 @@ It is specified by variable `gnus-newsgroup-default-charset-alist' )) (setq alist (cdr alist))) )))) - (when charset - (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) - )))) + (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 diff --git a/lisp/gnus-int.el b/lisp/gnus-int.el index 3246bb4..8143d0d 100644 --- a/lisp/gnus-int.el +++ b/lisp/gnus-int.el @@ -149,10 +149,13 @@ If it is down, start it up (again)." (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 (and (not (fboundp func)) - (not noerror)) - (error "No such function: %s" func))) + (when (not (fboundp func)) + (if noerror + (setq func nil) + (error "No such function: %s" func)))) func)) @@ -305,7 +308,7 @@ If FETCH-OLD, retrieve all headers (or some subset thereof) in the group." (gnus-group-real-name group) article)))) (defun gnus-request-update-mark (group article mark) - "Return the type (`post' or `mail') of GROUP (and ARTICLE)." + "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))) diff --git a/lisp/gnus-kill.el b/lisp/gnus-kill.el index 40d94d4..abcc401 100644 --- a/lisp/gnus-kill.el +++ b/lisp/gnus-kill.el @@ -406,7 +406,6 @@ Returns the number of articles marked as read." () (gnus-message 6 "Processing kill file %s..." (car kill-files)) (find-file (car kill-files)) - (gnus-add-current-to-buffer-list) (goto-char (point-min)) (if (consp (ignore-errors (read (current-buffer)))) @@ -469,9 +468,9 @@ Returns the number of articles marked as read." (?h . "") (?f . "from") (?: . "subject"))) - (com-to-com - '((?m . " ") - (?j . "X"))) + ;;(com-to-com + ;; '((?m . " ") + ;; (?j . "X"))) pattern modifier commands) (while (not (eobp)) (if (not (looking-at "[ \t]*/\\([^/]*\\)/\\([ahfcH]\\)?:\\([a-z=:]*\\)")) @@ -566,7 +565,7 @@ COMMAND must be a lisp expression or a string representing a key sequence." (not (consp (cdadr (nth 2 object)))))) (concat "\n" (gnus-prin1-to-string object)) (save-excursion - (set-buffer (get-buffer-create "*Gnus PP*")) + (set-buffer (gnus-get-buffer-create "*Gnus PP*")) (buffer-disable-undo (current-buffer)) (erase-buffer) (insert (format "\n(%S %S\n '(" (nth 0 object) (nth 1 object))) diff --git a/lisp/gnus-logic.el b/lisp/gnus-logic.el index f2913f1..c276a0b 100644 --- a/lisp/gnus-logic.el +++ b/lisp/gnus-logic.el @@ -164,9 +164,9 @@ (funcall type match (or (aref gnus-advanced-headers index) 0)))) (defun gnus-advanced-date (index match type) - (let ((date (encode-time (parse-time-string - (aref gnus-advanced-headers index)))) - (match (encode-time (parse-time-string match)))) + (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)) diff --git a/lisp/gnus-mh.el b/lisp/gnus-mh.el index 3960408..fa01f5a 100644 --- a/lisp/gnus-mh.el +++ b/lisp/gnus-mh.el @@ -64,7 +64,7 @@ Optional argument FOLDER specifies folder name." (funcall gnus-folder-save-name gnus-newsgroup-name gnus-current-headers gnus-newsgroup-last-folder) t)))) - (errbuf (get-buffer-create " *Gnus rcvstore*")) + (errbuf (gnus-get-buffer-create " *Gnus rcvstore*")) ;; Find the rcvstore program. (exec-path (if mh-lib (cons mh-lib exec-path) exec-path))) (gnus-eval-in-buffer-window gnus-original-article-buffer diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el index 0c830cb..29943ae 100644 --- a/lisp/gnus-msg.el +++ b/lisp/gnus-msg.el @@ -2,8 +2,9 @@ ;; Copyright (C) 1995,96,97,98 Free Software Foundation, Inc. ;; Author: Masanobu UMEDA -;; Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko +;; Lars Magne Ingebrigtsen +;; MORIOKA Tomohiko +;; Shuhei KOBAYASHI ;; Keywords: mail, news, MIME ;; This file is part of GNU Emacs. @@ -98,8 +99,22 @@ the second with the current group name.") (defvar gnus-bug-create-help-buffer t "*Should we create the *Gnus Help Bug* buffer?") +(defvar gnus-posting-styles nil + "*Alist of styles to use when posting.") + +(defvar gnus-posting-style-alist + '((organization . message-user-organization) + (signature . message-signature) + (signature-file . message-signature-file) + (address . user-mail-address) + (name . user-full-name)) + "*Mapping from style parameters to variables.") + ;;; 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-last-posting-server nil) @@ -154,8 +169,8 @@ Thank you for your help in stamping out bugs. "\M-c" gnus-summary-mail-crosspost-complaint "om" gnus-summary-mail-forward "op" gnus-summary-post-forward - "Om" gnus-uu-digest-mail-forward - "Op" gnus-uu-digest-post-forward) + "Om" gnus-summary-mail-digest + "Op" gnus-summary-post-digest) (gnus-define-keys (gnus-send-bounce-map "D" gnus-summary-send-map) "b" gnus-summary-resend-bounced-mail @@ -175,9 +190,11 @@ Thank you for your help in stamping out bugs. (,article (and gnus-article-reply (gnus-summary-article-number))) (,group gnus-newsgroup-name) (message-header-setup-hook - (copy-sequence message-header-setup-hook))) + (copy-sequence message-header-setup-hook)) + (message-mode-hook (copy-sequence message-mode-hook))) (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) @@ -187,6 +204,7 @@ Thank you for your help in stamping out bugs. (cons ,group ,article)) (make-local-variable 'gnus-newsgroup-name) (gnus-run-hooks 'gnus-message-setup-hook)) + (gnus-add-buffer) (gnus-configure-windows ,config t) (set-buffer-modified-p nil)))) @@ -338,12 +356,10 @@ header line with the old Message-ID." ;; 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 (get-buffer-create " *gnus article copy*")) + (setq gnus-article-copy (gnus-get-buffer-create " *gnus article copy*")) (buffer-disable-undo gnus-article-copy) - (or (memq gnus-article-copy gnus-buffer-list) - (push gnus-article-copy gnus-buffer-list)) (let ((article-buffer (or article-buffer gnus-article-buffer)) - end beg contents) + end beg) (if (not (and (get-buffer article-buffer) (gnus-buffer-exists-p article-buffer))) (error "Can't find any article buffer") @@ -500,9 +516,11 @@ If SILENT, don't prompt the user." method-alist)))) ;; Override normal method. ((and (eq gnus-post-method 'current) + (not (eq (car group-method) 'nndraft)) (not arg)) group-method) - (gnus-post-method + ((and gnus-post-method + (not (eq gnus-post-method 'current))) gnus-post-method) ;; Use the normal select method. (t gnus-select-method)))) @@ -583,6 +601,39 @@ If FULL-HEADERS (the prefix), include full headers when forwarding." (if full-headers "" message-included-forward-headers))) (message-forward post)))) +(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)) + +;;; XXX: generate Subject and ``Topics''? +(defun gnus-summary-mail-digest (&optional n post) + "Digests and forwards all articles in this series." + (interactive "P") + (let ((subject "Digested Articles") + (articles (gnus-summary-work-articles n)) + article) + (gnus-setup-message 'forward + (gnus-summary-select-article) + (if post (message-news nil subject) (message-mail nil subject)) + (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)) + (insert (mime-make-tag "message" "rfc822") "\n") + (insert-buffer-substring gnus-original-article-buffer)) + (push-mark) + (message-goto-body) + (mime-edit-enclose-digest-region (point)(mark t))))) + +(defun gnus-summary-post-digest (&optional n) + "Digest and forwards all articles in this series to a newsgroup." + (interactive "P") + (gnus-summary-mail-digest n t)) + (defun gnus-summary-resend-message (address n) "Resend the current article to ADDRESS." (interactive "sResend message(s) to: \nP") @@ -594,12 +645,6 @@ If FULL-HEADERS (the prefix), include full headers when forwarding." (set-buffer gnus-original-article-buffer) (message-resend address))))) -(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. @@ -793,7 +838,7 @@ The source file has to be in the Emacs load path." (sit-for 0) ;; Go through all the files looking for non-default values for variables. (save-excursion - (set-buffer (get-buffer-create " *gnus bug info*")) + (set-buffer (gnus-get-buffer-create " *gnus bug info*")) (buffer-disable-undo (current-buffer)) (while files (erase-buffer) @@ -1004,6 +1049,89 @@ this is a reply." (insert " "))) (insert "\n"))))))) +;;; Posting styles. + +(defvar gnus-message-style-insertions nil) + +(defun gnus-configure-posting-styles () + "Configure posting styles according to `gnus-posting-styles'." + (unless gnus-inhibit-posting-styles + (let ((styles gnus-posting-styles) + (gnus-newsgroup-name (or gnus-newsgroup-name "")) + style match variable attribute value value-value) + (make-local-variable 'gnus-message-style-insertions) + ;; Go through all styles and look for matches. + (while styles + (setq style (pop styles) + match (pop style)) + (when (cond ((stringp match) + ;; Regexp string match on the group name. + (string-match match gnus-newsgroup-name)) + ((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. + (while style + (setq attribute (pop style) + value (cadr attribute) + variable nil) + ;; We find the variable that is to be modified. + (if (and (not (stringp (car attribute))) + (not (eq 'body (car attribute))) + (not (setq variable + (cdr (assq (car attribute) + gnus-posting-style-alist))))) + (message "Couldn't find attribute %s" (car attribute)) + ;; We get the value. + (setq value-value + (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)))) + (if variable + ;; This is an ordinary variable. + (set (make-local-variable variable) value-value) + ;; This is either a body or a header to be inserted in the + ;; message. + (when value-value + (let ((attr (car attribute))) + (make-local-variable 'message-setup-hook) + (if (eq 'body attr) + (add-hook 'message-setup-hook + `(lambda () + (save-excursion + (message-goto-body) + (insert ,value-value)))) + (add-hook 'message-setup-hook + 'gnus-message-insert-stylings) + (push (cons (if (stringp attr) attr + (symbol-name attr)) + value-value) + gnus-message-style-insertions)))))))))))) + +(defun gnus-message-insert-stylings () + (let (val) + (save-excursion + (message-goto-eoh) + (while (setq val (pop gnus-message-style-insertions)) + (when (cdr val) + (insert (car val) ": " (cdr val) "\n")) + (gnus-pull (car val) gnus-message-style-insertions))))) + ;;; Allow redefinition of functions. (gnus-ems-redefine) diff --git a/lisp/gnus-range.el b/lisp/gnus-range.el index 799e883..672e726 100644 --- a/lisp/gnus-range.el +++ b/lisp/gnus-range.el @@ -55,7 +55,7 @@ list1)) (defun gnus-sorted-complement (list1 list2) - "Return a list of elements of LIST1 that do not appear in 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)) diff --git a/lisp/gnus-salt.el b/lisp/gnus-salt.el index c8280b2..e98762e 100644 --- a/lisp/gnus-salt.el +++ b/lisp/gnus-salt.el @@ -73,21 +73,10 @@ It accepts the same format specs that `gnus-summary-line-format' does." (gnus-define-keys gnus-pick-mode-map " " gnus-pick-next-page - "u" gnus-summary-unmark-as-processable - "." gnus-pick-article + "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 - "t" gnus-uu-mark-thread - "T" gnus-uu-unmark-thread - "U" gnus-summary-unmark-all-processable - "v" gnus-uu-mark-over - "r" gnus-uu-mark-region - "R" gnus-uu-unmark-region - "e" gnus-uu-mark-by-regexp - "E" gnus-uu-mark-by-regexp - "b" gnus-uu-mark-buffer - "B" gnus-uu-unmark-buffer - "X" gnus-pick-start-reading )) (defun gnus-pick-make-menu-bar () @@ -172,21 +161,48 @@ If given a prefix, mark all unpicked articles as read." (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. + "Pick the article on the current line. If ARG, pick the article on that line instead." (interactive "P") (when arg - (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)))) + (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 + (gnus-uu-mark-thread) + (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 + (gnus-uu-unmark-thread) + (gnus-summary-unmark-as-processable 1))) + (defun gnus-pick-mouse-pick (e) (interactive "e") (mouse-set-point e) @@ -203,7 +219,6 @@ This must be bound to a button-down mouse event." (start-point (posn-point start-posn)) (start-line (1+ (count-lines 1 start-point))) (start-window (posn-window start-posn)) - (start-frame (window-frame start-window)) (bounds (gnus-window-edges start-window)) (top (nth 1 bounds)) (bottom (if (window-minibuffer-p start-window) @@ -223,50 +238,48 @@ This must be bound to a button-down mouse event." ;; 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 last-end-point (end-of-range (point))) + (let (event end end-point (end-of-range (point))) (track-mouse - (while (progn - (setq event (read-event)) - (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)) - (when end-point - (setq last-end-point end-point)) - - (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))))))))))) + (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. @@ -363,7 +376,8 @@ This must be bound to a button-down mouse event." "If non-nil, minimize the tree buffer window. If a number, never let the tree buffer grow taller than that number of lines." - :type 'boolean + :type '(choice boolean + integer) :group 'gnus-summary-tree) (defcustom gnus-selected-tree-face 'modeline @@ -540,9 +554,8 @@ Two predefined functions are available: (defun gnus-get-tree-buffer () "Return the tree buffer properly initialized." (save-excursion - (set-buffer (get-buffer-create gnus-tree-buffer)) + (set-buffer (gnus-get-buffer-create gnus-tree-buffer)) (unless (eq major-mode 'gnus-tree-mode) - (gnus-add-current-to-buffer-list) (gnus-tree-mode)) (current-buffer))) @@ -746,7 +759,8 @@ Two predefined functions are available: (setq beg (point)) (forward-char -1) ;; Draw "-" lines leftwards. - (while (= (char-after (1- (point))) ? ) + (while (and (> (point) 1) + (= (char-after (1- (point))) ? )) (delete-char -1) (insert (car gnus-tree-parent-child-edges)) (forward-char -1)) @@ -963,11 +977,10 @@ The following commands are available: (if (get-buffer buffer) () (save-excursion - (set-buffer (get-buffer-create buffer)) + (set-buffer (gnus-get-buffer-create buffer)) (gnus-carpal-mode) (setq gnus-carpal-attached-buffer (intern (format "gnus-%s-buffer" type))) - (gnus-add-current-to-buffer-list) (let ((buttons (symbol-value (intern (format "gnus-carpal-%s-buffer-buttons" type)))) diff --git a/lisp/gnus-score.el b/lisp/gnus-score.el index 68f9c69..c429950 100644 --- a/lisp/gnus-score.el +++ b/lisp/gnus-score.el @@ -500,12 +500,12 @@ used as score." (?b "body" "" nil body-string) (?h "head" "" nil body-string) (?i "message-id" nil t string) - (?t "references" "message-id" nil string) + (?r "references" "message-id" nil string) (?x "xref" nil nil string) (?l "lines" nil nil number) (?d "date" nil nil date) (?f "followup" nil nil string) - (?T "thread" nil nil string))) + (?t "thread" "message-id" nil string))) (char-to-type '((?s s "substring" string) (?e e "exact string" string) @@ -591,7 +591,7 @@ used as score." ;; 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 ?p))) + (setq pchar (or pchar ?t))) ;; We continue reading. (while (not pchar) @@ -671,7 +671,7 @@ used as score." (defun gnus-score-insert-help (string alist idx) (setq gnus-score-help-winconf (current-window-configuration)) (save-excursion - (set-buffer (get-buffer-create "*Score Help*")) + (set-buffer (gnus-get-buffer-create "*Score Help*")) (buffer-disable-undo (current-buffer)) (delete-windows-on (current-buffer)) (erase-buffer) @@ -1121,7 +1121,7 @@ SCORE is the score to add." (or (not decay) (gnus-decay-scores alist decay))) (gnus-score-set 'touched '(t) alist) - (gnus-score-set 'decay (list (gnus-time-to-day (current-time))))) + (gnus-score-set 'decay (list (gnus-time-to-day (current-time))) alist)) ;; We do not respect eval and files atoms from global score ;; files. (when (and files (not global)) @@ -1213,10 +1213,16 @@ SCORE is the score to add." (read (current-buffer)) (error (gnus-error 3.2 "Problem with score file %s" file)))))) - (if (eq (car alist) 'setq) - ;; This is an old-style score file. - (setq gnus-score-alist (gnus-score-transform-old-to-new alist)) - (setq gnus-score-alist alist)) + (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))))) @@ -1397,7 +1403,7 @@ SCORE is the score to add." gnus-scores-articles)))) (save-excursion - (set-buffer (get-buffer-create "*Headers*")) + (set-buffer (gnus-get-buffer-create "*Headers*")) (buffer-disable-undo (current-buffer)) (when (gnus-buffer-live-p gnus-summary-buffer) (message-clone-locals gnus-summary-buffer)) @@ -2283,7 +2289,6 @@ SCORE is the score to add." 1 "No score rules apply to the current article (default score %d)." gnus-summary-default-score) (set-buffer "*Score Trace*") - (gnus-add-current-to-buffer-list) (while trace (insert (format "%S -> %s\n" (cdar trace) (if (caar trace) @@ -2329,7 +2334,6 @@ SCORE is the score to add." (while rules (insert (format "%-5d: %s\n" (caar rules) (cdar rules))) (pop rules)) - (gnus-add-current-to-buffer-list) (goto-char (point-min)) (gnus-configure-windows 'score-words)))) @@ -2500,7 +2504,7 @@ GROUP using BNews sys file syntax." (trans (cdr (assq ?: nnheader-file-name-translation-alist))) ofiles not-match regexp) (save-excursion - (set-buffer (get-buffer-create "*gnus score files*")) + (set-buffer (gnus-get-buffer-create "*gnus score files*")) (buffer-disable-undo (current-buffer)) ;; Go through all score file names and create regexp with them ;; as the source. @@ -2792,8 +2796,8 @@ If ADAPT, return the home adaptive file instead." (funcall elem group)) ;; Regexp-file cons ((consp elem) - (when (string-match (car elem) group) - (cadr elem)))))) + (when (string-match (gnus-globalify-regexp (car elem)) group) + (replace-match (cadr elem) t nil group )))))) (when found (nnheader-concat gnus-kill-files-directory found)))) @@ -2813,6 +2817,10 @@ If ADAPT, return the home adaptive file instead." (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 ;;; diff --git a/lisp/gnus-soup.el b/lisp/gnus-soup.el index be089bf..08f8176 100644 --- a/lisp/gnus-soup.el +++ b/lisp/gnus-soup.el @@ -133,7 +133,7 @@ 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 (get-buffer-create "*soup work*")) + (tmp-buf (gnus-get-buffer-create "*soup work*")) (area (gnus-soup-area gnus-newsgroup-name)) (prefix (gnus-soup-area-prefix area)) headers) @@ -161,7 +161,8 @@ move those articles instead." (gnus-summary-mark-as-read (car articles) gnus-souped-mark) (setq articles (cdr articles))) (kill-buffer tmp-buf)) - (gnus-soup-save-areas))) + (gnus-soup-save-areas) + (gnus-set-mode-line 'summary))) (defun gnus-soup-pack-packet () "Make a SOUP packet from the SOUP areas." @@ -204,7 +205,9 @@ 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.*\"" +$ emacs -batch -f gnus-batch-brew-soup ^nnml \".*emacs.*\" + +Note -- this function hasn't been implemented yet." (interactive) nil) @@ -509,7 +512,7 @@ Return whether the unpacking was successful." ".MSG")) (msg-buf (and (file-exists-p msg-file) (nnheader-find-file-noselect msg-file))) - (tmp-buf (get-buffer-create " *soup send*")) + (tmp-buf (gnus-get-buffer-create " *soup send*")) beg end) (cond ((/= (gnus-soup-encoding-format diff --git a/lisp/gnus-spec.el b/lisp/gnus-spec.el index 23215fb..2a1e355 100644 --- a/lisp/gnus-spec.el +++ b/lisp/gnus-spec.el @@ -333,15 +333,16 @@ ;; 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 ((max-width 0) + (let (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) + tilde-form tilde elem-type + (xemacs-mule-p (and gnus-xemacs (featurep 'mule)))) (save-excursion (gnus-set-work-buffer) (insert format) (goto-char (point-min)) - (while (re-search-forward "%" nil t) + (while (search-forward "%" nil t) (setq user-defined nil spec-beg nil pad-width nil @@ -420,10 +421,11 @@ (setq elem '("*" ?s)))) (setq elem-type (cadr elem)) ;; Insert the new format elements. - (when pad-width - (insert (number-to-string pad-width))) + (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) + (if (or max-width cut-width ignore-value + (and pad-width xemacs-mule-p)) (progn (insert ?s) (let ((el (car elem))) @@ -437,6 +439,8 @@ (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)))) @@ -526,7 +530,7 @@ If PROPS, insert the result." (push (cons 'version emacs-version) gnus-format-specs) ;; Mark the .newsrc.eld file as "dirty". - (gnus-dribble-enter " ") + (gnus-dribble-touch) (gnus-message 7 "Compiling user specs...done")))) (defun gnus-set-format (type &optional insertable) diff --git a/lisp/gnus-srvr.el b/lisp/gnus-srvr.el index 24e9bfd..21abf17 100644 --- a/lisp/gnus-srvr.el +++ b/lisp/gnus-srvr.el @@ -59,15 +59,15 @@ The following specs are understood: (defvar gnus-inserted-opened-servers nil) (defvar gnus-server-line-format-alist - `((?h how ?s) - (?n name ?s) - (?w where ?s) - (?s status ?s))) + `((?h gnus-tmp-how ?s) + (?n gnus-tmp-name ?s) + (?w gnus-tmp-where ?s) + (?s gnus-tmp-status ?s))) (defvar gnus-server-mode-line-format-alist - `((?S news-server ?s) - (?M news-method ?s) - (?u user-defined ?s))) + `((?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) @@ -166,11 +166,11 @@ The following commands are available: (setq buffer-read-only t) (gnus-run-hooks 'gnus-server-mode-hook)) -(defun gnus-server-insert-server-line (name method) - (let* ((how (car method)) - (where (nth 1 method)) +(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)) - (status (cond ((eq (nth 1 elem) 'denied) + (gnus-tmp-status (cond ((eq (nth 1 elem) 'denied) "(denied)") ((or (gnus-server-opened method) (eq (nth 1 elem) 'ok)) @@ -183,7 +183,7 @@ The following commands are available: (prog1 (1+ (point)) ;; Insert the text. (eval gnus-server-line-format-spec)) - (list 'gnus-server (intern name))))) + (list 'gnus-server (intern gnus-tmp-name))))) (defun gnus-enter-server-buffer () "Set up the server buffer." @@ -195,7 +195,7 @@ The following commands are available: "Initialize the server buffer." (unless (get-buffer gnus-server-buffer) (save-excursion - (set-buffer (get-buffer-create gnus-server-buffer)) + (set-buffer (gnus-get-buffer-create gnus-server-buffer)) (gnus-server-mode) (when gnus-carpal (gnus-carpal-setup-buffer 'server))))) @@ -287,7 +287,7 @@ The following commands are available: (error "No server on the current line"))) (unless (assoc server gnus-server-alist) (error "Read-only server %s" server)) - (gnus-dribble-enter "") + (gnus-dribble-touch) (let ((buffer-read-only nil)) (gnus-delete-line)) (push (assoc server gnus-server-alist) gnus-server-killed-servers) @@ -466,9 +466,12 @@ The following commands are available: (defun gnus-server-scan-server (server) "Request a scan from the current server." (interactive (list (gnus-server-server-name))) - (gnus-message 3 "Scanning %s...done" server) - (gnus-request-scan nil (gnus-server-to-method server)) - (gnus-message 3 "Scanning %s...done" server)) + (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 (server) "Browse a server." @@ -534,7 +537,7 @@ The following commands are available: '("Browse" ["Subscribe" gnus-browse-unsubscribe-current-group t] ["Read" gnus-browse-read-group t] - ["Select" gnus-browse-read-group t] + ["Select" gnus-browse-select-group t] ["Next" gnus-browse-next-group t] ["Prev" gnus-browse-next-group t] ["Exit" gnus-browse-exit t])) @@ -568,8 +571,7 @@ The following commands are available: 1 "Couldn't request list: %s" (gnus-status-message method)) nil) (t - (get-buffer-create gnus-browse-buffer) - (gnus-add-current-to-buffer-list) + (gnus-get-buffer-create gnus-browse-buffer) (when gnus-carpal (gnus-carpal-setup-buffer 'browse)) (gnus-configure-windows 'browse) @@ -590,9 +592,11 @@ The following commands are available: (while (re-search-forward "\\(^[^ \t]+\\)[ \t]+[0-9]+[ \t]+[0-9]+" nil t) (goto-char (match-end 1)) - (push (cons (match-string 1) - (max 0 (- (1+ (read cur)) (read cur)))) - groups)))) + (condition-case () + (push (cons (match-string 1) + (max 0 (- (1+ (read cur)) (read cur)))) + groups) + (error nil))))) (setq groups (sort groups (lambda (l1 l2) (string< (car l1) (car l2))))) diff --git a/lisp/gnus-start.el b/lisp/gnus-start.el index 29b6b04..95a3527 100644 --- a/lisp/gnus-start.el +++ b/lisp/gnus-start.el @@ -254,8 +254,6 @@ for your decision; `gnus-subscribe-killed' kills all new groups; (function-item gnus-subscribe-zombies) function)) -;; Suggested by a bug report by Hallvard B Furuseth. -;; . (defcustom gnus-subscribe-options-newsgroup-method 'gnus-subscribe-alphabetically "*This function is called to subscribe newsgroups mentioned on \"options -n\" lines. @@ -388,6 +386,9 @@ Can be used to turn version control on or off." :group 'gnus-newsrc :type 'boolean) +(defvar gnus-startup-file-coding-system 'ctext + "*Coding system for startup file.") + ;;; Internal variables (defvar gnus-newsrc-file-version nil) @@ -581,6 +582,7 @@ the first newsgroup." (defvar gnus-newsgroup-unreads) (defvar nnoo-state-alist) (defvar gnus-current-select-method) + (defun gnus-clear-system () "Clear all variables and buffers." ;; Clear Gnus variables. @@ -624,8 +626,9 @@ the first newsgroup." (kill-buffer (get-file-buffer (gnus-newsgroup-kill-file nil)))) (gnus-kill-buffer nntp-server-buffer) ;; Kill Gnus buffers. - (while gnus-buffer-list - (gnus-kill-buffer (pop gnus-buffer-list))) + (let ((buffers (gnus-buffers))) + (when buffers + (mapcar 'kill-buffer buffers))) ;; Remove Gnus frames. (gnus-kill-gnus-frames)) @@ -657,8 +660,8 @@ prompt the user for the name of an NNTP server to use." (> arg 0) (max (car gnus-group-list-mode) arg)))) - (gnus-splash) (gnus-clear-system) + (gnus-splash) (gnus-run-hooks 'gnus-before-startup-hook) (nnheader-init-server-buffer) (setq gnus-slave slave) @@ -775,9 +778,8 @@ prompt the user for the name of an NNTP server to use." (let ((dribble-file (gnus-dribble-file-name))) (save-excursion (set-buffer (setq gnus-dribble-buffer - (get-buffer-create + (gnus-get-buffer-create (file-name-nondirectory dribble-file)))) - (gnus-add-current-to-buffer-list) (erase-buffer) (setq buffer-file-name dribble-file) (auto-save-mode t) @@ -937,13 +939,25 @@ If LEVEL is non-nil, the news will be set up at level LEVEL." "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. -If ARG (the prefix), use the `ask-server' method to query the server -for new groups." - (interactive "P") - (let ((check (if (or (and arg (not (listp gnus-check-new-newsgroups))) - (null gnus-read-active-file) - (eq gnus-read-active-file 'some)) - 'ask-server gnus-check-new-newsgroups))) + +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)) @@ -1036,13 +1050,13 @@ for new groups." ;; 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) - (setq gnus-override-subscribe-method method) + (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) - (setq hashtb (gnus-make-hashtable 100)) + (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)) @@ -1121,7 +1135,9 @@ for new groups." (gnus-group-change-level (car groups) gnus-level-default-subscribed gnus-level-killed)) (setq groups (cdr groups))) - (gnus-group-make-help-group) + (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")))))) @@ -1486,7 +1502,7 @@ newsgroup." (when (<= (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) + (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)) @@ -1899,7 +1915,8 @@ If FORCE is non-nil, the .newsrc file is read." (gnus-message 5 "Reading %s..." ding-file) (let (gnus-newsrc-assoc) (condition-case nil - (load ding-file t t t) + (let ((coding-system-for-read gnus-startup-file-coding-system)) + (load ding-file t t t)) (error (ding) (unless (gnus-yes-or-no-p @@ -2249,19 +2266,19 @@ If FORCE is non-nil, the .newsrc file is read." (gnus-gnus-to-newsrc-format) (gnus-message 8 "Saving %s...done" gnus-current-startup-file)) ;; Save .newsrc.eld. - (set-buffer (get-buffer-create " *Gnus-newsrc*")) + (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)) - (gnus-add-current-to-buffer-list) (buffer-disable-undo (current-buffer)) (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) + (let ((coding-system-for-write gnus-startup-file-coding-system)) + (save-buffer)) (kill-buffer (current-buffer)) (gnus-message 5 "Saving %s.eld...done" gnus-current-startup-file)) @@ -2371,6 +2388,13 @@ If FORCE is non-nil, the .newsrc file is read." ;;; 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) @@ -2397,7 +2421,7 @@ If FORCE is non-nil, the .newsrc file is read." () ; There are no slave files to read. (gnus-message 7 "Reading slave newsrcs...") (save-excursion - (set-buffer (get-buffer-create " *gnus slave*")) + (set-buffer (gnus-get-buffer-create " *gnus slave*")) (buffer-disable-undo (current-buffer)) (setq slave-files (sort (mapcar (lambda (file) diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index 0a20c92..cff4f0e 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -221,10 +221,10 @@ to expose hidden threads." :group 'gnus-thread :type 'boolean) -(defcustom gnus-thread-ignore-subject nil - "*If non-nil, ignore subjects and do all threading based on the Reference header. -If nil, which is the default, articles that have different subjects -from their parents will start separate threads." +(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) @@ -285,7 +285,9 @@ will go to the next group without confirmation." (sexp :menu-tag "on" t))) (defcustom gnus-auto-select-same nil - "*If non-nil, select the next article with the same subject." + "*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) @@ -1149,7 +1151,7 @@ increase the score of each group you read." [delete] gnus-summary-prev-page [backspace] gnus-summary-prev-page "\r" gnus-summary-scroll-up - "\e\r" gnus-summary-scroll-down + "\M-\r" gnus-summary-scroll-down "n" gnus-summary-next-unread-article "p" gnus-summary-prev-unread-article "N" gnus-summary-next-article @@ -1356,6 +1358,7 @@ increase the score of each group you read." [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 @@ -1390,6 +1393,7 @@ increase the score of each group you read." "b" gnus-article-hide-boring-headers "s" gnus-article-hide-signature "c" gnus-article-hide-citation + "C" gnus-article-hide-citation-in-followups "p" gnus-article-hide-pgp "P" gnus-article-hide-pem "\C-c" gnus-article-hide-citation-maybe) @@ -1435,6 +1439,7 @@ increase the score of each group you read." "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 "p" gnus-summary-article-posted-p) @@ -1556,6 +1561,7 @@ increase the score of each group you read." (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)]) @@ -1621,8 +1627,8 @@ increase the score of each group you read." ["Wide reply and yank" gnus-summary-wide-reply-with-original t] ["Mail forward" gnus-summary-mail-forward t] ["Post forward" gnus-summary-post-forward t] - ["Digest and mail" gnus-uu-digest-mail-forward t] - ["Digest and post" gnus-uu-digest-post-forward t] + ["Digest and mail" gnus-summary-mail-digest t] + ["Digest and post" gnus-summary-post-digest 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] @@ -1739,9 +1745,10 @@ increase the score of each group you read." ["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] + ["Send a bug report" gnus-bug t] ("Exit" ["Catchup and exit" gnus-summary-catchup-and-exit t] - ["Catchup all and exit" gnus-summary-catchup-and-exit t] + ["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 t] ["Exit group without updating" gnus-summary-exit-no-update t] @@ -1980,21 +1987,26 @@ The following commands are available: (when list (let ((data (and after-article (gnus-data-find-list after-article))) (ilist list)) - (or data (not after-article) (error "No such article: %d" after-article)) - ;; 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) + (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 (cdr list) offset))) - (setcdr list (cdr data)) - (setcdr data ilist) - (when offset - (gnus-data-update-list (cdr list) 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) @@ -2023,20 +2035,25 @@ The following commands are available: (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-data-compute-positions () "Compute the positions of all articles." - (let ((data gnus-newsgroup-data) - pos) - (while data - (when (setq pos (text-property-any - (point-min) (point-max) - 'gnus-number (gnus-data-number (car data)))) - (gnus-data-set-pos (car data) (+ pos 3))) - (setq data (cdr data))))) + (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-summary-article-pseudo-p (article) "Say whether this article is a pseudo article or not." @@ -2265,8 +2282,7 @@ marks of articles." (setq gnus-summary-buffer (current-buffer)) (not gnus-newsgroup-prepared)) ;; Fix by Sudish Joseph - (setq gnus-summary-buffer (set-buffer (get-buffer-create buffer))) - (gnus-add-current-to-buffer-list) + (setq gnus-summary-buffer (set-buffer (gnus-get-buffer-create buffer))) (gnus-summary-mode group) (when gnus-carpal (gnus-carpal-setup-buffer 'summary)) @@ -2349,7 +2365,7 @@ marks of articles." (gnus-score-over-mark 130) (gnus-download-mark 131) (spec gnus-summary-line-format-spec) - thread gnus-visual pos) + gnus-visual pos) (save-excursion (gnus-set-work-buffer) (let ((gnus-summary-line-format-spec spec) @@ -2511,7 +2527,8 @@ the thread are to be displayed." (set (car elem) (eval (nth 1 elem)))))))) (defun gnus-summary-read-group (group &optional show-all no-article - kill-buffer no-display backward) + 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. @@ -2522,8 +2539,10 @@ If NO-DISPLAY, don't generate a summary buffer." (let ((gnus-auto-select-next nil)) (or (gnus-summary-read-group-1 group show-all no-article - kill-buffer no-display) - (setq show-all nil))))) + 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 @@ -2537,7 +2556,8 @@ If NO-DISPLAY, don't generate a summary buffer." result)) (defun gnus-summary-read-group-1 (group show-all no-article - kill-buffer no-display) + 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))) @@ -2545,7 +2565,8 @@ If NO-DISPLAY, don't generate a summary buffer." (gnus-message 5 "Retrieving newsgroup: %s..." 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)))) + (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) @@ -2948,8 +2969,9 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns nil otherwise." (defun gnus-build-sparse-threads () (let ((headers gnus-newsgroup-headers) + (gnus-summary-ignore-duplicates t) header references generation relations - cthread subject child end pthread relation new-child date) + 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. @@ -2966,12 +2988,14 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns nil otherwise." generation 0) (while (search-backward ">" nil t) (setq end (1+ (point))) - (if (search-backward "<" nil t) - (push (list (incf generation) - child (setq child new-child) - subject date) - relations))) - (push (list (1+ generation) child nil subject) relations) + (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. @@ -2980,7 +3004,7 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns nil otherwise." (when (gnus-dependencies-add-header (make-full-mail-header gnus-reffed-article-number - (nth 3 relation) "" (nth 4 relation) + (nth 3 relation) "" (or (nth 4 relation) "") (nth 1 relation) (or (nth 2 relation) "") 0 0 "") gnus-newsgroup-dependencies nil) @@ -3105,7 +3129,7 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns nil otherwise." "Read all the headers." (let ((gnus-summary-ignore-duplicates t) (dependencies gnus-newsgroup-dependencies) - found header article) + header article) (save-excursion (set-buffer nntp-server-buffer) (let ((case-fold-search nil)) @@ -3116,14 +3140,16 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns nil otherwise." header (gnus-nov-parse-line article dependencies))) (when header - (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)) + (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) @@ -3171,7 +3197,7 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns nil otherwise." (defun gnus-summary-update-article (article &optional iheader) "Update ARTICLE in the summary buffer." (set-buffer gnus-summary-buffer) - (let* ((header (or iheader (gnus-summary-article-header article))) + (let* ((header (gnus-summary-article-header article)) (id (mail-header-id header)) (data (gnus-data-find article)) (thread (gnus-id-to-thread id)) @@ -3184,16 +3210,13 @@ Returns HEADER if it was entered in the DEPENDENCIES. Returns nil otherwise." references)) "none"))) (buffer-read-only nil) - (old (car thread)) - (number (mail-header-number header)) - pos) + (old (car thread))) (when thread - ;; !!! Should this be in or not? (unless iheader - (setcar thread nil)) - (when parent - (delq thread parent)) - (if (gnus-summary-insert-subject id header 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) @@ -3245,10 +3268,11 @@ If LINE, insert the rebuilt thread starting on line LINE." ;;!!! 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)) - (when line - (gnus-data-compute-positions))))) + (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." @@ -3324,9 +3348,8 @@ If LINE, insert the rebuilt thread starting on line LINE." "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)) - (setq headers (list (car (gnus-id-to-thread last-id)) - (caadr (gnus-id-to-thread last-id)))) + (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. @@ -3376,6 +3399,7 @@ If LINE, insert the rebuilt thread starting on line LINE." (while thread (gnus-remove-thread-1 (car thread)) (setq thread (cdr thread)))) + (gnus-summary-show-all-threads) (gnus-remove-thread-1 thread)))))))) (defun gnus-remove-thread-1 (thread) @@ -3398,10 +3422,10 @@ If LINE, insert the rebuilt thread starting on line LINE." "Sort THREADS." (if (not gnus-thread-sort-functions) threads - (gnus-message 7 "Sorting threads...") + (gnus-message 8 "Sorting threads...") (prog1 (sort threads (gnus-make-sort-function gnus-thread-sort-functions)) - (gnus-message 7 "Sorting threads...done")))) + (gnus-message 8 "Sorting threads...done")))) (defun gnus-sort-articles (articles) "Sort ARTICLES." @@ -3815,13 +3839,14 @@ or a straight list of headers." (cdr (assq number gnus-newsgroup-scored)) (memq number gnus-newsgroup-processable)))))) -(defun gnus-select-newsgroup (group &optional read-all) +(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 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) + (if (eq (car (gnus-find-method-for-group group)) 'nnvirtual) t gnus-summary-ignore-duplicates)) (info (nth 2 entry)) @@ -3866,10 +3891,13 @@ If READ-ALL is non-nil, all articles in the group are selected." (setq gnus-newsgroup-processable nil) (gnus-update-read-articles group gnus-newsgroup-unreads) - (unless (gnus-ephemeral-group-p gnus-newsgroup-name) - (gnus-group-update-group group)) - (setq articles (gnus-articles-to-read group read-all)) + (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) @@ -3919,15 +3947,15 @@ If READ-ALL is non-nil, all articles in the group are selected." ;; Removed marked articles that do not exist. (gnus-update-missing-marks (gnus-sorted-complement fetched-articles articles)) - ;; Let the Gnus agent mark articles as read. - (when gnus-agent - (gnus-agent-get-undownloaded-list)) ;; 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)) ;; Check whether auto-expire is to be done in this group. (setq gnus-newsgroup-auto-expire (gnus-group-auto-expirable-p group)) @@ -4353,7 +4381,7 @@ The resulting hash table is returned, or nil if no Xrefs were found." (or dependencies (save-excursion (set-buffer gnus-summary-buffer) gnus-newsgroup-dependencies))) - headers id id-dep ref-dep end ref) + headers id end ref) (save-excursion (set-buffer nntp-server-buffer) ;; Translate all TAB characters into SPACE characters. @@ -4446,7 +4474,8 @@ The resulting hash table is returned, or nil if no Xrefs were found." (setq ref2 (substring in-reply-to (match-beginning 0) (match-end 0))) (when (> (length ref2) (length ref)) - (setq ref ref2)))) + (setq ref ref2))) + ref) (setq ref nil)))) ;; Chars. (progn @@ -4572,7 +4601,7 @@ the subject line on." (t (gnus-read-header id)))) (number (and (numberp id) id)) - pos d) + d) (when header ;; Rebuild the thread that this article is part of and go to the ;; article we have fetched. @@ -4659,6 +4688,19 @@ current article will be taken into consideration." ;; 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)))) + +(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) @@ -4857,12 +4899,12 @@ displayed, no centering will be performed." ;; first unread article is the article after the last read ;; article. Sounds logical, doesn't it? (if (not (listp (cdr read))) - (setq first (1+ (cdr read))) + (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 1)) + (setq first (car active))) (while read (when first (while (< first nlast) @@ -5174,12 +5216,6 @@ The state which existed when entering the ephemeral is reset." (select-window (get-buffer-window gnus-article-buffer)) ) -(defun gnus-summary-scroll-down () - "Scroll down one line current article." - (interactive) - (gnus-summary-scroll-up -1) - ) - ;;; Dead summaries. (defvar gnus-dead-summary-mode-map nil) @@ -5749,6 +5785,12 @@ Argument LINES specifies lines to be scrolled up (or down if negative)." (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) @@ -6059,7 +6101,8 @@ If ALL, mark even excluded ticked and dormants as read." '<) (sort gnus-newsgroup-limit '<))) article) - (setq gnus-newsgroup-unreads gnus-newsgroup-limit) + (setq gnus-newsgroup-unreads + (gnus-intersection gnus-newsgroup-unreads gnus-newsgroup-limit)) (if all (setq gnus-newsgroup-dormant nil gnus-newsgroup-marked nil @@ -6107,6 +6150,7 @@ If ALL, mark even excluded ticked and dormants as read." ;; 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)))) @@ -6356,8 +6400,7 @@ 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)) - fmethod root) + 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. @@ -6392,8 +6435,7 @@ or `gnus-select-method', no matter what backend the article comes from." (gnus-summary-article-sparse-p (mail-header-number header)) (memq (mail-header-number header) - gnus-newsgroup-limit))) - h) + gnus-newsgroup-limit)))) (cond ;; If the article is present in the buffer we just go to it. ((and header @@ -6965,15 +7007,10 @@ and `request-accept' functions." (gnus-summary-mark-article article gnus-canceled-mark) (gnus-message 4 "Deleted article %s" article)) (t - (let* ((entry - (or - (gnus-gethash (car art-group) gnus-newsrc-hashtb) - (gnus-gethash - (gnus-group-prefixed-name - (car art-group) - (or select-method - (gnus-find-method-for-group to-newsgroup))) - gnus-newsrc-hashtb))) + (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))) ;; Update the group that has been moved to. @@ -7077,7 +7114,7 @@ re-spool using this method." (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 "")) + :type '(choice (gnus-select-method :value (nnml "")) (const nil)) :group 'gnus-summary-mail) @@ -7137,7 +7174,7 @@ latter case, they will be copied into the relevant groups." (not (file-regular-p file)) (error "Can't read %s" file)) (save-excursion - (set-buffer (get-buffer-create " *import file*")) + (set-buffer (gnus-get-buffer-create " *import file*")) (buffer-disable-undo (current-buffer)) (erase-buffer) (nnheader-insert-file-contents file) @@ -7368,7 +7405,7 @@ groups." ;;; Respooling -(defun gnus-summary-respool-query (&optional silent) +(defun gnus-summary-respool-query (&optional silent trace) "Query where the respool algorithm would put this article." (interactive) (let (gnus-mark-article-hook) @@ -7377,7 +7414,7 @@ groups." (set-buffer gnus-original-article-buffer) (save-restriction (message-narrow-to-head) - (let ((groups (nnmail-article-group 'identity))) + (let ((groups (nnmail-article-group 'identity trace))) (unless silent (if groups (message "This message would go to %s" @@ -7385,6 +7422,12 @@ 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) @@ -7561,6 +7604,7 @@ the actual number of articles marked is returned." (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) @@ -7568,6 +7612,7 @@ the actual number of articles marked is returned." (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) @@ -7625,6 +7670,8 @@ returned." (= mark gnus-read-mark) (= mark gnus-souped-mark) (= mark gnus-duplicate-mark))) (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) @@ -7634,6 +7681,8 @@ returned." "Mark the current article quickly as unread with MARK." (let* ((article (gnus-summary-article-number)) (old-mark (gnus-summary-article-mark article))) + ;; Let the backend know about the mark change. + (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) (if (eq mark old-mark) t (if (<= article 0) @@ -7689,6 +7738,8 @@ marked." (let* ((mark (or mark gnus-del-mark)) (article (or article (gnus-summary-article-number))) (old-mark (gnus-summary-article-mark article))) + ;; Let the backend know about the mark change. + (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) (if (eq mark old-mark) t (unless article @@ -8506,8 +8557,7 @@ save those articles instead." "Pipe the current article through PROGRAM." (interactive "sProgram: ") (gnus-summary-select-article) - (let ((mail-header-separator "") - (art-buf (get-buffer gnus-article-buffer))) + (let ((mail-header-separator "")) (gnus-eval-in-buffer-window gnus-article-buffer (save-restriction (widen) diff --git a/lisp/gnus-topic.el b/lisp/gnus-topic.el index 6880f63..3f2b2af 100644 --- a/lisp/gnus-topic.el +++ b/lisp/gnus-topic.el @@ -74,6 +74,7 @@ with some simple extensions. (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.") @@ -109,9 +110,7 @@ with some simple extensions. (defun gnus-topic-unread (topic) "Return the number of unread articles in TOPIC." - (or (save-excursion - (and (gnus-topic-goto-topic topic) - (gnus-group-topic-unread))) + (or (cdr (assoc topic gnus-topic-unreads)) 0)) (defun gnus-group-topic-p () @@ -472,6 +471,7 @@ articles in the topic and its subtopics." (car type) visiblep (not (eq (nth 2 type) 'hidden)) level all-entries unread)) + (gnus-topic-update-unreads (car type) unread) (goto-char end) unread)) @@ -528,6 +528,7 @@ articles in the topic and its subtopics." (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. (gnus-add-text-properties @@ -540,6 +541,11 @@ articles in the topic and its subtopics." '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) @@ -621,7 +627,7 @@ articles in the topic and its subtopics." (parent (gnus-topic-parent-topic topic-name)) (all-entries entries) (unread 0) - old-unread entry) + old-unread entry new-unread) (when (gnus-topic-goto-topic (car type)) ;; Tally all the groups that belong in this topic. (if reads @@ -637,11 +643,14 @@ articles in the topic and its subtopics." (car type) (gnus-topic-visible-p) (not (eq (nth 2 type) 'hidden)) (gnus-group-topic-level) all-entries unread) - (gnus-delete-line)) + (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 (gnus-group-topic-unread) 0)))) + parent + (- (or old-unread 0) (or new-unread 0)))) unread)) (defun gnus-topic-group-indentation () @@ -904,6 +913,10 @@ articles in the topic and its subtopics." "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. @@ -923,7 +936,7 @@ articles in the topic and its subtopics." "r" gnus-topic-rename "\177" gnus-topic-delete [delete] gnus-topic-delete - "h" gnus-topic-toggle-display-empty-topics) + "H" gnus-topic-toggle-display-empty-topics) (gnus-define-keys (gnus-topic-sort-map "S" gnus-group-topic-map) "s" gnus-topic-sort-groups @@ -973,7 +986,6 @@ articles in the topic and its subtopics." (gnus-topic-make-menu-bar)) (gnus-set-format 'topic t) (gnus-add-minor-mode 'gnus-topic-mode " Topic" gnus-topic-mode-map) - (add-hook 'gnus-summary-exit-hook 'gnus-topic-update-topic) (add-hook 'gnus-group-catchup-group-hook 'gnus-topic-update-topic) (set (make-local-variable 'gnus-group-prepare-function) 'gnus-group-prepare-topics) diff --git a/lisp/gnus-util.el b/lisp/gnus-util.el index 82e7f94..5359dda 100644 --- a/lisp/gnus-util.el +++ b/lisp/gnus-util.el @@ -75,7 +75,10 @@ (set symbol nil)) symbol)) -(defun gnus-truncate-string (str width) +;; Avoid byte-compile warning. +;; In Mule, this function will be redefined to `truncate-string', +;; which takes 3 or 4 args. +(defun gnus-truncate-string (str width &rest ignore) (substring str 0 width)) ;; Added by Geoffrey T. Dairiki . A safe way @@ -540,7 +543,7 @@ Timezone package is used." (progn (set-buffer gnus-work-buffer) (erase-buffer)) - (set-buffer (get-buffer-create gnus-work-buffer)) + (set-buffer (gnus-get-buffer-create gnus-work-buffer)) (kill-all-local-variables) (buffer-disable-undo (current-buffer)))) @@ -580,6 +583,7 @@ Timezone package is used." 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)))) @@ -722,8 +726,7 @@ with potentially long computations." (setq filename (expand-file-name filename)) (setq rmail-default-rmail-file filename) (let ((artbuf (current-buffer)) - (tmpbuf (get-buffer-create " *Gnus-output*")) - (coding-system-for-write 'binary)) + (tmpbuf (gnus-get-buffer-create " *Gnus-output*"))) (save-excursion (or (get-file-buffer filename) (file-exists-p filename) @@ -759,9 +762,12 @@ with potentially long computations." (when msg (goto-char (point-min)) (widen) - (search-backward "\^_") - (narrow-to-region (point) (point-max)) - (goto-char (1+ (point-min))) + (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))))) @@ -771,7 +777,7 @@ with potentially long computations." "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*"))) + (tmpbuf (gnus-get-buffer-create " *Gnus-output*"))) (save-excursion ;; Create the file, if it doesn't exist. (when (and (not (get-file-buffer filename)) @@ -837,8 +843,7 @@ with potentially long computations." (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) - (myarg arg)) + (let ((myfuns funs)) (while myfuns (setq arg (funcall (pop myfuns) arg))) arg)) @@ -856,6 +861,7 @@ ARG is passed to the first function." (defvar gnus-netrc-syntax-table (let ((table (copy-syntax-table text-mode-syntax-table))) + (modify-syntax-entry ?@ "w" table) (modify-syntax-entry ?- "w" table) (modify-syntax-entry ?_ "w" table) (modify-syntax-entry ?! "w" table) @@ -878,50 +884,59 @@ ARG is passed to the first function." "password" "account" "macdef" "force")) alist elem result pair) (nnheader-set-temp-buffer " *netrc*") - (set-syntax-table gnus-netrc-syntax-table) - (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 ") - (unless (eobp) - (setq elem (buffer-substring - (point) (progn (forward-sexp 1) (point)))) - (cond - ((equal elem "macdef") - ;; We skip past the macro definition. + (unwind-protect + (progn + (set-syntax-table gnus-netrc-syntax-table) + (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 ") + (unless (eobp) + (setq elem (buffer-substring + (point) (progn (forward-sexp 1) (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)))))) + (if alist + (push (nreverse alist) result)) + (setq alist nil + pair nil) (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. - (when (and pair (cdr pair)) - (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)))))) - (push alist result) - (setq alist nil - pair nil) - (widen) - (forward-line 1)) - result)))) + (forward-line 1)) + (nreverse result)) + (kill-buffer " *netrc*")))))) (defun gnus-netrc-machine (list machine) - "Return the netrc values from LIST for MACHINE." - (while (and list - (not (equal (cdr (assoc "machine" (car list))) machine))) - (pop list)) - (when list - (car list))) + "Return the netrc values from LIST for MACHINE or for the default entry." + (let ((rest list)) + (while (and list + (not (equal (cdr (assoc "machine" (car list))) machine))) + (pop list)) + (car (or list + (progn (while (and rest (not (assoc "default" (car rest)))) + (pop rest)) + rest))))) (defun gnus-netrc-get (alist type) "Return the value of token TYPE from ALIST." @@ -929,6 +944,7 @@ ARG is passed to the first function." ;;; Various +(defvar gnus-group-buffer) ; Compiler directive (defun gnus-alive-p () "Say whether Gnus is running or not." (and (boundp 'gnus-group-buffer) @@ -949,7 +965,7 @@ ARG is passed to the first function." "Delete elements from LIST that satisfy PREDICATE." (let (out) (while list - (when (funcall predicate (car list)) + (unless (funcall predicate (car list)) (push (car list) out)) (pop list)) (nreverse out))) @@ -967,6 +983,12 @@ ARG is passed to the first function." (error "Not a symbol: %s" alist)) `(setq ,alist (delq (assq ,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) ".*$"))) + (provide 'gnus-util) ;;; gnus-util.el ends here diff --git a/lisp/gnus-uu.el b/lisp/gnus-uu.el index 3a0bf91..19929f3 100644 --- a/lisp/gnus-uu.el +++ b/lisp/gnus-uu.el @@ -513,12 +513,12 @@ didn't work, and overwrite existing files. Otherwise, ask each time." (interactive "P") (let ((gnus-uu-save-in-digest t) (file (make-temp-name (nnheader-concat gnus-uu-tmp-dir "forward"))) - buf subject from newsgroups) + buf subject from) (gnus-setup-message 'forward (setq gnus-uu-digest-from-subject nil) (gnus-uu-decode-save n file) - (setq buf (switch-to-buffer (get-buffer-create " *gnus-uu-forward*"))) - (gnus-add-current-to-buffer-list) + (setq buf (switch-to-buffer + (gnus-get-buffer-create " *gnus-uu-forward*"))) (erase-buffer) (insert-file file) (let ((fs gnus-uu-digest-from-subject)) @@ -638,7 +638,7 @@ didn't work, and overwrite existing files. Otherwise, ask each time." "Invert the list of process-marked articles." (interactive) (let ((data gnus-newsgroup-data) - d number) + number) (save-excursion (while data (if (memq (setq number (gnus-data-number (pop data))) @@ -828,16 +828,15 @@ didn't work, and overwrite existing files. Otherwise, ask each time." (mail-header-subject header)) gnus-uu-digest-from-subject)) (let ((name (file-name-nondirectory gnus-uu-saved-article-name)) - (delim (concat "^" (make-string 30 ?-) "$")) 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 (get-buffer-create "*gnus-uu-body*")) + (save-excursion (set-buffer (gnus-get-buffer-create "*gnus-uu-body*")) (erase-buffer)) (save-excursion - (set-buffer (get-buffer-create "*gnus-uu-pre*")) + (set-buffer (gnus-get-buffer-create "*gnus-uu-pre*")) (erase-buffer) (insert (format "Date: %s\nFrom: %s\nSubject: %s Digest\n\nTopics:\n" @@ -970,7 +969,7 @@ didn't work, and overwrite existing files. Otherwise, ask each time." (if (not (re-search-forward gnus-uu-postscript-end-string nil t)) (setq state (list 'wrong-type)) (setq end-char (point)) - (set-buffer (get-buffer-create gnus-uu-output-buffer-name)) + (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")) @@ -1020,45 +1019,36 @@ didn't work, and overwrite existing files. Otherwise, ask each time." (defun gnus-uu-reginize-string (string) ;; Takes a string and puts a \ in front of every special character; - ;; ignores any leading "version numbers" thingies that they use in - ;; the comp.binaries groups, and either replaces anything that looks - ;; like "2/3" with "[0-9]+/[0-9]+" or, if it can't find something - ;; like that, replaces the last two numbers with "[0-9]+". This, in - ;; my experience, should get most postings of a series. - (let ((count 2) - (vernum "v[0-9]+[a-z][0-9]+:") - beg) - (save-excursion - (set-buffer (get-buffer-create gnus-uu-output-buffer-name)) - (buffer-disable-undo (current-buffer)) - (erase-buffer) - (insert (regexp-quote string)) - (setq beg 1) + ;; 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 (current-buffer)) + (erase-buffer) + (insert (regexp-quote string)) - (setq case-fold-search nil) - (goto-char (point-min)) - (when (looking-at vernum) - (replace-match vernum t t) - (setq beg (length vernum))) + (setq case-fold-search nil) - (goto-char beg) - (if (re-search-forward "[ \t]*[0-9]+/[0-9]+" nil t) - (replace-match " [0-9]+/[0-9]+") + (end-of-line) + (if (re-search-backward "\\([^0-9]\\)[0-9]+/\\([0-9]+\\)" nil t) + (replace-match "\\1[0-9]+/\\2") - (goto-char beg) - (if (re-search-forward "[0-9]+[ \t]*of[ \t]*[0-9]+" nil t) - (replace-match "[0-9]+ of [0-9]+") + (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)))) + (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 beg) - (while (re-search-forward "[ \t]+" nil t) - (replace-match "[ \t]*" t t)) + (goto-char 1) + (while (re-search-forward "[ \t]+" nil t) + (replace-match "[ \t]+" t t)) - (buffer-substring 1 (point-max))))) + (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 @@ -1098,8 +1088,7 @@ didn't work, and overwrite existing files. Otherwise, ask each time." (gnus-uu-reginize-string (gnus-summary-article-subject)))) list-of-subjects) (save-excursion - (if (not subject) - () + (when subject ;; Collect all subjects matching subject. (let ((case-fold-search t) (data gnus-newsgroup-data) @@ -1134,7 +1123,7 @@ didn't work, and overwrite existing files. Otherwise, ask each time." (let ((out-list string-list) string) (save-excursion - (set-buffer (get-buffer-create gnus-uu-output-buffer-name)) + (set-buffer (gnus-get-buffer-create gnus-uu-output-buffer-name)) (buffer-disable-undo (current-buffer)) (while string-list (erase-buffer) @@ -1221,119 +1210,121 @@ didn't work, and overwrite existing files. Otherwise, ask each time." (not (memq 'end process-state)))) (setq article (pop articles)) - (push article article-series) - - (unless articles - (if (eq state 'first) - (setq state 'first-and-last) - (setq state 'last))) + (when (vectorp (gnus-summary-article-header article)) + (push article article-series) - (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) + (unless articles + (if (eq state 'first) + (setq state 'first-and-last) + (setq state 'last))) - ;; 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))) + (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) - ;; 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)))) + ;; 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))))) result-files)) @@ -1357,11 +1348,18 @@ didn't work, and overwrite existing files. Otherwise, ask each time." (defun gnus-uu-part-number (article) (let* ((header (gnus-summary-article-header article)) - (subject (and header (mail-header-subject header)))) - (if (and subject - (string-match "[0-9]+ */[0-9]+\\|[0-9]+ * of *[0-9]+" subject)) - (match-string 0 subject) - ""))) + (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))) @@ -1419,7 +1417,7 @@ didn't work, and overwrite existing files. Otherwise, ask each time." (setq gnus-uu-uudecode-process (start-process "*uudecode*" - (get-buffer-create gnus-uu-output-buffer-name) + (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)))) @@ -1485,7 +1483,7 @@ didn't work, and overwrite existing files. Otherwise, ask each time." (setq start-char (point)) (call-process-region start-char (point-max) shell-file-name nil - (get-buffer-create gnus-uu-output-buffer-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")))) @@ -1548,13 +1546,13 @@ didn't work, and overwrite existing files. Otherwise, ask each time." (setq command (format "cd %s ; %s" dir (gnus-uu-command action file-path))) (save-excursion - (set-buffer (get-buffer-create gnus-uu-output-buffer-name)) + (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 - (get-buffer-create gnus-uu-output-buffer-name) + (gnus-get-buffer-create gnus-uu-output-buffer-name) nil shell-command-switch command)) (message "") (gnus-message 2 "Error during unpacking of archive") @@ -1912,7 +1910,7 @@ If no file has been included, the user will be asked for a file." (unwind-protect (if (save-excursion (set-buffer (setq uubuf - (get-buffer-create uuencode-buffer-name))) + (gnus-get-buffer-create uuencode-buffer-name))) (erase-buffer) (funcall gnus-uu-post-encode-method file-path file-name)) (insert-buffer-substring uubuf) @@ -1927,7 +1925,7 @@ If no file has been included, the user will be asked for a file." (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 buf post-buf whole-len beg-binary end-binary) + beg-line minlen post-buf whole-len beg-binary end-binary) (setq post-buf (current-buffer)) @@ -1945,7 +1943,7 @@ If no file has been included, the user will be asked for a file." (setq end-binary (point-max)) (save-excursion - (set-buffer (setq uubuf (get-buffer-create encoded-buffer-name))) + (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)) @@ -1977,7 +1975,7 @@ If no file has been included, the user will be asked for a file." (setq i 1) (setq beg 1) (while (not (> i parts)) - (set-buffer (get-buffer-create send-buffer-name)) + (set-buffer (gnus-get-buffer-create send-buffer-name)) (erase-buffer) (insert header) (when (and threaded gnus-uu-post-message-id) diff --git a/lisp/gnus-win.el b/lisp/gnus-win.el index 5c4eb52..c41fbae 100644 --- a/lisp/gnus-win.el +++ b/lisp/gnus-win.el @@ -154,6 +154,10 @@ (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))) @@ -185,6 +189,7 @@ See the Gnus manual for an explanation of the syntax used.") (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) @@ -314,7 +319,7 @@ See the Gnus manual for an explanation of the syntax used.") (t (cdr (assq type gnus-window-to-buffer)))))) (unless buffer (error "Illegal buffer type: %s" type)) - (switch-to-buffer (get-buffer-create + (switch-to-buffer (gnus-get-buffer-create (gnus-window-to-buffer-helper buffer))) (when (memq 'frame-focus split) (setq gnus-window-frame-focus window)) @@ -448,13 +453,7 @@ See the Gnus manual for an explanation of the syntax used.") (defun gnus-delete-windows-in-gnusey-frames () "Do a `delete-other-windows' in all frames that have Gnus windows." - (let ((buffers - (mapcar - (lambda (elem) - (let ((buf (gnus-window-to-buffer-helper (cdr elem)))) - (if (not (null buf)) - (get-buffer buf)))) - gnus-window-to-buffer))) + (let ((buffers (gnus-buffers))) (mapcar (lambda (frame) (unless (eq (cdr (assq 'minibuffer @@ -518,39 +517,22 @@ should have point." (nth 1 (window-edges window))) (defun gnus-remove-some-windows () - (let ((buffers gnus-window-to-buffer) + (let ((buffers (gnus-buffers)) buf bufs lowest-buf lowest) (save-excursion ;; Remove windows on all known Gnus buffers. - (while buffers - (and (setq buf (gnus-window-to-buffer-helper (cdar buffers))) - (get-buffer-window buf) - (progn - (push buf bufs) - (pop-to-buffer buf) - (when (or (not lowest) - (< (gnus-window-top-edge) lowest)) - (setq lowest (gnus-window-top-edge)) - (setq lowest-buf buf)))) - (setq buffers (cdr buffers))) - ;; Remove windows on *all* summary buffers. - (walk-windows - (lambda (win) - (let ((buf (window-buffer win))) - (when (string-match "^\\*\\(Dead \\)?Summary" (buffer-name buf)) - (push buf bufs) - (pop-to-buffer buf) - (when (or (not lowest) - (< (gnus-window-top-edge) lowest)) - (setq lowest-buf buf) - (setq lowest (gnus-window-top-edge))))))) + (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) (switch-to-buffer nntp-server-buffer)) - (while bufs - (when (not (eq (car bufs) lowest-buf)) - (delete-windows-on (car bufs))) - (setq bufs (cdr bufs)))))) + (mapcar (lambda (b) (delete-windows-on b t)) bufs)))) (provide 'gnus-win) diff --git a/lisp/gnus-xmas.el b/lisp/gnus-xmas.el index 9d3d239..d8106d1 100644 --- a/lisp/gnus-xmas.el +++ b/lisp/gnus-xmas.el @@ -90,7 +90,6 @@ asynchronously. The compressed face will be piped to this command." (defvar gnus-active-hashtb) (defvar gnus-article-buffer) (defvar gnus-auto-center-summary) -(defvar gnus-buffer-list) (defvar gnus-current-headers) (defvar gnus-level-killed) (defvar gnus-level-zombie) @@ -479,7 +478,28 @@ call it with the value of the `gnus-data' text property." 'x-color-values (lambda (color) (color-instance-rgb-components - (make-color-instance color)))))) + (make-color-instance color))))) + + (when (featurep 'mule) + (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) + `(concat ,el (make-string + (max 0 (- ,pad (string-width ,el))) ?\ )) + `(concat (make-string + (max 0 (- ,pad (string-width ,el))) ?\ ) + ,el)) + (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)))))) + )) (defun gnus-xmas-redefine () "Redefine lots of Gnus functions for XEmacs." @@ -525,8 +545,91 @@ call it with the value of the `gnus-data' text property." (add-hook 'gnus-draft-mode-hook 'gnus-xmas-draft-menu-add) (add-hook 'gnus-summary-mode-hook 'gnus-xmas-switch-horizontal-scrollbar-off) - (add-hook 'gnus-tree-mode-hook 'gnus-xmas-switch-horizontal-scrollbar-off)) - + (add-hook 'gnus-tree-mode-hook 'gnus-xmas-switch-horizontal-scrollbar-off) + + (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-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)))))) + )) ;;; XEmacs logo and toolbar. diff --git a/lisp/gnus.el b/lisp/gnus.el index f7e0495..871b70f 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -250,11 +250,11 @@ is restarted, and sometimes reloaded." :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) -(defconst gnus-version-number "6.7.8" +(defconst gnus-version-number "6.8.19" "Version number for this version of gnus.") (defconst gnus-version - (format "Semi-gnus %s (based on Gnus 5.6.22; for SEMI 1.8/FLIM 1.7)" + (format "Semi-gnus %s (based on Gnus 5.6.44; for SEMI 1.8, FLIM 1.8/1.9)" gnus-version-number) "Version string for this version of gnus.") @@ -602,6 +602,33 @@ be set in `.emacs' instead." "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*") @@ -622,7 +649,7 @@ be set in `.emacs' instead." (defun gnus-splash () (save-excursion - (switch-to-buffer (get-buffer-create gnus-group-buffer)) + (switch-to-buffer (gnus-get-buffer-create gnus-group-buffer)) (let ((buffer-read-only nil)) (erase-buffer) (unless gnus-inhibit-startup-message @@ -690,9 +717,10 @@ be set in `.emacs' instead." (eval-when (load) (let ((command (format "%s" this-command))) - (when (and (string-match "gnus" command) - (not (string-match "gnus-other-frame" command))) - (gnus-splash)))) + (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. @@ -747,7 +775,7 @@ used to 899, you would say something along these lines: :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. @@ -755,7 +783,7 @@ used to 899, you would say something along these lines: (or (getenv "NNTPSERVER") (and (file-readable-p gnus-nntpserver-file) (save-excursion - (set-buffer (get-buffer-create " *gnus nntp*")) + (set-buffer (gnus-get-buffer-create " *gnus nntp*")) (buffer-disable-undo (current-buffer)) (insert-file-contents gnus-nntpserver-file) (let ((name (buffer-string))) @@ -840,6 +868,7 @@ 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) + sexp string)) (defcustom gnus-secondary-servers nil @@ -1421,11 +1450,11 @@ want." (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"))))) + 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. @@ -1467,9 +1496,6 @@ want." (defvar gnus-article-buffer "*Article*") (defvar gnus-server-buffer "*Server*") -(defvar gnus-buffer-list nil - "Gnus buffers that should be killed on exit.") - (defvar gnus-slave nil "Whether this Gnus is a slave or not.") @@ -1624,8 +1650,10 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.") 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" gnus-uu-delete-work-dir gnus-quote-arg-for-sh-or-csh) + gnus-uu-decode-binhex-view gnus-uu-unmark-thread + gnus-uu-mark-over gnus-uu-post-news 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-extended-version) ("gnus-msg" :interactive t @@ -1635,7 +1663,11 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.") 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-bug) + 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-wide-reply-with-original + gnus-summary-post-forward) ("gnus-picon" :interactive t gnus-article-display-picons gnus-group-display-picons gnus-picons-article-display-x-face gnus-picons-display-x-face) @@ -1679,7 +1711,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.") gnus-start-date-timer gnus-stop-date-timer) ("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-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) @@ -1931,6 +1963,7 @@ This restriction may disappear in later versions of Gnus." ;;; 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." @@ -1945,43 +1978,27 @@ STRINGS will be evaluated in normal `or' order." (setq strings nil))) string)) -;; Add the current buffer to the list of buffers to be killed on exit. -(defun gnus-add-current-to-buffer-list () - (or (memq (current-buffer) gnus-buffer-list) - (push (current-buffer) gnus-buffer-list))) - (defun gnus-version (&optional arg) "Version number of this version of Gnus. If ARG, insert string at point." (interactive "P") - (let ((methods gnus-valid-select-methods) - (mess gnus-version) - meth) - ;; Go through all the legal select methods and add their version - ;; numbers to the total version string. Only the backends that are - ;; currently in use will have their message numbers taken into - ;; consideration. - (while methods - (setq meth (intern (concat (caar methods) "-version"))) - (and (boundp meth) - (stringp (symbol-value meth)) - (setq mess (concat mess "; " (symbol-value meth)))) - (setq methods (cdr methods))) - (if arg - (insert (message mess)) - (message mess)))) + (if arg + (insert (message gnus-version)) + (message gnus-version))) (defun gnus-continuum-version (version) "Return VERSION as a floating point number." (when (or (string-match "^\\([^ ]+\\)? ?Gnus v?\\([0-9.]+\\)$" version) (string-match "^\\(.?\\)gnus-\\([0-9.]+\\)$" version)) - (let* ((alpha (and (match-beginning 1) (match-string 1 version))) - (number (match-string 2 version)) - major minor least) - (string-match "\\([0-9]\\)\\.\\([0-9]+\\)\\.?\\([0-9]+\\)?" number) - (setq major (string-to-number (match-string 1 number))) - (setq minor (string-to-number (match-string 2 number))) - (setq least (if (match-beginning 3) + (let ((alpha (and (match-beginning 1) (match-string 1 version))) + (number (match-string 2 version)) + major minor least) + (unless (string-match + "\\([0-9]\\)\\.\\([0-9]+\\)\\.?\\([0-9]+\\)?" number) + (error "Invalid version string: %s" version)) + (setq major (string-to-number (match-string 1 number)) + minor (string-to-number (match-string 2 number)) + least (if (match-beginning 3) (string-to-number (match-string 3 number)) 0)) (string-to-number @@ -1990,7 +2007,11 @@ If ARG, insert string at point." (cond ((member alpha '("(ding)" "d")) "4.99") ((member alpha '("September" "s")) "5.01") - ((member alpha '("Red" "r")) "5.03")) + ((member alpha '("Red" "r")) "5.03") + ((member alpha '("Quassia" "q")) "5.05") + ((member alpha '("p")) "5.07") + ((member alpha '("o")) "5.09") + ((member alpha '("n")) "5.11")) minor least) (format "%d.%02d%02d" major minor least)))))) @@ -2033,7 +2054,7 @@ g -- Group name." (setq prompt (match-string 1 string))) (setq i (match-end 0)) ;; We basically emulate just about everything that - ;; `interactive' does, but adds the "g" and "G" specs. + ;; `interactive' does, but add the specs listed above. (push (cond ((= c ?a) @@ -2174,7 +2195,14 @@ that that variable is buffer-local to the summary buffers." "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. - (eq (gnus-request-type group article) 'news)))) + (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 () @@ -2243,9 +2271,11 @@ that that variable is buffer-local to the summary buffers." (gnus-server-to-method method)) ((equal method gnus-select-method) gnus-select-method) - ((and (stringp (car method)) group) + ((and (stringp (car method)) + group) (gnus-server-extend-method group method)) - ((and method (not group) + ((and method + (not group) (equal (cadr method) "")) method) (t @@ -2677,11 +2707,14 @@ Disallow illegal group names." (defun gnus-read-method (prompt) "Prompt the user for a method. Allow completion over sensible values." - (let ((method - (completing-read - prompt (append gnus-valid-select-methods gnus-predefined-server-alist - gnus-server-alist) - nil t nil 'gnus-method-history))) + (let* ((servers + (append gnus-valid-select-methods + 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)) @@ -2691,7 +2724,7 @@ Allow completion over sensible values." (assoc method gnus-valid-select-methods)) (read-string "Address: ") ""))) - ((assoc method gnus-server-alist) + ((assoc method servers) method) (t (list (intern method) ""))))) diff --git a/lisp/ietf-drums.el b/lisp/ietf-drums.el deleted file mode 100644 index 2ef7d61..0000000 --- a/lisp/ietf-drums.el +++ /dev/null @@ -1,242 +0,0 @@ -;;; ietf-drums.el --- Functions for parsing RFC822bis headers -;; Copyright (C) 1998 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: - -(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 - (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 (following-char)) - (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 comments from STRING." - (with-temp-buffer - (ietf-drums-init string) - (let (c) - (while (not (eobp)) - (setq c (following-char)) - (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 (following-char)) - (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-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 (following-char)) - (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 (following-char)) - (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 (search-forward "\n\n" nil 1) - (1- (point)) - (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/mail-parse.el b/lisp/mail-parse.el deleted file mode 100644 index 095e114..0000000 --- a/lisp/mail-parse.el +++ /dev/null @@ -1,65 +0,0 @@ -;;; mail-parse.el --- Interface functions for parsing mail -;; Copyright (C) 1998 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 'drums) -(require 'rfc2231) -(require 'rfc2047) - -(defalias 'mail-header-parse-content-type 'rfc2231-parse-string) -(defalias 'mail-header-parse-content-disposition 'rfc2231-parse-string) -(defalias 'mail-content-type-get 'rfc2231-get-value) - -(defalias 'mail-header-remove-comments 'drums-remove-comments) -(defalias 'mail-header-remove-whitespace 'drums-remove-whitespace) -(defalias 'mail-header-get-comment 'drums-get-comment) -(defalias 'mail-header-parse-address 'drums-parse-address) -(defalias 'mail-header-parse-addresses 'drums-parse-addresses) -(defalias 'mail-header-parse-date 'drums-parse-date) -(defalias 'mail-narrow-to-head 'drums-narrow-to-header) -(defalias 'mail-quote-string '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/mailcap.el b/lisp/mailcap.el deleted file mode 100644 index c5249f3..0000000 --- a/lisp/mailcap.el +++ /dev/null @@ -1,847 +0,0 @@ -;;; mailcap.el --- Functions for displaying MIME parts -;; Copyright (C) 1998 Free Software Foundation, Inc. - -;; Author: William M. Perry -;; 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-and-compile - (require 'cl)) -(require 'mail-parse) - -(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.") - -(defvar mailcap-mime-data - '(("application" - ("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) - (type ."application/octet-stream")) - ("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) - (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) - (type . "application/zip") - ("copiousoutput")) - ("pdf" - (viewer . "acroread %s") - (type . "application/pdf")) - ("postscript" - (viewer . "open %s") - (type . "application/postscript") - (test . (eq (mm-device-type) 'ns))) - ("postscript" - (viewer . "ghostview %s") - (type . "application/postscript") - (test . (eq (mm-device-type) 'x)) - ("needsx11")) - ("postscript" - (viewer . "ps2ascii %s") - (type . "application/postscript") - (test . (not (getenv "DISPLAY"))) - ("copiousoutput"))) - ("audio" - ("x-mpeg" - (viewer . "maplay %s") - (type . "audio/x-mpeg")) - (".*" - (viewer . mm-view-sound-file) - (test . (or (featurep 'nas-sound) - (featurep 'native-sound))) - (type . "audio/*")) - (".*" - (viewer . "showaudio") - (type . "audio/*"))) - ("message" - ("rfc-*822" - (viewer . gnus-article-prepare-display) - (test . (and (featurep 'gnus) - (gnus-alive-p))) - (type . "message/rfc-822")) - ("rfc-*822" - (viewer . vm-mode) - (test . (fboundp 'vm-mode)) - (type . "message/rfc-822")) - ("rfc-*822" - (viewer . w3-mode) - (test . (fboundp 'w3-mode)) - (type . "message/rfc-822")) - ("rfc-*822" - (viewer . view-mode) - (test . (fboundp 'view-mode)) - (type . "message/rfc-822")) - ("rfc-*822" - (viewer . fundamental-mode) - (type . "message/rfc-822"))) - ("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")) - (".*" - (viewer . "aopen %s") - (type . "image/*") - (test . (eq (mm-device-type) 'ns))) - (".*" - (viewer . "xv -perfect %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. This is keyed on the lowercase -attribute name (viewer, test, etc). This looks like: - ((viewer . viewerinfo) - (test . testinfo) - (xxxx . \"string\")) - -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'd, with the buffer as an argument. - -testinfo is a list of strings, or nil. If nil, it means the -viewer specified is always valid. If it is a list of strings, -these are used to determine whether a viewer passes the 'test' or -not.") - -(defvar mailcap-download-directory nil - "*Where downloaded files should go by default.") - -(defvar mailcap-temporary-directory (or (getenv "TMPDIR") "/tmp") - "*Where temporary files go.") - -;;; -;;; Utility functions -;;; - -(defun mailcap-generate-unique-filename (&optional fmt) - "Generate a unique filename in mailcap-temporary-directory" - (if (not fmt) - (let ((base (format "mailcap-tmp.%d" (user-real-uid))) - (fname "") - (x 0)) - (setq fname (format "%s%d" base x)) - (while (file-exists-p - (expand-file-name fname mailcap-temporary-directory)) - (setq x (1+ x) - fname (concat base (int-to-string x)))) - (expand-file-name fname mailcap-temporary-directory)) - (let ((base (concat "mm" (int-to-string (user-real-uid)))) - (fname "") - (x 0)) - (setq fname (format fmt (concat base (int-to-string x)))) - (while (file-exists-p - (expand-file-name fname mailcap-temporary-directory)) - (setq x (1+ x) - fname (format fmt (concat base (int-to-string x))))) - (expand-file-name fname mailcap-temporary-directory)))) - -(defun mailcap-save-binary-file () - (goto-char (point-min)) - (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)))) - -(defun mailcap-maybe-eval () - "Maybe evaluate a buffer of emacs lisp code" - (if (yes-or-no-p "This is emacs-lisp code, evaluate it? ") - (eval-buffer (current-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 unix-style path string PATH. -If FORCE, re-parse even if already parsed." - (interactive (list nil t)) - (when (or (not mailcap-parsed-p) - force) - (cond - (path nil) - ((getenv "MAILCAPS") (setq path (getenv "MAILCAPS"))) - ((memq system-type '(ms-dos ms-windows windows-nt)) - (setq path (mapconcat 'expand-file-name '("~/mail.cap" "~/etc/mail.cap") - ";"))) - (t (setq path (mapconcat 'expand-file-name - '("~/.mailcap" - "/etc/mailcap:/usr/etc/mailcap" - "/usr/local/etc/mailcap") ":")))) - (let ((fnames (reverse - (split-string - path (if (memq system-type - '(ms-dos ms-windows windows-nt)) - ";" - ":")))) - fname) - (while fnames - (setq fname (car fnames)) - (if (and (file-exists-p fname) (file-readable-p fname)) - (mailcap-parse-mailcap (car fnames))) - (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 "\n+" "\n") ; And blank lines - (mailcap-replace-regexp "\\\\[ \t\n]+" " ") ; And collapse spaces - (mailcap-replace-regexp (concat (regexp-quote "\\") "[ \t]*\n") "") - (goto-char (point-max)) - (skip-chars-backward " \t\n") - (delete-region (point) (point-max)) - (goto-char (point-min)) - (while (not (eobp)) - (skip-chars-forward " \t\n") - (setq save-pos (point) - info nil) - (skip-chars-forward "^/;") - (downcase-region save-pos (point)) - (setq major (buffer-substring save-pos (point))) - (skip-chars-forward "/ \t\n") - (setq save-pos (point)) - (skip-chars-forward "^;") - (downcase-region save-pos (point)) - (setq minor - (cond - ((= ?* (or (char-after save-pos) 0)) ".*") - ((= (point) save-pos) ".*") - (t (buffer-substring save-pos (point))))) - (skip-chars-forward "; \t\n") - ;;; Got the major/minor chunks, now for the viewers/etc - ;;; The first item _must_ be a viewer, according to the - ;;; RFC for mailcap files (#1343) - (skip-chars-forward "; \t\n") - (setq save-pos (point)) - (skip-chars-forward "^;\n") - (if (= (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) - (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))))) - -(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) - (skip-chars-forward " \";\n\t") - (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 (/= (or (char-after (point)) 0) ?=) ; There is no value - (setq value nil) - (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 (= (or (char-after (1- (point))) 0) ?\\ ) - (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))) - results))) - -(defun mailcap-mailcap-entry-passes-test (info) - ;; Return t iff a mailcap entry passes its test clause or no test - ;; clause is present. - (let (status ; Call-process-regions return value - (test (assq 'test info)) ; The test clause - ) - (setq status (and test (split-string (cdr test) " "))) - (if (and (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))) - ((string-match (car (car major)) minor) - (setq wildcard (cons (cdr (car major)) wildcard)))) - (setq major (cdr major))) - (nconc (nreverse exact) (nreverse 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))) - (cond - ((null save-chr) nil) - ((= save-chr ?t) - (delete-region save-pos (progn (forward-char 1) (point))) - (insert (or (cdr (assq 'type type-info)) "\"\""))) - ((= save-chr ?M) - (delete-region save-pos (progn (forward-char 1) (point))) - (insert "\"\"")) - ((= save-chr ?n) - (delete-region save-pos (progn (forward-char 1) (point))) - (insert "\"\"")) - ((= save-chr ?F) - (delete-region save-pos (progn (forward-char 1) (point))) - (insert "\"\"")) - ((= save-chr ?{) - (forward-char 1) - (skip-chars-forward "^}") - (downcase-region (+ 2 save-pos) (point)) - (setq subst (buffer-substring (+ 2 save-pos) (point))) - (delete-region save-pos (1+ (point))) - (insert (or (cdr (assoc subst type-info)) "\"\""))) - (t nil)))) - (buffer-string))) - (t (error "Bad value to mailcap-unescape-mime-test. %s" test))))) - -(defvar mailcap-viewer-test-cache nil) - -(defun mailcap-viewer-passes-test (viewer-info type-info) - ;; Return non-nil iff the viewer specified by VIEWER-INFO passes its - ;; test clause (if any). - (let* ((test-info (assq 'test viewer-info)) - (test (cdr test-info)) - (otest test) - (viewer (cdr (assoc 'viewer viewer-info))) - (default-directory (expand-file-name "~/")) - status parsed-test cache result) - (if (setq cache (assoc test mailcap-viewer-test-cache)) - (cadr cache) - (setq - result - (cond - ((not test-info) t) ; No test clause - ((not test) nil) ; Already failed test - ((eq test t) t) ; Already passed test - ((and (symbolp test) ; Lisp function as test - (fboundp test)) - (funcall test type-info)) - ((and (symbolp test) ; Lisp variable as test - (boundp test)) - (symbol-value test)) - ((and (listp test) ; List to be eval'd - (symbolp (car test))) - (eval test)) - (t - (setq test (mailcap-unescape-mime-test test type-info) - test (list shell-file-name nil nil nil - shell-command-switch test) - status (apply 'call-process test)) - (= 0 status)))) - (push (list otest result) mailcap-viewer-test-cache) - result))) - -(defun mailcap-add-mailcap-entry (major minor info) - (let ((old-major (assoc major mailcap-mime-data))) - (if (null old-major) ; New major area - (setq mailcap-mime-data - (cons (cons major (list (cons minor info))) - mailcap-mime-data)) - (let ((cur-minor (assoc minor old-major))) - (cond - ((or (null cur-minor) ; New minor area, or - (assq 'test info)) ; Has a test, insert at beginning - (setcdr old-major (cons (cons minor info) (cdr old-major)))) - ((and (not (assq 'test info)) ; No test info, replace completely - (not (assq 'test cur-minor))) - (setcdr cur-minor info)) - (t - (setcdr old-major (cons (cons minor info) (cdr old-major))))))))) - -;;; -;;; The main whabbo -;;; - -(defun mailcap-viewer-lessp (x y) - ;; Return t iff viewer X is more desirable than viewer Y - (let ((x-wild (string-match "[*?]" (or (cdr-safe (assq 'type x)) ""))) - (y-wild (string-match "[*?]" (or (cdr-safe (assq 'type y)) ""))) - (x-lisp (not (stringp (or (cdr-safe (assq 'viewer x)) "")))) - (y-lisp (not (stringp (or (cdr-safe (assq 'viewer y)) ""))))) - (cond - ((and x-lisp (not y-lisp)) - t) - ((and (not y-lisp) x-wild (not y-wild)) - t) - ((and (not x-wild) y-wild) - t) - (t nil)))) - -(defun mailcap-mime-info (string &optional request) - "Get the MIME viewer command for STRING, return nil if none found. -Expects a complete content-type header line as its argument. - -Second argument REQUEST specifies what information to return. If it is -nil or the empty string, the viewer (second field of the mailcap -entry) will be returned. If it is a string, then the mailcap field -corresponding to that string will be returned (print, description, -whatever). If a number, then all the information for this specific -viewer is returned. If `all', then all possible viewers for -this type is returned." - (let ( - major ; Major encoding (text, etc) - minor ; Minor encoding (html, etc) - info ; Other info - save-pos ; Misc. position during parse - major-info ; (assoc major mailcap-mime-data) - minor-info ; (assoc minor major-info) - test ; current test proc. - viewers ; Possible viewers - passed ; Viewers that passed the test - viewer ; The one and only viewer - ctl) - (save-excursion - (setq ctl (mail-header-parse-content-type (or string "text/plain"))) - (setq major (split-string (car ctl) "/")) - (setq minor (cadr major) - major (car major)) - (when (setq major-info (cdr (assoc major mailcap-mime-data))) - (when (setq viewers (mailcap-possible-viewers major-info minor)) - (setq info (mapcar (lambda (a) (cons (symbol-name (car a)) - (cdr a))) - (cdr ctl))) - (while viewers - (if (mailcap-viewer-passes-test (car viewers) info) - (setq passed (cons (car viewers) passed))) - (setq viewers (cdr viewers))) - (setq passed (sort passed 'mailcap-viewer-lessp)) - (setq viewer (car passed)))) - (when (and (stringp (cdr (assq 'viewer viewer))) - passed) - (setq viewer (car passed))) - (cond - ((and (null viewer) (not (equal major "default")) request) - (mailcap-mime-info "default" request)) - ((or (null request) (equal request "")) - (mailcap-unescape-mime-test (cdr (assq 'viewer viewer)) info)) - ((stringp request) - (if (or (eq request 'test) (eq request 'viewer)) - (mailcap-unescape-mime-test - (cdr-safe (assoc request viewer)) info))) - ((eq request 'all) - passed) - (t - ;; MUST make a copy *sigh*, else we modify mailcap-mime-data - (setq viewer (copy-tree viewer)) - (let ((view (assq 'viewer viewer)) - (test (assq 'test viewer))) - (if view (setcdr view (mailcap-unescape-mime-test (cdr view) info))) - (if test (setcdr test (mailcap-unescape-mime-test (cdr test) info)))) - viewer))))) - -;;; -;;; Experimental MIME-types parsing -;;; - -(defvar mailcap-mime-extensions - '(("" . "text/plain") - (".abs" . "audio/x-mpeg") - (".aif" . "audio/aiff") - (".aifc" . "audio/aiff") - (".aiff" . "audio/aiff") - (".ano" . "application/x-annotator") - (".au" . "audio/ulaw") - (".avi" . "video/x-msvideo") - (".bcpio" . "application/x-bcpio") - (".bin" . "application/octet-stream") - (".cdf" . "application/x-netcdr") - (".cpio" . "application/x-cpio") - (".csh" . "application/x-csh") - (".dvi" . "application/x-dvi") - (".el" . "application/emacs-lisp") - (".eps" . "application/postscript") - (".etx" . "text/x-setext") - (".exe" . "application/octet-stream") - (".fax" . "image/x-fax") - (".gif" . "image/gif") - (".hdf" . "application/x-hdf") - (".hqx" . "application/mac-binhex40") - (".htm" . "text/html") - (".html" . "text/html") - (".icon" . "image/x-icon") - (".ief" . "image/ief") - (".jpg" . "image/jpeg") - (".macp" . "image/x-macpaint") - (".man" . "application/x-troff-man") - (".me" . "application/x-troff-me") - (".mif" . "application/mif") - (".mov" . "video/quicktime") - (".movie" . "video/x-sgi-movie") - (".mp2" . "audio/x-mpeg") - (".mp3" . "audio/x-mpeg") - (".mp2a" . "audio/x-mpeg2") - (".mpa" . "audio/x-mpeg") - (".mpa2" . "audio/x-mpeg2") - (".mpe" . "video/mpeg") - (".mpeg" . "video/mpeg") - (".mpega" . "audio/x-mpeg") - (".mpegv" . "video/mpeg") - (".mpg" . "video/mpeg") - (".mpv" . "video/mpeg") - (".ms" . "application/x-troff-ms") - (".nc" . "application/x-netcdf") - (".nc" . "application/x-netcdf") - (".oda" . "application/oda") - (".pbm" . "image/x-portable-bitmap") - (".pdf" . "application/pdf") - (".pgm" . "image/portable-graymap") - (".pict" . "image/pict") - (".png" . "image/png") - (".pnm" . "image/x-portable-anymap") - (".ppm" . "image/portable-pixmap") - (".ps" . "application/postscript") - (".qt" . "video/quicktime") - (".ras" . "image/x-raster") - (".rgb" . "image/x-rgb") - (".rtf" . "application/rtf") - (".rtx" . "text/richtext") - (".sh" . "application/x-sh") - (".sit" . "application/x-stuffit") - (".snd" . "audio/basic") - (".src" . "application/x-wais-source") - (".tar" . "archive/tar") - (".tcl" . "application/x-tcl") - (".tcl" . "application/x-tcl") - (".tex" . "application/x-tex") - (".texi" . "application/texinfo") - (".tga" . "image/x-targa") - (".tif" . "image/tiff") - (".tiff" . "image/tiff") - (".tr" . "application/x-troff") - (".troff" . "application/x-troff") - (".tsv" . "text/tab-separated-values") - (".txt" . "text/plain") - (".vbs" . "video/mpeg") - (".vox" . "audio/basic") - (".vrml" . "x-world/x-vrml") - (".wav" . "audio/x-wav") - (".wrl" . "x-world/x-vrml") - (".xbm" . "image/xbm") - (".xpm" . "image/x-pixmap") - (".xwd" . "image/windowdump") - (".zip" . "application/zip") - (".ai" . "application/postscript") - (".jpe" . "image/jpeg") - (".jpeg" . "image/jpeg")) - "*An assoc list of file extensions and the MIME content-types they -correspond to.") - -(defun mailcap-parse-mimetypes (&optional path) - ;; Parse out all the mimetypes specified in a unix-style path string PATH - (cond - (path nil) - ((getenv "MIMETYPES") (setq path (getenv "MIMETYPES"))) - ((memq system-type '(ms-dos ms-windows windows-nt)) - (setq path (mapconcat 'expand-file-name - '("~/mime.typ" "~/etc/mime.typ") ";"))) - (t (setq path (mapconcat 'expand-file-name - '("~/.mime-types" - "/etc/mime-types:/usr/etc/mime-types" - "/usr/local/etc/mime-types" - "/usr/local/www/conf/mime-types") ":")))) - (let ((fnames (reverse - (split-string path - (if (memq system-type - '(ms-dos ms-windows windows-nt)) - ";" ":")))) - fname) - (while fnames - (setq fname (car fnames)) - (if (and (file-exists-p fname) (file-readable-p fname)) - (mailcap-parse-mimetype-file (car fnames))) - (setq fnames (cdr fnames))))) - -(defun mailcap-parse-mimetype-file (fname) - ;; Parse out a mime-types file - (let (type ; The MIME type for this line - extns ; The extensions for this line - save-pos ; Misc. saved buffer positions - ) - (with-temp-buffer - (insert-file-contents fname) - (mailcap-replace-regexp "#.*" "") - (mailcap-replace-regexp "\n+" "\n") - (mailcap-replace-regexp "[ \t]+$" "") - (goto-char (point-max)) - (skip-chars-backward " \t\n") - (delete-region (point) (point-max)) - (goto-char (point-min)) - (while (not (eobp)) - (skip-chars-forward " \t\n") - (setq save-pos (point)) - (skip-chars-forward "^ \t") - (downcase-region save-pos (point)) - (setq type (buffer-substring save-pos (point))) - (while (not (eolp)) - (skip-chars-forward " \t") - (setq save-pos (point)) - (skip-chars-forward "^ \t\n") - (setq extns (cons (buffer-substring save-pos (point)) extns))) - (while extns - (setq mailcap-mime-extensions - (cons - (cons (if (= (string-to-char (car extns)) ?.) - (car extns) - (concat "." (car extns))) type) - mailcap-mime-extensions) - extns (cdr extns))))))) - -(defun mailcap-extension-to-mime (extn) - "Return the MIME content type of the file extensions EXTN." - (if (and (stringp extn) - (not (eq (string-to-char extn) ?.))) - (setq extn (concat "." extn))) - (cdr (assoc (downcase extn) mailcap-mime-extensions))) - -(defvar mailcap-binary-suffixes - (if (memq system-type '(ms-dos windows-nt)) - '(".exe" ".com" ".bat" ".cmd" ".btm" "") - '(""))) - -(defun mailcap-command-p (command) - "Say whether COMMAND is in the exec path. -The path of COMMAND will be returned iff COMMAND is a command." - (let ((path (if (file-name-absolute-p command) '(nil) exec-path)) - file dir) - (catch 'found - (while (setq dir (pop path)) - (let ((suffixes mailcap-binary-suffixes)) - (while suffixes - (when (and (file-executable-p - (setq file (expand-file-name - (concat command (pop suffixes)) - dir))) - (not (file-directory-p file))) - (throw 'found file)))))))) - -(provide 'mailcap) - -;;; mailcap.el ends here diff --git a/lisp/message.el b/lisp/message.el index f761af0..cd6ca1d 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -3,6 +3,7 @@ ;; Author: Lars Magne Ingebrigtsen ;; MORIOKA Tomohiko +;; Keiichi Suzuki ;; Keywords: mail, news, MIME ;; This file is part of GNU Emacs. @@ -103,6 +104,10 @@ :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 @@ -220,7 +225,7 @@ included. Organization, Lines and X-Mailer are optional." :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:" +(defcustom message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|^X-Trace:\\|^X-Complaints-To:\\|Return-Path:\\|^Supersedes:\\|^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." @@ -291,7 +296,7 @@ If t, use `message-user-organization-file'." :type 'string) (defcustom message-forward-end-separator - "" + (concat (mime-make-tag "text" "plain") "\n") "*Delimiter inserted after forwarded messages." :group 'message-forwarding :type 'string) @@ -302,11 +307,32 @@ If t, use `message-user-organization-file'." :type 'boolean) (defcustom message-included-forward-headers - "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^Followup-To:\\|^Reply-To:\\|^Organization:\\|^Summary:\\|^Keywords:\\|^To:\\|^Cc:\\|^Posted-To:\\|^Mail-Copies-To:\\|^Apparently-To:\\|^Gnus-Warning:\\|^Resent-\\|^Message-ID:\\|^References:\\|^Content-Transfer-Encoding:\\|^Content-Type:\\|^Mime-Version:" + "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^Followup-To:\\|^Reply-To:\\|^Organization:\\|^Summary:\\|^Keywords:\\|^To:\\|^Cc:\\|^Posted-To:\\|^Mail-Copies-To:\\|^Apparently-To:\\|^Gnus-Warning:\\|^Resent-\\|^Message-ID:\\|^References:\\|^Content-Transfer-Encoding:\\|^Content-Type:\\|^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 + "*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: + +* 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))) + +(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" "*All headers that match this regexp will be deleted when resending a message." :group 'message-interface @@ -408,6 +434,7 @@ might set this variable to '(\"-f\" \"you@some.where\")." (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) @@ -476,16 +503,12 @@ Used by `message-yank-original' via `message-yank-cite'." :type 'integer) ;;;###autoload -(defcustom message-cite-function - (if (and (boundp 'mail-citation-hook) - mail-citation-hook) - mail-citation-hook - 'message-cite-original) +(defcustom message-cite-function 'message-cite-original "*Function for citing an original message. -Pre-defined functions include `message-cite-original' and -`message-cite-original-without-signature'." +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 sc-cite-original) (function :tag "Other")) :group 'message-insertion) @@ -553,6 +576,7 @@ If stringp, use this; if non-nil, use no host name (user name only)." "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) (define-widget 'message-header-lines 'text "All header lines must be LFD terminated." @@ -837,6 +861,21 @@ The cdr of ech entry is a function for applying the face to a region.") :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-send-coding-system 'binary + "Coding system to encode outgoing mail.") + ;;; Internal variables. (defvar message-buffer-list nil) @@ -927,7 +966,7 @@ The cdr of ech entry is a function for applying the face to a region.") (Lines) (Expires) (Message-ID) - (References . message-shorten-references) + (References . message-fill-references) (X-Mailer) (X-Newsreader)) "Alist used for formatting headers.") @@ -945,6 +984,7 @@ The cdr of ech entry is a function for applying the face to a region.") (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 'rmail-output "rmail")) @@ -1432,13 +1472,22 @@ C-c C-r message-caesar-buffer-body (rot13 the message body)." (goto-char (point-min)) (search-forward (concat "\n" mail-header-separator "\n") nil t)) +(defun message-goto-eoh () + "Move point to the end of the headers." + (interactive) + (message-goto-body) + (forward-line -2)) + (defun message-goto-signature () - "Move point to the beginning of the message 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)))) + (goto-char (point-max)) + nil)) @@ -1478,16 +1527,17 @@ With the prefix argument FORCE, insert the header anyway." (interactive "r") (save-excursion (goto-char end) - (delete-region (point) (progn (message-goto-signature) - (forward-line -2) - (point))) + (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)))) - (message-goto-signature) - (forward-line -2)) + (when (message-goto-signature) + (forward-line -2))) (defun message-kill-to-signature () "Deletes all text up to the signature." @@ -1711,6 +1761,7 @@ However, if `message-yank-prefix' is non-nil, insert that prefix on each line." (forward-line 1)))) (goto-char start))) +(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. @@ -1725,6 +1776,8 @@ prefix, and don't delete any headers." (let ((modified (buffer-modified-p))) (when (and message-reply-buffer message-cite-function) + (gnus-copy-article-buffer) + (setq message-reply-buffer gnus-article-copy) (delete-windows-on message-reply-buffer t) (insert-buffer message-reply-buffer) (funcall message-cite-function) @@ -1745,6 +1798,11 @@ prefix, and don't delete any headers." (list message-indent-citation-function))))) (goto-char end) (when (re-search-backward "^-- $" 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)) (goto-char start) (while functions @@ -1754,21 +1812,25 @@ prefix, and don't delete any headers." (insert "\n")) (funcall message-citation-line-function)))) +(defvar mail-citation-hook) ;Compiler directive (defun message-cite-original () "Cite function in the standard Message manner." - (let ((start (point)) - (functions - (when message-indent-citation-function - (if (listp message-indent-citation-function) - message-indent-citation-function - (list message-indent-citation-function))))) - (goto-char start) - (while functions - (funcall (pop functions))) - (when message-citation-line-function - (unless (bolp) - (insert "\n")) - (funcall message-citation-line-function)))) + (if (and (boundp 'mail-citation-hook) + mail-citation-hook) + (run-hooks 'mail-citation-hook) + (let ((start (point)) + (functions + (when message-indent-citation-function + (if (listp message-indent-citation-function) + message-indent-citation-function + (list message-indent-citation-function))))) + (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 () "Function that inserts a simple citation line." @@ -1831,11 +1893,18 @@ The text will also be indented the normal way." ;;; 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)) + (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 @@ -1843,7 +1912,9 @@ The text will also be indented the normal way." (bury-buffer buf) (when (eq buf (current-buffer)) (message-bury buf))) - (message-do-actions actions)))) + (message-do-actions actions) + (message-delete-frame frame org-frame) + t))) (defun message-dont-send () "Don't send the message you have been editing." @@ -1859,10 +1930,32 @@ The text will also be indented the normal way." (interactive) (when (or (not (buffer-modified-p)) (yes-or-no-p "Message modified; kill anyway? ")) - (let ((actions message-kill-actions)) + (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-do-actions actions) + (message-delete-frame frame org-frame)))) + +(defun message-delete-frame (frame org-frame) + "Delete frame for editing message." + (when (and (or (and (featurep 'xemacs) + (not (eq 'tty (device-type)))) + 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." @@ -1889,7 +1982,6 @@ the user from the mailer." (undo-boundary) (let ((inhibit-read-only t)) (put-text-property (point-min) (point-max) 'read-only nil)) - (message-fix-before-sending) (run-hooks 'message-send-hook) (message "Sending...") (let ((message-encoding-buffer @@ -1904,6 +1996,7 @@ the user from the mailer." (erase-buffer) (insert-buffer message-edit-buffer) (funcall message-encode-function) + (message-fix-before-sending) (while (and success (setq elem (pop alist))) (when (and (or (not (funcall (cadr elem))) @@ -1944,7 +2037,13 @@ the user from the mailer." ;; Make sure there's a newline at the end of the message. (goto-char (point-max)) (unless (bolp) - (insert "\n"))) + (insert "\n")) + ;; Make all invisible text visible. + ;;(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"))) + ) (defun message-add-action (action &rest types) "Add ACTION to be performed when doing an exit of type TYPES." @@ -2037,7 +2136,7 @@ the user from the mailer." (set-buffer errbuf) (erase-buffer)))) (let ((default-directory "/") - (coding-system-for-write 'binary)) + (coding-system-for-write message-send-coding-system)) (apply 'call-process-region (append (list (point-min) (point-max) (if (boundp 'sendmail-program) @@ -2085,7 +2184,7 @@ to find out how to use this." (run-hooks 'message-send-mail-hook) ;; send the message (case - (let ((coding-system-for-write 'binary)) + (let ((coding-system-for-write message-send-coding-system)) (apply 'call-process-region 1 (point-max) message-qmail-inject-program nil nil nil @@ -3023,7 +3122,13 @@ Headers already prepared in the buffer are not modified." (setq header (car elem))) (setq header elem)) (when (or (not (re-search-forward - (concat "^" (downcase (symbol-name header)) ":") + (concat "^" + (regexp-quote + (downcase + (if (stringp header) + header + (symbol-name header)))) + ":") nil t)) (progn ;; The header was found. We insert a space after the @@ -3065,7 +3170,8 @@ Headers already prepared in the buffer are not modified." (progn ;; This header didn't exist, so we insert it. (goto-char (point-max)) - (insert (symbol-name header) ": " value "\n") + (insert (if (stringp header) header (symbol-name header)) + ": " value "\n") (forward-line -1)) ;; The value of this header was empty, so we clear ;; totally and insert the new value. @@ -3243,7 +3349,24 @@ Headers already prepared in the buffer are not modified." (defun message-pop-to-buffer (name) "Pop to buffer NAME, and warn if it already exists and is modified." - (let ((buffer (get-buffer name))) + (let ((pop-up-frames pop-up-frames) + (special-display-buffer-names special-display-buffer-names) + (special-display-regexps special-display-regexps) + (same-window-buffer-names same-window-buffer-names) + (same-window-regexps same-window-regexps) + (buffer (get-buffer name)) + (cur (current-buffer))) + (if (or (and (featurep 'xemacs) + (not (eq 'tty (device-type)))) + window-system + (>= emacs-major-version 20)) + (when message-use-multi-frames + (setq pop-up-frames t + special-display-buffer-names nil + special-display-regexps nil + same-window-buffer-names nil + same-window-regexps nil)) + (setq pop-up-frames nil)) (if (and buffer (buffer-name buffer)) (progn @@ -3252,9 +3375,12 @@ Headers already prepared in the buffer are not modified." (not (y-or-n-p "Message already being composed; erase? "))) (error "Message being composed"))) - (set-buffer (pop-to-buffer name)))) - (erase-buffer) - (message-mode)) + (set-buffer (pop-to-buffer name))) + (erase-buffer) + (message-mode) + (when pop-up-frames + (make-local-variable 'message-original-frame) + (setq message-original-frame (selected-frame))))) (defun message-do-send-housekeeping () "Kill old message buffers." @@ -3368,7 +3494,8 @@ Headers already prepared in the buffer are not modified." (defun message-mail (&optional to subject other-headers continue switch-function yank-action send-actions) - "Start editing a mail message to be sent." + "Start editing a mail message to be sent. +OTHER-HEADERS is an alist of header/value pairs." (interactive) (let ((message-this-is-mail t)) (message-pop-to-buffer (message-buffer-name "mail" to)) @@ -3665,13 +3792,18 @@ responses here are directed to other newsgroups.")) 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))) + (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 (string-equal - (downcase (or (message-fetch-field "sender") - (cadr (mail-extract-address-components - (message-fetch-field "from"))))) - (downcase (message-make-sender))) + (unless (or (and sender + (string-equal + (downcase sender) + (downcase (message-make-sender)))) + (string-equal + (downcase (cadr (mail-extract-address-components from))) + (downcase (cadr (mail-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")) @@ -3707,19 +3839,81 @@ header line with the old Message-ID." (insert-file-contents file-name nil))) (t (error "message-recover cancelled"))))) +;;; Washing Subject: + +(defun message-wash-subject (subject) + "Remove junk like \"Re:\", \"(fwd)\", etc. that was added to the subject by previous forwarders, replyers, etc." + (nnheader-temp-write nil + (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. +(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 "[" + (or (message-fetch-field + (if (message-news-p) "newsgroups" "from")) + "(nowhere)") + "] " 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 (current-buffer) (message-narrow-to-head) - (concat "[" (or (message-fetch-field - (if (message-news-p) "newsgroups" "from")) - "(nowhere)") - "] " (or (eword-decode-unstructured-field-body - (message-fetch-field "Subject") "")))))) + (let ((funcs message-make-forward-subject-function) + (subject (if message-wash-forwarded-subjects + (message-wash-subject + (or (eword-decode-unstructured-field-body + (message-fetch-field "Subject")) "")) + (or (eword-decode-unstructured-field-body + (message-fetch-field "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) @@ -3822,7 +4016,7 @@ you." (insert-buffer-substring cur) (undo-boundary) (message-narrow-to-head) - (if (and (message-fetch-field "Mime-Version") + (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" @@ -3980,7 +4174,6 @@ Do a `tab-to-tab-stop' if not in those headers." (point)))) (hashtb (and (boundp 'gnus-active-hashtb) gnus-active-hashtb)) (completions (all-completions string hashtb)) - (cur (current-buffer)) comp) (delete-region b (point)) (cond @@ -4050,7 +4243,7 @@ regexp varstr." (let ((locals (save-excursion (set-buffer buffer) (buffer-local-variables))) - (regexp "^gnus\\|^nn\\|^message")) + (regexp "^\\(gnus\\|nn\\|message\\|user-\\(mail-address\\|full-name\\)\\)")) (mapcar (lambda (local) (when (and (consp local) diff --git a/lisp/messcompat.el b/lisp/messcompat.el index 337ab6f..153f76d 100644 --- a/lisp/messcompat.el +++ b/lisp/messcompat.el @@ -82,6 +82,11 @@ 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-decode.el b/lisp/mm-decode.el deleted file mode 100644 index e1d50ed..0000000 --- a/lisp/mm-decode.el +++ /dev/null @@ -1,134 +0,0 @@ -;;; mm-decode.el --- Function for decoding MIME things -;; Copyright (C) 1998 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; 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: - -;;; Code: - -(require 'base64) -(require 'qp) -(require 'nnheader) - -(defvar mm-charset-regexp (concat "[^" "][\000-\040()<>@,\;:\\\"/?.=" "]+")) - -(defvar mm-encoded-word-regexp - (concat "=\\?\\(" mm-charset-regexp "\\)\\?\\(B\\|Q\\)\\?" - "\\([!->@-~]+\\)\\?=")) - -(defun mm-decode-words-region (start end) - "Decode MIME-encoded words in region between START and END." - (interactive "r") - (save-excursion - (save-restriction - (narrow-to-region start end) - (goto-char (point-min)) - ;; Remove whitespace between encoded words. - (while (re-search-forward - (concat "\\(" mm-encoded-word-regexp "\\)" - "\\(\n?[ \t]\\)+" - "\\(" mm-encoded-word-regexp "\\)") - nil t) - (delete-region (goto-char (match-end 1)) (match-beginning 6))) - ;; Decode the encoded words. - (goto-char (point-min)) - (while (re-search-forward mm-encoded-word-regexp nil t) - (insert (mm-decode-word - (prog1 - (match-string 0) - (delete-region (match-beginning 0) (match-end 0))))))))) - -(defun mm-decode-words-string (string) - "Decode the quoted-printable-encoded STRING and return the results." - (with-temp-buffer - (insert string) - (inline - (mm-decode-words-region (point-min) (point-max))) - (buffer-string))) - -(defun mm-decode-word (word) - "Decode WORD and return it if it is an encoded word. -Return WORD if not." - (if (not (string-match mm-encoded-word-regexp word)) - word - (or - (condition-case nil - (mm-decode-text - (match-string 1 word) - (upcase (match-string 2 word)) - (match-string 3 word)) - (error word)) - word))) - -(eval-and-compile - (if (fboundp 'decode-coding-string) - (fset 'mm-decode-coding-string 'decode-coding-string) - (fset 'mm-decode-coding-string (lambda (s a) s)))) - -(defun mm-decode-text (charset encoding string) - "Decode STRING as an encoded text. -Valid ENCODINGs are \"B\" and \"Q\". -If your Emacs implementation can't decode CHARSET, it returns nil." - (let ((cs (mm-charset-to-coding-system charset))) - (when cs - (mm-decode-coding-string - (cond - ((equal "B" encoding) - (base64-decode string)) - ((equal "Q" encoding) - (quoted-printable-decode-string - (nnheader-replace-chars-in-string string ?_ ? ))) - (t (error "Invalid encoding: %s" encoding))) - cs)))) - -(defvar mm-charset-coding-system-alist - (let ((rest - '((us-ascii . iso-8859-1) - (gb2312 . cn-gb-2312) - (iso-2022-jp-2 . iso-2022-7bit-ss2) - (x-ctext . ctext))) - (systems (coding-system-list)) - dest) - (while rest - (let ((pair (car rest))) - (unless (memq (car pair) systems) - (setq dest (cons pair dest)))) - (setq rest (cdr rest))) - dest) - "Charset/coding system alist.") - -(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-coding-system-alist)) - charset)) - (when lbt - (setq charset (intern (format "%s-%s" charset lbt)))) - (when (memq charset (coding-system-list)) - charset)) - -(provide 'mm-decode) - -;; qp.el ends here diff --git a/lisp/mm-encode.el b/lisp/mm-encode.el deleted file mode 100644 index 875d12f..0000000 --- a/lisp/mm-encode.el +++ /dev/null @@ -1,202 +0,0 @@ -;;; mm-encode.el --- Functions for encoding MIME things -;; Copyright (C) 1998 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; 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: - -;;; Code: - -(defvar mm-header-encoding-alist - '(("X-Nsubject" . iso-2022-jp-2) - ("Newsgroups" . nil) - ("Message-ID" . nil) - (t . mime)) - "*Header/encoding method alist. -The list is traversed sequentially. The keys can either be a -header regexp 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 RFC1522; -3) a charset, in which case it will be encoded as that charse; -4) `default', in which case the field will be encoded as the rest - of the article.") - -(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) - (koi8-r cyrillic-iso8859-5) - (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-2022-jp latin-jisx0201 - japanese-jisx0208-1978 japanese-jisx0208) - (euc-kr korean-ksc5601) - (cn-gb-2312 chinese-gb2312) - (cn-big5 chinese-big5-1 chinese-big5-2) - (iso-2022-jp-2 latin-iso8859-1 greek-iso8859-7 - latin-jisx0201 japanese-jisx0208-1978 - chinese-gb2312 japanese-jisx0208 - korean-ksc5601 japanese-jisx0212) - (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)) - "Alist of MIME-charset/MULE-charsets.") - -(defvar mm-mime-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 . Q) - (koi8-r . Q) - (iso-8859-7 . Q) - (iso-8859-8 . Q) - (iso-8859-9 . Q) - (iso-2022-jp . B) - (iso-2022-kr . B) - (gb2312 . 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 MIME encodings. -Valid encodings are nil, `Q' and `B'.") - -(defvar mm-mime-encoding-function-alist - '((Q . quoted-printable-encode-region) - (B . base64-encode-region) - (nil . ignore)) - "Alist of MIME encodings to encoding functions.") - -(defun mm-encode-message-header () - "Encode the message header according to `mm-header-encoding-alist'." - (when (featurep 'mule) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (let ((alist mm-header-encoding-alist) - elem method) - (while (not (eobp)) - (save-restriction - (message-narrow-to-field) - (when (find-non-ascii-charset-region (point-min) (point-max)) - ;; We found something that may perhaps be encoded. - (while (setq elem (pop alist)) - (when (or (and (stringp (car elem)) - (looking-at (car elem))) - (eq (car elem) t)) - (setq alist nil - method (cdr elem)))) - (when method - (cond - ((eq method 'mime) - (mm-encode-words-region (point-min) (point-max))) - ;; Hm. - (t)))) - (goto-char (point-max))))))))) - -(defun mm-encode-words-region (b e) - "Encode all encodable words in REGION." - (let (prev c start qstart qprev qend) - (save-excursion - (goto-char b) - (while (re-search-forward "[^ \t\n]+" nil t) - (save-restriction - (narrow-to-region (match-beginning 0) (match-end 0)) - (goto-char (setq start (point-min))) - (setq prev nil) - (while (not (eobp)) - (unless (eq (setq c (char-charset (following-char))) 'ascii) - (cond - ((eq c prev) - ) - ((null prev) - (setq qstart (or qstart start) - qend (point-max) - qprev c) - (setq prev c)) - (t - ;(mm-encode-word-region start (setq start (point)) prev) - (setq prev c) - ))) - (forward-char 1))) - (when (and (not prev) qstart) - (mm-encode-word-region qstart qend qprev) - (setq qstart nil))) - (when qstart - (mm-encode-word-region qstart qend qprev) - (setq qstart nil))))) - -(defun mm-encode-words-string (string) - "Encode words in STRING." - (with-temp-buffer - (insert string) - (mm-encode-words-region (point-min) (point-max)) - (buffer-string))) - -(defun mm-mule-charset-to-mime-charset (charset) - "Return the MIME charset corresponding to 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-encode-word-region (b e charset) - "Encode the word in the region with CHARSET." - (let* ((mime-charset (mm-mule-charset-to-mime-charset charset)) - (encoding (cdr (assq mime-charset mm-mime-charset-encoding-alist)))) - (save-restriction - (narrow-to-region b e) - (funcall (cdr (assq encoding mm-mime-encoding-function-alist)) - b e) - (goto-char (point-min)) - (insert "=?" (upcase (symbol-name mime-charset)) "?" - (symbol-name encoding) "?") - (goto-char (point-max)) - (insert "?=")))) - -(provide 'mm-encode) - -;;; mm-encode.el ends here diff --git a/lisp/mm-util.el b/lisp/mm-util.el deleted file mode 100644 index 67018f4..0000000 --- a/lisp/mm-util.el +++ /dev/null @@ -1,144 +0,0 @@ -;;; mm-util.el --- Utility functions for MIME things -;; Copyright (C) 1998 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 - (if (fboundp 'decode-coding-string) - (fset 'mm-decode-coding-string 'decode-coding-string) - (fset 'mm-decode-coding-string (lambda (s a) s)))) - -(eval-and-compile - (if (fboundp 'encode-coding-string) - (fset 'mm-encode-coding-string 'encode-coding-string) - (fset 'mm-encode-coding-string (lambda (s a) s)))) - -(eval-and-compile - (if (fboundp 'coding-system-list) - (fset 'mm-coding-system-list 'coding-system-list) - (fset 'mm-coding-system-list 'ignore))) - -(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) - (koi8-r cyrillic-iso8859-5) - (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-2022-jp latin-jisx0201 - japanese-jisx0208-1978 japanese-jisx0208) - (euc-kr korean-ksc5601) - (cn-gb-2312 chinese-gb2312) - (cn-big5 chinese-big5-1 chinese-big5-2) - (iso-2022-jp-2 latin-iso8859-1 greek-iso8859-7 - latin-jisx0201 japanese-jisx0208-1978 - chinese-gb2312 japanese-jisx0208 - korean-ksc5601 japanese-jisx0212) - (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)) - "Alist of MIME-charset/MULE-charsets.") - -(defvar mm-charset-coding-system-alist - (let ((rest - '((us-ascii . iso-8859-1) - (gb2312 . cn-gb-2312) - (iso-2022-jp-2 . iso-2022-7bit-ss2) - (x-ctext . ctext))) - (systems (mm-coding-system-list)) - dest) - (while rest - (let ((pair (car rest))) - (unless (memq (car pair) systems) - (setq dest (cons pair dest)))) - (setq rest (cdr rest))) - dest) - "Charset/coding system alist.") - -(defun mm-mule-charset-to-mime-charset (charset) - "Return the MIME charset corresponding to 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-coding-system-alist)) - charset)) - (when lbt - (setq charset (intern (format "%s-%s" charset lbt)))) - (cond - ;; Running in a non-MULE environment. - ((and (null (mm-coding-system-list)) - (eq charset 'iso-8859-1)) - charset) - ;; Check to see whether we can handle this charset. - ((memq charset (mm-coding-system-list)) - charset) - ;; Nope. - (t - nil))) - -(defun mm-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)) - -(provide 'mm-util) - -;;; mm-util.el ends here diff --git a/lisp/mm-view.el b/lisp/mm-view.el deleted file mode 100644 index b9756e9..0000000 --- a/lisp/mm-view.el +++ /dev/null @@ -1,104 +0,0 @@ -;;; mm-view.el --- Functions for viewing MIME objects -;; Copyright (C) 1998 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 'mail-parse) -(require 'mailcap) -(require 'mm-bodies) - -;;; -;;; Functions for displaying various formats inline -;;; - -(defun mm-inline-image (handle) - (let ((type (cadr (split-string (car (mm-handle-type handle)) "/"))) - buffer-read-only image) - (mm-with-unibyte-buffer - (insert-buffer-substring (mm-handle-buffer handle)) - (mm-decode-content-transfer-encoding (mm-handle-encoding handle)) - (setq image (make-image-specifier - (vector (intern type) :data (buffer-string))))) - (let ((annot (make-annotation image nil 'text))) - (set-extent-property annot 'mm t) - (set-extent-property annot 'duplicable t) - (mm-handle-set-undisplayer handle annot)) - (insert " "))) - -(defun mm-inline-text (handle) - (let ((type (cadr (split-string (car (mm-handle-type handle)) "/"))) - text buffer-read-only) - (cond - ((equal type "plain") - (with-temp-buffer - (insert-buffer-substring (mm-handle-buffer handle)) - (mm-decode-content-transfer-encoding (mm-handle-encoding handle)) - (setq text (buffer-string))) - (let ((b (point))) - (insert text) - (save-restriction - (narrow-to-region b (point)) - (let ((charset (mail-content-type-get - (mm-handle-type handle) 'charset))) - (when charset - (mm-decode-body charset nil))) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (delete-region - ,(set-marker (make-marker) (point-min)) - ,(set-marker (make-marker) (point-max))))))))) - ((equal type "html") - (save-excursion - (w3-do-setup) - (mm-with-unibyte-buffer - (insert-buffer-substring (mm-handle-buffer handle)) - (mm-decode-content-transfer-encoding (mm-handle-encoding handle)) - (require 'url) - (save-window-excursion - (w3-region (point-min) (point-max)) - (setq text (buffer-string)))) - (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) - (w3-prepare-buffer)) - -(provide 'mm-view) - -;; mm-view.el ends here diff --git a/lisp/mm.el b/lisp/mm.el deleted file mode 100644 index 1b57cb1..0000000 --- a/lisp/mm.el +++ /dev/null @@ -1,1283 +0,0 @@ -;;; mm.el,v --- Mailcap parsing routines, and MIME handling -;; Author: wmperry -;; Created: 1996/05/28 02:46:51 -;; Version: 1.96 -;; Keywords: mail, news, hypermedia - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Copyright (c) 1994, 1995, 1996 by William M. Perry -;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc. -;;; -;;; 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. -;;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Generalized mailcap parsing and access routines -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; -;;; Data structures -;;; --------------- -;;; 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. This is keyed on the lowercase -;;; attribute name (viewer, test, etc). This looks like: -;;; (("viewer" . viewerinfo) -;;; ("test" . testinfo) -;;; ("xxxx" . "string") -;;; ) -;;; -;;; 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'd, with the buffer as an argument. -;;; -;;; testinfo is a list of strings, or nil. If nil, it means the -;;; viewer specified is always valid. If it is a list of strings, -;;; these are used to determine whether a viewer passes the 'test' or -;;; not. -;;; -;;; The main interface to this code is: -;;; -;;; To set everything up: -;;; -;;; (mm-parse-mailcaps [path]) -;;; -;;; Where PATH is a unix-style path specification (: separated list -;;; of strings). If PATH is nil, the environment variable MAILCAPS -;;; will be consulted. If there is no environment variable, then a -;;; default list of paths is used. -;;; -;;; To retrieve the information: -;;; (mm-mime-info st [nd] [request]) -;;; -;;; Where st and nd are positions in a buffer that contain the -;;; content-type header information of a mail/news/whatever message. -;;; st can optionally be a string that contains the content-type -;;; information. -;;; -;;; Third argument REQUEST specifies what information to return. If -;;; it is nil or the empty string, the viewer (second field of the -;;; mailcap entry) will be returned. If it is a string, then the -;;; mailcap field corresponding to that string will be returned -;;; (print, description, whatever). If a number, then all the -;;; information for this specific viewer is returned. -;;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Variables, etc -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(eval-and-compile - (require 'cl) -;LMI was here - ;;(require 'devices) - ) - -(defconst mm-version (let ((x "1.96")) - (if (string-match "Revision: \\([^ \t\n]+\\)" x) - (substring x (match-beginning 1) (match-end 1)) - x)) - "Version # of MM package") - -(defvar mm-parse-args-syntax-table - (copy-syntax-table emacs-lisp-mode-syntax-table) - "A syntax table for parsing sgml attributes.") - -(modify-syntax-entry ?' "\"" mm-parse-args-syntax-table) -(modify-syntax-entry ?` "\"" mm-parse-args-syntax-table) -(modify-syntax-entry ?{ "(" mm-parse-args-syntax-table) -(modify-syntax-entry ?} ")" mm-parse-args-syntax-table) - -(defvar mm-mime-data - '( - ("multipart" . ( - ("alternative". (("viewer" . mm-multipart-viewer) - ("type" . "multipart/alternative"))) - ("mixed" . (("viewer" . mm-multipart-viewer) - ("type" . "multipart/mixed"))) - (".*" . (("viewer" . mm-save-binary-file) - ("type" . "multipart/*"))) - ) - ) - ("application" . ( - ("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" . mm-save-binary-file) - ("type" ."application/octet-stream"))) - ("dvi" . (("viewer" . "open %s") - ("type" . "application/dvi") - ("test" . (eq (device-type) 'ns)))) - ("dvi" . (("viewer" . "xdvi %s") - ("test" . (eq (device-type) 'x)) - ("needsx11") - ("type" . "application/dvi"))) - ("dvi" . (("viewer" . "dvitty %s") - ("test" . (not (getenv "DISPLAY"))) - ("type" . "application/dvi"))) - ("emacs-lisp" . (("viewer" . mm-maybe-eval) - ("type" . "application/emacs-lisp"))) -; ("x-tar" . (("viewer" . tar-mode) -; ("test" . (fboundp 'tar-mode)) -; ("type" . "application/x-tar"))) - ("x-tar" . (("viewer" . mm-save-binary-file) - ("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" . mm-save-binary-file) - ("type" . "application/zip") - ("copiousoutput"))) - ("pdf" . (("viewer" . "acroread %s") - ("type" . "application/pdf"))) - ("postscript" . (("viewer" . "open %s") - ("type" . "application/postscript") - ("test" . (eq (device-type) 'ns)))) - ("postscript" . (("viewer" . "ghostview %s") - ("type" . "application/postscript") - ("test" . (eq (device-type) 'x)) - ("needsx11"))) - ("postscript" . (("viewer" . "ps2ascii %s") - ("type" . "application/postscript") - ("test" . (not (getenv "DISPLAY"))) - ("copiousoutput"))) - )) - ("audio" . ( - ("x-mpeg" . (("viewer" . "maplay %s") - ("type" . "audio/x-mpeg"))) - (".*" . (("viewer" . mm-play-sound-file) - ("test" . (or (featurep 'nas-sound) - (featurep 'native-sound))) - ("type" . "audio/*"))) - (".*" . (("viewer" . "showaudio") - ("type" . "audio/*"))) - )) - ("message" . ( - ("rfc-*822" . (("viewer" . vm-mode) - ("test" . (fboundp 'vm-mode)) - ("type" . "message/rfc-822"))) - ("rfc-*822" . (("viewer" . w3-mode) - ("test" . (fboundp 'w3-mode)) - ("type" . "message/rfc-822"))) - ("rfc-*822" . (("viewer" . view-mode) - ("test" . (fboundp 'view-mode)) - ("type" . "message/rfc-822"))) - ("rfc-*822" . (("viewer" . fundamental-mode) - ("type" . "message/rfc-822"))) - )) - ("image" . ( - ("x-xwd" . (("viewer" . "xwud -in %s") - ("type" . "image/x-xwd") - ("compose" . "xwd -frame > %s") - ("test" . (eq (device-type) 'x)) - ("needsx11"))) - ("x11-dump" . (("viewer" . "xwud -in %s") - ("type" . "image/x-xwd") - ("compose" . "xwd -frame > %s") - ("test" . (eq (device-type) 'x)) - ("needsx11"))) - ("windowdump" . (("viewer" . "xwud -in %s") - ("type" . "image/x-xwd") - ("compose" . "xwd -frame > %s") - ("test" . (eq (device-type) 'x)) - ("needsx11"))) - (".*" . (("viewer" . "open %s") - ("type" . "image/*") - ("test" . (eq (device-type) 'ns)))) - (".*" . (("viewer" . "xv -perfect %s") - ("type" . "image/*") - ("test" . (eq (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-region)) - ("type" . "text/enriched"))) - ("html" . (("viewer" . w3-prepare-buffer) - ("test" . (fboundp 'w3-prepare-buffer)) - ("type" . "text/html"))) - )) - ("video" . ( - ("mpeg" . (("viewer" . "mpeg_play %s") - ("type" . "video/mpeg") - ("test" . (eq (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. This is keyed on the lowercase -attribute name (viewer, test, etc). This looks like: -((\"viewer\" . viewerinfo) - (\"test\" . testinfo) - (\"xxxx\" . \"string\") -) - -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'd, with the buffer as an argument. - -testinfo is a list of strings, or nil. If nil, it means the -viewer specified is always valid. If it is a list of strings, -these are used to determine whether a viewer passes the 'test' or -not.") - -(defvar mm-content-transfer-encodings - '(("base64" . base64-decode-region) - ("7bit" . ignore) - ("8bit" . ignore) - ("binary" . ignore) - ("x-compress" . ("uncompress" "-c")) - ("x-gzip" . ("gzip" "-dc")) - ("compress" . ("uncompress" "-c")) - ("gzip" . ("gzip" "-dc")) - ("x-hqx" . ("mcvert" "-P" "-s" "-S")) - ("quoted-printable" . mm-decode-quoted-printable) - ) - "*An assoc list of content-transfer-encodings and how to decode them.") - -(defvar mm-download-directory nil - "*Where downloaded files should go by default.") - -(defvar mm-temporary-directory (or (getenv "TMPDIR") "/tmp") - "*Where temporary files go.") - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; A few things from w3 and url, just in case this is used without them -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defun mm-generate-unique-filename (&optional fmt) - "Generate a unique filename in mm-temporary-directory" - (if (not fmt) - (let ((base (format "mm-tmp.%d" (user-real-uid))) - (fname "") - (x 0)) - (setq fname (format "%s%d" base x)) - (while (file-exists-p - (expand-file-name fname mm-temporary-directory)) - (setq x (1+ x) - fname (concat base (int-to-string x)))) - (expand-file-name fname mm-temporary-directory)) - (let ((base (concat "mm" (int-to-string (user-real-uid)))) - (fname "") - (x 0)) - (setq fname (format fmt (concat base (int-to-string x)))) - (while (file-exists-p - (expand-file-name fname mm-temporary-directory)) - (setq x (1+ x) - fname (format fmt (concat base (int-to-string x))))) - (expand-file-name fname mm-temporary-directory)))) - -(if (and (fboundp 'copy-tree) - (subrp (symbol-function 'copy-tree))) - (fset 'mm-copy-tree 'copy-tree) - (defun mm-copy-tree (tree) - (if (consp tree) - (cons (mm-copy-tree (car tree)) - (mm-copy-tree (cdr tree))) - (if (vectorp tree) - (let* ((new (copy-sequence tree)) - (i (1- (length new)))) - (while (>= i 0) - (aset new i (mm-copy-tree (aref new i))) - (setq i (1- i))) - new) - tree)))) - -;LMI was here -;(require 'mule-sysdp) - -(if (not (fboundp 'w3-save-binary-file)) - (defun mm-save-binary-file () - ;; Ok, this is truly fucked. In XEmacs, if you use the mouse to select - ;; a URL that gets saved via this function, read-file-name will pop up a - ;; dialog box for file selection. For some reason which buffer we are in - ;; gets royally screwed (even with save-excursions and the whole nine - ;; yards). SO, we just keep the old buffer name around and away we go. - (let ((old-buff (current-buffer)) - (file (read-file-name "Filename to save as: " - (or mm-download-directory "~/") - (file-name-nondirectory (url-view-url t)) - nil - (file-name-nondirectory (url-view-url t)))) - (require-final-newline nil)) - (set-buffer old-buff) - (mule-write-region-no-coding-system (point-min) (point-max) file) - (kill-buffer (current-buffer)))) - (fset 'mm-save-binary-file 'w3-save-binary-file)) - -(defun mm-maybe-eval () - "Maybe evaluate a buffer of emacs lisp code" - (if (yes-or-no-p "This is emacs-lisp code, evaluate it? ") - (eval-buffer (current-buffer)) - (emacs-lisp-mode))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; The mailcap parser -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun mm-viewer-unescape (format &optional filename url) - (save-excursion - (set-buffer (get-buffer-create " *mm-parse*")) - (erase-buffer) - (insert format) - (goto-char (point-min)) - (while (re-search-forward "%\\(.\\)" nil t) - (let ((escape (aref (match-string 1) 0))) - (replace-match "" t t) - (case escape - (?% (insert "%")) - (?s (insert (or filename "\"\""))) - (?u (insert (or url "\"\"")))))) - (buffer-string))) - -(defun mm-in-assoc (elt list) - ;; Check to see if ELT matches any of the regexps in the car elements of LIST - (let (rslt) - (while (and list (not rslt)) - (and (car (car list)) - (string-match (car (car list)) elt) - (setq rslt (car list))) - (setq list (cdr list))) - rslt)) - -(defun mm-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))) - -(defun mm-parse-mailcaps (&optional path) - ;; Parse out all the mailcaps specified in a unix-style path string PATH - (cond - (path nil) - ((getenv "MAILCAPS") (setq path (getenv "MAILCAPS"))) - ((memq system-type '(ms-dos ms-windows windows-nt)) - (setq path (mapconcat 'expand-file-name '("~/mail.cap" "~/etc/mail.cap") - ";"))) - (t (setq path (mapconcat 'expand-file-name - '("~/.mailcap" - "/etc/mailcap:/usr/etc/mailcap" - "/usr/local/etc/mailcap") ":")))) - (let ((fnames (reverse - (mm-string-to-tokens path - (if (memq system-type - '(ms-dos ms-windows windows-nt)) - ?; - ?:)))) - fname) - (while fnames - (setq fname (car fnames)) - (if (and (file-exists-p fname) (file-readable-p fname)) - (mm-parse-mailcap (car fnames))) - (setq fnames (cdr fnames))))) - -(defun mm-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 - ) - (save-excursion - (set-buffer (get-buffer-create " *mailcap*")) - (erase-buffer) - (insert-file-contents fname) - (set-syntax-table mm-parse-args-syntax-table) - (mm-replace-regexp "#.*" "") ; Remove all comments - (mm-replace-regexp "\n+" "\n") ; And blank lines - (mm-replace-regexp "\\\\[ \t\n]+" " ") ; And collapse spaces - (mm-replace-regexp (concat (regexp-quote "\\") "[ \t]*\n") "") - (goto-char (point-max)) - (skip-chars-backward " \t\n") - (delete-region (point) (point-max)) - (goto-char (point-min)) - (while (not (eobp)) - (skip-chars-forward " \t\n") - (setq save-pos (point) - info nil) - (skip-chars-forward "^/;") - (downcase-region save-pos (point)) - (setq major (buffer-substring save-pos (point))) - (skip-chars-forward "/ \t\n") - (setq save-pos (point)) - (skip-chars-forward "^;") - (downcase-region save-pos (point)) - (setq minor - (cond - ((= ?* (or (char-after save-pos) 0)) ".*") - ((= (point) save-pos) ".*") - (t (buffer-substring save-pos (point))))) - (skip-chars-forward "; \t\n") - ;;; Got the major/minor chunks, now for the viewers/etc - ;;; The first item _must_ be a viewer, according to the - ;;; RFC for mailcap files (#1343) - (skip-chars-forward "; \t\n") - (setq save-pos (point)) - (skip-chars-forward "^;\n") - (if (= (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) - (setq info (nconc (list (cons "viewer" viewer) - (cons "type" (concat major "/" - (if (string= minor ".*") - "*" minor)))) - (mm-parse-mailcap-extras save-pos (point)))) - (mm-mailcap-entry-passes-test info) - (mm-add-mailcap-entry major minor info))))) - -(defun mm-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) - (skip-chars-forward " \";\n\t") - (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 (/= (or (char-after (point)) 0) ?=) ; There is no value - (setq value nil) - (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 (= (or (char-after (1- (point))) 0) ?\\ ) - (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))) - results))) - -(defun mm-string-to-tokens (str &optional delim) - "Return a list of words from the string STR" - (setq delim (or delim ? )) - (let (results y) - (mapcar - (function - (lambda (x) - (cond - ((and (= x delim) y) (setq results (cons y results) y nil)) - ((/= x delim) (setq y (concat y (char-to-string x)))) - (t nil)))) str) - (nreverse (cons y results)))) - -(defun mm-mailcap-entry-passes-test (info) - ;; Return t iff a mailcap entry passes its test clause or no test - ;; clause is present. - (let (status ; Call-process-regions return value - (test (assoc "test" info)); The test clause - ) - (setq status (and test (mm-string-to-tokens (cdr test)))) - (if (and (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)))) - -(defun mm-parse-args (st &optional nd nodowncase) - ;; Return an assoc list of attribute/value pairs from an RFC822-type string - (let ( - name ; From name= - value ; its value - results ; Assoc list of results - name-pos ; Start of XXXX= position - val-pos ; Start of value position - ) - (save-excursion - (if (stringp st) - (progn - (set-buffer (get-buffer-create " *mm-temp*")) - (set-syntax-table mm-parse-args-syntax-table) - (erase-buffer) - (insert st) - (setq st (point-min) - nd (point-max))) - (set-syntax-table mm-parse-args-syntax-table)) - (save-restriction - (narrow-to-region st nd) - (goto-char (point-min)) - (while (not (eobp)) - (skip-chars-forward "; \n\t") - (setq name-pos (point)) - (skip-chars-forward "^ \n\t=;") - (if (not nodowncase) - (downcase-region name-pos (point))) - (setq name (buffer-substring name-pos (point))) - (skip-chars-forward " \t\n") - (if (/= (or (char-after (point)) 0) ?=) ; There is no value - (setq value nil) - (skip-chars-forward " \t\n=") - (setq val-pos (point) - value - (cond - ((or (= (or (char-after val-pos) 0) ?\") - (= (or (char-after val-pos) 0) ?')) - (buffer-substring (1+ val-pos) - (condition-case () - (prog2 - (forward-sexp 1) - (1- (point)) - (skip-chars-forward "\"")) - (error - (skip-chars-forward "^ \t\n") - (point))))) - (t - (buffer-substring val-pos - (progn - (skip-chars-forward "^;") - (skip-chars-backward " \t") - (point))))))) - (setq results (cons (cons name value) results)) - (skip-chars-forward "; \n\t")) - results)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; The action routines. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun mm-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))) - ((string-match (car (car major)) minor) - (setq wildcard (cons (cdr (car major)) wildcard)))) - (setq major (cdr major))) - (nconc (nreverse exact) (nreverse wildcard)))) - -(defun mm-unescape-mime-test (test type-info) - (let ((buff (get-buffer-create " *unescape*")) - 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 " ")))) - (save-excursion - (set-buffer buff) - (erase-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))) - (cond - ((null save-chr) nil) - ((= save-chr ?t) - (delete-region save-pos (progn (forward-char 1) (point))) - (insert (or (cdr (assoc "type" type-info)) "\"\""))) - ((= save-chr ?M) - (delete-region save-pos (progn (forward-char 1) (point))) - (insert "\"\"")) - ((= save-chr ?n) - (delete-region save-pos (progn (forward-char 1) (point))) - (insert "\"\"")) - ((= save-chr ?F) - (delete-region save-pos (progn (forward-char 1) (point))) - (insert "\"\"")) - ((= save-chr ?{) - (forward-char 1) - (skip-chars-forward "^}") - (downcase-region (+ 2 save-pos) (point)) - (setq subst (buffer-substring (+ 2 save-pos) (point))) - (delete-region save-pos (1+ (point))) - (insert (or (cdr (assoc subst type-info)) "\"\""))) - (t nil)))) - (buffer-string))) - (t (error "Bad value to mm-unescape-mime-test. %s" test))))) - -(defun mm-viewer-passes-test (viewer-info type-info) - ;; Return non-nil iff the viewer specified by VIEWER-INFO passes its - ;; test clause (if any). - (let* ((test-info (assoc "test" viewer-info)) - (test (cdr test-info)) - (viewer (cdr (assoc "viewer" viewer-info))) - (default-directory (expand-file-name "~/")) - status - parsed-test - ) - (cond - ((not test-info) t) ; No test clause - ((not test) nil) ; Already failed test - ((eq test t) t) ; Already passed test - ((and (symbolp test) ; Lisp function as test - (fboundp test)) - (funcall test type-info)) - ((and (symbolp test) ; Lisp variable as test - (boundp test)) - (symbol-value test)) - ((and (listp test) ; List to be eval'd - (symbolp (car test))) - (eval test)) - (t - (setq test (mm-unescape-mime-test test type-info) - test (list shell-file-name nil nil nil shell-command-switch test) - status (apply 'call-process test)) - (= 0 status))))) - -(defun mm-add-mailcap-entry (major minor info) - (let ((old-major (assoc major mm-mime-data))) - (if (null old-major) ; New major area - (setq mm-mime-data - (cons (cons major (list (cons minor info))) - mm-mime-data)) - (let ((cur-minor (assoc minor old-major))) - (cond - ((or (null cur-minor) ; New minor area, or - (assoc "test" info)) ; Has a test, insert at beginning - (setcdr old-major (cons (cons minor info) (cdr old-major)))) - ((and (not (assoc "test" info)); No test info, replace completely - (not (assoc "test" cur-minor))) - (setcdr cur-minor info)) - (t - (setcdr old-major (cons (cons minor info) (cdr old-major))))))))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; The main whabbo -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun mm-viewer-lessp (x y) - ;; Return t iff viewer X is more desirable than viewer Y - (let ((x-wild (string-match "[*?]" (or (cdr-safe (assoc "type" x)) ""))) - (y-wild (string-match "[*?]" (or (cdr-safe (assoc "type" y)) ""))) - (x-lisp (not (stringp (or (cdr-safe (assoc "viewer" x)) "")))) - (y-lisp (not (stringp (or (cdr-safe (assoc "viewer" y)) ""))))) - (cond - ((and x-lisp (not y-lisp)) - t) - ((and (not y-lisp) x-wild (not y-wild)) - t) - ((and (not x-wild) y-wild) - t) - (t nil)))) - -(defun mm-mime-info (st &optional nd request) - "Get the mime viewer command for HEADERLINE, return nil if none found. -Expects a complete content-type header line as its argument. This can -be simple like text/html, or complex like text/plain; charset=blah; foo=bar - -Third argument REQUEST specifies what information to return. If it is -nil or the empty string, the viewer (second field of the mailcap -entry) will be returned. If it is a string, then the mailcap field -corresponding to that string will be returned (print, description, -whatever). If a number, then all the information for this specific -viewer is returned." - (let ( - major ; Major encoding (text, etc) - minor ; Minor encoding (html, etc) - info ; Other info - save-pos ; Misc. position during parse - major-info ; (assoc major mm-mime-data) - minor-info ; (assoc minor major-info) - test ; current test proc. - viewers ; Possible viewers - passed ; Viewers that passed the test - viewer ; The one and only viewer - ) - (save-excursion - (cond - ((null st) - (set-buffer (get-buffer-create " *mimeparse*")) - (erase-buffer) - (insert "text/plain") - (setq st (point-min))) - ((stringp st) - (set-buffer (get-buffer-create " *mimeparse*")) - (erase-buffer) - (insert st) - (setq st (point-min))) - ((null nd) - (narrow-to-region st (progn (goto-char st) (end-of-line) (point)))) - (t (narrow-to-region st nd))) - (goto-char st) - (skip-chars-forward ": \t\n") - (buffer-enable-undo) - (setq viewer - (catch 'mm-exit - (setq save-pos (point)) - (skip-chars-forward "^/") - (downcase-region save-pos (point)) - (setq major (buffer-substring save-pos (point))) - (if (not (setq major-info (cdr (assoc major mm-mime-data)))) - (throw 'mm-exit nil)) - (skip-chars-forward "/ \t\n") - (setq save-pos (point)) - (skip-chars-forward "^ \t\n;") - (downcase-region save-pos (point)) - (setq minor (buffer-substring save-pos (point))) - (if (not - (setq viewers (mm-possible-viewers major-info minor))) - (throw 'mm-exit nil)) - (skip-chars-forward "; \t") - (if (eolp) - nil ; No qualifiers - (setq save-pos (point)) - (end-of-line) - (setq info (mm-parse-args save-pos (point))) - ) - (while viewers - (if (mm-viewer-passes-test (car viewers) info) - (setq passed (cons (car viewers) passed))) - (setq viewers (cdr viewers))) - (setq passed (sort (nreverse passed) 'mm-viewer-lessp)) - (car passed))) - (if (and (stringp (cdr (assoc "viewer" viewer))) - passed) - (setq viewer (car passed))) - (widen) - (cond - ((and (null viewer) (not (equal major "default"))) - (mm-mime-info "default" nil request)) - ((or (null request) (equal request "")) - (mm-unescape-mime-test (cdr (assoc "viewer" viewer)) info)) - ((stringp request) - (if (or (string= request "test") (string= request "viewer")) - (mm-unescape-mime-test (cdr-safe (assoc request viewer)) info))) - (t - ;; MUST make a copy *sigh*, else we modify mm-mime-data - (setq viewer (mm-copy-tree viewer)) - (let ((view (assoc "viewer" viewer)) - (test (assoc "test" viewer))) - (if view (setcdr view (mm-unescape-mime-test (cdr view) info))) - (if test (setcdr test (mm-unescape-mime-test (cdr test) info)))) - viewer))))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Experimental MIME-types parsing -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defvar mm-mime-extensions - '( - ("" . "text/plain") - (".abs" . "audio/x-mpeg") - (".aif" . "audio/aiff") - (".aifc" . "audio/aiff") - (".aiff" . "audio/aiff") - (".ano" . "application/x-annotator") - (".au" . "audio/ulaw") - (".avi" . "video/x-msvideo") - (".bcpio" . "application/x-bcpio") - (".bin" . "application/octet-stream") - (".cdf" . "application/x-netcdr") - (".cpio" . "application/x-cpio") - (".csh" . "application/x-csh") - (".dvi" . "application/x-dvi") - (".el" . "application/emacs-lisp") - (".eps" . "application/postscript") - (".etx" . "text/x-setext") - (".exe" . "application/octet-stream") - (".fax" . "image/x-fax") - (".gif" . "image/gif") - (".hdf" . "application/x-hdf") - (".hqx" . "application/mac-binhex40") - (".htm" . "text/html") - (".html" . "text/html") - (".icon" . "image/x-icon") - (".ief" . "image/ief") - (".jpg" . "image/jpeg") - (".macp" . "image/x-macpaint") - (".man" . "application/x-troff-man") - (".me" . "application/x-troff-me") - (".mif" . "application/mif") - (".mov" . "video/quicktime") - (".movie" . "video/x-sgi-movie") - (".mp2" . "audio/x-mpeg") - (".mp2a" . "audio/x-mpeg2") - (".mpa" . "audio/x-mpeg") - (".mpa2" . "audio/x-mpeg2") - (".mpe" . "video/mpeg") - (".mpeg" . "video/mpeg") - (".mpega" . "audio/x-mpeg") - (".mpegv" . "video/mpeg") - (".mpg" . "video/mpeg") - (".mpv" . "video/mpeg") - (".ms" . "application/x-troff-ms") - (".nc" . "application/x-netcdf") - (".nc" . "application/x-netcdf") - (".oda" . "application/oda") - (".pbm" . "image/x-portable-bitmap") - (".pdf" . "application/pdf") - (".pgm" . "image/portable-graymap") - (".pict" . "image/pict") - (".png" . "image/png") - (".pnm" . "image/x-portable-anymap") - (".ppm" . "image/portable-pixmap") - (".ps" . "application/postscript") - (".qt" . "video/quicktime") - (".ras" . "image/x-raster") - (".rgb" . "image/x-rgb") - (".rtf" . "application/rtf") - (".rtx" . "text/richtext") - (".sh" . "application/x-sh") - (".sit" . "application/x-stuffit") - (".snd" . "audio/basic") - (".src" . "application/x-wais-source") - (".tar" . "archive/tar") - (".tcl" . "application/x-tcl") - (".tcl" . "application/x-tcl") - (".tex" . "application/x-tex") - (".texi" . "application/texinfo") - (".tga" . "image/x-targa") - (".tif" . "image/tiff") - (".tiff" . "image/tiff") - (".tr" . "application/x-troff") - (".troff" . "application/x-troff") - (".tsv" . "text/tab-separated-values") - (".txt" . "text/plain") - (".vbs" . "video/mpeg") - (".vox" . "audio/basic") - (".vrml" . "x-world/x-vrml") - (".wav" . "audio/x-wav") - (".wrl" . "x-world/x-vrml") - (".xbm" . "image/xbm") - (".xpm" . "image/x-pixmap") - (".xwd" . "image/windowdump") - (".zip" . "application/zip") - (".ai" . "application/postscript") - (".jpe" . "image/jpeg") - (".jpeg" . "image/jpeg") - ) - "*An assoc list of file extensions and the MIME content-types they -correspond to.") - -(defun mm-parse-mimetypes (&optional path) - ;; Parse out all the mimetypes specified in a unix-style path string PATH - (cond - (path nil) - ((getenv "MIMETYPES") (setq path (getenv "MIMETYPES"))) - ((memq system-type '(ms-dos ms-windows windows-nt)) - (setq path (mapconcat 'expand-file-name - '("~/mime.typ" "~/etc/mime.typ") ";"))) - (t (setq path (mapconcat 'expand-file-name - '("~/.mime-types" - "/etc/mime-types:/usr/etc/mime-types" - "/usr/local/etc/mime-types" - "/usr/local/www/conf/mime-types") ":")))) - (let ((fnames (reverse - (mm-string-to-tokens path - (if (memq system-type - '(ms-dos ms-windows windows-nt)) - ?; - ?:)))) - fname) - (while fnames - (setq fname (car fnames)) - (if (and (file-exists-p fname) (file-readable-p fname)) - (mm-parse-mimetype-file (car fnames))) - (setq fnames (cdr fnames))))) - -(defun mm-parse-mimetype-file (fname) - ;; Parse out a mime-types file - (let (type ; The MIME type for this line - extns ; The extensions for this line - save-pos ; Misc. saved buffer positions - ) - (save-excursion - (set-buffer (get-buffer-create " *mime-types*")) - (erase-buffer) - (insert-file-contents fname) - (mm-replace-regexp "#.*" "") - (mm-replace-regexp "\n+" "\n") - (mm-replace-regexp "[ \t]+$" "") - (goto-char (point-max)) - (skip-chars-backward " \t\n") - (delete-region (point) (point-max)) - (goto-char (point-min)) - (while (not (eobp)) - (skip-chars-forward " \t\n") - (setq save-pos (point)) - (skip-chars-forward "^ \t") - (downcase-region save-pos (point)) - (setq type (buffer-substring save-pos (point))) - (while (not (eolp)) - (skip-chars-forward " \t") - (setq save-pos (point)) - (skip-chars-forward "^ \t\n") - (setq extns (cons (buffer-substring save-pos (point)) extns))) - (while extns - (setq mm-mime-extensions - (cons - (cons (if (= (string-to-char (car extns)) ?.) - (car extns) - (concat "." (car extns))) type) mm-mime-extensions) - extns (cdr extns))))))) - -(defun mm-extension-to-mime (extn) - "Return the MIME content type of the file extensions EXTN" - (if (and (stringp extn) - (not (eq (string-to-char extn) ?.))) - (setq extn (concat "." extn))) - (cdr (assoc (downcase extn) mm-mime-extensions))) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Editing/Composition of body parts -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun mm-compose-type (type) - ;; Compose a body section of MIME-type TYPE. - (let* ((info (mm-mime-info type nil 5)) - (fnam (mm-generate-unique-filename)) - (comp (or (cdr (assoc "compose" info)))) - (ctyp (cdr (assoc "composetyped" info))) - (buff (get-buffer-create " *mimecompose*")) - (typeit (not ctyp)) - (retval "") - (usef nil)) - (setq comp (mm-unescape-mime-test (or comp ctyp) info)) - (while (string-match "\\([^\\\\]\\)%s" comp) - (setq comp (concat (substring comp 0 (match-end 1)) fnam - (substring comp (match-end 0) nil)) - usef t)) - (call-process shell-file-name nil - (if usef nil buff) - nil shell-command-switch comp) - (setq retval - (concat - (if typeit (concat "Content-type: " type "\r\n\r\n") "") - (if usef - (save-excursion - (set-buffer buff) - (erase-buffer) - (insert-file-contents fnam) - (buffer-string)) - (save-excursion - (set-buffer buff) - (buffer-string))) - "\r\n")) - retval)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Misc. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun mm-type-to-file (type) - "Return the file extension for content-type TYPE" - (rassoc type mm-mime-extensions)) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Miscellaneous MIME viewers written in elisp -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun mm-play-sound-file (&optional buff) - "Play a sound file in buffer BUFF (defaults to current buffer)" - (setq buff (or buff (current-buffer))) - (let ((fname (mm-generate-unique-filename "%s.au")) - (synchronous-sounds t)) ; Play synchronously - (mule-write-region-no-coding-system (point-min) (point-max) fname) - (kill-buffer (current-buffer)) - (play-sound-file fname) - (condition-case () - (delete-file fname) - (error nil)))) - -(defun mm-parse-mime-headers (&optional no-delete) - "Return a list of the MIME headers at the top of this buffer. If -optional argument NO-DELETE is non-nil, don't delete the headers." - (let* ((st (point-min)) - (nd (progn - (goto-char (point-min)) - (skip-chars-forward " \t\n") - (if (re-search-forward "^\r*$" nil t) - (1+ (point)) - (point-max)))) - save-pos - status - hname - hvalu - result - search - ) - (narrow-to-region st (min nd (point-max))) - (goto-char (point-min)) - (while (not (eobp)) - (skip-chars-forward " \t\n\r") - (setq save-pos (point)) - (skip-chars-forward "^:\n\r") - (downcase-region save-pos (point)) - (setq hname (buffer-substring save-pos (point))) - (skip-chars-forward ": \t ") - (setq save-pos (point)) - (skip-chars-forward "^\n\r") - (setq search t) - (while search - (skip-chars-forward "^\n\r") - (save-excursion - (skip-chars-forward "\n\r") - - (setq search - (string-match "[ \t]" - (char-to-string - (or (char-after (point)) ?a))))) - (if search - (skip-chars-forward "\n\r"))) - (setq hvalu (buffer-substring save-pos (point)) - result (cons (cons hname hvalu) result))) - (or no-delete (delete-region st nd)) - result)) - -(defun mm-find-available-multiparts (separator &optional buf) - "Return a list of mime-headers for the various body parts of a -multipart message in buffer BUF with separator SEPARATOR. -The different multipart specs are put in `mm-temporary-directory'." - (let ((sep (concat "^--" separator "\r*$")) - headers - fname - results) - (save-excursion - (and buf (set-buffer buf)) - (goto-char (point-min)) - (while (re-search-forward sep nil t) - (let ((st (set-marker (make-marker) - (progn - (forward-line 1) - (beginning-of-line) - (point)))) - (nd (set-marker (make-marker) - (if (re-search-forward sep nil t) - (1- (match-beginning 0)) - (point-max))))) - (narrow-to-region st nd) - (goto-char st) - (if (looking-at "^\r*$") - (insert "Content-type: text/plain\n" - "Content-length: " (int-to-string (- nd st)) "\n")) - (setq headers (mm-parse-mime-headers) - fname (mm-generate-unique-filename)) - (let ((x (or (cdr (assoc "content-type" headers)) "text/plain"))) - (if (string-match "name=\"*\\([^ \"]+\\)\"*" x) - (setq fname (expand-file-name - (substring x (match-beginning 1) - (match-end 1)) - mm-temporary-directory)))) - (widen) - (if (assoc "content-transfer-encoding" headers) - (let ((coding (cdr - (assoc "content-transfer-encoding" headers))) - (cmd nil)) - (setq coding (and coding (downcase coding)) - cmd (or (cdr (assoc coding - mm-content-transfer-encodings)) - (read-string - (concat "How shall I decode " coding "? ") - "cat"))) - (if (string= cmd "") (setq cmd "cat")) - (if (stringp cmd) - (shell-command-on-region st nd cmd t) - (funcall cmd st nd)) - (or (eq cmd 'ignore) (set-marker nd (point))))) - (write-region st nd fname nil 5) - (delete-region st nd) - (setq results (cons - (cons - (cons "mm-filename" fname) headers) results))))) - results)) - -(defun mm-format-multipart-as-html (&optional buf type) - (if buf (set-buffer buf)) - (let* ((boundary (if (string-match - "boundary[ \t]*=[ \t\"]*\\([^ \"\t\n]+\\)" - type) - (regexp-quote - (substring type (match-beginning 1) (match-end 1))))) - (parts (mm-find-available-multiparts boundary))) - (erase-buffer) - (insert "\n" - " \n" - " Multipart Message\n" - " \n" - " \n" - "

Multipart message encountered

\n" - "

I have encountered a multipart MIME message.\n" - " The following parts have been detected. Please\n" - " select which one you want to view.\n" - "

\n" - " \n" - " \n" - "\n" - "\n"))) - -(defun mm-multipart-viewer () - (mm-format-multipart-as-html - (current-buffer) - (cdr (assoc "content-type" url-current-mime-headers))) - (let ((w3-working-buffer (current-buffer))) - (w3-prepare-buffer))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Transfer encodings we can decrypt automatically -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun mm-decode-quoted-printable (&optional st nd) - (interactive) - (setq st (or st (point-min)) - nd (or nd (point-max))) - (save-restriction - (narrow-to-region st nd) - (save-excursion - (let ((buffer-read-only nil)) - (goto-char (point-min)) - (while (re-search-forward "=[0-9A-F][0-9A-F]" nil t) - (replace-match - (char-to-string - (+ - (* 16 (mm-hex-char-to-integer - (char-after (1+ (match-beginning 0))))) - (mm-hex-char-to-integer - (char-after (1- (match-end 0)))))))))) - (goto-char (point-max)))) - -;; Taken from hexl.el. -(defun mm-hex-char-to-integer (character) - "Take a char and return its value as if it was a hex digit." - (if (and (>= character ?0) (<= character ?9)) - (- character ?0) - (let ((ch (logior character 32))) - (if (and (>= ch ?a) (<= ch ?f)) - (- ch (- ?a 10)) - (error (format "Invalid hex digit `%c'." ch)))))) - - - -(require 'base64) -(provide 'mm) diff --git a/lisp/nnagent.el b/lisp/nnagent.el index b42ddf9..714a07a 100644 --- a/lisp/nnagent.el +++ b/lisp/nnagent.el @@ -94,12 +94,13 @@ (t nil)))) (defun nnagent-request-type (group 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)))) + (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) diff --git a/lisp/nndir.el b/lisp/nndir.el index d9e5c56..a3b5eae 100644 --- a/lisp/nndir.el +++ b/lisp/nndir.el @@ -88,11 +88,11 @@ (nnoo-map-functions nndir (nnml-retrieve-headers 0 nndir-current-group 0 0) - (nnmh-request-article 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) - (nnmh-request-list (nnoo-current-server 'nndir) nndir-directory) - (nnmh-request-newsgroups (nnoo-current-server 'nndir) nndir-directory)) + (nnml-request-list (nnoo-current-server 'nndir) nndir-directory) + (nnml-request-newsgroups (nnoo-current-server 'nndir) nndir-directory)) (provide 'nndir) diff --git a/lisp/nndoc.el b/lisp/nndoc.el index c32f50f..0da245a 100644 --- a/lisp/nndoc.el +++ b/lisp/nndoc.el @@ -38,7 +38,7 @@ (defvoo nndoc-article-type 'guess "*Type of the file. One of `mbox', `babyl', `digest', `news', `rnews', `mmdf', `forward', -`rfc934', `rfc822-forward', `mime-digest', `standard-digest', +`rfc934', `rfc822-forward', `mime-digest', `mime-parts', `standard-digest', `slack-digest', `clari-briefs' or `guess'.") (defvoo nndoc-post-type 'mail @@ -87,6 +87,9 @@ from the document.") (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+")) @@ -128,10 +131,8 @@ from the document.") (subtype nil)))) - (defvoo nndoc-file-begin nil) (defvoo nndoc-first-article nil) -(defvoo nndoc-article-end nil) (defvoo nndoc-article-begin nil) (defvoo nndoc-head-begin nil) (defvoo nndoc-head-end nil) @@ -141,6 +142,11 @@ from the document.") (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 is an ordinal starting at 1. HEAD-BEGIN, +;; HEAD-END, BODY-BEGIN and BODY-END are positions in the `nndoc' buffer. +;; LINE-COUNT is a count of lines in the body. SUBJECT, MESSAGE-ID and +;; REFERENCES, only present for MIME dissections, are field values. (defvoo nndoc-dissection-alist nil) (defvoo nndoc-prepare-body-function nil) (defvoo nndoc-generate-head-function nil) @@ -152,6 +158,8 @@ from the document.") (defvoo nndoc-current-buffer nil "Current nndoc news buffer.") (defvoo nndoc-address nil) +(defvoo nndoc-mime-header nil) +(defvoo nndoc-mime-subject nil) (defconst nndoc-version "nndoc 1.0" "nndoc version.") @@ -293,7 +301,9 @@ from the document.") (save-excursion (set-buffer nndoc-current-buffer) (nndoc-set-delims) - (nndoc-dissect-buffer))) + (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. @@ -307,7 +317,8 @@ from the document.") "Set the nndoc delimiter variables according to the type of the document." (let ((vars '(nndoc-file-begin nndoc-first-article - nndoc-article-end nndoc-head-begin nndoc-head-end + 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 @@ -436,6 +447,44 @@ from the document.") (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]+;\\(.*;\\)*" + "[ \t\n]*[ \t]boundary=\"?[^\"\n]*[^\" \t\n]") + limit t)) + t))) + +(defun nndoc-transform-mime-parts (article) + (unless (= article 1) + ;; Ensure some MIME-Version. + (goto-char (point-min)) + (search-forward "\n\n") + (let ((case-fold-search nil) + (limit (point))) + (goto-char (point-min)) + (or (save-excursion (re-search-forward "^MIME-Version:" limit t)) + (insert "Mime-Version: 1.0\n"))) + ;; Generate default header before entity fields. + (goto-char (point-min)) + (nndoc-generate-mime-parts-head article t))) + +(defun nndoc-generate-mime-parts-head (article &optional body-present) + (let ((entry (cdr (assq (if body-present 1 article) nndoc-dissection-alist)))) + (let ((subject (if body-present + nndoc-mime-subject + (concat "<" (nth 5 entry) ">"))) + (message-id (nth 6 entry)) + (references (nth 7 entry))) + (insert nndoc-mime-header) + (and subject (insert "Subject: " subject "\n")) + (and message-id (insert "Message-ID: " message-id "\n")) + (and references (insert "References: " references "\n"))))) + (defun nndoc-clari-briefs-type-p () (when (let ((case-fold-search nil)) (re-search-forward "^\t[^a-z]+ ([^a-z]+) --" nil t)) @@ -473,7 +522,7 @@ from the document.") (when (and (re-search-forward (concat "^Content-Type: *multipart/digest;[ \t\n]*[ \t]" - "boundary=\"\\([^\"\n]*[^\" \t\n]\\)\"") + "boundary=\"?\\([^\"\n]*[^\" \t\n]\\)") nil t) (match-beginning 1)) (setq boundary-id (match-string 1) @@ -572,7 +621,7 @@ from the document.") (funcall nndoc-head-begin-function)) (nndoc-head-begin (nndoc-search nndoc-head-begin))) - (if (or (>= (point) (point-max)) + (if (or (eobp) (and nndoc-file-end (looking-at nndoc-file-end))) (goto-char (point-max)) @@ -609,6 +658,104 @@ from the document.") (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) + (message-narrow-to-head) + (let ((case-fold-search t) + (message-id (message-fetch-field "Message-ID")) + (references (message-fetch-field "References"))) + (setq nndoc-mime-header (buffer-substring (point-min) (point-max)) + nndoc-mime-subject (message-fetch-field "Subject")) + (while (string-match "\ +^\\(Subject\\|Message-ID\\|References\\|Lines\\|\ +MIME-Version\\|Content-Type\\|Content-Transfer-Encoding\\|\ +\\):.*\n\\([ \t].*\n\\)*" + nndoc-mime-header) + (setq nndoc-mime-header (replace-match "" t t nndoc-mime-header))) + (widen) + (nndoc-dissect-mime-parts-sub (point-min) (point-max) + nil message-id references)))) + +(defun nndoc-dissect-mime-parts-sub (begin end position message-id references) + "Dissect an entity within a composite MIME message. +The article, which corresponds to a MIME entity, extends from BEGIN to END. +The string POSITION holds a dotted decimal representation of the article +position in the hierarchical structure, it is nil for the outer entity. +The generated article should use MESSAGE-ID and REFERENCES field values." + ;; Note: `case-fold-search' is already `t' from the calling function. + (let ((head-begin begin) + (body-end end) + head-end body-begin type subtype composite comment) + (save-excursion + ;; Gracefully handle a missing body. + (goto-char head-begin) + (if (search-forward "\n\n" body-end t) + (setq head-end (1- (point)) + body-begin (point)) + (setq head-end end + body-begin end)) + ;; Save MIME attributes. + (goto-char head-begin) + (if (re-search-forward "\ +^Content-Type: *\\([^ \t\n/;]+\\)/\\([^ \t\n/;]+\\)" + head-end t) + (setq type (downcase (match-string 1)) + subtype (downcase (match-string 2))) + (setq type "text" + subtype "plain")) + (setq composite (string= type "multipart") + comment (concat position + (when (and position composite) ".") + (when composite "*") + (when (or position composite) " ") + (cond ((string= subtype "plain") type) + ((string= subtype "basic") type) + (t subtype)))) + ;; 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) + comment message-id references) + nndoc-dissection-alist) + ;; Recurse for all sub-entities, if any. + (goto-char head-begin) + (when (re-search-forward + (concat "\ +^Content-Type: *multipart/\\([a-z]+\\);\\(.*;\\)*" + "[ \t\n]*[ \t]boundary=\"?\\([^\"\n]*[^\" \t\n]\\)") + head-end t) + (let ((boundary (concat "\n--" (match-string 3) "\\(--\\)?[ \t]*\n")) + (part-counter 0) + begin end eof-flag) + (goto-char head-end) + (setq eof-flag (not (re-search-forward boundary body-end t))) + (while (not eof-flag) + (setq begin (point)) + (cond ((re-search-forward boundary body-end t) + (or (not (match-string 1)) + (string= (match-string 1) "") + (setq eof-flag t)) + (forward-line -1) + (setq end (point)) + (forward-line 1)) + (t (setq end body-end + eof-flag t))) + (nndoc-dissect-mime-parts-sub begin end + (concat position (when position ".") + (format "%d" + (incf part-counter))) + (nnmail-message-id) + message-id))))))) + ;;;###autoload (defun nndoc-add-type (definition &optional position) "Add document DEFINITION to the list of nndoc document definitions. diff --git a/lisp/nndraft.el b/lisp/nndraft.el index f7182a5..c6f23c4 100644 --- a/lisp/nndraft.el +++ b/lisp/nndraft.el @@ -130,8 +130,6 @@ (when (nndraft-request-article article group server (current-buffer)) (message-remove-header "xref") (message-remove-header "lines") - (let ((gnus-verbose-backends nil)) - (nndraft-request-expire-articles (list article) group server t)) t)) (deffoo nndraft-request-update-info (group info &optional server) diff --git a/lisp/nneething.el b/lisp/nneething.el index 97f5d2f..7da5466 100644 --- a/lisp/nneething.el +++ b/lisp/nneething.el @@ -64,7 +64,7 @@ If this variable is nil, no files will be excluded.") (defvoo nneething-map nil) (defvoo nneething-read-only nil) (defvoo nneething-active nil) -(defvoo nneething-directory nil) +(defvoo nneething-address nil) @@ -158,8 +158,8 @@ If this variable is nil, no files will be excluded.") (nnheader-init-server-buffer) (if (nneething-server-opened server) t - (unless (assq 'nneething-directory defs) - (setq defs (append defs (list (list 'nneething-directory server))))) + (unless (assq 'nneething-address defs) + (setq defs (append defs (list (list 'nneething-address server))))) (nnoo-change-server 'nneething server defs))) @@ -185,9 +185,9 @@ If this variable is nil, no files will be excluded.") (defun nneething-create-mapping () ;; Read nneething-active and nneething-map. - (when (file-exists-p nneething-directory) + (when (file-exists-p nneething-address) (let ((map-file (nneething-map-file)) - (files (directory-files nneething-directory)) + (files (directory-files nneething-address)) touched map-files) (when (file-exists-p map-file) (ignore-errors @@ -344,7 +344,7 @@ If this variable is nil, no files will be excluded.") (defun nneething-file-name (article) "Return the file name of ARTICLE." - (concat (file-name-as-directory nneething-directory) + (concat (file-name-as-directory nneething-address) (if (numberp article) (cadr (assq article nneething-map)) article))) diff --git a/lisp/nnheader.el b/lisp/nnheader.el index e0de0a4..bc725b6 100644 --- a/lisp/nnheader.el +++ b/lisp/nnheader.el @@ -400,7 +400,6 @@ the line could be found." (unless (gnus-buffer-live-p nntp-server-buffer) (setq nntp-server-buffer (get-buffer-create " *nntpd*"))) (set-buffer nntp-server-buffer) - (buffer-disable-undo (current-buffer)) (erase-buffer) (kill-all-local-variables) (setq case-fold-search t) ;Should ignore case. diff --git a/lisp/nnkiboze.el b/lisp/nnkiboze.el index b122d3e..38a0244 100644 --- a/lisp/nnkiboze.el +++ b/lisp/nnkiboze.el @@ -331,10 +331,8 @@ Finds out what articles are to be part of the nnkiboze groups." (save-excursion (set-buffer buffer) (goto-char (point-max)) - (let ((xref (mail-header-xref header)) - (prefix (gnus-group-real-prefix group)) + (let ((prefix (gnus-group-real-prefix group)) (oheader (copy-sequence header)) - (first t) article) (if (zerop (forward-line -1)) (progn diff --git a/lisp/nnmail.el b/lisp/nnmail.el index e761868..16541b1 100644 --- a/lisp/nnmail.el +++ b/lisp/nnmail.el @@ -31,6 +31,7 @@ (require 'timezone) (require 'message) (require 'custom) +(require 'gnus-util) (eval-and-compile (autoload 'gnus-error "gnus-util") @@ -181,7 +182,8 @@ used as incoming mailboxes. If this variable is a directory (i. e., it's name ends with a \"/\"), treat all files in that directory as incoming spool files." :group 'nnmail-files - :type 'file) + :type '(choice (file :tag "File") + (repeat :tag "Files" file))) (defcustom nnmail-crash-box "~/.gnus-crash-box" "File where Gnus will store mail while processing it." @@ -468,6 +470,9 @@ parameter. It should return nil, `warn' or `delete'." (defvar nnmail-internal-password nil) +(defvar nnmail-split-tracing nil) +(defvar nnmail-split-trace nil) + (defconst nnmail-version "nnmail 1.0" @@ -527,7 +532,8 @@ parameter. It should return nil, `warn' or `delete'." (aref t1 2) (aref t1 1) (aref t1 0) (aref d1 2) (aref d1 1) (aref d1 0) (number-to-string - (* 60 (timezone-zone-to-minute (aref d1 4)))))))) + (* 60 (timezone-zone-to-minute + (or (aref d1 4) (current-time-zone))))))))) ;; If we get an error, then we just return a 0 time. (error (list 0 0)))) @@ -655,6 +661,9 @@ parameter. It should return nil, `warn' or `delete'." (set-file-modes tofile nnmail-default-file-modes)))) ;; Probably a real error. + ;; We nix out the password in case the error + ;; was because of a wrong password being given. + (setq nnmail-internal-password nil) (subst-char-in-region (point-min) (point-max) ?\n ?\ ) (goto-char (point-max)) (skip-chars-backward " \t") @@ -690,8 +699,7 @@ nn*-request-list should have been called before calling this function." group-assoc))) group-assoc)) -(defvar nnmail-active-file-coding-system - 'iso-8859-1 +(defvar nnmail-active-file-coding-system 'binary "*Coding system for active file.") (defun nnmail-save-active (group-assoc file-name) @@ -1043,7 +1051,7 @@ FUNC will be called with the buffer narrowed to each mail." (funcall exit-func)) (kill-buffer (current-buffer))))) -(defun nnmail-article-group (func) +(defun nnmail-article-group (func &optional trace) "Look at the headers and return an alist of groups that match. FUNC will be called with the group name to determine the article number." (let ((methods nnmail-split-methods) @@ -1082,6 +1090,8 @@ FUNC will be called with the group name to determine the article number." ;; Allow washing. (goto-char (point-min)) (run-hooks 'nnmail-split-hook) + (when (setq nnmail-split-tracing trace) + (setq nnmail-split-trace nil)) (if (and (symbolp nnmail-split-methods) (fboundp nnmail-split-methods)) (let ((split @@ -1141,6 +1151,18 @@ FUNC will be called with the group name to determine the article number." (setq group-art (list (cons (car method) (funcall func (car method))))))))) + ;; Produce a trace if non-empty. + (when (and trace nnmail-split-trace) + (let ((trace (nreverse nnmail-split-trace)) + (restore (current-buffer))) + (nnheader-set-temp-buffer "*Split Trace*") + (gnus-add-buffer) + (while trace + (insert (car trace) "\n") + (setq trace (cdr trace))) + (goto-char (point-min)) + (gnus-configure-windows 'split-trace) + (set-buffer restore))) ;; See whether the split methods returned `junk'. (if (equal group-art '(junk)) nil @@ -1237,81 +1259,87 @@ See the documentation for the variable `nnmail-split-fancy' for documentation." (defun nnmail-split-it (split) ;; Return a list of groups matching SPLIT. - (cond - ;; nil split - ((null split) - nil) - - ;; A group name. Do the \& and \N subs into the string. - ((stringp split) - (list (nnmail-expand-newtext split))) - - ;; Junk the message. - ((eq split 'junk) - (list 'junk)) - - ;; Builtin & operation. - ((eq (car split) '&) - (apply 'nconc (mapcar 'nnmail-split-it (cdr split)))) - - ;; Builtin | operation. - ((eq (car split) '|) - (let (done) - (while (and (not done) (cdr split)) - (setq split (cdr split) - done (nnmail-split-it (car split)))) - done)) - - ;; Builtin : operation. - ((eq (car split) ':) - (nnmail-split-it (save-excursion (eval (cdr split))))) - - ;; Check the cache for the regexp for this split. - ;; FIX FIX FIX could avoid calling assq twice here - ((assq split nnmail-split-cache) - (goto-char (point-max)) - ;; FIX FIX FIX problem with re-search-backward is that if you have - ;; a split: (from "foo-\\(bar\\|baz\\)@gnus.org "mail.foo.\\1") - ;; and someone mails a message with 'To: foo-bar@gnus.org' and - ;; 'CC: foo-baz@gnus.org', we'll pick 'mail.foo.baz' as the group - ;; if the cc line is a later header, even though the other choice - ;; is probably better. Also, this routine won't do a crosspost - ;; when there are two different matches. - ;; I guess you could just make this more determined, and it could - ;; look for still more matches prior to this one, and recurse - ;; on each of the multiple matches hit. Of course, then you'd - ;; want to make sure that nnmail-article-group or nnmail-split-fancy - ;; removed duplicates, since there might be more of those. - ;; I guess we could also remove duplicates in the & split case, since - ;; that's the only thing that can introduce them. - (when (re-search-backward (cdr (assq split nnmail-split-cache)) nil t) - ;; Someone might want to do a \N sub on this match, so get the - ;; correct match positions. - (goto-char (match-end 0)) - (let ((value (nth 1 split))) - (re-search-backward (if (symbolp value) - (cdr (assq value nnmail-split-abbrev-alist)) - value) - (match-end 1))) - (nnmail-split-it (nth 2 split)))) - - ;; Not in cache, compute a regexp for the field/value pair. - (t - (let* ((field (nth 0 split)) - (value (nth 1 split)) - (regexp (concat "^\\(\\(" - (if (symbolp field) - (cdr (assq field nnmail-split-abbrev-alist)) - field) - "\\):.*\\)\\<\\(" - (if (symbolp value) - (cdr (assq value nnmail-split-abbrev-alist)) - value) - "\\)\\>"))) - (push (cons split regexp) nnmail-split-cache) - ;; Now that it's in the cache, just call nnmail-split-it again - ;; on the same split, which will find it immediately in the cache. - (nnmail-split-it split))))) + (let (cached-pair) + (cond + ;; nil split + ((null split) + nil) + + ;; A group name. Do the \& and \N subs into the string. + ((stringp split) + (when nnmail-split-tracing + (push (format "\"%s\"" split) nnmail-split-trace)) + (list (nnmail-expand-newtext split))) + + ;; Junk the message. + ((eq split 'junk) + (when nnmail-split-tracing + (push "junk" nnmail-split-trace)) + (list 'junk)) + + ;; Builtin & operation. + ((eq (car split) '&) + (apply 'nconc (mapcar 'nnmail-split-it (cdr split)))) + + ;; Builtin | operation. + ((eq (car split) '|) + (let (done) + (while (and (not done) (cdr split)) + (setq split (cdr split) + done (nnmail-split-it (car split)))) + done)) + + ;; Builtin : operation. + ((eq (car split) ':) + (nnmail-split-it (save-excursion (eval (cdr split))))) + + ;; Check the cache for the regexp for this split. + ((setq cached-pair (assq split nnmail-split-cache)) + (goto-char (point-max)) + ;; FIX FIX FIX problem with re-search-backward is that if you have + ;; a split: (from "foo-\\(bar\\|baz\\)@gnus.org "mail.foo.\\1") + ;; and someone mails a message with 'To: foo-bar@gnus.org' and + ;; 'CC: foo-baz@gnus.org', we'll pick 'mail.foo.baz' as the group + ;; if the cc line is a later header, even though the other choice + ;; is probably better. Also, this routine won't do a crosspost + ;; when there are two different matches. + ;; I guess you could just make this more determined, and it could + ;; look for still more matches prior to this one, and recurse + ;; on each of the multiple matches hit. Of course, then you'd + ;; want to make sure that nnmail-article-group or nnmail-split-fancy + ;; removed duplicates, since there might be more of those. + ;; I guess we could also remove duplicates in the & split case, since + ;; that's the only thing that can introduce them. + (when (re-search-backward (cdr cached-pair) nil t) + (when nnmail-split-tracing + (push (cdr cached-pair) nnmail-split-trace)) + ;; Someone might want to do a \N sub on this match, so get the + ;; correct match positions. + (goto-char (match-end 0)) + (let ((value (nth 1 split))) + (re-search-backward (if (symbolp value) + (cdr (assq value nnmail-split-abbrev-alist)) + value) + (match-end 1))) + (nnmail-split-it (nth 2 split)))) + + ;; Not in cache, compute a regexp for the field/value pair. + (t + (let* ((field (nth 0 split)) + (value (nth 1 split)) + (regexp (concat "^\\(\\(" + (if (symbolp field) + (cdr (assq field nnmail-split-abbrev-alist)) + field) + "\\):.*\\)\\<\\(" + (if (symbolp value) + (cdr (assq value nnmail-split-abbrev-alist)) + value) + "\\)\\>"))) + (push (cons split regexp) nnmail-split-cache) + ;; Now that it's in the cache, just call nnmail-split-it again + ;; on the same split, which will find it immediately in the cache. + (nnmail-split-it split)))))) (defun nnmail-expand-newtext (newtext) (let ((len (length newtext)) @@ -1325,14 +1353,14 @@ See the documentation for the variable `nnmail-split-fancy' for documentation." (unless (= beg pos) (push (substring newtext beg pos) expanded)) (when (< pos len) - ;; we hit a \, expand it. - (setq did-expand t) - (setq pos (1+ pos)) - (setq c (aref newtext pos)) + ;; We hit a \; expand it. + (setq did-expand t + pos (1+ pos) + c (aref newtext pos)) (if (not (or (= c ?\&) (and (>= c ?1) (<= c ?9)))) - ;; \ followed by some character we don't expand + ;; \ followed by some character we don't expand. (push (char-to-string c) expanded) ;; \& or \N (if (= c ?\&) @@ -1755,8 +1783,7 @@ If ARGS, PROMPT is used as an argument to `format'." (defun nnmail-purge-split-history (group) "Remove all instances of GROUP from `nnmail-split-history'." - (let ((history nnmail-split-history) - prev) + (let ((history nnmail-split-history)) (while history (setcar history (gnus-delete-if (lambda (e) (string= (car e) group)) (car history))) diff --git a/lisp/nnmh.el b/lisp/nnmh.el index c359e95..8aafd7d 100644 --- a/lisp/nnmh.el +++ b/lisp/nnmh.el @@ -242,13 +242,7 @@ (deffoo nnmh-request-expire-articles (articles newsgroup &optional server force) (nnmh-possibly-change-directory newsgroup server) - (let* ((active-articles - (mapcar - (function - (lambda (name) - (string-to-int name))) - (directory-files nnmh-current-directory nil "^[0-9]+$" t))) - (is-old t) + (let* ((is-old t) article rest mod-time) (nnheader-init-server-buffer) diff --git a/lisp/nntp.el b/lisp/nntp.el index 67eafb7..487c72d 100644 --- a/lisp/nntp.el +++ b/lisp/nntp.el @@ -45,13 +45,11 @@ (defvoo nntp-server-opened-hook '(nntp-send-mode-reader) "*Hook used for sending commands to the server at startup. The default value is `nntp-send-mode-reader', which makes an innd -server spawn an nnrpd server. Another useful function to put in this -hook might be `nntp-send-authinfo', which will prompt for a password -to allow posting from the server. Note that this is only necessary to -do on servers that use strict access control.") +server spawn an nnrpd server.") (defvoo nntp-authinfo-function 'nntp-send-authinfo - "Function used to send AUTHINFO to the server.") + "Function used to send AUTHINFO to the server. +It is called with no parameters.") (defvoo nntp-server-action-alist '(("nntpd 1\\.5\\.11t" @@ -181,6 +179,10 @@ server there that you can connect to. See also +(defvoo nntp-connection-timeout nil + "*Number of seconds to wait before an nntp connection times out. +If this variable is nil, which is the default, no timers are set.") + ;;; Internal variables. (defvar nntp-record-commands nil @@ -197,6 +199,7 @@ server there that you can connect to. See also (defvoo nntp-last-command-time nil) (defvoo nntp-last-command nil) (defvoo nntp-authinfo-password nil) +(defvoo nntp-authinfo-user nil) (defvar nntp-connection-list nil) @@ -234,8 +237,10 @@ server there that you can connect to. See also (save-excursion (set-buffer (get-buffer-create "*nntp-log*")) (goto-char (point-max)) - (insert (format-time-string "%Y%m%dT%H%M%S" (current-time)) - " " nntp-address " " string "\n"))) + (let ((time (current-time))) + (insert (format-time-string "%Y%m%dT%H%M%S" time) + "." (format "%03d" (/ (nth 2 time) 1000)) + " " nntp-address " " string "\n")))) (defsubst nntp-wait-for (process wait-for buffer &optional decode discard) "Wait for WAIT-FOR to arrive from PROCESS." @@ -392,18 +397,22 @@ server there that you can connect to. See also (nnoo-define-basics nntp) (defsubst nntp-next-result-arrived-p () - (let ((point (point))) - (cond - ((eq (following-char) ?2) - (if (re-search-forward "\n\\.\r?\n" nil t) - t - (goto-char point) - nil)) - ((looking-at "[34]") - (forward-line 1) - t) - (t - nil)))) + (cond + ;; A result that starts with a 2xx code is terminated by + ;; a line with only a "." on it. + ((eq (following-char) ?2) + (if (re-search-forward "\n\\.\r?\n" nil t) + t + nil)) + ;; A result that starts with a 3xx or 4xx code is terminated + ;; by a newline. + ((looking-at "[34]") + (if (search-forward "\n" nil t) + t + nil)) + ;; No result here. + (t + nil))) (deffoo nntp-retrieve-headers (articles &optional group server fetch-old) "Retrieve the headers of ARTICLES." @@ -540,7 +549,7 @@ server there that you can connect to. See also (nntp-inhibit-erase t) (map (apply 'vector articles)) (point 1) - article alist) + article) (set-buffer buf) (erase-buffer) ;; Send ARTICLE command. @@ -580,7 +589,7 @@ server there that you can connect to. See also (nnheader-message 6 "NNTP: Receiving articles...done")) ;; Now we have all the responses. We go through the results, - ;; washes it and copies it over to the server buffer. + ;; wash it and copy it over to the server buffer. (set-buffer nntp-server-buffer) (erase-buffer) (setq last-point (point-min)) @@ -679,6 +688,10 @@ server there that you can connect to. See also (ignore-errors (nntp-send-string process "QUIT") (unless (eq nntp-open-connection-function 'nntp-open-network-stream) + ;; Ok, this is evil, but when using telnet and stuff + ;; as the connection method, it's important that the + ;; QUIT command actually is sent out before we kill + ;; the process. (sleep-for 1)))) (when (buffer-name (process-buffer process)) (kill-buffer (process-buffer process))) @@ -742,33 +755,40 @@ reading." "Send the AUTHINFO to the nntp server. It will look in the \"~/.authinfo\" file for matching entries. If nothing suitable is found there, it will prompt for a user name -and a password." +and a password. + +If SEND-IF-FORCE, only send authinfo to the server if the +.authinfo file has the FORCE token." (let* ((list (gnus-parse-netrc nntp-authinfo-file)) (alist (gnus-netrc-machine list nntp-address)) (force (gnus-netrc-get alist "force")) - (user (gnus-netrc-get alist "login")) + (user (or (gnus-netrc-get alist "login") nntp-authinfo-user)) (passwd (gnus-netrc-get alist "password"))) (when (or (not send-if-force) force) - (nntp-send-command - "^3.*\r?\n" "AUTHINFO USER" - (or user (read-string (format "NNTP (%s) user name: " nntp-address)))) + (unless user + (setq user (read-string (format "NNTP (%s) user name: " nntp-address)) + nntp-authinfo-user user)) + (unless (member user '(nil "")) + (nntp-send-command "^3.*\r?\n" "AUTHINFO USER" user) + (when t ;???Should check if AUTHINFO succeeded (nntp-send-command "^2.*\r?\n" "AUTHINFO PASS" (or passwd nntp-authinfo-password (setq nntp-authinfo-password - (nnmail-read-passwd (format "NNTP (%s) password: " - nntp-address)))))))) + (nnmail-read-passwd (format "NNTP (%s@%s) password: " + user nntp-address)))))))))) (defun nntp-send-nosy-authinfo () "Send the AUTHINFO to the nntp server." - (nntp-send-command - "^3.*\r?\n" "AUTHINFO USER" - (read-string (format "NNTP (%s) user name: " nntp-address))) - (nntp-send-command - "^2.*\r?\n" "AUTHINFO PASS" - (nnmail-read-passwd "NNTP (%s) password: " nntp-address))) + (let ((user (read-string (format "NNTP (%s) user name: " nntp-address)))) + (unless (member user '(nil "")) + (nntp-send-command "^3.*\r?\n" "AUTHINFO USER" user) + (when t ;???Should check if AUTHINFO succeeded + (nntp-send-command "^2.*\r?\n" "AUTHINFO PASS" + (nnmail-read-passwd "NNTP (%s@%s) password: " + user nntp-address)))))) (defun nntp-send-authinfo-from-file () "Send the AUTHINFO to the nntp server. @@ -818,13 +838,24 @@ password contained in '~/.nntp-authinfo'." "Open a connection to PORT on ADDRESS delivering output to BUFFER." (run-hooks 'nntp-prepare-server-hook) (let* ((pbuffer (nntp-make-process-buffer buffer)) + (timer + (and nntp-connection-timeout + (nnheader-run-at-time + nntp-connection-timeout nil + `(lambda () + (when (buffer-name ,pbuffer) + (kill-buffer ,pbuffer)))))) (process (condition-case () - (let ((coding-system-for-read nntp-coding-system-for-read)) + (let ((coding-system-for-read nntp-coding-system-for-read) + (coding-system-for-write nntp-coding-system-for-write)) (funcall nntp-open-connection-function pbuffer)) (error nil) (quit nil)))) - (when process + (when timer + (nnheader-cancel-timer timer)) + (when (and (buffer-name pbuffer) + process) (process-kill-without-query process) (nntp-wait-for process "^.*\n" buffer nil t) (if (memq (process-status process) '(open run)) @@ -988,10 +1019,7 @@ password contained in '~/.nntp-authinfo'." (while (not (eobp)) (end-of-line) (delete-char 1) - (insert nntp-end-of-line)) - (forward-char -1) - (unless (eq (char-after (1- (point))) ?\r) - (insert "\r")))) + (insert nntp-end-of-line)))) (defun nntp-retrieve-headers-with-xover (articles &optional fetch-old) (set-buffer nntp-server-buffer) diff --git a/lisp/nnvirtual.el b/lisp/nnvirtual.el index d83356d..4829341 100644 --- a/lisp/nnvirtual.el +++ b/lisp/nnvirtual.el @@ -43,7 +43,7 @@ (nnoo-declare nnvirtual) -(defvoo nnvirtual-always-rescan nil +(defvoo nnvirtual-always-rescan t "*If non-nil, always scan groups for unread articles when entering a group. If this variable is nil (which is the default) and you read articles in a component group after the virtual group has been activated, the @@ -259,12 +259,14 @@ to virtual article number.") (setq nnvirtual-current-group nil) (nnheader-report 'nnvirtual "No component groups in %s" group)) (t + (setq nnvirtual-current-group group) (when (or (not dont-check) nnvirtual-always-rescan) (nnvirtual-create-mapping) (when nnvirtual-always-rescan - (nnvirtual-request-update-info group (gnus-get-info group)))) - (setq nnvirtual-current-group group) + (nnvirtual-request-update-info + (nnvirtual-current-group) + (gnus-get-info (nnvirtual-current-group))))) (nnheader-insert "211 %d 1 %d %s\n" nnvirtual-mapping-len nnvirtual-mapping-len group)))) @@ -272,9 +274,12 @@ to virtual article number.") (deffoo nnvirtual-request-type (group &optional article) (if (not article) 'unknown - (let ((mart (nnvirtual-map-article article))) - (when mart - (gnus-request-type (car mart) (cdr mart)))))) + (if (numberp article) + (let ((mart (nnvirtual-map-article article))) + (if mart + (gnus-request-type (car mart) (cdr mart)))) + (gnus-request-type + nnvirtual-last-accessed-component-group nil)))) (deffoo nnvirtual-request-update-mark (group article mark) (let* ((nart (nnvirtual-map-article article)) diff --git a/lisp/pop3-fma.el b/lisp/pop3-fma.el index 1dbad4c..e95c147 100644 --- a/lisp/pop3-fma.el +++ b/lisp/pop3-fma.el @@ -3,7 +3,7 @@ ;; Yasuo Okabe ;; Author: Tatsuya Ichikawa ;; Yasuo OKABE -;; Version: 1.00 +;; Version: 1.11 ;; Keywords: mail , gnus , pop3 ;; ;; SPECIAL THANKS @@ -41,12 +41,18 @@ ;; (require 'pop3-fma) ;; (setq pop3-fma-spool-file-alist ;; '( -;; "po:username0@mailhost0.your.domain0" -;; "po:username1@mailhost1.your.domain1" +;; ("po:username0@mailhost0.your.domain0" pass) +;; ("po:username1@mailhost1.your.domain1" apop) ;; : ;; : ;; )) ;; +;; pass means normal authentication USER/PASS. +;; apop means authentication using APOP. +;; +;; When using apop , Please set pop3-fma-movemail-type 'lisp. +;; movemail.exe does not work on APOP protocol. +;; ;; Variables ;; ;; pop3-fma-spool-file-alist ... Spool file alist of POP3 protocol @@ -84,7 +90,7 @@ :group 'mail :group 'news) -(defconst pop3-fma-version-number "1.00") +(defconst pop3-fma-version-number "1.11") (defconst pop3-fma-codename ;; "Feel the wind" ; 0.10 ;; "My home town" ; 0.11 @@ -92,9 +98,9 @@ ;; "Rock'n Roll city" ; 0.13 ;; "Money" ; 0.20 ;; "Still 19" ; 0.21 - "J boy" ; 1.00 -;; "Blood line" ; 0.xx -;; "Star ring" ; 0.xx +;; "J boy" ; 1.00 +;; "Blood line" ; 1.10 + "Star ring" ; 0.xx ;; "Goodbye Game" ; 0.xx ) (defconst pop3-fma-version (format "Multiple POP3 account utiliy for Gnus v%s - \"%s\"" @@ -105,9 +111,10 @@ "*Spool file to get mail using pop3 protocol. You should specify this variable like '( - \"po:user1@mailhost1\" - \"po:user2@mailhost2\" - )" + (\"po:user1@mailhost1\" type) + (\"po:user2@mailhost2\" type) + ) +Type must be pass or apop." :group 'pop3-fma :type 'alist) @@ -144,6 +151,7 @@ Please do not set this valiable non-nil if you do not use Meadow.") (defvar str nil) (defvar pop3-fma-movemail-options pop3-fma-movemail-arguments) (defvar spool nil) +(defvar movemail-output-buffer " *movemail-out*") (defun pop3-fma-init-message-hook () (add-hook 'message-send-hook 'pop3-fma-message-add-header)) @@ -167,30 +175,48 @@ Please do not set this valiable non-nil if you do not use Meadow.") (substring inbox (match-end (string-match "^po:" inbox)) (- (match-end (string-match "^.*@" inbox)) 1))) (pop3-mailhost - (substring inbox (match-end (string-match "^.*@" inbox))))) - (let ((pop3-password - (pop3-fma-read-passwd pop3-mailhost))) - (message "Checking new mail user %s at %s..." pop3-maildrop pop3-mailhost) - (if (and (eq system-type 'windows-nt) - (eq pop3-fma-movemail-type 'exe)) - (progn - (setenv "MAILHOST" pop3-mailhost) - (if (and (not (memq pop3-password pop3-fma-movemail-arguments)) - (not (memq (concat "po:" pop3-maildrop) pop3-fma-movemail-arguments))) + (substring inbox (match-end (string-match "^.*@" inbox)))) + (pop3-password + (pop3-fma-read-passwd (substring inbox (match-end (string-match "^.*@" inbox))))) + (pop3-authentication-scheme + (nth 1 (assoc inbox pop3-fma-spool-file-alist))) + (pop3-fma-movemail-type (pop3-fma-get-movemail-type inbox))) + (if (eq pop3-authentication-scheme 'pass) + (message "Checking new mail user %s at %s using USER/PASS ..." pop3-maildrop pop3-mailhost) + (message "Checking new mail user %s at %s using APOP ..." pop3-maildrop pop3-mailhost)) + (if (and (eq system-type 'windows-nt) + (eq pop3-fma-movemail-type 'exe)) + (progn + (setenv "MAILHOST" pop3-mailhost) + (if (and (not (memq pop3-password pop3-fma-movemail-arguments)) + (not (memq (concat "po:" pop3-maildrop) pop3-fma-movemail-arguments))) + (progn + (setq pop3-fma-movemail-arguments nil) + (setq pop3-fma-movemail-arguments + (append pop3-fma-movemail-options + (list + (concat "po:" pop3-maildrop) + crashbox + pop3-password))))) + (if (not (get-buffer movemail-output-buffer)) + (get-buffer-create movemail-output-buffer)) + (set-buffer movemail-output-buffer) + (erase-buffer) + (apply 'call-process (concat + exec-directory + pop3-fma-movemail-program) + nil movemail-output-buffer nil + pop3-fma-movemail-arguments) + (let ((string (buffer-string))) + (if (> (length string) 0) (progn - (setq pop3-fma-movemail-arguments nil) - (setq pop3-fma-movemail-arguments - (append pop3-fma-movemail-options - (list - (concat "po:" pop3-maildrop) - crashbox - pop3-password))))) - (apply 'call-process (concat - exec-directory - pop3-fma-movemail-program) - nil nil nil - pop3-fma-movemail-arguments)) - (pop3-movemail crashbox))))) + (if (y-or-n-p + (concat (substring string 0 + (- (length string) 1)) + " continue ??")) + nil + nil))))) + (pop3-movemail crashbox)))) (message "Checking new mail at %s ... " inbox) (call-process (concat exec-directory pop3-fma-movemail-program) nil @@ -231,17 +257,20 @@ Please do not set this valiable non-nil if you do not use Meadow.") (mapcar (lambda (x) (let ((pop3-maildrop - (substring x (match-end (string-match "^po:" x)) - (- (match-end (string-match "^.*@" x)) 1))) + (substring (car x) (match-end (string-match "^po:" (car x))) + (- (match-end (string-match "^.*@" (car x))) 1))) (pop3-mailhost - (substring x (match-end (string-match "^.*@" x))))) + (substring (car x) (match-end (string-match "^.*@" (car x)))))) (call-interactively 'pop3-fma-store-password))) pop3-fma-spool-file-alist) (setq nnmail-movemail-program 'pop3-fma-movemail) ;; (setq nnmail-spool-file pop3-fma-spool-file-alist)) (setq nnmail-spool-file (append pop3-fma-local-spool-file-alist - pop3-fma-spool-file-alist))) + (mapcar + (lambda (spool) + (car spool)) + pop3-fma-spool-file-alist)))) ;; (defun pop3-fma-read-noecho (prompt &optional stars) "Read a single line of text from user without echoing, and return it. @@ -288,7 +317,6 @@ Argument PROMPT ." ;; ;; Add your custom header. -;; (defun pop3-fma-add-custom-header (header string) (let ((delimline (progn (goto-char (point-min)) @@ -306,6 +334,13 @@ Argument PROMPT ." (setq hdr (concat str "\n")) (insert-string hdr))))) ;; +;; +(defun pop3-fma-get-movemail-type (inbox) + (if (eq (nth 1 (assoc inbox pop3-fma-spool-file-alist)) 'apop) + 'lisp + pop3-fma-movemail-type)) +;; (provide 'pop3-fma) ;; ;; pop3-fma.el ends here. + diff --git a/lisp/qp.el b/lisp/qp.el deleted file mode 100644 index 1ef4a77..0000000 --- a/lisp/qp.el +++ /dev/null @@ -1,90 +0,0 @@ -;;; qp.el --- Quoted-printable functions -;; Copyright (C) 1998 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 quoted-printable-encoding-characters - (mapcar 'identity "0123456789ABCDEF")) - -(defun quoted-printable-decode-region (from to) - "Decode quoted-printable in the region between FROM and TO." - (interactive "r") - (save-excursion - (goto-char from) - (while (search-forward "=" to t) - (cond ((eq (following-char) ?\n) - (delete-char -1) - (delete-char 1)) - ((and - (memq (following-char) quoted-printable-encoding-characters) - (memq (char-after (1+ (point))) - quoted-printable-encoding-characters)) - (subst-char-in-region - (1- (point)) (point) ?= - (string-to-number - (buffer-substring (point) (+ 2 (point))) - 16)) - (delete-char 2)) - ((looking-at "=") - (delete-char 1)) - ((message "Malformed MIME quoted-printable message")))))) - -(defun quoted-printable-decode-string (string) - "Decode the quoted-printable-encoded STRING and return the results." - (with-temp-buffer - (insert string) - (quoted-printable-decode-region (point-min) (point-max)) - (buffer-string))) - -(defun quoted-printable-encode-region (from to) - "QP-encode the region between FROM and TO." - (interactive "r") - (save-excursion - (save-restriction - (narrow-to-region from to) - (goto-char (point-min)) - (while (re-search-forward "[\000-\007\013\015-\037\200-\237=]" nil t) - (insert - (prog1 - (format "=%x" (char-after (1- (point)))) - (delete-char -1)))) - ;; Fold long lines. - (goto-char (point-min)) - (end-of-line) - (while (> (current-column) 72) - (beginning-of-line) - (forward-char 72) - (search-backward "=" (- (point) 2) t) - (insert "=\n") - (end-of-line))))) - -(defun quoted-printable-encode-string (string) - "QP-encode STRING and return the results." - (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/rfc1522.el b/lisp/rfc1522.el deleted file mode 100644 index 98c8ea8..0000000 --- a/lisp/rfc1522.el +++ /dev/null @@ -1,276 +0,0 @@ -;;; rfc1522.el --- Functions for encoding and decoding rfc1522 messages -;; Copyright (C) 1998 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: - -(require 'base64) -(require 'qp) -(require 'mm-util) - -(defvar rfc1522-header-encoding-alist - '(("Newsgroups" . nil) - ("Message-ID" . nil) - (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 RFC1522; -3) a charset, in which case it will be encoded as that charse; -4) `default', in which case the field will be encoded as the rest - of the article.") - -(defvar rfc1522-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 . Q) - (koi8-r . Q) - (iso-8859-7 . Q) - (iso-8859-8 . Q) - (iso-8859-9 . Q) - (iso-2022-jp . B) - (iso-2022-kr . B) - (gb2312 . 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 RFC1522 encodings. -Valid encodings are nil, `Q' and `B'.") - -(defvar rfc1522-encoding-function-alist - '((Q . rfc1522-q-encode-region) - (B . base64-encode-region) - (nil . ignore)) - "Alist of RFC1522 encodings to encoding functions.") - -(defvar rfc1522-q-encoding-alist - '(("\\(From\\|Cc\\|To\\|Bcc\||Reply-To\\):" . "[^-A-Za-z0-9!*+/=_]") - ("." . "[\000-\007\013\015-\037\200-\377=_?]")) - "Alist of header regexps and valid Q characters.") - -;;; -;;; Functions for encoding RFC1522 messages -;;; - -(defun rfc1522-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))) - -;;;###autoload -(defun rfc1522-encode-message-header () - "Encode the message header according to `rfc1522-header-encoding-alist'. -Should be called narrowed to the head of the message." - (interactive "*") - (when (featurep 'mule) - (save-excursion - (let ((alist rfc1522-header-encoding-alist) - elem method) - (while (not (eobp)) - (save-restriction - (rfc1522-narrow-to-field) - (when (find-non-ascii-charset-region (point-min) (point-max)) - ;; We found something that may perhaps be encoded. - (while (setq elem (pop alist)) - (when (or (and (stringp (car elem)) - (looking-at (car elem))) - (eq (car elem) t)) - (setq alist nil - method (cdr elem)))) - (when method - (cond - ((eq method 'mime) - (rfc1522-encode-region (point-min) (point-max))) - ;; Hm. - (t)))) - (goto-char (point-max)))))))) - -(defun rfc1522-encode-region (b e) - "Encode all encodable words in REGION." - (let (prev c start qstart qprev qend) - (save-excursion - (goto-char b) - (while (re-search-forward "[^ \t\n]+" nil t) - (save-restriction - (narrow-to-region (match-beginning 0) (match-end 0)) - (goto-char (setq start (point-min))) - (setq prev nil) - (while (not (eobp)) - (unless (eq (setq c (char-charset (following-char))) 'ascii) - (cond - ((eq c prev) - ) - ((null prev) - (setq qstart (or qstart start) - qend (point-max) - qprev c) - (setq prev c)) - (t - ;(rfc1522-encode start (setq start (point)) prev) - (setq prev c)))) - (forward-char 1))) - (when (and (not prev) qstart) - (rfc1522-encode qstart qend qprev) - (setq qstart nil))) - (when qstart - (rfc1522-encode qstart qend qprev) - (setq qstart nil))))) - -(defun rfc1522-encode-string (string) - "Encode words in STRING." - (with-temp-buffer - (insert string) - (rfc1522-encode-region (point-min) (point-max)) - (buffer-string))) - -(defun rfc1522-encode (b e charset) - "Encode the word in the region with CHARSET." - (let* ((mime-charset (mm-mule-charset-to-mime-charset charset)) - (encoding (cdr (assq mime-charset - rfc1522-charset-encoding-alist))) - (start (concat - "=?" (downcase (symbol-name mime-charset)) "?" - (downcase (symbol-name encoding)) "?"))) - (save-restriction - (narrow-to-region b e) - (insert - (prog1 - (mm-encode-coding-string (buffer-string) mime-charset) - (delete-region (point-min) (point-max)))) - (funcall (cdr (assq encoding rfc1522-encoding-function-alist)) - (point-min) (point-max)) - (goto-char (point-min)) - (insert start) - (goto-char (point-max)) - (insert "?=") - ;; Encoded words can't be more than 75 chars long, so we have to - ;; split the long ones up. - (end-of-line) - (while (> (current-column) 74) - (beginning-of-line) - (forward-char 73) - (insert "?=\n " start) - (end-of-line))))) - -(defun rfc1522-q-encode-region (b e) - "Encode the header contained in REGION with the Q encoding." - (save-excursion - (save-restriction - (narrow-to-region (goto-char b) e) - (let ((alist rfc1522-q-encoding-alist)) - (while alist - (when (looking-at (caar alist)) - (quoted-printable-encode-region b e nil (cdar alist)) - (subst-char-in-region (point-min) (point-max) ? ?_)) - (pop alist)))))) - -;;; -;;; Functions for decoding RFC1522 messages -;;; - -(defvar rfc1522-encoded-word-regexp - "=\\?\\([^][\000-\040()<>@,\;:\\\"/?.=]+\\)\\?\\(B\\|Q\\)\\?\\([!->@-~]+\\)\\?=") - -;;;###autoload -(defun rfc1522-decode-region (start end) - "Decode MIME-encoded words in region between START and END." - (interactive "r") - (save-excursion - (save-restriction - (narrow-to-region start end) - (goto-char (point-min)) - ;; Remove whitespace between encoded words. - (while (re-search-forward - (concat "\\(" rfc1522-encoded-word-regexp "\\)" - "\\(\n?[ \t]\\)+" - "\\(" rfc1522-encoded-word-regexp "\\)") - nil t) - (delete-region (goto-char (match-end 1)) (match-beginning 6))) - ;; Decode the encoded words. - (goto-char (point-min)) - (while (re-search-forward rfc1522-encoded-word-regexp nil t) - (insert (rfc1522-parse-and-decode - (prog1 - (match-string 0) - (delete-region (match-beginning 0) (match-end 0))))))))) - -;;;###autoload -(defun rfc1522-decode-string (string) - "Decode the quoted-printable-encoded STRING and return the results." - (with-temp-buffer - (insert string) - (inline - (rfc1522-decode-region (point-min) (point-max))) - (buffer-string))) - -(defun rfc1522-parse-and-decode (word) - "Decode WORD and return it if it is an encoded word. -Return WORD if not." - (if (not (string-match rfc1522-encoded-word-regexp word)) - word - (or - (condition-case nil - (rfc1522-decode - (match-string 1 word) - (upcase (match-string 2 word)) - (match-string 3 word)) - (error word)) - word))) - -(defun rfc1522-decode (charset encoding string) - "Decode STRING as an encoded text. -Valid ENCODINGs are \"B\" and \"Q\". -If your Emacs implementation can't decode CHARSET, it returns nil." - (let ((cs (mm-charset-to-coding-system charset))) - (when cs - (mm-decode-coding-string - (cond - ((equal "B" encoding) - (base64-decode string)) - ((equal "Q" encoding) - (quoted-printable-decode-string - (mm-replace-chars-in-string string ?_ ? ))) - (t (error "Invalid encoding: %s" encoding))) - cs)))) - -(provide 'rfc1522) - -;;; rfc1522.el ends here diff --git a/lisp/rfc2047.el b/lisp/rfc2047.el deleted file mode 100644 index 81241c2..0000000 --- a/lisp/rfc2047.el +++ /dev/null @@ -1,289 +0,0 @@ -;;; rfc2047.el --- Functions for encoding and decoding rfc2047 messages -;; Copyright (C) 1998 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: - -(require 'base64) -(require 'qp) -(require 'mm-util) - -(defvar rfc2047-unencoded-charsets '(ascii latin-iso8859-1) - "List of MULE charsets not to encode.") - -(defvar rfc2047-header-encoding-alist - '(("Newsgroups" . nil) - ("Message-ID" . nil) - (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 charse; -4) `default', in which case the field will be encoded as the rest - of the article.") - -(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 . Q) - (koi8-r . Q) - (iso-8859-7 . Q) - (iso-8859-8 . Q) - (iso-8859-9 . Q) - (iso-2022-jp . B) - (iso-2022-kr . B) - (gb2312 . 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 . base64-encode-region) - (nil . ignore)) - "Alist of RFC2047 encodings to encoding functions.") - -(defvar rfc2047-q-encoding-alist - '(("\\(From\\|Cc\\|To\\|Bcc\||Reply-To\\):" . "[^-A-Za-z0-9!*+/=_]") - ("." . "[\000-\007\013\015-\037\200-\377=_?]")) - "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))) - -;;;###autoload -(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 "*") - (when (featurep 'mule) - (save-excursion - (let ((alist rfc2047-header-encoding-alist) - elem method) - (while (not (eobp)) - (save-restriction - (rfc2047-narrow-to-field) - (when (rfc2047-encodable-p) - ;; We found something that may perhaps be encoded. - (while (setq elem (pop alist)) - (when (or (and (stringp (car elem)) - (looking-at (car elem))) - (eq (car elem) t)) - (setq alist nil - method (cdr elem)))) - (when method - (cond - ((eq method 'mime) - (rfc2047-encode-region (point-min) (point-max))) - ;; Hm. - (t)))) - (goto-char (point-max)))))))) - -(defun rfc2047-encodable-p () - "Say whether the current (narrowed) buffer contains characters that need encoding." - (let ((charsets (find-charset-region (point-min) (point-max))) - (cs rfc2047-unencoded-charsets) - found) - (while charsets - (unless (memq (pop charsets) cs) - (setq found t))) - found)) - -(defun rfc2047-encode-region (b e) - "Encode all encodable words in REGION." - (let (prev c start qstart qprev qend) - (save-excursion - (goto-char b) - (while (re-search-forward "[^ \t\n]+" nil t) - (save-restriction - (narrow-to-region (match-beginning 0) (match-end 0)) - (goto-char (setq start (point-min))) - (setq prev nil) - (while (not (eobp)) - (unless (eq (setq c (char-charset (following-char))) 'ascii) - (cond - ((eq c prev) - ) - ((null prev) - (setq qstart (or qstart start) - qend (point-max) - qprev c) - (setq prev c)) - (t - ;(rfc2047-encode start (setq start (point)) prev) - (setq prev c)))) - (forward-char 1))) - (when (and (not prev) qstart) - (rfc2047-encode qstart qend qprev) - (setq qstart nil))) - (when qstart - (rfc2047-encode qstart qend qprev) - (setq qstart nil))))) - -(defun rfc2047-encode-string (string) - "Encode words in STRING." - (with-temp-buffer - (insert string) - (rfc2047-encode-region (point-min) (point-max)) - (buffer-string))) - -(defun rfc2047-encode (b e charset) - "Encode the word in the region with CHARSET." - (let* ((mime-charset (mm-mule-charset-to-mime-charset charset)) - (encoding (cdr (assq mime-charset - rfc2047-charset-encoding-alist))) - (start (concat - "=?" (downcase (symbol-name mime-charset)) "?" - (downcase (symbol-name encoding)) "?"))) - (save-restriction - (narrow-to-region b e) - (insert - (prog1 - (mm-encode-coding-string (buffer-string) mime-charset) - (delete-region (point-min) (point-max)))) - (funcall (cdr (assq encoding rfc2047-encoding-function-alist)) - (point-min) (point-max)) - (goto-char (point-min)) - (insert start) - (goto-char (point-max)) - (insert "?=") - ;; Encoded words can't be more than 75 chars long, so we have to - ;; split the long ones up. - (end-of-line) - (while (> (current-column) 74) - (beginning-of-line) - (forward-char 73) - (insert "?=\n " start) - (end-of-line))))) - -(defun rfc2047-q-encode-region (b e) - "Encode the header contained in REGION with the Q encoding." - (save-excursion - (save-restriction - (narrow-to-region (goto-char b) e) - (let ((alist rfc2047-q-encoding-alist)) - (while alist - (when (looking-at (caar alist)) - (quoted-printable-encode-region b e nil (cdar alist)) - (subst-char-in-region (point-min) (point-max) ? ?_)) - (pop alist)))))) - -;;; -;;; Functions for decoding RFC2047 messages -;;; - -(defvar rfc2047-encoded-word-regexp - "=\\?\\([^][\000-\040()<>@,\;:\\\"/?.=]+\\)\\?\\(B\\|Q\\)\\?\\([!->@-~]+\\)\\?=") - -;;;###autoload -(defun rfc2047-decode-region (start end) - "Decode MIME-encoded words in region between START and END." - (interactive "r") - (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. - (goto-char (point-min)) - (while (re-search-forward rfc2047-encoded-word-regexp nil t) - (insert (rfc2047-parse-and-decode - (prog1 - (match-string 0) - (delete-region (match-beginning 0) (match-end 0))))))))) - -;;;###autoload -(defun rfc2047-decode-string (string) - "Decode the quoted-printable-encoded STRING and return the results." - (with-temp-buffer - (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-decode (charset encoding string) - "Decode STRING as an encoded text. -Valid ENCODINGs are \"B\" and \"Q\". -If your Emacs implementation can't decode CHARSET, it returns nil." - (let ((cs (mm-charset-to-coding-system charset))) - (when cs - (mm-decode-coding-string - (cond - ((equal "B" encoding) - (base64-decode 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/rfc2231.el b/lisp/rfc2231.el deleted file mode 100644 index 2998472..0000000 --- a/lisp/rfc2231.el +++ /dev/null @@ -1,142 +0,0 @@ -;;; rfc2231.el --- Functions for decoding rfc2231 headers -;; Copyright (C) 1998 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 'drums) - -(defun rfc2231-get-value (ct attribute) - "Return the value of ATTRIBUTE from CT." - (cdr (assq attribute (cdr ct)))) - -(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 (drums-token-to-list drums-text-token)) - (stoken (drums-token-to-list drums-tspecials)) - (ntoken (drums-token-to-list "0-9")) - (prev-value "") - display-name mailbox c display-string parameters - attribute value type subtype number encoded - prev-attribute) - (drums-init (mail-header-remove-whitespace - (mail-header-remove-comments string))) - (let ((table (copy-syntax-table drums-syntax-table))) - (modify-syntax-entry ?\' "w" table) - (set-syntax-table table)) - (setq c (following-char)) - (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 (following-char)) - (unless (eq c ?\;) - (error "Invalid header: %s" string)) - (forward-char 1) - (setq c (following-char)) - (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 (following-char)) - (setq encoded nil) - (when (eq c ?*) - (forward-char 1) - (setq c (following-char)) - (when (memq c ntoken) - (setq number - (string-to-number - (buffer-substring - (point) (progn (forward-sexp 1) (point))))) - (setq c (following-char)) - (when (eq c ?*) - (setq encoded t) - (forward-char 1) - (setq c (following-char))))) - ;; 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 (following-char)) - (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)) - - `(,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 (< (length elems) 1) - (not (equal (intern (car elems)) 'us-ascii))) - (mm-decode-coding-region (point-min) (point-max) - (intern (car elems)))) - (buffer-string)))) - -(provide 'rfc2231) - -;;; rfc2231.el ends here diff --git a/lisp/smtp.el b/lisp/smtp.el index 7dde447..3d2e113 100644 --- a/lisp/smtp.el +++ b/lisp/smtp.el @@ -361,7 +361,7 @@ don't define this value." (setq this-line-end (point)) (setq sending-data nil) (setq sending-data (buffer-substring this-line this-line-end)) - (if (/= (forward-line 1) 0) + (if (or (/= (forward-line 1) 0) (eobp)) (setq data-continue nil))) (smtp-send-data-1 process sending-data) diff --git a/lisp/time-date.el b/lisp/time-date.el deleted file mode 100644 index cd6f9e9..0000000 --- a/lisp/time-date.el +++ /dev/null @@ -1,138 +0,0 @@ -;;; time-date.el --- Date and time handling functions -;; Copyright (C) 1998 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Masanobu Umeda -;; 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 - (eval - '(if (not (string-match "XEmacs" emacs-version)) - (require 'parse-time) - - (require 'timezone) - (defun parse-time-string (date) - "Convert DATE into time." - (decode-time - (condition-case () - (let* ((d1 (timezone-parse-date date)) - (t1 (timezone-parse-time (aref d1 3)))) - (apply 'encode-time - (mapcar (lambda (el) - (and el (string-to-number el))) - (list - (aref t1 2) (aref t1 1) (aref t1 0) - (aref d1 2) (aref d1 1) (aref d1 0) - (number-to-string - (* 60 (timezone-zone-to-minute (aref d1 4)))))))) - ;; If we get an error, then we just return a 0 time. - (error (list 0 0)))))))) - -(defun date-to-time (date) - "Convert DATE into time." - (apply 'encode-time (parse-time-string date))) - -(defun time-to-float (time) - "Convert TIME to a floating point number." - (+ (* (car time) 65536.0) - (cadr time))) - -(defun float-to-time (float) - "Convert FLOAT (a floating point number) to an Emacs time structure." - (list (floor float 65536) - (floor (mod float 65536)))) - -(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-day (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-day (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 - -(provide 'time-date) - -;;; time-date.el ends here diff --git a/texi/ChangeLog b/texi/ChangeLog index 980c667..fd2879c 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,117 @@ +1998-08-27 07:29:17 Lars Magne Ingebrigtsen + + * gnus.texi (Mail Folders): Addition. + +1998-08-25 08:06:28 Lars Magne Ingebrigtsen + + * gnus.texi (Posting Styles): Document this-is. + (Virtual Groups): Addition. + +1998-08-18 00:30:05 Lars Magne Ingebrigtsen + + * gnus.texi (Article Hiding): Addition. + +1998-08-16 14:53:45 Lars Magne Ingebrigtsen + + * gnus.texi (NNTP): Reinstated. + (Asynchronous Fetching): No header prefetch. + +1998-08-15 13:01:41 Lars Magne Ingebrigtsen + + * gnus.texi (Summary Score Commands): Change. + +1998-08-14 01:31:36 Simon Josefsson + + * gnus.texi (Posting Styles): New 'body style. + +1998-08-13 21:17:00 Lars Magne Ingebrigtsen + + * gnus.texi (Paging the Article): Addition. + +1998-08-13 00:13:47 Simon Josefsson + + * gnus.texi (Mail Group Commands): Typo. + +1998-08-12 21:28:09 Simon Josefsson + + * gnus.texi (Article Caching): gnus-cacheable-groups. + (Newest Features): remove gnus-cacheable-groups. + +1998-08-12 22:01:12 Lars Magne Ingebrigtsen + + * message.texi (Forwarding): Addition. + +1998-08-11 20:33:53 Justin Zaglio + + * gnus.texi (Group Maintenance): Fix. + +1998-08-11 11:44:20 Lars Magne Ingebrigtsen + + * gnus.texi (Group Maintenance): Fix. + +1998-08-10 08:59:25 Lars Magne Ingebrigtsen + + * gnus.texi (Article Highlighting): Addition. + (Article Fontisizing): Fix. + (Article Hiding): Change. + (Article Hiding): Fix. + +1998-08-09 15:32:24 Lars Magne Ingebrigtsen + + * gnus.texi (Hiding Headers): Fix. + (Article Hiding): Addition. + (Document Groups): Addition. + +1998-08-08 06:06:37 Lars Magne Ingebrigtsen + + * gnus.texi (Fancy Mail Splitting): Change. + +1998-08-06 02:12:04 Lars Magne Ingebrigtsen + + * gnus.texi: De-legalize. + + * message.texi: De-legalize. + + * gnus.texi (Summary Maneuvering): Fix. + +1998-07-21 17:51 Simon Josefsson + + * gnus.texi (Splitting Mail): junk is fancy splitting only + + * gnus.texi (Fancy Mail Splitting): warn about junk + +1998-07-27 02:28:33 Lars Magne Ingebrigtsen + + * gnus.texi (Topic Commands): Fix. + +1998-07-27 02:23:17 Robert Bihlmeyer + + * gnus.texi (Score Decays): Fix. + +Sun Jul 12 04:03:27 1998 Lars Magne Ingebrigtsen + + * gnus.texi (Home Score File): Addition. + +Fri Jul 10 04:26:23 1998 Lars Magne Ingebrigtsen + + * gnus.texi (NNTP): Addition. + +Sat Jul 4 14:24:29 1998 Lars Magne Ingebrigtsen + + * gnus.texi (Gnus Utility Functions): Addition. + +Thu Jul 2 11:37:51 1998 Lars Magne Ingebrigtsen + + * gnus.texi (Posting Styles): Ununcommented. + +Wed Jul 1 17:57:54 1998 Lars Magne Ingebrigtsen + + * gnus.texi (Topic Commands): Addition. + +Tue Jun 30 16:11:27 1998 Lars Magne Ingebrigtsen + + * gnus.texi (Topic Commands): Addition. + Mon Jun 29 21:46:13 1998 Lars Magne Ingebrigtsen * gnus.texi (Article Keymap): Typo. @@ -278,7 +392,7 @@ Sat Sep 20 20:53:43 1997 Lars Magne Ingebrigtsen Wed Sep 17 02:32:56 1997 Lars Magne Ingebrigtsen - * gnus.texi (Customizing Threading): Broken up into five nodes. + * gnus.texi (Customizing Threading): Broken up into five nodes. (Article Washing): Addition. * message.texi (Various Commands): Add. @@ -305,7 +419,7 @@ Sat Jul 19 23:02:03 1997 Lars Magne Ingebrigtsen Sat Jul 12 16:29:35 1997 Lars Magne Ingebrigtsen - * gnus.texi (Picon Configuration): Moved Picons to under XEmacs. + * gnus.texi (Picon Configuration): Moved Picons to under XEmacs. (Smileys): New section. Fri Jul 11 11:58:20 1997 Lars Magne Ingebrigtsen @@ -487,7 +601,7 @@ Mon Feb 3 07:31:47 1997 Lars Magne Ingebrigtsen Mon Jan 27 17:51:29 1997 Lars Magne Ingebrigtsen * gnus.texi (Highlighting and Menus): Removed - `gnus-display-type'. + `gnus-display-type'. Sat Jan 25 08:09:30 1997 Lars Magne Ingebrigtsen @@ -610,7 +724,7 @@ Fri Oct 25 09:04:59 1996 Lars Magne Ingebrigtsen Wed Oct 23 08:28:29 1996 Hrvoje Niksic - * gnus.texi (Fancy Mail Splitting): Removed trailing garbage. + * gnus.texi (Fancy Mail Splitting): Removed trailing garbage. Tue Oct 22 07:36:02 1996 Lars Magne Ingebrigtsen @@ -888,4 +1002,3 @@ Mon Jul 29 10:12:24 1996 Lars Magne Ingebrigtsen (Advanced Scoring Example): New. (Advanced Scoring Syntax): New. (Advanced Scoring): New. - diff --git a/texi/Makefile.in b/texi/Makefile.in index c205abe..c54827f 100644 --- a/texi/Makefile.in +++ b/texi/Makefile.in @@ -16,8 +16,11 @@ PERL=perl INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ SHELL = /bin/sh +PAPERTYPE=a4 -all: gnus message +all: gnus message gnus-ja + +ja: gnus-ja message-ja most: texi2latex.elc latex latexps @@ -25,7 +28,7 @@ most: texi2latex.elc latex latexps .texi: if test $(MAKEINFO) = no; then \ - $(EMACSINFO) -eval '(find-file "$<")' $(XINFOSWI); \ + $(EMACSINFO) -eval '(find-file \"$<\")' $(XINFOSWI); \ else \ makeinfo -o $* $<; \ fi @@ -53,7 +56,7 @@ makeinfo: makeinfo -o message message.texi texi2latex.elc: texi2latex.el - $(EMACS) -batch -l bytecomp --eval '(byte-compile-file "texi2latex.el")' + $(EMACS) -batch -l bytecomp --eval '(byte-compile-file \"texi2latex.el\")' latex: gnus.texi texi2latex.elc $(EMACS) -batch -q -no-site-file gnus.texi -l ./texi2latex.elc -f latexi-translate @@ -73,7 +76,7 @@ latexps: cat postamble.tex >> gnus.tmplatexi $(LATEX) gnus.tmplatexi $(LATEX) gnus.tmplatexi - $(DVIPS) -f gnus.dvi > gnus.ps + $(DVIPS) -t $(PAPERTYPE) -f gnus.dvi > gnus.ps pss: make latex @@ -87,25 +90,25 @@ psout: latexboth: rm -f gnus-manual-a4.ps.gz gnus-manual-standard.ps.gz make latexps - mv /local/tmp/larsi/gnus.ps /local/tmp/larsi/gnus-manual-a4.ps - gzip /local/tmp/larsi/gnus-manual-a4.ps - sed 's/,a4paper//' gnus.latexi > gnus-standard.latexi + 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 - mv /local/tmp/larsi/gnus.ps /local/tmp/larsi/gnus-manual-standard.ps - gzip /local/tmp/larsi/gnus-manual-standard.ps + make latexps PAPERTYPE=letter + mv gnus.ps gnus-manual-standard.ps + gzip gnus-manual-standard.ps out: - cp /local/tmp/larsi/gnus-manual-standard.ps.gz \ - /local/tmp/larsi/gnus-manual-a4.ps.gz \ + cp gnus-manual-standard.ps.gz \ + gnus-manual-a4.ps.gz \ /local/ftp/pub/emacs/gnus/manual - mv /local/tmp/larsi/gnus-manual-standard.ps.gz \ - /local/tmp/larsi/gnus-manual-a4.ps.gz \ + mv gnus-manual-standard.ps.gz \ + gnus-manual-a4.ps.gz \ /hom/larsi/www_docs/www.gnus.org/documents veryclean: make clean - rm -f gnus.dvi gnus.ps + rm -f gnus.dvi gnus.ps texi2latex.elc distclean: make clean @@ -114,7 +117,7 @@ distclean: install: $(SHELL) $(top_srcdir)/mkinstalldirs $(infodir) - @for file in gnus message; do \ + @for file in gnus message gnus-ja message-ja; 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"; \ diff --git a/texi/emacs-mime.texi b/texi/emacs-mime.texi deleted file mode 100644 index f333fa5..0000000 --- a/texi/emacs-mime.texi +++ /dev/null @@ -1,755 +0,0 @@ -\input texinfo @c -*-texinfo-*- - -@setfilename message -@settitle Emacs MIME Manual -@synindex fn cp -@synindex vr cp -@synindex pg cp -@c @direntry -@c * Emacs MIME: (emacs-mime). The MIME de/composition library. -@c @end direntry -@iftex -@finalout -@end iftex -@setchapternewpage odd - -@ifinfo - -This file documents the Emacs MIME interface functionality. - -Copyright (C) 1996 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through Tex and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end ifinfo - -@tex - -@titlepage -@title Emacs MIME Manual - -@author by Lars Magne Ingebrigtsen -@page - -@vskip 0pt plus 1filll -Copyright @copyright{} 1998 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. - -@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 -* Basic Functions:: Utility and basic parsing functions. -* Decoding and Viewing:: A framework for decoding and viewing. -* Index:: Function and variable index. -@end menu - - -@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 -* mail-parse:: The generalized @sc{mime} and mail interface. -* rfc2231:: Parsing @code{Content-Type} headers. -* 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. -* mailcap:: How parts are displayed is specified by the @file{.mailcap} file -@end menu - - -@node mail-parse -@section mail-parse - -It is perhaps misleading to place the @code{mail-parse} library in this -chapter. It is not a basic low-level library---rather, it is an -abstraction over the actual low-level libraries that are described in the -subsequent sections. - -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\"") -=> ("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) -=> "b980912.gif" -@end example - -@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)") -=> "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\"") -=> "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)") -=> "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 ") -=> ("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 ") -=> (("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") -=> "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") -=> "This is naïve, baby" -@end example - -@end table - -Currently, @code{mail-parse} is an abstraction over @code{drums}, -@code{rfc2047} and @code{rfc2231}. These are documented in the -subsequent sections. - - -@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!\"") -=> ("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 return -the value of the specified attribute. - -@end table - - -@node drums -@section 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 drums-remove-comments -@findex drums-remove-comments -Remove the comments from the argument and return the results. - -@item drums-remove-whitespace -@findex drums-remove-whitespace -Remove linear white space from the string and return the results. -Spaces inside quoted strings and comments are left untouched. - -@item drums-get-comment -@findex drums-get-comment -Return the last most comment from the string. - -@item drums-parse-address -@findex drums-parse-address -Parse an address string and return a list that contains the mailbox and -the plain text name. - -@item drums-parse-addresses -@findex 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 drums-parse-date -@findex drums-parse-date -Parse a date string and return an Emacs time structure. - -@item drums-narrow-to-header -@findex 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 converts between five formats: A date string, an Emacs -time structure, a decoded time list, a second number, and a day number. - -The functions have quite self-explanatory names, so the following just -gives an overview of which functions are available. - -@example -(parse-time-string "Sat Sep 12 12:21:54 1998 +0200") -=> (54 21 12 12 9 1998 6 nil 7200) - -(date-to-time "Sat Sep 12 12:21:54 1998 +0200") -=> (13818 19266) - -(time-to-seconds '(13818 19266)) -=> 905595714.0 - -(seconds-to-time 905595714.0) -=> (13818 19266 0) - -(time-to-day '(13818 19266)) -=> 729644 - -(days-to-time 729644) -=> (961933 65536) - -(time-since '(13818 19266)) -=> (0 430) - -(time-less-p '(13818 19266) '(13818 19145)) -=> nil - -(subtract-time '(13818 19266) '(13818 19145)) -=> (0 121) - -(days-between "Sat Sep 12 12:21:54 1998 +0200" - "Sat Sep 07 12:21:54 1998 +0200") -=> 5 - -(date-leap-year-p 2000) -=> t - -(time-to-day-in-year '(13818 19266)) -=> 255 - -@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. - - - -@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 - -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 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/*; xv -8 %s -audio/x-pn-realaudio; rvplayer %s -@end example - -This says that all image files should be displayed with @samp{xv}, and -that realaudio files should be played by @samp{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 analyzation. - -@menu -* Dissection:: Analyzing a @sc{mime} message. -* Handles:: Handle manipulations. -* Display:: Displaying handles. -@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 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 Index -@chapter Index -@printindex cp - -@summarycontents -@contents -@bye - -@c End: diff --git a/texi/gnus-faq-ja.texi b/texi/gnus-faq-ja.texi new file mode 100644 index 0000000..31e588e --- /dev/null +++ b/texi/gnus-faq-ja.texi @@ -0,0 +1,468 @@ +@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 Semi-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(B +$B$7$F$$$k$N$G$"$l$P!"$"$J$?$O(B Semi-gnus $B$G%a%$%k$rFI$`$?$a$ND4::$r$O$8$a(B +$B$?$/$J$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$r!"(B APEL $B$,I,MW$K$J$j$^$9$,!"I,MW$J%P!<%8%g(B +$B%s$O(B FLIM / SEMI (WEMI) $B%Q%C%1!<%8Fb$N(B README $B$r;2>H$7$F$/$@$5$$!#(B + +Semi-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 +$B?<$/4X78$7$F$$$^$9!#(B $BI,$:!"(B Semi-gnus $B$N%P!<%8%g%s$K$"$C$?(B SEMI (WEMI) +$B$*$h$S(B FLIM $B$r;HMQ$7$F$/$@$5$$!#(B + +$B8=:_!"$+$J$j$N%O%$%Z!<%9$G%P!<%8%g%s$,>e$,$C$F$$$^$9!#(B CVS $B$N(B main trunk +(tag $BL5$7(B) $B$,0BDj%P!<%8%g%s$G$9!#(B + +@item +Q1.2: $BF~l=j$+$il=j$+$ie!#(B + +@item +XEmacs + +$B%P!<%8%g%s(B 20.2 $B0J>e$N(BMule $B5!G=IU$-(B + +@item +Meadow + +$B%P!<%8%g%s(B 1.00 $B0J>e!#(B(Mule for Windows $B$G$OF0$-$^$;$s!#(B) +@end itemize + +$B;32,9nH~$5$s(B $B:n$NHs8x<0$N(B +@file{semi-mule23@@1934-YYMMDD.tar.gz} $B$r;HMQ$9$l$P(B Mule 2.3 / Emacs +19.34 $B$G$OF0:n$9$k$G$7$g$&!#(B + +$B$3$l$O!"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: Semi-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 Semi-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 Semi-gnus $B$r;H$&$N$G$"$l$P!"(B +$B@'Hs;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} + +Semi-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 Semi-gnus +$B$r$$$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!#(B + +$BF~H$7$F2<$5$$!#(B + +@item +Q1.8: Semi-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: Semi-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 + +@item +bbdb/gnus-update-record $B$r(B gnus-article-prepare-hook $B$NBe$j$K(B +gnus-article-display-hook $B$KDI2C$9$k!#(B + +@end enumerate + +a $B$NJ}K!!"$*$h$S(B bbdb-user-mail-names $B$KBP1~$7$?(B BBDB 2.00.01 $B$KBP$9$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 Semi-gnus $B$NF0:n$,$*$+$7$/$J$C$?(B + +$BDL>o$NJQ?t$G$bF1MM$G$9$,!"(B Semi-gnus $B$G$OB?$/$N(B hook $B$K=i4|CM$,@_Dj$5$l(B +$B$F$$$^$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 Semi-gnus $B$,@5(B +$B>o$KF0:n$7$J$/$J$k>l9g$,$"$j$^$9!#(B($BFC$K(B Semi-gnus $B$N%P!<%8%g%s$,JQ$C$?>l(B +$B9g(B) + +$B$3$l$rKI$0$?$a$K$b!"(B Semi-gnus $B$K4X$9$k@_Dj$O$G$-$k$@$1(B ~/.gnus.el $BFb$G(B +$B9T$&$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!$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@@meadow.scphys.kyoto-u.ac.jp} $B$K6u$N%a%$(B +$B%k$rAw$C$F2<$5$$!#(B(Subject $B$bITMW$G$9!#(B) + +@item $B1Q8lMQ(B +@file{semi-gnus-en-unsubscribe@@meadow.scphys.kyoto-u.ac.jp} $B$K6u$N%a%$(B +$B%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? + +Semi-gnus $B$G$O!"MxMQMh$NB?$/$N%Q%C%1!<%8$G:NMQ$5$l$F$$(B +$B$k3+H/BN@)$O$C$F$/$/$@$5$$!#(B(Subject $B$bITMW$G$9!#(B) + +@item $B1Q8lMQ(B +@file{semi-gnus-en-help@@meadow.scphys.kyoto-u.ac.jp} $B$K6u$N%a!<%k$rAw$C(B +$B$F!"Aw$i$l$F$/$k%a!<%k$N;X<($K=>$C$F$/$@$5$$!#(B(Subject $B$bITMW$G$9!#(B) + +@end table + +@item +Q5.3: Semi-gnus $B$K4X$9$kJ}?K7hDj$O(B? + +Semi-gnus $B$N3+H/Ey$K4X$9$kJ}?K$N7hDj$OA4$F(B Semi-gnus-ja/en $B%a!<%j%s%0%j(B +$B%9%HFb$G9T$o$l$^$9!#(B $B3F%a%s%P!<$+$i$NDs0F$O%"%s%1!<%H$N7A$GDs0F$5$l7h5D(B +$B$5$l$^$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@@meadow.scphys.kyoto-u.ac.jp $B$b(B +$B$7$/$O(Bsemi-gnus-en@@meadow.scphys.kyoto-u.ac.jp $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-ja.texi b/texi/gnus-ja.texi index c0dee20..8d32fd1 100644 --- a/texi/gnus-ja.texi +++ b/texi/gnus-ja.texi @@ -1,7 +1,7 @@ \input texinfo @c -*-texinfo-*- @setfilename gnus-ja -@settitle Semi-gnus 6.7.7 Manual +@settitle Semi-gnus 6.8.19 Manual @synindex fn cp @synindex vr cp @synindex pg cp @@ -62,6 +62,8 @@ \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}{ @@ -318,8 +320,9 @@ results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). -$B$3$NCJMn$,H$5$l$^$;$s(B)$B!#(B @end ignore Permission is granted to copy and distribute modified versions of this @@ -342,7 +345,7 @@ into another language, under the above conditions for modified versions. @tex @titlepage -@title Semi-gnus 6.7.7 Manual +@title Semi-gnus 6.8.19 Manual @author by Lars Magne Ingebrigtsen @author by members of Semi-gnus mailing-list @@ -396,7 +399,7 @@ Semi-gnus $B$O!"Bg$-$J3($,F~$C$F$$$?$j$5$^$6$^$J7A<0$rMQ$$$?$j$7$F$$$k$A$g$C(B $B$J8@8l7w$r:9JL$7$^$;$s!#$"$"!"%/%j%s%4%s$NJ}$O(B Unicode Next Generation$B$r(B $B$*BT$A$/$@$5$$!#(B -$B$3$N@bL@=q$O(B Semi-gnus 6.7.7 $B$KBP1~$7$^$9!#(B +$B$3$N@bL@=q$O(B Semi-gnus 6.8.19 $B$KBP1~$7$^$9!#(B @end ifinfo @@ -408,7 +411,7 @@ Semi-gnus $B$O!"Bg$-$J3($,F~$C$F$$$?$j$5$^$6$^$J7A<0$rMQ$$$?$j$7$F$$$k$A$g$C(B @end iflatex Gnus $B$O(B GNU Emacs $B$N@h?JE*$G!"@bL@$N$"$k!"%+%9%?%^%$%:2DG=$G!"3HD%2DG=$J!"(B -$B%j%"%k%?%$%`$G$J$$%K%e!<%9%j!<%@$G$9!#(B +$B%j%"%k%?%$%`$G$J$$%K%e!<%9%j!<%@!<$G$9!#(B $B$*$*$C$H!#IT;W5D$J$3$H$K0JA0$K$b;w$?$h$&$J$3$H$rJ9$$$?$3$H$,$"$k$h$&$J5$(B $B$,$7$^$9!#??;w$r$7$?$HHsFq$5$l$J$$$&$A$K@bL@$r;O$a$^$7$g$&!'(B @@ -486,7 +489,7 @@ gnus-other-frame} $B$r;H$&$3$H$,$G$-$^$9!#(B @vindex gnus-select-method @c @head $BJQ?t(B @code{gnus-select-method} $B$O(B gnus $B$,$I$3$G%K%e!<%9$rC5$9$Y$-$+$r<((B -$B$7$F$$$^$9!#$3$NJQ?t$O$O$8$a$NMWAG$,(B@dfn{$B$I$N$h$&$K$7$F(B}$B!"#2HVL\$NMWAG$,(B +$B$7$F$$$^$9!#$3$NJQ?t$O$O$8$a$NMWAG$,(B@dfn{$B$I$N$h$&$K$7$F(B}$B!"(B2 $BHVL\$NMWAG$,(B @dfn{$B$I$3$G(B}$B$rI=$9%j%9%H$G$"$kI,MW$,$"$j$^$9!#$3$NJ}K!$O$"$J$?$N4pK\J}K!(B (native method) $B$K$J$j$^$9!#$3$NJ}K!$GA0$NF~NO$rBPOCE*$K;XDj$9$k$3$H$b$G$-$^$9! @section $B%5!<%P!<$,Mn$A$F$$$k(B @cindex server errors -$BI8=`(B (default) $B$N%5!<%P!<$,Mn$A$F$$$k$H$-$O!"EvA3(B gnus $B$N5/F0$K$$$/$D$+(B -$B$NLdBj$,H/@8$7$^$9!#$7$+$7!"%K%e!<%9%0%k!<%W$NB>$K$$$/$D$+%a!<%k$N%0%k!<(B -$B%W$,$"$l$P!"$=$l$K$b$+$+$o$i$:(B gnus $B$r5/F0$7$?$$$H;W$&$+$b$7$l$^$;$s!#(B +$B=i4|@_Dj(B (default) $B$N%5!<%P!<$,Mn$A$F$$$k$H$-$O!"EvA3(B gnus $B$N5/F0$K$$$/(B +$B$D$+$NLdBj$,H/@8$7$^$9!#$7$+$7!"%K%e!<%9%0%k!<%W$NB>$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$OuBV$K$7$^$9!J4pK\%0%k!<%W$G$J$$%0%k!<%W$O$=$N#2$D$N%l%Y%k$K$7$F$*$/$N(B -$B$,K>$^$7$$$G$7$g$&!K!#(B +$B%k$@$1$rFI$_$?$$$H$-$O!"(Bgnus $B$r5/F0$9$k$N$K!"(B@code{gnus-no-server} $BL?Na(B +$B$r;H$&$3$H$,$G$-$^$9!#5^$$$G$$$k$H$-$K$b$T$C$?$j$G$7$g$&!#$3$NL?Na$OK\Mh(B +$B$N%5!<%P!<$K$O@\B3$7$^$;$s!=!=$=$NBe$o$j$K!"%l%Y%k(B 1 $B$H(B 2 $B$K$"$k$9$Y$F$N(B +$B%0%k!<%W$r3hF0>uBV$K$7$^$9!J4pK\%0%k!<%W$G$J$$%0%k!<%W$O$=$N(B 2 $B$D$N%l%Y(B +$B%k$K$7$F$*$/$N$,K>$^$7$$$G$7$g$&!K!#(B @node Slave Gnusae @section gnus $B$r%9%l!<%V$K$9$k(B @cindex slave -$B$"$J$?$O#2$D0J>e$N(B Emacs $B$H!"#2$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!JNc$($P!"#2(B -$B$D$N0c$C$?%5!<%P!<$+$iFI$_9~$`$?$a$K!"#2$D$N0c$C$?(B gnus $B$rF0:n$5$;$F$$$k(B +$B$"$J$?$O(B 2 $B$D0J>e$N(B Emacs $B$H!"(B2 $B$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!JNc$($P!"(B2 +$B$D$N0c$C$?%5!<%P!<$+$iFI$_9~$`$?$a$K!"(B2 $B$D$N0c$C$?(B gnus $B$rF0:n$5$;$F$$$k(B $B>l9g!K!"$^$C$?$/LdBj$O$"$j$^$;$s!#$=$l$r9T$($PNI$$$@$1$G$9!#(B $BLdBj$O!"F1$8(B @code{.newsrc} $B%U%!%$%k$r;H$$D$N(B gnus $B$rF0$+$=$&$H$7$?$H(B @@ -680,18 +683,18 @@ Messages})$B!#(B @node Checking New Groups @subsection $B?7$7$$%0%k!<%W$rD4$Y$k(B -Gnus $B$O!"IaDL$O%0%k!<%W$,?7$7$$$+$I$&$+$r!"9XFI$7$F$$$k%0%k!<%W$H:o=|$5$l(B -$B$F$$$k%0%k!<%W$N%j%9%H$H8=>u%U%!%$%k(B (active file) $B$rHf3S$9$k$3$H$K$h$j7h(B -$BDj$7$F$$$^$9!#$3$NJ}K!$OFC$KB.$$$H$$$&$o$1$G$O$"$j$^$;$s!#(B -@code{gnus-check-new-newsgroups} $B$,(B @code{ask-server} $B$G$"$k$H!"(Bgnus $B$O%5!<(B -$B%P!<$K!":G8e$K@\B3$7$F$+$i?7$7$$%0%k!<%W$,$G$-$F$$$k$+$I$&$+$r?R$M$^$9!#$3(B -$B$NJ}K!$OB.$$$7!"0B>e$,$j$G$9!#$3$l$K$h$j!":o=|$5$l$?%0%k!<%W$N%j%9%H$rJ];}(B -$B$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%#%9(B -$B%/>CHqNL$b>/$J$/$J$j$^$9!#$=$l$J$i!"$I$&$7$F$3$l$,I8=`(B (default) $B$G$O$J$$(B -$B$N$G$7$g$&!);DG0$J$,$i!"$9$Y$F$N%5!<%P!<$,$3$NL?Na$rM}2r$9$k$o$1$G$O$J$$$N(B -$B$G$9!#(B +Gnus $B$O!"IaDL$O%0%k!<%W$,?7$7$$$+$I$&$+$r!"9XFI$7$F$$$k%0%k!<%W$H:o=|$5(B +$B$l$F$$$k%0%k!<%W$N%j%9%H$H8=>u%U%!%$%k(B (active file) $B$rHf3S$9$k$3$H$K$h(B +$B$j7hDj$7$F$$$^$9!#$3$NJ}K!$OFC$KB.$$$H$$$&$o$1$G$O$"$j$^$;$s!#(B +@code{gnus-check-new-newsgroups} $B$,(B @code{ask-server} $B$G$"$k$H!"(Bgnus $B$O(B +$B%5!<%P!<$K!":G8e$K@\B3$7$F$+$i?7$7$$%0%k!<%W$,$G$-$F$$$k$+$I$&$+$r?R$M$^(B +$B$9!#$3$NJ}K!$OB.$$$7!"0B>e$,$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(B (default) +$B$G$O$J$$$N$G$7$g$&!);DG0$J$,$i!"$9$Y$F$N%5!<%P!<$,$3$NL?Na$rM}2r$9$k$o$1(B +$B$G$O$J$$$N$G$9!#(B $B;d$O:#$"$J$?$,2?$r9M$($F$$$k$+$rEv$F$i$l$^$9!#$I$&$9$l$P%5!<%P!<$,(B @code{ask-server} $B$rM}2r$9$k$+$,$o$+$k$N$G$7$g$&!)$(!"0c$&$N$G$9$+!)$"$!!"(B @@ -730,9 +733,10 @@ Gnus $B$O!"IaDL$O%0%k!<%W$,?7$7$$$+$I$&$+$r!"9XFI$7$F$$$k%0%k!<%W$H:o=|$5$l(B @item gnus-subscribe-zombies @vindex gnus-subscribe-zombies -$B$9$Y$F$N?7$7$$%0%k!<%W$r%>%s%S(B (zombie) $B$K$7$^$9!#$3$l$,I8=`(B (default) $B$K(B -$B$J$C$F$$$^$9!#8e$G%>%s%S$r(B (@kbd{A z} $B$K$h$C$F(B) $B354Q$7$?$j!"!J(B@kbd{S z} $B$K(B -$B$h$C$F!KE,@Z$KA4$F$r:o=|$7$?$j!"!J(B@kbd{u} $B$K$h$C$F!K9XFI$7$?$j$G$-$^$9!#(B +$B$9$Y$F$N?7$7$$%0%k!<%W$r%>%s%S(B (zombie) $B$K$7$^$9!#$3$l$,=i4|@_Dj(B +(default) $B$K$J$C$F$$$^$9!#8e$G%>%s%S$r(B (@kbd{A z} $B$K$h$C$F(B) $B354Q$7$?$j!"(B +$B!J(B@kbd{S z} $B$K$h$C$F!KE,@Z$KA4$F$r:o=|$7$?$j!"!J(B@kbd{u} $B$K$h$C$F!K9XFI$7(B +$B$?$j$G$-$^$9!#(B @item gnus-subscribe-randomly @vindex gnus-subscribe-randomly @@ -980,6 +984,11 @@ gnus $B$O%U%!%$%k(B@file{.newsrc} $B$NCV$+$l$F$$$k%G%#%l%/%H%j(B ($B$3$l$OI $BMQu%U%!%$%k(B @@ -1014,7 +1023,7 @@ Gnus $B$O5/F0$7$?$H$-$d!"u$G$O!"%K%e!<%:$r(B 2400bps $B0J>e$N%b%G%`$rDL$7(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$be;J$K5$IU$+$l$K$/$/$J$k$G(B +$B$9$l$P!";E;v$NBe$o$j$K%K%e!<%9$rFI$s$G$$$k$N$r>e;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 @@ -1137,7 +1146,7 @@ gnus $B$,@8$-$F$$$k8B$j7h$7$F>C$5$l$k$3$H$O$"$j$^$;$s!#(B * Listing Groups:: Gnus $B$O%0%k!<%W$r$$$m$$$m$JJ,$1J}$GI=<($G$-$^$9!#(B * Sorting Groups:: $B%0%k!<%W$N=gHV$NG[CVBX$(!#(B * Group Maintenance:: $B$-$l$$$J(B @file{.newsrc} $B$NJ]$AJ}!#(B -* Browse Foreign Server:: $B%5!<%P$r%V%i%&%:$G$-$^$9!#2?$,FI$a$k$N$+8+$F$_$h$&!#(B +* Browse Foreign Server:: $B%5!<%P$r354Q$G$-$k!#2?$,FI$a$k$N$+8+$F$_$h$&!#(B * Exiting Gnus:: $B%K%e!<%9FI$`$N$r$d$a$F!";E;v$r$7$h$&!#(B * Group Topics:: $B%0%k!<%W$r@Z$j:.$<$F!"%H%T%C%/$4$H$KJ,3d$9$k!#(B * Misc Group Stuff:: $BB>$K$G$-$k$3$H!#(B @@ -1234,7 +1243,7 @@ gnus $B$,$=$l$rD4$Y$k$3$H$O$"$j$^$;$s!#(BGnus $B$OI,MW$H$9$kA4$F$NpJs$r!"% $B%0%k!<%WL>!#(B @item D -$B%K%e!<%:%0%k!<%W$N@bL@!#(B +$B%K%e!<%9%0%k!<%W$N@bL@!#(B @item o $B%b%G%l!<%F%C%I$N>l9g(B @samp{m}. @@ -1289,15 +1298,15 @@ gnus $B$,$=$l$rD4$Y$k$3$H$O$"$j$^$;$s!#(BGnus $B$OI,MW$H$9$kA4$F$NpJs$r!"% @cindex group modeline @vindex gnus-group-mode-line-format -$B%b!<%I9T$O(B @code{gnus-group-mode-line-format} (@pxref{Formatting -Variables}) $B$r@_Dj$9$k$3$H$GJQ99$G$-$^$9!#$3$$$D$O;XDjJ8;z$r$"$s(B -$B$^$j$?$/$5$sCN$C$F$^$;$s!#(B +$B%b!<%I9T$O(B @code{gnus-group-mode-line-format} (@pxref{Mode Line +Formatting}) $B$r@_Dj$9$k$3$H$GJQ99$G$-$^$9!#$3$$$D$O;XDjJ8;z$r$"$s$^$j$?(B +$B$/$5$sCN$C$F$^$;$s!#(B @table @samp @item S -$B%M%$%F%#%V$N%K%e!<%9%5!<%P!#(B +$B4pK\%K%e!<%9%5!<%P! unread 200) . my-group-face-1) @@ -1919,7 +1933,7 @@ kiboze $B%0%k!<%W$r:n@.$7$^$9!#%W%m%s%W%H$GL>A0$H!"(Bkiboze $B%0%k!<%W$K!V4^$ @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!<%:%0%k!<%W$G$"$k(B +$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}. @@ -1937,6 +1951,13 @@ kiboze $B%0%k!<%W$r:n@.$7$^$9!#%W%m%s%W%H$GL>A0$H!"(Bkiboze $B%0%k!<%W$K!V4^$ $B$J$7$G$3$N%3%^%s%I$r.$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 +$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 @@ -2011,7 +2034,7 @@ alt.sysadmin.recovery shaving} $B$N$h$&$J%^%C%A$9$kJ8;zNs$rMQ$$$k$3$H$K$h$C(B @table @code @item to-address @cindex to-address -$B%U%)%m!<%"%C%W$H%K%e!<%:$X$NEj9F$r$9$k$H$-$K;HMQ$5$l$k%"%I%l%9!#(B +$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") @@ -2025,8 +2048,8 @@ alt.sysadmin.recovery shaving} $B$N$h$&$J%^%C%A$9$kJ8;zNs$rMQ$$$k$3$H$K$h$C(B @code{to-address} $B$r;XDj$9$k$H!"$=$N%0%k!<%W$,30It%0%k!<%W$G$"$k$+$I$&$+(B $B$K4X$o$i$:M-8z$K$J$j$^$9!#Nc$($P(B @samp{fa.4ad-l} $B$H$$$&%0%k!<%W$,%5!<%P(B -$B>e$K$"$C$?$H$7$^$7$g$&!#$3$l$OK\Ev$N%K%e!<%:%0%k!<%W$G$9$,!"%5!<%P$O%a!<(B -$B%k%K%e!<%:%2!<%H%&%'%$$rDL$7$F5-;v$re$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 @@ -2038,7 +2061,7 @@ alt.sysadmin.recovery shaving} $B$N$h$&$J%^%C%A$9$kJ8;zNs$rMQ$$$k$3$H$K$h$C(B (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$3$l$O%U%)%m!<%"%C%W$r$7$?$H$-$O40A4$KL5;k$5$l$^$9!=!=Nc30$O$=$l$,%K%e!<%9(B $B%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!<%k(B $B$,E,MQ$5$l$k$H$$$&$3$H$G$9!#(B @@ -2074,8 +2097,8 @@ alt.sysadmin.recovery shaving} $B$N$h$&$J%^%C%A$9$kJ8;zNs$rMQ$$$k$3$H$K$h$C(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$N(B -$B%l%9%]%s%9$r%K%e!<%:5-;v$KBP$9$k%l%9%]%s%9$G$"$k$+$N$h$&$K07$$$^$9!#$3$l$O(B -$B%s%S$H$7$F9XFI$7$^(B +$B$9!#(B @item C-c C-x @kindex C-c C-x (Group) @@ -2687,9 +2713,15 @@ Gnus @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!#$3$N%3%^%s%I$O%W%m%;%9%^!<%/!&(B -$B%W%l%U%#%C%/%9%k!<%k$K=>$$$^$9(B (@pxref{Process/Prefix})$B!#(B +$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) @@ -2734,18 +2766,25 @@ Gnus $B%W$,I=<($5$l$^$9!#(B @item T TAB +@itemx TAB @kindex T TAB (Topic) +@kindex TAB (Topic) @findex gnus-topic-indent -$B8=:_$N%H%T%C%/$N!X;z2<$2!Y$r9T$$!"$=$NA0$N%H%T%C%/$NI{%H%T%C%/$K$7$^$9(B -(@code{gnus-topic-indent})$B!#%W%l%U%#%C%/%9$rM?$($k$H!"H?BP$K$=$N%H%T%C%/$N(B -$B;z2<$2$rLa$7$^$9!#(B +$B8=:_$N%H%T%C%/$N(B ``$B;z2<$2(B'' $B$r9T$$!"$=$NA0$N%H%T%C%/$NI{%H%T%C%/$K$7$^$9(B +(@code{gnus-topic-indent})$B!#@\F,0z?t$rM?$($k$H!"H?BP$K$=$N%H%T%C%/(B +$B$N;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 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!#%H%T%C%/Fb$K$"$C$?%0%k!<%W$bA4$F!"(B -$B%H%T%C%/$H0l=o$K:o=|$5$l$^$9!#(B +$B%0%k!<%W$"$k$$$O%H%T%C%/$r(B kill $B$7$^$9(B(@code{gnus-topic-kill-group})$B!#%H(B +$B%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) @@ -2917,7 +2956,7 @@ Gnus $B%W$KF~$C$?$H$-!"(B@file{relief.SCORE} $B$,4pK\%9%3%"%U%!%$%k$H$J$j$^(B $B$9!#$b$7(B @samp{Emacs} $B%H%T%C%/$NF1$8%0%k!<%W$KF~$k$H!"(B @file{emacs.SCORE} $B$,4pK\%9%3%"%U%!%$%k$K$J$k$G$7$g$&!#(B -@samp{alt.religion.emacs} $B%0%k!<%W$KF~$l$P!"(B +@* @samp{alt.religion.emacs} $B%0%k!<%W$KF~$l$P!"(B @file{religion.SCORE} $B$,4pK\%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!)$^$"!"$=$NDL$j$G$9!#(B @@ -3031,11 +3070,11 @@ Gnus $B$r%j%9%?!<%H$7$^$9(B (@code{gnus-group-restart})$B!#$3$l$O(B @end table @vindex gnus-get-new-news-hook -@code{gnus-get-new-news-hook} $B$O?7Ce%K%e!<%:$r%A%'%C%/$9$kD>A0$K(B +@code{gnus-get-new-news-hook} $B$O?7Ce%K%e!<%9$r%A%'%C%/$9$kD>A0$K(B $Be$G$"$l$P(B @samp{+} $B$G!"%G%#%U%)(B $B%k%H$N%l%Y%k$h$j$b2<$G$"$l$P(B @samp{-} $B$G$9!#(B -@code{gnus-summary-default-zcore}$B$H$N:9$,(B@code{gnus-summary-zcore-fuzz} +@code{gnus-summary-default-score} $B$H$N:9$,(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 @@ -3373,9 +3412,9 @@ Gnus $B$OJQ?t(B @code{gnus-extract-address-components} $B$NCM$r(B @code{From @subsection $B35N,%P%C%U%!$N%b!<%I9T(B @vindex gnus-summary-mode-line-format -$B35N,$N%b!<%I9T$NMM<0$bJQ99$9$k$3$H$,$G$-$^$9!#(B -@code{gnus-summary-mode-line-format} $B$r2?$G$b9%$-$J$b$N$KJQ99$7$F$/$@$5(B -$B$$!#%G%#%U%)%k%H$O(B @samp{Gnus: %%b [%A] %Z} $B$G$9!#(B +$B35N,$N%b!<%I9T$NMM<0$bJQ99$9$k$3$H$,$G$-$^$9(B (@pxref{Mode Line +Formatting})$B!#(B@code{gnus-summary-mode-line-format} $B$r2?$G$b9%$-$J$b$N$K(B +$BJQ99$7$F$/$@$5$$!#%G%#%U%)%k%H$O(B @samp{Gnus: %%b [%A] %Z} $B$G$9!#(B $B0J2<$,$"$J$?$,M7$V$3$H$N$G$-$k$=$l$>$l$NMWAG$G$9!'(B @@ -3386,6 +3425,8 @@ Gnus $B$OJQ?t(B @code{gnus-extract-address-components} $B$NCM$r(B @code{From $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 @@ -3516,10 +3557,12 @@ Gnus $B$,\:Y$O(B @code{gnus-summary-gather-subject-limit} $B$r8+$F$/$@$5$$(B -(@pxref{Customizing Threading} $B$b;2>H$7$F$/$@$5$$(B)$B!#!K$3$NJQ?t$O!"%9%l%C(B -$B%II=<($r9T$C$F$$$k$H$-$O$"$^$jLr$KN)$?$J$$$G$7$g$&!#(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 +(@pxref{Customizing Threading} $B$b;2>H$7$F$/$@$5$$(B)$B!#(B) $BF1$8I=Bj$N5-;v$,L5(B +$B$$$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 @@ -3677,18 +3720,23 @@ Gnus $B$,l9g$O(B -$BAw$7$^$9(B +$B8=:_$N5-;v$r%K%e!<%9%0%k!<%W$KE>Aw$7$^$9(B (@code{gnus-summary-post-forward})$B!#@\F,0z?t$,M?$($i$l$?$H$-$O!"E>Aw5-;v(B $B$N%X%C%@!<$r40A4$KC$9$3$H$O$G$-$J$$$N$G$9$,!"%K%e!<%:$NEj9F$OC$9(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 @@ -4322,10 +4370,13 @@ Prefixes})$B!#(B @itemx # @kindex # $B!J35N,!K(B @kindex M P p $B!J35N,!K(B -@findex gnus-symmary-mark-as-processable -$B8=:_$N5-;v$K%W%m%;%90u$rIU$1$^$9(B -(@code{gnus-summary-mark-as-processable})$B!#(B -@findex gnus-summary-unmark-as-processable +@findex gnus-pick-unmark-article-or-thread +$B%9%l%C%I$+5-;v$rL$A*Br$K$7$^$9(B +@code{gnus-pick-unmark-article-or-thread})$B!#JQ?t(B +@code{gnus-thread-hide-subtree} $B$,(B true $B$G$"$l$P!"$3$N%-!<$O%9%l%C%I$N:G(B +$B=i$N5-;v$G;H$o$l$?$H$-$O%9%l%C%I$rL$A*Br$K$7$^$9!#$=$&$G$J$$>l9g$O!"$=$N(B +$B5-;v$@$1$rL$A*Br$K$7$^$9!#$=$N9T$N%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 M P u @itemx M-# @@ -4596,7 +4647,7 @@ Gnus $B$O%G%#%U%)%k%H$G5-;v$r%9%l%C%I$K$7$^$9!#(B@dfn{$B%9%l%C%I$K$9$k(B} $ @node Loose Threads -@subsection $BL5B+G{%9%l%C%I(B +@subsubsection $BL5B+G{%9%l%C%I(B @cindex < @cindex > @cindex loose threads @@ -4661,7 +4712,7 @@ Gnus $B$OZ$7$^$9(B -$B$,!"$3$o$l$?%K%e!<%:%j!<%@!<$GEj9F$7$?5-;v$OE,@Z$K=8$a$i$l$J$$$H$$$&$3$H$G(B +$B$,!"$3$o$l$?%K%e!<%9%j!<%@!<$GEj9F$7$?5-;v$OE,@Z$K=8$a$i$l$J$$$H$$$&$3$H$G(B $B$b$"$j$^$9!#A*Br8"$O$"$J$?$K$"$j$^$9!=!=1VIB$+%3%l%i$+!#(B @table @code @@ -4807,7 +4858,7 @@ gnus $B$OA4$F$N5-;v$N40A4$J(B @code{References} $BMs$r8+$F!"F1$8%9%l%C%I$KB0$ @node More Threading -@subsection $B$b$C$H%9%l%C%I$r(B +@subsubsection $B$b$C$H%9%l%C%I$r(B @table @code @item gnus-show-threads @@ -4846,7 +4897,7 @@ gnus $B$OA4$F$N5-;v$N40A4$J(B @code{References} $BMs$r8+$F!"F1$8%9%l%C%I$KB0$ @node Low-Level Threading -@subsection $BDc%l%Y%k$K$*$1$k%9%l%C%I:n@.(B +@subsubsection $BDc%l%Y%k$K$*$1$k%9%l%C%I:n@.(B @table @code @@ -4944,8 +4995,8 @@ gnus $B$OA4$F$N5-;v$N40A4$J(B @code{References} $BMs$r8+$F!"F1$8%9%l%C%I$KB0$ $B$9$Y$F$N1#$5$l$F$$$k%9%l%C%I$rI=<($7$^$9(B (@code{gnus-summary-show-all-threads})$B!#(B -@item T H -@kindex T H $B!J35N,!K(B +@item T h +@kindex T h $B!J35N,!K(B @findex gnus-summary-hide-all-threads $B$9$Y$F$N%9%l%C%I$r1#$7$^$9(B (@code{gnus-summary-hide-all-threads})$B!#(B @@ -5174,9 +5225,9 @@ Gnus $B$O$"$J$?$,FI$`$G$"$m$&5-;v$h$j$b$?$/$5$s$N5-;v$rl=j$K%-%c%C%7%e$9$k$N$O0UL#$NL5(B -$B$$;v$G$9!#$"$J$?$,#2G\$NMFNL$r;H$&;v$,NI$$$H46$8$J$$8B$j$O!#%-%c%C%7%e$r@)(B -$B8B$9$k$?$a$K!"@55,I=8=(B @code{gnus-uncacheable-groups} $B$rNc$($P(B -@samp{^nnml} $B$H@_Dj$7$F$/$@$5$$!#$3$NJQ?t$O%G%#%U%)%k%H$G$O(B @code{nil} $B$G(B -$B$9!#(B +$B$$;v$G$9!#$"$J$?$,#2G\$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-uncacheable-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=8=(B +@code{gnus-uncacheable-group} $B$rNc$($P!"(B@samp{^nnml} $B$K@_Dj$7$F2<$5$$!#(B +$BN>J}$NJQ?t$N=i4|CM$O(B @code{nil} $B$G$9!#$b$7%0%k!<%W$,N>J}$N@55,I=8=$K9gCW(B +$B$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 @@ -5254,11 +5309,11 @@ gnus-cache-generate-nov-databases} $B$O$9$Y$F$N(B @sc{nov} $B%U%!%$%k$r!J:F!K $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$Y$-$G$7$g(B -$B$&!#%K%e!<%:%5!<%P!<$K$*$1$k4|8B:o=|$K$O1F6A$5$l$J$$$G!#(B +$B$&!#%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%eL?(B $BNa$r;H$C$F$NI|9f2=$NJQ?t(B +@subsubsection $BB>$NI|9f2=$NJQ?t(B @table @code @vindex gnus-uu-grabbed-file-functions @@ -5889,7 +5944,7 @@ 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 @node Uuencoding and Posting -@subsection uuencode $B$HEj9F(B +@subsubsection uuencode $B$HEj9F(B @table @code @@ -5987,7 +6042,7 @@ gnus $B$,Ds0F$r$7$^$9!K$rF~NO$9$k$h$&$KB%$5$l!"$=$l$+$iL?Na$,$r%O%$%i%$%H$7!"K\BN(B (body) $B$HF,(B (head) $B$K%\%?%s$r2C$($^$9!#(B + +$B$?$$$F$$$NMxMQ/$7$@$1@Q6K@-$,8:>/$7$^$9(B---$B$=$l$O%X%C%@!<$H=p(B +$BL>$@$1$r%O%$%i%$%H$7!"%\%?%s$r2C$($^$9!#(B @item W H h @kindex W H h $B!J35N,!K(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%$%i(B -$B%$%H$OJQ?t(B @code{gnus-header-face-alist} $B$K$7$?$,$C$F$J$5$l!"$=$l$O$=$l$>(B -$B$l$NMWAG$,(B @var{($B@55,I=8=(B $BL>A0(B $BFbMF(B)} $B$H$$$&MM<0$N%j%9%H$G$9!#(B @var{$B@55,I=(B -$B8=(B}$B$O%X%C%@!<$K9gCW$9$k@55,I=8=!"(B@var{$BL>A0(B}$B$O%X%C%@!<$NL>A0$r%O%$%i%$%H$9(B -$B$k$N$K;H$o$l$k%U%'%$%9(B (face) (@pxref{FacesandFonts})$B!"(B@var{$BFbMF(B}$B$O%X%C%@!<(B -$B$NCM$r%O%$%i%$%H$9$k%U%'%$%9$G$9!#:G=i$K9gCW$7$?$b$N$,;H$o$l$^$9!#(B@var{$B@5(B -$B5,I=8=(B}$B$O(B @samp{^} $B$,IU$1$i$l$k$Y$-$G$O$J$$;v$KCm0U$7$F$/$@$5$$!=!=(Bgnus $B$,(B -$B$=$l$rIU$12C$($^$9!#(B +$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 @var{($B@55,I=8=(B $BL>A0(B $BFbMF(B)} $B$H$$$&MM<0$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 $B!J35N,!K(B @@ -6079,8 +6140,8 @@ Fonts})$B!#F1$8%a%C%;!<%8$NCf$KJ#?t$N5-;v$+$i$N0zMQ$,$"$k$H!"(Bgnus $B$O$=$l$ (@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!#(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 @@ -6091,21 +6152,21 @@ Fonts})$B!#F1$8%a%C%;!<%8$NCf$KJ#?t$N5-;v$+$i$N0zMQ$,$"$k$H!"(Bgnus $B$O$=$l$ @cindex gnus-article-emphasize @kindex W e $B!J35N,!K(B -$B?M!9$O$h$/%K%e!<%:$N5-;v$G(B @samp{_$B$3$l(B_} $B$d(B @samp{*$B$3$l(B*} $B$N$h$&$J$b$N$r(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$N$h$&$J$b$N$r(B $B;H$C$FC18l$r6/D4$7$^$9!#(BGnus $B$O(B $B5-;v$rL?Na(B @kbd{W e} (@code{gnus-article-emphasize}) $B$K$+$1$k;v$K$h$C$FAGE($K8+$($k$h$&$K$G$-(B $B$^$9!#(B -@vindex gnus-article-emphasis -$B6/D4$,$I$N$h$&$K1i;;$5$l$k$+$OJQ?t(B @code{gnus-article-emphasis} $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!##2(B -$BHVL\$NMWAG$O$I$N@55,I=8=$N%0%k!<%W$,6/D48lA4BN$r8+$D$1$k$?$a$K;H$o$l$k$+$r(B -$B<($9?t;z$G$9!##3HVL\$O$I$N@55,I=8=$N%0%k!<%W$,I=<($5$l%O%$%i%$%H$5$l$k$+$r(B -$B7h$a$k?t;z$G$9!#!J$3$N#2$D$N%0%k!<%W$N4V$N5-;v$O1#$5$l$^$9!#!K#4HVL\$O%O%$(B -$B%i%$%H$N%U%'%$%9$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 +$B#2HVL\$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!##3HVL\$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!#!J$3$N#2$D$N%0%k!<%W$N4V$N5-;v$O1#$5$l$^$9!#!K#4HV(B +$BL\$O%O%$%i%$%H$N%U%'%$%9$G$9!#(B @lisp -(setq gnus-article-emphasis +(setq gnus-emphasis-alist '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline) ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold))) @end lisp @@ -6117,7 +6178,7 @@ Fonts})$B!#F1$8%a%C%;!<%8$NCf$KJ#?t$N5-;v$+$i$N0zMQ$,$"$k$H!"(Bgnus $B$O$=$l$ @vindex gnus-emphasis-underline-italic @vindex gnus-emphasis-bold-italic @vindex gnus-emphasis-underline-bold-italic -$B%G%#%U%)%k%H$G$O#7$D$N5,B'$,$"$j!"$=$l$i$O0J2<$N%U%'%$%9$rMQ$$$^$9!'(B +$B=i4|@_Dj$G$O#7$D$N5,B'$,$"$j!"$=$l$i$O0J2<$N%U%'%$%9$rMQ$$$^$9!'(B @code{gnus-emphasis-bold}, @code{gnus-emphasis-italic}, @code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic}, @code{gnus-emphasis-underline-italic}, @@ -6131,6 +6192,8 @@ Fonts})$B!#F1$8%a%C%;!<%8$NCf$KJ#?t$N5-;v$+$i$N0zMQ$,$"$k$H!"(Bgnus $B$O$=$l$ @lisp (copy-face 'red 'gnus-emphasis-italic) @end lisp +$B5-;v$r<+F0E*$K%U%)%s$HJQ99$5$;$k$?$a$K$O(B @xref{Customizing Articles} $B$r(B +$B;2>H$7$F2<$5$$!#(B @node Article Hiding @@ -6145,7 +6208,8 @@ Fonts})$B!#F1$8%a%C%;!<%8$NCf$KJ#?t$N5-;v$+$i$N0zMQ$,$"$k$H!"(Bgnus $B$O$=$l$ @item W W a @kindex W W a $B!J35N,!K(B @findex gnus-article-hide -$B35N,%P%C%U%!$G:GBg8B1#$7$^$9(B (@kbd{gnus-article-hide})$B!#(B +$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 $B!J35N,!K(B @@ -6185,19 +6249,11 @@ Signature}. $B$$$/$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 -@item gnus-cite-hide-percentage -@vindex gnus-cite-hide-percentage -$B0zMQ$5$l$?J8$,$3$NJQ?t!J%G%#%U%)%k%H$G$O(B 50$B!K$h$jBg$-$$3d9g$N$H$-$O!"0zMQ(B -$B$5$l$?J,$r1#$7$^$9!#(B - -@item gnus-cite-hide-absolute -@vindex gnus-cite-hide-absolute -$B0zMQ$5$l$?J8$O>/$J$/$H$b$3$ND9$5!J%G%#%U%)%k%H$G$O(B 10$B!K$G$J$1$l$P1#$5$l$^(B -$B$;$s!#(B - -@item gnus-cited-text-button-line-format -@vindex gnus-cited-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!#O$N(B @item e $B1#$5$l$?J8$N:G8e$N%]%$%s%H$G$9!#(B @item l -$B1#$5$l$?J8$ND9$5$G$9!#(B +$B1#$5$l$?%j!<%8%g%s$NJ8;z$N?t$G$9!#(B +@item n +$B1#$5$l$?J8$N9T$N?t$G$9!#(B @end table @item gnus-cited-lines-visible @@ -6227,6 +6285,24 @@ Gnus $B$O$I$3$N0zMQJ8$,1#$5$l$F$$$k$+$r<($9$?$a$K%\%?%s$rIU$12C$(!"J8>O$N(B $B$KF~$l$k;v$N$G$-$k/$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?t(B @@ -6236,6 +6312,9 @@ Articles})$B!#(B $B0zMQ%+%9%?%^%$%:$N$?$a$NB>$NJQ?t$N>pJs$N$?$a$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 @@ -6256,7 +6335,8 @@ Highlighting} $B$b;2>H$7$F$/$@$5$$!#(B @kindex W l $B!J35N,!K(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 $B!J35N,!K(B @@ -6389,6 +6469,9 @@ X-Face $B5!G=$,$J$$$N$G$"$l$P!"(Bgnus $B$O(B @code{pbmplus} $B$d$=$NCg4V$N3 @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 @@ -6471,6 +6554,9 @@ 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 @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 @@ -6536,6 +6622,9 @@ UT ($BJLL>(B GMT, ZULU) $B$GF|IU$rI=<($7$^$9(B (@code{gnus-article-date-ut}) @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 @@ -6741,7 +6830,7 @@ son-of-RFC 1036 $B$G;X<($5$l$F$$$kI8=`$N(B @samp{^-- $} $B$G$9!#$7$+$7!"B?$/$ @node Alternative Approaches @section $BBeBX/$7$NA*Br;h$rM?$($F$"$j$^$9!#(B @@ -6772,10 +6861,14 @@ Gnus $B$O$3$l$r$9$k$?$a$N35N,%P%C%U%!%^%$%J!<%b!<%I$rDs6!$7$^$9!=!=(B @table @kbd @item . @kindex . $B!JA*Br!K(B -@findex gnus-summary-mark-as-processable -$B8=:_$N9T$N5-;v$rA*Br$7$^$9(B (@code{gnus-summary-mark-as-processable})$B!#?tCM(B -$B@\F,0z?t$rM?$($i$l$l$P!"$=$N9T$K0\F0$7$FA*Br$7$^$9!#!J9T?t$OIaDL$O35N,A*Br(B -$B9T$N:G=i$KI=<($5$l$F$$$^$9!#!K(B +@findex gnus-pick-article-or-thread +$B8=:_$N9T$N5-;v$+%9%l%C%I$rA*Br$7$^$9(B +(@code{gnus-pickd-article-or-thread})$B!#$b$7JQ?t(B +@code{gnus-thread-hide-subtree} $B$,(B true $B$G$"$l$P!"$3$N%-!<$O%9%l%C%I$N:G(B +$B=i$N5-;v$G;H$o$l$?$H$-$O%9%l%C%IA4BN$rA*Br$7$^$9!#$=$&$G$J$1$l$P!"$=$l$O(B +$B$=$N5-;v$@$1$rA*Br$7$^$9!#$b$7?tCM@\F,0z?t$rM?$($i$l$l$P$=$N%9%l%C%I$+5-(B +$B;v$X$H@8$s$G$$$-!"$=$l$rA*Br$7$^$9!#(B ($B9T?t$OIaDL$O35N,A*Br9T$N:G=i$KI=<((B +$B$5$l$F$$$^$9!#(B) @item SPACE @kindex SPACE$B!JA*Br!K(B @@ -6785,54 +6878,8 @@ Gnus $B$O$3$l$r$9$k$?$a$N35N,%P%C%U%!%^%$%J!<%b!<%I$rDs6!$7$^$9!=!=(B @item u @kindex u $B!JA*Br!K(B -@findex gnus-summary-unmark-as-processable -$B5-;v$rL$A*Br$K$7$^$9(B (@code{gnus-summary-unmark-as-processable})$B!#(B - -@item U -@kindex U $B!JA*Br!K(B -@findex gnus-summary-unmark-all-processable -$B$9$Y$F$N5-;v$rL$A*Br$K$7$^$9(B -(@code{gnus-summary-unmark-all-processable})$B!#(B - -@item t -@kindex t $B!JA*Br!K(B -@findex gnus-uu-mark-thread -$B%9%l%C%I$rA*Br$7$^$9(B (@code{gnus-uu-mark-thread})$B!#(B - -@item T -@kindex T $B!JA*Br!K(B -@findex gnus-uu-unmark-thread -$B%9%l%C%I$rL$A*Br$K$7$^$9(B (@code{gnus-uu-unmark-thread})$B!#(B - -@item r -@kindex r $B!JA*Br!K(B -@findex gnus-uu-mark-region -$BNN0h$rA*Br$7$^$9(B (@code{gnus-uu-mark-region})$B!#(B - -@item R -@kindex R $B!JA*Br!K(B -@findex gnus-uu-unmark-region -$BNN0h$rL$A*Br$K$7$^$9(B (@code{gnus-uu-unmark-region})$B!#(B - -@item e -@kindex e $B!JA*Br!K(B -@findex gnus-uu-mark-by-regexp -$B@55,I=8=$K9gCW$9$k5-;v$rA*Br$7$^$9(B (@code{gnus-uu-mark-by-regexp})$B!#(B - -@item E -@kindex E $B!JA*Br!K(B -@findex gnus-uu-unmrak-by-regexp -$B@55,I=8=$K9gCW$9$k5-;v$rL$A*Br$K$7$^$9(B (@code{gnus-uu-unmark-by-regexp})$B!#(B - -@item b -@kindex b $B!JA*Br!K(B -@findex gnus-uu-mark-buffer -$B%P%C%U%!$rA*Br$7$^$9(B (@code{gnus-uu-mark-buffer})$B!#(B - -@item B -@kindex B $B!JA*Br!K(B -@findex gnus-uu-unmark-buffer -$B%P%C%U%!$rL$A*Br$K$7$^$9(B (@code{gnus-uu-unmark-buffer})$B!#(B +@findex gnus-pick-unmark-article-or-thread +$B%9%l%C%I$+5-;v$rL$A*Br$K$7$^$9(B (@code{gnus-pick-unmark-article-or-thread})$B!#JQ?t(B @code{gnus-thread-hide-subtree} $B$,(B true $B$G$"$l$P!"$3$N%-!<$O%9%l%C%I$N:G=i$G;H$o$l$l$P%9%l%C%I$rL$A*Br$K$7$^$9!#$=$&$G$J$$>l9g$O$=$l$O5-;v$@$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%-!<$K?tCM@\F,0z?t$rM?$($k;v$,$G$-$^$9!#(B @item RET @kindex RET $B!JA*Br!K(B @@ -6845,6 +6892,11 @@ Gnus $B$O$3$l$r$9$k$?$a$N35N,%P%C%U%!%^%$%J!<%b!<%I$rDs6!$7$^$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?t(B +@code{gnus-summary-tick-article-forward} $B$K3d$jEv$F$i$l$F$$$k(B @kbd{!} $B$r(B +$B;H$&;v$,$G$-$^$9!#(B + $B$3$l$,NI$$9M$($@$H;W$&$N$G$"$l$P!"H$7$F$/$@$5$$!#(B +$BLZ%b!<%I%P%C%U%!$G$N%b!<%I9T$N$?$a$N%U%)!<%^%C%HJ8;zNs$G$9(B (@pxref{Mode +Line Formatting})$B!#%G%#%U%)%k%H$O(B @samp{Gnus: %%b %S %Z} $B$G$9!#;HMQ2DG=(B +$B$J;XDj$O(B @pxref{Summary Buffer Mode Line} $B$r;2>H$7$F$/$@$5$$!#(B @item gnus-selected-tree-face @vindex gnus-selected-tree-face @@ -7115,6 +7167,12 @@ gnus $B$N5-;vA*Br4X?t$r5-;v72$r(B uudecode $B$7$=$N7k2L$rI=<($9$k$h$&$KJQ99$9 $B$,0\$k$+$K6=L#$,$"$k$G$7$g$&!#$3$NL?Na$G$=$l$,$o$+$j$^$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 $B!J35N,!K(B @findex gnus-summary-article-posted-p @@ -7164,7 +7222,7 @@ gnus $B$N5-;vA*Br4X?t$r5-;v72$r(B uudecode $B$7$=$N7k2L$rI=<($9$k$h$&$KJQ99$9 @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 @@ -7697,7 +7755,7 @@ Gnus $B$O%X%C%@!<$NJB$YBX$((B(sort)$B$b9T$$$^$9!J$3$l$O%G%#%U%)%k%H$G9T$o$l$^ @lisp (setq gnus-boring-article-headers - '(empty newsgroups followup-to reply-to)) + '(empty followup-to reply-to)) @end lisp $B$3$l$O$3$NJQ?t$N%G%#%U%)%k%HCM$G$b$"$j$^$9!#(B @@ -7711,7 +7769,7 @@ Gnus $B$O%X%C%@!<$NJB$YBX$((B(sort)$B$b9T$$$^$9!J$3$l$O%G%#%U%)%k%H$G9T$o$l$^ $BCN$i$l$F$*$j!"$=$N4V4Q5R$O$"$/$S$r$7$J$,$i$\$s$d$j$H$7$F$^$9!#(B $B0lJ}!"(B@sc{mime} $B$H$O!"0UL#$bL5$/5-;v$rId9f2=$9$kI8=`$G$"$j!"$=$N(B -$B$?$a$KA4$F$N%K%e!<%:%j!<%@$,62I]$G;`$s$G$7$^$&$b$N$G$9!#(B +$B$?$a$KA4$F$N%K%e!<%9%j!<%@$,62I]$G;`$s$G$7$^$&$b$N$G$9!#(B @sc{mime} $B$O$=$N5-;v$,$I$s$JJ8;z=89g$r;HMQ$7$F$$$k$+!"$=$NJ8;z$r$I$&Id9f2=(B $B$7$F$$$k$+$r;XDj$9$k$3$H$,$G$-!"$5$i$K$O3($d$=$NB>$N$_$@$i$J$b$N$rL5H$7$F$/$@$5$$!#(B -$BCm0UE@$H$7$F!"$3$N%U%C%/$G$O4X?t$N=g=x$,1F6A$9$k$3$H$,$"$k$N$G!"$*K>$_$N7k(B -$B2L$rF@$k$K$O$A$g$C$HH$7$F$/$@$5(B +$B$$!#Cm0UE@$H$7$F!"$3$N%U%C%/$G$O4X?t$N=g=x$,1F6A$9$k$3$H$,$"$k$N$G!"$*K>(B +$B$_$N7k2L$rF@$k$K$O$A$g$C$HH$7$F$/$@$5$$!# @item C-c ^ @kindex C-c ^ (Article) @findex gnus-article-refer-article -$B%+!<%=%k0LCV$,(B @code{Message-ID} $B$N6aJU$K$"$k$H$-$K(B @kbd{r} $B$r2!(B +$B%+!<%=%k0LCV$,(B @code{Message-ID} $B$N6aJU$K$"$k$H$-$K(B @kbd{C-c ^} $B$r2!(B $B$9$H!"(Bgnus $B$O%5!<%P!<$+$i$=$N5-;v$rH$7$F$/$@$5$$!# @vindex gnus-article-mode-line-format @item gnus-article-mode-line-format -$B$3$NJQ?t$O(B @code{gnus-summary-mode-line-format} $B$HF1$89T$K=>$C$?(B -$BMM<0J8;zNs$G$9!#$3$l$O0J2<$N0l$D$N3HD%$r=|$$$F!"$=$NJQ?t$HF1$8MM(B -$B<0;XDj$r$C$?MM<0J8;z(B +$BNs$G$9(B (@pxref{Mode Line Formatting})$B!#$3$l$O0J2<$N0l$D$N3HD%$r=|$$$F!"(B +$B$=$NJQ?t$HF1$8MM<0;XDj$rH$7$F$/$@$5$$!# * Posting Server:: $B$I$N%5!<%P!<$rDL$7$FEj9F$9$k$Y$-$+!)(B * Mail and Post:: $BF1;~$K%a!<%k$r=P$7JVEz$9$k!#(B * Archived Messages:: $BAw$C$?%a%C%;!<%8$r(B gnus $B$,Cy$a$F$*$/$H$3$m!#(B +* Posting Styles:: $B$"$J$?$,C/$G$"$k$+$r;XDj$9$k$h$j4JC1$JJ}K!!#(B * Drafts:: $B%a%C%;!<%8$N1d4|$H5qH]$5$l$?%a%C%;!<%8!#(B * Rejected Articles:: $B%5!<%P!<$,$"$J$?$N5-;v$r9%$-$G$J$$$H$-$K2?$,5/$3$k!)(B @end menu @@ -7956,7 +8017,7 @@ Superseding} $B$r;2>H$7$F$/$@$5$$!#(B @node Post @section $BEj9F(B -$B%K%e!<%:5-;v:n@.$N$?$a$NJQ?t!'(B +$B%K%e!<%95-;v:n@.$N$?$a$NJQ?t!'(B @table @code @item gnus-sent-message-ids-file @@ -8019,7 +8080,7 @@ gnus $B$O>o$KEj9F$K$I$NJ}K!$r;H$&$+$r$"$J$?$K?R$M$^$9!#(B @findex gnus-mailing-list-groups @cindex mailing lists -$B$b$7$"$J$?$N%K%e!<%:%5!<%P!<$,K\Ev$K%a!<%j%s%0%j%9%H$+$i(B @sc{nntp} $B%5!<(B +$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 (@pxref{Group Parameters}) $B$K(B @@ -8163,7 +8224,7 @@ Gnus $B$O30$X=P$F9T$/A4$F$N%a%C%;!<%8$K!"0l$D$+$=$l0J>e$N$=$N%5!<%P!<$N%0%k!<( $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$"$l(B -$B$P!"$3$NJQ?t$r8=:_$N%K%e!<%:%0%k!<%WL>$rD4$Y$F!"E,@Z$J%0%k!<%WL>!J$b$7$/$O(B +$B$P!"$3$NJQ?t$r8=:_$N%K%e!<%9%0%k!<%WL>$rD4$Y$F!"E,@Z$J%0%k!<%WL>!J$b$7$/$O(B $BL>A0$N%j%9%H!K$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 @@ -8171,93 +8232,101 @@ Gnus $B$O30$X=P$F9T$/A4$F$N%a%C%;!<%8$K!"0l$D$+$=$l0J>e$N$=$N%5!<%P!<$N%0%k!<( @end table -@c @node Posting Styles -@c @section Posting Styles -@c @cindex posting styles -@c @cindex styles -@c -@c All them variables, they make my head swim. -@c -@c So what if you want a different @code{Organization} and signature based -@c on what groups you post to? And you post both from your home machine -@c and your work machine, and you want different @code{From} lines, and so -@c on? -@c -@c @vindex gnus-posting-styles -@c One way to do stuff like that is to write clever hooks that change the -@c variables you need to have changed. That's a bit boring, so somebody -@c came up with the bright idea of letting the user specify these things in -@c a handy alist. Here's an example of a @code{gnus-posting-styles} -@c variable: -@c -@c @lisp -@c ((".*" -@c (signature . "Peace and happiness") -@c (organization . "What me?")) -@c ("^comp" -@c (signature . "Death to everybody")) -@c ("comp.emacs.i-love-it" -@c (organization . "Emacs is it"))) -@c @end lisp -@c -@c As you might surmise from this example, this alist consists of several -@c @dfn{styles}. Each style will be applicable if the first element -@c ``matches'', in some form or other. The entire alist will be iterated -@c over, from the beginning towards the end, and each match will be -@c applied, which means that attributes in later styles that match override -@c the same attributes in earlier matching styles. So -@c @samp{comp.programming.literate} will have the @samp{Death to everybody} -@c signature and the @samp{What me?} @code{Organization} header. -@c -@c The first element in each style is called the @code{match}. If it's a -@c string, then Gnus will try to regexp match it against the group name. -@c If it's a function symbol, that function will be called with no -@c arguments. If it's a variable symbol, then the variable will be -@c referenced. If it's a list, then that list will be @code{eval}ed. In -@c any case, if this returns a non-@code{nil} value, then the style is said -@c to @dfn{match}. -@c -@c Each style may contain a arbitrary amount of @dfn{attributes}. Each -@c attribute consists of a @var{(name . value)} pair. The attribute name -@c can be one of @code{signature}, @code{organization} or @code{from}. The -@c attribute name can also be a string. In that case, this will be used as -@c a header name, and the value will be inserted in the headers of the -@c article. -@c -@c The attribute value can be a string (used verbatim), a function (the -@c return value will be used), a variable (its value will be used) or a -@c list (it will be @code{eval}ed and the return value will be used). -@c -@c So here's a new example: -@c -@c @lisp -@c (setq gnus-posting-styles -@c '((".*" -@c (signature . "~/.signature") -@c (from . "user@@foo (user)") -@c ("X-Home-Page" . (getenv "WWW_HOME")) -@c (organization . "People's Front Against MWM")) -@c ("^rec.humor" -@c (signature . my-funny-signature-randomizer)) -@c ((equal (system-name) "gnarly") -@c (signature . my-quote-randomizer)) -@c (posting-from-work-p -@c (signature . "~/.work-signature") -@c (from . "user@@bar.foo (user)") -@c (organization . "Important Work, Inc")) -@c ("^nn.+:" -@c (signature . "~/.mail-signature")))) -@c @end lisp +@node Posting Styles +@section $BEj9FMM<0(B +@cindex posting styles +@cindex styles + +$B$=$l$i$O$9$Y$FJQ?t$G!"$=$l$O;d$NF,$r1K$,$;$^$9!#(B + +$B$=$l$G!"$J$<$I$N%0%k!<%W$KEj9F$9$k$+$K$h$C$F0c$C$?(B @code{Organization} +$B$H=pL>$rK>$`$N$G$7$g$&$+!)$=$7$F!"$"$J$?$O2HDm$N%^%7%s$H?&>l$N%^%7%s$NN>(B +$BJ}$+$iEj9F$7$F!"0c$C$?(B @code{From} $B9T$d$=$NB>$N$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$+$N7A$G(B ``$B9g(B +$BCW(B'' $B$7$?$H$-$KE,MQ$5$l$^$9!#O"A[%j%9%HA4BN$O:G=i$+$i:G8e$^$GH?I|$7$F$l$N9gCW$,E,MQ$5$l$^$9!#$3$l$O!"8e$NMM<0$NB0@-$,A0$K9gCW$7(B +$B$?MM<0$NB0@-$r>e=q$-$9$k$H8@$&;v$G$9!#$G$9$+$i!"(B +@samp{comp.programming.literate} $B$O!"=pL>(B @samp{Death to everybody} $B$H(B +@code{Organization} $B%X%C%@!<(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=8=$H$7$F9gCWA`:n$r9T$$(B +$B$^$9!#$b$7$=$l$,4X?t$N%7%s%\%k$G$"$l$P!"$=$N4X?t$,0z?tL5$7$G8F$P$l$^$9!#(B +$B$=$l$,JQ?t$N%7%s%\%k$G$"$l$P!"$=$NJQ?t$,;2>H$5$l$^$9!#$=$l$,%j%9%H$G$"$l(B +$B$P!"$=$N%j%9%H$,(B @code{$BI>2A(B} $B$5$l$^$9!#$I$N>l9g$G$b!"$3$l$,(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 @var{(name . value)} $B$NBP$K$h$j@.$jN)$C$F$$$^$9!#B0@-L>$O!"(B +@code{signature}, @code{signature-file}, @code{organization}, +@code{address}, @code{name}, @code{body} $B$N$I$l$+$G$"$k;v$,$G$-$^$9!#B0(B +$B@-L>$OJ8;zNs$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"$3$l$O%X%C%@!$H$7$F;H$o$l!"(B +$B$=$NCM$,5-;v$N%X%C%@!<$KA^F~$5$l$^$9!#(B + +$BB0@-CM$OJ8;zNs(B ($B$=$N$^$^;H$o$l$^$9(B)$B!"4X?t(B ($BJV$jCM$,;H$o$l$^$9(B)$B!"JQ?t(B ($B$=(B +$B$NCM$,;H$o$l$^$9(B)$B!"%j%9%H(B ($B$=$l$O(B @code{$BI>2A(B} $B$5$l$F!"JV$jCM$,;H$o$l$^$9(B) +$B$G$"$k;v$,$G$-$^$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!"(B2$B$D$NF0E*$KB+G{$5$l$kJQ?t(B +@code{message-this-is-news} $B$H(B @code{message-thiss-is-mail} $B$rD4$Y$k;v$,(B +$B$G$-$^$9!#(B + +@vindex message-this-is-mail +@vindex message-this-is-news + +$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-this-is-news + (signature my-news-signature)) + (posting-from-work-p + (signature-file "~/.work-signature") + (address "user@@bar.foo") + (body "You are fired.\n\nSincerely, your boss.") + (organization "Important Work, Inc")) + ("^nn.+:" + (signature-file "~/.mail-signature")))) +@end lisp + @node Drafts @section $B2<=q$-(B @cindex drafts -$B$b$7%a%C%;!<%8!J%a!<%k$b$7$/$O%K%e!<%:!K$r=q$$$F$$$k$H$-$K!"FMA3%*!<%V%s$K(B -$B%9%F!<%-$,F~$C$F$$$k;v$r;W$$=P$7$?$J$i!J$b$7$/$O!"$"$J$?$,$H!<$C$F$b$9$4$$(B -$B:Z?)e$N%5!<%P!<$r:n$C$FJT=8$9$k!#(B -* Getting News:: USENET $B%K%e!<%:$r(B gnus $B$GFI$`!#(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 * Other Sources:: $B%G%#%l%/%H%j!A0!#(B +$B$I$N$h$&$K%K%e!<%9$,A0!#(B @item n $B%5!<%P!<$NL>A0!#(B @item w -$B$I$3$+$i%K%e!<%:$,uBV!#(B @@ -8424,7 +8493,8 @@ Buffer})$B!#(B @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!#0J2<$N;XDj$OM}2r$5$l$^$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 @@ -8634,9 +8704,9 @@ Buffer})$B!#(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$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@_(B -$BDj$9$k$@$1$G$O=$s$@>uBV$K$J$k$h$&$K!"(B +@code{nnml-active-file} $B$O(B @file{~/Mail/active} $B$K$J$j$^$9!#$b$7?7$7$$;v(B +$Be$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 @@ -8718,17 +8788,17 @@ Gnus $B$,$I$l$+$N%5!<%P!<$+$i@\B35qH]$rC5n$7$^(B @node Getting News -@section $B%K%e!<%:$NC5n$7$^(B @item $B$=$l$>$l$N9T$OG$0U$N?t$N(B $B6h@Z$j0u(B/$BCM(B $B$NBP$r4^$`;v$,$G$-$^$9!#M-8z$J6h@Z(B -$B$j0u$O(B @samp{machine}$B!"(B@samp{login}$B!"(B@samp{password}$B!"(B@samp{force} $B$G$9!#(B -($B:G8e$N$b$N$OM-8z$J(B @code{.netrc}/@code{ftp} $B$N6h@Z$j0u$G$O$"$j$^$;$s!#(B -$B$3$l$,%U%!%$%k(B @file{.authinfo} $B$,(B @file{.netrc} $B%U%!%$%kMM<0$+$i0o$l$k(B -$BM#0l$NJ}K!$G$9!#(B) +$B$j0u$O(B @samp{machine}$B!"(B@samp{login}$B!"(B@samp{password}$B!"(B@samp{default}$B!"(B +@samp{force} $B$G$9!#(B($B:G8e$N$b$N$OM-8z$J(B @code{.netrc}/@code{ftp} $B$N6h@Z$j(B +$B0u$G$O$"$j$^$;$s!#$3$l$,%U%!%$%k(B @file{.authinfo} $B$,(B @file{.netrc} $B%U%!(B +$B%$%kMM<0$+$i0o$l$kM#0l$NJ}K!$G$9!#(B) @end enumerate @@ -8809,6 +8879,16 @@ machine nntp.ifi.uio.no login larsi force yes $B%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 $BG'>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$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 @@ -8853,7 +8933,7 @@ machine nntp.ifi.uio.no login larsi force yes $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 -@code{nil} $B$G$"$k$H!"$3$l$,%G%#%U%)%k%H$G$9$,!";~4V@Z$l@ZCG$O$J$5$l$^$;(B +@code{nil} $B$G$"$k$H!"$3$l$,=i4|@_Dj$G$9$,!";~4V@Z$l@ZCG$O$J$5$l$^$;(B $B$s!#(B @c @item nntp-command-timeout @@ -8885,14 +8965,16 @@ machine nntp.ifi.uio.no login larsi force yes @findex nntp-open-network-stream @item nntp-open-connetcion-function @vindex nntp-open-connection-function -$B$3$N4X?t$O1s3V%7%9%F%`$K@\B3$9$k$?$a$K;H$o$l$^$9!#(B3$B$D$N4{@=4X?t$N(B1$B$D$O(B -@code{nntp-open-network-stream}$B$G!"$3$l$O%G%#%U%)%k%H$GC1=c$K1s3V%7%9%F(B -$B%`$N$I$3$+$N$N%]!<%H$d2?$+$K@\B3$7$^$9!#;D$j$N(B2$B$D$N$&$A$N(B1$B$D$O!"(B -@code{nntp-open-rlogin} $B$G!"1s3V%7%9%F%`$K(B @code{rlogin} $B$r$7$F!"$=$l$+(B -$B$i$=$3$+$i;HMQ2DG=$J(B @sc{nntp} $B%5!<%P!<$K(B @samp{telnet} $B$r$7!"$b$&0l$D$O(B -@code{nntp-open-telnet} $B$G!"$3$l$O1s3V%7%9%F%`$K(B @samp{telnet} $B$r$7$F!"(B -$B$=$l$+$i(B @sc{nntp} $B%5!<%P!<$K$?$I$jCe$/$?$a$K$b$&0l$D(B @samp{telnet} $B$r$7(B -$B$^$9!#(B +$B$3$N4X?t$O1s3V%7%9%F%`$K@\B3$9$k$?$a$K;H$o$l$^$9!#(B4$B$D$N4{@=4X?t$,Ds6!$5(B +$B$l$F$$$^$9(B: + +@table @code +@item nntp-open-network-stream +$B$3$l$O=i4|@_Dj$G!"C1=c$K1s3V%7%9%F%`$N2?$i$+$N%]!<%H$+B>$N$b$K@\B3$7$^$9!#(B + +@item nntp-open-rlogin +@samp{rlogin} $B$r1s3V%7%9%F%`$K9T$C$F!"$=$3$+$i;EMM2DG=$J(B @sc{nntp} $B%5!<(B +$B%P!<$K(B @samp{telnet} $B$r$7$^$9!#(B @code{nntp-open-rlogin} $B$K4XO"$7$?JQ?t$G$9(B: @@ -8913,6 +8995,10 @@ machine nntp.ifi.uio.no login larsi force yes @end table +@item nntp-open-telnet +$B1s3V%7%9%F%`$K(B @samp{telnet} $B$r$7$F!"(B@sc{nntp} $B%5!<%P!<$K$?$I$jCe$/$?$a(B +$B$K$b$&0lEY(B @code{telnet} $B$r$7$^$9!#(B + @code{nntp-open-telnet} $B$K4XO"$7$?JQ?t$G$9(B: @table @code @@ -8950,6 +9036,26 @@ machine nntp.ifi.uio.no login larsi force yes @end table +@findex nntp-open-ssl-stream +@item nntp-open-ssl-stream +$B%5!<%P!<$K(B @dfn{$B0BA4$J(B} $B%A%c%s%M%k$r;H$C$F%5!<%P!<$K@\B3$7$^$9!#$3$l$r;H(B +$B$&$?$a$K$O!"(BSSLay $B$,%$%s%9%H!<%k$5$l$F$$$J$1$l$P$J$j$^$;$s(B +(@file{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL} $B$H!"(B@file{ssl.el} ($BNc$($P!"(B +W3 $B$NG[I[$+$i(B) $B$,I,MW$K$J$j$^$9(B)$B!#$=$l$+$i%5!<%P!<$r$l$NMWAG$,%a!<%k(B @@ -9178,9 +9284,6 @@ Backend} $B$H(B @pxref{Expiring Mail} $B$r!#(B ("list.\\1" "From:.*\\(.*\\)-list@@majordomo.com") @end lisp -$B$b$7:G=i$NMWAG$,FCJL$J%7%s%\%k(B @code{junk} $B$G$"$l$P!"$=$l$N@55,I=8=$K9g(B -$BCW$9$k%a%C%;!<%8$OE76u$K>C$(5n$j$^$9!#Hs>o$KCm0U$7$F;H$C$F$/$@$5$$!#(B - 2$BHVL\$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 @@ -9425,7 +9528,7 @@ gnus $B$,<+J,<+?H$G(B POP $B%a!<%kJ8;zNs$rH/8+$7$h$&$H$7$^$9!#$I$N$h$&$J>l9g$ @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!#(B +$B$9!#IaDL$N@55,I=8=$N9gCW$,$J$5$l$^$9!#Nc$O2<$NJ}$r8+$F2<$5$$!#(B @item @var{(FIELD VALUE SPLIT)}: $B$b$7J,3d$,%j%9%H$G!":G=i$NMWAG$,J8;zNs$G$"$j!"(B @@ -9444,13 +9547,16 @@ gnus $B$,<+J,<+?H$G(B POP $B%a!<%kJ8;zNs$rH/8+$7$h$&$H$7$^$9!#$I$N$h$&$J>l9g$ @item @code{junk}: $B$b$7J,3d$,%7%s%\%k(B @code{junk} $B$G$"$k$H!"$=$N%a%C%;!<%8$rJ](B -$BB8$7$^$;$s!#(B +$BB8$7$^$;$s!#Hs>o$KCm0U$7$F;H$C$F2<$5$$!#(B @item @var{(: function arg1 arg2 ...)}: $B$b$7J,3d$,%j%9%H$G!":G=i$N4X?t$,(B @code{:} $B$G$"$k$H!"(B2$BHVL\$NMWAG$,(B @var{args} $B$r0z?t$H$7$F4X?t$H$7$F8F$P$l(B $B$^$9!#4X?t$O(B SPLIT $B$rJV$9$Y$-$G$9!#(B +@item +@code{nil}: $B$b$7J,3d$,(B @code{nil} $B$G$"$l$P!"$=$l$OL5;k$5$l$^$9!#(B + @end enumerate $B$3$l$i$NJ,3d$G!"(B@var{FIELD} $B$O40A4$J%U%#!<%k%IL>$K9gCW$7$J$1$l$P$J$j$^$;(B @@ -9472,9 +9578,13 @@ table) $B$K=>$C$F40A4$K9gCW$7$J$1$l$P$J$j$^$;$s!#@55,I=8=$G%U%#!<%k%IL>$+(B $B%X%C%@!<$N$$$/$D$+$N>pJs$K4p$E$$$F!"(Bgnus $B$KF0E*$K%0%k!<%W$r:n$i$;$?$$$N$G$"$l$P(B ($BNc$($P!"%0%k!<%WL>$G(B @code{replace-match} $B$N$h$&$JBeMQ$r$9$k(B)$B!"u%U%!%$%k$NL>A0!#(B @node Mail Spool -@subsection $B%a!<%k%9%W!<%k(B +@subsubsection $B%a!<%k%9%W!<%k(B @cindex nnml @cindex mail @sc{nov} spool @@ -10042,7 +10152,7 @@ mbox $B%U%!%$%k$r=E$$B-o$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$GAw7A<0!#(B @item forward $BE>Aw$5$l$?5-;v!#(B +@item mime-parts +$B=8G[G[Aw(B (digest) $B$NB>$N(B MIME $BB?ItJ,%a%C%;!<%8(B (multipart message) $B$G$9!#(B + @item mime-digest @cindex digest @cindex MIME digest @@ -10868,6 +10997,32 @@ Newsgroups: alt.religion.emacs To: alt-religion-emacs@@GATEWAY @end example +$B0J2<$N4{@=4X?t$,B8:_$7$^$9(B: + +@findex nngateway-simple-header-transformation +@table @code + +@item nngateway-simple-header-transformaton +@var{nesgroup}@@@code{nngateway-address} $B$N$h$&$J(B @code{To} $B%X%C%@!<$r$D(B +$B$/$j$^$9!#(B + +@findex nngateway-mail2news-header-transformation + +@item nngateway-mail2news-header-transformation +@code{nngateway-address} $B$N$h$&$J(B @code{To} $B%X%C%@!<$r$D$/$j$^$9!#(B + +$B$3$3$KNc$,$"$j$^$9!#(B + +@lisp +(setq gnus-post-method + '(nngateway "mail2news@@replay.com" + (nngateway-header-transformation + nngateway-mail2news-header-transformation))) +@end lisp + +@end table + + @end table $B$D$^$j!"$3$l$r;H$&$K$O!"$3$s$JIw$K$9$k$@$1$G$9!#(B @@ -10930,7 +11085,7 @@ Distribution $B%X%C%@!<$r;H$C$FG[I[HO0O$r@)8B$7$F$$$k>l9g$O!"Hs>o(B $BI=8=$H$7$F0J2<$NCM$,;H$($^$9!#(B @example -"^nntp\\+some\\.server\\.jp:soc\\.motss$\\|^nntp\\+some\\.server\\.no:soc\\.motss$" +"^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%/(B @@ -10959,6 +11114,19 @@ Distribution $B%X%C%@!<$r;H$C$FG[I[HO0O$r@)8B$7$F$$$k>l9g$O!"Hs>o(B $B$G$9!#$"$k$$$O2>A[%0%k!<%W$KF~$k;~$K!"Kh2s$=$N%0%k!<%W$N>e$G(B @code{M-g} $B$rC!$$$F$bNI$$$G$9(B --- $B$3$l$O$[$\F1MM$N8z2L$,$"$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 @@ -11323,7 +11491,7 @@ gnus $B%(!<%8%'%s%H$,$=$N5-;v$r(B SPAM $B$@$H8+Pv$7$?$i??!#$3$NH/8+E*(B @item gnus-category-line-format @vindex gnus-category-line-format -$BJ,N`%P%C%U%!!<$N9TMM<0(B (@pxref{Formatting Variables})$B!#@5Ev$JMWAG$O!"(B +$BJ,N`%P%C%U%!!<$N9TMM<0(B (@pxref{Formatting Variables})$B!#M-8z$JMWAG$O!"(B @table @samp @item c @@ -11335,7 +11503,7 @@ gnus $B%(!<%8%'%s%H$,$=$N5-;v$r(B SPAM $B$@$H8+Pv$7$?$i??!#$3$NH/8+E*(B @item gnus-category-mode-line-format @vindex gnus-category-mode-line-format -$BJ,N`%b!<%I9T$NMM<0!#(B +$BJ,N`%b!<%I9T$NMM<0(B (@pxref{Mode Line Formatting})$B!#(B @item gnus-agent-short-article @vindex gnus-agent-short-article @@ -11406,7 +11574,7 @@ $ emacs -batch -l ~/.gnus.el -f gnus-agent-batch-fetch @kindex J S (Agent Group) @findex gnus-group-send-drafts $B2<=q$-%0%k!<%W$K$"$kAw?.2DG=$J%a%C%;!<%8$rA4$FAw?.$9$k(B -(@code{gnus-agent-fetch-session})$B!#(B @xref{Drafts} +(@code{gnus-group-send-session})$B!#(B @xref{Drafts} @item J a @kindex J a (Agent Group) @@ -11630,7 +11798,7 @@ Gnus $B$O35N,%P%C%U%!$r:n@.$9$kA0$K!"8=:_$N%0%k!<%W$KE,MQ$5$l$k$I$s$J(B * Scoring Tips:: $B$I$&$d$C$F8z2LE*$K%9%3%"$rIU$1$k$+!#(B * Reverse Scoring:: $B8E$$$b$N$N;R$G$"$k$H$$$&LdBj$OLdBj$G$O$J$$!#(B * Global Score Files:: $BCO$r$D$+$_!"<*$r@Z$jNv$/%9%3%"%U%!%$%k!#(B -* Kill Files:: $B$=$l$i$O$^$@$3$3$K$"$j$^$9$,!"L5;k$9$k;v$,$G$-$^$9!#(B +* Kill Files:: $B$=$l$i$O$^$@$3$3$K$"$j$^$9$,!"L5;k$9$k;v$,$G$-$k!#(B * Converting Kill Files:: $B:o=|%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 @@ -11681,12 +11849,6 @@ Gnus $B$O35N,%P%C%U%!$r:n@.$9$kA0$K!"8=:_$N%0%k!<%W$KE,MQ$5$l$k$I$s$J(B gnus $B$N8e$m$G$$$m$$$m$H%9%3%"%U%!%$%k$GM7$s$G!"$=$l$N8z2L$r8+$?$$$H$-$K(B $BLrN)$D$+$b$7$l$^$;$s!#(B -@item V a -@kindex V a ($B35N,(B) -@findex gnus-summary-score-entry -$B?7$7$$%9%3%"EPO?$rIU$12C$(!"A4$F$NMWAG$N;XDj$r5v2D$7$^$9(B -(@code{gnus-summary-score-entry})$B!#(B - @item V c @kindex V c ($B35N,(B) @findex gnus-score-change-score-file @@ -11762,8 +11924,8 @@ File Editing})$B!#(B @item x Xref $B9T$K%9%3%"$rIU$1$^$9(B---$B$9$J$o$A!"Aj8_Ej9F9T$G$9!#(B -@item t -$B%9%l%C%I(B (thread) $B$K%9%3%"$rIU$1$^$9(B---References $B9T$G$9!#(B +@item r +References $B9T$K%9%3%"$r$D$1$^$9!#(B @item d $BF|IU(B (date) $B$K%9%3%"$rIU$1$^$9!#(B @@ -11782,6 +11944,10 @@ Messsage-ID $B$K%9%3%"$rIU$1$^$9!#(B @item h $B%X%C%@!<(B (head) $B$K%9%3%"$rIU$1$^$9!#(B + +@item t +$B%9%l%C%I$K%9%3%"$rIU$1$^$9!#(B + @end table @item @@ -12146,11 +12312,31 @@ Gnus $B$O0lHLE*$J%9%3%"%U%!%$%k$rFCDj$N%9%3%"%U%!%$%k8~$1$N$b$N$h$jA0$KE,(B @item Lines, Chars $B$3$l$i$N(B2$B$D$N%X%C%@!<$O0c$C$?9gCW$N7?$r;H$$$^$9(B: @code{<}$B!"(B@code{>}$B!"(B -@code{=}$B!"(B@code{>=}$B!"(B@code{<=} $B$G$9!#9gCW$,(B @code{Lines} $B$G$J$5$l$F$$$k(B -$B$H!"$$$/$D$+$N%P%C%/%(%s%I(B (@code{nndir}$B$N$h$&$J$b$N(B) $B$O(B @code{Lines} $B%X%C(B -$B%@!<$r:n@.$7$J$$$?$a$KA4$F$N5-;v$,(B0$B9T$G$"$k$H$7$F07$o$l$k;v$K5$$rIU$1$F(B -$B$/$@$5$$!#$3$l$O$b$7>/$7$N9T$7$+$J$$5-;v$N%9%3%"$r2<$2$F$$$k$N$J$i!"JQ$J(B -$B7k2L$,5/$3$jF@$k;v$K$J$j$^$9!#(B +@code{=}$B!"(B@code{>=}$B!"(B@code{<=} $B$G$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!">e5i9gCW(B +@code{("lines" 4 <)} (@pxref{Advanced Scoring}) $B$O7k2L$H$7$F0J2<$N<0$K$J(B +$B$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$,(B4$B9T$h$j$b>/$J$$$H$-$K%9%3%"$,DI2C$5$l$^$9!#(B($B:.Mp(B +$B$7$F!"H?BP$G$O$J$$$+$H9M$(0W$$$G$9!#$G$b!"$=$&$G$O$J$$$N$G$9!#;d$,;W$&$K!#(B) + +$B9gCW$,(B @code{Lines} $B$G$J$5$l$F$$$k$H!"$$$/$D$+$N%P%C%/%(%s%I(B +(@code{nndir}$B$N$h$&$J$b$N(B) $B$O(B @code{Lines} $B%X%C%@!<$r:n@.$7$J$$$?$a$KA4(B +$B$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$J(B +$B$j$^$9!#(B @item Date Date ($BF|IU(B) $B%X%C%@!<$K$O(B3$B$D$N$J$s$H$J$/$P$+$2$F$$$k9gCW$N7?$,$"$j$^$9(B: @@ -12544,12 +12730,22 @@ line)} $B$K@_Dj$7$F$/$@$5$$!#(B $BA4(B @samp{rec} $B%0%k!<%W$KBP$7$F(B @file{rec.SCORE} ($BEy!9(B) $B$r;H$$$?(B $B$1$l$P!"$3$N$h$&$K$G$-$^$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 +$BB?$N4X?t$O0J2<$N0J2<$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$N(B @samp{comp} $B%0%k!<%WMQ$N%9%3%"%U%!%$%k$r;H$$!"B>$NA4It$N%0%k!<%W(B @@ -12558,9 +12754,9 @@ line)} $B$K@_Dj$7$F$/$@$5$$!#(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")) + '(("\\.emacs" "emacs.SCORE") + ;; All the comp groups in one score file + ("^comp" "comp.SCORE"))) @end lisp @vindex gnus-home-adapt-file @@ -12894,7 +13090,7 @@ GNUS $B>C5n%U%!%$%k$rJT=8$9$k$?$a$NFs$D$N35N,%P%C%U%!4X?t$,$"$j$^(B $B>C5n%U%!%$%k$+$i%9%3%"%U%!%$%k$X$NJQ49%Q%C%1!<%8$O!"I8=`$G$O(B gnus $B$K$O4^$^$l$^$;$s!#(B -@file{http://www.ifi.uio.no/~larsi/ding-other/gnus-kill-to-score} +@file{http://www.stud.ifi.uio.no/~larsi/ding-other/gnus-kill-to-score} $B$+$iF~C5n%U%!%$%k$,Hs>o$KJ#;($J$b$N$G$"$l$P(B --- $B$=$l$K(B @@ -13155,7 +13351,7 @@ bbbd $B%5!<%P!<$,$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 Scring Examples +@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 @@ -13262,17 +13458,19 @@ Redmondo $B$,>C$($?7$2<$K$D$$$F=q$$$?$H$-$K%U%)%m!<%"%C%W$7$?A4$F$N?M$O%9(B @vindex gnus-decay-scores @findex gnus-decay-score -@vindex gnus-score-decay-function +@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-score-decay-function} $B$K$h$C(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(B10$BJb$G%"%-%l%9g'$rF@$k!#(B +* Daemons:: Gnus $B$O$"$J$?$NN"$GJ*;v$r$NB@$j$d$9$$?);v$rHr$1$kJ}K!!#(B +* Undo:: $B$$$/$D$+$NF0:n$O85$KLa$9;v$,$G$-$k!#(B +* Moderation:: $B$"$J$?$,%b%G%l!<%?!<$@$C$?$i$I$&$9$k$+!#(B +* XEmacs Enhancements:: XEmacs $B$G$O$b$C$H3($d$=$NB>$N$b$N$,B8:_$9$k!#(B +* Fuzzy Matching:: $BBg$-$JLJLS$C$F2?!)(B +* Thwarting Email Spam:: $BM>7W$J>&6HE*EE;R%a!<%k$rHr$1$kJ}K!!#(B +* Various Various:: $BK\Ev$K$$$m$$$m$J$b$N!#(B +@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$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(B4$BJ8;z@h$K0\F0$7!"(B@kbd{C-u 9 0 0 I s s p} $B$O(B +$B1JB3(B @code{Suject} $BJ8;zNs$N0lIt%9%3%"K!B'$N(B900$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$&!)$(!<$H!"$?$$$F$$$NL?Na$,$7$F$$$k;v$O!"(B``$B@8$N(B'' $B@\F,(B +$B0z?t$rFCJL$JJ}K!$G2r$`$@$1B?(B +$B$/$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?(B +$BNa(B @kbd{M-C-u} $B$K%7%s%\%k@\F,0z?t(B @code{a} $B$rM?$($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%\%k@\F,0z?t(B @code{a} +@code{b} $B$rM?$($k(B'' $B$H$$$&;v$G$9!#o$K$?$/$5$s$N$b$N$,$"$j$^$9!#9,1?$J;v$K!"$=$l(B +$B$i$O$9$Y$FF1$89=J8$r;H$$$^$9$N$G!"$"$^$j7y$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$"$k!#(B +* Mode Line Formatting:: $B%b!<%I9T$N=qK!;EMMJQ?t$K4X$9$k$$$/$D$+$N5,B'!#(B +* Advanced Formatting:: $B?'!9$JJ}K!$G=PNO$r=$@5$9$k!#(B +* User-Defined Specs:: Gnus $B$K$"$J$?<+?H$N4X?t$r8F$P$;$k!#(B +* Formatting Fonts:: $B;EMM$rB?:L$GAGE($K8+$;$k!#(B +@end menu + +$B8=:_$N$H$3$m!"(Bgnus $B$O0J2<$N=qK!;EMMJQ?t$r;H$$$^$9(B: +@code{gnus-group-line-format}$B!"(B@code{gnus-summary-line-format}$B!"(B +@code{gnus-server-line-format}$B!"(B@code{gnus-topic-line-format}$B!"(B +@code{gnus-group-mode-line-format}$B!"(B@code{gnus-summary-mode-line-format}$B!"(B +@code{gnus-article-mode-line-format}$B!"(B +@code{gnus-server-mode-line-format}$B!"(B +@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;z(B +$B$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$J$k$h$&$K!"(B +$B=PNO$K(B @dfn{$B5M$a(B} $B$l$i$l$^$9!#(B@samp{%5y} $B$O$=$NItJ,$r>o$K(B ($B>/$J$/$H$b(B) 5 +$BJ8;z$ND9$5$K$J$k$h$&$K!":8$K6uGr$r5M$a$^$9!#$b$7(B @samp{%-5y} $B$H$9$l$P!"(B +$BBe$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(B6$BJ8;z(B +$B$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<$N(B2$B$D$N0c$$0J30$O!"%P%C%U%!9T$K4p$E$/=qK!;EMMJQ?t$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!"(BEmacs $B$,(B +@samp{%b} $B$r(B +$B$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$,(B6$BJ8;z$h$j>/$J$/L5$/$J$i$J$$;v$rJ]>Z$9$k$?$a$K5M(B +$B$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 + +$B$b$7$3$l$i$N>e5i;2>H$r$?$/$5$s;H$C$F$$$k$J$i!"(Bgnus $B$,$H$F$bCY$/$J$k$N$,(B +$B$o$+$k$G$7$g$&!#$3$l$O$"$J$?$N9T$N308+$KK~B-$7$?$H$-$K(B @kbd{M-x +gnus-compile} $B$r$N;XDj$+$i$N>pJs$HA4$/F1$8$h$&$K%P%C%U%!$K(B +$BA^F~$5$l$^$9!#4X?t$O0UL#$NL5$$CM$H6&$K8F$P$l$k;v$b$"$j$($^$9$N$G!"$=$l$N(B +$BBP:v$r$9$k$Y$-$G$9!#(B + +$B?7$7$$4X?t$rDj5A$7$J$$$G$b!"%A%k%@=$>~;R(B (@pxref{Advanced Formatting}) +$B$r;H$C$F$[$H$s$IF1$8;v$rC#@.$9$k;v$,$G$-$^$9!#Nc$G$9(B: @samp{%~(form +(count-lines (point-min) (point)))@@}$B!#$3$3$GM?$($i$l$?<0$OI>2A$5$l$F!"(B +$B8=:_$N9T?t$r$b$?$i$7!"$=$l$+$iA^F~$5$l$^$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$J(B +@code{mouse-face} $B%W%m%Q%F%#$,@_Dj$5$l!"$=$l$O$=$3$K%^%&%9$N%]%$%s%?!<$r(B +$B$"$o$;$?$H$-$K(B (@code{gnus-mouse-face} $B$K$h$C$F(B) $B%O%$%i%$%H$5$l$k$3$H$K(B +$B$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$7(B +@samp{%@{1} $B$H$7$?$J$i!"Be$o$j$K(B @code{gnus-face-1} $B$rF@!"0J2eEy$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$K2(B +$B$N%&%#%s%I%&$r>C$7$F!"(BEmacs $B$N2hLLA4BN$r@jM-$7$^$9!#$3$l$O=i4|@_Dj$G(B +@code{t} $B$G$9!#(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$O(B +@code{group} $B$r%-!<$H$7$F;H$$$^$9!#;HMQ2DG=$JL>A0$N40A4$J0lMw$O2<$K5s$2(B +$B$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(B3$B$DL\$NMWAG!"(B@code{point} $B$r;}$D%P%C%U%!$KCV$+$l$^$9!#(B +@code{frame} $BJ,3d$G$O!"%?%0(B @code{frame-focus} $B$,9=@.MWAG$G$"$k(B ($B$9$J$o(B +$B$A!"(B@code{point} $B%?%0$,B8:_$9$k$+$I$&$+$K$h$C$F!"%j%9%H$N(B3$BHVL\$+(B4$BHVL\$+(B +$B$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(B3$B$D$N%P%C(B +$B%U%!$,!"(B@code{gnus-carpal} $B$,(B @code{nil} $B$G$J$$$J$i!"(B4$B$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!#(B2$B$D$N%P%C%U%!$KIT;W5D$J(B 100% $B%?%0$,IU$$$F$$$^$9!#$=$7$F!"$"$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!"(B2$B$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 = "(" buffer-name " " size *[ "point" ] *[ "frame-focus"] ")" +size = number | frame-params +buffer-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$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 +@code{gnus-window-min-height} ($B=i4|CM(B 1) $B$NJ8;z$N9b$5$h$j$b>.$5$/$F$O$J(B +$B$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$N(B2$B$D$NJQ?t$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$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 +@code{gnus-configure-frame} $B$r8F$V$3$H$G$9!#$3$l$O%P%C%U%!$rJ,3d$9$k$H$-(B +$B$KA4$F$NK\Ev$N;E;v$r$9$k4X?t$G$9!#2<$N$b$N$O(B5$B%&%#%s%I%&$N$H$F$b$P$+$2$?(B +$B@_Dj$G$9!#(B2$B$D$r%0%k!<%W%P%C%U%!$K!"(B3$B$D$r5-;v%P%C%U%!$N$?$a$K=<$F$^$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$H!"Ia(B +$BDL$N(B gnus $B$N7PO)$r;H$o$J$$$G!"$9$0$K$=$l$,$I$N$h$&$K8+$($k$+$N9M$($rF@$k(B +$B;v$,$G$-$^$9!#K~B-$9$k$^$G$=$l$GM7$s$G!"$=$l$+$i(B +@code{gnus-add-configuration} $B$r;H$C$F?7$7$$A[A|$r%P%C%U%!@_Dj%j%9%H$K2C(B +$B$($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 + +$B$3$l$O(B @code{gnus-buffer-configuration} $B$K;EMM2DG=$J%-!<$N0lMw$G$9(B: + +@code{group}$B!"(B@code{summary}$B!"(B@code{article}$B!"(B@code{server}$B!"(B +@code{browse}$B!"(B@code{message}$B!"(B@code{pick}$B!"(B@code{info}$B!"(B +@code{summary-faq}$B!"(B@code{edit-group}$B!"(B@code{edit-server}$B!"(B +@code{edit-score}$B!"(B@code{post}$B!"(B@code{reply}$B!"(B@code{forward}$B!"(B +@code{reply-yank}$B!"(B@code{mail-bounce}$B!"(B@code{draft}$B!"(B@code{pipe}$B!"(B +@code{bug}$B!"(B@code{compose-bounce}$B!"(B@code{score-trace}$B!#(B + +$B%-!<(B @code{message} $B$O(B @code{gnus-group-mail} $B$H(B +@code{gnus-summary-mail-other-window} $B$NN>J}$G;H$o$l$k;v$KCm0U$7$F2<$5$$!#(B +$B$b$7(B2$B$D$r6hJL$9$k$[$&$,K>$^$7$$$J$i!"$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 + +@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@_Dj$9$k;v$,$G$-$^$9!#(B + + +@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 @code{gnus-summary-line-format}$B!"(B +@code{gnus-group-line-format} $B$J$I$J$I$G$9!#$5$F!"(Bgnus $B$O$b$A$m$s$3$l$i(B +$B$NJQ?t$,$I$N$h$&$J$b$N$G$bCm0U$7$^$9$,!"IT1?$J;v$K!"$=$l$i$rJQ99$9$k$H!"(B +$BBgJQ=EBg$JB.EYDc2<$r0z$-5/$3$9;v$K$J$j$^$9!#(B ($B$3$l$i$NJQ?t$N=i4|CM$O$=$l(B +$B$i$K4XO"IU$1$i$l$?%P%$%H%3%s%Q%$%k$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$O(B @code{group} $B!"(B@code{article}$B!"(B@code{summary}$B!"(B@code{server}$B!"(B +@code{browse}$B!"(B@code{tree} $B$J$I$G$9!#$b$7BP1~$9$k%7%s%\%k$,B8:_$9$k$H!"(B +gnus $B$O3:Ev$9$k$G$"$m$&>pJs$G%b!<%I9T$r99?7$7$^$9!#$3$NJQ?t$,(B @code{nil} +$B$G$"$k$J$i!"2hLL$N:FIA2h$O$b$C$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%H(B) +$B$G$9!#(B@code{gnus-visual} $B$,(B @code{nil} $B$G$"$k$H!"%^%&%9%O%$%i%$%H$O$J$5(B +$B$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$,(BTops 20 $B%7%9%F%`>e(B +$B$G(B Emacs $B$r;H$C$F$$$?:"$N(B '89 $BG/$N2F$r;W$$5/$3$7$F$_$^$7$g$&!#(B300 $B?M$NMx(B +$BMQe$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(B +$B$F!"%/%j%C%/$9$k$@$1$G2?$G$b$G$-$k%\%?%s$@$i$1$N%P%C%U%!$r(B gnus +$B$KI=<($5$;$k$3$H$,$G$-$^$9!#$H$C$F$b4JC1$G$9!"$[$s$H$K!#;X05NEK!(B +$B$N@h@8$K65$($F$"$2$F!#(B($BLuCm(B: carpal $B$H$O$K$b2?$+$=$&$$$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$=(B +$B$N$h$&$J$3$H$r2DG=$K$7$^$9!#3F@)8f;R$O;0$D$NMWAG$+$i@.$j$^$9!#(B +@var{$B4X?t(B}$B!"(B@var{$B;~4V(B}$B!"(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(B +$B$9$k@)8f;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::(B +$B$9$k@)8f;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(B +$B$F$$$J$$;~$K8B$j!"(B@var{$B;~4V(B} $BJ,8e$K8F$S=P$5$l$^$9!#0lC6(B Emacs $B$,(B +$B$:$C$H6uE>>uBV$K$J$C$?8e$O!"$3$N4X?t$O(B @var{$B;~4V(B} $BJ,Kh$K8F$S=P$5(B +$B$l$^$9!#(B + +@var{$B6uE>(B} $B$,?t$G(B @var{$B;~4V(B} $B$b?t$G$"$k>l9g!"$3$N4X?t$O!"(B Emacs +$B$N6uE>>uBV$,(B @var{$B6uE>(B} $BJ,B3$$$?;~$K8B$j!"(B@var{$B;~4V(B} $BJ,Kh$K8F$S(B +$B=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!"(B +Emacs $B$N6uE>>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(B +$B$J$1$l$P$J$i$:!"$3$N4X?t$OKhF|$=$N:"$N;~4V$K$J$k$H0lEY8F$S=P$5$l(B +$B$^$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$9$k$h$&$K@_Dj$9$k$K$O!"(B +@code{gnus-use-demon} $B$r(B @code{t} $B$K@_Dj$7$J$-$c$$$1$J$$$s$@$1$I(B +$B$M!#(B + +$B$H$$$&$o$1$G!"@)8f;R$rDI2C$7$?$1$l$P!"(B @file{.gnus} $B%U%!%$%k$K!"(B +$B0J2<$N$h$&$J$b$N$r=q$/$3$H$,$G$-$^$9!#(B + +@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 +$B$3$N$?$a$N4{@=4X?t$,$$$/$D$+:n@.$5$l$F$$$^$9!#(B +@code{gnus-demon-add-nocem}$B!"(B +@code{gnus-demon-add-disconnection}$B!"(B +@code{gnus-demon-add-nntp-close-connection}$B!"(B +@code{gnus-demon-add-scan-timestamps}$B!"(B +@code{gnus-demon-add-rescan}$B!"(B@code{gnus-demon-add-scanmail} $B$G(B +$B$9!#$3$l$i$NG=NO$,M_$7$1$l$P!"C1$K$3$l$i$N4X?t$r(B @file{.gnus} $B$K(B +$BF~$l$F$/$@$5$$!#(B + +@findex gnus-demon-init +@findex gnus-demon-cancel +@vindex gnus-demon-handlers +$B$b$7(B @code{gnus-demon-handlers} $B$G@)8f;R$rD>@\DI2C$7$?>l9g$K$O!"(B +$B$=$l$r8z$+$;$k$?$a$K(B @code{gnus-demon-init} $B$rC$9$K$O!"(B@code{gnus-demon-cancel} $B4X?t$r;H(B +$B$&$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!#(B +$BA4$F$N%5!<%P!<$+$iA4$F$N%K%e!<%9$H%a!<%k$rFsICKh$KD4$Y$^$o$94X?t(B +$B$rIU$12C$($A$c$C$?$j$9$k$H!"$I$s$JN)GI$J%7%9%F%`$G$b4V0c$$$J$/$*(B +$BJ'$$H"$K$7$F$7$^$$$^$9!#$=$&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(B +$B$G$9!#%9%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(B +$B$l$^$9!#$3$l$i$N5!4X$ODL>o0l=o$K!"(B@dfn{NoCeM} $B%a%C%;!<%8$bAw?.$7(B +$B$^$9!#(B@dfn{NoCeM} $B$O(B ``no see-'em'' ($BH`$i$r8+$?$/$J$$(B)$B$HH/2;$5$l!"(B +$B0UL#$O$=$NL>A0$NDL$j$G$9(B --- $B$3$N%a%C%;!<%8$O!":a$rHH$7$F$$$k5-(B +$B;v$r!"$D$^$j!">C$7$F$7$^$$$^$9!#(B + +$B$I$&$;$=$N5-;v$,C$7$5$l$F$7$^$&$N$J$i!"$3$l$i(B NoCeM $B%a%C%;!<(B +$B%8$O2?$K;H$o$l$k$N$G$7$g$&(B? $B$"$k%5%$%H$G$OC$7%a%C%;!<%8$r0z(B +$B$-C$7%a%C%;!<%8$N$_$7(B +$B$+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(B +$B$G$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|@_(B +$BDjCM$O(B @code{("news.lists.filters" "news.admin.net-abuse.bulletins" +"alt.nocem.misc" "news.admin.net-abuse.announce")} $B$G$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/(B +$B$N8@$&$3$H$K=>$$$?$$$+$r;XDj$7$^$9!#=i4|@_DjCM$O(B @code{("Automoose-1" +"rbraver@@ohww.norman.ok.us" "clewis@@ferret.ocunix.on.ca" +"jem@@xpat.com" "snowhare@@xmission.com" "red@@redpoll.mrfs.oh.us +(Richard E. Depew)")} $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$O0J2<$G$9!#(B + +@table @samp +@item clewis@@ferret.ocunix.on.ca; +@cindex Chris Lewis +Chris Lewis --- $BC$7$F$$$^$9!#(B + +@item Automoose-1 +@cindex CancelMoose[tm] +$B<+F01?E>$N(B CancelMoose[tm]$B!#(B CancelMoose[tm] $B$O%N%k%&%'!C$7$H!"(Bspew ($B5UN.5-;v(B) $B$r:o=|$7$F$$(B +$B$^$9!#(B +@end table + +$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$kr7o(B ...)} $BMWAG$r;H$&I,MW$,$"$j(B +$B$^$9!#3F>r7o$OJ8;zNs(B ($B;H$$$?$$l9g$O(B @var{$BJ8;zNs(B} $B$O;H(B +$B$$$?$/$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$?$/(B +$B$J$1$l$P!"0J2<$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(B +$B$/$F$O$J$j$^$;$s!#=i4|@_Dj$G$O(B @code{mc-verify} $B$G$"$j!"$3$l$O(B +Mailcrypt $B4X?t$G$9!#$b$7$3$l$,Hs>o$KCY$/$F!"$"$J$?$,>ZL@7k2L$r5$(B +$B$K$7$J$$(B ($B$3$l$O$?$V$s4m81$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$r(B +$BL$>ZL@(B($B$G$b$=$l$r;H$&(B)$B$H$7$?$$$N$J$i!"0J2<$N$h$&$K$9$k$3$H$,$G$-(B +$B$^$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|(B +$B@_DjCM$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$l$rC;$/$9$k$[$I(B gnus $B$OB.$/$J$j$^$9$,!"8E$$%9%Q%`$r8+$k(B +$B$3$H$K$J$C$F$7$^$&$+$b$7$l$^$;$s!#(B + +@end table + +NoCeM $B$r;H$&$H!"$b$7$+$9$k$H%a%b%j6t$$$K$J$k$+$b$7$l$^$;$s!#$"$J(B +$B$?$,$?$/$5$s$N@8$-$?%0%k!<%W(B ($B$D$^$j9XFI$"$k$$$OHs9XFI%0%k!<%W(B) +$B$r;}$C$F$$$k$N$J$i!"(BEmacs $B%W%m%;%9$OBg$-$/$J$C$F$7$^$&$G$7$g$&!#(B +$B$b$7$3$l$,LdBj$G$"$l$P!"Hs9XFI$N%0%k!<%W$rA4It(B ($B$"$k$$$O$=$NB?$/(B +$B$r(B) $B>C$75n$C$F$7$^$C$?J}$,NI$$$G$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%!$G$O!"$3$l$O==J,4JC1$G$9(B --- $BC1$K(B @code{undo} $B%\%?%s$r2!(B +$B$9$@$1$G$9!#$7$+$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$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$-$^$;$s!#(B + +Gnus $B$O!"MxMQ$72DG=$J(B +$B%-!<4X?t$O6O$+$7$+Ds6!$7$F$$$^$;$s!#$3$l$i$O!"%0%k!<%W$N:o=|!"%0%k!<(B +$B%W$NE=$jIU$1!"%0%k!<%W$N4{FI5-;v$N%j%9%H$NJQ99!"$=$l$@$1$J$s$G$9!#(B +$B>-Mh$O$b$C$H4X?t$,DI2C$5$l$k$+$b$7$l$^$;$s$,!"4X?t$NDI2C$O$=$l$>(B +$B$lJ]B8$9$k$Y$-%G!<%?$rA}$d$9$3$H$K$J$k$N$G!"(Bgnus $B$O7h$7$F40A4$d(B +$B$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!(B +$B$5$l$^$9!#$3$l$O(B @code{gnus-use-undo} $B$,(B @code{nil} $B0J30$G$"$l$P(B +$B;HMQ$5$l!"$3$l$,=i4|@_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$F$$$J$$5-;v$r$r$?$^$?$^8+$D$1$?$H$7$?$i!"(B@kbd{c} $BL?Na$G(B +$BC$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(B +$B$rMxMQ$9$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=<($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(B +$B$F$o$1$@$M(B! $B$3$l$O$=$&$9$k$N$K$T$C$?$j$JJ}K!$G$9!#$5$i$K$3$l$O!"(B +$B$"$J$?$,%K%e!<%9$rFI$s$G$$$k$s$@$H$$$&$3$H$r!"$"$J$?$N8*1[$7$K8+(B +$B$D$a$F$$$k?M$K0u>]$E$1$k$?$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$?$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(B +$B$l$O!"%M%C%H>e$NMxMQ.$5(B +$B$J2hA|$G!"%G!<%?%Y!<%9$r;}$?$;$F!"$"$kEE;R%a!<%k%"%I%l%9$,$"$C$?(B +$B$i!"$=$l$KE,@Z$J2hA|$r8+$D$1$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;zNs(B @* +@file{http://www.cs.indiana.edu/picons/search.html} $B$r@_Dj$9$k$3(B +$B$H$G!"(BSteve 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%$%s(B +$B%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=<((B +$B$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(B +$B$O$J$j$^$;$s!#Gr9u$h$j$b$b$C$H4qNo$J?'IU$-$N(B picon $B$rI=<($9$k$?(B +$B$a$K$O!"(B@code{xpm} $B$+(B @code{gif} $B$I$A$i$+$r(B XEmacs $B$H0l=o$K%3%s(B +$B%Q%$%k$7$F$$$kI,MW$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%]!<%HIU$-$G%3%s%Q%$%k$7$J$1$l$P$J$j$^$;$s!#$=$&(B +$B$G$J$1$l$P!"(B@code{netpbm} $B%f!<%F%#%j%F%#$r%$%s%9%H!<%k$7$F$*$/$+!"(B +$B$"$k$$$OB>$N2?$+$r;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%!%$(B +$B%k$KF~$l$F!"(Bgnus $B$r5/F0$7$F$/$@$5$$!#(B + +@lisp +(setq gnus-use-picons t) +(add-hook 'gnus-article-display-hook + 'gnus-article-display-picons t) +(add-hook 'gnus-article-display-hook + 'gnus-picons-article-display-x-face) +@end lisp + +@code{gnus-picons-database} $B$,(B picon $B%G!<%?%Y!<%9$,4^$^$l$F$$$k(B +$B%G%#%l%/%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$rDI(B +$B2C$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=(B +$B<($9$k$3$H$,$G$-$^$9!#(BGnus $B$O(B picon $B%G!<%?%Y!<%9$N;0$D$N>O$H$I$&(B +$BAj8_:nMQ$9$l$P$h$$$+$rCN$C$F$$$^$9!#$9$J$o$A!"(Bgnus $B$O%K%e!<%9%0(B +$B%k!<%W$N3(!"Cxl=j!#(B@file{news}$B!"(B @file{domains}$B!"(B +@file{users} ($B$J$I$J$I(B) $B$N%5%V%G%#%l%/%H%j!<$,4^$^$l$F$$$k%G%#%l(B +$B%/%H%j!<$r;X$7$F$$$J$1$l$P$J$j$^$;$s!#$3$l$O(B +@code{gnus-picons-piconsearch-url} $B$,(B @code{nil} $B$G$"$k$H$-$N$_(B +$B;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(B +$B%s$O(B @file{http://www.cs.indiana.edu:800/piconsearch} $B$G$9!#%M%C(B +$B%H%o!<%/CY1d$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(B +$B$9(B ($B$3$l$O=i4|@_Dj$G(B @samp{*Picons*} $B%P%C%U%!$K0LCV$7$^$9(B)$B!#B>$N(B +$BM-8z$J>l=j$H$7$F$O(B @code{article}$B!"(B @code{summary}$B!"$"$k$$$O(B +@samp{*scratch*} $B$@$m$&$HCN$C$?$3$H$G$O$"$j$^$;$s!#$?$@$=$N%P%C(B +$B%U%!$rI8=`$N(B gnus $BAkG[CV=hM}(B --- @pxref{Windows Configuration}$B$K(B +$B$h$C$F8+$($k$h$&$K$7$F$*$/$3$H$r3NG'$7$F$/$@$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(B +$B$;$^$;$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[(B +$BCV$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(B +$B$&$K!"0J2<$N4X?t$rE,@Z$J%U%C%/$KDI2C$9$kI,MW$,$"$j$^$9!#(B + +@vindex gnus-article-display-hook +@vindex gnus-picons-display-where +@table @code +@item gnus-article-display-picons +@findex gnus-article-display-picons +$BCxLr$K$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$?(B +$B$a$N%5%V%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(B +$B%V%G%#%l%/%H%j!<$N%j%9%H!#=i4|@_DjCM$O(B @code{("domains")} $B$G$9!#(B +$B$3$N%j%9%H$K(B @samp{"unknown"} $B$rDI2C$7$F$*$-$?$/$J$k?M$b$$$k$G$7$g(B +$B$&!#(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(B +$B$NL?Na$,(B @code{X-Face} $B%X%C%@!<$r(B X $B%S%C%H%^%C%W(B (@code{xbm}) $B$K(B +$BJQ49$9$k$N$K;HMQ$5$l$^$9!#=i4|@_DjCM$O(B @code{(format "@{ echo '/* Width=48, +Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s" +gnus-picons-x-face-file-name)} $B$G$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|(B +$B@_DjCM$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$^(B +$B$&$H!"(BXEmacs $B$N%U%l!<%`$O$a$A$c$a$A$c$K$J$C$F$7$^$&$G$7$g$&!#$3(B +$B$l$rB?>/$J$j$H$b7Z8:$9$k$K$O!"(B@code{gnus-picons-has-modeline-p} +$B$r(B @code{nil} $B$K@_Dj$7$F$/$@$5$$!#$3$l$O(B picon $B%P%C%U%!$+$i%b!<(B +$B%I9T$r$H$7$F;n$7$F$_$k3HD%;R$N=g=x%j%9%H!#=i4|@_DjCM$O(B +@code{("xpm" "gif" "xbm")} $B$+$i(B XEmacs $B$KAH$_9~$^$l$F$$$J$$$b$N(B +$B$r0z$$$?$b$N$G$9!#(B + +@item gnus-picons-display-article-move-p +@vindex gnus-picons-display-article-move-p +picon $B$rI=<($7$F$$$k$H$-$K%+!<%=%k0LCV$r:G=i$N6u9T$^$GF0$+$9$+$I(B +$B$&$+$r;XDj!#$3$l$O(B @code{gnus-picons-display-where} $B$NCM$,(B +@code{article} $B$G$"$k$H$-$N$_8z2L$,$"$j$^$9!#(B + +@item gnus-picons-clear-cache-on-shutdown +@vindex gnus-picons-clear-cache-on-shutdown +Gnus $B$r=*N;$9$k$H$-$K(B picon $B%-%c%C%7%e$r>C$75n$k$+$I$&$+!#(BGnus +$B$O/@aLs$G$-$^$9$,!"%a%b%j$r$$$/$i$+?)$$$^$9!#$b$7$3$NJQ(B +$B?t$r(B @code{nil} $B$K@_Dj$9$l$P!"(Bgnus $B$O$=$N%-%c%C%7%e$r7h$7$F>C$7(B +$B$^$;$s!#$=$l$r>C$75n$k$K$OC5n$5$l$^$9!#=i4|@_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%^%$(B +$B%j!<$r;H$C$F$$$k%Q%C%1!<%8$O8=:_(B gnus $B$@$1$G$9$N$G!"$3$3$G@bL@$7(B +$B$^$9!#(B + +$B0l8@$G8@$($P(B --- gnus $B$G%9%^%$%j!<$r;H$&$K$O!"0J2<$r(B +@file{.gnus.el} $B$U$!$$$k$K=q$$$F$/$@$5$$!#(B + +@lisp +(add-hook 'gnus-article-display-hook 'gnus-smiley-display t) +@end lisp + +$B%9%^%$%j!<$O!"J8;z$N4i%^!<%/(B --- @samp{:-)}$B!"(B@samp{:-=}$B!"(B +@samp{:-(} $B$J$I$H$$$C$?$b$N(B --- $B$r3($KBP1~$5$;!"J8;z$N4i%^!<%/$N(B +$BBe$o$j$K$=$N3($rI=<($7$^$9!#$3$NJQ49$OJ8;z$K%^%C%A$9$k@55,I=8=$H(B +$B$=$l$N%U%!%$%kL>$X$NBP1~$N%j%9%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{:)}$B!"(B @samp{:(} $B$J$I(B +$B$K%^%C%A$9$k(B) $B$H!"(B@code{smiley-nosey-regexp-alist} (@samp{:-)}$B!"(B +@samp{:-(} $B$J$I$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(B +$B$^$9!#$3$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($G(B +$BCV$-49$($?$$%0%k!<%W$K%^%C%A$9$k@55,I=8=!"$=$7$F;0HVL\$NMWAG$OI=(B +$B<($5$;$?$$%U%!%$%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(B +$B$N?'$r;H$&$+$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}$B!"(B@code{top-toolbar}$B!"(B +@code{bottom-toolbar}$B!"(B@code{right-toolbar}$B!"(B@code{left-toolbar} +$B$N$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<+(B +$BF08!=P$7$^$9$,!"$b$7I8=`E*$G$J$$%G%#%l%/%H%j!<9=B$$r;}$C$F$$$k>l(B +$B9g$O!"$3$l$rl9gBEEv$J7k2L$r=P$7$^$9(B --- +$B$?$H$(%K%e!<%9%j!<%@!<$N2>LL$r$+$V$C$?J8;zNs@Z$j9o$_5!$G@8@.$5$l(B +$B$?J8;zNs$,:9$7=P$5$l$F$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$r(B +$B2!$7IU$1$k$?$a$NEE;R%a!<%k%"%I%l%9$rC5$=$&$H$7$F!"5$0c$$$N$h$&$K(B +$B%K%e!<%9>e$r$&$m$D$$$F(B grep $B$7$^$/$C$F$$$^$9!#$3$l$KBP$9$kH?F0$H(B +$B$7$F!"B?$/$N?M!9$,(B @code{From} $B9T$KL50UL#$J%"%I%l%9$rF~$l$O$8$a(B +$B$k$h$&$K$J$C$F$7$^$$$^$7$?!#$3$l$OHs@8;:E*$J$3$H$@$H;d$O;W$$$^$9(B +--- $B$"$J$?$,=q$$$?$3$H$KBP$9$kJV?.$H$7$F@5Ev$J%a!<%k$rAw$k$3$H$r(B +$BLLE]$K$5$;!"$^$?C/$,=q$$$?$b$N$J$N$+$rJ,$+$j$E$i$/$7$^$9!#$3$s$J(B +$B=q$-49$($O7k6I$O!"2!$7IU$1@kEA%a!<%k$=$l<+?H$h$j$bBg$-$J6<0R$H$J(B +$B$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$^$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%@!<$,$D$$$F$$$l$P$*$=$i$/(B OK $B$@$m$&!"$H$$(B +$B$&$3$H$G$9!#;D$j$OA4$F(B @samp{spam} $B%0%k!<%W$K9T$-$^$9!#(B($B$3$N%"%$(B +$B%G%"$O$*$=$i$/(B Tim Pierce $B;a$K$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!<%P!<$HD>@\OC$7!"(B@code{To} $B%X%C%@!<$K$"$J$?$N%a!<(B +$B%k%"%I%l%9$,L@<($5$l$J$$$h$&$K$7$^$9!#$J$s$G$=$s$J$3$H$r$9$k$N$+(B +$B$O$o$+$j$^$;$s$,(B --- $B$*$=$i$/;d$?$A$NN"$r$+$/5!9=$NN"$r$+$/$?$a(B +$B$+$J(B? $B$I$A$i$K$7$F$b!"BP=h$O4JC1$J$3$H$G$9(B --- $B$"$J$?08$F$G(B +$B$J$$$b$N$rA4It(B @samp{spam} $B%0%k!<%W$K$$$l$k$@$1$G$9!#$3$l$O$*9%(B +$B$_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!#$^(B +$B$"!"$=$l$G$b$H$-$I$-(B @samp{spam} $B%0%k!<%W$r%A%'%C%/$7$F!"@5$7$$(B +$B%a!<%k$,$"$k$+%A%'%C%/$7$J$/$F$O$$$1$^$;$s$1$I$M!#$b$7$"$J$?$O<+(B +$BJ,$,NI$$%M%C%H%o!<%/;TL1$G$"$k$H;W$C$F$$$k$J$i!"$=$l$>$l$N2!$7IU(B +$B$1@kEA%a!<%k$N4X78Ev6I$K6l>p$rAw$jIU$1$k$3$H$5$($b$G$-$^$9(B --- +$B2K$J$H$-$K$G$b$M!#(B + +$B$^$?!"$"$J$?$,BU$1p$r$$$&J}$,NI$$(B +$B$H;W$&$+$b$7$l$^$;$s!#$3$l$O(B @* +@file{} +$B$+$i!VL5NA$G!WMxMQ$G$-$^$9!#$[$H$s$I$N(B spam $B%a!<%k$O<+F0E*$KAw$i(B +$B$l$F$$$k$N$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$K(B +$BO"Mm$ruBV$G$9!#;d$N0U8+$H(B +$B$7$F$O!"(B @code{From} $B%X%C%@!<$K56B$$7$FB8:_$7$J$$%I%a%$%s$KAw$i(B +$B$;$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|(B +$B@_DjCM$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!#$=(B +$B$N=i4|@_DjCM$O(B @samp{SAVEDIR} $B4D6-JQ?t$NCM$+!"$=$NJQ?t$,@_Dj$5$l(B +$B$F$$$J$$>l9g$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$K(B +$BFI$_9~$^$l$F$$$k$H$$$&$3$H$KCm0U$7$F$/$@$5$$!#$3$l$O$D$^$j!"$3$N(B +$BJQ?t$r(B @file{.gnus.el} $B$NCf$G@_Dj$7$F$b!"$3$NJQ?t$K$h$C$F=i4|2=(B +$B$5$l$kB>$N%G%#%l%/%H%j!e5-$NJQ?t$K$OA4$/4X78$"$j$^$;$s(B --- $B$3$NJQ?t$OA4$F$N(B gnus $B%P%C(B +$B%U%!!<$N%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$$NL$@$1$rFI$b$&$HEXNO$7$^$9!#$3$NJQ?t(B ($B=i4|@_DjCM(B 4096) +$B$O!"%P%C%/%(%s%I$,%X%C%@!<$HK\J8$N4V$N6h@Z$j9T$r8+$D$1$k$^$G$KFI(B +$B$_9~$b$&$H$9$k@dBP:GBgD9$r;XDj$7$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$"(B +$B$l$P!"FI$_9~$_>e8B$O$"$j$^$;$s!#$b$7(B @code{t} $B$G$"$l$P!"%P%C%/%((B +$B%s%I$O5-;v$rItJ,ItJ,$GFI$_9~$b$&$H$O$;$:!"5-;vA4BN$rFI$_9~$_$^$9!#(B +$B$3$l$O(B @code{ange-ftp} $B$d(B @code{efs} $B$N$"$k%P!<%8%g%s$G0UL#$r$b(B +$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(B +$B$l$/$i$$$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(B +$B$G$9!#Nc$($P!"$b$7(B @samp{:} $B$,$"$J$?$N%7%9%F%`$G$O%U%!%$%kL>$NJ8(B +$B;z$H$7$F$O;H$($J$$>l9g(B ($B$"$J$?$O(B OS/2 $B%f!<%6$G$9(B) $B!"0J2<$N$h$&$K(B +$B$9$k$3$H$,$G$-$^$9!#(B + +@lisp +(setq nnheader-file-name-translation-alist + '((?: . ?_))) +@end lisp + +$Be$G$N$3$NJQ(B +$B?t$N=i4|@_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!#(B +$B$[$H$s$I$N%7%9%F%`$G$O=i4|@_DjCM$O(B @code{(invisible t intangible +t)} $B$G!"$3$l$OIT2D;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$re$,%^%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 +* Terminology:: $B2f!9$OK\Ev$KFq$7$$!"8l$N$h$&$J8l$r;H$&!#(B +* Customization:: $B$"$J$?$NMW5a$K1h$C$F(B gnus $B$r;EN)$F$k!#(B +* Troubleshooting:: $B>e$=$&$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 @file{http://www.stud.ifi.uio.no/~larsi/} $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$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!#(B $B?7$7$$$b$N(B $B$H(B $B8E$$$b$N!#(B + +$B:G=i$N(B ``$BE,@Z$J(B'' Gnus 5 $B$N%j%j!<%9$O(B1995$BG/(B11$B7n$K(B Emacs 19.30 $B$NG[I[$K4^(B +$B$^$l$?$H$-$K$J$5$l$^$7$?(B (132 $B$N(B (ding) Gnus $B$N%j%j!<%9(B $BB-$9$3$H$N(B +Gnus5.0 $B$N(B15$B%j%j!<%9(B)$B!#(B + +1996$BG/(B3$B7n$K(B ``September Gnus'' (99$B%j%j!<%9$N8e$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(B7$B7n(B28$BF|$K(B Red Gnus $B$N:n6H$,;O$^$j!"$=$l$O(B1997$BG/(B1$B7n(B25$BF|$K(B (84$B%j%j!<(B +$B%9$N8e$G(B) ``Gnus 5.4'' $B$H$7$F%j%j!<%9$5$l$^$7$?(B (67 $B%j%j!<%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$O(B +``Gnus 5.6'' $B$H$7$F(B1998$BG/(B3$B7n(B8$BF|$K%j%j!<%9$5$l$^$7$?!#(B + +$B$b$7@\F,<-$r;}$C$?HG$N(B Gnus -- ``(ding) Gnus'', ``September Gnus'', +``Red Gnus'', ``Quassia Gnus'' -- $B$K=P2q$C$F$b!":.Mp$7$J$$$G$/$@$5$$!#$"(B +$B$J$?$,62$,$C$F$$$k;v$rCN$i$l$F$O$$$1$^$;$s!#8e$m$K2<$,$j$J$5$$!#$f$C$/$j(B +$B$H!#B>$K2?$r$7$F$b!"Av$C$F$O9T$1$^$;$s!#$=$l$,FO$+$/$J$k$^$G!"@E$+$KJb$-(B +$B5n$j$J$5$$!#E,@Z$K%j%j!<%9$5$l$?HG$N(B Gnus $B$r8+$D$1$F!"Be$o$j$K$=$l$K4s$j(B +$BE:$C$F2<$5$$!#(B + +@menu +* Why?:: Gnus $B$NL\E*$O2?!)(B +* Compatibility:: Gnus $B$O(B @sc{gnus} $B$H$I$l$/$i$$8_49@-$,$"$k$N!)(B +* Conformity:: Gnus $B$OA4$F$NI8=`$rK~$?$=$&$H$9$k!#(B +* Emacsen:: Gnus $B$O$$$/$D$+$N8=BeE*$J(B Emacs $B4D6-$Gl$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$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!<%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$3$K$OCHqpJs$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-Nesreader} $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 + +@end table + +$B>e$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.32 $B$H$=$l0J9_!#(B + +@item +XEmacs 19.14 $B$H$=$l0J9_!#(B + +@item +Emacs 19.32 $B$H$=$l0J9_$K4p$E$$$?(B Mule$B!#(B + +@end itemize + +Gnus $B$O$3$l$h$j8E$$$I$s$J(B Emacsen $B$G$b40A4$KF0:n$7$J$$$G$7$g$&!#>/$J$/$H(B +$B$b!"?.Mj$G$-$kF0:n$O$7$J$$$G$7$g$&!#(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 Contributors +@subsection $B9W8%e!";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$NB?$/(B +$B$N;v$H6&$K(B)$B!#(B + +@item +Luis Fernandes---$B%G%6%$%s$H%0%i%U%#%C%/!#(B + +@item +Erik Naggum---$B1g=u!"9M$(!"%5%]!<%H!"%3!<%I$H$=$NB>!#(B + +@item +Wes Hardaker---@file{gnus-picon.el} $B$H(B @dfn{picon} $B$NItJ,$N%^%K%e%"%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%"%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$B!"(BMark +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(B2$B$O(B4$B!"$b$7$/$O(B Gnus 5.6/5.7$B!#(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$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%@!<$ru%U%!%$%kA4BN$r$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 +(@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$-$^$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$-$^$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$-$^$9(B +(@pxref{Browse Foreign Server})$B!#(B + +@item +Gnus $B$O%5!<%P!<$H$N(B2$B$D@\B3$G!"5-;v$rHsF14|$K$H$C$F$/$k;v$,$G$-$^$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{Windows Configuration})$B!#(B + +@item +$B%-!<%\!<%I$r;H$&Be$o$j$K!"%\%?%s$r%/%j%C%/$G$-$k$h$&$K$J$j$^$7$?(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}$B!"(B +@code{rnews-reply-mode} $B$H(B @code{gnus-msg} $B$NA4$F$N8E$$%+%9%?%^%$%:JQ?t(B +$B$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$$$^$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 +(@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 +(@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 +(@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$($r(B +$B$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 +(@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%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 +(@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 +(@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 +(@pxref{Article Keymap})$B!#(B + +@item +$B%U%l!<%`$,(B @code{gnus-buffer-configuration} $B$NItJ,$K$J$k;v$,$G$-$^$9(B +(@pxref{Windows Configuration})$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 +(@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 + +@lisp +(add-hook 'gnus-article-display-hook + 'gnus-article-hide-boring-headers t) +@end lisp + +@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}$B!"(B@code{or}$B!"(B@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 (@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 +(@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$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 (@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 +(@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 NNTP $B%5!<%P!<$,Ej9F$r5v2D$7$F(B +$B$$$J$$>l9g$G$b!"Ej9F$G$-$k$h$&$K$J$j$^$7$?(B (@pxref{Mail-To-News +Gateways})$B!#(B + +@item +$B%&%'%V8!:w%(%s%8%s(B (@dfn{DejaNews}$B!"(B@dfn{Alta Vista}$B!"(B@dfn{InReference}) +$B$+$i$N8!:w7k2L$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 (@pxref{Topic +Sorting})$B!#(B + +@item +$B%0%k!<%W$N0lItJ,$,FHN)$7$FJB$SBX$($G$-$k$h$&$K$J$j$^$7$?(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 +(@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 +(@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 +(@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$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 +@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$O(B @file{.netrc} +$B$N$h$&$J%U%!%$%k$G!"$I$3$G$I$N$h$&$K(B @sc{authinfo} $B$r(B @sc{nntp} $B%5!<%P!<(B +$B$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 Newest Features +@subsection $B:G?7$N5!G=(B +@cindex todo + +@dfn{todo list} $B$H$7$F$bCN$i$l$F$$$^$9!#o$K62$l$F2<$5$$!#(B + +($B$3$N0lMw$K8=$o$l$F$$$k5!G=$OI,$:$7$b;d$,$=$l$r + + + +http://www.uwsg.indiana.edu/hypermail/linux/kernel/9610/index.html + +http://www.miranova.com/gnus-list/ + +@end example + +@item +@samp{^-- } is made into - in LaTeX. + +@item + gnus-kill is much slower than it was in GNUS 4.1.3. + +@item + when expunging articles on low score, the sparse nodes keep hanging on? +@item + starting the first time seems to hang Gnus on some systems. Does +NEWGROUPS answer too fast? +@item + nndir doesn't read gzipped files. +@item + FAQ doesn't have an up node? +@item + when moving mail from a procmail spool to the crash-box, +the crash-box is only appropriate to one specific group. +@item + `t' `t' makes X-Faces disappear. +@item + nnmh-be-safe means that crossposted articles will +be marked as unread. +@item + Orphan score entries don't show on "V t" score trace +@item + when clearing out data, the cache data should also be reset. +@item + rewrite gnus-summary-limit-children to be non-recursive +to avoid exceeding lisp nesting on huge groups. +@item + expunged articles are counted when computing scores. +@item + implement gnus-batch-brew-soup +@item + ticked articles aren't easy to read in pick mode -- `n' and +stuff just skips past them. Read articles are the same. +@item + topics that contain just groups with ticked +articles aren't displayed. +@item + nndoc should always allocate unique Message-IDs. +@item + If there are mail groups the first time you use Gnus, Gnus'll +make the mail groups killed. +@item + no "no news is good news" when using topics. +@item + when doing crosspost marking, the cache has to be consulted +and articles have to be removed. +@item + nnweb should fetch complete articles when they are split into several +parts. +@item + scoring on head immediate doesn't work. +@item + finding short score file names takes forever. +@item + canceling articles in foreign groups. +@item + nntp-open-rlogin no longer works. +@item + C-u C-x C-s (Summary) switches to the group buffer. +@item + move nnmail-split-history out to the backends. +@item + nnweb doesn't work properly. +@item + using a virtual server name as `gnus-select-method' doesn't work? +@item + 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. + +@item + warn user about `=' redirection of a group in the active file? +@item + really unbinhex binhex files. +@item + take over the XEmacs menubar and offer a toggle between the XEmacs +bar and the Gnus bar. +@item +@example + 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)' + +@end example + +@item + nnml .overview directory with splits. +@item + asynchronous cache +@item + postponed commands. +@item + the selected article show have its Subject displayed in its summary line. +@item + when entering groups, get the real number of unread articles from +the server? +@item + sort after gathering threads -- make false roots have the +headers of the oldest orphan with a 0 article number? +@item + nndoc groups should inherit the score files of their parents? Also +inherit copy prompts and save files. +@item + command to start up Gnus (if not running) and enter a mail mode buffer. +@item + allow editing the group description from the group buffer +for backends that support that. +@item +gnus-hide,show-all-topics +@item + groups and sub-topics should be allowed to mingle inside each topic, +and not just list all subtopics at the end. +@item + a command to remove all read articles that are not needed to connect +threads -- `gnus-summary-limit-to-sparse-unread'? +@item + a variable to turn off limiting/cutting of threads in the tree buffer. +@item + a variable to limit how many files are uudecoded. +@item + add zombie groups to a special "New Groups" topic. +@item + server mode command: close/open all connections +@item + put a file date in gnus-score-alist and check whether the file +has been changed before using it. +@item + on exit from a digest group, go to the next article in the parent group. +@item + hide (sub)threads with low score. +@item + when expiring, remove all marks from expired articles. +@item + gnus-summary-limit-to-body +@item + a regexp alist that says what level groups are to be subscribed +on. Eg. -- `(("nnml:" . 1))'. +@item + easier interface to nnkiboze to create ephemeral groups that +contain groups that match a regexp. +@item + allow newlines in urls, but remove them before using +the URL. +@item + If there is no From line, the mail backends should fudge one from the +"From " line. +@item + fuzzy simplifying should strip all non-alpha-numerical info +from subject lines. +@item + gnus-soup-brew-soup-with-high-scores. +@item + nntp-ping-before-connect +@item + command to check whether NOV is evil. "list overview.fmt". +@item + when entering a group, Gnus should look through the score +files very early for `local' atoms and set those local variables. +@item + message annotations. +@item + topics are always yanked before groups, and that's not good. +@item + (set-extent-property extent 'help-echo "String to display in minibuf") +to display help in the minibuffer on buttons under XEmacs. +@item + allow group line format spec to say how many articles there +are in the cache. +@item + AUTHINFO GENERIC +@item + support qmail maildir spools +@item + `run-with-idle-timer' in gnus-demon. +@item + stop using invisible text properties and start using overlays instead +@item + C-c C-f C-e to add an Expires header. +@item + go from one group to the next; everything is expunged; go to the +next group instead of going to the group buffer. +@item + gnus-renumber-cache -- to renumber the cache using "low" numbers. +@item + record topic changes in the dribble buffer. +@item + `nnfolder-generate-active-file' should look at the folders it +finds and generate proper active ranges. +@item + nneething-look-in-files-for-article-heads variable to control +whether nneething should sniff all files in the directories. +@item + gnus-fetch-article -- start Gnus, enter group, display article +@item + gnus-dont-move-articles-to-same-group variable when respooling. +@item + when messages are crossposted between several auto-expirable groups, +articles aren't properly marked as expirable. +@item + nneething should allow deletion/moving. +@item + TAB on the last button should go to the first button. +@item + 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. +@item + command for listing all score files that have been applied. +@item + a command in the article buffer to return to `summary' config. +@item + `gnus-always-post-using-current-server' -- variable to override +`C-c C-c' when posting. +@item + nnmail-group-spool-alist -- says where each group should use +as a spool file. +@item + when an article is crossposted to an auto-expirable group, the article +should be marker as expirable. +@item + article mode command/menu for "send region as URL to browser". +@item + on errors, jump to info nodes that explain the error. For instance, +on invalid From headers, or on error messages from the nntp server. +@item + when gathering threads, make the article that has no "Re: " the parent. +Also consult Date headers. +@item + a token in splits to call shrink-window-if-larger-than-buffer +@item + `1 0 A M' to do matches on the active hashtb. +@item + duplicates -- command to remove Gnus-Warning header, use the read +Message-ID, delete the "original". +@item + when replying to several messages at once, put the "other" message-ids +into a See-Also header. +@item + support setext: URL:http://www.bsdi.com/setext/ +@item + support ProleText: +@item + when browsing a foreign server, the groups that are already subscribed +should be listed as such and not as "K". +@item + generate font names dynamically. +@item + score file mode auto-alist. +@item + allow nndoc to change/add/delete things from documents. Implement +methods for each format for adding an article to the document. +@item + `gnus-fetch-old-headers' `all' value to incorporate +absolutely all headers there is. +@item + function like `|', but concatenate all marked articles +and pipe them to the process. +@item + 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. +@item + function for starting to edit a file to put into +the current mail group. +@item + score-find-trace should display the total score of the article. +@item + "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. +@item + look at procmail splitting. The backends should create +the groups automatically if a spool file exists for that group. +@item + function for backends to register themselves with Gnus. +@item + when replying to several process-marked articles, +have all the From end up in Cc headers? Variable to toggle. +@item + command to delete a crossposted mail article from all +groups it has been mailed to. +@item + `B c' and `B m' should be crosspost aware. +@item + hide-pgp should also hide PGP public key blocks. +@item + Command in the group buffer to respool process-marked groups. +@item + `gnus-summary-find-matching' should accept +pseudo-"headers" like "body", "head" and "all" +@item + When buttifying things, all white space (including +newlines) should be ignored. +@item + Process-marking all groups in a topic should process-mark +groups in subtopics as well. +@item + Add non-native groups to the list of killed groups when killing them. +@item + nntp-suggest-kewl-config to probe the nntp server and suggest +variable settings. +@item + add edit and forward secondary marks. +@item + nnml shouldn't visit its .overview files. +@item + allow customizing sorting within gathered threads. +@item + `B q' shouldn't select the current article. +@item + nnmbox should support a newsgroups file for descriptions. +@item + allow fetching mail from several pop servers. +@item + Be able to specify whether the saving commands save the original +or the formatted article. +@item + a command to reparent with the child process-marked (cf. `T ^'.). +@item + I think the possibility to send a password with nntp-open-rlogin +should be a feature in Red Gnus. +@item + The `Z n' command should be possible to execute from a mouse click. +@item + more limiting functions -- date, etc. +@item + be able to limit on a random header; on body; using reverse matches. +@item + a group parameter (`absofucking-total-expiry') that will make Gnus expire +even unread articles. +@item + a command to print the article buffer as postscript. +@item + variable to disable password fetching when opening by nntp-open-telnet. +@item + manual: more example servers -- nntp with rlogin, telnet +@item + checking for bogus groups should clean topic alists as well. +@item + canceling articles in foreign groups. +@item + article number in folded topics isn't properly updated by +Xref handling. +@item + 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. +@item + Extensive info pages generated on the fly with help everywhere -- +in the "*Gnus edit*" buffers, for instance. +@item + Topic movement commands -- like thread movement. Up, down, forward, next. +@item + a way to tick/mark as read Gcc'd articles. +@item + a way to say that all groups within a specific topic comes +from a particular server? Hm. +@item + `gnus-article-fill-if-long-lines' -- a function to fill +the article buffer if there are any looong lines there. +@item + `T h' should jump to the parent topic and fold it. +@item + a command to create an ephemeral nndoc group out of a file, +and then splitting it/moving it to some other group/backend. +@item + a group parameter for nnkiboze groups that says that +all kibozed articles should be entered into the cache. +@item + 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. +@item + nnfolder should append to the folder instead of re-writing +the entire folder to disk when accepting new messages. +@item + allow all backends to do the proper thing with .gz files. +@item + a backend for reading collections of babyl files nnbabylfolder? +@item + a command for making the native groups into foreign groups. +@item + server mode command for clearing read marks from all groups +from a server. +@item + when following up multiple articles, include all To, Cc, etc headers +from all articles. +@item + a command for deciding what the total score of the current +thread is. Also a way to highlight based on this. +@item + command to show and edit group scores +@item + a gnus-tree-minimize-horizontal to minimize tree buffers +horizontally. +@item + command to generate nnml overview file for one group. +@item + `C-u C-u a' -- prompt for many crossposted groups. +@item + 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. +@item + gnus-build-sparse-threads to a number -- build only sparse threads +that are of that length. +@item + have nnmh respect mh's unseen sequence in .mh_profile. +@item + cache the newsgroups descriptions locally. +@item + asynchronous posting under nntp. +@item + be able to control word adaptive scoring from the score files. +@item + a variable to make `C-c C-c' post using the "current" select method. +@item + `limit-exclude-low-scored-articles'. +@item + if `gnus-summary-show-thread' is a number, hide threads that have +a score lower than this number. +@item + split newsgroup subscription variable up into "order" and "method". +@item + buttonize ange-ftp file names. +@item + a command to make a duplicate copy of the current article +so that each copy can be edited separately. +@item + nnweb should allow fetching from the local nntp server. +@item + record the sorting done in the summary buffer so that +it can be repeated when limiting/regenerating the buffer. +@item + nnml-generate-nov-databses should generate for +all nnml servers. +@item + 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. +@item + M-g on a topic will display all groups with 0 articles in +the topic. +@item + command to remove all topic stuff. +@item + allow exploding incoming digests when reading incoming mail +and splitting the resulting digests. +@item + nnsoup shouldn't set the `message-' variables. +@item + command to nix out all nnoo state information. +@item + nnmail-process-alist that calls functions if group names +matches an alist -- before saving. +@item + use buffer-invisibility-spec everywhere for hiding text. +@item + variable to activate each group before entering them +to get the (new) number of articles. `gnus-activate-before-entering'. +@item + command to fetch a Message-ID from any buffer, even +starting Gnus first if necessary. +@item + when posting and checking whether a group exists or not, just +ask the nntp server instead of relying on the active hashtb. +@item + buttonize the output of `C-c C-a' in an apropos-like way. +@item + `G p' should understand process/prefix, and allow editing +of several groups at once. +@item + command to create an ephemeral nnvirtual group that +matches some regexp(s). +@item + nndoc should understand "Content-Type: message/rfc822" forwarded messages. +@item + it should be possible to score "thread" on the From header. +@item + hitting RET on a "gnus-uu-archive" pseudo article should unpack it. +@item + `B i' should display the article at once in the summary buffer. +@item + remove the "*" mark at once when unticking an article. +@item + `M-s' should highlight the matching text. +@item + when checking for duplicated mails, use Resent-Message-ID if present. +@item + 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. +@item + command for enter a group just to read the cached articles. A way to say +"ignore the nntp connection; just read from the cache." +@item + `X u' should decode base64 articles. +@item + a way to hide all "inner" cited text, leaving just the most +recently cited text. +@item + nnvirtual should be asynchronous. +@item + after editing an article, gnus-original-article-buffer should +be invalidated. +@item + there should probably be a way to make Gnus not connect to the +server and just read the articles in the server +@item + allow a `set-default' (or something) to change the default +value of nnoo variables. +@item + a command to import group infos from a .newsrc.eld file. +@item + groups from secondary servers have the entire select method +listed in each group info. +@item + a command for just switching from the summary buffer to the group +buffer. +@item + a way to specify that some incoming mail washing functions +should only be applied to some groups. +@item + Message `C-f C-t' should ask the user whether to heed +mail-copies-to: never. +@item + new group parameter -- `post-to-server' that says to post +using the current server. Also a variable to do the same. +@item + the slave dribble files should autosave to the slave file names. +@item + a group parameter that says what articles to display on group entry, based +on article marks. +@item + a way to visually distinguish slave Gnusae from masters. (Whip instead +of normal logo?) +@item + Use DJ Bernstein "From " quoting/dequoting, where applicable. +@item + Why is hide-citation-maybe and hide-citation different? Also +clear up info. +@item + group user-defined meta-parameters. + + + +From: John Griffith +@item + 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 + + + + +@item +@example +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 ""))) +@end example + +@item + 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. + + +@item +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: + + +@example +`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' +@end example + +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. + + +@item +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. + +@item +Please send a mail to bwarsaw@@cnri.reston.va.us (Barry A. Warsaw) and +tell him what you are doing. + +@item +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?... + +@item +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. + +@item +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 + + +@item +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. + +@item +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.) + +@item + 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 + +@item +Yes. I think the algorithm is as follows: + +@example +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; +@end example + +@item +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). + +@item +It would be nice if it also handled + + + +which should correspond to `B nntp RET sunsite.auc.dk' in *Group*. + + +@item + + 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. + + +@item + nndoc should take care to create unique Message-IDs for all its +articles. +@item + 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). +@item + rewrite gnus-demon to use run-with-idle-timers. + +@item + * 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. + +@item + 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. + +@item + `unsmileyfy-buffer' to undo smileification. + +@item + a command to give all relevant info on an article, including all +secondary marks. + +@item + when doing `-request-accept-article', the backends should do +the nnmail duplicate checking. + +@item + allow `message-signature-file' to be a function to return the +value of the signature file. + +@item + 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 + +@item + cache the newsgroups file locally to avoid reloading it all the time. + +@item + a command to import a buffer into a group. + +@item + nnweb should allow fetching by Message-ID from servers. + +@item + point in the article buffer doesn't always go to the +beginning of the buffer when selecting new articles. + +@item + a command to process mark all unread articles. + +@item + `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. + +@item + gnus-uu-mark-in-numerical-order -- process mark articles in +article numerical order. + +@item + (gnus-thread-total-score + (gnus-id-to-thread (mail-header-id (gnus-summary-article-header)))) +bind to a key. + +@item + sorting by score is wrong when using sparse threads. + +@item + a command to fetch an arbitrary article -- without having to be +in the summary buffer. + +@item + a new nncvs backend. Each group would show an article, using +version branches as threading, checkin date as the date, etc. + +@item + 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. + +@item + new Date header scoring type -- older, newer + +@item + use the summary toolbar in the article buffer. + +@item + a command to fetch all articles that are less than X days old. + +@item + 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. + +@item + 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)). + +@item + make it possible to cancel articles using the select method for the +current group. + +@item + `gnus-summary-select-article-on-entry' or something. It'll default +to t and will select whatever article decided by `gnus-auto-select-first'. + +@item + a new variable to control which selection commands should be unselecting. +`first', `best', `next', `prev', `next-unread', `prev-unread' are +candidates. + +@item + be able to select groups that have no articles in them +to be able to post in them (using the current select method). + +@item + be able to post via DejaNews. + +@item + `x' should retain any sortings that have been performed. + +@item + allow the user to specify the precedence of the secondary marks. Also +allow them to be displayed separately. + +@item + gnus-summary-save-in-pipe should concatenate the results from +the processes when doing a process marked pipe. + +@item + a new match type, like Followup, but which adds Thread matches on all +articles that match a certain From header. + +@item + a function that can be read from kill-emacs-query-functions to offer +saving living summary buffers. + +@item + a function for selecting a particular group which will contain +the articles listed in a list of article numbers/id's. + +@item + a battery of character translation functions to translate common +Mac, MS (etc) characters into ISO 8859-1. + +@example +(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))))) +@end example + +@item +@example + (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? ")))) +@end example + +@item + allow message-default-headers to be a function. + +@item + new Date score match types -- < > = (etc) that take floating point +numbers and match on the age of the article. + +@item +@example +> > > 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. +@end example + +@item + all commands that react to the process mark should push +the current process mark set onto the stack. + +@item + gnus-article-hide-pgp +Selv ville jeg nok ha valgt ,Ae(B slette den dersom teksten matcher +@example +"\\(This\s+\\)?[^ ]+ has been automatically signed by" +@end example +og det er maks hundre tegn mellom match-end og ----linja. Men -det- +er min type heuristikk og langt fra alles. + +@item + `gnus-subscribe-sorted' -- insert new groups where they would have been +sorted to if `gnus-group-sort-function' were run. + +@item + gnus-(group,summary)-highlight should respect any `face' text props set +on the lines. + +@item + use run-with-idle-timer for gnus-demon instead of the +home-brewed stuff for better reliability. + +@item + add a way to select which NoCeM type to apply -- spam, troll, etc. + +@item + nndraft-request-group should tally autosave files. + +@item + implement nntp-retry-on-break and nntp-command-timeout. + +@item + gnus-article-highlight-limit that says when not to highlight (long) +articles. + +@item + (nnoo-set SERVER VARIABLE VALUE) + +@item + nn*-spool-methods + +@item + interrupitng agent fetching of articles should save articles. + +@item + command to open a digest group, and copy all the articles there to the +current group. + +@item + a variable to disable article body highlights if there's more than +X characters in the body. + +@item + handle 480/381 authinfo requests separately. + +@item + include the texi/dir file in the distribution. + +@item + format spec to "tab" to a position. + +@item + Move all prompting to the new `M-n' default style. + +@item + command to display all dormant articles. + +@item + gnus-auto-select-next makeover -- list of things it should do. + +@item + a score match type that adds scores matching on From if From has replied +to something someone else has said. + +@item + Read Netscape discussion groups: +snews://secnews.netscape.com/netscape.communicator.unix + +@item +One command to edit the original version if an article, and one to edit +the displayed version. + +@item +@kbd{T v} -- make all process-marked articles the children of the +current article. + +@item +Switch from initial text to the new default text mechanism. + +@item +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)? + +@item +New limit command---limit to articles that have a certain string +in the head or body. + +@item +Allow breaking lengthy NNTP commands. + +@item +gnus-article-highlight-limit, to disable highlighting in big articles. + +@item +Editing an article should put the article to be edited +in a special, unique buffer. + +@item +A command to send a mail to the admin-address group param. + +@item +A Date scoring type that will match if the article +is less than a certain number of days old. + +@item +New spec: %~(tab 56) to put point on column 56 + +@item +Allow Gnus Agent scoring to use normal score files. + +@item +Rething the Agent active file thing. `M-g' doesn't update the active +file, for instance. + +@item +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. + +@item +Propagate all group properties (marks, article numbers, etc) up to the +topics for displaying. + +@item +`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. + +@item +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. + +@item +Implement gnus-batch-brew-soup. + +@item +Group parameters and summary commands for un/subscribing to mailing +lists. + +@item +Introduce nnmail-home-directory. + +@item +gnus-fetch-group and friends should exit Gnus when the user +exits the group. + +@item +Solve the halting problem. + +@c TODO +@end itemize + +@iftex + +@page +@node The Manual +@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$+$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$rP$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!"$$$o$f$k2<$K2#$?$o$C$F$$$k%a%G%#%"$r07$&;v$O$7$^$;$s(B---$B$3(B +$B$l$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%9%H$7$?(B +$B$j!"?7$7$$%0%k!<%W$rAv::$7$?$j$9$kL?Na$O$9$Y$F?tCM@\F,0z?t$r(B @dfn{$BF0:n%l(B +$B%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 $B8=>u%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$O8=>u%U%!%$%k$K$"$j$^$;$s(B) $B$O(B @emph{$B56%0%k!<(B +$B%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$G$7$g(B +$B$&!#(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%!$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!"$=$l$OE7(B +$B6u$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 + $BB>$N$H$3$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$ru%U%!(B +$B%$%kA4BN$rMW5a$9$k;v$r6X;_$G$-$^$9!#$3$N%U%!%$%k$O$7$P$7$PHs>o$KBg$-$/$J$C(B +$B$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$r(B +@code{nil} $B$K@_Dj$7$F2<$5$$!#$3$l$,(B @code{vertical} $B$G$"$k$H!"?bD>J}8~$N(B +(vertical) $BCf?4:F@_Dj$N$_$r$7$^$9!#(B@code{nil} $B$G$b(B @code{vertical} $B$G$b(B +$BL5$1$l$P!"?eJ?J}8~$H?bD>J}8~$NN>J}$NCf?4:F@_Dj$r9T$$$^$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$^$;$s(B--- +$B$=$l$O(B @file{.newsrc.eld} $B$N$_$rJ]B8$7$^$9!#$3$l$O!"(Bgnus $B$NB>$N%K%e!<%9(B +$B%j!<%@!<$r;H$($J$$$H$$$&;v$G$9!#$3$NJQ?t$O=i4|@_Dj$G(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$&!#$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$K(B @code{gnus-check-new-newsgroups} $B$H(B +@code{gnus-check-bogus-newsgroups} $B$r(B @code{nil} $B$K@_Dj$7$F2<$5$$!#(B + +$B35N,%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@_Dj$7$F2<$5$$!#(B + +$B5-;v$K4X$9$k/$7B.$/$9$k$?$a$K!"(B@code{gnus-article-display-hook} +$B$r(B @code{nil} $B$K@_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$$!#:#$^$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%!$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$J(B) +$B;vNc$G$O!"(Bgnus $B$O:F5"$r(B ``$B$"$^$j$K?<$/(B'' $B9_$j$9$.$F!"(BEmacs $B$,$"$J$?$K%S!<(B +$B%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%P%C%/%H%l!<%9$rAw$C$F2<$5$$!#;d$O%P%0$r=$@5$7$h$&$H(B +$B$7$^$9$,!"$"$J$?$,%P%0$r:F8=$5$;$kJ}K!$r@53N$K=q$$$F$/$l$?$H$-$N$_!"$=$l(B +$B$r=$@5$9$k;v$,$G$-$^$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$.(B +$B$F2<$5$$!#$=$l$O2f!9A4$F$K$H$C$F$b$C$H4JC1$K$J$j$^$9(B---$B$b$7;d$,I,MW$JA4(B +$B$F$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$+$NC/$+$,(B gnus $B$G$G$-$k2?$+8-$$$b$N$r9M$(=P$7!"$=$N(B +$B>e$=$N8-$$$b$N$r=q$$$F$/$l$k$H$$$&$3$H$G$9!#$3$l$rMF0W$K$9$k$?$a(B +$B$K$O!"(Bgnus $B$NFbItF0:n$r5-=R$9$k$N$,NI$$J}K!$@$m$&$H;d$O;W$$$^$7(B +$B$?!#$"$H!"$=$s$J$KFbIt$8$c$J$$F0:n$r$$$/$D$+$H!";d$,:#$d$C$F$k$3(B +$B$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$^(B +$B$;$s$,!"(Bgnus $B$H$=$N%P%C%/%(%s%I4V$N%$%s%?!<%U%'!<%9(B($B$3$l$O40A4$K(B +$B5-=R$5$l$F$$$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$5$l$d$9$$$b$N$b$"$k(B)$B!"A`:nMQ$N0lHL%a%=%C%I!"$J(B +$B$I$r(B($B:YIt$K$o$?$C$F(B)$BDj5A$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<$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$,Fs t +@end lisp + +@item gnus-read-method +@findex gnus-read-method +$BMxMQA[%0%k!<%W$K$D$$$F$O2?$K(B +$B$bCN$j$^$;$s!#$?$@2>A[%5!<%P!<(B @dfn{virtual servers} $B$HBPOC$9$k(B +$BJ}K!$rCN$C$F$$$k$@$1$G$9!#2>A[%5!<%P!<$O%P%C%/%(%s%I(B +@dfn{backend} $B$H$$$/$D$+$N%P%C%/%(%s%IJQ?t(B @dfn{backend +variables} $B$+$i$J$j$^$9!#A0pJs$rMW(B +$B5a$9$k$H$-$O!"DL>o4X?t$N0z?t$H$7$F2>A[%5!<%P!$r4^$a$^$9!#(B ($B$b(B +$B$7$J$1$l$P!"%P%C%/%(%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(B +$B$H$7$F2>A[%5!<%P!<$rA[%5!<%P!<$,3+$+$l$F$$$J(B +$B$1$l$P!"$3$N4X?t$O<:GT$7$^$9!#(B + +$B2>A[%5!<%P!$O!"J*M}E*$J%5!<%P!$H$O2?$N4X78$bL5$$$3$H$KCm0U(B +$B$7$F$/$@$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[(B +$B%5!<%P!$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$^$;(B +$B$s!#I8=`$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!<%?$r(B @code{nntp-server-buffer} +(@samp{ *nntpd*}) $B%P%C%U%!!<$KJV$9$3$H$,5a$a$i$l$^$9!#$3$l$O$A$g$C(B +$B$HIT1?$JL>A0IU$1$G$9$,!"$3$l$G2fK}$7$J$1$l$P$J$j$^$;$s!#;d$,7k2L(B +$B$N%G!<%?(B @dfn{resulting data} $B$H8@$C$?$H$-$O!"$=$N%P%C%U%!!<$NCf(B +$B$N%G!<%?$r;X$7$F$$$^$9!#JV5QCM(B @dfn{return value} $B$H8@$C$?$H$-$O!"(B +$B4X?t8F$S=P$7$K$h$C$FJV$5$l$k4X?t$NCM$N$3$H$r8@$C$F$$$^$9!#4X?t$,(B +$B<:GT$7$?$H$-$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(B +$B$G$"$k$H8F$P$l$k$b$N$,$"$j!"$^$?$=$&8F$P$l$J$$$b$N$b$"$j$^$9!#8e(B +$BpJs$rG[Aw$9$k$b$N$G!"$=$l0J>e$N$b$N$G$O$"$j$^$;$s!#(B + +$B$3$3$G$NNc$HDj5A$G$O!"A[A|>e$N%P%C%/%(%s%I(B @code{nnchoke} $B$r0z$-(B +$B9g$$$K=P$9$3$H$K$7$^$9!#(B + +@cindex @code{nnchoke} + +@menu +* Required Backend Functions:: $BJ,$J(B +$B%X%C%@!o!"(B@code{articles} $B$NCf(B +$B$N:G>.HV9f$N5-;v$h$j$b>.$5$$5-;v$+$i(B ($B>/$J$/$H$b(B) +@var{fetch-old} $B8D$NM>J,$J%X%C%@!<$r$&$3$H$rHQ$o$7$$$H;W$C$?(B +$B>l9g$K$O!"$3$N%Q%i%a!<%?$NB8:_$OL5;k$5$l$k$3$H$b$"$j$^$9!#$3$NCM(B +$B$,(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(B +$B$l$i%X%C%@!<$,$$$/$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$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(B +$B$N;XDj$O(B @code{Message-ID} $B$+HV9f$N$$$:$l$+$G$9!#(B +@code{Message-ID} $B$K$h$k5-;v$No$N(B +$B%G!<%?%P%C%U%!$NBe$o$j$K!"$3$N%P%C%U%!$KJV$5$l$^$9!#$3$l$K$h$jB?(B +$BNL$N%G!<%?$r$"$k%P%C%U%!$+$iJL$N%P%C%U%!$K%3%T!<$9$k$3$H$rHr$1$k(B +$B$3$H$,$G$-!"$=$7$F(B gnus $B$ODL>o!"5-;v%P%C%U%!$KD>@\5-;v$rA^F~$9$k(B +$B$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(B +$B$9!#$3$l$K$h$j(B @code{Message-ID} $B$K$h$C$F5-;v$rl9g$K$O!"5-;v$NuBV$G!"$3$l$O(B 211 $B$G$J$/$F$O$J$j$^$;$s!#.$N5-;vHV9f!":GBg$N5-;vHV9f!"$=$7$F:G(B +$B8e$,%0%k!<%WL>$G$9!#5-;v$NAm?t$O!":GBg!&:G>.5-;vHV9f$+$iC1=c$K9M(B +$B$($i$l$k?t$h$j$b>.$5$$$3$H$,$"$k$3$H$KCm0U$7$F$/$@$5$$!#$$$/$D$+(B +$B$N5-;v$OC$5$l$F$$$k$+$b$7$l$^$;$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!#(B +$B$3$l$O$[$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!"(B +$B:G>.$N5-;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(B +$B%k!<%W$NJLL>(B (@samp{=other-group}) $B$G$"$k$+!">e5-$N$I$l$G$b$J$$(B +(@samp{y}) $B$+!"$H$$$&$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(B +$B$&$+$rJV5Q$7$F$b9=$$$^$;$s$,!"I,?\$G$O$"$j$^$;$s!#Nc$($P!"Ej9F$,(B +$BHsF14|$K9T$o$l$k$N$G$"$l$P!"$3$N4X?t$,=*N;$7$?;~E@$G$OEj9F$OIaDL(B +$B40N;$7$F$$$^$;$s!#$=$N>l9g$3$N4X?t$O!"Ej9F$r40N;$5$;$k$3$H$,$G$-(B +$B$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$(!"$=$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$7$l$^$;$s!#(B + +$B$3$N4X?t$+$iJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B + + +@item (nnchoke-request-update-mark GROUP ARTICLE MARK) + +$B$b$7MxMQ$N%4%_$r(B +$BJV$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(B +$B$$$k$3$H$@$1$G$9(B --- $B$b$79=@.%0%k!<%W$,<+F04|8B@Z$l>C5n2DG=$G$"(B +$B$l$P!"$3$N2>A[%0%k!<%W$G4{FI$N0u$rIU$1$k$H!"7k2L$H$7$F$=$N5-;v$K(B +$B4|8B@Z$l>C5n$N0u$,IU$1$i$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$$(B +$B$D$G$b(B (gnus $B$+$=$l0J30$K$h$C$F(B) $B!"$"$l$d$3$l$d$H8F$S=P$5$l$k$3(B +$B$H$,$"$j$^$9!#%a!<%k%P%C%/%(%s%I$O$3$N4X?t$,5/F0$5$l$?$H$-!"E57?(B +$BE*$K$O%9%W!<%k%U%!%$%k$rFI$`$+(B POP $B%5!<%P!<$KLd$$9g$o$;$K$$$-$^(B +$B$9!#(B@var{group} $B$OFC$K5$$KN1$a$kI,MW$O$"$j$^$;$s(B --- $B$b$7%P%C%/(B +$B%(%s%I$,!"0l$D$@$1$N%0%k!<%W$rAv::$9$k$N$OBgJQ$9$.$k$HH=CG$7$?>l(B +$B9g$K$O!"A4%0%k!<%W$NA4Av::$r9T$J$C$F$b9=$$$^$;$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>C(B +$B5n=hM}$r9T$J$$$^$9!#(B (@var{articles} $B$O8=:_$O5-;vHV9f$NC1=c$J%j(B +$B%9%H$G$9!#(B) $B$3$N4X?t$G>C5n$5$l$kA0$N!"5-;v$,$I$l$@$18E$$5-;v$G$"(B +$B$k$+$N7hDj$O%P%C%/%(%s%I$KG$$5$l$F$$$^$9!#(B@var{force} $B$,(B +@code{nil} $B0J30$G$"$l$P!"$=$l$,$I$s$J$K?7$7$$$b$N$G$"$C$F$b!"A4(B +$B$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(B +$B$N%j%9%H$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$+$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(B +$B$l$?%X%C%@!<9T$rA4$F:o=|$7!"0lHL$K5-;v$r!V$-$l$$$5$C$Q$j!W$K$7$^(B +$B$9!#$=$7$F(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!#$3$l$OK\Ev$KJ#@=$r9T$J$$$^$9!#$b$7(B +@code{eval} $B$,(B @code{nil} $B0J30$NCM$rJV$7$?$i!"$=$N5-;v$O:o=|$5$l(B +$B$^$;$s!#(B + +@var{last} $B$,(B @code{nil} $B$G$"$l$P!"$3$ND>8e$K$5$i$KMW5a$,H/9T$5(B +$B$l$k8+9~$_$,9b$$!"$H$$$&0UL#$K$J$j!"$3$l$K$h$C$F:GE,2=$,$$$/$i$+(B +$B$G$-$k$h$&$K$J$j$^$9!#(B + +$B$3$N4X?t$O!"%0%k!<%WL>$,(B @code{car} $B$G!"$=$N5-;v$N0\F0@h$N5-;vHV(B +$B9f$,(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$K9T$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 +$B$,(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(B +$B$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 $B$b$7(B @var{force} $B$,$"$l$P!"(B +$B$=$N%0%k!<%WFb$NA4$F$N5-;v$rK\Ev$K>C5n$7!"$=$7$F$=$N%0%k!<%W<+?H(B +$B$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(B +$B;H$o$J$/$F$O$J$j$^$;$s(B --- $BMW5a$r$N%7%s%\(B +$B%k$G!";D$j$O!"J#?t$N0z?t$,$"$l$P(B @code{format} $B$X$N0z?t$H$7$F2r(B +$Bo$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$-$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$O(B +$B0l$D$N0z?t(B --- $B%5!<%P!<$N%7%s%\%k$re$N5-;v$rJT=8$9$k(B +$B$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(B +$B%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$H$,2DG=$G$"$C$F$[$7$$!"$H;W$&$N$OM}$KE,$C$F$$$^$9!#$=$7$F(B +$B$^$5$K!"$"$J$?$,$=$&$7$?$1$l$P!"$=$l$,$G$-$k$N$G$9!#(B($B$"$J$?$,$=(B +$B$&$7$?$/$J$1$l$P$7$J$/$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(B +$B$k%Q%C%1!<%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(B +$B$+$iB>$N%P%C%/%(%s%I$K4X?t$r7Q>5$G$-$k$h$&$K$9$k$K$O(B) $B!"0J2<$N%^(B +$B%/%m$r;HMQ$7$J$1$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@k(B +$B8@$7$^$9!#Nc$($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(B +$B$r7Q>5$7$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!<(B +$BJQ?t$H$7$FEPO?$7$^$9!#$[$H$s$I$N>uBV;X8~7?$NJQ?t$O(B @code{defvar} +$B$G$O$J$/(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$N(B +$BJQ?t$N%j%9%H$ro$N(B @code{defun} $B=hM}$K2C$($F!"$3$N%^%/%m$O$=$N4X?t$r8x(B +$B3+$7$F$$$k$b$N$H$7$FEPO?$7!"B>$N%P%C%/%(%s%I$,$=$l$r7Q>5$G$-$k$h(B +$B$&$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$N(B +$BCV$-49$($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\!"(B +$B;0HVL\!";MHVL\$N0z?t$,(B @code{nnml-retrieve-headers} $B$KEO$5$l!"0l(B +$BJ}!"FsHVL\$N0z?t$O(B @code{nndir-current-group} $B$NCM$H$7$F@_Dj$5$l(B +$B$k!"$H$$$&0UL#$G$9!#(B + +@item nnoo-import +$B$3$N%^%/%m$OB>$N%P%C%/%(%s%I$+$i4X?t$rA0$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 + +$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$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$$(B +$B$O(B) $B%K%e!<%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$?(B +$B2?$+$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(B +$B$H%0%k!<%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(B +$B$[$H$s$IA4It$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$$$k(B +$BE@$O!"%a!<%k%P%C%/%(%s%I$O(B @file{nnmail.el} $B$NCf$N6&DL4X?t$K6/$/(B +$B0MB8$7$F$$$k$H$$$&E@$G$9!#Nc$($P!"(B@code{nnml-request-scan} $B$NDj(B +$B5A$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$@(B +$B$1$G!"(B@code{nnmail} $B$,%a!<%k$N0\F0$dJ,N%$rA4$F$NLLE]$r8+$F$/$l$^(B +$B$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$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-(B +$B;vHV9f$rD4$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$9$N$KMQ$$$i$l$F(B +$B$$$^$9!#$=$l$OB?$/$N?M$+$i(B ``$B%X%C%I(B''---``$B%X%C%@!<$HK\BN(B'' $B$NF15A8l$H$7(B +$B$F;H$o$l$F$$$^$9!#(B ($B$3$l$O!";d$N0U8+$G$OHr$1$i$l$k$Y$-$G$9!#(B) $B$=$7$F!"(B +gnus $B$OFbIt$G$O(B ``$B%X%C%@!<(B'' $B$H8F$VMM<0$r;H$C$F$*$j!";d$O$3$3$G$=$l$K$D(B +$B$$$F@bL@$7$^$9!#$3$l$O(B9$B$D$NMWAG$+$i$J$k%Y%/%H%k$G!"4pK\E*$K!"$=$l$>$l$N(B +$B%X%C%@!<(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$K(B: @code{number}$B!"(B@code{subject}$B!"(B@code{from}$B!"(B +@code{date}$B!"(B@code{id}$B!"(B@code{chars}$B!"(B@code{lines}$B!"(B@code{xref} $B$G$9!#$3(B +$B$l$i$N6u$->l=j$K?($C$F@_Dj$9$k%^%/%m$,$"$j$^$9(B---$B$=$l$i$OA4$F!"$=$l$>$l(B +@code{mail-header-} $B$H(B @code{mail-header-set-} $B$$$&M=A[$5$l$kL>A0$r;}$C(B +$B$F$$$^$9!#(B + +$B>l=j(B @code{xref} $B$OK\Ev$O(B @code{misc} $B$N>l=j$G$9!#$$$m$s$JDI2C$N>pJs$O$=(B +$B$3$KF~$l$i$l$^$9!#(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$N(B +(object) (@emph{$BMpK=$J(B} $BNc$r>e$2$k$H!"5-;v$,$=$&$G$9(B) $B$r(B ``$B4^$^$l$F$$$k(B'' +$B$H$7$F8+$J$7$?$$$H$-$O!"IaDL$NO"B3E*9T0Y$O$"$^$jLr$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(B3$B$+$i(B6 ($B$b$7$/$O$b$C$H(B) $B$NMWAG$GE0DlE*$K%0%k!<%W$r5-=R(B +$B$7$^$9!#(B + +$B$3$3$K$"$k$N$O%0%k!<%W>pJs(B (group info) $B$N(B2$B$D$NNc$G$9!#(B1$B$D$OHs>o$KC1=c$J(B +$B%0%k!<%W$G!"(B2$B$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!#(B2$BHVL\$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) 3$BHVL\$NMWAG$O4{FI5-;v(B +$B$NHO0O$N%j%9%H$G$9!#(B4$BHVL\$NMWAG$O$$$m$$$m$Je$N%5!<%P!<$G$9(B)$B!#(B6$BHVL\$NMWAG$O(B @dfn{$B%0%k!<%W%Q%i%a!<%?(B} $B$N%j%9%H$G!"(B +$B$3$NItJ,$O$=$N$?$a$K$"$j$^$9!#(B + +$B:G8e$N(B3$B$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(B3$B$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$5$l$F$$$k$b$N$G$9$,!"5?;w(B BNF $B$G$=$l$r8=$9$N$OIT(B +$BL{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$O(B2$B$D$N(B +$B0z?t$rpJs%j%9%H$H?7$7$$CM$G$9!#(B + +$B%0%k!<%W>pJs$N:G8e$N(B3$B$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$$(B3$BHVL\$N0z?t$r(B3$B$D$N(B +$B: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?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$B!"(BXEmacs $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$O(B +gnus $B$NJLL>4X?t(B (alias) $B$r;H$C$F$-$^$7$?!#Nc$r=P$7$^$7$g$&(B: Emacs $B$O4X?t(B +@code{run-at-time} $B$rDj5A$7$F$$$^$9$,!"(BXEmacs $B$O4X?t(B @code{start-itimer} +$B$rDj5A$7$F$$$^$9!#$=$3$G;d$O(B @code{gnus-run-at-time} $B$H8F$P$l$k4X?t$rDj(B +$B5A$7!"$=$l$O(B Emacs $B$N(B @code{run-at-time} $B$HF1$80z?t$r4X?t(B (alias) $B$K(B +$B$J$C$F$$$^$9!#$7$+$7!"(BXEmacs $B$G4X?t(B +(alias) $B$H$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$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$?!#(BXEmacs $B$G(B gnus +$B$r/$7$G$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 $B8=>u%U%!%$%kMM<0(B + +$B8=>u%U%!%$%k$OEv$N%5!<%P!<$NA4$F$N;HMQ2DG=$J%0%k!<%W$N0lMw$r5s$2$^$9!#$=(B +$B$l$O$=$l$>$l$N%0%k!<%W$N:GDc$H:G9b$N5-;vHV9f$N0lMw$b$"$j$^$9!#(B + +$B$3$l$OIaDL$N8=>u%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 space high-number space low-number space flag +group = +space = " " +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$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$F(B +``@code{gnus-flargblossen} $B$rO"A[%j%9%H$K@_Dj$7$F$/$@$5$$!#$=$N%-!<$O%0(B +$B%k!<%WL>$K9gCW$9$k$?$a$K;H$o$l$k@55,I=8=$G$9(B'' $B$,>/$7$N0UL#$+A4$/0UL#$N(B +$BL5$$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!"$=$l$K$h$j$b(B +$B$?$i$5$l$kCO9v$r0&$7$^$9!#$"$-$i$a$FI~=>$7$F2<$5$$!#(BEmacs $B$OK\Ev$O(B +``Escape-Meta-Alt-Control-Shift'' $B$NN,$G!"B>$NI>H=$N0-$$=P=j(B (Emacs $B$N:n(B +$B.;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%!%$%k(B +@file{.emacs} $B$GIaDL;H$o$l$k$$$/$D$+$NIaDL$N9=J8$K$D$$$F$@$1OC$r$7$^$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 ``$B(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 ``@code{gnus-nntp-server} $B$r(B @samp{nntp.ifi.uio.no} +$B$K@_Dj$7$J$5$$(B'' $B$H8@$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 @@ -22,7 +23,7 @@ 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 +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 @@ -40,10 +41,12 @@ draft $B2<=q$-(B dribble file $B%I%j%V%k%U%!%$%k(B duplicate suppression $B=EJ#M^@)(B entry $BEPO?!"EPO?9`L\(B +ephemeral group $BC;4|%0%k!<%W(B expire $B4|8B@Z$l>C5n!"4|8B@Z$l:o=|(B expunge $B>C5n(B -field $B%U%#!<%k%I(B +field $BMs(B firewall $BKIJI(B +flag $B%U%i%0(B flush cache $B%-%c%C%7%e$r=q$-9~$`(B follow up $B%U%)%m!<%"%C%W(B foreign $B30It(B @@ -81,7 +84,8 @@ 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 +moderated $B;J2quBV(B sub-topic $BI{%H%T%C%/(B submap $B%5%V%^%C%W(B subscribe $B9XFI(B subscribedness $B9XFIEY(B summary buffer $B35N,%P%C%U%!(B superseding $BBeBX(B +symbolic prefix $B5-9f@\F,<-(B syntax table $BJ8K!I=(B text properties $B%F%-%9%HB0@-(B thread $B%9%l%C%I(B @@ -136,6 +150,7 @@ topic $B%H%T%C%/(B unplugged $B@Z$jN%$7(B unsubscribe $BHs9XFI(B user $BMxMQ$}} +\newcommand{\gnusbraceleft}{{$>$}} +\newcommand{\gnusbraceright}{{$>$}} \newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head.eps,height=1cm}}} \newcommand{\gnusinteresting}{ @@ -316,7 +318,7 @@ into another language, under the above conditions for modified versions. @tex @titlepage -@title Semi-gnus 6.7.8 Manual +@title Semi-gnus 6.8.19 Manual @author by Lars Magne Ingebrigtsen @page @@ -352,14 +354,14 @@ 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. -Semi-gnus provides MIME features based on SEMI API. So Semi-gnus +<<< unread 200) . my-group-face-1) @@ -1904,6 +1911,13 @@ Currently supported types are @code{babyl}, @code{mbox}, @code{digest}, 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 @@ -2390,8 +2404,10 @@ Find bogus groups and delete them @kindex F (Group) @findex gnus-group-find-new-groups Find new groups and process them (@code{gnus-group-find-new-groups}). -If given a prefix, use the @code{ask-server} method to query the server -for 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) @@ -2662,8 +2678,13 @@ convention (@pxref{Process/Prefix}). @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. -The command uses the process/prefix convention +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 @@ -2678,8 +2699,8 @@ Move all groups that match some regular expression to a topic Copy all groups that match some regular expression to a topic (@code{gnus-topic-copy-matching}). -@item T h -@kindex T h (Topic) +@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}). @@ -2708,12 +2729,20 @@ toggling command on topics. In addition, if you give a numerical prefix, group on that level (and lower) will be displayed. @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 C-k @kindex C-k (Topic) @findex gnus-topic-kill-group @@ -2881,7 +2910,7 @@ 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 +@* @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 @@ -3498,8 +3527,10 @@ without confirmation. Also @pxref{Group Levels}. 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}).) This variable is not -particularly useful if you use a threaded display. +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 @@ -3681,6 +3712,12 @@ Scroll the current article back one page (@code{gnus-summary-prev-page}). 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) @@ -3821,7 +3858,7 @@ 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(I_(B sein! +@code{postmaster}. Ordnung mu,A_(B sein! This command understands the process/prefix convention (@pxref{Process/Prefix}). @@ -5220,9 +5257,9 @@ Remove articles when exiting the group. The default value is @code{(read exit)}. -@vindex gnus-use-header-prefetch -If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles -from the next group. +@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 @@ -5278,13 +5315,17 @@ to score unwanted articles down and have them marked as read. They will not then be downloaded by this command. @vindex gnus-uncacheable-groups -It is likely that you do not want caching on some groups. For instance, +@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 the @code{gnus-uncacheable-groups} regexp to -@samp{^nnml}, for instance. This variable is @code{nil} by -default. +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 @@ -6058,17 +6099,25 @@ these articles easier. @node Article Highlighting @subsection Article Highlighting -@cindex highlight +@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. +you want it to look like technicolor fruit salad. @table @kbd @item W H a @kindex W H a (Summary) @findex gnus-article-highlight -Highlight the current article (@code{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. + +Most users would prefer using @code{gnus-article-maybe-highlight} in +@code{gnus-article-display-hook} (@pxref{Customizing Articles}) instead. +This is a bit less agressive---it highlights only the headers, the +signature and adds buttons. @item W H h @kindex W H h (Summary) @@ -6154,6 +6203,8 @@ default. @end table +@xref{Customizing Articles} for how to highlight articles automatically. + @node Article Fontisizing @subsection Article Fontisizing @@ -6167,9 +6218,9 @@ like @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-article-emphasis +@vindex gnus-emphasis-alist How the emphasis is computed is controlled by the -@code{gnus-article-emphasis} variable. This is an alist where the first +@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 @@ -6206,6 +6257,8 @@ say something like: (copy-face 'red 'gnus-emphasis-italic) @end lisp +@xref{Customizing Articles} for how to fontize articles automatically. + @node Article Hiding @subsection Article Hiding @@ -6219,7 +6272,9 @@ too much cruft in most articles. @item W W a @kindex W W a (Summary) @findex gnus-article-hide -Do maximum hiding on the summary buffer (@kbd{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) @@ -6261,30 +6316,24 @@ customizing the hiding: @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. - -@item gnus-cited-text-button-line-format -@vindex gnus-cited-text-button-line-format +@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 this format-like variable (@pxref{Formatting Variables}). These +by these format-like variable (@pxref{Formatting Variables}). These specs are valid: @table @samp @item b -Start point of the hidden text. +Starting point of the hidden text. @item e -End point of the hidden text. +Ending point of the hidden text. @item l -Length of the hidden text. +Number of characters in the hidden region. +@item n +Number of lines of hidden text. @end table @item gnus-cited-lines-visible @@ -6293,6 +6342,25 @@ The number of lines at the beginning of the cited text to leave shown. @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 @@ -6310,6 +6378,9 @@ 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 @@ -6469,6 +6540,8 @@ body (@code{gnus-article-strip-leading-space}). @end table +@xref{Customizing Articles} for how to wash articles automatically. + @node Article Buttons @subsection Article Buttons @@ -6553,6 +6626,8 @@ 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 @@ -6620,6 +6695,9 @@ that the article was posted in 1854. Although something like that is @end table +@xref{Customizing Articles} for how to display the date in your +preferred format automatically. + @node Article Signature @subsection Article Signature @@ -6864,10 +6942,13 @@ Here are the available keystrokes when using pick mode: @table @kbd @item . @kindex . (Pick) -@findex gnus-summary-mark-as-processable -Pick the article on the current line -(@code{gnus-summary-mark-as-processable}). If given a numerical prefix, -go to that article and pick it. (The line number is normally displayed +@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 @@ -6878,53 +6959,13 @@ at the end of the buffer, start reading the picked articles. @item u @kindex u (Pick) -@findex gnus-summary-unmark-as-processable -Unpick the article (@code{gnus-summary-unmark-as-processable}). - -@item U -@kindex U (Pick) -@findex gnus-summary-unmark-all-processable -Unpick all articles (@code{gnus-summary-unmark-all-processable}). - -@item t -@kindex t (Pick) -@findex gnus-uu-mark-thread -Pick the thread (@code{gnus-uu-mark-thread}). - -@item T -@kindex T (Pick) -@findex gnus-uu-unmark-thread -Unpick the thread (@code{gnus-uu-unmark-thread}). - -@item r -@kindex r (Pick) -@findex gnus-uu-mark-region -Pick the region (@code{gnus-uu-mark-region}). - -@item R -@kindex R (Pick) -@findex gnus-uu-unmark-region -Unpick the region (@code{gnus-uu-unmark-region}). - -@item e -@kindex e (Pick) -@findex gnus-uu-mark-by-regexp -Pick articles that match a regexp (@code{gnus-uu-mark-by-regexp}). - -@item E -@kindex E (Pick) -@findex gnus-uu-unmark-by-regexp -Unpick articles that match a regexp (@code{gnus-uu-unmark-by-regexp}). - -@item b -@kindex b (Pick) -@findex gnus-uu-mark-buffer -Pick the buffer (@code{gnus-uu-mark-buffer}). - -@item B -@kindex B (Pick) -@findex gnus-uu-unmark-buffer -Unpick the buffer (@code{gnus-uu-unmark-buffer}). +@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) @@ -6937,6 +6978,11 @@ 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 @@ -7188,7 +7234,7 @@ 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-move-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. @@ -7211,6 +7257,12 @@ 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 @@ -7785,15 +7837,15 @@ These conditions are: @table @code @item empty Remove all empty headers. -@item newsgroups -Remove the @code{Newsgroups} header if it only contains the current group -name. @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 date Remove the @code{Date} header if the article is less than three days old. @@ -7803,11 +7855,11 @@ Remove the @code{To} header if it is very long. Remove all @code{To} headers if there are more than one. @end table -To include the four first elements, you could say something like; +To include the four three elements, you could say something like; @lisp (setq gnus-boring-article-headers - '(empty newsgroups followup-to reply-to)) + '(empty followup-to reply-to)) @end lisp This is also the default value for this variable. @@ -7874,9 +7926,12 @@ been inserted into the article buffer. It is meant to handle all treatment of the article before it is displayed. @findex gnus-article-maybe-highlight -By default this hook just contains @code{gnus-article-hide-headers}, -@code{gnus-article-treat-overstrike}, and -@code{gnus-article-maybe-highlight}, but there are thousands, nay +@findex gnus-article-maybe-hide-headers +By default this hook just contains +@code{gnus-article-maybe-hide-headers}, +@code{gnus-hide-boring-headers}, @code{gnus-article-treat-overstrike}, +and @code{gnus-article-maybe-highlight} (and under XEmacs, +@code{gnus-article-display-x-face}), but there are thousands, nay millions, of functions you can put in this hook. For an overview of functions @pxref{Article Highlighting}, @pxref{Article Hiding}, @pxref{Article Washing}, @pxref{Article Buttons} and @pxref{Article @@ -8038,6 +8093,7 @@ to make gnus try to post using the foreign server. * 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? @end menu @@ -8293,83 +8349,96 @@ but the latter is the preferred method. @end table -@c @node Posting Styles -@c @section Posting Styles -@c @cindex posting styles -@c @cindex styles -@c -@c All them variables, they make my head swim. -@c -@c So what if you want a different @code{Organization} and signature based -@c on what groups you post to? And you post both from your home machine -@c and your work machine, and you want different @code{From} lines, and so -@c on? -@c -@c @vindex gnus-posting-styles -@c One way to do stuff like that is to write clever hooks that change the -@c variables you need to have changed. That's a bit boring, so somebody -@c came up with the bright idea of letting the user specify these things in -@c a handy alist. Here's an example of a @code{gnus-posting-styles} -@c variable: -@c -@c @lisp -@c ((".*" -@c (signature . "Peace and happiness") -@c (organization . "What me?")) -@c ("^comp" -@c (signature . "Death to everybody")) -@c ("comp.emacs.i-love-it" -@c (organization . "Emacs is it"))) -@c @end lisp -@c -@c As you might surmise from this example, this alist consists of several -@c @dfn{styles}. Each style will be applicable if the first element -@c ``matches'', in some form or other. The entire alist will be iterated -@c over, from the beginning towards the end, and each match will be -@c applied, which means that attributes in later styles that match override -@c the same attributes in earlier matching styles. So -@c @samp{comp.programming.literate} will have the @samp{Death to everybody} -@c signature and the @samp{What me?} @code{Organization} header. -@c -@c The first element in each style is called the @code{match}. If it's a -@c string, then Gnus will try to regexp match it against the group name. -@c If it's a function symbol, that function will be called with no -@c arguments. If it's a variable symbol, then the variable will be -@c referenced. If it's a list, then that list will be @code{eval}ed. In -@c any case, if this returns a non-@code{nil} value, then the style is said -@c to @dfn{match}. -@c -@c Each style may contain a arbitrary amount of @dfn{attributes}. Each -@c attribute consists of a @var{(name . value)} pair. The attribute name -@c can be one of @code{signature}, @code{organization} or @code{from}. The -@c attribute name can also be a string. In that case, this will be used as -@c a header name, and the value will be inserted in the headers of the -@c article. -@c -@c The attribute value can be a string (used verbatim), a function (the -@c return value will be used), a variable (its value will be used) or a -@c list (it will be @code{eval}ed and the return value will be used). -@c -@c So here's a new example: -@c -@c @lisp -@c (setq gnus-posting-styles -@c '((".*" -@c (signature . "~/.signature") -@c (from . "user@@foo (user)") -@c ("X-Home-Page" . (getenv "WWW_HOME")) -@c (organization . "People's Front Against MWM")) -@c ("^rec.humor" -@c (signature . my-funny-signature-randomizer)) -@c ((equal (system-name) "gnarly") -@c (signature . my-quote-randomizer)) -@c (posting-from-work-p -@c (signature . "~/.work-signature") -@c (from . "user@@bar.foo (user)") -@c (organization . "Important Work, Inc")) -@c ("^nn.+:" -@c (signature . "~/.mail-signature")))) -@c @end lisp +@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'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 @var{(name . 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. + +The attribute value can be a string (used verbatim), a function (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). + +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 two dynamically bound variables @code{message-this-is-news} and +@code{message-this-is-mail}. + +@vindex message-this-is-mail +@vindex message-this-is-news + +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-this-is-news + (signature my-news-signature)) + (posting-from-work-p + (signature-file "~/.work-signature") + (address "user@@bar.foo") + (body "You are fired.\n\nSincerely, your boss.") + (organization "Important Work, Inc")) + ("^nn.+:" + (signature-file "~/.mail-signature")))) +@end lisp + @node Drafts @section Drafts @@ -8942,10 +9011,11 @@ 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}, and -@samp{force}. (The latter is not a valid @file{.netrc}/@code{ftp} -token, which is the only way the @file{.authinfo} file format deviates -from the @file{.netrc} file format.) +valid tokens include @samp{machine}, @samp{login}, @samp{password}, +@samp{default} and @samp{force}. (The latter is not a valid +@file{.netrc}/@code{ftp} token, which is the only way the +@file{.authinfo} file format deviates from the @file{.netrc} file +format.) @end enumerate @@ -8967,6 +9037,16 @@ user will be prompted for the password. The latter also has the @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 @@ -9001,17 +9081,17 @@ 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. -@c @item nntp-connection-timeout -@c @vindex nntp-connection-timeout -@c If you have lots of foreign @code{nntp} groups that you connect to -@c regularly, you're sure to have problems with @sc{nntp} servers not -@c responding properly, or being too loaded to reply within reasonable -@c time. This is can lead to awkward problems, which can be helped -@c somewhat by setting @code{nntp-connection-timeout}. This is an integer -@c that says how many seconds the @code{nntp} backend should wait for a -@c connection before giving up. If it is @code{nil}, which is the default, -@c no timeouts are done. -@c +@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 @@ -9370,10 +9450,6 @@ insert sub-expressions from the matched text. For instance: ("list.\\1" "From:.*\\(.*\\)-list@@majordomo.com") @end lisp -If the first element is the special symbol @code{junk}, then messages -that match the regexp will disappear into the aether. Use with -extreme caution. - 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 @@ -9645,7 +9721,7 @@ be stored in one or more groups. @item @code{junk}: If the split is the symbol @code{junk}, then don't save -this message. +this message. Use with extreme caution. @item @var{(: function arg1 arg2 ...)}: If the split is a list, and the first @@ -9653,6 +9729,9 @@ element is @code{:}, then the second element will be called as a function with @var{args} given as arguments. The function 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. @@ -9677,12 +9756,12 @@ information in the headers (i.e., do @code{replace-match}-like substitutions in the group names), you can say things like: @example -(any "debian-\\(\\w*\\)@@lists.debian.org" "mail.debian.\\1") +(any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1") @end example 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 +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. @@ -10325,6 +10404,22 @@ The name of the group descriptions file. @xref{Newsgroups File Format}. @item nnfolder-get-new-mail @vindex nnfolder-get-new-mail If non-@code{nil}, @code{nnfolder} will read incoming mail. + +@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 + @end table @findex nnfolder-generate-active-file @@ -10475,6 +10570,9 @@ The rnews batch transport format. @item forward Forwarded articles. +@item mime-parts +MIME multipart messages, besides digests. + @item mime-digest @cindex digest @cindex MIME digest @@ -10517,8 +10615,9 @@ Virtual server variables: @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-digest}, @code{standard-digest}, -@code{slack-digest}, @code{clari-briefs} or @code{guess}. +@code{rfc822-forward}, @code{mime-parts}, @code{mime-digest}, +@code{standard-digest}, @code{slack-digest}, @code{clari-briefs} or +@code{guess}. @item nndoc-post-type @vindex nndoc-post-type @@ -10972,7 +11071,7 @@ 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'$BsU(Bre} is to +providers if they were to do this---their @emph{raison d',Aj(Btre} 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. @@ -11121,6 +11220,7 @@ 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. @@ -11154,7 +11254,7 @@ 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\\+some\\.server\\.jp:soc\\.motss$\\|^nntp\\+some\\.server\\.no:soc\\.motss$" +"^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 @@ -11183,6 +11283,18 @@ 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 @@ -11540,7 +11652,7 @@ 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}). Legal elements are: +Variables}). Valid elements are: @table @samp @item c @@ -11624,7 +11736,7 @@ Fetch all eligible articles in all groups @kindex J S (Agent Group) @findex gnus-group-send-drafts Send all sendable messages in the draft group -(@code{gnus-agent-fetch-session}). @xref{Drafts} +(@code{gnus-agent-send-draft}). @xref{Drafts} @item J a @kindex J a (Agent Group) @@ -11650,7 +11762,7 @@ Mark the article for downloading (@code{gnus-agent-mark-article}). Remove the downloading mark from the article (@code{gnus-agent-unmark-article}). -@item @@ +@item @@ @kindex @@ (Agent Summary) @findex gnus-agent-toggle-mark Toggle whether to download the article (@code{gnus-agent-toggle-mark}). @@ -11974,8 +12086,8 @@ Score on the subject line. @item x Score on the Xref line---i.e., the cross-posting line. -@item t -Score on thread---the References line. +@item r +Score on the References line. @item d Score on the date. @@ -11994,6 +12106,10 @@ Score on the body. @item h Score on the head. + +@item t +Score on thread. + @end table @item @@ -12786,12 +12902,22 @@ So, if you want to use just a single score file, you could say: 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 @@ -13369,7 +13495,7 @@ then this operator will return @code{false}. @item ! @itemx not -@itemx (I,(B +@itemx ,A,(B This logical operator only takes a single argument. It returns the logical negation of the value of its argument. @@ -13499,18 +13625,20 @@ use them in any sensible way. @vindex gnus-decay-scores @findex gnus-decay-score -@vindex gnus-score-decay-function +@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-score-decay-function} +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 according to `gnus-score-decay-constant' and `gnus-score-decay-scale'." + "Decay SCORE. +This is done according to `gnus-score-decay-constant' +and `gnus-score-decay-scale'." (floor (- score (* (if (< score 0) 1 -1) @@ -14729,12 +14857,12 @@ in either monochrome @code{XBM} format or color @code{XPM} and @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 +@code{gnus-picons-piconsearch-url} to the string @* @file{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 +obtaining and installing the picons databases, point your Web browser at @* @file{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}. @@ -14766,8 +14894,10 @@ To enable displaying picons, simply put the following line in your @lisp (setq gnus-use-picons t) -(add-hook 'gnus-article-display-hook 'gnus-article-display-picons t) -(add-hook 'gnus-article-display-hook 'gnus-picons-article-display-x-face) +(add-hook 'gnus-article-display-hook + 'gnus-article-display-picons t) +(add-hook 'gnus-article-display-hook + 'gnus-picons-article-display-x-face) @end lisp and make sure @code{gnus-picons-database} points to the directory @@ -14776,7 +14906,8 @@ 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") +(setq gnus-picons-piconsearch-url + "http://www.cs.indiana.edu:800/piconsearch") @end lisp @@ -15072,7 +15203,7 @@ 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. -Legal values include @code{flame}, @code{pine}, @code{moss}, +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}. @@ -15192,7 +15323,7 @@ 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 @file{}. +at @* @file{}. Since most e-mail spam is sent automatically, this may reconcile the cosmic balance somewhat. @@ -15376,7 +15507,10 @@ 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''. +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. If you happen upon a version of Gnus that has a prefixed name -- ``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'' -- @@ -15652,7 +15786,7 @@ David Moore---rewrite of @file{nnvirtual.el} and many other things. Kevin Davidson---came up with the name @dfn{ding}, so blame him. @item -Fran$BmP(Bis Pinard---many, many interesting and thorough bug reports, as +Fran,Ag(Bois Pinard---many, many interesting and thorough bug reports, as well as autoconf support. @end itemize @@ -15665,7 +15799,7 @@ The following people have contributed many patches and suggestions: Christopher Davis, Andrew Eskilsson, Kai Grossjohann, -David K$BiH(Bedal, +David K,Ae(Bgedal, Richard Pieri, Fabrice Popineau, Daniel Quinlan, @@ -15697,6 +15831,7 @@ Joao Cachopo, Zlatko Calusic, Massimo Campostrini, Castor, +David Charlap, Dan Christensen, Kevin Christian, Michael R. Cook, @@ -15735,7 +15870,7 @@ Marc Horowitz, Gunnar Horrigmo, Richard Hoskins, Brad Howes, -Fran$BmP(Bis Felix Ingrand, +Fran,Ag(Bois Felix Ingrand, Ishikawa Ichiro, @c Ishikawa Lee Iverson, Iwamuro Motonori, @c Iwamuro @@ -15743,13 +15878,16 @@ Rajappa Iyer, Andreas Jaeger, Randell Jesup, Fred Johansen, +Gareth Jones, Simon Josefsson, Greg Klanderman, Karl Kleinpaste, Peter Skov Knudsen, Shuhei Kobayashi, @c Kobayashi +Koseki Yoshinori, @c Koseki Thor Kristoffersen, Jens Lautenbacher, +Martin Larose, Seokchan Lee, @c Lee Carsten Leonhardt, James LewisMoss, @@ -15781,7 +15919,9 @@ William Perry, Stephen Peters, Jens-Ulrik Holger Petersen, Ulrich Pfeifer, +Matt Pharr, John McClary Prevost, +Bill Pringlemeir, Mike Pullen, Jim Radford, Colin Rafferty, @@ -15820,6 +15960,7 @@ Teddy, Chuck Thompson, Philippe Troin, James Troup, +Trung Tran-Duc, Aaron M. Ucko, Aki Vehtari, Didier Verna, @@ -15852,7 +15993,7 @@ actually are people who are using Gnus. Who'd'a thunk it! * ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus. * September Gnus:: The Thing Formally Known As Gnus 5.3/5.3. * Red Gnus:: Third time best---Gnus 5.4/5.5. -* Quassia Gnus:: Two times two is four, or Gnus 5.6.22. +* Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7. @end menu These lists are, of course, just @emph{short} overviews of the @@ -16378,7 +16519,8 @@ mail before saving the mail (@pxref{Washing Mail}). Emphasized text can be properly fontisized: @lisp -(add-hook 'gnus-article-display-hook 'gnus-article-emphasize) +(add-hook 'gnus-article-display-hook + 'gnus-article-emphasize) @end lisp @end itemize @@ -16387,7 +16529,7 @@ Emphasized text can be properly fontisized: @node Quassia Gnus @subsubsection Quassia Gnus -New features in Gnus 5.6.22: +New features in Gnus 5.6: @itemize @bullet @@ -16613,8 +16755,6 @@ articles aren't displayed. @item nndoc should always allocate unique Message-IDs. @item - implement gnus-score-thread -@item If there are mail groups the first time you use Gnus, Gnus'll make the mail groups killed. @item @@ -17134,7 +17274,7 @@ 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 +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 @@ -17155,8 +17295,8 @@ From: Jason L Tibbitts III @end example @item - tanken var at n$BiS(B du bruker `gnus-startup-file' som prefix (FOO) til ’élete -opp en fil FOO-SERVER, FOO-SERVER.el, FOO-SERVER.eld, kan du la den v$BkS(Be en + tanken var at n,Ae(Br du bruker `gnus-startup-file' som prefix (FOO) til ilete +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. @@ -17229,8 +17369,8 @@ there was a sci.somethingelse group or section, then it should prompt for sci? first the sci.something? then sci.somethingelse?... @item -Ja, det burde v$BkS(Be en m$BiU(Be ’ési slikt. Kanskje en ny variabel? -`gnus-use-few-score-files'? S’ékunne score-regler legges til den +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. @@ -17541,9 +17681,6 @@ Mac, MS (etc) characters into ISO 8859-1. numbers and match on the age of the article. @item - gnus-cacheable-groups - -@item @example > > > 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 @@ -17563,7 +17700,7 @@ the current process mark set onto the stack. @item gnus-article-hide-pgp -Selv ville jeg nok ha valgt ’éslette den dersom teksten matcher +Selv ville jeg nok ha valgt islette den dersom teksten matcher @example "\\(This\s+\\)?[^ ]+ has been automatically signed by" @end example @@ -17700,6 +17837,28 @@ topics for displaying. with unread articles, even if that group is hidden in a topic. @item +gnus-posting-styles doesn't work in drafts. + +@item +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. + +@item +Implement gnus-batch-brew-soup. + +@item +Group parameters and summary commands for un/subscribing to mailing +lists. + +@item +Introduce nnmail-home-directory. + +@item +gnus-fetch-group and friends should exit Gnus when the user +exits the group. + +@item Solve the halting problem. @c TODO @@ -18025,7 +18184,8 @@ useful data is in the summary buffer, anyway. Set this variable to Set this hook to all the available hiding commands: @lisp (setq gnus-article-display-hook - '(gnus-article-hide-headers gnus-article-hide-signature + '(gnus-article-hide-headers + gnus-article-hide-signature gnus-article-hide-citation)) @end lisp @@ -18228,6 +18388,19 @@ Takes an unprefixed group name and a select method, and returns the full @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 diff --git a/texi/message-ja.texi b/texi/message-ja.texi new file mode 100644 index 0000000..3a152d3 --- /dev/null +++ b/texi/message-ja.texi @@ -0,0 +1,1314 @@ +\input texinfo @c -*-texinfo-*- + +@setfilename message-ja +@settitle Message 5.6.33 Manual +@synindex fn cp +@synindex vr cp +@synindex pg cp +@c @direntry +@c * Message: (message). Mail and news composition mode that goes with Gnus. +@c @end direntry +@iftex +@finalout +@end iftex +@setchapternewpage odd + +@ifinfo + +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 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +$BCx:n8"I=<($H$3$N5v2DJ8$,$9$Y$F$NJ#@=$KB8:_$9$k8B$j!"$3$N@bL@=q$N$^$C$?$/(B +$BF10l$NJ#@=$r:n$j!"G[I[$9$k$3$H$r5v2D$9$k!#(B + +@ignore +Permission is granted to process this file through Tex and print the +results, provided the printed document carries copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). + +$B$3$NCJMn$,H$5$l$^$;$s(B)$B!#(B + +@end ignore +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +$BF10lJ#@=$N>r7o$N2<$G!"$=$l$K$h$C$FF@$i$l$?7k2L$b$3$N5v2DJ8$NI=<($HF10l$N(B +$B>r7o$N$b$H$GG[I[$9$k8B$j!"$3$N@bL@=q$N=$@5HG$NJ#@=$r$7!"G[I[$9$k$3$H$r5v(B +$B2D$9$k!#(B + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. + +$B>e5-$N=$@5HG$K4X$9$k>r7o$N2<$G!"$3$N@bL@=q$NK]Lu$NJ#@=$r:n$j!"G[I[$9$k$3(B +$B$H$r5v2D$9$k!#(B + +@end ifinfo + +@tex + +@titlepage +@title Message 5.6.22 Manual + +@author by Lars Magne Ingebrigtsen +@translated by members of Semi-gnus mailing-list +@page + +@vskip 0pt plus 1filll +Copyright @copyright{} 1996 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +$BCx:n8"I=<($H$3$N5v2DJ8$,$9$Y$F$NJ#@=$KB8:_$9$k8B$j!"$3$N@bL@=q$N$^$C$?$/(B +$BF10l$NJ#@=$r:n$j!"G[I[$9$k$3$H$r5v2D$9$k!#(B + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +$BF10lJ#@=$N>r7o$N2<$G!"$=$l$K$h$C$FF@$i$l$?7k2L$r$3$N5v2DJ8$NI=<($HF10l$N(B +$B>r7o$N$b$H$GG[I[$9$k8B$j!"$3$N@bL@=q$N=$@5HG$NJ#@=$r$7!"G[I[$9$k$3$H$r5v(B +$B2D$9$k!#(B + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. + +$B>e5-$N=$@5HG$K4X$9$k>r7o$N2<$G!"$3$N@bL@=q$NK]Lu$NJ#@=$r:n$j!"G[I[$9$k$3(B +$B$H$r5v2D$9$k!#(B + +@end titlepage +@page + +@end tex + +@node Top +@top Message + +Gnus $B$NA4$F$N%a%C%;!<%8$N:n@.(B ($B%a!<%k$H%K%e!<%9$NN>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$H(B +@code{Message} $B$O?7$7$$(B @code{message} $B%b!<%I%P%C%U%!$rE,@Z$J%X%C%@!<$r(B +$BF~$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$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 rmail-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-state-separator +@vindex message-forward-start-separator +$BE>Aw$5$l$k%a%C%;!<%8$NA0$KA^F~$5$l$k6h@Z$j$G$9!#=i4|CM$O(B @* +@samp{------- Start of forwarded message -------\n} $B$G$9!#(B + +@vindex message-forward-end-separator +@item message-forward-end-separator +$BE>Aw$5$l$k%a%C%;!<%8$N8e$KA^F~$5$l$k6h@Z$j$G$9!#=i4|CM$O(B @* +@samp{------- End of forwarded message -------\n} $B$G$9!#(B + +@item message-signature-before-forwarded-message +@vindex message-signature-before-forwarded-message +$B$b$7$3$NJQ?t$,(B @code{t} $B$G$"$k$H!"$=$l$,=i4|CM$G$9$,!"$"$J$?$N8D?ME*$J=p(B +$BL>$,E>Aw$5$l$k%a%C%;!<%8$NA0$KA^F~$5$l$^$9!#$b$7$=$&$G$J$1$l$P!"E>Aw$5$l(B +$B$k%a%C%;!<%8$O?7$7$$%a!<%k$N:G=i$KA^F~$5$l$^$9!#(B + +@item message-included-forward-headers +@vindex message-included-forward-headers +$B$3$l$O@55,I=8=$G!"$=$l$OE>Aw$5$l$k%a%C%;!<%8$K4^$^$l$k%X%C%@!<9T$K9gCW$9(B +$B$k$b$N$G$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 +@end menu + + +@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 C-q +@kindex C-c C-q +@findex message-fill-yanked-message +$BE=$jIU$1$i$l$?%a%C%;!<%8$r@^$jJV$7$^$9(B +(@code{message-fill-yanked-message})$B!#7Y9p(B: $B$b$7!"0zMQ$N=,47$,JQ$G$"$k$J(B +$B$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$*$$$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 + +@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 + +@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!"$=$l$>$l$NE=$jIU$1$i$l$?0zMQ9T$O$=$NA0$K(B +@code{message-yank-prefix} $B$rIU$1$i$l$^$9!#=i4|CM$O(B @samp{> } $B$G$9!#$b$7(B +$B$=$l$,(B @code{nil} $B$G$"$l$P!"%a%C%;!<%8$N;z2<$2$@$1$r$7$^$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$r(B +@code{sc-cite-original} $B$K@_Dj$9$k;v$b$G$-$^$9!#(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$O(B @code{(point)} $B$H(B +@code{(mark t)} $B$N4V$G0zMQ$rH/8+$9$k;v$,$G$-$^$9!#$=$7$F!"$=$l$>$l$N4X?t(B +$B$O0zMQJ8$,=$@5$5$l$k$H!"$=$N<~$j$K%]%$%s%H$H%^!<%/$r;D$5$J$1$l$P$J$j$^$;(B +$B$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$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(B rot13) $B$7$^$9(B +(@code{message-caesar-buffer-body})$B!#$b$7HO0O8BDj$,$5$;$k(B +$B$+$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) $B>JN,Id9f(B (@samp{[...]} $B$,$=$N>l=j$KA^F~$5$l$^$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$^$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$^$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$/$O(B +@code{From} $B%X%C%@!<$r4^$`(B @code{To} $B%X%C%@!<$rA^F~$7$^$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$^$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$^$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 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$O}. + +@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 +@code{Message-ID} $B$,l9g$O$3$NJQ?t$r$3$l$i$N@\F,8l(B +$B$K9g$&$h$&$J@55,I=8=$K@_Dj$9$k$G$7$g$&!#;d<+?H$O!"$=$N$h$&$J5,3J$K=>$o$J(B +$B$$%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 . X-Mailer))} $B$G$9!#(B + +@item message-ignored-mail-headers +@vindex message-ignored-mail-headers +$B%a!<%k$r=P$9A0$Kl9g$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$-$^$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!#(BMessage $B$O(B +@code{mail-host-address} $B$,Dj5A$5$l$F$$$l$P!"$=$l$r(B fully qualified +domain name (FQDN) ($B40A4$K>r7o$rK~$?$7$?%I%a%$%sL>(B) $B$H$7$F;H$$$^$9!#$b$7(B +$B$=$&$G$J$1$l$P!"$=$l$O(B @code{system-name} $B$r;H$$!"$=$l$O$$$/$D$+$N%^%7%s(B +-- $Bl9g0J30$O!"%m!<%+%kJQ?t(B @code{message-mailer} $B$K$7$?$,$C$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 +$BHs9gK!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 +@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$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 +@code{nil} $B$G$"$l$P!"$=$N$h$&$J?F@Z%a%C%;!<%8$O2C$($i$l$^$;$s!#=i4|CM$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#k$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$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 +($BM%@h=g0L$N9b$$$b$N$+$i5s$2$i$l$F$$$^$9(B) $B$,2?=h$K1~Ez$,Aw$i$l$k$+$r7hDj(B +$B$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 index adb37c1..cc37033 100644 --- a/texi/message.texi +++ b/texi/message.texi @@ -1,7 +1,7 @@ \input texinfo @c -*-texinfo-*- @setfilename message -@settitle Message 5.6.22 Manual +@settitle Message 5.6.44 Manual @synindex fn cp @synindex vr cp @synindex pg cp @@ -42,7 +42,7 @@ into another language, under the above conditions for modified versions. @tex @titlepage -@title Message 5.6.22 Manual +@title Message 5.6.44 Manual @author by Lars Magne Ingebrigtsen @page @@ -83,7 +83,7 @@ Message mode buffers. * Key Index:: List of Message mode keys. @end menu -This manual corresponds to Message 5.6.22. Message is distributed with +This manual corresponds to Message 5.6.44. Message is distributed with the Gnus distribution bearing the same version number as this manual has. @@ -267,6 +267,31 @@ forwarded message will be inserted first in the new mail. @vindex message-included-forward-headers Regexp matching header lines to be included in forwarded messages. +@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}. + @end table @@ -680,7 +705,7 @@ message. @item message-from-style @vindex message-from-style -Specifies how @code{From} headers should look. There are four legal +Specifies how @code{From} headers should look. There are four valid values: @table @code @@ -782,7 +807,7 @@ 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 legal: +impossible, they will be prompted for. The following symbols are valid: @table @code @@ -888,10 +913,16 @@ Other variables for customizing outgoing news articles: @item message-syntax-checks @vindex message-syntax-checks -If non-@code{nil}, Message will attempt to check the legality of the -headers, as well as some other stuff, before posting. You can control -the granularity of the check by adding or removing elements from this -list. Legal elements are: +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 @@ -912,7 +943,7 @@ Check whether the @code{From} header seems nice. @cindex long lines Check for too long lines. @item control-chars -Check for illegal characters. +Check for invalid characters. @item size Check for excessive size. @item new-text -- 1.7.10.4