+1998-07-18 Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
+
+ * lisp/pop3-fma.el: Change version No 1.00.
+
+1998-07-16 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * Sync up with Semi-gnus 6.8.1.
+
+1998-07-16 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * lisp/gnus.el (gnus-version-number): Update to 6.8.1.
+
+ * Sync up with Gnus 5.6.24.
+
+1998-07-10 Keiichi Suzuki <kei-suzu@mail.wbs.ne.jp>
+
+ * lisp/gnus-ems.el (gnus-mule-cite-add-face): Fix problem when multi
+ bytes charactors are used in cite prefix. (for Emacs 20.1 and 20.2)
+ (gnus-ems-redefine): for Emacs 20.1 and 20.2
+
+ * lisp/gnus-cite.el (gnus-cite-add-face): Abolish my last bogus change.
+
+1998-07-09 Keiichi Suzuki <kei-suzu@mail.wbs.ne.jp>
+
+ * lisp/gnus-cite.el (gnus-cite-add-face): Fix problem when multi
+ bytes charactors are used in cite prefix.
+
+1998-07-07 Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
+
+ * texi/gnus-ja.texi: Add "The End".
+
+1998-07-06 Keisuke Mori <ksk@ntts.com>
+
+ * texi/gnus-ja.texi: Add "Various".
+
+1998-07-06 Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
+
+ * texi/gnus-ja.texi: Add "Various".
+ * texi/gnus-ja.texi: Sync up with Gnus 5.6.22
+
+1998-07-03 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * lisp/gnus-msg.el (gnus-extended-version): Add comments.
+
+1998-07-03 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * lisp/message.el (message-send-mail-with-smtp): Require 'smtp.
+
+1998-07-02 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * Sync up with Semi-gnus 6.8.0 and Gnus 5.6.23.
+
+1998-07-02 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * lisp/message.el (message-header-format-alist): Repair to use
+ `message-fill-references' for References.
+
+1998-07-01 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * lisp/gnus-art.el (gnus-article-header-presentation-method):
+ Delete nil optional arguments.
+ - Delete setting for `mime-raw-representation-type-alist'.
+
+1998-07-01 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * lisp/gnus.el (gnus-version-number): Update to 6.8.0.
+ (gnus-version): Modify for FLIM 1.8.
+
+ * lisp/gnus-art.el (gnus-article-header-presentation-method):
+ Modify for FLIM 1.8.
+
+1998-06-30 Keisuke Mori <ksk@ntts.com>
+
+ * texi/gnus-ja.texi: Add "Scroing".
+
+1998-06-30 Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
+
+ * texi/gnus-ja.texi: Add "Scoring".
+
1998-06-30 Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
* Sync up with Gnus 5.6.22
implementation.
- Abolish unused setting for `mime-view-show-summary-method'.
+1998-06-26 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * lisp/messge.el (message-use-followup-to): Change menu tag.
+ (message-use-mail-copies-to): Ditto.
+ (message-use-mail-followup-to): Ditto.
+ (message-use-mail-reply-to): Ditto. Also change default.
+
1998-06-26 MORIOKA Tomohiko <morioka@jaist.ac.jp>
* readme, texi/ChangeLog, texi/gnus.texi, texi/message.texi,
`gnus-content-header-filter'.
Modify for SEMI 1.7.
+1998-06-19 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * lisp/gnus-art.el (article-hide-boring-headers): Funcall
+ `gnus-extract-address-components'.
+
+ * lisp/gnus-picon.el (gnus-article-display-picons): Funcall
+ `gnus-extract-address-components'.
+
+ * lisp/gnus.el (gnus-extract-address-components): Modify
+ doc-string.
+
+ * lisp/message.el (message-check-news-header-syntax): Funcall
+ `gnus-extract-address-components'.
+ (message-user-mail-address): Ditto.
+ (message-generate-headers): Ditto.
+ (message-buffer-name): Ditto.
+ (message-cancel-news): Ditto.
+ (message-supersede): Ditto.
+
+1998-06-18 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * lisp/message.el (message-send-mail-with-smtp): New
+ implementation.
+
+ * lisp/smtp.el (smtp-use-8bitmime): New variable.
+ (smtp-debug-info): Internal variable, now.
+ (smtp-make-fqdn): Renamed from `smtp-fqdn'.
+ (smtp-via-smtp): New implementation.
+ (smtp-send-command): Treat "PASS" as usual.
+ (smtp-do-bcc): Removed.
+
+ * lisp/smtpmail.el: Removed; Semi-gnus no longer use it.
+
1998-06-18 Keisuke Mori <ksk@ntts.com>
* texi/gnus-ja.texi: Add "Select Methods".
Use base64-encode-string , base64-decode-string instead.
Both change by Yasuo OKABE <okabe@kuis.kyoto-u.ac.jp>
+1998-06-13 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * lisp/message.el (message-subject-encoded-re-regexp): Add
+ comment. Modify doc-string.
+
1998-06-13 Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
* lisp/pop3-fma.el: New function pop3-fma-cypher-string
New variable pop3-fma-cypher-key
+1998-06-12 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * lisp/gnus-i18n.el: Synch up with `akr' branch.
+
+ * lisp/message.el: Imported features from `akr' branch.
+ (message-subject-encoded-re-regexp): New variable.
+ (message-use-subject-re): Ditto.
+ (message-make-followup-subject): New function.
+ (message-reply): Use it.
+ (message-followup): Ditto.
+
+1998-06-12 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * lisp/message.el (message-required-news-headers): `X-Newsreader'
+ was replaced by `User-Agent'.
+ (message-required-mail-headers): `X-Mailer' was replaced by
+ `User-Agent'.
+ (message-header-format-alist): `X-Mailer' and `X-Newsreader' were
+ replaced by `User-Agent'.
+ (message-generate-headers): Ditto.
+
+ (message-user-agent): New variable.
+ (message-newsreader): Replaced by `message-user-agent'.
+ (message-mailer): Ditto.
+ (message-mode): `message-mailer' and `message-newsreader' were
+ replaced by `message-user-agent'.
+
+ (message-fill-address): Use SPACE instead of HTAB.
+ (message-fill-header): Ditto.
+ (message-fill-references): Removed.
+
+ (message-use-mail-copies-to): New variable.
+ (message-use-mail-followup-to): Modify doc-string.
+ (message-use-mail-reply-to): Ditto.
+ (message-goto-mail-copies-to): New function.
+
+ (message-reply): New implementation.
+ (message-followup): Ditto.
+
+ * lisp/gnus-msg.el (gnus-inews-add-send-actions): `message-mailer'
+ and `message-newsreader' were replaced by `message-user-agent'.
+ (gnus-extended-version): Generate "PRODUCT/VERSION" style strings.
+
+ * lisp/gnus-soup.el (gnus-soup-send-packet): `message-mailer' and
+ `message-newsreader' were replaced by `message-user-agent'.
+
+ * lisp/gnus-art.el (gnus-visible-headers): Add Mail-Followup-To
+ and Mail-Reply-To headers.
+
+1998-06-07 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * lisp/message.el (message-reply): Fix typo.
+
+1998-06-07 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * lisp/message.el (message-make-in-reply-to): New format.
+ (message-use-mail-followup-to): Add doc string.
+ (message-reply): Use `message-use-mail-followup-to'.
+ (message-followup): Ditto.
+
1998-06-07 MORIOKA Tomohiko <morioka@jaist.ac.jp>
* lisp/gnus-art.el: Delete setting for
* Sync up with Gnus 5.6.10.
+1998-05-31 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * (message-followup): Would not use "Mail-Followup-To:" properly.
+
+1998-05-30 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * README.semi: Add description of `shuhei-k' branch.
+
+ * lisp/gnus-art.el (gnus-visible-headers): Add "Mail-Followup-To:"
+ and "Mail-Reply-To:" fields.
+
+ * lisp/message.el (message-included-forward-headers): Add
+ "Mail-Followup-To:" and "Mail-Reply-To:" fields.
+ (message-font-lock-keywords): Ditto.
+
+ (message-use-mail-followup-to): New variable. (not fully implemented)
+ (message-use-mail-reply-to): New variable. (not fully implemented)
+ (message-goto-mail-followup-to): New function.
+ (message-goto-mail-reply-to): New function.
+
+ (message-reply): Use "Mail-Followup-To:" and "Mail-Reply-To:" if
+ present.
+ (message-followup): Ditto.
+
+ * lisp/gnus-sum.el (gnus-get-newsgroup-headers): Save original
+ value of "From:" and "Subject:" fields to `raw-text' property.
+ (gnus-nov-field): Ditto.
+
+ * lisp/gnus-cache.el (gnus-cache-possibly-enter-article): Use
+ `raw-text' property for saving cache file.
+
1998-05-30 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
* README.semi: Add description of `shuhei-k' branch.
* lisp/gnus-util.el (gnus-output-to-mail): Guard as binary.
+1998-04-28 Tanaka Akira <akr@jaist.ac.jp>
+
+ * lisp/gnus-i18n.el (gnus-set-summary-default-charset): Delete
+ buffer-local binding of `default-mime-charset' when the
+ newsgroup doesn't match `gnus-newsgroup-default-charset-alist'.
+
1998-04-24 Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
* texi/gnus-ja.texi: Add "The Active File".
*** Old dejanews archives can now be read by nnweb.
*** Byte-compilation of user-specs now works under XEmacs.
+
+*** `gnus-posting-styles' has been re-activated.
% cvs update [-r TAG]
-Major tags are following:
-
- semi-gnus assigned to the latest stable version. It is
- very conservative.
-
- for-semi-N1_N2 assigned to the latest stable version for SEMI
- API N1.N2 (N1 and N2 are natural number).
- (e.g. `for-semi-1_3' is for SEMI API 1.3)
-
- gnus-N1_N2_N3 assigned to gnus(Gnus) N1.N2.N3
- (e.g. `gnus-6_2_1' means gnus 6.2.1).
-
- larsi Original Gnus
-
- himi himi branch
-
- ichikawa ichikawa branch
-
- akr akr branch
-
- shuhei-k shuhei-k branch
- Mail-Followup-To/Mail-Reply-To, gnus-cache fix.
+ See `README.branch' for information about branches and their tags.
How to get? (via ftp)
=====================
- Semi-daily snapshots are also available from
+ Snapshots are also available from
- ftp://ftp.jaist.ac.jp/pub/GNU/elisp/semi-gnus/
+ ftp://ftp.jaist.ac.jp/pub/GNU/elisp/semi-gnus/snapshots/
- NOTE: These snapshots are automatically created from our repository
-if something was changed within a day, and will usually not be tested.
+ NOTE: These snapshots are automatically created from our repository,
+and will usually not be tested.
How to join development
+Sat Jul 11 03:03:53 1998 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Gnus v5.6.24 is released.
+
+Fri Jul 10 04:23:24 1998 Hallvard B. Furuseth <h.b.furuseth@usit.uio.no>
+
+ * gnus-util.el (gnus-parse-netrc): Allow "default" values.
+
+Fri Jul 10 04:15:35 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nntp.el (nntp-server-opened-hook): Doc change.
+
+Fri Jul 10 03:03:48 1998 François Pinard <pinard@iro.umontreal.ca>
+
+ * gnus-sum.el (gnus-summary-respool-trace): New command and
+ keystroke.
+
+Fri Jul 10 02:18:01 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-util.el (gnus-prin1): Bind print-escape-multibyte to nil.
+
+Mon Jul 6 01:02:59 1998 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-range.el (gnus-sorted-complement): Fix comments.
+
+Thu Jul 2 11:16:14 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * 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 <larsi@ifi.uio.no>
+
+ * gnus-int.el (gnus-get-function): Set funct to nil.
+
+1998-07-01 16:57:38 Simon Josefsson <jas@pdc.kth.se>
+
+ * 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 <larsi@ifi.uio.no>
+
+ * 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 <rms@santafe.edu>
+
+ * message.el (message-cite-original): Use mail-citation-hook.
+ (message-cite-function): Ditto.
+
+Wed Jul 1 14:00:53 1998 Rajappa Iyer <rsi@lucent.com>
+
+ * gnus-salt.el (gnus-pick-mode-map): Changed keymap.
+
+Wed Jul 1 13:33:26 1998 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Gnus v5.6.23 is released.
+
+Wed Jul 1 12:52:32 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * 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 <pinard@iro.umontreal.ca>
+
+ * gnus-util.el (gnus-delete-if): Would do the opposite.
+
+Wed Jul 1 01:53:31 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus-sum.el (gnus-build-sparse-threads): Didn't work at all.
+
+Tue Jun 30 15:56:54 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * 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 <mike@lotusland.demon.co.uk>
+
+ * gnus-agent.el (gnus-agent-expire): Use a fresh hash table.
+
Mon Jun 29 22:49:49 1998 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
* gnus.el: Gnus v5.6.22 is released.
(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*"))
(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
(< 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)))
(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 ()
(gnus-number-of-articles-to-be-saved
(when (eq gnus-prompt-before-saving t)
num))) ; Magic
- (set-buffer gnus-original-article-buffer)
(set-buffer gnus-article-current-summary)
(funcall gnus-default-article-saver filename)))))
(gnus-run-hooks 'gnus-article-prepare-hook)
;; Display message.
(funcall method)
+ ;; Associate this article with the current summary buffer.
+ (setq gnus-article-current-summary summary-buffer)
;; Perform the article display hooks.
(gnus-run-hooks 'gnus-article-display-hook))
;; Do page break.
;; It was a pseudo.
(t article)))
- ;; Associate this article with the current summary buffer.
- (setq gnus-article-current-summary gnus-summary-buffer)
-
;; Update sparse articles.
(when (and do-update-line
(or (numberp article)
;;;
(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
'gnus-original-article-mode
#'gnus-article-header-presentation-method)
-(defun mime-preview-quitting-method-for-gnus ()
- (if (not gnus-show-mime)
- (mime-preview-kill-buffer))
- (delete-other-windows)
- (gnus-article-show-summary)
- (if (or (not gnus-show-mime)
- (null gnus-have-all-headers))
- (gnus-summary-select-article nil t)
+(defun gnus-mime-preview-quitting-method ()
+ (if gnus-show-mime
+ (gnus-article-show-summary)
+ (mime-preview-kill-buffer)
+ (delete-other-windows)
+ (gnus-article-show-summary)
+ (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
- #'mime-preview-quitting-method-for-gnus)
+ 'gnus-original-article-mode #'gnus-mime-preview-quitting-method)
(defun gnus-following-method (buf)
(set-buffer buf)
;; [number subject from date id references chars lines xref]
(insert (format "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n"
(mail-header-number headers)
- (mail-header-subject headers)
- (mail-header-from headers)
+ (let ((subject (mail-header-subject headers)))
+ (or (get-text-property 0 'raw-text subject)
+ subject))
+ (let ((from (mail-header-from headers)))
+ (or (get-text-property 0 'raw-text from)
+ from))
(mail-header-date headers)
(mail-header-id headers)
(or (mail-header-references headers) "")
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)
;; `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)
(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"))
+ (unless (and (fboundp 'set-buffer-multibyte)
+ (subrp (symbol-function 'set-buffer-multibyte)))
+ ;; For Emacs 20.1 and 20.2
+ (defalias 'gnus-truncate-string 'truncate-string)
+ (fset 'gnus-cite-add-face 'gnus-mule-cite-add-face)
+ (fset 'gnus-max-width-function 'gnus-mule-max-width-function)
+
+ (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"))
+ )
)))
(defun gnus-region-active-p ()
))
(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
;; Maybe complain if there is no function.
(unless (fboundp func)
(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))
\f
(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-message-buffer "*Mail Gnus*")
(copy-sequence message-header-setup-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)
(setq message-post-method
`(lambda (arg)
(gnus-post-method arg ,gnus-newsgroup-name)))
- (setq message-newsreader (setq message-mailer (gnus-extended-version)))
+ (setq message-user-agent (gnus-extended-version))
(message-add-action
`(set-window-configuration ,winconf) 'exit 'postpone 'kill)
(message-add-action
;; Dummy to avoid byte-compile warning.
(defvar nnspool-rejected-article-hook)
+(defvar mule-version)
(defvar xemacs-codename)
-;;; Since the X-Newsreader/X-Mailer are ``vanity'' headers, they might
-;;; as well include the Emacs version as well.
-;;; The following function works with later GNU Emacs, and XEmacs.
(defun gnus-extended-version ()
- "Stringified gnus version."
+ "Stringified Gnus version and Emacs version."
(interactive)
- gnus-version)
+ (concat
+ "Semi-gnus/" gnus-version-number " "
+ (cond
+ ((featurep 'xemacs)
+ (concat (format "XEmacs/%d.%d" emacs-major-version emacs-minor-version)
+ ;; XXX: include beta version?
+ (if (featurep 'mule)
+ "-mule")
+ (if (boundp 'xemacs-codename)
+ (concat " (" xemacs-codename ")"))
+ ))
+ (t
+ (concat (format "Emacs/%d.%d" emacs-major-version emacs-minor-version)
+ ;; XXX: include unibyte/multibyte env. info.
+ (if (boundp 'mule-version)
+ (concat " Mule/" mule-version))
+ ;; XXX: convert (Meadow-version) -> PRODUCT/VERSION.
+ (if (featurep 'meadow)
+ (concat " " (Meadow-version)))
+ ))
+ )))
\f
;;;
(insert " ")))
(insert "\n")))))))
+;;; Posting styles.
+
+(defun gnus-configure-posting-styles ()
+ "Configure posting styles according to `gnus-posting-styles'."
+ (let ((styles gnus-posting-styles)
+ (gnus-newsgroup-name (or gnus-newsgroup-name ""))
+ style match variable attribute value value-value)
+ ;; 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 (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
+ (progn
+ ;; This is an ordinary variable.
+ (make-local-variable variable)
+ (set variable value-value))
+ ;; This is a header to be added to the headers when
+ ;; posting.
+ (when value-value
+ (make-local-variable message-required-mail-headers)
+ (make-local-variable message-required-news-headers)
+ (push (cons (car attribute) value-value)
+ message-required-mail-headers)
+ (push (cons (car attribute) value-value)
+ message-required-news-headers)))))))))
+
;;; Allow redefinition of functions.
(gnus-ems-redefine)
(when (and (featurep 'xpm)
(or (not (fboundp 'device-type)) (equal (device-type) 'x))
(setq from (mail-fetch-field "from"))
- (setq from (downcase (or (cadr (mail-extract-address-components
- from))
+ (setq from (downcase (or (cadr
+ (funcall gnus-extract-address-components
+ from))
"")))
(or (setq at-idx (string-match "@" from))
(setq at-idx (length from))))
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))
(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 ()
(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)
(search-forward "\n\n")
(forward-char -1)
(insert mail-header-separator)
- (setq message-newsreader (setq message-mailer
- (gnus-extended-version)))
+ (setq message-user-agent (gnus-extended-version))
(cond
((string= (gnus-soup-reply-kind (car replies)) "news")
(gnus-message 5 "Sending news message to %s..."
(require 'gnus-range)
(require 'gnus-int)
(require 'gnus-undo)
+(require 'gnus-util)
(require 'mime-view)
(autoload 'gnus-summary-limit-include-cached "gnus-cache" nil t)
"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)
(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)])
(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)
;; First we create an alist of generations/relations, where
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.
(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)
(defsubst gnus-nov-parse-line (number dependencies &optional force-new)
(let ((eol (gnus-point-at-eol))
(buffer (current-buffer))
- header)
+ header rawtext decoded)
;; overview: [num subject from date id refs chars lines misc]
(unwind-protect
(setq header
(make-full-mail-header
number ; number
- (funcall
- gnus-unstructured-field-decoder (gnus-nov-field)) ; subject
- (funcall
- gnus-structured-field-decoder (gnus-nov-field)) ; from
+ (progn
+ (setq rawtext (gnus-nov-field) ; subject
+ decoded (funcall
+ gnus-unstructured-field-decoder rawtext))
+ (if (string= rawtext decoded)
+ rawtext
+ (put-text-property 0 (length decoded) 'raw-text rawtext decoded)
+ decoded))
+ (progn
+ (setq rawtext (gnus-nov-field) ; from
+ decoded (funcall
+ gnus-structured-field-decoder rawtext))
+ (if (string= rawtext decoded)
+ rawtext
+ (put-text-property 0 (length decoded) 'raw-text rawtext decoded)
+ decoded))
(gnus-nov-field) ; date
(or (gnus-nov-field)
(nnheader-generate-fake-message-id)) ; id
(subst-char-in-region (point-min) (point-max) ?\t ? t)
(gnus-run-hooks 'gnus-parse-headers-hook)
(let ((case-fold-search t)
+ rawtext decoded
in-reply-to header p lines chars)
(goto-char (point-min))
;; Search to the beginning of the next header. Error messages
(progn
(goto-char p)
(if (search-forward "\nsubject: " nil t)
- (funcall
- gnus-unstructured-field-decoder (nnheader-header-value))
+ (progn
+ (setq rawtext (nnheader-header-value)
+ decoded (funcall
+ gnus-unstructured-field-decoder rawtext))
+ (if (string-equal rawtext decoded)
+ rawtext
+ (put-text-property 0 (length decoded) 'raw-text rawtext decoded)
+ decoded))
"(none)"))
;; From.
(progn
(goto-char p)
(if (search-forward "\nfrom: " nil t)
- (funcall
- gnus-structured-field-decoder (nnheader-header-value))
+ (progn
+ (setq rawtext (nnheader-header-value)
+ decoded (funcall
+ gnus-structured-field-decoder rawtext))
+ (if (string-equal rawtext decoded)
+ rawtext
+ (put-text-property 0 (length decoded) 'raw-text rawtext decoded)
+ decoded))
"(nobody)"))
;; Date.
(progn
;; 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)
'<)
(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
;;; 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)
(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"
(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)
"Gp" gnus-topic-edit-parameters
"#" gnus-topic-mark-topic
"\M-#" gnus-topic-unmark-topic
+ [tab] gnus-topic-indent
+ [M-tab] gnus-topic-unindent
gnus-mouse-2 gnus-mouse-pick-topic)
;; Define a new submap.
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))))
"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."
"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)))
(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)))
(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)
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
-(defconst gnus-version-number "6.7.8"
+(defconst gnus-version-number "6.8.1"
"Version number for this version of gnus.")
(defconst gnus-version
- (format "Semi-gnus %s (based on Gnus 5.6.22; for SEMI 1.8)"
+ (format "Semi-gnus %s (based on Gnus 5.6.24; for SEMI 1.8/FLIM 1.8)"
gnus-version-number)
"Version string for this version of gnus.")
(defcustom gnus-extract-address-components 'gnus-extract-address-components
"*Function for extracting address components from a From header.
-Two pre-defined function exist: `gnus-extract-address-components',
-which is the default, quite fast, and too simplistic solution, and
-`mail-extract-address-components', which works much better, but is
-slower."
+
+`gnus-extract-address-components' is a quite fast, and too simplistic.
+`mail-extract-address-components' works much better, but is slower.
+`std11-extract-address-components' also works better, and less slower."
:group 'gnus-summary-format
:type '(radio (function-item gnus-extract-address-components)
(function-item mail-extract-address-components)
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" 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
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
;; Keywords: mail, news, MIME
;; This file is part of GNU Emacs.
(defcustom message-required-news-headers
'(From Newsgroups Subject Date Message-ID
(optional . Organization) Lines
- (optional . X-Newsreader))
+ (optional . User-Agent))
"*Headers to be generated or prompted for when posting an article.
RFC977 and RFC1036 require From, Date, Newsgroups, Subject,
Message-ID. Organization, Lines, In-Reply-To, Expires, and
-X-Newsreader are optional. If don't you want message to insert some
+User-Agent are optional. If don't you want message to insert some
header, remove it from this list."
:group 'message-news
:group 'message-headers
(defcustom message-required-mail-headers
'(From Subject Date (optional . In-Reply-To) Message-ID Lines
- (optional . X-Mailer))
+ (optional . User-Agent))
"*Headers to be generated or prompted for when mailing a message.
RFC822 required that From, Date, To, Subject and Message-ID be
-included. Organization, Lines and X-Mailer are optional."
+included. Organization, Lines and User-Agent are optional."
:group 'message-mail
:group 'message-headers
:type '(repeat sexp))
:group 'message-various
:type 'regexp)
+;;; Some sender agents encode the whole subject including leading "Re: ".
+;;; And if followup agent does not decode it for some reason (e.g. unknown
+;;; charset) and just add a new "Re: " in front of the encoded-word, the
+;;; result will contain multiple "Re: "'s.
+(defcustom message-subject-encoded-re-regexp
+ (concat
+ "^[ \t]*"
+ (regexp-quote "=?")
+ "[-!#$%&'*+0-9A-Z^_`a-z{|}~]+" ; charset
+ (regexp-quote "?")
+ "\\("
+ "[Bb]" (regexp-quote "?") ; B encoding
+ "\\(\\(CQk\\|CSA\\|IAk\\|ICA\\)[Jg]\\)*" ; \([ \t][ \t][ \t]\)*
+ "\\("
+ "[Uc][km]U6" ; [Rr][Ee]:
+ "\\|"
+ "\\(C[VX]\\|I[FH]\\)J[Fl]O[g-v]" ; [ \t][Rr][Ee]:
+ "\\|"
+ "\\(CQl\\|CSB\\|IAl\\|ICB\\)[Sy][RZ]T[o-r]" ; [ \t][ \t][Rr][Ee]:
+ "\\)"
+ "\\|"
+ "[Qb]" (regexp-quote "?") ; Q encoding
+ "\\(_\\|=09\\|=20\\)*"
+ "\\([Rr]\\|=[57]2\\)\\([Ee]\\|=[46]5\\)\\(:\\|=3[Aa]\\)"
+ "\\)"
+ )
+ "*Regexp matching \"Re: \" in the subject line.
+Unlike `message-subject-re-regexp', this regexp matches \"Re: \" within
+an encoded-word."
+ :group 'message-various
+ :type 'regexp)
+
+(defcustom message-use-subject-re t
+ "*If t, remove any (buggy) \"Re: \"'s from the subject of the precursor
+and add a new \"Re: \". If it is nil, use the subject \"as-is\". If it
+is the symbol `guess', try to detect \"Re: \" within an encoded-word."
+ :group 'message-various
+ :type '(choice (const :tag "off" nil)
+ (const :tag "on" t)
+ (const guess)))
+
;;;###autoload
(defcustom message-signature-separator "^-- *$"
"Regexp matching the signature separator."
:type '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:\\|^\\(Mail-\\)?Followup-To:\\|^\\(Mail-\\)?Reply-To:\\|^Mail-Copies-To:\\|^Organization:\\|^Summary:\\|^Keywords:\\|^To:\\|^Cc:\\|^Posted-To:\\|^Apparently-To:\\|^Gnus-Warning:\\|^Resent-\\|^Message-ID:\\|^References:\\|^Content-\\|^MIME-Version:"
"*Regexp matching headers to be included in forwarded messages."
:group 'message-forwarding
:type 'regexp)
-(defcustom message-ignored-resent-headers "^Return-receipt"
+(defcustom message-ignored-resent-headers "^Return-Receipt"
"*All headers that match this regexp will be deleted when resending a message."
:group 'message-interface
:type 'regexp)
`use', always use the value."
:group 'message-interface
:type '(choice (const :tag "ignore" nil)
- (const use)
- (const ask)))
+ (const :tag "maybe" t)
+ (const :tag "always" use)
+ (const :tag "ask" ask)))
+
+(defcustom message-use-mail-copies-to 'ask
+ "*Specifies what to do with Mail-Copies-To header.
+If nil, always ignore the header. If it is t, use its value, but
+query before using the value other than \"always\" or \"never\".
+If it is the symbol `ask', always query the user whether to use
+the value. If it is the symbol `use', always use the value."
+ :group 'message-interface
+ :type '(choice (const :tag "ignore" nil)
+ (const :tag "maybe" t)
+ (const :tag "always" use)
+ (const :tag "ask" ask)))
+
+(defcustom message-use-mail-followup-to 'ask
+ "*Specifies what to do with Mail-Followup-To header.
+If nil, always ignore the header. If it is the symbol `ask', always
+query the user whether to use the value. If it is t or the symbol
+`use', always use the value."
+ :group 'message-interface
+ :type '(choice (const :tag "ignore" nil)
+ (const :tag "maybe" t)
+ (const :tag "always" use)
+ (const :tag "ask" ask)))
+
+;;; XXX: 'ask and 'use are not implemented yet.
+(defcustom message-use-mail-reply-to 'ask
+ "*Specifies what to do with Mail-Reply-To/Reply-To header.
+If nil, always ignore the header. If it is t or the symbol `use', use
+its value. If it is the symbol `ask', always query the user whether to
+use the value. Not that if \"Reply-To\" is marked as \"broken\", its value
+is never used."
+ :group 'message-interface
+ :type '(choice (const :tag "ignore" nil)
+ (const :tag "maybe" t)
+ (const :tag "always" use)
+ (const :tag "ask" ask)))
;; stuff relating to broken sendmail in MMDF
(defcustom message-sendmail-f-is-evil nil
: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)
(defvar message-reply-buffer nil)
(defvar message-reply-headers nil)
-(defvar message-newsreader nil)
-(defvar message-mailer nil)
(defvar message-sent-message-via nil)
(defvar message-checksum nil)
(defvar message-send-actions nil
:group 'message-sending
:type 'sexp)
+;;; XXX: This symbol is overloaded! See below.
+(defvar message-user-agent nil
+ "String of the form of PRODUCT/VERSION. Used for User-Agent header field.")
+
;; Ignore errors in case this is used in Emacs 19.
;; Don't use ignore-errors because this is copied into loaddefs.el.
;;;###autoload
`((,(concat "^\\([Tt]o:\\)" content)
(1 'message-header-name-face)
(2 'message-header-to-face nil t))
- (,(concat "^\\(^[GBF]?[Cc][Cc]:\\|^[Rr]eply-[Tt]o:\\)" content)
+ (,(concat "^\\([GBF]?[Cc][Cc]:\\|[Rr]eply-[Tt]o:\\|"
+ "[Mm]ail-[Cc]opies-[Tt]o:\\|"
+ "[Mm]ail-[Rr]eply-[Tt]o:\\|"
+ "[Mm]ail-[Ff]ollowup-[Tt]o:\\)" content)
(1 'message-header-name-face)
(2 'message-header-cc-face nil t))
(,(concat "^\\([Ss]ubject:\\)" content)
(Lines)
(Expires)
(Message-ID)
- (References . message-shorten-references)
- (X-Mailer)
- (X-Newsreader))
+ ;; (References . message-shorten-references)
+ (References . message-fill-header)
+ (User-Agent))
"Alist used for formatting headers.")
(eval-and-compile
(define-key message-mode-map "\C-c\C-f\C-w" 'message-goto-fcc)
(define-key message-mode-map "\C-c\C-f\C-c" 'message-goto-cc)
(define-key message-mode-map "\C-c\C-f\C-s" 'message-goto-subject)
- (define-key message-mode-map "\C-c\C-f\C-r" 'message-goto-reply-to)
+ ;; (define-key message-mode-map "\C-c\C-f\C-r" 'message-goto-reply-to)
+ (define-key message-mode-map "\C-c\C-f\C-r" 'message-goto-mail-reply-to)
+ (define-key message-mode-map "\C-c\C-f\C-m" 'message-goto-mail-followup-to)
(define-key message-mode-map "\C-c\C-f\C-n" 'message-goto-newsgroups)
(define-key message-mode-map "\C-c\C-f\C-d" 'message-goto-distribution)
(define-key message-mode-map "\C-c\C-f\C-f" 'message-goto-followup-to)
["Subject" message-goto-subject t]
["Cc" message-goto-cc t]
["Reply-To" message-goto-reply-to t]
+ ["Mail-Reply-To" message-goto-mail-reply-to t]
+ ["Mail-Followup-To" message-goto-mail-followup-to t]
+ ["Mail-Copies-To" message-goto-mail-copies-to t]
["Summary" message-goto-summary t]
["Keywords" message-goto-keywords t]
["Newsgroups" message-goto-newsgroups t]
C-c C-f C-w move to Fcc C-c C-f C-r move to Reply-To
C-c C-f C-u move to Summary C-c C-f C-n move to Newsgroups
C-c C-f C-k move to Keywords C-c C-f C-d move to Distribution
+ C-c C-f C-m move to Mail-Followup-To
C-c C-f C-f move to Followup-To
C-c C-t message-insert-to (add a To header to a news followup)
C-c C-n message-insert-newsgroups (add a Newsgroup header to a news reply)
(setq paragraph-separate paragraph-start)
(make-local-variable 'message-reply-headers)
(setq message-reply-headers nil)
- (make-local-variable 'message-newsreader)
- (make-local-variable 'message-mailer)
+ (make-local-variable 'message-user-agent)
(make-local-variable 'message-post-method)
(make-local-variable 'message-sent-message-via)
(setq message-sent-message-via nil)
(interactive)
(message-position-on-field "Reply-To" "Subject"))
+(defun message-goto-mail-reply-to ()
+ "Move point to the Mail-Reply-To header."
+ (interactive)
+ (message-position-on-field "Mail-Reply-To" "Subject"))
+
+(defun message-goto-mail-followup-to ()
+ "Move point to the Mail-Followup-To header."
+ (interactive)
+ (message-position-on-field "Mail-Followup-To" "Subject"))
+
+(defun message-goto-mail-copies-to ()
+ "Move point to the Mail-Copies-To header."
+ (interactive)
+ (message-position-on-field "Mail-Copies-To" "Subject"))
+
(defun message-goto-newsgroups ()
"Move point to the Newsgroups header."
(interactive)
(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."
(let ((errbuf (if message-interactive
(generate-new-buffer " sendmail errors")
0))
- resend-to-addresses delimline)
+ resend-addresses delimline)
(let ((case-fold-search t))
(save-restriction
(message-narrow-to-headers)
- (setq resend-to-addresses (message-fetch-field "resent-to")))
+ ;; XXX: We need to handle Resent-CC/Resent-BCC, too.
+ (setq resend-addresses (message-fetch-field "resent-to")))
;; Change header-delimiter to be what sendmail expects.
(goto-char (point-min))
(re-search-forward
;; We must not do that for a resend
;; because we would find the original addresses.
;; For a resend, include the specific addresses.
- (if resend-to-addresses
- (list resend-to-addresses)
+ (if resend-addresses
+ (list resend-addresses)
'("-t")))))
(when message-interactive
(save-excursion
"Pass the prepared message buffer to qmail-inject.
Refer to the documentation for the variable `message-send-mail-function'
to find out how to use this."
- ;; replace the header delimiter with a blank line
+ ;; replace the header delimiter with a blank line.
(goto-char (point-min))
(re-search-forward
(concat "^" (regexp-quote mail-header-separator) "\n"))
(replace-match "\n")
+ (backward-char 1)
(run-hooks 'message-send-mail-hook)
;; send the message
(case
(mh-send-letter)))
(defun message-send-mail-with-smtp ()
- "Send the prepared message buffer with SMTP."
- (require 'smtp)
- (let ((errbuf (if mail-interactive
- (generate-new-buffer " smtp errors")
- 0))
- (case-fold-search nil)
- resend-to-addresses
- delimline)
- (unwind-protect
- (save-excursion
- (goto-char (point-max))
- ;; require one newline at the end.
- (or (= (preceding-char) ?\n)
- (insert ?\n))
- ;; Change header-delimiter to be what sendmail expects.
- (goto-char (point-min))
- (re-search-forward
- (concat "^" (regexp-quote mail-header-separator) "\n"))
- (replace-match "\n")
- (backward-char 1)
- (setq delimline (point-marker))
- (run-hooks 'message-send-mail-hook)
- ;; (sendmail-synch-aliases)
- ;; (if mail-aliases
- ;; (expand-mail-aliases (point-min) delimline))
- (goto-char (point-min))
- ;; ignore any blank lines in the header
- (while (and (re-search-forward "\n\n\n*" delimline t)
- (< (point) delimline))
- (replace-match "\n"))
- (let ((case-fold-search t))
- (goto-char (point-min))
- (goto-char (point-min))
- (while (re-search-forward "^Resent-to:" delimline t)
- (setq resend-to-addresses
- (save-restriction
- (narrow-to-region (point)
- (save-excursion
- (end-of-line)
- (point)))
- (append (mail-parse-comma-list)
- resend-to-addresses))))
-;;; Apparently this causes a duplicate Sender.
-;;; ;; If the From is different than current user, insert Sender.
-;;; (goto-char (point-min))
-;;; (and (re-search-forward "^From:" delimline t)
-;;; (progn
-;;; (require 'mail-utils)
-;;; (not (string-equal
-;;; (mail-strip-quoted-names
-;;; (save-restriction
-;;; (narrow-to-region (point-min) delimline)
-;;; (mail-fetch-field "From")))
-;;; (user-login-name))))
-;;; (progn
-;;; (forward-line 1)
-;;; (insert "Sender: " (user-login-name) "\n")))
- ;; Don't send out a blank subject line
- (goto-char (point-min))
- (if (re-search-forward "^Subject:[ \t]*\n" delimline t)
- (replace-match ""))
- ;; Put the "From:" field in unless for some odd reason
- ;; they put one in themselves.
- (goto-char (point-min))
- (if (not (re-search-forward "^From:" delimline t))
- (let* ((login user-mail-address)
- (fullname (user-full-name)))
- (cond ((eq mail-from-style 'angles)
- (insert "From: " fullname)
- (let ((fullname-start (+ (point-min) 6))
- (fullname-end (point-marker)))
- (goto-char fullname-start)
- ;; Look for a character that cannot appear unquoted
- ;; according to RFC 822.
- (if (re-search-forward "[^- !#-'*+/-9=?A-Z^-~]"
- fullname-end 1)
- (progn
- ;; Quote fullname, escaping specials.
- (goto-char fullname-start)
- (insert "\"")
- (while (re-search-forward "[\"\\]"
- fullname-end 1)
- (replace-match "\\\\\\&" t))
- (insert "\""))))
- (insert " <" login ">\n"))
- ((eq mail-from-style 'parens)
- (insert "From: " login " (")
- (let ((fullname-start (point)))
- (insert fullname)
- (let ((fullname-end (point-marker)))
- (goto-char fullname-start)
- ;; RFC 822 says \ and nonmatching parentheses
- ;; must be escaped in comments.
- ;; Escape every instance of ()\ ...
- (while (re-search-forward "[()\\]" fullname-end 1)
- (replace-match "\\\\\\&" t))
- ;; ... then undo escaping of matching parentheses,
- ;; including matching nested parentheses.
- (goto-char fullname-start)
- (while (re-search-forward
- "\\(\\=\\|[^\\]\\(\\\\\\\\\\)*\\)\\\\(\\(\\([^\\]\\|\\\\\\\\\\)*\\)\\\\)"
- fullname-end 1)
- (replace-match "\\1(\\3)" t)
- (goto-char fullname-start))))
- (insert ")\n"))
- ((null mail-from-style)
- (insert "From: " login "\n")))))
- ;; Insert an extra newline if we need it to work around
- ;; Sun's bug that swallows newlines.
- (goto-char (1+ delimline))
- (if (eval mail-mailer-swallows-blank-line)
- (newline))
- ;; Find and handle any FCC fields.
- (goto-char (point-min))
- (if (re-search-forward "^FCC:" delimline t)
- (mail-do-fcc delimline))
- (if mail-interactive
- (save-excursion
- (set-buffer errbuf)
- (erase-buffer))))
- ;;
- ;;
- ;;
- (let ((recipient-address-list
- (or resend-to-addresses
- (smtp-deduce-address-list (current-buffer)
- (point-min) delimline))))
- (smtp-do-bcc delimline)
-
- (if recipient-address-list
- (if (not (smtp-via-smtp recipient-address-list
- (current-buffer)))
- (error "Sending failed; SMTP protocol error"))
- (error "Sending failed; no recipients"))
- ))
- (if (bufferp errbuf)
- (kill-buffer errbuf)))))
+ "Send off the prepared buffer with SMTP."
+ (require 'smtp) ; XXX
+ (let ((case-fold-search t)
+ recipients)
+ (save-restriction
+ (message-narrow-to-headers)
+ (setq recipients
+ ;; XXX: Should be replaced by better one.
+ (smtp-deduce-address-list (current-buffer)
+ (point-min) (point-max)))
+ ;; Remove BCC lines.
+ (message-remove-header "bcc"))
+ ;; replace the header delimiter with a blank line.
+ (goto-char (point-min))
+ (re-search-forward
+ (concat "^" (regexp-quote mail-header-separator) "\n"))
+ (replace-match "\n")
+ (backward-char 1)
+ (run-hooks 'message-send-mail-hook)
+ (if recipients
+ (let ((result (smtp-via-smtp user-mail-address
+ recipients
+ (current-buffer))))
+ (unless (eq result t)
+ (error "Sending failed; " result)))
+ (error "Sending failed; no recipients"))))
(defun message-send-news (&optional arg)
(let ((tembuf (message-generate-new-buffer-clone-locals " *message temp*"))
(message-check 'from
(let* ((case-fold-search t)
(from (message-fetch-field "from"))
- (ad (nth 1 (mail-extract-address-components from))))
+ (ad (nth 1 (funcall gnus-extract-address-components from))))
(cond
((not from)
(message "There is no From line. Posting is denied.")
(timezone-make-date-arpa-standard
(current-time-string now) (current-time-zone now))))
+(defun message-make-followup-subject (subject)
+ "Make a followup Subject."
+ (cond
+ ((and (eq message-use-subject-re 'guess)
+ (string-match message-subject-encoded-re-regexp subject))
+ subject)
+ (message-use-subject-re
+ (concat "Re: " (message-strip-subject-re subject)))
+ (t subject)))
+
(defun message-make-message-id ()
"Make a unique Message-ID."
(concat "<" (message-unique-id)
(defun message-make-in-reply-to ()
"Return the In-Reply-To header for this message."
(when message-reply-headers
- (let ((from (mail-header-from message-reply-headers))
+ (let ((mid (mail-header-message-id message-reply-headers))
+ (from (mail-header-from message-reply-headers))
(date (mail-header-date message-reply-headers)))
- (when from
- (let ((stop-pos
- (string-match " *at \\| *@ \\| *(\\| *<" from)))
- (concat (if (and stop-pos
- (not (zerop stop-pos)))
- (substring from 0 stop-pos) from)
- "'s message of \""
- (if (or (not date) (string= date ""))
- "(unknown date)" date)
- "\""))))))
+ (when mid
+ (concat mid
+ (when from
+ (let ((stop-pos
+ (string-match " *at \\| *@ \\| *(\\| *<" from)))
+ (concat "\n ("
+ (if stop-pos (substring from 0 stop-pos) from)
+ "'s message of "
+ (if (or (not date) (string= date ""))
+ "(unknown date)" date)
+ ")"))))))))
(defun message-make-distribution ()
"Make a Distribution header."
"Return the pertinent part of `user-mail-address'."
(when user-mail-address
(if (string-match " " user-mail-address)
- (nth 1 (mail-extract-address-components user-mail-address))
+ (nth 1 (funcall gnus-extract-address-components user-mail-address))
user-mail-address)))
(defun message-make-fqdn ()
(To nil)
(Distribution (message-make-distribution))
(Lines (message-make-lines))
- (X-Newsreader message-newsreader)
- (X-Mailer (and (not (message-fetch-field "X-Newsreader"))
- message-mailer))
+ (User-Agent message-user-agent)
(Expires (message-make-expires))
(case-fold-search t)
header value elem)
(not (message-check-element 'sender))
(not (string=
(downcase
- (cadr (mail-extract-address-components from)))
+ (cadr (funcall gnus-extract-address-components
+ from)))
(downcase secure-sender)))
(or (null sender)
(not
(string=
(downcase
- (cadr (mail-extract-address-components sender)))
+ (cadr (funcall gnus-extract-address-components
+ sender)))
(downcase secure-sender)))))
(goto-char (point-min))
;; Rename any old Sender headers to Original-Sender.
(if (or (= (following-char) ?,)
(eobp))
(when (not quoted)
- (if (and (> (current-column) 78)
- last)
- (progn
- (save-excursion
- (goto-char last)
- (insert "\n\t"))
- (setq last (1+ (point))))
- (setq last (1+ (point)))))
+ (if last
+ (save-excursion
+ (goto-char last)
+ (looking-at "[ \t]*")
+ (replace-match "\n " t t)))
+ (setq last (1+ (point))))
(setq quoted (not quoted)))
(unless (eobp)
(forward-char 1))))
(widen)
(forward-line 1)))
-(defun message-fill-references (header value)
- (insert (capitalize (symbol-name header))
- ": "
- (std11-fill-msg-id-list-string
- (if (consp value) (car value) value))
- "\n"))
-
(defun message-fill-header (header value)
(let ((begin (point))
- (fill-column 990)
- (fill-prefix "\t"))
+ (fill-column 78)
+ (fill-prefix " "))
(insert (capitalize (symbol-name header))
": "
(if (consp value) (car value) value)
(concat "*" type
(if to
(concat " to "
- (or (car (mail-extract-address-components to))
+ (or (car (funcall gnus-extract-address-components to))
to) "")
"")
(if (and group (not (string= group ""))) (concat " on " group) "")
(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 ((buffer (get-buffer name))
+ (cur (current-buffer)))
(if (and buffer
(buffer-name buffer))
(progn
(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)))
(defun message-do-send-housekeeping ()
"Kill old message buffers."
"Start editing a reply to the article in the current buffer."
(interactive)
(let ((cur (current-buffer))
- from subject date reply-to to cc
- references message-id follow-to
(inhibit-point-motion-hooks t)
- mct never-mct gnus-warning)
+ from date subject mct mft mrt
+ never-mct to cc
+ references message-id follow-to gnus-warning)
(save-restriction
(message-narrow-to-head)
;; Allow customizations to have their say.
(funcall message-wide-reply-to-function)))))
;; Find all relevant headers we need.
(setq from (message-fetch-field "from")
- date (message-fetch-field "date")
+ date (message-fetch-field "date" t)
subject (or (message-fetch-field "subject") "none")
+ references (message-fetch-field "references")
+ message-id (message-fetch-field "message-id" t)
to (message-fetch-field "to")
cc (message-fetch-field "cc")
- mct (message-fetch-field "mail-copies-to")
- reply-to (message-fetch-field "reply-to")
- references (message-fetch-field "references")
- message-id (message-fetch-field "message-id" t))
+ mct (when (and wide message-use-mail-copies-to)
+ (message-fetch-field "mail-copies-to"))
+ mft (when (and wide message-use-mail-followup-to)
+ (message-fetch-field "mail-followup-to"))
+ mrt (when message-use-mail-reply-to
+ (or (message-fetch-field "mail-reply-to")
+ (message-fetch-field "reply-to")))
+ gnus-warning (message-fetch-field "gnus-warning"))
+ (when (and gnus-warning (string-match "<[^>]+>" gnus-warning))
+ (setq message-id (match-string 0 gnus-warning)))
;; Remove any (buggy) Re:'s that are present and make a
;; proper one.
- (when (string-match message-subject-re-regexp subject)
- (setq subject (substring subject (match-end 0))))
- (setq subject (concat "Re: " subject))
-
- (when (and (setq gnus-warning (message-fetch-field "gnus-warning"))
- (string-match "<[^>]+>" gnus-warning))
- (setq message-id (match-string 0 gnus-warning)))
-
- ;; Handle special values of Mail-Copies-To.
- (when mct
- (cond ((equal (downcase mct) "never")
- (setq never-mct t)
- (setq mct nil))
- ((equal (downcase mct) "always")
- (setq mct (or reply-to from)))))
-
- (unless follow-to
- (if (or (not wide)
- to-address)
- (progn
- (setq follow-to (list (cons 'To (or to-address reply-to from))))
- (when (and wide mct)
- (push (cons 'Cc mct) follow-to)))
- (let (ccalist)
- (save-excursion
- (message-set-work-buffer)
- (unless never-mct
- (insert (or reply-to from "")))
- (insert (if to (concat (if (bolp) "" ", ") to "") ""))
- (insert (if mct (concat (if (bolp) "" ", ") mct) ""))
- (insert (if cc (concat (if (bolp) "" ", ") cc) ""))
- (goto-char (point-min))
- (while (re-search-forward "[ \t]+" nil t)
- (replace-match " " t t))
- ;; Remove addresses that match `rmail-dont-reply-to-names'.
- (insert (prog1 (rmail-dont-reply-to (buffer-string))
- (erase-buffer)))
- (goto-char (point-min))
- ;; Perhaps Mail-Copies-To: never removed the only address?
- (when (eobp)
- (insert (or reply-to from "")))
- (setq ccalist
- (mapcar
- (lambda (addr)
- (cons (mail-strip-quoted-names addr) addr))
- (message-tokenize-header (buffer-string))))
- (let ((s ccalist))
- (while s
- (setq ccalist (delq (assoc (car (pop s)) s) ccalist)))))
- (setq follow-to (list (cons 'To (cdr (pop ccalist)))))
- (when ccalist
- (let ((ccs (cons 'Cc (mapconcat
- (lambda (addr) (cdr addr)) ccalist ", "))))
- (when (string-match "^ +" (cdr ccs))
- (setcdr ccs (substring (cdr ccs) (match-end 0))))
- (push ccs follow-to))))))
+ (setq subject (message-make-followup-subject subject))
(widen))
+ ;; Handle special values of Mail-Copies-To.
+ (when mct
+ (cond
+ ((and (equal (downcase mct) "never")
+ (or (not (eq message-use-mail-copies-to 'ask))
+ (message-y-or-n-p
+ (concat "Obey Mail-Copies-To: never? ") t "\
+You should normally obey the Mail-Copies-To: header.
+
+ `Mail-Copies-To: never'
+directs you not to send your response to the author.")))
+ (setq never-mct t)
+ (setq mct nil))
+ ((and (equal (downcase mct) "always")
+ (or (not (eq message-use-mail-copies-to 'ask))
+ (message-y-or-n-p
+ (concat "Obey Mail-Copies-To: always? ") t "\
+You should normally obey the Mail-Copies-To: header.
+
+ `Mail-Copies-To: always'
+sends a copy of your response to the author.")))
+ (setq mct (or mrt from)))
+ ((and (eq message-use-mail-copies-to 'ask)
+ (not
+ (message-y-or-n-p
+ (concat "Obey Mail-Copies-To: " mct " ? ") t "\
+You should normally obey the Mail-Copies-To: header.
+
+ `Mail-Copies-To: " mct "'
+sends a copy of your response to " (if (string-match "," mct)
+ "the specified addresses"
+ "that address") ".")))
+ (setq mct nil))
+ ))
+
+ (unless follow-to
+ (cond
+ (to-address (setq follow-to (list (cons 'To to-address))))
+ ((not wide) (setq follow-to (list (cons 'To (or mrt from)))))
+ ;; Handle Mail-Followup-To.
+ ((and mft
+ (or (not (eq message-use-mail-followup-to 'ask))
+ (message-y-or-n-p
+ (concat "Obey Mail-Followup-To: " mft "? ") t "\
+You should normally obey the Mail-Followup-To: header.
+
+ `Mail-Followup-To: " mft "'
+directs your response to " (if (string-match "," mft)
+ "the specified addresses"
+ "that address only") ".
+
+A typical situation where Mail-Followup-To is used is when the author thinks
+that further discussion should take place only in "
+ (if (string-match "," mft)
+ "the specified mailing lists"
+ "that mailing list") ".")))
+ (setq follow-to (list (cons 'To mft)))
+ (when mct
+ (push (cons 'Cc mct) follow-to)))
+ (t
+ (let (ccalist)
+ (save-excursion
+ (message-set-work-buffer)
+ (unless never-mct
+ (insert (or mrt from "")))
+ (insert (if to (concat (if (bolp) "" ", ") to "") ""))
+ (insert (if mct (concat (if (bolp) "" ", ") mct) ""))
+ (insert (if cc (concat (if (bolp) "" ", ") cc) ""))
+ (goto-char (point-min))
+ (while (re-search-forward "[ \t]+" nil t)
+ (replace-match " " t t))
+ ;; Remove addresses that match `rmail-dont-reply-to-names'.
+ (insert (prog1 (rmail-dont-reply-to (buffer-string))
+ (erase-buffer)))
+ (goto-char (point-min))
+ ;; Perhaps Mail-Copies-To: never removed the only address?
+ (when (eobp)
+ (insert (or mrt from "")))
+ (setq ccalist
+ (mapcar
+ (lambda (addr)
+ (cons (mail-strip-quoted-names addr) addr))
+ (message-tokenize-header (buffer-string))))
+ (let ((s ccalist))
+ (while s
+ (setq ccalist (delq (assoc (car (pop s)) s) ccalist)))))
+ (setq follow-to (list (cons 'To (cdr (pop ccalist)))))
+ (when ccalist
+ (let ((ccs (cons 'Cc (mapconcat
+ (lambda (addr) (cdr addr)) ccalist ", "))))
+ (when (string-match "^ +" (cdr ccs))
+ (setcdr ccs (substring (cdr ccs) (match-end 0))))
+ (push ccs follow-to)))))))
+
(message-pop-to-buffer (message-buffer-name
(if wide "wide reply" "reply") from
(if wide to-address nil)))
,@follow-to
,@(if (or references message-id)
`((References . ,(concat (or references "") (and references " ")
- (or message-id ""))))
- nil))
+ (or message-id ""))))))
cur)))
;;;###autoload
;;;###autoload
(defun message-followup (&optional to-newsgroups)
- "Follow up to the message in the current buffer.
-If TO-NEWSGROUPS, use that as the new Newsgroups line."
+ "Follow up to the message in the current buffer."
(interactive)
(let ((cur (current-buffer))
- from subject date reply-to mct
- references message-id follow-to
(inhibit-point-motion-hooks t)
+ from date subject mct mft mrt
(message-this-is-news t)
- followup-to distribution newsgroups gnus-warning posted-to)
+ followup-to distribution newsgroups posted-to
+ references message-id follow-to gnus-warning)
(save-restriction
- (narrow-to-region
- (goto-char (point-min))
- (if (search-forward "\n\n" nil t)
- (1- (point))
- (point-max)))
+ (message-narrow-to-head)
+ ;; Allow customizations to have their say.
+ ;; This is a followup.
(when (message-functionp message-followup-to-function)
(setq follow-to
(funcall message-followup-to-function)))
+ ;; Find all relevant headers we need.
(setq from (message-fetch-field "from")
- date (message-fetch-field "date")
+ date (message-fetch-field "date" t)
subject (or (message-fetch-field "subject") "none")
references (message-fetch-field "references")
message-id (message-fetch-field "message-id" t)
- followup-to (message-fetch-field "followup-to")
+ followup-to (when message-use-followup-to
+ (message-fetch-field "followup-to"))
+ distribution (message-fetch-field "distribution")
newsgroups (message-fetch-field "newsgroups")
posted-to (message-fetch-field "posted-to")
- reply-to (message-fetch-field "reply-to")
- distribution (message-fetch-field "distribution")
- mct (message-fetch-field "mail-copies-to"))
- (when (and (setq gnus-warning (message-fetch-field "gnus-warning"))
- (string-match "<[^>]+>" gnus-warning))
+ mct (when message-use-mail-copies-to
+ (message-fetch-field "mail-copies-to"))
+ mft (when message-use-mail-followup-to
+ (message-fetch-field "mail-followup-to"))
+ mrt (when message-use-mail-reply-to
+ (or (message-fetch-field "mail-reply-to")
+ (message-fetch-field "reply-to")))
+ gnus-warning (message-fetch-field "gnus-warning"))
+ (when (and gnus-warning (string-match "<[^>]+>" gnus-warning))
(setq message-id (match-string 0 gnus-warning)))
;; Remove bogus distribution.
(when (and (stringp distribution)
(setq distribution nil))
;; Remove any (buggy) Re:'s that are present and make a
;; proper one.
- (when (string-match message-subject-re-regexp subject)
- (setq subject (substring subject (match-end 0))))
- (setq subject (concat "Re: " subject))
+ (setq subject (message-make-followup-subject subject))
(widen))
- (message-pop-to-buffer (message-buffer-name "followup" from newsgroups))
-
- (message-setup
- `((Subject . ,subject)
- ,@(cond
- (to-newsgroups
- (list (cons 'Newsgroups to-newsgroups)))
- (follow-to follow-to)
- ((and followup-to message-use-followup-to)
- (list
- (cond
- ((equal (downcase followup-to) "poster")
- (if (or (eq message-use-followup-to 'use)
- (message-y-or-n-p "Obey Followup-To: poster? " t "\
+ ;; Handle special values of Mail-Copies-To.
+ (when mct
+ (cond
+ ((and (equal (downcase mct) "never")
+ (or (not (eq message-use-mail-copies-to 'ask))
+ (message-y-or-n-p
+ (concat "Obey Mail-Copies-To: never? ") t "\
+You should normally obey the Mail-Copies-To: header.
+
+ `Mail-Copies-To: never'
+directs you not to send your response to the author.")))
+ (setq mct nil))
+ ((and (equal (downcase mct) "always")
+ (or (not (eq message-use-mail-copies-to 'ask))
+ (message-y-or-n-p
+ (concat "Obey Mail-Copies-To: always? ") t "\
+You should normally obey the Mail-Copies-To: header.
+
+ `Mail-Copies-To: always'
+sends a copy of your response to the author.")))
+ (setq mct (or mrt from)))
+ ((and (eq message-use-mail-copies-to 'ask)
+ (not
+ (message-y-or-n-p
+ (concat "Obey Mail-Copies-To: " mct " ? ") t "\
+You should normally obey the Mail-Copies-To: header.
+
+ `Mail-Copies-To: " mct "'
+sends a copy of your response to " (if (string-match "," mct)
+ "the specified addresses"
+ "that address") ".")))
+ (setq mct nil))
+ ))
+
+ (unless follow-to
+ (cond
+ (to-newsgroups (setq follow-to (list (cons 'Newsgroups to-newsgroups))))
+ ;; Handle Followup-To.
+ (followup-to
+ (cond
+ ((equal (downcase followup-to) "poster")
+ (if (or (eq message-use-followup-to 'use)
+ (message-y-or-n-p "Obey Followup-To: poster? " t "\
You should normally obey the Followup-To: header.
-`Followup-To: poster' sends your response via e-mail instead of news.
+ `Followup-To: poster'
+sends your response via e-mail instead of news.
-A typical situation where `Followup-To: poster' is used is when the poster
+A typical situation where `Followup-To: poster' is used is when the author
does not read the newsgroup, so he wouldn't see any replies sent to it."))
- (progn
- (setq message-this-is-news nil)
- (cons 'To (or reply-to from "")))
- (cons 'Newsgroups newsgroups)))
- (t
- (if (or (equal followup-to newsgroups)
- (not (eq message-use-followup-to 'ask))
- (message-y-or-n-p
- (concat "Obey Followup-To: " followup-to "? ") t "\
+ (setq message-this-is-news nil
+ distribution nil
+ follow-to (list (cons 'To (or mrt from ""))))
+ (setq follow-to (list (cons 'Newsgroups newsgroups)))))
+ (t
+ (if (or (equal followup-to newsgroups)
+ (not (eq message-use-followup-to 'ask))
+ (message-y-or-n-p
+ (concat "Obey Followup-To: " followup-to "? ") t "\
You should normally obey the Followup-To: header.
`Followup-To: " followup-to "'
Also, some source/announcement newsgroups are not indented for discussion;
responses here are directed to other newsgroups."))
- (cons 'Newsgroups followup-to)
- (cons 'Newsgroups newsgroups))))))
- (posted-to
- `((Newsgroups . ,posted-to)))
- (t
- `((Newsgroups . ,newsgroups))))
- ,@(and distribution (list (cons 'Distribution distribution)))
- ,@(if (or references message-id)
- `((References . ,(concat (or references "") (and references " ")
- (or message-id "")))))
- ,@(when (and mct
- (not (equal (downcase mct) "never")))
- (list (cons 'Cc (if (equal (downcase mct) "always")
- (or reply-to from "")
- mct)))))
+ (setq follow-to (list (cons 'Newsgroups followup-to)))
+ (setq follow-to (list (cons 'Newsgroups newsgroups)))))))
+ ;; Handle Mail-Followup-To, followup via e-mail.
+ ((and mft
+ (or (not (eq message-use-mail-followup-to 'ask))
+ (message-y-or-n-p
+ (concat "Obey Mail-Followup-To: " mft "? ") t "\
+You should normally obey the Mail-Followup-To: header.
+
+ `Mail-Followup-To: " mft "'
+directs your response to " (if (string-match "," mft)
+ "the specified addresses"
+ "that address only") " instead of news.
+
+A typical situation where Mail-Followup-To is used is when the author thinks
+that further discussion should take place only in "
+ (if (string-match "," mft)
+ "the specified mailing lists"
+ "that mailing list") ".")))
+ (setq message-this-is-news nil
+ distribution nil
+ follow-to (list (cons 'To mft))))
+ (posted-to (setq follow-to (list (cons 'Newsgroups posted-to))))
+ (t
+ (setq follow-to (list (cons 'Newsgroups newsgroups))))))
- cur)
+ (message-pop-to-buffer (message-buffer-name "followup" from newsgroups))
(setq message-reply-headers
- (vector 0 subject from date message-id references 0 0 ""))))
+ (vector 0 subject from date message-id references 0 0 ""))
+ (message-setup
+ `((Subject . ,subject)
+ ,@follow-to
+ ,@(and mct (list (cons 'Cc mct)))
+ ,@(and distribution (list (cons 'Distribution distribution)))
+ ,@(if (or references message-id)
+ `((References . ,(concat (or references "") (and references " ")
+ (or message-id ""))))))
+ cur)))
;;;###autoload
(defun message-cancel-news ()
(downcase sender)
(downcase (message-make-sender))))
(string-equal
- (downcase (cadr (mail-extract-address-components from)))
- (downcase (cadr (mail-extract-address-components
- (message-make-from))))))
+ (downcase (cadr (funcall gnus-extract-address-components
+ from)))
+ (downcase (cadr (funcall gnus-extract-address-components
+ (message-make-from))))))
(error "This article is not yours"))
;; Make control message.
(setq buf (set-buffer (get-buffer-create " *message cancel*")))
;; 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")))))
+ (cadr (funcall gnus-extract-address-components
+ (message-fetch-field "from")))))
(downcase (message-make-sender)))
(error "This article is not yours"))
;; Get a normal message buffer.
(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"
(defvar nnmail-internal-password nil)
+(defvar nnmail-split-tracing nil)
+(defvar nnmail-split-trace nil)
+
\f
(defconst nnmail-version "nnmail 1.0"
(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)
;; 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
(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-current-to-buffer-list)
+ (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
(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))
(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)))
(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"
(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)
(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."
(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 startx 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."
"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"))
force)
(nntp-send-command
"^3.*\r?\n" "AUTHINFO USER"
- (or user (read-string (format "NNTP (%s) user name: " nntp-address))))
+ (or user
+ nntp-authinfo-user
+ (setq nntp-authinfo-user
+ (read-string (format "NNTP (%s) user name: " nntp-address)))))
(nntp-send-command
"^2.*\r?\n" "AUTHINFO PASS"
(or passwd
;; Yasuo Okabe
;; Author: Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
;; Yasuo OKABE <okabe@kuis.kyoto-u.ac.jp>
-;; Version: 0.21
+;; Version: 1.00
;; Keywords: mail , gnus , pop3
;;
;; SPECIAL THANKS
;; "On the road" ; 0.12
;; "Rock'n Roll city" ; 0.13
;; "Money" ; 0.20
- "Still 19" ; 0.21
-;; "J boy" ; 0.xx
+;; "Still 19" ; 0.21
+ "J boy" ; 1.00
;; "Blood line" ; 0.xx
;; "Star ring" ; 0.xx
;; "Goodbye Game" ; 0.xx
;;; Code:
+(require 'mail-utils) ; pick up mail-strip-quoted-names
+
(defgroup smtp nil
"SMTP protocol for sending mail."
:group 'mail)
:type '(choice (const nil) string)
:group 'smtp)
-(defcustom smtp-server
- (or (getenv "SMTPSERVER") smtp-default-server)
+(defcustom smtp-server (or (getenv "SMTPSERVER") smtp-default-server)
"*The name of the host running SMTP server."
:type '(choice (const nil) string)
:group 'smtp)
-(defcustom smtp-service 25
- "*SMTP service port number. smtp or 25 ."
- :type 'integer
+(defcustom smtp-service "smtp"
+ "*SMTP service port number. \"smtp\" or 25."
+ :type '(choice (integer :tag "25" 25)
+ (string :tag "smtp" "smtp"))
+ :group 'smtp)
+
+(defcustom smtp-use-8bitmime t
+ "*If non-nil, use ESMTP 8BITMIME if available."
+ :type 'boolean
:group 'smtp)
(defcustom smtp-local-domain nil
:type '(choice (const nil) string)
:group 'smtp)
-(defcustom smtp-debug-info nil
- "*smtp debug info printout. messages and process buffer."
- :type 'boolean
- :group 'smtp)
-
(defcustom smtp-coding-system 'binary
"*Coding-system for SMTP output."
:type 'coding-system
:group 'smtp)
-
-(defun smtp-fqdn ()
- (if smtp-local-domain
- (concat (system-name) "." smtp-local-domain)
- (system-name)))
-
-(defun smtp-via-smtp (recipient smtp-text-buffer)
- (let ((process nil)
- (host smtp-server)
- (port smtp-service)
- response-code
- greeting
- process-buffer
- (supported-extensions '())
- (coding-system-for-read smtp-coding-system)
- (coding-system-for-write smtp-coding-system))
- (unwind-protect
- (catch 'done
- ;; get or create the trace buffer
- (setq process-buffer
- (get-buffer-create
- (format "*trace of SMTP session to %s*" host)))
-
- ;; clear the trace buffer of old output
- (save-excursion
- (set-buffer process-buffer)
- (erase-buffer))
-
- ;; open the connection to the server
- (setq process (open-network-stream "SMTP" process-buffer host port))
- (and (null process) (throw 'done nil))
-
- ;; set the send-filter
- (set-process-filter process 'smtp-process-filter)
-
- (save-excursion
- (set-buffer process-buffer)
- (make-local-variable 'smtp-read-point)
- (setq smtp-read-point (point-min))
-
- (if (or (null (car (setq greeting (smtp-read-response process))))
- (not (integerp (car greeting)))
- (>= (car greeting) 400))
- (throw 'done nil)
- )
+(defvar smtp-debug-info nil)
+(defvar smtp-read-point nil)
+
+(defun smtp-make-fqdn ()
+ "Return user's fully qualified domain name."
+ (let ((system-name (system-name)))
+ (cond
+ (smtp-local-domain
+ (concat system-name "." smtp-local-domain))
+ ((string-match "[^.]\\.[^.]" system-name)
+ system-name)
+ (t
+ (error "Cannot generate valid FQDN. Set `smtp-local-domain' correctly.")))))
+
+(defun smtp-via-smtp (sender recipients smtp-text-buffer)
+ (let ((coding-system-for-read smtp-coding-system)
+ (coding-system-for-write smtp-coding-system)
+ process response extensions)
+ (save-excursion
+ (set-buffer
+ (get-buffer-create
+ (format "*trace of SMTP session to %s*" smtp-server)))
+ (erase-buffer)
+ (make-local-variable 'smtp-read-point)
+ (setq smtp-read-point (point-min))
+
+ (unwind-protect
+ (catch 'done
+ (setq process (open-network-stream "SMTP"
+ (current-buffer)
+ smtp-server smtp-service))
+ (or process (throw 'done nil))
+
+ (set-process-filter process 'smtp-process-filter)
+
+ ;; Greeting
+ (setq response (smtp-read-response process))
+ (if (or (null (car response))
+ (not (integerp (car response)))
+ (>= (car response) 400))
+ (throw 'done (car (cdr response))))
;; EHLO
- (smtp-send-command process (format "EHLO %s" (smtp-fqdn)))
-
- (if (or (null (car (setq response-code (smtp-read-response process))))
- (not (integerp (car response-code)))
- (>= (car response-code) 400))
+ (smtp-send-command process
+ (format "EHLO %s" (smtp-make-fqdn)))
+ (setq response (smtp-read-response process))
+ (if (or (null (car response))
+ (not (integerp (car response)))
+ (>= (car response) 400))
(progn
;; HELO
- (smtp-send-command process (format "HELO %s" (smtp-fqdn)))
-
- (if (or (null (car (setq response-code (smtp-read-response process))))
- (not (integerp (car response-code)))
- (>= (car response-code) 400))
- (throw 'done nil)))
- (let ((extension-lines (cdr (cdr response-code))))
+ (smtp-send-command process
+ (format "HELO %s" (smtp-make-fqdn)))
+ (setq response (smtp-read-response process))
+ (if (or (null (car response))
+ (not (integerp (car response)))
+ (>= (car response) 400))
+ (throw 'done (car (cdr response)))))
+ (let ((extension-lines (cdr (cdr response))))
(while extension-lines
- (let ((name (intern (downcase (substring (car extension-lines) 4)))))
- (and name
- (cond ((memq name '(verb xvrb 8bitmime onex xone
- expn size dsn etrn
- help xusr))
- (setq supported-extensions
- (cons name supported-extensions)))
- (t (message "unknown extension %s"
- name)))))
+ (push (intern (downcase (substring (car extension-lines) 4)))
+ extensions)
(setq extension-lines (cdr extension-lines)))))
- (if (or (member 'onex supported-extensions)
- (member 'xone supported-extensions))
+ ;; ONEX --- One message transaction only (sendmail extension?)
+ (if (or (memq 'onex extensions)
+ (memq 'xone extensions))
(progn
- (smtp-send-command process (format "ONEX"))
- (if (or (null (car (setq response-code (smtp-read-response process))))
- (not (integerp (car response-code)))
- (>= (car response-code) 400))
- (throw 'done nil))))
-
+ (smtp-send-command process "ONEX")
+ (setq response (smtp-read-response process))
+ (if (or (null (car response))
+ (not (integerp (car response)))
+ (>= (car response) 400))
+ (throw 'done (car (cdr response))))))
+
+ ;; VERB --- Verbose (sendmail extension?)
(if (and smtp-debug-info
- (or (member 'verb supported-extensions)
- (member 'xvrb supported-extensions)))
+ (or (memq 'verb extensions)
+ (memq 'xvrb extensions)))
(progn
- (smtp-send-command process (format "VERB"))
- (if (or (null (car (setq response-code (smtp-read-response process))))
- (not (integerp (car response-code)))
- (>= (car response-code) 400))
- (throw 'done nil))))
-
- (if (member 'xusr supported-extensions)
+ (smtp-send-command process "VERB")
+ (setq response (smtp-read-response process))
+ (if (or (null (car response))
+ (not (integerp (car response)))
+ (>= (car response) 400))
+ (throw 'done (car (cdr response))))))
+
+ ;; XUSR --- Initial (user) submission (sendmail extension?)
+ (if (memq 'xusr extensions)
(progn
- (smtp-send-command process (format "XUSR"))
- (if (or (null (car (setq response-code (smtp-read-response process))))
- (not (integerp (car response-code)))
- (>= (car response-code) 400))
- (throw 'done nil))))
-
- ;; MAIL FROM: <sender>
- (let ((size-part
- (if (member 'size supported-extensions)
- (format " SIZE=%d"
- (save-excursion
- (set-buffer smtp-text-buffer)
- ;; size estimate:
- (+ (- (point-max) (point-min))
- ;; Add one byte for each change-of-line
- ;; because or CR-LF representation:
- (count-lines (point-min) (point-max))
- ;; For some reason, an empty line is
- ;; added to the message. Maybe this
- ;; is a bug, but it can't hurt to add
- ;; those two bytes anyway:
- 2)))
- ""))
- (body-part
- (if (member '8bitmime supported-extensions)
- ;; FIXME:
- ;; Code should be added here that transforms
- ;; the contents of the message buffer into
- ;; something the receiving SMTP can handle.
- ;; For a receiver that supports 8BITMIME, this
- ;; may mean converting BINARY to BASE64, or
- ;; adding Content-Transfer-Encoding and the
- ;; other MIME headers. The code should also
- ;; return an indication of what encoding the
- ;; message buffer is now, i.e. ASCII or
- ;; 8BITMIME.
- (if nil
- " BODY=8BITMIME"
- "")
- "")))
-; (smtp-send-command process (format "MAIL FROM:%s@%s" (user-login-name) (smtp-fqdn)))
- (smtp-send-command process (format "MAIL FROM: <%s>%s%s"
- user-mail-address
- size-part
- body-part))
-
- (if (or (null (car (setq response-code (smtp-read-response process))))
- (not (integerp (car response-code)))
- (>= (car response-code) 400))
- (throw 'done nil)
- ))
-
- ;; RCPT TO: <recipient>
- (let ((n 0))
- (while (not (null (nth n recipient)))
- (smtp-send-command process (format "RCPT TO: <%s>" (nth n recipient)))
- (setq n (1+ n))
-
- (setq response-code (smtp-read-response process))
- (if (or (null (car response-code))
- (not (integerp (car response-code)))
- (>= (car response-code) 400))
- (throw 'done nil)
- )
- ))
-
+ (smtp-send-command process "XUSR")
+ (setq response (smtp-read-response process))
+ (if (or (null (car response))
+ (not (integerp (car response)))
+ (>= (car response) 400))
+ (throw 'done (car (cdr response))))))
+
+ ;; MAIL FROM:<sender>
+ (smtp-send-command
+ process
+ (format "MAIL FROM:<%s>%s%s"
+ sender
+ ;; SIZE --- Message Size Declaration (RFC1870)
+ (if (memq 'size extensions)
+ (format " SIZE=%d"
+ (save-excursion
+ (set-buffer smtp-text-buffer)
+ (+ (- (point-max) (point-min))
+ ;; Add one byte for each change-of-line
+ ;; because or CR-LF representation:
+ (count-lines (point-min) (point-max))
+ ;; For some reason, an empty line is
+ ;; added to the message. Maybe this
+ ;; is a bug, but it can't hurt to add
+ ;; those two bytes anyway:
+ 2)))
+ "")
+ ;; 8BITMIME --- 8bit-MIMEtransport (RFC1652)
+ (if (and (memq '8bitmime extensions)
+ smtp-use-8bitmime)
+ " BODY=8BITMIME"
+ "")))
+ (setq response (smtp-read-response process))
+ (if (or (null (car response))
+ (not (integerp (car response)))
+ (>= (car response) 400))
+ (throw 'done (car (cdr response))))
+
+ ;; RCPT TO:<recipient>
+ (while recipients
+ (smtp-send-command process
+ (format "RCPT TO:<%s>" (car recipients)))
+ (setq recipients (cdr recipients))
+ (setq response (smtp-read-response process))
+ (if (or (null (car response))
+ (not (integerp (car response)))
+ (>= (car response) 400))
+ (throw 'done (car (cdr response)))))
+
;; DATA
(smtp-send-command process "DATA")
-
- (if (or (null (car (setq response-code (smtp-read-response process))))
- (not (integerp (car response-code)))
- (>= (car response-code) 400))
- (throw 'done nil)
- )
+ (setq response (smtp-read-response process))
+ (if (or (null (car response))
+ (not (integerp (car response)))
+ (>= (car response) 400))
+ (throw 'done (car (cdr response))))
;; Mail contents
(smtp-send-data process smtp-text-buffer)
- ;;DATA end "."
+ ;; DATA end "."
(smtp-send-command process ".")
-
- (if (or (null (car (setq response-code (smtp-read-response process))))
- (not (integerp (car response-code)))
- (>= (car response-code) 400))
- (throw 'done nil)
- )
-
- ;;QUIT
-; (smtp-send-command process "QUIT")
-; (and (null (car (smtp-read-response process)))
-; (throw 'done nil))
- t ))
- (if process
- (save-excursion
- (set-buffer (process-buffer process))
- (smtp-send-command process "QUIT")
- (smtp-read-response process)
-
-; (if (or (null (car (setq response-code (smtp-read-response process))))
-; (not (integerp (car response-code)))
-; (>= (car response-code) 400))
-; (throw 'done nil)
-; )
- (delete-process process))))))
+ (setq response (smtp-read-response process))
+ (if (or (null (car response))
+ (not (integerp (car response)))
+ (>= (car response) 400))
+ (throw 'done (car (cdr response))))
+
+ t)
+
+ (if (and process
+ (eq (process-status process) 'open))
+ (progn
+ ;; QUIT
+ (smtp-send-command process "QUIT")
+ (smtp-read-response process)
+ (delete-process process)))))))
(defun smtp-process-filter (process output)
(save-excursion
nil
(setq response-continue nil)
(setq return-value
- (cons (string-to-int
- (buffer-substring begin end))
+ (cons (string-to-int
+ (buffer-substring begin end))
(nreverse response-strings)))))
(if (looking-at "[0-9]+-")
(progn
(setq smtp-read-point match-end)
(setq response-continue nil)
- (setq return-value
- (cons nil (nreverse response-strings)))
- )
- )))
+ (setq return-value
+ (cons nil (nreverse response-strings)))))))
(setq smtp-read-point match-end)
return-value))
(defun smtp-send-command (process command)
(goto-char (point-max))
- (if (= (aref command 0) ?P)
- (insert "PASS <omitted>\r\n")
- (insert command "\r\n"))
+ (insert command "\r\n")
(setq smtp-read-point (point))
(process-send-string process command)
(process-send-string process "\r\n"))
(defun smtp-send-data-1 (process data)
(goto-char (point-max))
-
(if smtp-debug-info
(insert data "\r\n"))
-
(setq smtp-read-point (point))
- ;; Escape "." at start of a line
+ ;; Escape "." at start of a line.
(if (eq (string-to-char data) ?.)
(process-send-string process "."))
(process-send-string process data)
- (process-send-string process "\r\n")
- )
+ (process-send-string process "\r\n"))
(defun smtp-send-data (process buffer)
- (let
- ((data-continue t)
- (sending-data nil)
- this-line
- this-line-end)
+ (let ((data-continue t)
+ (sending-data nil)
+ this-line
+ this-line-end)
(save-excursion
(set-buffer buffer)
(if (/= (forward-line 1) 0)
(setq data-continue nil)))
- (smtp-send-data-1 process sending-data)
- )
- )
- )
+ (smtp-send-data-1 process sending-data))))
(defun smtp-deduce-address-list (smtp-text-buffer header-start header-end)
- "Get address list suitable for smtp RCPT TO: <address>."
- (require 'mail-utils) ;; pick up mail-strip-quoted-names
+ "Get address list suitable for smtp RCPT TO:<address>."
(let ((case-fold-search t)
(simple-address-list "")
this-line
;;
(set-buffer smtp-address-buffer)
(erase-buffer)
- (insert-buffer-substring smtp-text-buffer
- header-start header-end)
+ (insert (save-excursion
+ (set-buffer smtp-text-buffer)
+ (buffer-substring-no-properties header-start header-end)))
(goto-char (point-min))
;; RESENT-* fields should stop processing of regular fields.
(save-excursion
(if (re-search-forward "^RESENT-TO:" header-end t)
(setq addr-regexp
"^\\(RESENT-TO:\\|RESENT-CC:\\|RESENT-BCC:\\)")
- (setq addr-regexp "^\\(TO:\\|CC:\\|BCC:\\)")))
+ (setq addr-regexp "^\\(TO:\\|CC:\\|BCC:\\)")))
(while (re-search-forward addr-regexp header-end t)
(replace-match "")
(setq this-line (match-beginning 0))
(forward-line 1)
- ;; get any continuation lines
+ ;; get any continuation lines.
(while (and (looking-at "^[ \t]+") (< (point) header-end))
(forward-line 1))
(setq this-line-end (point-marker))
(setq simple-address-list
(concat simple-address-list " "
(mail-strip-quoted-names
- (buffer-substring this-line this-line-end))))
- )
+ (buffer-substring this-line this-line-end)))))
(erase-buffer)
(insert-string " ")
(insert-string simple-address-list)
;; comma --> blank
(subst-char-in-region (point-min) (point-max) ?, ? t)
;; tab --> blank
- (subst-char-in-region (point-min) (point-max) 9 ? t)
+ (subst-char-in-region (point-min) (point-max) 9 ? t)
(goto-char (point-min))
;; tidyness in case hook is not robust when it looks at this
(backward-char 1)
(setq recipient-address-list
(cons (buffer-substring (match-beginning 1) (match-end 1))
- recipient-address-list))
- )
- recipient-address-list)
- )
- (kill-buffer smtp-address-buffer))
- ))
-
-(defun smtp-do-bcc (header-end)
- "Delete BCC: and their continuation lines from the header area.
-There may be multiple BCC: lines, and each may have arbitrarily
-many continuation lines."
- (let ((case-fold-search t))
- (save-excursion
- (goto-char (point-min))
- ;; iterate over all BCC: lines
- (while (re-search-forward "^BCC:" header-end t)
- (delete-region (match-beginning 0) (progn (forward-line 1) (point)))
- ;; get rid of any continuation lines
- (while (and (looking-at "^[ \t].*\n") (< (point) header-end))
- (replace-match ""))
- )
- ) ;; save-excursion
- ) ;; let
- )
+ recipient-address-list)))
+ recipient-address-list))
+ (kill-buffer smtp-address-buffer))))
(provide 'smtp)
+++ /dev/null
-;;; smtpmail.el --- simple SMTP protocol (RFC 821) for sending mail
-
-;; Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-
-;; Author: Tomoji Kagatani <kagatani@rbc.ncl.omron.co.jp>
-;; Maintainer: Brian D. Carlstrom <bdc@ai.mit.edu>
-;; ESMTP support: Simon Leinen <simon@switch.ch>
-;; Keywords: mail
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; Send Mail to smtp host from smtpmail temp buffer.
-
-;; Please add these lines in your .emacs(_emacs).
-;;
-;;(setq send-mail-function 'smtpmail-send-it)
-;;(setq smtp-default-server "YOUR SMTP HOST")
-;;(setq smtp-service "smtp")
-;;(setq smtp-local-domain "YOUR DOMAIN NAME")
-;;(setq smtp-debug-info t)
-;;(autoload 'smtpmail-send-it "smtpmail")
-;;(setq user-full-name "YOUR NAME HERE")
-
-;; To queue mail, set smtpmail-queue-mail to t and use
-;; smtpmail-send-queued-mail to send.
-
-
-;;; Code:
-
-(require 'smtp)
-(require 'sendmail)
-(require 'time-stamp)
-
-;;;
-
-(defcustom smtpmail-queue-mail nil
- "*Specify if mail is queued (if t) or sent immediately (if nil).
-If queued, it is stored in the directory `smtpmail-queue-dir'
-and sent with `smtpmail-send-queued-mail'."
- :type 'boolean
- :group 'smtp)
-
-(defcustom smtpmail-queue-dir "~/Mail/queued-mail/"
- "*Directory where `smtpmail.el' stores queued mail."
- :type 'directory
- :group 'smtp)
-
-(defvar smtpmail-queue-index-file "index"
- "File name of queued mail index,
-This is relative to `smtpmail-queue-dir'.")
-
-(defvar smtpmail-queue-index (concat smtpmail-queue-dir
- smtpmail-queue-index-file))
-
-(defvar smtpmail-recipient-address-list nil)
-
-
-;;;
-;;;
-;;;
-
-(defun smtpmail-send-it ()
- (require 'mail-utils)
- (let ((errbuf (if mail-interactive
- (generate-new-buffer " smtpmail errors")
- 0))
- (tembuf (generate-new-buffer " smtpmail temp"))
- (case-fold-search nil)
- resend-to-addresses
- delimline
- (mailbuf (current-buffer)))
- (unwind-protect
- (save-excursion
- (set-buffer tembuf)
- (erase-buffer)
- (insert-buffer-substring mailbuf)
- (goto-char (point-max))
- ;; require one newline at the end.
- (or (= (preceding-char) ?\n)
- (insert ?\n))
- ;; Change header-delimiter to be what sendmail expects.
- (goto-char (point-min))
- (re-search-forward
- (concat "^" (regexp-quote mail-header-separator) "\n"))
- (replace-match "\n")
- (backward-char 1)
- (setq delimline (point-marker))
-;; (sendmail-synch-aliases)
- (if mail-aliases
- (expand-mail-aliases (point-min) delimline))
- (goto-char (point-min))
- ;; ignore any blank lines in the header
- (while (and (re-search-forward "\n\n\n*" delimline t)
- (< (point) delimline))
- (replace-match "\n"))
- (let ((case-fold-search t))
- (goto-char (point-min))
- (goto-char (point-min))
- (while (re-search-forward "^Resent-to:" delimline t)
- (setq resend-to-addresses
- (save-restriction
- (narrow-to-region (point)
- (save-excursion
- (end-of-line)
- (point)))
- (append (mail-parse-comma-list)
- resend-to-addresses))))
-;;; Apparently this causes a duplicate Sender.
-;;; ;; If the From is different than current user, insert Sender.
-;;; (goto-char (point-min))
-;;; (and (re-search-forward "^From:" delimline t)
-;;; (progn
-;;; (require 'mail-utils)
-;;; (not (string-equal
-;;; (mail-strip-quoted-names
-;;; (save-restriction
-;;; (narrow-to-region (point-min) delimline)
-;;; (mail-fetch-field "From")))
-;;; (user-login-name))))
-;;; (progn
-;;; (forward-line 1)
-;;; (insert "Sender: " (user-login-name) "\n")))
- ;; Don't send out a blank subject line
- (goto-char (point-min))
- (if (re-search-forward "^Subject:[ \t]*\n" delimline t)
- (replace-match ""))
- ;; Put the "From:" field in unless for some odd reason
- ;; they put one in themselves.
- (goto-char (point-min))
- (if (not (re-search-forward "^From:" delimline t))
- (let* ((login user-mail-address)
- (fullname (user-full-name)))
- (cond ((eq mail-from-style 'angles)
- (insert "From: " fullname)
- (let ((fullname-start (+ (point-min) 6))
- (fullname-end (point-marker)))
- (goto-char fullname-start)
- ;; Look for a character that cannot appear unquoted
- ;; according to RFC 822.
- (if (re-search-forward "[^- !#-'*+/-9=?A-Z^-~]"
- fullname-end 1)
- (progn
- ;; Quote fullname, escaping specials.
- (goto-char fullname-start)
- (insert "\"")
- (while (re-search-forward "[\"\\]"
- fullname-end 1)
- (replace-match "\\\\\\&" t))
- (insert "\""))))
- (insert " <" login ">\n"))
- ((eq mail-from-style 'parens)
- (insert "From: " login " (")
- (let ((fullname-start (point)))
- (insert fullname)
- (let ((fullname-end (point-marker)))
- (goto-char fullname-start)
- ;; RFC 822 says \ and nonmatching parentheses
- ;; must be escaped in comments.
- ;; Escape every instance of ()\ ...
- (while (re-search-forward "[()\\]" fullname-end 1)
- (replace-match "\\\\\\&" t))
- ;; ... then undo escaping of matching parentheses,
- ;; including matching nested parentheses.
- (goto-char fullname-start)
- (while (re-search-forward
- "\\(\\=\\|[^\\]\\(\\\\\\\\\\)*\\)\\\\(\\(\\([^\\]\\|\\\\\\\\\\)*\\)\\\\)"
- fullname-end 1)
- (replace-match "\\1(\\3)" t)
- (goto-char fullname-start))))
- (insert ")\n"))
- ((null mail-from-style)
- (insert "From: " login "\n")))))
- ;; Insert an extra newline if we need it to work around
- ;; Sun's bug that swallows newlines.
- (goto-char (1+ delimline))
- (if (eval mail-mailer-swallows-blank-line)
- (newline))
- ;; Find and handle any FCC fields.
- (goto-char (point-min))
- (if (re-search-forward "^FCC:" delimline t)
- (mail-do-fcc delimline))
- (if mail-interactive
- (save-excursion
- (set-buffer errbuf)
- (erase-buffer))))
- ;;
- ;;
- ;;
- (setq smtpmail-recipient-address-list
- (or resend-to-addresses
- (smtp-deduce-address-list tembuf (point-min) delimline)))
-
- (smtp-do-bcc delimline)
- ; Send or queue
- (if (not smtpmail-queue-mail)
- (if smtpmail-recipient-address-list
- (if (not (smtp-via-smtp
- smtpmail-recipient-address-list tembuf))
- (error "Sending failed; SMTP protocol error"))
- (error "Sending failed; no recipients"))
- (let* ((file-data (concat
- smtpmail-queue-dir
- (time-stamp-strftime
- "%02y%02m%02d-%02H%02M%02S")))
- (file-elisp (concat file-data ".el"))
- (buffer-data (create-file-buffer file-data))
- (buffer-elisp (create-file-buffer file-elisp))
- (buffer-scratch "*queue-mail*"))
- (save-excursion
- (set-buffer buffer-data)
- (erase-buffer)
- (insert-buffer tembuf)
- (write-file file-data)
- (set-buffer buffer-elisp)
- (erase-buffer)
- (insert (concat
- "(setq smtpmail-recipient-address-list '"
- (prin1-to-string smtpmail-recipient-address-list)
- ")\n"))
- (write-file file-elisp)
- (set-buffer (generate-new-buffer buffer-scratch))
- (insert (concat file-data "\n"))
- (append-to-file (point-min)
- (point-max)
- smtpmail-queue-index)
- )
- (kill-buffer buffer-scratch)
- (kill-buffer buffer-data)
- (kill-buffer buffer-elisp))))
- (kill-buffer tembuf)
- (if (bufferp errbuf)
- (kill-buffer errbuf)))))
-
-(defun smtpmail-send-queued-mail ()
- "Send mail that was queued as a result of setting `smtpmail-queue-mail'."
- (interactive)
- ;;; Get index, get first mail, send it, get second mail, etc...
- (let ((buffer-index (find-file-noselect smtpmail-queue-index))
- (file-msg "")
- (tembuf nil))
- (save-excursion
- (set-buffer buffer-index)
- (beginning-of-buffer)
- (while (not (eobp))
- (setq file-msg (buffer-substring (point) (save-excursion
- (end-of-line)
- (point))))
- (load file-msg)
- (setq tembuf (find-file-noselect file-msg))
- (if smtpmail-recipient-address-list
- (if (not (smtp-via-smtp smtpmail-recipient-address-list tembuf))
- (error "Sending failed; SMTP protocol error"))
- (error "Sending failed; no recipients"))
- (delete-file file-msg)
- (delete-file (concat file-msg ".el"))
- (kill-buffer tembuf)
- (kill-line 1))
- (set-buffer buffer-index)
- (save-buffer smtpmail-queue-index)
- (kill-buffer buffer-index)
- )))
-
-
-;;;
-
-(provide 'smtpmail)
-
-;;; smtpmail.el ends here
+Fri Jul 10 04:26:23 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (NNTP): Addition.
+
+Sat Jul 4 14:24:29 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (Gnus Utility Functions): Addition.
+
+Thu Jul 2 11:37:51 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (Posting Styles): Ununcommented.
+
+Wed Jul 1 17:57:54 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (Topic Commands): Addition.
+
+Tue Jun 30 16:11:27 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (Topic Commands): Addition.
+
Mon Jun 29 21:46:13 1998 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
* gnus.texi (Article Keymap): Typo.
\input texinfo @c -*-texinfo-*-
@setfilename gnus-ja
-@settitle Semi-gnus 6.7.7 Manual
+@settitle Semi-gnus 6.8.0 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Semi-gnus 6.7.7 Manual
+@title Semi-gnus 6.8.0 Manual
@author by Lars Magne Ingebrigtsen
@author by members of Semi-gnus mailing-list
\e$B$J8@8l7w$r:9JL$7$^$;$s!#$"$"!"%/%j%s%4%s$NJ}$O\e(B Unicode Next Generation\e$B$r\e(B
\e$B$*BT$A$/$@$5$$!#\e(B
-\e$B$3$N@bL@=q$O\e(B Semi-gnus 6.7.7 \e$B$KBP1~$7$^$9!#\e(B
+\e$B$3$N@bL@=q$O\e(B Semi-gnus 6.8.0 \e$B$KBP1~$7$^$9!#\e(B
@end ifinfo
\e$BMQ<T$N%[!<%`%G%#%l%/%H%j$G$9\e(B) \e$B$KF~$C$F$$$C$F%I%j%V%k%U%!%$%k$r:n$j$^$9!#\e(B
\e$B%I%j%V%k%U%!%$%k$O\e(B @code{.newsrc} \e$B$HF1$85v2DB0@-$rM?$($i$l$^$9!#\e(B
+@vindex gnus-always-read-dribble-file
+\e$B$b$7\e(B @code{gnus-always-read-dribble-file} \e$B$,\e(B @code{nil} \e$B$G$J$1$l$P!"\e(Bgnus
+\e$B$OMxMQ<T$K?R$M$k;vL5$/!"%I%j%V%k%U%!%$%k$r5/F0;~$KFI$_9~$_$^$9!#\e(B
+
+
@node The Active File
@section \e$B8=>u%U%!%$%k\e(B
@cindex group modeline
@vindex gnus-group-mode-line-format
-\e$B%b!<%I9T$O\e(B @code{gnus-group-mode-line-format} (@pxref{Formatting
-Variables}) \e$B$r@_Dj$9$k$3$H$GJQ99$G$-$^$9!#$3$$$D$O;XDjJ8;z$r$"$s\e(B
-\e$B$^$j$?$/$5$sCN$C$F$^$;$s!#\e(B
+\e$B%b!<%I9T$O\e(B @code{gnus-group-mode-line-format} (@pxref{Mode Line
+Formatting}) \e$B$r@_Dj$9$k$3$H$GJQ99$G$-$^$9!#$3$$$D$O;XDjJ8;z$r$"$s$^$j$?\e(B
+\e$B$/$5$sCN$C$F$^$;$s!#\e(B
@table @samp
@item S
\e$B$b$7\e(B @code{gnus-activate-foreign-newsgroups} \e$B$,@5$N?t$G$"$l$P!"\e(Bgnus \e$B$O5/\e(B
\e$BF0;~$K!"$3$N?t$+$=$l$h$j$b>.$5$$%l%Y%k$N30It%0%k!<%W$rA4$F%A%'%C%/$7$^$9!#\e(B
\e$B$3$l$OFC$K0c$C$?\e(B @sc{nntp} \e$B%5!<%P$+$i$?$/$5$s$N%0%k!<%W$r9XFI$7$F$$$k>l\e(B
-\e$B9g$J$I!"$7$P$i$/;~4V$,$+$+$k$+$b$7$l$^$;$s!#\e(B
+\e$B9g$J$I!"$7$P$i$/;~4V$,$+$+$k$+$b$7$l$^$;$s!#\e(B@pxref{Group Levels} \e$B$b;2>H\e(B
+\e$B$7$F2<$5$$!#\e(B@code{gnus-activate-level} \e$B$b30It%K%e!<%9%0%k!<%W$N3hF02=$K\e(B
+\e$B1F6A$r5Z$\$7$^$9!#\e(B
@node Group Parameters
@item T D
@kindex T D (Topic)
@findex gnus-topic-remove-group
-\e$B%0%k!<%W$r8=:_$N%H%T%C%/$+$i:o=|$7$^$9\e(B
-(@code{gnus-topic-remove-group})\e$B!#$3$N%3%^%s%I$O%W%m%;%9%^!<%/!&\e(B
-\e$B%W%l%U%#%C%/%9%k!<%k$K=>$$$^$9\e(B (@pxref{Process/Prefix})\e$B!#\e(B
+\e$B%0%k!<%W$r8=:_$N%H%T%C%/$+$i:o=|$7$^$9\e(B(@code{gnus-topic-remove-group})\e$B!#\e(B
+\e$B$3$NL?Na$O<g$K$$$/$D$+$N%H%T%C%/$KF1$8%0%k!<%W$,$"$C$F!"$=$l$r%H%T%C%/$N\e(B
+\e$B0l$D$+$i<h$j=|$-$?$$$H$-$KLrN)$A$^$9!#$3$N%3%^%s%I$O%W%m%;%9%^!<%/!&%W%l\e(B
+\e$B%U%#%C%/%9$K%k!<%k=>$$$^$9\e(B (@pxref{Process/Prefix})\e$B!#\e(B
@item T M
@kindex T M (Topic)
@vindex gnus-summary-zcore-fuzz
\e$B$3$l$O!"\e(Bzcore \e$B$G%G%#%U%)%k%H$N%l%Y%k$h$j$b>e$G$"$l$P\e(B @samp{+} \e$B$G!"%G%#%U%)\e(B
\e$B%k%H$N%l%Y%k$h$j$b2<$G$"$l$P\e(B @samp{-} \e$B$G$9!#\e(B
-@code{gnus-summary-default-zcore}\e$B$H$N:9$,\e(B@code{gnus-summary-zcore-fuzz}
+@code{gnus-summary-default-score} \e$B$H$N:9$,\e(B @code{gnus-summary-zcore-fuzz}
\e$B$h$j$b>.$5$$$H!"$3$N;EMM$O;H$o$l$^$;$s!#\e(B
@item V
\e$B%9%l%C%IA4BN$N%9%3%"!#\e(B
@subsection \e$B35N,%P%C%U%!$N%b!<%I9T\e(B
@vindex gnus-summary-mode-line-format
-\e$B35N,$N%b!<%I9T$NMM<0$bJQ99$9$k$3$H$,$G$-$^$9!#\e(B
-@code{gnus-summary-mode-line-format} \e$B$r2?$G$b9%$-$J$b$N$KJQ99$7$F$/$@$5\e(B
-\e$B$$!#%G%#%U%)%k%H$O\e(B @samp{Gnus: %%b [%A] %Z} \e$B$G$9!#\e(B
+\e$B35N,$N%b!<%I9T$NMM<0$bJQ99$9$k$3$H$,$G$-$^$9\e(B (@pxref{Mode Line
+Formatting})\e$B!#\e(B@code{gnus-summary-mode-line-format} \e$B$r2?$G$b9%$-$J$b$N$K\e(B
+\e$BJQ99$7$F$/$@$5$$!#%G%#%U%)%k%H$O\e(B @samp{Gnus: %%b [%A] %Z} \e$B$G$9!#\e(B
\e$B0J2<$,$"$J$?$,M7$V$3$H$N$G$-$k$=$l$>$l$NMWAG$G$9!'\e(B
\e$B@\F,8l$r<h$j=|$$$?L>A0!#\e(B
@item A
\e$B8=:_$N5-;vHV9f!#\e(B
+@item z
+\e$B8=:_$N5-;v%9%3%"!#\e(B
@item V
Gnus \e$B%P!<%8%g%s!#\e(B
@item U
@kindex W l \e$B!J35N,!K\e(B
@findex gnus-summary-stop-page-breaking
\e$B%Z!<%8$N6h@Z$j$r8=:_$N5-;v$+$i<h$j=|$-$^$9\e(B
-(@code{gnus-summary-stop-page-breaking})\e$B!#\e(B
+(@code{gnus-summary-stop-page-breaking})\e$B!#%Z!<%8$N6h@Z$j$KIU$$$F$O\e(B
+@xref{Misc Article} \e$B$r;2>H$7$F2<$5$$!#\e(B
@item W r
@kindex W r \e$B!J35N,!K\e(B
@item gnus-tree-mode-line-format
@vindex gnus-tree-mode-line-format
-\e$BLZ%b!<%I%P%C%U%!$G$N%b!<%I9T$N$?$a$N%U%)!<%^%C%HJ8;zNs$G$9!#%G%#%U%)%k%H\e(B
-\e$B$O\e(B @samp{Gnus: %%b %S %Z} \e$B$G$9!#;HMQ2DG=$J;XDj$O\e(B
-@pxref{Summary Buffer ModeLine} \e$B$r;2>H$7$F$/$@$5$$!#\e(B
+\e$BLZ%b!<%I%P%C%U%!$G$N%b!<%I9T$N$?$a$N%U%)!<%^%C%HJ8;zNs$G$9\e(B (@pxref{Mode
+Line Formatting})\e$B!#%G%#%U%)%k%H$O\e(B @samp{Gnus: %%b %S %Z} \e$B$G$9!#;HMQ2DG=\e(B
+\e$B$J;XDj$O\e(B @pxref{Summary Buffer ModeLine} \e$B$r;2>H$7$F$/$@$5$$!#\e(B
@item gnus-selected-tree-face
@vindex gnus-selected-tree-face
@item C-c ^
@kindex C-c ^ (Article)
@findex gnus-article-refer-article
-\e$B%+!<%=%k0LCV$,\e(B @code{Message-ID} \e$B$N6aJU$K$"$k$H$-$K\e(B @kbd{r} \e$B$r2!\e(B
+\e$B%+!<%=%k0LCV$,\e(B @code{Message-ID} \e$B$N6aJU$K$"$k$H$-$K\e(B @kbd{C-c ^} \e$B$r2!\e(B
\e$B$9$H!"\e(Bgnus \e$B$O%5!<%P!<$+$i$=$N5-;v$r<h$C$F$3$h$&$H$7$^$9\e(B
(@code{gnus-article-refer-article})\e$B!#\e(B
@vindex gnus-article-mode-line-format
@item gnus-article-mode-line-format
-\e$B$3$NJQ?t$O\e(B @code{gnus-summary-mode-line-format} \e$B$HF1$89T$K=>$C$?\e(B
-\e$BMM<0J8;zNs$G$9!#$3$l$O0J2<$N0l$D$N3HD%$r=|$$$F!"$=$NJQ?t$HF1$8MM\e(B
-\e$B<0;XDj$r<uIU$1$^$9!#\e(B
+\e$B$3$NJQ?t$O\e(B @code{gnus-summary-mode-line-format} \e$B$HF1$89T$K=>$C$?MM<0J8;z\e(B
+\e$BNs$G$9\e(B (@pxref{Mode Line Formatting})\e$B!#$3$l$O0J2<$N0l$D$N3HD%$r=|$$$F!"\e(B
+\e$B$=$NJQ?t$HF1$8MM<0;XDj$r<uIU$1$^$9!#\e(B
@table @samp
@item w
@vindex gnus-server-mode-line-format
\e$B%b!<%I9T$bJQ?t\e(B @code{gnus-server-mode-line-format} \e$B$r;H$&;v$K$h$C$F%+%9\e(B
-\e$B%?%^%$%:$9$k;v$,$G$-$^$9!#0J2<$N;XDj$OM}2r$5$l$^$9\e(B:
+\e$B%?%^%$%:$9$k;v$,$G$-$^$9\e(B (@pxref{Mode Line Formatting})\e$B!#0J2<$N;XDj$OM}\e(B
+\e$B2r$5$l$^$9\e(B:
@table @samp
@item S
@findex nntp-open-network-stream
@item nntp-open-connetcion-function
@vindex nntp-open-connection-function
-\e$B$3$N4X?t$O1s3V%7%9%F%`$K@\B3$9$k$?$a$K;H$o$l$^$9!#\e(B3\e$B$D$N4{@=4X?t$N\e(B1\e$B$D$O\e(B
-@code{nntp-open-network-stream}\e$B$G!"$3$l$O%G%#%U%)%k%H$GC1=c$K1s3V%7%9%F\e(B
-\e$B%`$N$I$3$+$N$N%]!<%H$d2?$+$K@\B3$7$^$9!#;D$j$N\e(B2\e$B$D$N$&$A$N\e(B1\e$B$D$O!"\e(B
-@code{nntp-open-rlogin} \e$B$G!"1s3V%7%9%F%`$K\e(B @code{rlogin} \e$B$r$7$F!"$=$l$+\e(B
-\e$B$i$=$3$+$i;HMQ2DG=$J\e(B @sc{nntp} \e$B%5!<%P!<$K\e(B @samp{telnet} \e$B$r$7!"$b$&0l$D$O\e(B
-@code{nntp-open-telnet} \e$B$G!"$3$l$O1s3V%7%9%F%`$K\e(B @samp{telnet} \e$B$r$7$F!"\e(B
-\e$B$=$l$+$i\e(B @sc{nntp} \e$B%5!<%P!<$K$?$I$jCe$/$?$a$K$b$&0l$D\e(B @samp{telnet} \e$B$r$7\e(B
-\e$B$^$9!#\e(B
+\e$B$3$N4X?t$O1s3V%7%9%F%`$K@\B3$9$k$?$a$K;H$o$l$^$9!#\e(B4\e$B$D$N4{@=4X?t$,Ds6!$5\e(B
+\e$B$l$F$$$^$9\e(B:
+
+@table @code
+@item nntp-open-network-stream
+\e$B$3$l$O=i4|@_Dj$G!"C1=c$K1s3V%7%9%F%`$N2?$i$+$N%]!<%H$+B>$N$b$K@\B3$7$^$9!#\e(B
+
+@item nntp-open-rlogin
+@samp{rlogin} \e$B$r1s3V%7%9%F%`$K9T$C$F!"$=$3$+$i;EMM2DG=$J\e(B @sc{nntp} \e$B%5!<\e(B
+\e$B%P!<$K\e(B @samp{telnet} \e$B$r$7$^$9!#\e(B
@code{nntp-open-rlogin} \e$B$K4XO"$7$?JQ?t$G$9\e(B:
@end table
+@item nntp-open-telnet
+\e$B1s3V%7%9%F%`$K\e(B @samp{telnet} \e$B$r$7$F!"\e(B@sc{nntp} \e$B%5!<%P!<$K$?$I$jCe$/$?$a\e(B
+\e$B$K$b$&0lEY\e(B @code{telnet} \e$B$r$7$^$9!#\e(B
+
@code{nntp-open-telnet} \e$B$K4XO"$7$?JQ?t$G$9\e(B:
@table @code
@end table
+@findex nntp-open-ssl-stream
+@item nntp-open-ssl-stream
+\e$B%5!<%P!<$K\e(B @dfn{\e$B0BA4$J\e(B} \e$B%A%c%s%M%k$r;H$C$F%5!<%P!<$K@\B3$7$^$9!#$3$l$r;H\e(B
+\e$B$&$?$a$K$O!"\e(BSSLay \e$B$,%$%s%9%H!<%k$5$l$F$$$J$1$l$P$J$j$^$;$s\e(B
+(@file{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL} \e$B$H!"\e(B@file{ssl.el} (\e$BNc$($P!"\e(B
+W3 \e$B$NG[I[$+$i\e(B) \e$B$,I,MW$K$J$j$^$9\e(B)\e$B!#$=$l$+$i%5!<%P!<$r<!$N$h$&$KDj5A$7$^$9\e(B:
+
+@lisp
+;; Type `C-c C-c after you'ver finished editing.
+;;
+;; "snews" is port 563 and is predefined in our /etc/services
+;;
+(nntp "snews.bar.com"
+ (nntp-open-connection-function nntp-open ssl-stream)
+ (nntp-port-number "snews")
+ (nntp-address "snews.bar.com"))
+@end lisp
+
+@end table
+
@item nntp-end-of-line
@sc{nntp} \e$B%5!<%P!<$H$*OC$r$7$F$$$k$H$-$K9T$N=*$o$j\e(B (end-of-line) \e$B$H$7$F\e(B
\e$B;H$o$l$k0u$G$9!#$3$l$O%G%#%U%)%k%H$G\e(B @samp{\r\n} \e$B$G$9$,!"%5!<%P!<$H$*C}\e(B
@item
@samp{group}: \e$B$b$7J,3d$,J8;zNs$G$"$k$H!"$=$l$O%0%k!<%WL>$H$7$F$_$J$5$l$^\e(B
-\e$B$9!#\e(B
+\e$B$9!#IaDL$N@55,I=8=$N9gCW$,$J$5$l$^$9!#Nc$O2<$NJ}$r8+$F2<$5$$!#\e(B
@item
@var{(FIELD VALUE SPLIT)}: \e$B$b$7J,3d$,%j%9%H$G!":G=i$NMWAG$,J8;zNs$G$"$j!"\e(B
(any "debian-\\(\\w*\\)@@lists.debian.org" "mail.debian.\\1")
@end example
+\e$B$b$7J8;zNs$,MWAG\e(B @samp{\&} \e$B$r4^$s$G$$$k$H!"Be$o$j$KA0$G9gCW$7$?J8;zNs$,\e(B
+\e$B;H$o$l$^$9!#F1MM$K!"MWAG\e(B @samp{\1} \e$B$+$i\e(B @samp{\9} \e$B$^$G$O%0%k!<%WIU$1\e(B 1
+\e$B$+$i\e(B 9 \e$B$^$G$G9gCW$7$?J8;zJ8$GBeBX$5$l$^$9!#\e(B
+
@node Mail and Procmail
@subsection \e$B%a!<%k$H\e(B Procmail
@cindex procmail
To: alt-religion-emacs@@GATEWAY
@end example
+\e$B0J2<$N4{@=4X?t$,B8:_$7$^$9\e(B:
+
+@findex nngateway-simple-header-transformation
+@table @code
+
+@item nngateway-simple-header-transformaton
+@var{nesgroup}@@@code{nngateway-address} \e$B$N$h$&$J\e(B @code{To} \e$B%X%C%@!<$r$D\e(B
+\e$B$/$j$^$9!#\e(B
+
+@findex nngateway-mail2news-header-transformation
+
+@item nngateway-mail2news-header-transformation
+@code{nngateway-address} \e$B$N$h$&$J\e(B @code{To} \e$B%X%C%@!<$r$D$/$j$^$9!#\e(B
+
+\e$B$3$3$KNc$,$"$j$^$9!#\e(B
+
+@lisp
+(setq gnus-post-method
+ '(nngateway "mail2news@@replay.com"
+ (nngateway-header-transformation
+ nngateway-mail2news-header-transformation)))
+@end lisp
+
+@end table
+
+
@end table
\e$B$D$^$j!"$3$l$r;H$&$K$O!"$3$s$JIw$K$9$k$@$1$G$9!#\e(B
@item gnus-category-mode-line-format
@vindex gnus-category-mode-line-format
-\e$BJ,N`%b!<%I9T$NMM<0!#\e(B
+\e$BJ,N`%b!<%I9T$NMM<0\e(B (@pxref{Mode Line Formatting})\e$B!#\e(B
@item gnus-agent-short-article
@vindex gnus-agent-short-article
* Scoring Tips:: \e$B$I$&$d$C$F8z2LE*$K%9%3%"$rIU$1$k$+!#\e(B
* Reverse Scoring:: \e$B8E$$$b$N$N;R$G$"$k$H$$$&LdBj$OLdBj$G$O$J$$!#\e(B
* Global Score Files:: \e$BCO$r$D$+$_!"<*$r@Z$jNv$/%9%3%"%U%!%$%k!#\e(B
-* Kill Files:: \e$B$=$l$i$O$^$@$3$3$K$"$j$^$9$,!"L5;k$9$k;v$,$G$-$^$9!#\e(B
+* Kill Files:: \e$B$=$l$i$O$^$@$3$3$K$"$j$^$9$,!"L5;k$9$k;v$,$G$-$k!#\e(B
* Converting Kill Files:: \e$B:o=|%U%!%$%k$r%9%3%"%U%!%$%k$KJQ49$9$k!#\e(B
* GroupLens:: \e$B$I$l$rFI$`$N$,9%$-$+$NM=8@$rF@$k!#\e(B
* Advanced Scoring:: \e$B%9%3%"$NK!B'$r:n$k$?$a$KO@M}I=8=$r;H$&!#\e(B
gnus \e$B$N8e$m$G$$$m$$$m$H%9%3%"%U%!%$%k$GM7$s$G!"$=$l$N8z2L$r8+$?$$$H$-$K\e(B
\e$BLrN)$D$+$b$7$l$^$;$s!#\e(B
-@item V a
-@kindex V a (\e$B35N,\e(B)
-@findex gnus-summary-score-entry
-\e$B?7$7$$%9%3%"EPO?$rIU$12C$(!"A4$F$NMWAG$N;XDj$r5v2D$7$^$9\e(B
-(@code{gnus-summary-score-entry})\e$B!#\e(B
-
@item V c
@kindex V c (\e$B35N,\e(B)
@findex gnus-score-change-score-file
@item Lines, Chars
\e$B$3$l$i$N\e(B2\e$B$D$N%X%C%@!<$O0c$C$?9gCW$N7?$r;H$$$^$9\e(B: @code{<}\e$B!"\e(B@code{>}\e$B!"\e(B
-@code{=}\e$B!"\e(B@code{>=}\e$B!"\e(B@code{<=} \e$B$G$9!#9gCW$,\e(B @code{Lines} \e$B$G$J$5$l$F$$$k\e(B
-\e$B$H!"$$$/$D$+$N%P%C%/%(%s%I\e(B (@code{nndir}\e$B$N$h$&$J$b$N\e(B) \e$B$O\e(B @code{Lines} \e$B%X%C\e(B
-\e$B%@!<$r:n@.$7$J$$$?$a$KA4$F$N5-;v$,\e(B0\e$B9T$G$"$k$H$7$F07$o$l$k;v$K5$$rIU$1$F\e(B
-\e$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\e(B
-\e$B7k2L$,5/$3$jF@$k;v$K$J$j$^$9!#\e(B
+@code{=}\e$B!"\e(B@code{>=}\e$B!"\e(B@code{<=} \e$B$G$9!#\e(B
+
+\e$B$3$l$i$N=R8l$O$b$7\e(B
+
+@example
+(PREDICATE HEADER MATCH)
+@end example
+
+\e$B$NI>2A$,\e(B @code{nil} \e$B$G$J$$$H!"??$H$J$j$^$9!#Nc$($P!">e5i9gCW\e(B
+@code{("lines" 4 <)} (@pxref{Advanced Scoring}) \e$B$O7k2L$H$7$F0J2<$N<0$K$J\e(B
+\e$B$j$^$9!#\e(B
+
+@lisp
+(< header-value 4)
+@end lisp
+
+\e$B$b$7$/$OB>$NJ}K!$K$7$^$7$g$&\e(B: @code{<} \e$B$r\e(B @code{Lines} \e$B$G\e(B 4 \e$B$r9gCW$H$7$F\e(B
+\e$B;H$C$F$$$k$H$-$O!"5-;v$,\e(B4\e$B9T$h$j$b>/$J$$$H$-$K%9%3%"$,DI2C$5$l$^$9!#\e(B(\e$B:.Mp\e(B
+\e$B$7$F!"H?BP$G$O$J$$$+$H9M$(0W$$$G$9!#$G$b!"$=$&$G$O$J$$$N$G$9!#;d$,;W$&$K!#\e(B)
+
+\e$B9gCW$,\e(B @code{Lines} \e$B$G$J$5$l$F$$$k$H!"$$$/$D$+$N%P%C%/%(%s%I\e(B
+(@code{nndir}\e$B$N$h$&$J$b$N\e(B) \e$B$O\e(B @code{Lines} \e$B%X%C%@!<$r:n@.$7$J$$$?$a$KA4\e(B
+\e$B$F$N5-;v$,\e(B 0 \e$B9T$G$"$k$H$7$F07$o$l$k;v$K5$$rIU$1$F$/$@$5$$!#$3$l$O$b$7>/\e(B
+\e$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\e(B
+\e$B$j$^$9!#\e(B
@item Date
Date (\e$BF|IU\e(B) \e$B%X%C%@!<$K$O\e(B3\e$B$D$N$J$s$H$J$/$P$+$2$F$$$k9gCW$N7?$,$"$j$^$9\e(B:
\e$B>C5n%U%!%$%k$+$i%9%3%"%U%!%$%k$X$NJQ49%Q%C%1!<%8$O!"I8=`$G$O\e(B
gnus \e$B$K$O4^$^$l$^$;$s!#\e(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}
\e$B$+$iF~<j$9$k$3$H$,$G$-$^$9!#\e(B
\e$B$b$7$"$J$?$N>C5n%U%!%$%k$,Hs>o$KJ#;($J$b$N$G$"$l$P\e(B --- \e$B$=$l$K\e(B
\e$B9T$7$F$$$J$$$H!"\e(Bgnus \e$B$O\e(B4\e$B2s%9%3%"$rIe$i$;$^$9!#\e(B
+@node Various
+@chapter \e$B$$$m$$$m\e(B
+
+@menu
+* Process/Prefix:: \e$BB?$/$N07$$L?Na$G;H$o$l$k=,47!#\e(B
+* Interactive:: Gnus \e$B$KB?$/$N<ALd$r?R$M$5$;$k!#\e(B
+* Symbolic Prefixes:: \e$B$$$/$D$+$N\e(B gnus \e$B$N4X?t$KA*Br8"$rDs6!$9$kJ}K!!#\e(B
+* Formatting Variables:: \e$B%P%C%U%!$,$I$N$h$&$K8+$($k$Y$-$+$r;XDj$9$k;v$,$G$-$k!#\e(B
+* Windows Configuration:: Gnus \e$B%P%C%U%!%&%#%s%I%&$r@_Dj$9$k!#\e(B
+* Faces and Fonts:: \e$B%U%'%$%9$,$I$N$h$&$K8+$($k$+$rJQ99$9$k!#\e(B
+* Compilation:: \e$B$I$N$h$&$K$7$F\e(B gnus \e$B$NB.EY$r>e$2$k$+!#\e(B
+* Mode Lines:: \e$B%b!<%I9T$K>pJs$rI=<($9$k!#\e(B
+* Highlighting and Menus:: \e$B%P%C%U%!$rAGE($G?4CO$h$/8+$;$k!#\e(B
+* Buttons:: \e$B4JC1$J\e(B10\e$BJb$G%"%-%l%9g'$rF@$k!#\e(B
+* Daemons:: Gnus \e$B$O$"$J$?$NN"$GJ*;v$r<B9T$9$k;v$,$G$-$k!#\e(B
+* NoCeM:: Spam \e$B$dB>$NB@$j$d$9$$?);v$rHr$1$kJ}K!!#\e(B
+* Undo:: \e$B$$$/$D$+$NF0:n$O85$KLa$9;v$,$G$-$k!#\e(B
+* Moderation:: \e$B$"$J$?$,%b%G%l!<%?!<$@$C$?$i$I$&$9$k$+!#\e(B
+* XEmacs Enhancements:: XEmacs \e$B$G$O$b$C$H3($d$=$NB>$N$b$N$,B8:_$9$k!#\e(B
+* Fuzzy Matching:: \e$BBg$-$JLJLS$C$F2?!)\e(B
+* Thwarting Email Spam:: \e$BM>7W$J>&6HE*EE;R%a!<%k$rHr$1$kJ}K!!#\e(B
+* Various Various:: \e$BK\Ev$K$$$m$$$m$J$b$N!#\e(B
+@end menu
+
+
+@node Process/Prefix
+@section \e$B%W%m%;%9\e(B/\e$B@\F,0z?t\e(B
+@cindex process/prefix convention
+
+\e$BB?$/$N4X?t!"$=$NCf$G$b5-;v$N0\F0!"I|9f2=!"J]B8$r$9$k$?$a$N4X?t$O!"\e(B
+@dfn{\e$B%W%m%;%9\e(B/\e$B@\F,0z?t$N=,47\e(B} \e$B$H$7$FCN$i$l$F$$$k$b$N$r;H$$$^$9!#\e(B
+
+\e$B$3$l$OMxMQ<T$,$I$N5-;v$KL?Na$r<B9T$7$?$$$+$r8+$D$1$k$?$a$NJ}K!$G$9!#\e(B
+
+\e$B$=$l$O$3$N$h$&$J46$8$G$9\e(B:
+
+\e$B$b$7?tCM@\F,0z?t$,\e(B N \e$B$G$"$k$H!"8=:_$N5-;v$+$i;O$a$F!"<!$N\e(B N \e$B5-;v$K:n6H$r\e(B
+\e$B<B9T$7$^$9!#$b$7?tCM@\F,0z?t$,Ii$G$"$k$H!"8=:_$N5-;v$+$i;O$a$F!"A0$N\e(B N
+\e$B5-;v$K:n6H$r<B9T$7$^$9!#\e(B
+
+@vindex transient-mark-mode
+@code{transient-mark-mode} \e$B$,\e(B @code{nil} \e$B$G$J$/!"%j!<%8%g%s$,A`:n$5$l$F\e(B
+\e$B$$$k$H!"%j!<%8%g%s$K$"$kA4$F$N5-;v$K:n6H$,$J$5$l$^$9!#\e(B
+
+
+\e$B$b$7@\F,0z?t$,L5$$$1$l$I!"$$$/$D$+$N5-;v$O%W%m%;%90u$,IU$$$F$$$k$H$$$&>l\e(B
+\e$B9g$O!"%W%m%;%90u$NIU$$$F$$$k5-;v$K:n6H$,<B9T$5$l$^$9!#\e(B
+
+\e$B?tCM@\F,0z?t$d%W%m%;%90u$NIU$$$F$$$k5-;v$,L5$$>l9g$O!"8=:_$N5-;v$K$@$1:n\e(B
+\e$B6H$r<B9T$7$^$9!#\e(B
+
+\e$B$3$l$OK\Ev$KHs>o$K4JC1$G$9$,!"6CC2$rHr$1$i$l$k$h$&$K>\:Y$rL@$i$+$K$7$F$*\e(B
+\e$B$/I,MW$,$"$k$N$G$9!#\e(B
+
+\e$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\e(B
+\e$B%/$K@Q$_!"A4$F$N%W%m%;%90u$N5-;v$N%j%9%H$r>C5n$7$^$9!#A02s$N@_Dj$r\e(B
+@kbd{M P y} \e$B$GI|5l$5$;$k;v$,$G$-$^$9\e(B (@pxref{Setting Process Marks})\e$B!#\e(B
+
+@vindex gnus-summary-goto-unread
+\e$BB?$/$N?M!9$r6C$+$;!"62$,$i$;$k$H;W$o$l$k$3$H$O!"Nc$($P!"\e(B@kbd{3 d} \e$B$OK\Ev\e(B
+\e$B$K\e(B @kbd{d} @kbd{d} @kbd{d} \e$B$HF1$8;v$r$9$k;v$G$9!#$=$l$>$l$N\e(B @kbd{d} (\e$B$3\e(B
+\e$B$l$O8=:_$N5-;v$K4{FI$N0u$rIU$1$^$9\e(B) \e$B$O=i4|@_Dj$G$O0u$rIU$1$?8e$K<!$NL$FI\e(B
+\e$B5-;v$K0\F0$9$k$N$G!"\e(B@kbd{3 d} \e$B$O35N,%P%C%U%!$,$I$N$h$&$G$"$C$F$b!"<!$N\e(B3
+\e$B$D$NL$FI5-;v$r4{FI$K$7$^$9!#$b$C$HJ,$+$j$d$9$$F0:n$N$?$a$K$O\e(B
+@code{gnus-summary-goto-unread} \e$B$r\e(B @code{nil} \e$B$K@_Dj$7$F$/$@$5$$!#\e(B
+
+
+@node Interactive
+@section \e$BBPOCE*\e(B
+@cindex interaction
+
+@table @code
+
+@item gnus-novice-user
+@vindex gnus-novice-user
+\e$B$b$7$3$NJQ?t$,\e(B @code{nil} \e$B$G$J$$$H!"$"$J$?$O\e(B Usenet \e$B$N@$3&$K?7$7$/F~$C$F\e(B
+\e$BMh$??M$G$"$k$+!"Hs>o$K?5=E$J?M$G!"$3$l$OK\Ev$KNI$$;v$G$9!#2?$+4m81$J;v$r\e(B
+\e$B$9$kA0$K!"\e(B``\e$BK\Ev$K$3$l$r$7$?$$$N$G$9$+!)\e(B'' \e$B$H$$$&$h$&$J<ALd$r<u$1$^$9!#\e(B
+\e$B$3$l$O=i4|@_Dj$G$O\e(B @code{t} \e$B$G$9!#\e(B
+
+@item gnus-expert-user
+@vindex gnus-expert-user
+\e$B$3$NJQ?t$,\e(B @code{nil} \e$B$G$J$$$H!"$"$J$?$O\e(B gnus \e$B$+$i$[$H$s$I<ALd$r<u$1$k;v\e(B
+\e$B$O$"$j$^$;$s!#$3$l$OC1=c$K$"$J$?$,$I$N$h$&$JJQ$J;v$r$7$F$$$F$b!"2?$r$7$F\e(B
+\e$B$$$k$+$r$o$+$C$F$$$k$H8+$J$7$^$9!#\e(B
+
+@item gnus-interactive-catchup
+@vindex gnus-interactive-catcup
+@code{nil} \e$B$G$J$$$H!"%0%k!<%W$KDI$$$D$/\e(B (catchup) \e$BA0$K!"3NG'$rMW5a$7$^$9!#\e(B
+\e$B$3$l$O=i4|@_Dj$G\e(B @code{t} \e$B$G$9!#\e(B
+
+@item gnus-interactive-exit
+@vindex gnus-interactive-exit
+Gnus \e$B$r=*N;$9$kA0$K3NG'$rMW5a$7$^$9!#$3$NJQ?t$O=i4|@_Dj$G\e(B @code{t} \e$B$G$9!#\e(B
+@end table
+
+
+@node Symbolic Prefixes
+@section \e$B%7%s%\%k$N@\F,0z?t\e(B
+@cindex symbolic prefixes
+
+\e$BHs>o$KB?$/$N\e(B Emacs \e$B$NL?Na$O\e(B (\e$B?tCM\e(B) \e$B@\F,0z?t$KH?1~$7$^$9!#Nc$($P!"\e(B
+@kbd{C-u 4 C-f} \e$B$O%]%$%s%H$r\e(B4\e$BJ8;z@h$K0\F0$7!"\e(B@kbd{C-u 9 0 0 I s s p} \e$B$O\e(B
+\e$B1JB3\e(B @code{Suject} \e$BJ8;zNs$N0lIt%9%3%"K!B'$N\e(B900\e$B$r8=:_$N5-;v$K2C$($^$9!#\e(B
+
+\e$B$3$l$OAGE($GNI$$$N$G$9$,!"L?Na$K$b$&>/$7DI2C$N>pJs$rM?$($?$$$H$-$O$I$&$9\e(B
+\e$B$l$PNI$$$N$G$7$g$&!)$(!<$H!"$?$$$F$$$NL?Na$,$7$F$$$k;v$O!"\e(B``\e$B@8$N\e(B'' \e$B@\F,\e(B
+\e$B0z?t$rFCJL$JJ}K!$G2r<a$9$k;v$G$9!#Nc$($P!"\e(B@kbd{C-u 0 C-x C-s} \e$B$O8=:_$N5-\e(B
+\e$B;v$rJ]B8$9$k$H$-$K%P%C%/%"%C%W%U%!%$%k$r:n$i$J$$$GM_$7$$$H$$$&$3$H$r0UL#\e(B
+\e$B$7$^$9!#$G$b!"%P%C%/%"%C%W%U%!%$%k$r:n$i$J$$$GJ]B8$7!"F1;~$K\e(B Emacs \e$B$K8w$C\e(B
+\e$B$FM_$7$/!"AGE($J2;3Z$r1iAU$7$FM_$7$$$H$-$O$I$&$9$l$PNI$$$G$7$g$&!)$=$l$O\e(B
+\e$BIT2DG=$G!"$*$=$i$/$=$l$,IT2DG=$G$"$C$F$b$"$J$?$O9,$;$G$7$g$&!#\e(B
+
+@kindex M-i (\e$B35N,\e(B)
+@findex gnus-symbolic-argument
+\e$B;d$O$=$&$G$O$"$j$^$;$s!#$G$9$+$i!";d$O\e(B2\e$B$D$a$N@\F,0z?t\e(B---@dfn{\e$B%7%s%\%k@\\e(B
+\e$BF,0z?t\e(B} \e$B$r2C$($^$7$?!#@\F,%-!<$O\e(B @kbd{M-i}
+(@code{gnus-symbolic-argument}) \e$B$G!"<!$K2!$5$l$kJ8;z$,CM$G$9!#K>$`$@$1B?\e(B
+\e$B$/$N\e(B @kbd{M-i} \e$B@\F,8l$r@Q$_=E$M$k;v$,$G$-$^$9!#\e(B@kbd{M-i a M-C-u} \e$B$O\e(B ``\e$BL?\e(B
+\e$BNa\e(B @kbd{M-C-u} \e$B$K%7%s%\%k@\F,0z?t\e(B @code{a} \e$B$rM?$($k\e(B'' \e$B$H$$$&$3$H$G$9!#\e(B
+@kbd{M-i a M-i b M-C-u} \e$B$OL?Na\e(B @kbd{M-C-u} \e$B$K%7%s%\%k@\F,0z?t\e(B @code{a}
+@code{b} \e$B$rM?$($k\e(B'' \e$B$H$$$&;v$G$9!#<q;]$OJ,$+$C$?$G$7$g$&!#\e(B
+
+\e$B%7%s%\%k@\F,0z?t$r<u$1IU$1$J$$L?Na$K$=$l$rBG80$9$k;v$O2?$b0-$$;v$r$7$^$;\e(B
+\e$B$s$,!"NI$$;v$b2?$b$7$^$;$s!#8=:_$N$H$3$m!"$"$^$jB?$/$N4X?t$,%7%s%\%k@\F,\e(B
+\e$B0z?t$rLrN)$F$F$$$k$o$1$G$O$"$j$^$;$s!#\e(B
+
+\e$B$b$7$I$N$h$&$K\e(B gnus \e$B$,$3$l$r<BAu$7$F$$$k$+$K6=L#$,$"$k$J$i!"\e(B
+@pxref{Extended Interactive} \e$B$r8+$F$/$@$5$$!#\e(B
+
+
+@node Formatting Variables
+@section \e$B=qK!;EMMJQ?t\e(B
+@cindex formatting variables
+
+\e$B$3$N%^%K%e%"%k$rDL$7$F!"$"$J$?$O$*$=$i$/\e(B @code{gnus-group-line-format}
+\e$B$d\e(B @code{gnus-summary-mode-line-format} \e$B$N$h$&$K8F$P$l$k$?$/$5$s$NJQ?t$,\e(B
+\e$B$"$k;v$K5$IU$$$?$G$7$g$&!#$3$l$i$O\e(B gnus \e$B$,?'!9$J%P%C%U%!$G$I$N$h$&$K9T$r\e(B
+\e$B=PNO$9$k$+$r@)8f$7$^$9!#Hs>o$K$?$/$5$s$N$b$N$,$"$j$^$9!#9,1?$J;v$K!"$=$l\e(B
+\e$B$i$O$9$Y$FF1$89=J8$r;H$$$^$9$N$G!"$"$^$j7y$JL\$K$O2q$o$J$$$G$7$g$&!#\e(B
+
+\e$B=qK!;EMM\e(B (format) \e$B;XDj$NNc$,$"$j$^$9\e(B (\e$B%0%k!<%W%P%C%U%!$h$j\e(B):
+@samp{%M%S%5y: %(%g%)\n}\e$B!#$=$l$O<B:]$KHs>o$K=9$/!"$?$/$5$s$N%Q!<%;%s%H5-\e(B
+\e$B9f$,$I$3$K$G$b$"$j$^$9!#\e(B
+
+@menu
+* Formatting Basics:: \e$B=qK!;EMMJQ?t$O4pK\E*$K=qK!;XDjJ8;zNs$G$"$k!#\e(B
+* Mode Line Formatting:: \e$B%b!<%I9T$N=qK!;EMMJQ?t$K4X$9$k$$$/$D$+$N5,B'!#\e(B
+* Advanced Formatting:: \e$B?'!9$JJ}K!$G=PNO$r=$@5$9$k!#\e(B
+* User-Defined Specs:: Gnus \e$B$K$"$J$?<+?H$N4X?t$r8F$P$;$k!#\e(B
+* Formatting Fonts:: \e$B;EMM$rB?:L$GAGE($K8+$;$k!#\e(B
+@end menu
+
+\e$B8=:_$N$H$3$m!"\e(Bgnus \e$B$O0J2<$N=qK!;EMMJQ?t$r;H$$$^$9\e(B:
+@code{gnus-group-line-format}\e$B!"\e(B@code{gnus-summary-line-format}\e$B!"\e(B
+@code{gnus-server-line-format}\e$B!"\e(B@code{gnus-topic-line-format}\e$B!"\e(B
+@code{gnus-group-mode-line-format}\e$B!"\e(B@code{gnus-summary-mode-line-format}\e$B!"\e(B
+@code{gnus-article-mode-line-format}\e$B!"\e(B
+@code{gnus-server-mode-line-format}\e$B!"\e(B
+@code{gnus-summary-pick-line-format}\e$B!#\e(B
+
+\e$B$3$l$iA4$F$N=qK!;EMMJQ?t$OG$0U$N\e(B elisp \e$B<0$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"\e(B
+\e$B$=$l$i$OMW5a$5$l$k9T$KA^F~$9$k$?$a$K\e(B @code{\e$BI>2A\e(B} \e$B$5$l$^$9!#\e(B
+
+@kindex M-x gnus-update-format
+@findex gnus-update-format
+Gnus \e$B$O$"$J$?<+?H$N=qK!;EMM;XDj$r:n$k<jEA$$$r$9$kL?Na$rHw$($F$$$^$9!#\e(B
+@kbd{M-x gnus-update-format} \e$B$O8=:_$N<0$r\e(B @code{\e$BI>2A\e(B} \e$B$7!"Ev$N;XDj$r99?7\e(B
+\e$B$7!"7k2L$N\e(B lisp \e$B<0$r<B9T$7$F9T$r:n@.$9$k;v$r<B83$G$-$k%P%C%U%!$K0\F0$7$^\e(B
+\e$B$9!#\e(B
+
+
+
+@node Formatting Basics
+@subsection \e$B=qK!;EMM$N4pK\\e(B
+
+\e$B$=$l$>$l$NMWAG\e(B @samp{%} \e$B$OEv$N%P%C%U%!$,:n@.$5$l$k$H$-$K2?$i$+$NJ8;zNs$d\e(B
+\e$BB>$N$b$N$GCV$-49$($i$l$^$9!#\e(B@samp{%5y} \e$B$O\e(B ``@samp{y} \e$B;XDj$rA^F~$7!"\e(B5\e$BJ8;z\e(B
+\e$B$N>l=j$rF@$k$?$a$K6uGr$rF~$l$J$5$$\e(B'' \e$B$H$$$&;v$G$9!#\e(B
+
+\e$BIaDL$N\e(B C \e$B$d\e(B Emacs Lisp \e$B$N=qK!;EMM\e(B (format) \e$BJ8;zNs$HF1$8$h$&$K!"\e(B@samp{%}
+\e$B$H=qK!;EMM$N7?$NJ8;z$N4V$N?tCM=$>~;R$O>o$K>/$J$/$H$b$=$ND9$5$K$J$k$h$&$K!"\e(B
+\e$B=PNO$K\e(B @dfn{\e$B5M$a\e(B} \e$B$l$i$l$^$9!#\e(B@samp{%5y} \e$B$O$=$NItJ,$r>o$K\e(B (\e$B>/$J$/$H$b\e(B) 5
+\e$BJ8;z$ND9$5$K$J$k$h$&$K!":8$K6uGr$r5M$a$^$9!#$b$7\e(B @samp{%-5y} \e$B$H$9$l$P!"\e(B
+\e$BBe$o$j$K1&B&$K5M$a9~$_$^$9!#\e(B
+
+\e$BFC$KD9$$CM$+$i$=$NItJ,$rJ]8n$9$k$?$a$K!"D9$5$r@)8B$7$?$$$H$b;W$&$G$7$g$&!#\e(B
+\e$B$=$N$?$a$K$O!"\e(B@samp{%4,6y} \e$B$H$9$k;v$,$G$-$F!"$3$l$O$=$NNN0h$O7h$7$F\e(B6\e$BJ8;z\e(B
+\e$B$rD6$($kD9$5$K$O$J$i$:!"\e(B4\e$BJ8;z$h$j>/$J$$D9$5$K$J$i$J$$$H$$$&;v$G$9!#\e(B
+
+
+@node Mode Line Formatting
+@subsection \e$B%b!<%I9T=qK!;EMM\e(B
+
+\e$B%b!<%I9T=qK!;EMMJQ?t\e(B (\e$B$9$J$o$A!"\e(B@code{gnus-summary-mode-line-format}) \e$B$O\e(B
+\e$B0J2<$N\e(B2\e$B$D$N0c$$0J30$O!"%P%C%U%!9T$K4p$E$/=qK!;EMMJQ?t$H\e(B
+(@pxref{Formatting Basics}) \e$BF1$8$h$&$J5,B'$K=>$$$^$9\e(B:
+
+@enumerate
+
+@item
+\e$B:G8e$K2~9T\e(B (@samp{\n}) \e$B$,$"$C$F$O$J$j$^$;$s!#\e(B
+
+@item
+\e$BFCJL$J\e(B @samp{%%b} \e$B;XDj$r%P%C%U%!L>$rI=<($9$k$?$a$K;H$&$3$H$,$G$-$^$9!#$(!<\e(B
+\e$B$H!"K\Ev$O$=$l$O;XDj$G$O$J$$$N$G$9\e(B---@samp{%%} \e$B$OC1$K=qK!;EMM$,5!3#E*$K\e(B
+\e$B@Z$jNv$/$N$r@Z$jH4$1$F\e(B @samp{%} \e$B$r$=$N$^$^EO$9$?$a$NJ}K!$G!"\e(BEmacs \e$B$,\e(B
+@samp{%b} \e$B$r<u$1<h$k$H!"\e(BEmacs \e$B$N%b!<%I9TI=<($NItJ,$,$=$l$r\e(B ``\e$B%P%C%U%!L>\e(B
+\e$B$rI=<($7$J$5$$\e(B'' \e$B$H2r<a$7$^$9!#\e(BEmacs \e$B$,M}2r$9$k%b!<%I9T;XDj$N40A4$J0lMw\e(B
+\e$B$r8+$k$?$a$K$O!"JQ?t\e(B @code{mode-line-format} \e$B$N@bL@J8$r8+$F2<$5$$!#\e(B
+
+@end enumerate
+
+
+@node Advanced Formatting
+@subsection \e$B>e5i=qK!;EMM\e(B
+
+\e$B2?$i$+$NJ}K!$GNN0h$r8e$G=hM}$9$k$N$OIQHK$KLr$KN)$A$^$9!#ItJ,$r5M$a9~$`!"\e(B
+\e$B@)8B$9$k!"@Z$j<h$k$3$H$HFCDj$NCM$rM^@)$9$k;v$O!"\e(B@dfn{\e$B%A%k%@=$>~;R\e(B} \e$B$r;H\e(B
+\e$B$&;v$K$h$jC#@.$5$l$^$9!#$h$/$"$k%A%k%@;XDj$O$3$N$h$&$K8+$($k$+$b$7$l$^$;\e(B
+\e$B$s\e(B @samp{%~(cut 3)~(ignore "0")y}\e$B!#\e(B
+
+\e$B$3$l$i$OM-8z$J=$>~;R$G$9\e(B:
+
+@table @code
+@item pad
+@itemx pad-left
+\e$BMW5a$5$l$?D9$5$K$J$k$^$G!"NN0h$K6uGr$r:8B&$+$i5M$a9~$_$^$9!#\e(B
+
+@item pad-right
+\e$BMW5a$5$l$?D9$5$K$J$k$^$G!"NN0h$K6uGr$r1&B&$+$i5M$a9~$_$^$9!#\e(B
+
+@item max
+@itemx max-left
+\e$B;XDj$5$l$?D9$5$K$J$k$h$&$K!"J8;z$r:8B&$+$i@Z$j<h$j$^$9!#\e(B
+
+@item max-right
+\e$B;XDj$5$l$?D9$5$K$J$k$h$&$K!"J8;z$r1&B&$+$i@Z$j<h$j$^$9!#\e(B
+
+@item cut
+@itemx cut-left
+\e$B;XDj$5$l$??t$NJ8;z$r:8B&$+$i@Z$jMn$H$7$^$9!#\e(B
+
+@item cut-right
+\e$B;XDj$5$l$??t$NJ8;z$r1&B&$+$i@Z$jMn$H$7$^$9!#\e(B
+
+@item ignore
+\e$BNN0h$,;XDj$5$l$?CM$HEy$7$1$l$P\e(B (equal) \e$B!"6uJ8;zNs$rJV$7$^$9!#\e(B
+
+@item form
+@samp{@@} \e$B;XDj$,;H$o$l$?$H$-$K!";XDj$5$l$?<0$rNN0h$NCM$H$7$F;H$$$^$9!#\e(B
+@end table
+
+\e$BNc$r=P$7$F$_$^$7$g$&!#35N,%b!<%I9T$G$N\e(B @samp{%o} \e$B;XDj$O>.7?$N\e(B ISO0861 \e$BMM\e(B
+\e$B<0$NF|IU$rJV$7$^$9\e(B---@samp{19960809T230410} \e$B$G$9!#$3$l$OH/2;$7$K$/$$$N$G!"\e(B
+\e$B@$5*$rI=$9?t$H;~4V$r:o$.Mn$H$7$F!"\e(B6\e$BJ8;z$NF|IU$r;D$7$?$$$H;W$$$^$9!#$=$l\e(B
+\e$B$O\e(B @samp{%~(cut-left 2)~(max-right 6)~(pad 6)o} \e$B$H$J$k$G$7$g$&!#\e(B(\e$B@Z$jMn\e(B
+\e$B$H$7\e(B (cutting) \e$B$O\e(B \e$B:GBg8B\e(B (maxing) \e$B$h$j@h$K$J$5$l$^$9$N$G!"7e$GAGE($K8+$(\e(B
+\e$B$k$h$&$K$9$k$?$a$KF|IU$,\e(B6\e$BJ8;z$h$j>/$J$/L5$/$J$i$J$$;v$rJ]>Z$9$k$?$a$K5M\e(B
+\e$B$a9~$_\e(B (padding) \e$B$,I,MW$K$J$j$^$9!#\e(B)
+
+\e$BL5;k\e(B (ignore) \e$B$,:G=i$K$J$5$l$^$9!#$=$l$+$i@Z$jMn$H$7\e(B (cut) \e$B$,9T$o$l$^$9!#\e(B
+\e$B$=$7$F!"$=$l$+$i:G8e$NA`:n!"5M$a9~$_\e(B (pad) \e$B$,9T$o$l$^$9!#\e(B
+
+\e$B$b$7$3$l$i$N>e5i;2>H$r$?$/$5$s;H$C$F$$$k$J$i!"\e(Bgnus \e$B$,$H$F$bCY$/$J$k$N$,\e(B
+\e$B$o$+$k$G$7$g$&!#$3$l$O$"$J$?$N9T$N308+$KK~B-$7$?$H$-$K\e(B @kbd{M-x
+gnus-compile} \e$B$r<B9T$9$k;v$G3JCJ$KB.EYDc2<$r8:$i$9;v$,$G$-$^$9!#\e(B
+@xref{Compilation}\e$B!#\e(B
+
+
+@node User-Defined Specs
+@subsection \e$BMxMQ<TDj5A$N;XDj\e(B
+
+\e$BA4$F$N;XDj$OMxMQ<TDj5A\e(B---@samp{u} \e$B$N;XDj$rA^F~$9$k;v$,$G$-$^$9!#=qK!;EMM\e(B
+\e$BJ8;zNs$N<!$NJ8;z$O%"%k%U%!%Y%C%H$G$"$kI,MW$,$"$j$^$9!#\e(BGnus \e$B$O4X?t\e(B
+@code{gnus-user-format-function-}@samp{X} \e$B$r8F$S!"$3$3$G\e(B @samp{X} \e$B$O\e(B
+@samp{%u} \e$B$KB3$/%"%k%U%!%Y%C%H$G$9!#4X?t$K$OC10l$N0z?t$,M?$($i$l$^$9\e(B---
+\e$B0z?t$N0UL#$O4X?t$,$I$N%P%C%U%!$+$i8F$P$l$F$$$k$+$K$h$C$FJQ$o$j$^$9!#4X?t\e(B
+\e$B$OJ8;zNs$rJV$9$Y$-$G!"$=$l$OB>$N;XDj$+$i$N>pJs$HA4$/F1$8$h$&$K%P%C%U%!$K\e(B
+\e$BA^F~$5$l$^$9!#4X?t$O0UL#$NL5$$CM$H6&$K8F$P$l$k;v$b$"$j$($^$9$N$G!"$=$l$N\e(B
+\e$BBP:v$r$9$k$Y$-$G$9!#\e(B
+
+\e$B?7$7$$4X?t$rDj5A$7$J$$$G$b!"%A%k%@=$>~;R\e(B (@pxref{Advanced Formattin}) \e$B$r\e(B
+\e$B;H$C$F$[$H$s$IF1$8;v$rC#@.$9$k;v$,$G$-$^$9!#Nc$G$9\e(B: @samp{%~(form
+(count-lines (point-min) (point)))@@}\e$B!#$3$3$GM?$($i$l$?<0$OI>2A$5$l$F!"\e(B
+\e$B8=:_$N9T?t$r$b$?$i$7!"$=$l$+$iA^F~$5$l$^$9!#\e(B
+
+
+@node Formatting Fonts
+@subsection \e$B=qK!;EMM%U%)%s%H\e(B
+
+\e$B%O%$%i%$%H$N$?$a$N;XDj$,$"$j!"$=$l$i$OA4$F$N=qK!;EMMJQ?t$K$h$C$F6&M-$5$l\e(B
+\e$B$F$$$^$9!#\e(B@samp{%(} \e$B$H\e(B @samp{%)} \e$B;XDj$N4V$NJ8>O$OFCJL$J\e(B
+@code{mouse-face} \e$B%W%m%Q%F%#$,@_Dj$5$l!"$=$l$O$=$3$K%^%&%9$N%]%$%s%?!<$r\e(B
+\e$B$"$o$;$?$H$-$K\e(B (@code{gnus-mouse-face} \e$B$K$h$C$F\e(B) \e$B%O%$%i%$%H$5$l$k$3$H$K\e(B
+\e$B$J$j$^$9!#\e(B
+
+
+@samp{%@{} \e$B$H\e(B @samp{%@}} \e$B;XDj$N4V$NJ8>O$O\e(B @code{gnus-face-0} \e$B$r;H$C$FIa\e(B
+\e$BDL$N%U%'%$%9$,@_Dj$5$l!"$=$l$O=i4|@_Dj$G\e(B @code{bold} \e$B$G$9!#$b$7\e(B
+@samp{%@{1} \e$B$H$7$?$J$i!"Be$o$j$K\e(B @code{gnus-face-1} \e$B$rF@!"0J2<F1MM$G$9!#\e(B
+\e$BM_$7$$$@$1$?$/$5$s$N%U%'%$%9$r:n$C$F$/$@$5$$!#F1$8;v$,\e(B @code{mouse-face}
+\e$B;XDj$K$b8@$($^$9\e(B---@samp{hello} \e$B$,\e(B @code{gnus-mouse-face-3} \e$B$G%^%&%9!]%O\e(B
+\e$B%$%i%$%H$5$l$k$?$a$K$O!"\e(B@samp{%3(hello%)} \e$B$H$9$k;v$,$G$-$^$9!#\e(B
+
+\e$B$3$l$O%0%k!<%W%P%C%U%!$NBeBX<jK!$G$9\e(B:
+
+@lisp
+;; 3\e$B$D$N%U%'%$%9$N7?$r:n$k!#\e(B
+(setq gnus-face-1 'bold)
+(setq gnus-face-3 'italic)
+
+;; \e$B2f!9$O5-;v$N?t$r%\!<%k%I$GNP$N%U%'%$%9\e(B
+;; \e$B$K$7$?$$$N$G!"\e(B`my-green-bold' \e$B$H8F$P$l$k\e(B
+;; \e$B?7$7$$%U%'%$%9$r:n$C$?!#\e(B
+(copy-face 'bold 'my-green-bold)
+;; \e$B?'$r@_Dj$9$k!#\e(B
+(set-face-foreground 'my-green-bold "ForestGreen")
+(setq gnus-face-2 'my-green-bold)
+
+;; \e$B?7$7$$>eEy$N=qK!;EMM$r@_Dj$9$k!#\e(B
+(setq gnus-group-line-format
+ "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n")
+@end lisp
+
+\e$B$"$J$?$,$3$N0F$r;H$C$F40A4$KFI$a$J$/$FHs>o$K2<IJ$JI=<($r:n$k;v$,$G$-$k$H\e(B
+\e$B3N?.$7$F$$$^$9!#3Z$7$s$G$/$@$5$$!*\e(B
+
+@samp{%(} \e$B;XDj\e(B (\e$B$d$=$NN`$N$b$N\e(B) \e$B$O%b!<%I9TJQ?t$G$OA4$/0UL#$r$J$5$J$$;v$K\e(B
+\e$BCm0U$7$F$/$@$5$$!#\e(B
+
+
+@node Windows Configuration
+@section \e$B%&%#%s%I%&$N@_Dj\e(B
+@cindex windows configuration
+
+\e$B$$$(!"\e(BX \e$B$K4X$9$k;v$O$"$j$^$;$s$N$G!"$*$H$J$7$/$7$F2<$5$$!#\e(B
+
+@vindex gnus-use-full-window
+\e$B$b$7\e(B @code{gnus-use-full-window} \e$B$,\e(B @code{nil} \e$B$G$J$$$H!"\e(Bgnus \e$B$OA4$F$NB>\e(B
+\e$B$N%&%#%s%I%&$r>C$7$F!"\e(BEmacs \e$B$N2hLLA4BN$r@jM-$7$^$9!#$3$l$O=i4|@_Dj$G\e(B
+@code{t} \e$B$G$9!#\e(B
+
+@vindex gnus-buffer-configuration
+@code{gnus-buffer-configuration} \e$B$O$=$l$>$l$N\e(B gnus \e$B$N%P%C%U%!$,$I$N$/$i\e(B
+\e$B$$$N6u4V$rM?$($i$l$k$Y$-$+$r8=$7$^$9!#$3$l$O$3$NJQ?t$NH4?h$G$9\e(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
+
+\e$B$3$l$OO"A[%j%9%H$G$9!#\e(B@dfn{\e$B%-!<\e(B} \e$B$O2?$i$+$NF0:n$dB>$N$b$N$rG$L?$9$k%7%s\e(B
+\e$B%\%k$G$9!#Nc$($P!"%0%k!<%W%P%C%U%!$rI=<($9$k$H$-$O!"%&%#%s%I%&@_Dj4X?t$O\e(B
+@code{group} \e$B$r%-!<$H$7$F;H$$$^$9!#;HMQ2DG=$JL>A0$N40A4$J0lMw$O2<$K5s$2\e(B
+\e$B$i$l$F$$$^$9!#\e(B
+
+@dfn{\e$BCM\e(B} (\e$B$9$J$o$A!"\e(B@dfn{\e$BJ,3d\e(B}) \e$B$O$=$l$>$l$N%P%C%U%!$,$I$l$/$i$$$r@j$a$k\e(B
+\e$B$Y$-$+$r;XDj$7$^$9!#\e(B@code{article} \e$BJ,3d$rNc$K<h$k$H\e(B -
+
+@lisp
+(article (vertical 1.0 (summary 0.25 point)
+ (article 1.0)))
+@end lisp
+
+\e$B$3$N\e(B @dfn{\e$BJ,3d\e(B} \e$B$O35N,%P%C%U%!\e(B (summary buffer) \e$B$,2hLL$N>e$N\e(B 25% \e$B$r@j$a\e(B
+\e$B$k$Y$-$G!"$=$l$O5-;v%P%C%U%!\e(B (article buffer) \e$B$N>e$KG[CV$5$l$^$9!#$*5$$E\e(B
+\e$B$-$NDL$j!"\e(B100% + 25% \e$B$O<B:]$O\e(B 125% \e$B$G$9\e(B (\e$B$($'!"3'$5$s$N7W;;$O$3$NMM$K$J$C\e(B
+\e$B$?$H;W$$$^$9!#\e(B) \e$B$7$+$7!"FCJL$J?t;z\e(B @code{1.0} \e$B$O!";D$j$N%P%C%U%!$,I,MW$J\e(B
+\e$B$b$N$r<h$j5n$C$?8e$K!";HMQ2DG=$J;D$j$N6u4VA4$F$r5[$$<h$k!"$H$$$&;v$r9g?^\e(B
+\e$B$9$k$?$a$K;H$o$l$^$9!#\e(B1\e$B$D$NJ,3d$K$D$-!"\e(B@code{1.0} \e$B$NBg$-$5;XDj$N%P%C%U%!\e(B
+\e$B$O0l$D$@$1$G$J$/$F$O$J$j$^$;$s!#\e(B
+
+\e$B%]%$%s%H$O>JN,2DG=$J\e(B3\e$B$DL\$NMWAG!"\e(B@code{point} \e$B$r;}$D%P%C%U%!$KCV$+$l$^$9!#\e(B
+@code{frame} \e$BJ,3d$G$O!"%?%0\e(B @code{frame-focus} \e$B$,9=@.MWAG$G$"$k\e(B (\e$B$9$J$o\e(B
+\e$B$A!"\e(B@code{point} \e$B%?%0$,B8:_$9$k$+$I$&$+$K$h$C$F!"%j%9%H$N\e(B3\e$BHVL\$+\e(B4\e$BHVL\$+\e(B
+\e$B$KB8:_$9$kMWAG\e(B) \e$BMUJ,3d$r;}$D:G8e$NI{J,3d$,>GE@$rF@$k;v$K$J$j$^$9!#\e(B
+
+\e$B<!$O$b$C$HJ#;($JNc$G$9\e(B:
+
+@lisp
+(article (vertical 1.0 (group 4)
+ (summary 0.25 point)
+ (if gnus-carpal (summary-carpal 4))
+ (article 1.0)))
+@end lisp
+
+\e$B$b$7Bg$-$5;XDj$,IbF0>.?tE@?t$NBe$o$j$K@0?t$G$"$C$?$J$i!"$=$l$O3d9g$G$O$J\e(B
+\e$B$/!"$I$N$/$i$$B?$/$N9T$r%P%C%U%!$,@j$a$k$Y$-$+$r;XDj$9$k$?$a$K;H$o$l$^$9!#\e(B
+
+\e$B$b$7\e(B @dfn{\e$BJ,3d\e(B} \e$B$,\e(B @code{\e$BI>2A\e(B} \e$B$5$l$k$b$N$N$h$&$K8+$($k$H$-$O\e(B (\e$BL@3N$K$9\e(B
+\e$B$k$H\e(B---\e$BJ,3d$N\e(B @code{car} \e$B$,4X?t$+86;O4X?t\e(B (subr) \e$B$G$"$k$H$-$O\e(B)\e$B!"$3$NJ,3d\e(B
+\e$B$O\e(B @code{\e$BI>2A\e(B} \e$B$5$l$^$9!#7k2L$,\e(B @code{nil} \e$B$G$J$$$J$i!"$=$l$OJ,3d$H$7$F\e(B
+\e$BMQ$$$i$l$^$9!#$3$l$O!"\e(B@code{gnus-carpal} \e$B$,\e(B @code{nil} \e$B$G$"$l$P\e(B3\e$B$D$N%P%C\e(B
+\e$B%U%!$,!"\e(B@code{gnus-carpal} \e$B$,\e(B @code{nil} \e$B$G$J$$$J$i!"\e(B4\e$B$D$N%P%C%U%!$,B8:_\e(B
+\e$B$9$k$H$$$&;v$G$9!#\e(B
+
+\e$B$^$@J#;($G$O$J$$$G$9$C$F!)\e(B \e$B$=$l$G$O!"Bg$-$5$K$3$l$r;n$7$F$_$F2<$5$$\e(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
+
+\e$B$*$)$C$H!#\e(B2\e$B$D$N%P%C%U%!$KIT;W5D$J\e(B 100% \e$B%?%0$,IU$$$F$$$^$9!#$=$7$F!"$"$N\e(B
+@code{horizontal} \e$B$C$F$$$&$b$N$O2?$G$7$g$&!)\e(B
+
+\e$B$b$7J,3d$N0l$D$N:G=i$NMWAG$,\e(B @code{horizontal} \e$B$G$"$C$?$J$i!"\e(Bgnus \e$B$O\e(B \e$B%&%#\e(B
+\e$B%s%I%&$r?eJ?$KJ,3d$7!"\e(B2\e$B$D$N%&%#%s%I%&$r2#$KJB$Y$^$9!#$3$l$i$N$=$l$>$l$N\e(B
+\e$B>.JR$NCf$G$O!"A4$F$rIaDL$NN.57$G9T$&;v$,$G$-$^$9!#\e(B@code{horizontal} \e$B$N8e\e(B
+\e$B$N?t;z$O!"$3$N>.JR$K2hLL$N$I$l$/$i$$$N3d9g$,M?$($i$l$k$+$r;XDj$7$^$9!#\e(B
+
+\e$B$=$l$>$l$NJ,3d$G$O!"\e(B100% \e$B$N%?%0$r;}$DMWAG$,\e(B @emph{\e$BI,$:\e(B} \e$B0l$D$"$kI,MW$,$"\e(B
+\e$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\e(B
+\e$B$l$?A4$F$N9T$r@jNN$7$^$9!#\e(B
+
+\e$B$b$&>/$7@5<0$K$9$k$?$a$K!"$3$3$KM-8z$JJ,3d$,$I$N$h$&$K$J$k$+$NDj5A$,$"$j\e(B
+\e$B$^$9\e(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
+
+\e$B@)8B$K$O!"\e(B@code{frame} \e$B$O:G>e0L$NJ,3d$H$7$F$7$+8=$l$k;v$,$G$-$J$$$H$$$&\e(B
+\e$B$b$N$,$"$j$^$9!#\e(B@var{form} \e$B$OM-8z$JJ,3d$rJV$9\e(B Emacs Lisp \e$B$N<0\e(B (form) \e$B$G\e(B
+\e$B$J$1$l$P$J$j$^$;$s!#$=$l$>$l$NJ,3d$O40A4$K:F5"E*$G!"G$0U$N?t$N\e(B
+@code{vertical} \e$B$H\e(B @code{horizontal} \e$BJ,3d$r4^$`;v$,$G$-$^$9!#\e(B
+
+@vindex gnus-window-min-width
+@vindex gnus-window-min-height
+@cindex window height
+@cindex window width
+\e$B@5$7$$Bg$-$5$r8+$D$1$k$N$O>/$7J#;($G$9!#$I$N%&%#%s%I%&$b\e(B
+@code{gnus-window-min-height} (\e$B=i4|CM\e(B 1) \e$B$NJ8;z$N9b$5$h$j$b>.$5$/$F$O$J\e(B
+\e$B$i$:!">/$J$/$H$b\e(B @code{gnus-window-min-width} (\e$B=i4|CM\e(B 1) \e$B$NJ8;zI}$G$J$/\e(B
+\e$B$F$O$J$j$^$;$s!#\e(BGnus \e$B$OJ,3d$rE,MQ$9$kA0$K$3$l$r6/@)$7$h$&$H;n$_$^$9!#$b\e(B
+\e$B$7IaDL$N\e(B Emacs \e$B$N%&%#%s%I%&$NI}\e(B/\e$B9b$5@)8B$r;H$$$?$$$J$i!"$3$N\e(B2\e$B$D$NJQ?t$r\e(B
+@code{nil} \e$B$K$9$k$@$1$GNI$$$G$9!#\e(B
+
+\e$B$b$7\e(B Emacs \e$B$NMQ8l$K$J$8$s$G$$$J$$$N$J$i!"\e(B@code{horizontal} \e$B$H\e(B
+@code{vertical} \e$BJ,3d$O!"4|BT$9$k$b$N$HH?BP$NF0:n$r$9$k$G$7$g$&!#\e(B
+@code{horizontal} \e$BJ,3d$NCf$N%&%#%s%I%&$O2#$KJB$s$GI=<($5$l!"\e(B
+@code{vertical} \e$BJ,3d$NCf$N%&%#%s%I%&$O>e2<$KI=<($5$l$^$9!#\e(B
+
+@findex gnus-configure-frame
+\e$B%&%#%s%I%&$N@_CV$K4X$7$F<B83$r$7$F$_$?$$$N$G$"$l$P!"$h$$J}K!$OJ,3d$GD>@\\e(B
+@code{gnus-configure-frame} \e$B$r8F$V$3$H$G$9!#$3$l$O%P%C%U%!$rJ,3d$9$k$H$-\e(B
+\e$B$KA4$F$NK\Ev$N;E;v$r$9$k4X?t$G$9!#2<$N$b$N$O\e(B5\e$B%&%#%s%I%&$N$H$F$b$P$+$2$?\e(B
+\e$B@_Dj$G$9!#\e(B2\e$B$D$r%0%k!<%W%P%C%U%!$K!"\e(B3\e$B$D$r5-;v%P%C%U%!$N$?$a$K=<$F$^$9!#\e(B
+(\e$B$=$l$O$P$+$2$F$$$k$H8@$C$?$G$7$g!#\e(B) \e$B$b$72<$NJ8$r\e(B @code{\e$BI>2A\e(B} \e$B$9$k$H!"Ia\e(B
+\e$BDL$N\e(B gnus \e$B$N7PO)$r;H$o$J$$$G!"$9$0$K$=$l$,$I$N$h$&$K8+$($k$+$N9M$($rF@$k\e(B
+\e$B;v$,$G$-$^$9!#K~B-$9$k$^$G$=$l$GM7$s$G!"$=$l$+$i\e(B
+@code{gnus-add-configuration} \e$B$r;H$C$F?7$7$$A[A|$r%P%C%U%!@_Dj%j%9%H$K2C\e(B
+\e$B$($F2<$5$$!#\e(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
+
+\e$B$$$/$D$+$N%U%l!<%`$bM_$7$$$+$b$7$l$^$;$s!#4JC1$G$9\e(B---@code{frame} \e$BJ,3d$r\e(B
+\e$B;H$&$@$1$G$9\e(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
+
+\e$B$3$NJ,3d$N7k2L$O!":G=i\e(B (\e$B$b$7$/$O!"\e(B``\e$B<g$J\e(B'') \e$B%U%l!<%`$O8+47$l$?35N,\e(B/\e$B5-;v\e(B
+\e$B%&%#%s%I%&@_Dj$G!">.$5$JDI2C$N%U%l!<%`$,\e(B picon \e$B$rI=<($9$k$?$a$K:n$i$l$k\e(B
+\e$B$H$$$&;v$K$J$j$^$9!#$4Mw$NDL$j!"IaDL$N\e(B @code{1.0} \e$B:G>e0L;XDj$NBe$o$j$K!"\e(B
+\e$B$=$l$>$l$NDI2C$NJ,3d$,%U%l!<%`%Q%i%a!<%?O"A[%j%9%H$rBg$-$5;XDj$H$7$F;}$?\e(B
+\e$B$J$1$l$P$J$j$^$;$s!#\e(B@xref{Frame Parameters, , Frame Parameters, elisp,
+The GNU Emacs Lisp Reference Manual}. XEmacs \e$B$G$O!"%U%l!<%`%W%m%Q%F%#%j\e(B
+\e$B%9%H$b;H$($^$9\e(B---\e$BNc$($P!"\e(B@code{(height 5 width 15 left -1 top 1)} \e$B$O$=$N\e(B
+\e$B$h$&$J%Q%i%a!<%?%j%9%H$G$9!#\e(B
+
+\e$B$3$l$O\e(B @code{gnus-buffer-configuration} \e$B$K;EMM2DG=$J%-!<$N0lMw$G$9\e(B:
+
+@code{group}\e$B!"\e(B@code{summary}\e$B!"\e(B@code{article}\e$B!"\e(B@code{server}\e$B!"\e(B
+@code{browse}\e$B!"\e(B@code{message}\e$B!"\e(B@code{pick}\e$B!"\e(B@code{info}\e$B!"\e(B
+@code{summary-faq}\e$B!"\e(B@code{edit-group}\e$B!"\e(B@code{edit-server}\e$B!"\e(B
+@code{edit-score}\e$B!"\e(B@code{post}\e$B!"\e(B@code{reply}\e$B!"\e(B@code{forward}\e$B!"\e(B
+@code{reply-yank}\e$B!"\e(B@code{mail-bounce}\e$B!"\e(B@code{draft}\e$B!"\e(B@code{pipe}\e$B!"\e(B
+@code{bug}\e$B!"\e(B@code{compose-bounce}\e$B!"\e(B@code{score-trace}\e$B!#\e(B
+
+\e$B%-!<\e(B @code{message} \e$B$O\e(B @code{gnus-group-mail} \e$B$H\e(B
+@code{gnus-summary-mail-other-window} \e$B$NN>J}$G;H$o$l$k;v$KCm0U$7$F2<$5$$!#\e(B
+\e$B$b$7\e(B2\e$B$D$r6hJL$9$k$[$&$,K>$^$7$$$J$i!"$3$N$h$&$JJ*$r;H$&;v$,$G$-$^$9\e(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
+\e$BJQ?t\e(B @code{gnus-buffer-configuration} \e$B$O$H$F$bD9$/J#;($J$N$G!"C10l$N@_Dj\e(B
+\e$B$NJQ99$r4JC1$K$9$k$?$a$N4X?t$,$"$j$^$9\e(B: @code{gnus-add-configuration} \e$B$G\e(B
+\e$B$9!#$b$7!"Nc$($P!"\e(B@code{article} \e$B$N@_Dj$rJQ$($?$$$N$J$i!"<!$N$h$&$K$G$-\e(B
+\e$B$^$9\e(B:
+
+@lisp
+(gnus-add-configuration
+ '(article (vertical 1.0
+ (group 4)
+ (summary .25 point)
+ (article 1.0))))
+@end lisp
+
+\e$BIaDL$O$3$l$i$N\e(B @code{gnus-add-configuration} \e$B8F$S=P$7$r%U%!%$%k\e(B
+@code{.gnus.el} \e$B$KF~$l$k$+!"2?$i$+$N5/F0;~$N%U%C%/$KF~$l$k$G$7$g$&\e(B---\e$B$=\e(B
+\e$B$l$i$O\e(B gnus \e$B$,FI$_9~$^$l$?8e$K<B9T$5$l$k$Y$-$G$9!#\e(B
+
+@vindex gnus-always-force-window-configuration
+\e$B$b$7@_Dj$G8@5Z$5$l$?A4$F$N%&%#%s%I%&$,4{$K8+$($F$$$k$N$G$"$l$P!"\e(Bgnus \e$B$O\e(B
+\e$B%&%#%s%I%&$N@_Dj$rJQ99$7$^$;$s!#$b$7>o$K\e(B ``\e$B@5$7$$\e(B'' \e$B%&%#%s%I%&@_Dj$r6/@)\e(B
+\e$B$7$?$$$N$G$"$l$P!"\e(B@code{gnus-always-force-window-configuration} \e$B$r\e(B
+@code{nil} \e$B$G$J$$CM$K@_Dj$9$k;v$,$G$-$^$9!#\e(B
+
+
+@node Faces and Fonts
+@section \e$B%U%'%$%9$H%U%)%s%H\e(B
+@cindex faces
+@cindex fonts
+@cindex colors
+
+\e$B%U%)%s%H$H%U%'%$%9$rO.$k$N$OHs>o$KFq$7$+$C$?$N$G$9$,!":#F|$G$OHs>o$K4JC1\e(B
+\e$B$G$9!#C1$K\e(B @kbd{M-x customize-face} \e$B$H$d$C$F!"JQ$($?$$%U%'%$%9$rA*$S=P$7\e(B
+\e$B$F!"I8=`$N%+%9%?%^%$%:%$%s%?!<%U%'!<%9$r;H$C$FJQ99$9$k;v$,$G$-$^$9!#\e(B
+
+
+@node Compilation
+@section \e$B%3%s%Q%$%k\e(B
+@cindex compilation
+@cindex byte-compilation
+
+@findex gnus-compile
+
+\e$B$"$N9T=qK!;EMM;XDjJQ?t$r3P$($F$$$^$9$+!)\e(B @code{gnus-summary-line-format}\e$B!"\e(B
+@code{gnus-group-line-format} \e$B$J$I$J$I$G$9!#$5$F!"\e(Bgnus \e$B$O$b$A$m$s$3$l$i\e(B
+\e$B$NJQ?t$,$I$N$h$&$J$b$N$G$bCm0U$7$^$9$,!"IT1?$J;v$K!"$=$l$i$rJQ99$9$k$H!"\e(B
+\e$BBgJQ=EBg$JB.EYDc2<$r0z$-5/$3$9;v$K$J$j$^$9!#\e(B (\e$B$3$l$i$NJQ?t$N=i4|CM$O$=$l\e(B
+\e$B$i$K4XO"IU$1$i$l$?%P%$%H%3%s%Q%$%k$5$l$?4X?t$r;}$C$F$$$^$9$,!"MxMQ<T:n@.\e(B
+\e$B$N$b$N$O$b$A$m$s$=$&$G$O$"$j$^$;$s!#\e(B)
+
+\e$B$3$l$r2~A1$9$k$?$a$K!"JQ?t$rO.$j$^$o$7$F!"\e(B(\e$B$J$s$H$J$/\e(B) \e$BK~B-$7$?$H46$8$?\e(B
+\e$B8e$G!"\e(B@kbd{M-x gnus-compile} \e$B$r<B9T$9$k;v$,$G$-$^$9!#$3$l$O?7$7$$;XDj$,\e(B
+\e$B%P%$%H%3%s%Q%$%k$5$l!"$b$&0lEY:G9bB.EY$KI|5"$G$-$k$H$$$&;v$G$9!#\e(BGnus \e$B$O\e(B
+\e$B$3$l$i$N%3%s%Q%$%k$5$l$?;XDj$r%U%!%$%k\e(B @file{.newsrc.eld} \e$B$KJ]B8$7$^$9!#\e(B
+(\e$BMxMQ<TDj5A$N4X?t$O!"$3$N4X?t$G$O%3%s%Q%$%k$5$l$^$;$s$,\e(B--\e$B$=$l$i$r%3%s%Q\e(B
+\e$B%$%k$9$k$?$a$K$O!"$=$l$i$r%U%!%$%k\e(B @code{.gnus.el} \e$B$KFM$C9~$s$G!"$=$N%U%!\e(B
+\e$B%$%k$r%P%$%H%3%s%Q%$%k$9$k$Y$-$G$9!#\e(B)
+
+
+@node Mode Lines
+@section \e$B%b!<%I9T\e(B
+@cindex mode lines
+
+@vindex gnus-update-mode-lines
+@code{gnus-updated-mode-lines} \e$B$O$I$N%P%C%U%!$,$=$N%b!<%I9T$r>o$K:G?7$N\e(B
+\e$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\e(B
+\e$B%7%s%\%k$O\e(B @code{group} \e$B!"\e(B@code{article}\e$B!"\e(B@code{summary}\e$B!"\e(B@code{server}\e$B!"\e(B
+@code{browse}\e$B!"\e(B@code{tree} \e$B$J$I$G$9!#$b$7BP1~$9$k%7%s%\%k$,B8:_$9$k$H!"\e(B
+gnus \e$B$O3:Ev$9$k$G$"$m$&>pJs$G%b!<%I9T$r99?7$7$^$9!#$3$NJQ?t$,\e(B @code{nil}
+\e$B$G$"$k$J$i!"2hLL$N:FIA2h$O$b$C$HB.$$$G$7$g$&!#\e(B
+
+@cindex display-time
+
+@vindex gnus-mode-non-string-length
+\e$B=i4|@_Dj$G$O!"\e(Bgnus \e$B$O35N,%P%C%U%!$H5-;v%P%C%U%!$N%b!<%I9T$K8=:_$N5-;v$N\e(B
+\e$B>pJs$rI=<($7$^$9!#\e(BGnus \e$B$,I=<($7$?$$>pJs\e(B (\e$BNc$($P!"5-;v$NI=Bj\e(B) \e$B$O$7$P$7$P\e(B
+\e$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!#\e(B
+\e$BJQ?t\e(B @code{gnus-mode-non-string-length} \e$B$O$=$N9T$NB>$NMWAG\e(B (\e$B$9$J$o$A!">p\e(B
+\e$BJs$G$J$$ItJ,\e(B) \e$B$,$I$N$/$i$$$ND9$5$G$"$k$+$r;XDj$7$^$9!#$b$7%b!<%I9T$KDI2C\e(B
+\e$B$NMWAG$rF~$l$?$J$i!"$3$NJQ?t$r=$@5$9$kI,MW$,$"$j$^$9\e(B:
+
+@c Hook written by Francesco Potorti` <pot@cnuce.cnr.it>
+@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
+
+\e$B$b$7$3$NJQ?t$,\e(B @code{nil} \e$B$G$"$k$J$i\e(B (\e$B$3$l$,=i4|CM$G$9$,\e(B)\e$B!"%b!<%I9T$O@Z\e(B
+\e$B$jMn$H$5$l$:!"5M$a9~$_$b$5$l$^$;$s!#=i4|@_Dj$O!"%P%C%U%!$N40A4$J%Q!<%;%s\e(B
+\e$B%HI=<($5$($b%b!<%I9T$+$iDI$$$d$i$l$k2DG=@-$b$"$j$^$9$N$G!"$*$=$i$/K>$^$7\e(B
+\e$B$$@_Dj$G$O$J$$$H$$$&;v$KCm0U$7$F2<$5$$!#MxMQ<T$,<+J,$N@_Dj$K9g$&$h$&$K$3\e(B
+\e$B$NJQ?t$rE,@Z$K@_Dj$7$J$1$l$P$J$j$^$;$s!#\e(B
+
+
+@node Highlighting and Menus
+@section \e$B%O%$%i%$%H$H%a%K%e!<\e(B
+@cindex visual
+@cindex highlighting
+@cindex menus
+
+@vindex gnus-visual
+\e$BJQ?t\e(B @code{gnus-visual} \e$B$O$?$$$F$$$N\e(B gnus \e$B$rAGE($K$9$kItJ,$NA`:n$r$7$^$9!#\e(B
+@code{nil} \e$B$G$"$k$H!"\e(Bgnus \e$B$O%a%K%e!<$r:n$C$?$j!"AGE($J?'$d%U%)%s%H$r;H$C\e(B
+\e$B$?$j$7$h$&$H$7$^$;$s!#$3$l$O%U%!%$%k\e(B @file{gnus-vis.el} \e$B$rFI$_9~$`;v$b6X\e(B
+\e$B;_$7$^$9!#\e(B
+
+\e$B$3$NJQ?t$O;EMM2DG=$J;k3PE*%W%m%Q%F%#$N%j%9%H$G$"$k;v$,$G$-$^$9!#0J2<$NMW\e(B
+\e$BAG$OM-8z$G!"=i4|@_Dj$G$9$Y$F4^$^$l$F$$$^$9\e(B:
+
+@table @code
+@item group-highlight
+\e$B%0%k!<%W%P%C%U%!$G%O%$%i%$%H$r$7$^$9!#\e(B
+@item summary-highlight
+\e$B35N,%P%C%U%!$G%O%$%i%$%H$r$7$^$9!#\e(B
+@item article-highlight
+\e$B5-;v%P%C%U%!$G%O%$%i%$%H$r$7$^$9!#\e(B
+@item highlight
+\e$BA4$F$N%P%C%U%!$G%O%$%i%$%H$r$9$k$h$&$K$7$^$9!#\e(B
+@item group-menu
+\e$B%0%k!<%W%P%C%U%!$G%a%K%e!<$r:n@.$7$^$9!#\e(B
+@item summary-menu
+\e$B35N,%P%C%U%!$G%a%K%e!<$r:n@.$7$^$9!#\e(B
+@item article-menu
+\e$B5-;v%P%C%U%!$G%a%K%e!<$r:n@.$7$^$9!#\e(B
+@item browse-menu
+\e$B%V%i%&%:%P%C%U%!$G%a%K%e!<$r:n@.$7$^$9!#\e(B
+@item server-menu
+\e$B%5!<%P!<%P%C%U%!$G%a%K%e!<$r:n@.$7$^$9!#\e(B
+@item score-menu
+\e$B%9%3%"%P%C%U%!$G%a%K%e!<$r:n@.$7$^$9!#\e(B
+@item menu
+\e$BA4$F$N%P%C%U%!$G%a%K%e!<$r:n@.$7$^$9!#\e(B
+@end table
+
+\e$B$G$9$+$i!"5-;v%P%C%U%!$@$1$r%O%$%i%$%H$7$?$/!"A4$F$N%P%C%U%!$G%a%K%e!<$r\e(B
+\e$B:n$j$?$$>l9g$O!"$3$N$h$&$K$9$k;v$,$G$-$^$9\e(B:
+
+@lisp
+(setq gnus-visual '(article-highlight menu))
+@end lisp
+
+\e$B$b$7%O%$%i%$%H$@$1$G!"%a%K%e!<$NN`$OM_$7$/$J$$$H$-$O!"<!$N$h$&$K$G$-$^$9\e(B:
+
+@lisp
+(setq gnus-visual '(highlight))
+@end lisp
+
+@code{gnus-visual} \e$B$,\e(B @code{t} \e$B$G$"$k$H!"%O%$%i%$%H$H%a%K%e!<$OA4$F$N\e(B
+gnus \e$B$N%P%C%U%!$G;HMQ$5$l$^$9!#\e(B
+
+\e$BB>$NA4$F$N%P%C%U%!$N308+$K1F6A$9$kAm9gE*$JJQ?t$O\e(B:
+
+@table @code
+@item gnus-mouse-face
+@vindex gnus-mouse-face
+\e$B$3$l$O\e(B gnus \e$B$G%^%&%9$N%O%$%i%$%H$K;H$o$l$k%U%'%$%9\e(B (\e$B$9$J$o$A!"%U%)%s%H\e(B)
+\e$B$G$9!#\e(B@code{gnus-visual} \e$B$,\e(B @code{nil} \e$B$G$"$k$H!"%^%&%9%O%$%i%$%H$O$J$5\e(B
+\e$B$l$^$;$s!#\e(B
+
+@end table
+
+\e$BA4$/0c$C$?%a%K%e!<$r:n@.$9$k$?$a$K4XO"$9$k%U%C%/$,$"$j$^$9\e(B:
+
+@table @code
+
+@item gnus-article-menu-hook
+@vindex gnus-article-menu-hook
+\e$B5-;v%b!<%I\e(B (article mode) \e$B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#\e(B
+
+@item gnus-group-menu-hook
+@vindex gnus-group-menu-hook
+\e$B%0%k!<%W%b!<%I\e(B (group mode) \e$B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#\e(B
+
+@item gnus-summary-menu-hook
+@vindex gnus-summary-menu-hook
+\e$B35N,%b!<%I\e(B (summary mode) \e$B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#\e(B
+
+@item gnus-server-menu-hook
+@vindex gnus-server-menu-hook
+\e$B%5!<%P!<%b!<%I\e(B (server mode) \e$B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#\e(B
+
+@item gnus-browse-menu-hook
+@vindex gnus-browse-menu-hook
+\e$B354Q%b!<%I\e(B (browse mode) \e$B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#\e(B
+
+@item gnus-score-menu-hook
+@vindex gnus-score-menu-hook
+\e$B%9%3%"%b!<%I\e(B (score mode) \e$B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#\e(B
+
+@end table
+
+
+@node Buttons
+@section \e$B%\%?%s\e(B
+@cindex buttons
+@cindex mouse
+@cindex click
+
+\e$B:G6a$G$O!":G?7N.9T$N%^%&%9\e(B @dfn{mouse} \e$BAuCV$,!"$A$c$s$H$7$?A`:nK!$r3X$S\e(B
+\e$B$?$,$i$J$$%J%&$J%d%s%0$N4V$GBg?M5$$G$9!#$=$l$G$O!";d$,\e(BTops 20 \e$B%7%9%F%`>e\e(B
+\e$B$G\e(B Emacs \e$B$r;H$C$F$$$?:"$N\e(B '89 \e$BG/$N2F$r;W$$5/$3$7$F$_$^$7$g$&!#\e(B300 \e$B?M$NMx\e(B
+\e$BMQ<T$,!"0l$D$N%^%7%s>e$G!"$_$s$J$,\e(B Simula \e$B%3%s%Q%$%i$rAv$i$;$F$$$^$7$?!#\e(B
+\e$B$"$"!"$P$+$P$+$7$$\e(B!
+
+\e$B$[$s$H$K$=$&$@$M!#\e(B
+
+@vindex gnus-carpal
+\e$B$^$:$G$9$M!"\e(B@code{gnus-carpal} \e$B$r\e(B @code{t} \e$B$K@_Dj$9$k$3$H$K$h$C\e(B
+\e$B$F!"%/%j%C%/$9$k$@$1$G2?$G$b$G$-$k%\%?%s$@$i$1$N%P%C%U%!$r\e(B gnus
+\e$B$KI=<($5$;$k$3$H$,$G$-$^$9!#$H$C$F$b4JC1$G$9!"$[$s$H$K!#;X05NEK!\e(B
+\e$B$N@h@8$K65$($F$"$2$F!#\e(B(\e$BLuCm\e(B: carpal \e$B$H$O<j<s$N9|$N$3$H\e(B)
+
+
+@table @code
+
+@item gnus-carpal-mode-hook
+@vindex gnus-carpal-mode-hook
+\e$BA4$F$N<j<s%b!<%I%P%C%U%!$G<B9T$9$k%U%C%/!#\e(B
+
+@item gnus-carpal-button-face
+@vindex gnus-carpal-button-face
+Face used on buttons.
+\e$B%\%?%s$K;H$o$l$k%U%'%$%9!#\e(B
+
+@item gnus-carpal-header-face
+@vindex gnus-carpal-header-face
+\e$B<j<s%P%C%U%!$N%X%C%@!<$G;HMQ$5$l$k%U%'%$%9!#\e(B
+
+@item gnus-carpal-group-buffer-buttons
+@vindex gnus-carpal-group-buffer-buttons
+\e$B%0%k!<%W%P%C%U%!$N%\%?%s!#\e(B
+
+@item gnus-carpal-summary-buffer-buttons
+@vindex gnus-carpal-summary-buffer-buttons
+\e$B35N,%P%C%U%!$N%\%?%s!#\e(B
+
+@item gnus-carpal-server-buffer-buttons
+@vindex gnus-carpal-server-buffer-buttons
+\e$B%5!<%P!<%P%C%U%!$N%\%?%s!#\e(B
+
+@item gnus-carpal-browse-buffer-buttons
+@vindex gnus-carpal-browse-buffer-buttons
+\e$B1\Mw%P%C%U%!$N%\%?%s!#\e(B
+@end table
+
+\e$BA4$F$N\e(B @code{buttons} \e$BJQ?t$O%j%9%H$G$9!#$3$N%j%9%H$NMWAG$O!"\e(B
+@code{car} \e$B$,I=<($5$l$kJ8$G\e(B @code{cdr} \e$B$,4X?t%7%s%\%k$N\e(B cons \e$B%;\e(B
+\e$B%k$+!"$b$7$/$O$?$@$NJ8;zNs$N$I$A$i$+$G$9!#\e(B
+
+
+@node Daemons
+@section \e$B%G!<%b%s\e(B
+@cindex demons
+@cindex daemons
+
+Gnus\e$B!"$=$l$O\e(B(\e$B8@$$EA$($K$h$l$P\e(B)\e$B$+$D$F=q$+$l$?$$$+$J$k%W%m%0%i%`$h\e(B
+\e$B$j$bBg$-$/!"$"$J$?$,$d$C$FM_$7$$$H;W$&$5$^$6$^$J4qL/$J$3$H$r!"$"\e(B
+\e$B$J$?$N$$$J$$$H$3$m$G9T$C$F$/$l$k$b$N$G$9!#Nc$($P!"$"$J$?$O;~$?$^\e(B
+\e$B?7Ce%a!<%k$r%A%'%C%/$7$F$b$i$$$?$/$J$k$+$bCN$l$^$;$s!#$"$k$$$O\e(B
+Emacs \e$B$r$7$P$i$/J|$C$F$*$$$?$H$-A4$F$N%5!<%P$N@\B3$r@ZCG$7$F$b$i\e(B
+\e$B$$$?$/$J$k$+$b$7$l$^$;$s!#B>$K$b2?$+$=$&$$$C$?$3$H$G$9!#\e(B
+
+Gnus \e$B$O$5$^$6$^$J@)8f;R\e(B @dfn{handlers} \e$B$rDj5A$9$k$3$H$K$h$C$F$=\e(B
+\e$B$N$h$&$J$3$H$r2DG=$K$7$^$9!#3F@)8f;R$O;0$D$NMWAG$+$i@.$j$^$9!#\e(B
+@var{\e$B4X?t\e(B}\e$B!"\e(B@var{\e$B;~4V\e(B}\e$B!"\e(B@var{\e$B6uE>\e(B} \e$B%Q%i%a!<%?$G$9!#\e(B
+
+\e$B0J2<$O\e(B Emacs \e$B$,2?$b$7$J$$6uE>>uBV$,;0==J,B3$$$?$H$-$K@\B3$r@ZCG\e(B
+\e$B$9$k@)8f;R$NNc$G$9!#\e(B
+
+@lisp
+(gnus-demon-close-connections nil 30)
+@end lisp
+
+\e$B0J2<$O\e(B Emacs \e$B$,2?$b$7$F$$$J$$$H$-!"0l;~4VKh$K\e(B PGP \e$B%X%C%@!<$rAv::\e(B
+\e$B$9$k@)8f;R$G$9!#\e(B
+
+@lisp
+(gnus-demon-scan-pgp 60 t)
+@end lisp
+
+\e$B$3$N\e(B @var{\e$B;~4V\e(B} \e$B%Q%i%a!<%?$H$=$7$F\e(B @var{\e$B6uE>\e(B} \e$B%Q%i%a!<%?$O!"4qL/\e(B
+\e$B$G$+$DAG@2$i$7$$J}K!$G0l=o$KF0:n$7$^$9!#4pK\E*$K$O!"\e(B@var {\e$B6uE>\e(B}
+\e$B$,\e(B @code{nil} \e$B$N;~$K$O$3$N4X?t$O\e(B @var{\e$B;~4V\e(B} \e$BJ,Kh$K8F$S=P$5$l$^$9!#\e(B
+
+\e$B$b$7\e(B @var{\e$B6uE>\e(B} \e$B$,\e(B @code{t} \e$B$G$"$l$P!"$3$N4X?t$O\e(B Emacs \e$B$,2?$b$7\e(B
+\e$B$F$$$J$$;~$K8B$j!"\e(B@var{\e$B;~4V\e(B} \e$BJ,8e$K8F$S=P$5$l$^$9!#0lC6\e(B Emacs \e$B$,\e(B
+\e$B$:$C$H6uE>>uBV$K$J$C$?8e$O!"$3$N4X?t$O\e(B @var{\e$B;~4V\e(B} \e$BJ,Kh$K8F$S=P$5\e(B
+\e$B$l$^$9!#\e(B
+
+@var{\e$B6uE>\e(B} \e$B$,?t$G\e(B @var{\e$B;~4V\e(B} \e$B$b?t$G$"$k>l9g!"$3$N4X?t$O!"\e(B Emacs
+\e$B$N6uE>>uBV$,\e(B @var{\e$B6uE>\e(B} \e$BJ,B3$$$?;~$K8B$j!"\e(B@var{\e$B;~4V\e(B} \e$BJ,Kh$K8F$S\e(B
+\e$B=P$5$l$^$9!#\e(B
+
+@var{\e$B6uE>\e(B} \e$B$,?t$G\e(B @var{\e$B;~4V\e(B} \e$B$,\e(B @code{nil} \e$B$N>l9g!"$3$N4X?t$O!"\e(B
+Emacs \e$B$N6uE>>uBV$,\e(B @var{\e$B6uE>\e(B} \e$BJ,B3$/EY$K0lEY8F$S=P$5$l$^$9!#\e(B
+
+\e$B$=$7$F\e(B @var{\e$B;~4V\e(B} \e$B$,J8;zNs$N>l9g$O!"\e(B@samp{07:31} \e$B$N$h$&$J7A<0$G\e(B
+\e$B$J$1$l$P$J$i$:!"$3$N4X?t$OKhF|$=$N:"$N;~4V$K$J$k$H0lEY8F$S=P$5$l\e(B
+\e$B$^$9!#$b$A$m$s!"\e(B@var{\e$B6uE>\e(B} \e$B%Q%i%a!<%?$GF0:n$,JQ$o$j$^$9!#\e(B
+
+@vindex gnus-demon-timestep
+(\e$B$3$3$G\e(B ``\e$BJ,\e(B'' \e$B$H8@$C$?$H$-!"$=$l$O<B:]$K$O\e(B
+@code{gnus-demon-timestep} \e$BIC$N$3$H$G$9!#$3$l$O=i4|@_Dj$G$O\e(B 60\e$B$G\e(B
+\e$B$9!#$b$7$3$NJQ?t$rJQ99$9$k$H!"A4$F$N@)8f;R$N7W;~$K1F6A$rM?$($^$9!#\e(B)
+
+@vindex gnus-use-demon
+\e$B$b$C$H$b!"$3$l$iA4It$r1?E>$9$k$h$&$K@_Dj$9$k$K$O!"\e(B
+@code{gnus-use-demon} \e$B$r\e(B @code{t} \e$B$K@_Dj$7$J$-$c$$$1$J$$$s$@$1$I\e(B
+\e$B$M!#\e(B
+
+\e$B$H$$$&$o$1$G!"@)8f;R$rDI2C$7$?$1$l$P!"\e(B @file{.gnus} \e$B%U%!%$%k$K!"\e(B
+\e$B0J2<$N$h$&$J$b$N$r=q$/$3$H$,$G$-$^$9!#\e(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
+\e$B$3$N$?$a$N4{@=4X?t$,$$$/$D$+:n@.$5$l$F$$$^$9!#\e(B
+@code{gnus-demon-add-nocem}\e$B!"\e(B
+@code{gnus-demon-add-disconnection}\e$B!"\e(B
+@code{gnus-demon-add-nntp-close-connection}\e$B!"\e(B
+@code{gnus-demon-add-scan-timestamps}\e$B!"\e(B
+@code{gnus-demon-add-rescan}\e$B!"\e(B@code{gnus-demon-add-scanmail} \e$B$G\e(B
+\e$B$9!#$3$l$i$NG=NO$,M_$7$1$l$P!"C1$K$3$l$i$N4X?t$r\e(B @file{.gnus} \e$B$K\e(B
+\e$BF~$l$F$/$@$5$$!#\e(B
+
+@findex gnus-demon-init
+@findex gnus-demon-cancel
+@vindex gnus-demon-handlers
+\e$B$b$7\e(B @code{gnus-demon-handlers} \e$B$G@)8f;R$rD>@\DI2C$7$?>l9g$K$O!"\e(B
+\e$B$=$l$r8z$+$;$k$?$a$K\e(B @code{gnus-demon-init} \e$B$r<B9T$7$F$/$@$5$$!#\e(B
+\e$BA4$F$N%G!<%b%s$r<h$j>C$9$K$O!"\e(B@code{gnus-demon-cancel} \e$B4X?t$r;H\e(B
+\e$B$&$3$H$,$G$-$^$9!#\e(B
+
+\e$B%G!<%b%s$NDI2C$O!"$d$j$9$.$k$N$O$H$C$F$b$*9T57$N$h$/$J$$$3$H$G$9!#\e(B
+\e$BA4$F$N%5!<%P!<$+$iA4$F$N%K%e!<%9$H%a!<%k$rFsICKh$KD4$Y$^$o$94X?t\e(B
+\e$B$rIU$12C$($A$c$C$?$j$9$k$H!"$I$s$JN)GI$J%7%9%F%`$G$b4V0c$$$J$/$*\e(B
+\e$BJ'$$H"$K$7$F$7$^$$$^$9!#$=$&F0$/$s$@$b$s!#\e(B
+
+
+@node NoCeM
+@section NoCeM
+@cindex nocem
+@cindex spam
+
+\e$B%9%Q%`\e(B @dfn{Spam} \e$B$H$O!"F1$85-;v$r2?2s$b2?2s$b2?2s$bEj9F$9$k$3$H\e(B
+\e$B$G$9!#%9%Q%`$O0-$$$3$H$G$9!#%9%Q%`$O6'0-$G$9!#\e(B
+
+\e$B%9%Q%`$ODL>o0lF|$+$=$3$i$G!"$5$^$6$^$JH?%9%Q%`5!4X$+$i<h$j>C$7$5\e(B
+\e$B$l$^$9!#$3$l$i$N5!4X$ODL>o0l=o$K!"\e(B@dfn{NoCeM} \e$B%a%C%;!<%8$bAw?.$7\e(B
+\e$B$^$9!#\e(B@dfn{NoCeM} \e$B$O\e(B ``no see-'em'' (\e$BH`$i$r8+$?$/$J$$\e(B)\e$B$HH/2;$5$l!"\e(B
+\e$B0UL#$O$=$NL>A0$NDL$j$G$9\e(B --- \e$B$3$N%a%C%;!<%8$O!":a$rHH$7$F$$$k5-\e(B
+\e$B;v$r!"$D$^$j!">C$7$F$7$^$$$^$9!#\e(B
+
+\e$B$I$&$;$=$N5-;v$,<h$j>C$7$5$l$F$7$^$&$N$J$i!"$3$l$i\e(B NoCeM \e$B%a%C%;!<\e(B
+\e$B%8$O2?$K;H$o$l$k$N$G$7$g$&\e(B? \e$B$"$k%5%$%H$G$O<h$j>C$7%a%C%;!<%8$r0z\e(B
+\e$B$-<u$1$:!"$"$k%5%$%H$G$OFCDj$N?t?M$+$i$N<h$j>C$7%a%C%;!<%8$N$_$7\e(B
+\e$B$+0z$-<u$1$^$;$s!#$=$l$G!"$"$J$?$O\e(B NoCeM \e$B%a%C%;!<%8$r;H$$$?$/$J\e(B
+\e$B$k$+$b$7$l$J$$$o$1$G$9!#$3$l$i$O\e(B @samp{alt.nocem.misc} \e$B%K%e!<%9\e(B
+\e$B%0%k!<%W$GG[I[$5$l$F$$$^$9!#\e(B
+
+Gnus \e$B$O$3$N%0%k!<%W$N%a%C%;!<%8$r<+F0E*$KFI$_!"2r<a$9$k$3$H$,$G\e(B
+\e$B$-!"$3$l$G%9%Q%`$r>C$75n$j$^$9!#\e(B
+
+\e$B$b$A$m$s!"$3$l$i$r%+%9%?%^%$%:$9$k$?$a$NJQ?t$,$$$/$D$+$"$j$^$9!#\e(B
+
+@table @code
+@item gnus-use-nocem
+@vindex gnus-use-nocem
+\e$B$3$NJQ?t$r\e(B @code{t} \e$B$K@_Dj$9$k$3$H$G3hF0$r3+;O$5$;$^$9!#=i4|@_Dj\e(B
+\e$B$G$O\e(B @code{nil} \e$B$G$9!#\e(B
+
+@item gnus-nocem-groups
+@vindex gnus-nocem-groups
+Gnus \e$B$O$3$N%0%k!<%W%j%9%H$+$i\e(B NoCeM \e$B%a%C%;!<%8$rC5$7$^$9!#=i4|@_\e(B
+\e$BDjCM$O\e(B @code{("news.lists.filters" "news.admin.net-abuse.bulletins"
+"alt.nocem.misc" "news.admin.net-abuse.announce")} \e$B$G$9!#\e(B
+
+@item gnus-nocem-issuers
+@vindex gnus-nocem-issuers
+NoCeM \e$B%a%C%;!<%8$rH/9T$9$k?M$O$?$/$5$s$$$^$9!#$3$N%j%9%H$G$O!"C/\e(B
+\e$B$N8@$&$3$H$K=>$$$?$$$+$r;XDj$7$^$9!#=i4|@_DjCM$O\e(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)")} \e$B$G$9!#H`$i$O$_$s$J!"N)GI$G9b7i$J;TL1$G$9!#\e(B
+
+\e$B$3$N%j%9%H$K4^$a$i$l$kM-L>$JH?%9%Q%`2H$O0J2<$G$9!#\e(B
+
+@table @samp
+@item clewis@@ferret.ocunix.on.ca;
+@cindex Chris Lewis
+Chris Lewis --- \e$B<gMW$J%+%J%@$NH?%9%Q%`2H!#$*$=$i$/C/$h$j$bB?$/!"\e(B
+\e$B%M%C%H%K%e!<%9$NMtMQ$r<h$j>C$7$F$$$^$9!#\e(B
+
+@item Automoose-1
+@cindex CancelMoose[tm]
+\e$B<+F01?E>$N\e(B CancelMoose[tm]\e$B!#\e(B CancelMoose[tm] \e$B$O%N%k%&%'!<?M$H$5\e(B
+\e$B$l!"\e(BNoCeM \e$B$rH/L@$7$??M$G$7$?!#\e(B
+
+@item jem@@xpat.com;
+@cindex Jem
+John Milburn --- \e$B4Z9q$NH?%9%Q%`2H!#:G6a$O$+$J$jK;$7$/$J$C$F$-$F\e(B
+\e$B$$$k$h$&$G$9!#\e(B
+
+@item red@@redpoll.mrfs.oh.us (Richard E. Depew)
+Richard E. Depew --- \e$B%"%a%j%+$NC1FHH?%9%Q%`2H!#<g$KHs%P%$%J%j%0\e(B
+\e$B%k!<%W$X$N%P%$%J%jEj9F$N<h$j>C$7$H!"\e(Bspew (\e$B5UN.5-;v\e(B) \e$B$r:o=|$7$F$$\e(B
+\e$B$^$9!#\e(B
+@end table
+
+\e$B$3$l$iA4$F$N?M!9$N\e(B NoCeM \e$B%a%C%;!<%8$KN10U$9$kI,MW$O$"$j$^$;$s\e(B
+--- \e$B8@$&$3$H$rJ9$-$?$$?M$@$1$G$$$$$s$G$9!#$^$?$=$N?M$+$i$N\e(B NoCeM
+\e$B%a%C%;!<%8A4$F$r<u$1F~$l$kI,MW$b$"$j$^$;$s!#\e(BNoCeM \e$B%a%C%;!<%8$K$O\e(B
+\e$B$=$l$>$l<oJL\e(B @dfn{type} \e$B%X%C%@!<$,$D$$$F$*$j!"$3$l$O$=$N%a%C%;!<\e(B
+\e$B%8$N87L)$JDj5A$rM?$($F$$$^$9\e(B(\e$BB?>/$O87L)$J!"DxEY$M!#$?$$$F$$$O>/\e(B
+\e$B$@$1$I\e(B)\e$B!#NI$/;H$o$l$k<oJL$K$O!"\e(B@samp{spam}\e$B!"\e(B @samp{spew}\e$B!"\e(B
+@samp{mmf}\e$B!"\e(B@samp{binary}\e$B!"\e(B@samp{troll} \e$B$,$"$j$^$9!#$3$l$r;XDj$9\e(B
+\e$B$k$K$O!"%j%9%H$NCf$G\e(B @var{(\e$BH/9T<T\e(B \e$B>r7o\e(B ...)} \e$BMWAG$r;H$&I,MW$,$"\e(B
+\e$B$j$^$9!#3F>r7o$OJ8;zNs\e(B (\e$B;H$$$?$$<oJL$K%^%C%A$9$k@55,I=8=\e(B) \e$B$+!"$^\e(B
+\e$B$?$O\e(B @code {(not \e$BJ8;zNs\e(B)} \e$B$H$$$&7A<0$N%j%9%H$G$9!#$3$N>l9g$O\e(B
+@var{\e$BJ8;zNs\e(B} \e$B$O;H$$$?$/$J$$<oJL$K%^%C%A$9$k@55,I=8=$G$9!#\e(B
+
+\e$BNc$($P!"\e(BChris Lewis \e$B$+$i$N\e(B NoCeM \e$B%a%C%;!<%8$G!"\e(B@samp{troll} \e$B%a%C\e(B
+\e$B%;!<%80J30$NA4$F$rM_$7$$>l9g$K$O!"\e(B
+
+@lisp
+("clewis@@ferret.ocunix.on.ca" ".*" (not "troll"))
+@end lisp
+
+\e$B0lJ}!"H`$N\e(B @samp{spam} \e$B$H\e(B @samp{spew} \e$B%a%C%;!<%80J30$O2?$b$7$?$/\e(B
+\e$B$J$1$l$P!"0J2<$N$h$&$K$G$-$^$9!#\e(B
+
+@lisp
+("clewis@@ferret.ocunix.on.ca" (not ".*") "spew" "spam")
+@end lisp
+
+\e$B$3$N;XDj$O:8$+$i1&$KE,MQ$5$l$^$9!#\e(B
+
+
+@item gnus-nocem-verifyer
+@vindex gnus-nocem-verifyer
+@findex mc-verify
+\e$B$3$l$O\e(B NoCeM \e$BH/9T<T$,C/$G$"$k$+$H8@$C$F$$$k$+$r>ZL@$9$k4X?t$G$J\e(B
+\e$B$/$F$O$J$j$^$;$s!#=i4|@_Dj$G$O\e(B @code{mc-verify} \e$B$G$"$j!"$3$l$O\e(B
+Mailcrypt \e$B4X?t$G$9!#$b$7$3$l$,Hs>o$KCY$/$F!"$"$J$?$,>ZL@7k2L$r5$\e(B
+\e$B$K$7$J$$\e(B (\e$B$3$l$O$?$V$s4m81$G$9\e(B) \e$B$N$G$"$l$P!"$3$NJQ?t$r\e(B
+@code{nil} \e$B$K$9$k$3$H$,$G$-$^$9!#\e(B
+
+\e$B$b$7=pL>:Q$_$N\e(B NoCeM \e$B%a%C%;!<%8$r>ZL@:Q$_!"L$=pL>$N%a%C%;!<%8$r\e(B
+\e$BL$>ZL@\e(B(\e$B$G$b$=$l$r;H$&\e(B)\e$B$H$7$?$$$N$J$i!"0J2<$N$h$&$K$9$k$3$H$,$G$-\e(B
+\e$B$^$9!#\e(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
+
+\e$B$^$"!"$3$l$O$?$V$s4m81$G$7$g$&$1$I$M!#\e(B
+
+@item gnus-nocem-directory
+@vindex gnus-nocem-directory
+\e$B$3$l$O\e(B gnus \e$B$,\e(B NoCeM \e$B%-%c%C%7%e%U%!%$%k$rJ]B8$9$k>l=j$G$9!#=i4|\e(B
+\e$B@_DjCM$O\e(B @file{~/News/NoCeM/} \e$B$G$9!#\e(B
+
+@item gnus-nocem-expiry-wait
+@vindex gnus-nocem-expiry-wait
+\e$B8E$$\e(B NoCeM \e$B9`L\$r%-%c%C%7%e$+$i>C$9$^$G$NF|?t!#=i4|@_DjCM$O\e(B 15
+\e$B$G$9!#$3$l$rC;$/$9$k$[$I\e(B gnus \e$B$OB.$/$J$j$^$9$,!"8E$$%9%Q%`$r8+$k\e(B
+\e$B$3$H$K$J$C$F$7$^$&$+$b$7$l$^$;$s!#\e(B
+
+@end table
+
+NoCeM \e$B$r;H$&$H!"$b$7$+$9$k$H%a%b%j6t$$$K$J$k$+$b$7$l$^$;$s!#$"$J\e(B
+\e$B$?$,$?$/$5$s$N@8$-$?%0%k!<%W\e(B (\e$B$D$^$j9XFI$"$k$$$OHs9XFI%0%k!<%W\e(B)
+\e$B$r;}$C$F$$$k$N$J$i!"\e(BEmacs \e$B%W%m%;%9$OBg$-$/$J$C$F$7$^$&$G$7$g$&!#\e(B
+\e$B$b$7$3$l$,LdBj$G$"$l$P!"Hs9XFI$N%0%k!<%W$rA4It\e(B (\e$B$"$k$$$O$=$NB?$/\e(B
+\e$B$r\e(B) \e$B>C$75n$C$F$7$^$C$?J}$,NI$$$G$9\e(B (@pxref{Subscription
+Commands})\e$B!#\e(B
+
+
+@node Undo
+@section \e$B$d$jD>$7\e(B
+@cindex undo
+
+\e$B<B9T$7$?$3$H$N$d$jD>$7$,$G$-$k$H!"$H$F$bJXMx$G$9!#IaDL$N\e(B Emacs
+\e$B%P%C%U%!$G$O!"$3$l$O==J,4JC1$G$9\e(B --- \e$BC1$K\e(B @code{undo} \e$B%\%?%s$r2!\e(B
+\e$B$9$@$1$G$9!#$7$+$7\e(B gnus \e$B$N%P%C%U%!$G$O!"$3$l$O4JC1$G$O$"$j$^$;$s!#\e(B
+
+Gnus \e$B$,%P%C%U%!!<Fb$KI=<($7$F$$$k$b$N$O!"\e(Bgnus \e$B$K$H$C$F$OA4$/2?$N\e(B
+\e$B2ACM$b$"$j$^$;$s\e(B --- \e$B$3$l$O$_$s$J!"MxMQ<T$K4qNo$K8+$($k$h$&$K%G\e(B
+\e$B%6%$%s$5$l$F$$$k$?$@$N%G!<%?$J$N$G$9!#\e(B@kbd{C-k} \e$B$G%0%k!<%W%P%C%U%!\e(B
+\e$B$+$i%0%k!<%W$r>C5n$9$k$N$O!"$=$N9T$O>C$(5n$j$^$9$,!"$=$l$O<B:]$N\e(B
+\e$BF0:n\e(B --- \e$BLdBj$N%0%k!<%W$r\e(B gnus \e$B$NFbIt9=B$BN$+$i:o=|$9$k$3$H!"$N\e(B
+\e$BC1$J$kI{:nMQ$G$7$+$"$j$^$;$s!#$3$l$i$N$d$jD>$7$O!"DL>o$N\e(B Emacs
+\e$B$N\e(B @code{undo} \e$B4X?t$G$O9T$J$&$3$H$,$G$-$^$;$s!#\e(B
+
+Gnus \e$B$O!"MxMQ<T$,2?$r$9$k$+$r21$($F$*$-!"$=$NMxMQ<T$NF0:n$N5U$r\e(B
+\e$B9T$J$&F0:n$rDs6!$9$k$3$H$K$h$C$F!"$3$l$r2?$H$+5_:Q$7$h$&$H$7$^$9!#\e(B
+\e$B$=$7$FMxMQ<T$,\e(B @code{undo} \e$B%-!<$r2!$7$?$H$-!"\e(Bgnus \e$B$O$=$N0l$D<jA0\e(B
+\e$B$NF0:n$"$k$$$OF0:n72$N5U$N%3!<%I$r<B9T$7$^$9!#$7$+$7!"A4$F$NF0:n\e(B
+\e$B$,4JC1$K2D5U$G$"$k$o$1$G$O$J$$$N$G!"\e(Bgnus \e$B$O8=:_!"$d$jD>$72DG=$J\e(B
+\e$B%-!<4X?t$O6O$+$7$+Ds6!$7$F$$$^$;$s!#$3$l$i$O!"%0%k!<%W$N:o=|!"%0%k!<\e(B
+\e$B%W$NE=$jIU$1!"%0%k!<%W$N4{FI5-;v$N%j%9%H$NJQ99!"$=$l$@$1$J$s$G$9!#\e(B
+\e$B>-Mh$O$b$C$H4X?t$,DI2C$5$l$k$+$b$7$l$^$;$s$,!"4X?t$NDI2C$O$=$l$>\e(B
+\e$B$lJ]B8$9$k$Y$-%G!<%?$rA}$d$9$3$H$K$J$k$N$G!"\e(Bgnus \e$B$O7h$7$F40A4$d\e(B
+\e$B$jD>$72DG=$K$O$J$i$J$$$G$7$g$&!#\e(B
+
+@findex gnus-undo-mode
+@vindex gnus-use-undo
+@findex gnus-undo
+\e$B$d$jD>$75!G=$O\e(B @code{gnus-undo-mode} \e$B%^%$%J!<%b!<%I$K$h$C$FDs6!\e(B
+\e$B$5$l$^$9!#$3$l$O\e(B @code{gnus-use-undo} \e$B$,\e(B @code{nil} \e$B0J30$G$"$l$P\e(B
+\e$B;HMQ$5$l!"$3$l$,=i4|@_Dj$G$9!#\e(B@kbd{M-C-_} \e$B%-!<$,\e(B
+@code{gnus-undo} \e$BL?Na$r<B9T$7$^$9!#$3$l$ODL>o$N\e(B Emacs \e$B$N\e(B
+@code{undo} \e$BL?Na$K$A$g$C$H$@$1;w$F$$$k$H;W$o$l$k$G$7$g$&!#\e(B
+
+
+@node Moderation
+@section \e$B;J2qLr\e(B
+@cindex moderation
+
+\e$B$b$7$"$J$?$,;J2q<T\e(B (\e$B%b%G%l!<%?!<\e(B) \e$B$J$i$P!"\e(B@file{gnus-mdrtn.el}
+\e$B%Q%C%1!<%8$r;H$&$3$H$,$G$-$^$9!#$3$l$OI8=`\e(B gnus \e$B%Q%C%1!<%8$K$O4^\e(B
+\e$B$^$l$^$;$s!#\e(B@samp{larsi@@gnus.org} \e$B$K!"$I$N%0%k!<%W$N;J2q$r9T$J\e(B
+\e$B$&$N$+$r=R$Y$?%a!<%k$r=q$$$F$/$@$5$$!#$=$&$9$l$P%3%T!<$r<j$KF~$l\e(B
+\e$B$i$l$^$9!#\e(B
+
+\e$B;J2q<TMQ%Q%C%1!<%8$O35N,%P%C%U%!$N%^%$%J!<%b!<%I$H$7$F<BAu$5$l$F\e(B
+\e$B$$$^$9!#\e(B
+
+@lisp
+(add-hook 'gnus-summary-mode-hook 'gnus-moderate)
+@end lisp
+
+\e$B$r$"$J$?$N\e(B @file{.gnus.el} \e$B%U%!%$%k$KF~$l$F$/$@$5$$!#\e(B
+
+\e$B$"$J$?$,\e(B @samp{rec.zoofle} \e$B$N;J2q<T$@$H$9$k$H!"$3$l$O0J2<$N$h$&\e(B
+\e$B$KF0:n$9$k$h$&$K$J$C$F$$$^$9!#\e(B
+
+@enumerate
+@item
+@samp{Newsgroups:.*rec.zoofle} \e$B$K%^%C%A$9$k<u?.%a!<%k$rJ,N%$7$^\e(B
+\e$B$9!#$3$l$OEj9F$5$l$h$&$H$7$F$$$k5-;v$rA4$F$"$k%a!<%k%0%k!<%W\e(B ---
+\e$BNc$($P\e(B @samp{nnml:rec.zoofle} \e$B$KF~$l$^$9!#\e(B
+
+@item
+\e$B$"$J$?$O;~@^$3$N%0%k!<%W$KF~$j!"\e(B@kbd{e} (edit-and-post) \e$B$"$k$$$O\e(B
+@kbd{s} (just send unedited) \e$BL?Na$r;H$C$F5-;v$rEj9F$7$^$9!#\e(B
+
+@item
+@samp{rec.zoofle} \e$B%K%e!<%9%0%k!<%W$rFI$s$G$$$kESCf$G!"$b$7$"$J$?\e(B
+\e$B$,>5G'$7$F$$$J$$5-;v$r$r$?$^$?$^8+$D$1$?$H$7$?$i!"\e(B@kbd{c} \e$BL?Na$G\e(B
+\e$B<h$j>C$7$G$-$^$9!#\e(B
+@end enumerate
+
+\e$BFs$D$N%0%k!<%W$G;J2q<T%b!<%I$r;H$&$H$9$l$P!"$3$&$J$j$^$9!#\e(B
+
+@lisp
+(setq gnus-moderated-list
+ "^nnml:rec.zoofle$\\|^rec.zoofle$")
+@end lisp
+
+
+@node XEmacs Enhancements
+@section XEmacs \e$B3HD%\e(B
+@cindex XEmacs
+
+XEmacs \e$B$O3($d$=$NB>$N$b$N$rI=<($9$k$3$H$,$G$-$k$N$G!"\e(Bgnus \e$B$O$3$l\e(B
+\e$B$rMxMQ$9$k$3$H$K$7$^$9!#\e(B
+
+@menu
+* Picons:: \e$B$"$J$?$,FI$s$G$$$k$b$N$N3($rI=<($9$kJ}K!!#\e(B
+* Smileys:: \e$BI=<($5$l$k$Y$/@8$^$l$?9,$;$=$&$J4i$rI=<($9$kJ}K!!#\e(B
+* Toolbar:: \e$B%/%j%C%/1n!#\e(B
+* XVarious:: \e$B$=$NB>$N\e(B XEmacs \e$B$G\e(B Gnus \e$B$JJQ?t!#\e(B
+@end menu
+
+
+@node Picons
+@subsection Picons
+
+@iftex
+@iflatex
+\include{picons}
+@end iflatex
+@end iftex
+
+\e$B$=$l$G!D!"$"$J$?$O$3$N%K%e!<%9%j!<%@!<$r$5$i$K$b$C$HCY$/$7$?$$$C\e(B
+\e$B$F$o$1$@$M\e(B! \e$B$3$l$O$=$&$9$k$N$K$T$C$?$j$JJ}K!$G$9!#$5$i$K$3$l$O!"\e(B
+\e$B$"$J$?$,%K%e!<%9$rFI$s$G$$$k$s$@$H$$$&$3$H$r!"$"$J$?$N8*1[$7$K8+\e(B
+\e$B$D$a$F$$$k?M$K0u>]$E$1$k$?$a$NAG@2$i$7$$J}K!$G$b$"$j$^$9!#\e(B
+
+@menu
+* Picon Basics:: picon \e$B$H$O2?$G!"$I$&$d$C$F<j$KF~$l$k$N$+!#\e(B
+* Picon Requirements:: XEmacs \e$B$r;H$C$F$J$1$l$P$3$3$+$i$OFI$^$J$$$G!#\e(B
+* Easy Picons:: picon \e$B$NI=<(\e(B --- \e$B3Z$JJ}K!!#\e(B
+* Hard Picons:: \e$BK\Mh$9$Y$-$3$H!#2?$+$r3X$V$3$H$,$G$-$k$@$m$&!#\e(B
+* Picon Useless Configuration:: \e$B$=$NB>$N$V$C2u$7$?$j$R$M$C$?$j$$$8$C$?$jM7$s$@$j$9$kJQ?t!#\e(B
+@end menu
+
+
+@node Picon Basics
+@subsubsection Picon \e$B$N4pAC\e(B
+
+Picon \e$B$H$O$J$s$G$7$g$&\e(B? Picons \e$B%&%'%V%5%$%H$+$iD>@\0zMQ$7$^$7$g$&!#\e(B
+
+@iftex
+@iflatex
+\margindex{}
+@end iflatex
+@end iftex
+
+@quotation
+@dfn{Picon} \e$B$H$O!"\e(B``\e$B8D?M%"%$%3%s\e(B (personal icons)'' \e$B$NN,$G$9!#$3\e(B
+\e$B$l$O!"%M%C%H>e$NMxMQ<T$d%I%a%$%s$rI=8=$9$k$N$K;H$o$l$k$?$a$N>.$5\e(B
+\e$B$J2hA|$G!"%G!<%?%Y!<%9$r;}$?$;$F!"$"$kEE;R%a!<%k%"%I%l%9$,$"$C$?\e(B
+\e$B$i!"$=$l$KE,@Z$J2hA|$r8+$D$1$i$l$k$h$&$K$7$F$*$/$b$N$G$9!#MxMQ<T\e(B
+\e$B$H%I%a%$%s0J30$K$b!"\e(BUsenet \e$B%K%e!<%9%0%k!<%W$dE75$M=Js$N$?$a$N\e(B
+picon \e$B%G!<%?%Y!<%9$,$"$j$^$9!#\e(Bpicon \e$B$OGr9u$N\e(B @code{XBM} \e$B7A<0$G$b\e(B
+\e$B%+%i!<$N\e(B @code{XPM} \e$B7A<0$G$b\e(B @code{GIF} \e$B7A<0$G$b9=$$$^$;$s!#\e(B
+@end quotation
+
+@vindex gnus-picons-piconsearch-url
+\e$B$"$J$?$,%$%s%?!<%M%C%H$X>o;~@\B3$7$F$$$k$N$J$i$P!"\e(B
+@code{gnus-picons-piconsearch-url} \e$B$KJ8;zNs\e(B
+@file{http://www.cs.indiana.edu/picons/search.html} \e$B$r@_Dj$9$k$3\e(B
+\e$B$H$G!"\e(BSteve Kinzler \e$B$N\e(B picon \e$B8!:w%(%s%8%s$r;H$&$3$H$,$G$-$^$9!#\e(B
+
+@vindex gnus-picons-database
+\e$B$=$&$G$J$1$l$P!"H`$N%G!<%?%Y!<%9$r<j85$KJ#@=$9$kI,MW$,$"$j$^$9!#\e(B
+picon \e$B%G!<%?%Y!<%9$NF~<j$H%$%s%9%H!<%k$N<j=g$O!"%&%'%V%V%i%&%6!<\e(B
+\e$B$G\e(B @file{http://www.cs.indiana.edu/picons/ftp/index.html} \e$B$K9T$C\e(B
+\e$B$F$_$F$/$@$5$$!#\e(BGnus \e$B$O\e(B picons \e$B$,\e(B @code{gnus-picons-database} \e$B$G\e(B
+\e$B<($5$l$k>l=j$K%$%s%9%H!<%k$7$F$"$k$b$N$H4|BT$7$^$9!#\e(B
+
+
+@node Picon Requirements
+@subsubsection Picon \e$B$NF0:n>r7o\e(B
+
+Gnus \e$B$K\e(B picon \e$B$rI=<($5$;$k$K$O!"\e(BXEmacs 19.13 \e$B$+$=$l0J9_$r<B9T$7\e(B
+\e$B$F$$$J$1$l$P$J$j$^$;$s!#B>$NHG$N\e(B Emacs \e$B$G$O$I$l$b$^$@2hA|$rI=<(\e(B
+\e$B$G$-$J$$$+$i$G$9!#\e(B
+
+\e$B$5$i$K!"\e(B@code{x} \e$B%5%]!<%HIU$-$G\e(B XEmacs \e$B$r%3%s%Q%$%k$7$F$$$J$/$F\e(B
+\e$B$O$J$j$^$;$s!#Gr9u$h$j$b$b$C$H4qNo$J?'IU$-$N\e(B picon \e$B$rI=<($9$k$?\e(B
+\e$B$a$K$O!"\e(B@code{xpm} \e$B$+\e(B @code{gif} \e$B$I$A$i$+$r\e(B XEmacs \e$B$H0l=o$K%3%s\e(B
+\e$B%Q%$%k$7$F$$$kI,MW$b$"$j$^$9!#\e(B
+
+@vindex gnus-picons-convert-x-face
+@code{X-Face} \e$B%X%C%@!<$N4i$rI=<($7$?$$$N$J$i!"\e(BXEmacs \e$B$r\e(B
+@code{xface} \e$B%5%]!<%HIU$-$G%3%s%Q%$%k$7$J$1$l$P$J$j$^$;$s!#$=$&\e(B
+\e$B$G$J$1$l$P!"\e(B@code{netpbm} \e$B%f!<%F%#%j%F%#$r%$%s%9%H!<%k$7$F$*$/$+!"\e(B
+\e$B$"$k$$$OB>$N2?$+$r;H$&$h$&$K\e(B @code{gnus-picons-convert-x-face}
+\e$BJQ?t$r$$$8$/$C$F$/$@$5$$!#\e(B
+
+
+@node Easy Picons
+@subsubsection \e$B3Z!9\e(B Picons
+
+picon \e$BI=<($rM-8z$K$9$k$K$O!"C1$K0J2<$N9T$r\e(B @file{~/.gnus} \e$B%U%!%$\e(B
+\e$B%k$KF~$l$F!"\e(Bgnus \e$B$r5/F0$7$F$/$@$5$$!#\e(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} \e$B$,\e(B picon \e$B%G!<%?%Y!<%9$,4^$^$l$F$$$k\e(B
+\e$B%G%#%l%/%H%j$r;X$7$F$$$k$3$H$r3NG'$7$F$/$@$5$$!#\e(B
+
+\e$B$=$NBe$o$j$K\e(B Web \e$B>e$N\e(B picon \e$B8!:w%(%s%8%s$r;H$$$?$1$l$P!"$3$l$rDI\e(B
+\e$B2C$7$^$9!#\e(B
+
+@lisp
+(setq gnus-picons-piconsearch-url "http://www.cs.indiana.edu:800/piconsearch")
+@end lisp
+
+
+@node Hard Picons
+@subsubsection \e$BFq2r\e(B Picons
+
+@iftex
+@iflatex
+\margindex{}
+@end iflatex
+@end iftex
+
+Gnus \e$B$O!"%0%k!<%W$d5-;v$KF~$C$?$j=P$?$j$9$k$N$K=>$C$F\e(B picon \e$B$rI=\e(B
+\e$B<($9$k$3$H$,$G$-$^$9!#\e(BGnus \e$B$O\e(B picon \e$B%G!<%?%Y!<%9$N;0$D$N>O$H$I$&\e(B
+\e$BAj8_:nMQ$9$l$P$h$$$+$rCN$C$F$$$^$9!#$9$J$o$A!"\e(Bgnus \e$B$O%K%e!<%9%0\e(B
+\e$B%k!<%W$N3(!"Cx<T$N4i$N3(!"Cx<T$N%I%a%$%s$N\e(B picon \e$B$rI=<($9$k$3$H\e(B
+\e$B$,$G$-$^$9!#$3$N5!G=$rM-8z$K$9$k$K$O!"\e(Bpicon \e$B$r$I$3$+$i;}$C$F$/$k\e(B
+\e$B$+!"$=$7$F$I$3$KI=<($9$k$+$rA*Br$9$kI,MW$,$"$j$^$9!#\e(B
+
+@table @code
+
+@item gnus-picons-database
+@vindex gnus-picons-database
+picon \e$B%G!<%?%Y!<%9$N>l=j!#\e(B@file{news}\e$B!"\e(B @file{domains}\e$B!"\e(B
+@file{users} (\e$B$J$I$J$I\e(B) \e$B$N%5%V%G%#%l%/%H%j!<$,4^$^$l$F$$$k%G%#%l\e(B
+\e$B%/%H%j!<$r;X$7$F$$$J$1$l$P$J$j$^$;$s!#$3$l$O\e(B
+@code{gnus-picons-piconsearch-url} \e$B$,\e(B @code{nil} \e$B$G$"$k$H$-$N$_\e(B
+\e$B;HMQ$5$l$^$9!#=i4|@_DjCM$O\e(B @file{/usr/local/faces/} \e$B$G$9!#\e(B
+
+@item gnus-picons-piconsearch-url
+@vindex gnus-picons-piconsearch-url
+Web \e$B>e$N\e(B picon \e$B8!:w%(%s%8%s$N\e(B URL\e$B!#8=:_CN$i$l$F$$$kM#0l$N%(%s%8\e(B
+\e$B%s$O\e(B @file{http://www.cs.indiana.edu:800/piconsearch} \e$B$G$9!#%M%C\e(B
+\e$B%H%o!<%/CY1d$r2sHr$9$k$?$a$K\e(B icon \e$B$O%P%C%/%0%i%&%s%I$G<hF@$5$l$^\e(B
+\e$B$9!#$b$7$3$l$,\e(B @code{nil} (\e$B=i4|@_DjCM\e(B) \e$B$G$"$l$P!"\e(Bpicon \e$B$O\e(B
+@code{gnus-picons-database} \e$B$G<($5$l$k%m!<%+%k$N%G!<%?%Y!<%9$+$i\e(B
+\e$B<hF@$5$l$^$9!#\e(B
+
+@item gnus-picons-display-where
+@vindex gnus-picons-display-where
+picon \e$B2hA|$,I=<($5$l$k>l=j!#$3$l$O=i4|@_Dj$G$O\e(B @code{picons} \e$B$G\e(B
+\e$B$9\e(B (\e$B$3$l$O=i4|@_Dj$G\e(B @samp{*Picons*} \e$B%P%C%U%!$K0LCV$7$^$9\e(B)\e$B!#B>$N\e(B
+\e$BM-8z$J>l=j$H$7$F$O\e(B @code{article}\e$B!"\e(B @code{summary}\e$B!"$"$k$$$O\e(B
+@samp{*scratch*} \e$B$@$m$&$HCN$C$?$3$H$G$O$"$j$^$;$s!#$?$@$=$N%P%C\e(B
+\e$B%U%!$rI8=`$N\e(B gnus \e$BAkG[CV=hM}\e(B --- @pxref{Windows Configuration}\e$B$K\e(B
+\e$B$h$C$F8+$($k$h$&$K$7$F$*$/$3$H$r3NG'$7$F$/$@$5$$!#\e(B
+
+@item gnus-picons-group-excluded-groups
+@vindex gnus-picons-group-excluded-groups
+\e$B$3$N@55,I=8=$K%^%C%A$9$k%0%k!<%W$G$O$=$N%0%k!<%W%"%$%3%s$rI=<($5\e(B
+\e$B$;$^$;$s!#\e(B
+
+@end table
+
+\e$BCm0U\e(B: \e$B$b$7\e(B @code{gnus-use-picons} \e$B$r\e(B @code{t} \e$B$K@_Dj$9$k$H!"AkG[\e(B
+\e$BCV$K\e(B @code{picons} \e$B%P%C%U%!$r4^$a$k$h$&$K@_Dj$5$l$^$9!#\e(B
+
+\e$B$5$F!"$3$l$i$r7hDj$7$?8e$K$O!"$3$l$i$N3($,@5$7$$;~$KI=<($5$l$k$h\e(B
+\e$B$&$K!"0J2<$N4X?t$rE,@Z$J%U%C%/$KDI2C$9$kI,MW$,$"$j$^$9!#\e(B
+
+@vindex gnus-article-display-hook
+@vindex gnus-picons-display-where
+@table @code
+@item gnus-article-display-picons
+@findex gnus-article-display-picons
+\e$BCx<T$HCx<T$N%I%a%$%s$N\e(B picon \e$B$rC5$7!"\e(B
+@code{gnus-picons-display-where} \e$B%P%C%U%!$KI=<($7$^$9!#\e(B
+@code{gnus-article-display-hook} \e$B$KDI2C$7$F$/$@$5$$!#\e(B
+
+@item gnus-picons-article-display-x-face
+@findex gnus-article-display-picons
+X-Face \e$B%X%C%@!<$,$"$l$P$=$l$rI|9f2=$7I=<($7$^$9!#$3$N4X?t$O\e(B
+@code{gnus-article-display-hook} \e$B$KDI2C$7$F$/$@$5$$!#\e(B
+
+@end table
+
+\e$BCm0U\e(B: \e$B$3$l$i$O%U%C%/$KDI2C$7$J$/$F$O$J$i$J$$$N$G!"\e(B
+@code{add-hook} \e$B$NDI2C%U%i%0$K\e(B 't' \e$B$r;XDj$9$k$N$rK:$l$J$$$G$/$@$5$$!#\e(B
+
+@lisp
+(add-hook 'gnus-article-display-hook 'gnus-article-display-picons t)
+@end lisp
+
+
+@node Picon Useless Configuration
+@subsubsection \e$BL50UL#$J\e(B Picon \e$B@_Dj\e(B
+
+@iftex
+@iflatex
+\margindex{}
+@end iflatex
+@end iftex
+
+\e$B0J2<$NJQ?t$O!"$5$i$K$3$l$i$r$I$&<B9T$9$k$+!"$I$3$KG[CV$9$k$+!"$=\e(B
+\e$B$NB>Lr$K$bN)$?$J$$$I$&$G$b$h$$$3$H$r@)8f$G$-$k$h$&$K$7$^$9!#\e(B
+
+@table @code
+
+@item gnus-picons-news-directories
+@vindex gnus-picons-news-directories
+@code{gnus-picons-database} \e$B$+$i%K%e!<%9%0%k!<%W%U%'%$%9$rC5$9$?\e(B
+\e$B$a$N%5%V%G%#%l%/%H%j!<$N%j%9%H!#\e(B@code{("news")} \e$B$,=i4|@_DjCM$G$9!#\e(B
+
+@item gnus-picons-user-directories
+@vindex gnus-picons-user-directories
+@code{gnus-picons-database} \e$B$+$iMxMQ<T%U%'%$%9$rC5$9$?$a$N%5%V%G%#\e(B
+\e$B%l%/%H%j!<$N%j%9%H!#\e(B @code{("local" "users" "usenix" "misc")} \e$B$,\e(B
+\e$B=i4|@_DjCM$G$9!#\e(B
+
+@item gnus-picons-domain-directories
+@vindex gnus-picons-domain-directories
+@code{gnus-picons-database} \e$B$+$i%I%a%$%sL>%U%'%$%9$rC5$9$?$a$N%5\e(B
+\e$B%V%G%#%l%/%H%j!<$N%j%9%H!#=i4|@_DjCM$O\e(B @code{("domains")} \e$B$G$9!#\e(B
+\e$B$3$N%j%9%H$K\e(B @samp{"unknown"} \e$B$rDI2C$7$F$*$-$?$/$J$k?M$b$$$k$G$7$g\e(B
+\e$B$&!#\e(B
+
+@item gnus-picons-convert-x-face
+@vindex gnus-picons-convert-x-face
+\e$B$b$7\e(B XEmacs \e$B$K\e(B @code{xface} \e$B%5%]!<%H$,AH$_9~$^$l$F$$$J$1$l$P!"$3\e(B
+\e$B$NL?Na$,\e(B @code{X-Face} \e$B%X%C%@!<$r\e(B X \e$B%S%C%H%^%C%W\e(B (@code{xbm}) \e$B$K\e(B
+\e$BJQ49$9$k$N$K;HMQ$5$l$^$9!#=i4|@_DjCM$O\e(B @code{(format "@{ echo '/* Width=48,
+Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s"
+gnus-picons-x-face-file-name)} \e$B$G$9!#\e(B
+
+@item gnus-picons-x-face-file-name
+@vindex gnus-picons-x-face-file-name
+@code{X-Face} \e$B%S%C%H%^%C%W$r3JG<$7$F$*$/0l;~%U%!%$%k$NL>A0!#=i4|\e(B
+\e$B@_DjCM$O\e(B @code{(format "/tmp/picon-xface.%s.xbm"
+(user-login-name))}\e$B!#\e(B
+
+@item gnus-picons-has-modeline-p
+@vindex gnus-picons-has-modeline-p
+@code{gnus-picons-display-where} \e$B$r\e(B @code{picons} \e$B$K@_Dj$7$F$7$^\e(B
+\e$B$&$H!"\e(BXEmacs \e$B$N%U%l!<%`$O$a$A$c$a$A$c$K$J$C$F$7$^$&$G$7$g$&!#$3\e(B
+\e$B$l$rB?>/$J$j$H$b7Z8:$9$k$K$O!"\e(B@code{gnus-picons-has-modeline-p}
+\e$B$r\e(B @code{nil} \e$B$K@_Dj$7$F$/$@$5$$!#$3$l$O\e(B picon \e$B%P%C%U%!$+$i%b!<\e(B
+\e$B%I9T$r<h$j=|$-$^$9!#$3$l$O\e(B @code{gnus-picons-display-where} \e$B$,\e(B
+@code{picons} \e$B$N$H$-$N$_0UL#$,$"$j$^$9!#\e(B
+
+@item gnus-picons-refresh-before-display
+@vindex gnus-picons-refresh-before-display
+nil \e$B0J30$G$"$l$P!"\e(Bpicon \e$B$r7W;;$9$kA0$K5-;v%P%C%U%!$rI=<(!#\e(B
+\e$B=i4|@_DjCM$O\e(B @code{nil} \e$B$G$9!#\e(B
+
+@item gnus-picons-display-as-address
+@vindex gnus-picons-display-as-address
+@code{t} \e$B$G$"$l$P3($H0l=o$KJ8;z$GEE;R%a!<%k%"%I%l%9$rI=<(!#\e(B
+\e$B=i4|@_DjCM$O\e(B @code{t} \e$B$G$9!#\e(B
+
+@item gnus-picons-file-suffixes
+@vindex gnus-picons-file-suffixes
+picon \e$B%U%!%$%kL>$H$7$F;n$7$F$_$k3HD%;R$N=g=x%j%9%H!#=i4|@_DjCM$O\e(B
+@code{("xpm" "gif" "xbm")} \e$B$+$i\e(B XEmacs \e$B$KAH$_9~$^$l$F$$$J$$$b$N\e(B
+\e$B$r0z$$$?$b$N$G$9!#\e(B
+
+@item gnus-picons-display-article-move-p
+@vindex gnus-picons-display-article-move-p
+picon \e$B$rI=<($7$F$$$k$H$-$K%+!<%=%k0LCV$r:G=i$N6u9T$^$GF0$+$9$+$I\e(B
+\e$B$&$+$r;XDj!#$3$l$O\e(B @code{gnus-picons-display-where} \e$B$NCM$,\e(B
+@code{article} \e$B$G$"$k$H$-$N$_8z2L$,$"$j$^$9!#\e(B
+
+@item gnus-picons-clear-cache-on-shutdown
+@vindex gnus-picons-clear-cache-on-shutdown
+Gnus \e$B$r=*N;$9$k$H$-$K\e(B picon \e$B%-%c%C%7%e$r>C$75n$k$+$I$&$+!#\e(BGnus
+\e$B$O<B9TCf$K8+$D$1$?\e(B picon \e$B$rA4$F%-%c%C%7%e$7$^$9!#$3$l$O8!:w=hM}\e(B
+\e$B$N;~4V$rB?>/@aLs$G$-$^$9$,!"%a%b%j$r$$$/$i$+?)$$$^$9!#$b$7$3$NJQ\e(B
+\e$B?t$r\e(B @code{nil} \e$B$K@_Dj$9$l$P!"\e(Bgnus \e$B$O$=$N%-%c%C%7%e$r7h$7$F>C$7\e(B
+\e$B$^$;$s!#$=$l$r>C$75n$k$K$O<j$G\e(B @code{gnus-picons-clear-cache} \e$B$r\e(B
+\e$B8F$S=P$9I,MW$,$"$j$^$9!#\e(B@code{nil} \e$B$G$J$1$l$P%-%c%C%7%e$O\e(B gnus
+\e$B$,=*N;$9$k$?$S$K>C5n$5$l$^$9!#=i4|@_DjCM$O\e(B @code{t} \e$B$G$9!#\e(B
+
+@iftex
+@iflatex
+\margindex{}
+@end iflatex
+@end iftex
+
+@end table
+
+@node Smileys
+@subsection \e$B%9%^%$%j!<\e(B
+@cindex smileys
+
+@iftex
+@iflatex
+\gnusfig{-3cm}{0.5cm}{\epsfig{figure=tmp/BigFace.ps,height=20cm}}
+\input{smiley}
+@end iflatex
+@end iftex
+
+\e$B%9%^%$%j!<\e(B @dfn{smiley} \e$B$O\e(B gnus \e$B$H$OJL$N%Q%C%1!<%8$G$9$,!"%9%^%$\e(B
+\e$B%j!<$r;H$C$F$$$k%Q%C%1!<%8$O8=:_\e(B gnus \e$B$@$1$G$9$N$G!"$3$3$G@bL@$7\e(B
+\e$B$^$9!#\e(B
+
+\e$B0l8@$G8@$($P\e(B --- gnus \e$B$G%9%^%$%j!<$r;H$&$K$O!"0J2<$r\e(B
+@file{.gnus.el} \e$B$U$!$$$k$K=q$$$F$/$@$5$$!#\e(B
+
+@lisp
+(add-hook 'gnus-article-display-hook 'gnus-smiley-display t)
+@end lisp
+
+\e$B%9%^%$%j!<$O!"J8;z$N4i%^!<%/\e(B --- @samp{:-)}\e$B!"\e(B@samp{:-=}\e$B!"\e(B
+@samp{:-(} \e$B$J$I$H$$$C$?$b$N\e(B --- \e$B$r3($KBP1~$5$;!"J8;z$N4i%^!<%/$N\e(B
+\e$BBe$o$j$K$=$N3($rI=<($7$^$9!#$3$NJQ49$OJ8;z$K%^%C%A$9$k@55,I=8=$H\e(B
+\e$B$=$l$N%U%!%$%kL>$X$NBP1~$N%j%9%H$G@)8f$5$l$^$9!#\e(B
+
+@vindex smiley-nosey-regexp-alist
+@vindex smiley-deformed-regexp-alist
+\e$B%9%^%$%j!<$O=i4|@_Dj$G$OFs$D$NJQ49O"A[%j%9%H$NNc$rDs6!$7$F$$$^$9!#\e(B
+@code{smiley-deformed-regexp-alist} (@samp{:)}\e$B!"\e(B @samp{:(} \e$B$J$I\e(B
+\e$B$K%^%C%A$9$k\e(B) \e$B$H!"\e(B@code{smiley-nosey-regexp-alist} (@samp{:-)}\e$B!"\e(B
+@samp{:-(} \e$B$J$I$K%^%C%A$9$k\e(B) \e$B$G$9!#\e(B
+
+\e$B;HMQ$5$l$kO"A[%j%9%H$O\e(B @code{smiley-regexp-alist} \e$BJQ?t$G;XDj$5$l\e(B
+\e$B$^$9!#$3$N=i4|@_DjCM$O\e(B @code{smiley-deformed-regexp-alist} \e$B$G$9!#\e(B
+
+\e$B3FMWAG$N:G=i$N9`L\$O%^%C%A$5$;$?$$@55,I=8=$G!"FsHVL\$NMWAG$O3($G\e(B
+\e$BCV$-49$($?$$%0%k!<%W$K%^%C%A$9$k@55,I=8=!"$=$7$F;0HVL\$NMWAG$OI=\e(B
+\e$B<($5$;$?$$%U%!%$%k$NL>A0$G$9!#\e(B
+
+\e$B0J2<$NJQ?t$O!"%9%^%$%j!<$,$3$l$i$N%U%!%$%k$rC5$9>l=j!"$"$k$$$O$I\e(B
+\e$B$N?'$r;H$&$+$H!"$=$NB>$N$b$N$r%+%9%?%^%$%:$7$^$9!#\e(B
+
+@table @code
+
+@item smiley-data-directory
+@vindex smiley-data-directory
+\e$B%9%^%$%j!<$,4i%U%!%$%k$rC5$9>l=j!#\e(B
+
+@item smiley-flesh-color
+@vindex smiley-flesh-color
+\e$BH)$N?'!#=i4|@_DjCM$O!"?M<o:9JLE*$@$1$I\e(B @samp{yellow} \e$B$G$9!#\e(B
+
+@item smiley-features-color
+@vindex smiley-features-color
+\e$B%U%'%$%9$N5!G=$N?'!#=i4|@_DjCM$O\e(B @samp{black} \e$B$G$9!#\e(B
+
+@item smiley-tongue-color
+@vindex smiley-tongue-color
+\e$B@e$N?'!#=i4|@_DjCM$O\e(B @samp{red} \e$B$G$9!#\e(B
+
+@item smiley-circle-color
+@vindex smiley-circle-color
+\e$B4i$N<~$j$N4]$N?'!#=i4|@_DjCM$O\e(B @samp{black} \e$B$G$9!#\e(B
+
+@item smiley-mouse-face
+@vindex smiley-mouse-face
+\e$B%^%&%9$G6/D4I=<($7$?$H$-$N4i!#\e(B
+
+@end table
+
+
+@node Toolbar
+@subsection \e$B%D!<%k%P!<\e(B
+
+@table @code
+
+@iftex
+@iflatex
+\margindex{}
+@end iflatex
+@end iftex
+
+@item gnus-use-toolbar
+@vindex gnus-use-toolbar
+@code{nil} \e$B$J$i$P%D!<%k%P!<$rI=<($7$J$$!#\e(B@code{nil} \e$B0J30$N>l9g$O!"\e(B
+@code{default-toolbar}\e$B!"\e(B@code{top-toolbar}\e$B!"\e(B
+@code{bottom-toolbar}\e$B!"\e(B@code{right-toolbar}\e$B!"\e(B@code{left-toolbar}
+\e$B$N$I$l$+$G$J$/$F$O$J$j$^$;$s!#\e(B
+
+@item gnus-group-toolbar
+@vindex gnus-group-toolbar
+\e$B%0%k!<%W%P%C%U%!Fb$N%D!<%k%P!<!#\e(B
+
+@item gnus-summary-toolbar
+@vindex gnus-summary-toolbar
+\e$B35N,%P%C%U%!Fb$N%D!<%k%P!<!#\e(B
+
+@item gnus-summary-mail-toolbar
+@vindex gnus-summary-mail-toolbar
+\e$B%a!<%k%0%k!<%W$N35N,%P%C%U%!Fb$N%D!<%k%P!<!#\e(B
+
+@end table
+
+
+@node XVarious
+@subsection \e$B$5$^$6$^$J\e(B XEmacs \e$BJQ?t\e(B
+
+@table @code
+@item gnus-xmas-glyph-directory
+@vindex gnus-xmas-glyph-directory
+\e$B$3$l$O\e(B gnus \e$B$,3($rC5$9>l=j$G$9!#\e(BGnus \e$B$ODL>o$3$N%G%#%l%/%H%j$r<+\e(B
+\e$BF08!=P$7$^$9$,!"$b$7I8=`E*$G$J$$%G%#%l%/%H%j!<9=B$$r;}$C$F$$$k>l\e(B
+\e$B9g$O!"$3$l$r<jF0$G@_Dj$9$k$3$H$,$G$-$^$9!#\e(B
+
+@item gnus-xmas-logo-color-alist
+@vindex gnus-xmas-logo-color-alist
+\e$B$3$l$OO"A[%j%9%H$G!"%-!<$O<oJL%7%s%\%k!"CM$O%?%$%H%kJG3(J8;z$NA0\e(B
+\e$BLL?'$HGX7J?'$G$9!#\e(B
+
+@item gnus-xmas-logo-color-style
+@vindex gnus-xmas-logo-color-style
+\e$B$3$l$OA05-$NO"A[%j%9%H$G?'$r8!:w$9$k$N$K;H$o$l$k%-!<$G$9!#@5$7$$\e(B
+\e$BCM$K$O\e(B @code{flame}\e$B!"\e(B @code{pine}\e$B!"\e(B @code{moss}\e$B!"\e(B@code{irish}\e$B!"\e(B
+@code{sky}\e$B!"\e(B @code{tin}\e$B!"\e(B @code{velvet}\e$B!"\e(B @code{grape}\e$B!"\e(B
+@code{labia}\e$B!"\e(B @code{berry}\e$B!"\e(B @code{neutral}\e$B!"\e(B@code{september}
+\e$B$,$"$j$^$9!#\e(B
+
+
+@item gnus-xmas-modeline-glyph
+@vindex gnus-xmas-modeline-glyph
+\e$BA4$F$N\e(B gnus \e$B%b!<%I9T$GI=<($5$l$k3(J8;z!#$3$l$O=i4|@_Dj$G$O$A$$$5\e(B
+\e$B$J%L!<\e(B (gnu) \e$B$NF,$G$9!#\e(B
+
+@iftex
+@iflatex
+\margindex{}
+@end iflatex
+@end iftex
+
+@end table
+
+
+
+
+@node Fuzzy Matching
+@section \e$B%U%!%8!<$J0lCW\e(B
+@cindex fuzzy matching
+
+Gnus \e$B$O!"%9%3%"IU$1!"%9%l%C%I$N7A@.!"%9%l%C%IHf3S$J$I$r9T$&$H$-\e(B
+\e$B$K!"\e(B@code{Subject} \e$B9T$N%U%!%8!<$J0lCW\e(B @dfn{fuzzy matching} \e$BJ}K!\e(B
+\e$B$rDs6!$7$F$$$^$9!#\e(B
+
+\e$B@55,I=8=0lCW$H$O0c$C$F!"%U%!%8!<$J0lCW$O$H$C$F$b%U%!%8!<$G$9!#$"\e(B
+\e$B$^$j$K$b%U%!%8!<$9$.$F!"2?$,%U%!%8!<\e(B @dfn{fuzziness} \e$B$G$"$k$+$H\e(B
+\e$B$$$&Dj5A$5$($"$j$^$;$s$7!"<BAu$b2?EY$bJQ99$5$l$F$$$^$9!#\e(B
+
+\e$B4pK\E*$K$O!"$3$l$OHf3S$NA0$K9T$+$i<YKbJ*$r<h$j=|$3$&$H$7$^$9!#\e(B
+@samp{Re: } \e$B$dA^F~6g$N0u$d6uGrJ8;zEy!9$OJ8;zNs$+$i=|5n$5$l!"$=$N\e(B
+\e$B7k2L$rHf3S$7$^$9!#$3$l$O$[$H$s$I$N>l9gBEEv$J7k2L$r=P$7$^$9\e(B ---
+\e$B$?$H$(%K%e!<%9%j!<%@!<$N2>LL$r$+$V$C$?J8;zNs@Z$j9o$_5!$G@8@.$5$l\e(B
+\e$B$?J8;zNs$,:9$7=P$5$l$F$b!"$G$9!#\e(B
+
+
+@node Thwarting Email Spam
+@section spam \e$B%a!<%k$NN"$r$+$/\e(B
+@cindex email spam
+@cindex spam
+@cindex UCE
+@cindex unsolicited commercial email
+
+\e$B$3$3:G6a$N\e(B USENET \e$B$G$O!"@kEA$N%O%2%?%+$I$b$,!"H`$i$N:>5=$d@=IJ$r\e(B
+\e$B2!$7IU$1$k$?$a$NEE;R%a!<%k%"%I%l%9$rC5$=$&$H$7$F!"5$0c$$$N$h$&$K\e(B
+\e$B%K%e!<%9>e$r$&$m$D$$$F\e(B grep \e$B$7$^$/$C$F$$$^$9!#$3$l$KBP$9$kH?F0$H\e(B
+\e$B$7$F!"B?$/$N?M!9$,\e(B @code{From} \e$B9T$KL50UL#$J%"%I%l%9$rF~$l$O$8$a\e(B
+\e$B$k$h$&$K$J$C$F$7$^$$$^$7$?!#$3$l$OHs@8;:E*$J$3$H$@$H;d$O;W$$$^$9\e(B
+--- \e$B$"$J$?$,=q$$$?$3$H$KBP$9$kJV?.$H$7$F@5Ev$J%a!<%k$rAw$k$3$H$r\e(B
+\e$BLLE]$K$5$;!"$^$?C/$,=q$$$?$b$N$J$N$+$rJ,$+$j$E$i$/$7$^$9!#$3$s$J\e(B
+\e$B=q$-49$($O7k6I$O!"2!$7IU$1@kEA%a!<%k$=$l<+?H$h$j$bBg$-$J6<0R$H$J\e(B
+\e$B$k$+$b$7$l$^$;$s!#\e(B
+
+\e$B;d$K$H$C$F$N\e(B spam \e$B%a!<%k$N:GBg$NLdBj$O!"13$N8}<B$GF~$C$F$/$k$+$i\e(B
+\e$B$G$9!#;d$,\e(B @kbd{g} \e$B$r2!$7$?$H$9$k$H!"\e(Bgnus \e$B$O\e(B 10 \e$BDL$N?7Ce%a!<%k$,\e(B
+\e$B$"$j$^$9$HM[5$$K;d$K65$($F$/$l$^$9!#;d$O\e(B ``\e$B$*$*$C!"$o!<$$\e(B! \e$BKM$C\e(B
+\e$B$F9,$;\e(B!'' \e$B$H8@$C$F%a!<%k%0%k!<%W$rA*Br$7$^$9!#$7$+$7$=$3$K$O!"Fs\e(B
+\e$B$D$N%M%:%_9V$H!"<7$D$N9-9p\e(B (`` \e$B:G?7\e(B! \e$B4q@W$NA}LS%H%K%C%/!"$U$5$U\e(B
+\e$B$5$G$D$d$D$d$NH1$r!"$"$J$?$N$D$^@h$^$G\e(B!'') \e$B$H!"2y$$2~$a?@$r?.$8\e(B
+\e$B$h!"$H$$$&0l$D$N%a!<%k$,$"$k$@$1$J$N$G$9!#\e(B
+
+\e$B$3$l$OITL{2w$G$9!#\e(B
+
+\e$B$3$l$KBP=h$9$kJ}K!$O!"\e(Bgnus \e$B$KA4$F$N\e(B spam \e$B$r\e(B @samp{spam} \e$B%a!<%k%0\e(B
+\e$B%k!<%W$KJ,N%$5$;$F$7$^$&$3$H$G$9\e(B (@pxref{Splitting Mail})\e$B!#\e(B
+
+\e$B:G=i$K!"$"$J$?$KE~C#@-$N$"$k@5$7$$%a!<%k%"%I%l%9$r0l$DA*$S!"$=$l\e(B
+\e$B$rA4$F$N$"$J$?$N%K%e!<%95-;v$N\e(B @code{From} \e$B%X%C%@!<$KF~$l$^$9!#\e(B
+(\e$B$3$3$G$O\e(B @samp{larsi@@trym.ifi.uio.no} \e$B$rA*$S$^$7$?$,!"\e(B
+@samp{larsi+usenet@@ifi.uio.no} \e$B7A<0$N$?$/$5$s$N%"%I%l%9$NJ}$,NI\e(B
+\e$B$$A*Br$G$9!#$"$J$?$N%5%$%H$N\e(B sendmail \e$B$N@_Dj$,%a!<%k%"%I%l%9$N%m!<\e(B
+\e$B%+%kIt$H$7$F$I$s$J%-!<%o!<%I$r<u$1IU$1$k$+$O!"$"$J$?$N%5%$%H$N%7\e(B
+\e$B%9%F%`4IM}<T$KJ9$$$F$/$@$5$$!#\e(B)
+
+@lisp
+(setq message-default-news-headers
+ "From: Lars Magne Ingebrigtsen <larsi@@trym.ifi.uio.no>\n")
+@end lisp
+
+\e$B$=$7$F\e(B @code{nnmail-split-fancy} \e$B$K0J2<$NJ,N%5,B'$rF~$l$^$9\e(B
+(@pxref{Fancy Mail Splitting})\e$B!#\e(B
+
+@lisp
+(
+ ...
+ (to "larsi@@trym.ifi.uio.no"
+ (| ("subject" "re:.*" "misc")
+ ("references" ".*@@.*" "misc")
+ "spam"))
+ ...
+)
+@end lisp
+
+\e$B$3$N0UL#$O!"$3$N%"%I%l%9$KFO$$$?A4$F$N%a!<%k$r$^$:5?$$$^$9$,!"\e(B
+@samp{Re:} \e$B$G;O$^$k\e(B @code{Subject} \e$B$,$D$$$F$$$k$+!"\e(B
+@code{References} \e$B%X%C%@!<$,$D$$$F$$$l$P$*$=$i$/\e(B OK \e$B$@$m$&!"$H$$\e(B
+\e$B$&$3$H$G$9!#;D$j$OA4$F\e(B @samp{spam} \e$B%0%k!<%W$K9T$-$^$9!#\e(B(\e$B$3$N%"%$\e(B
+\e$B%G%"$O$*$=$i$/\e(B Tim Pierce \e$B;a$K$h$k$b$N$G$9!#\e(B)
+
+\e$B$3$l$K2C$($F!"B?$/$N%a!<%k\e(B spam \e$B20$O!"$"$J$?$N$H$3$m$N\e(B
+@code{smtp} \e$B%5!<%P!<$HD>@\OC$7!"\e(B@code{To} \e$B%X%C%@!<$K$"$J$?$N%a!<\e(B
+\e$B%k%"%I%l%9$,L@<($5$l$J$$$h$&$K$7$^$9!#$J$s$G$=$s$J$3$H$r$9$k$N$+\e(B
+\e$B$O$o$+$j$^$;$s$,\e(B --- \e$B$*$=$i$/;d$?$A$NN"$r$+$/5!9=$NN"$r$+$/$?$a\e(B
+\e$B$+$J\e(B? \e$B$I$A$i$K$7$F$b!"BP=h$O4JC1$J$3$H$G$9\e(B --- \e$B$"$J$?08$F$G\e(B
+\e$B$J$$$b$N$rA4It\e(B @samp{spam} \e$B%0%k!<%W$K$$$l$k$@$1$G$9!#$3$l$O$*9%\e(B
+\e$B$_J,N%5,B'$N:G8e$K$3$s$JIw$KF~$l$k$3$H$G$G$-$^$9!#\e(B
+
+@lisp
+(
+ ...
+ (to "larsi" "misc")
+ "spam")
+@end lisp
+
+\e$B;d$N7P83$G$O!"$3$l$G;v<B>eA4$F$,@5$7$$%0%k!<%W$KJ,N`$5$l$^$9!#$^\e(B
+\e$B$"!"$=$l$G$b$H$-$I$-\e(B @samp{spam} \e$B%0%k!<%W$r%A%'%C%/$7$F!"@5$7$$\e(B
+\e$B%a!<%k$,$"$k$+%A%'%C%/$7$J$/$F$O$$$1$^$;$s$1$I$M!#$b$7$"$J$?$O<+\e(B
+\e$BJ,$,NI$$%M%C%H%o!<%/;TL1$G$"$k$H;W$C$F$$$k$J$i!"$=$l$>$l$N2!$7IU\e(B
+\e$B$1@kEA%a!<%k$N4X78Ev6I$K6l>p$rAw$jIU$1$k$3$H$5$($b$G$-$^$9\e(B ---
+\e$B2K$J$H$-$K$G$b$M!#\e(B
+
+\e$B$^$?!"$"$J$?$,BU$1<T$N%M%C%H%o!<%/;TL1$G$b$"$k$J$i!"\e(B
+@file{gnus-junk.el} \e$B%Q%C%1!<%8$K$h$C$F<+F0E*$K6l>p$r$$$&J}$,NI$$\e(B
+\e$B$H;W$&$+$b$7$l$^$;$s!#$3$l$O\e(B
+@file{<URL:http://stud2.tuwien.ac.at/~e9426626/gnus-junk.html>}
+\e$B$+$i!VL5NA$G!WMxMQ$G$-$^$9!#$[$H$s$I$N\e(B spam \e$B%a!<%k$O<+F0E*$KAw$i\e(B
+\e$B$l$F$$$k$N$G!"$A$g$C$H$@$11'Ch$N%P%i%s%9$,$H$l$k$+$b$7$l$^$;$s!#\e(B
+
+\e$B$3$l$G;d$N$H$3$m$G$OF0$$$F$$$^$9!#$3$l$G$_$s$J$O4JC1$JJ}K!$G;d$K\e(B
+\e$BO"Mm$r<h$k$3$H$,$G$-\e(B (\e$BIaDL$K\e(B @kbd{r} \e$B$r2!$9$@$1$G$G$-$k\e(B)\e$B!";d$O\e(B
+spam \e$B$KHQ$o$5$l$k$3$H$OA4$/$"$j$^$;$s!#F@!9>uBV$G$9!#;d$N0U8+$H\e(B
+\e$B$7$F$O!"\e(B @code{From} \e$B%X%C%@!<$K56B$$7$FB8:_$7$J$$%I%a%$%s$KAw$i\e(B
+\e$B$;$k$N$O%-%?%J%$$G$9!#\e(B
+
+
+@node Various Various
+@section \e$B$$$m$$$m$N$$$m$$$m\e(B
+@cindex mode lines
+@cindex highlights
+
+@table @code
+
+@item gnus-home-directory
+\e$BA4$F$N\e(B gnus \e$B$N%Q%9JQ?t$O$3$NJQ?t$K$h$C$F=i4|2=$5$l$^$9!#$=$N=i4|\e(B
+\e$B@_DjCM$O\e(B @file{~/} \e$B$G$9!#\e(B
+
+@item gnus-directory
+@vindex gnus-directory
+\e$B$?$/$5$s$N\e(B gnus \e$B3JG<%Q%9JQ?t$O$3$NJQ?t$K$h$C$F=i4|2=$5$l$^$9!#$=\e(B
+\e$B$N=i4|@_DjCM$O\e(B @samp{SAVEDIR} \e$B4D6-JQ?t$NCM$+!"$=$NJQ?t$,@_Dj$5$l\e(B
+\e$B$F$$$J$$>l9g$O\e(B @file{~/News/} \e$B$G$9!#\e(B
+
+@file{.gnus.el} \e$B%U%!%$%k$,FI$^$l$?$H$-$O\e(B gnus \e$B$N$[$H$s$I$O$9$G$K\e(B
+\e$BFI$_9~$^$l$F$$$k$H$$$&$3$H$KCm0U$7$F$/$@$5$$!#$3$l$O$D$^$j!"$3$N\e(B
+\e$BJQ?t$r\e(B @file{.gnus.el} \e$B$NCf$G@_Dj$7$F$b!"$3$NJQ?t$K$h$C$F=i4|2=\e(B
+\e$B$5$l$kB>$N%G%#%l%/%H%j!<JQ?t$O@5$7$/@_Dj$5$l$J$$$@$m$&$H$$$&$3$H\e(B
+\e$B$G$9!#$3$NJQ?t$OBe$o$j$K\e(B @file{.emacs} \e$B$G@_Dj$7$F$/$@$5$$!#\e(B
+
+@item gnus-default-directory
+@vindex gnus-default-directory
+\e$B>e5-$NJQ?t$K$OA4$/4X78$"$j$^$;$s\e(B --- \e$B$3$NJQ?t$OA4$F$N\e(B gnus \e$B%P%C\e(B
+\e$B%U%!!<$N%G%#%U%)%k%H%G%#%l%/%H%j!<$r$I$&$9$Y$-$+$r@_Dj$7$^$9!#$b\e(B
+\e$B$7\e(B @kbd{C-x C-f} \e$B$N$h$&$JL?Na$r<B9T$9$k$H!"8=:_$N%P%C%U%!!<$N%G%#\e(B
+\e$B%U%)%k%H%G%#%l%/%H%j!<$r5/E@$K$7$?%W%m%s%W%H$,=P$F$/$k$G$7$g$&!#\e(B
+
+
+
+\e$B$3$NJQ?t$,\e(B @code{nil} (\e$B$3$l$,=i4|@_DjCM\e(B) \e$B$G$"$l$P!"\e(B gnus \e$B$r5/F0\e(B
+\e$B$7$?$H$-$K$"$J$?$,$$$?%P%C%U%!!<$N%G%#%U%)%k%H%G%#%l%/%H%j!<$,%G%#\e(B
+\e$B%U%)%k%H%G%#%l%/%H%j!<$K$J$k$G$7$g$&!#\e(B
+
+@item gnus-verbose
+@vindex gnus-verbose
+\e$B$3$NJQ?t$O\e(B 0 \e$B$+$i\e(B 10 \e$B$^$G4V$N@0?t$G$9!#Bg$-$$?t;z$[$I$?$/$5$s$N\e(B
+\e$B%a%C%;!<%8$,I=<($5$l$^$9!#$3$NJQ?t$,\e(B 0 \e$B$G$"$l$P\e(B gnus \e$B$O2?$N%a%C\e(B
+\e$B%;!<%8$b8+$;$^$;$s!#$3$l$,\e(B 7 (\e$B=i4|@_DjCM\e(B) \e$B$G$"$l$PFC$K=EMW$J%a%C\e(B
+\e$B%;!<%8$,I=<($5$l!"\e(B10 \e$B$G$"$l$P\e(B gnus \e$B$O7h$7$F$*C}$j$r;_$a$:!"$?$/\e(B
+\e$B$5$s$N%a%C%;!<%8$G$"$J$?$K$a$^$$$r5/$3$5$;$k$G$7$g$&!#\e(B
+
+@item gnus-verbose-backends
+@vindex gnus-verbose-backends
+\e$B$3$NJQ?t$O\e(B @code{gnus-verbose} \e$B$HF1MM$KF0:n$7$^$9$,!"\e(Bgnus \e$BK\BN$G\e(B
+\e$B$O$J$/\e(B gnus \e$B$N%P%C%/%(%s%I$KBP$7$FE,MQ$5$l$^$9!#\e(B
+
+@item nnheader-max-head-length
+@vindex nnheader-max-head-length
+\e$B%P%C%/%(%s%I$,5-;v$N%X%C%@!<$r$^$C$9$0FI$s$G$$$k$H$-$O!"$G$-$k8B\e(B
+\e$B$j>/$J$$NL$@$1$rFI$b$&$HEXNO$7$^$9!#$3$NJQ?t\e(B (\e$B=i4|@_DjCM\e(B 4096)
+\e$B$O!"%P%C%/%(%s%I$,%X%C%@!<$HK\J8$N4V$N6h@Z$j9T$r8+$D$1$k$^$G$KFI\e(B
+\e$B$_9~$b$&$H$9$k@dBP:GBgD9$r;XDj$7$^$9!#$3$NJQ?t$,\e(B @code{nil} \e$B$G$"\e(B
+\e$B$l$P!"FI$_9~$_>e8B$O$"$j$^$;$s!#$b$7\e(B @code{t} \e$B$G$"$l$P!"%P%C%/%(\e(B
+\e$B%s%I$O5-;v$rItJ,ItJ,$GFI$_9~$b$&$H$O$;$:!"5-;vA4BN$rFI$_9~$_$^$9!#\e(B
+\e$B$3$l$O\e(B @code{ange-ftp} \e$B$d\e(B @code{efs} \e$B$N$"$k%P!<%8%g%s$G0UL#$r$b\e(B
+\e$B$A$^$9!#\e(B
+
+@item nnheader-head-chop-length
+@vindex nnheader-head-chop-length
+\e$B$3$NJQ?t\e(B (\e$B=i4|@_DjCM\e(B 2048) \e$B$O!"A05-$NA`:n$r9T$C$F$$$k$H$-$K!"$I\e(B
+\e$B$l$/$i$$$NBg$-$5$NC10L$G3F5-;v$rFI$_9~$`$+$r@_Dj$7$^$9!#\e(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
+\e$B$3$l$O%U%!%$%kL>$NJ8;z$r$I$N$h$&$KJQ49$9$k$+$r;XDj$9$kO"A[%j%9%H\e(B
+\e$B$G$9!#Nc$($P!"$b$7\e(B @samp{:} \e$B$,$"$J$?$N%7%9%F%`$G$O%U%!%$%kL>$NJ8\e(B
+\e$B;z$H$7$F$O;H$($J$$>l9g\e(B (\e$B$"$J$?$O\e(B OS/2 \e$B%f!<%6$G$9\e(B) \e$B!"0J2<$N$h$&$K\e(B
+\e$B$9$k$3$H$,$G$-$^$9!#\e(B
+
+@lisp
+(setq nnheader-file-name-translation-alist
+ '((?: . ?_)))
+@end lisp
+
+\e$B<B:]$K$O!"$3$l$O\e(B OS/2 \e$B$H\e(B (\e$B$/$=\e(B) MS Windows \e$B%7%9%F%`>e$G$N$3$NJQ\e(B
+\e$B?t$N=i4|@_DjCM$G$9!#\e(B
+
+@item gnus-hidden-properties
+@vindex gnus-hidden-properties
+\e$B$3$l$O\e(B ``\e$BIT2D;k\e(B'' \e$B%F%-%9%H$r1#$9$?$a$K;H$o$l$kB0@-$N%j%9%H$G$9!#\e(B
+\e$B$[$H$s$I$N%7%9%F%`$G$O=i4|@_DjCM$O\e(B @code{(invisible t intangible
+t)} \e$B$G!"$3$l$OIT2D;k%F%-%9%H$r8+$($J$/$7$F?($l$J$/$7$^$9!#\e(B
+
+@item gnus-parse-headers-hook
+@vindex gnus-parse-headers-hook
+\e$B%X%C%@!<$r2r<a$9$kA0$K8F$S=P$5$l$k%U%C%/!#$3$l$ONc$($P!"<hF@$7$?\e(B
+\e$B%X%C%@!<$NE}7W>pJs$r<h$k$H$+!"$"$k$$$O$"$k<o$N%X%C%@!<$r<h$j=|$/\e(B
+\e$B$3$H$K;H$&$3$H$,$G$-$^$9!#$^$"!";d$O2?$G$3$s$J$b$N$,M_$7$$$+$h$/\e(B
+\e$B$o$+$s$J$$$s$@$1$I$M!#\e(B
+
+@item gnus-shell-command-separator
+@vindex gnus-shell-command-separator
+\e$BFs$D$N%7%'%kL?Na$r6h@Z$k$N$K;HMQ$5$l$kJ8;zNs!#=i4|@_DjCM$O\e(B
+@samp{;} \e$B$G$9!#\e(B
+
+
+@end table
+
+
+
+@node The End
+@chapter \e$B=*$o$j\e(B
+
+\e$B$O$$!"0J>e$,%^%K%e%"%k$G$9\e(B---\e$B$"$J$?$O$b$&<+J,<+?H$N?M@8$rAw$k;v$,$G$-$^\e(B
+\e$B$9!#O"Mm$r$H$C$F2<$5$$!#$"$J$?$NG-$K:#F|$O!"$H$$$C$F$*$$$F2<$5$$!#\e(B
+
+\e$B$*$*!"\e(B@strong{\e$B?@$h\e(B}---\e$B$5$h$J$i$rBQ$($k;v$O$G$-$^$;$s!#\e(B(\e$B$9$9$j5c$-!#\e(B)
+
+Ol' Charles Reznikoff \e$B$O$=$l$rHs>o$K$h$/8=$7$F$$$^$9$N$G!"$3$3$OH`$N$?$a\e(B
+\e$B$K>y$j$^$9\e(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
+
+\e$B;nLu\e(B:
+
+@quotation
+@strong{Te Deum}
+
+@sp 1
+\e$B>!Mx$7$?$+$i$G$O$J$/\e(B @*
+\e$B;d$O2N$&\e(B @*
+\e$B2?$bL5$$$1$l$I\e(B @*
+\e$B$"$NF|8w$d\e(B @*
+\e$BB)?a$d\e(B @*
+\e$B=U$NBg$-$5$N$?$a$K\e(B @*
+
+@sp 1
+\e$B>!Mx$N$?$a$G$O$J$/\e(B @*
+\e$B0lF|$NO+F/$N$?$a$K\e(B @*
+\e$B$^$?!"$=$l$rC#@.$G$-$?$3$H$K\e(B @*
+\e$B9b:B$N>e$N@J$N$?$a$G$O$J$/\e(B @*
+\e$BIaDL$N%F!<%V%k$N$H$3$m$G\e(B @*
+@end quotation
+
+
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Semi-gnus 6.7.8 Manual
+@settitle Semi-gnus 6.8.1 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Semi-gnus 6.7.8 Manual
+@title Semi-gnus 6.8.1 Manual
@author by Lars Magne Ingebrigtsen
@page
API. So Semi-gnus does not discriminate various language communities.
Oh, if you are a Klingon, please wait Unicode Next Generation.
-This manual corresponds to Semi-Gnus 6.7.8
+This manual corresponds to Semi-gnus 6.8.1.
@end ifinfo
@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
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
@code{mail-extract-address-components}, which works nicely, but is
slower; and @code{std11-extract-address-components}, which works very
nicely, but is slower. The default function will return the wrong
-answer in 5% of the cases. If this is unacceptable to you, use the
-other function instead.
+answer in 5% of the cases. If this is unacceptable to you, use one of
+the other functions instead.
@vindex gnus-summary-same-subject
@code{gnus-summary-same-subject} is a string indicating that the current
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\e(I_\e(B sein!
+@code{postmaster}. Ordnung muß sein!
This command understands the process/prefix convention
(@pxref{Process/Prefix}).
@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
@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)
@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
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
@kindex C-c ^ (Article)
@findex gnus-article-refer-article
If point is in the neighborhood of a @code{Message-ID} and you press
-@kbd{C-c ^}, Gnus will try to get that article from the server
+@kbd{C-c ^}, gnus will try to get that article from the server
(@code{gnus-article-refer-article}).
@item C-c C-m
* 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
@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} or @code{name}. 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).
+
+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))
+ (posting-from-work-p
+ (signature-file "~/.work-signature")
+ (address "user@@bar.foo")
+ (organization "Important Work, Inc"))
+ ("^nn.+:"
+ (signature-file "~/.mail-signature"))))
+@end lisp
@node Drafts
@section Drafts
@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
@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
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'\e$BsU\e(Bre} is to
+providers if they were to do this---their @emph{raison d'être} is to
make money off of advertisements, not to provide services to the
community. Since @code{nnweb} washes the ads off all the articles, one
might think that the providers might be somewhat miffed. We'll see.
@item !
@itemx not
-@itemx \e(I,\e(B
+@itemx ¬
This logical operator only takes a single argument. It returns the
logical negation of the value of its argument.
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.24' 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'' --
Kevin Davidson---came up with the name @dfn{ding}, so blame him.
@item
-Fran\e$BmP\e(Bis Pinard---many, many interesting and thorough bug reports, as
+François Pinard---many, many interesting and thorough bug reports, as
well as autoconf support.
@end itemize
Christopher Davis,
Andrew Eskilsson,
Kai Grossjohann,
-David K\e$BiH\e(Bedal,
+David Kågedal,
Richard Pieri,
Fabrice Popineau,
Daniel Quinlan,
Zlatko Calusic,
Massimo Campostrini,
Castor,
+David Charlap,
Dan Christensen,
Kevin Christian,
Michael R. Cook,
Gunnar Horrigmo,
Richard Hoskins,
Brad Howes,
-Fran\e$BmP\e(Bis Felix Ingrand,
+François Felix Ingrand,
Ishikawa Ichiro, @c Ishikawa
Lee Iverson,
Iwamuro Motonori, @c Iwamuro
* 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.24.
@end menu
These lists are, of course, just @emph{short} overviews of the
@node Quassia Gnus
@subsubsection Quassia Gnus
-New features in Gnus 5.6.22:
+New features in Gnus 5.6.24:
@itemize @bullet
@end example
@item
- tanken var at n\e$BiS\e(B du bruker `gnus-startup-file' som prefix (FOO) til \92é\81lete
-opp en fil FOO-SERVER, FOO-SERVER.el, FOO-SERVER.eld, kan du la den v\e$BkS\e(Be en
+ tanken var at når 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ære en
liste hvor du bruker hvert element i listen som FOO, istedet. da kunne man
hatt forskjellige serveres startup-filer forskjellige steder.
for sci? first the sci.something? then sci.somethingelse?...
@item
-Ja, det burde v\e$BkS\e(Be en m\e$BiU\e(Be \92é\81si slikt. Kanskje en ny variabel?
-`gnus-use-few-score-files'? S\92é\81kunne score-regler legges til den
+Ja, det burde være en måte å si slikt. Kanskje en ny variabel?
+`gnus-use-few-score-files'? Så kunne score-regler legges til den
"mest" lokale score-fila. F. eks. ville no-gruppene betjenes av
"no.all.SCORE", osv.
@item
gnus-article-hide-pgp
-Selv ville jeg nok ha valgt \92é\81slette den dersom teksten matcher
+Selv ville jeg nok ha valgt å slette den dersom teksten matcher
@example
"\\(This\s+\\)?[^ ]+ has been automatically signed by"
@end example
with unread articles, even if that group is hidden in a topic.
@item
+gnus-posting-styles doesn't work in drafts.
+
+@item
Solve the halting problem.
@c TODO
@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
\input texinfo @c -*-texinfo-*-
@setfilename message
-@settitle Message 5.6.22 Manual
+@settitle Message 5.6.24 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Message 5.6.22 Manual
+@title Message 5.6.24 Manual
@author by Lars Magne Ingebrigtsen
@page
* 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.24. Message is distributed with
the Gnus distribution bearing the same version number as this manual
has.