This commit was manufactured by cvs2svn to create branch 'keiichi'.
authortomo <tomo>
Fri, 25 Sep 1998 23:17:28 +0000 (23:17 +0000)
committertomo <tomo>
Fri, 25 Sep 1998 23:17:28 +0000 (23:17 +0000)
31 files changed:
ChangeLog
GNUS-NEWS
lisp/base64.el [new file with mode: 0644]
lisp/date.el [new file with mode: 0644]
lisp/drums.el [new file with mode: 0644]
lisp/gnus-art.el
lisp/gnus-cite.el
lisp/gnus-cus.el
lisp/gnus-ems.el
lisp/gnus-gl.el
lisp/gnus-picon.el
lisp/gnus.el
lisp/ietf-drums.el [new file with mode: 0644]
lisp/mail-parse.el [new file with mode: 0644]
lisp/mailcap.el [new file with mode: 0644]
lisp/message.el
lisp/mm-decode.el [new file with mode: 0644]
lisp/mm-encode.el [new file with mode: 0644]
lisp/mm-util.el [new file with mode: 0644]
lisp/mm-view.el [new file with mode: 0644]
lisp/mm.el [new file with mode: 0644]
lisp/nnweb.el
lisp/pop3-fma.el
lisp/qp.el [new file with mode: 0644]
lisp/rfc1522.el [new file with mode: 0644]
lisp/rfc2047.el [new file with mode: 0644]
lisp/rfc2231.el [new file with mode: 0644]
lisp/time-date.el [new file with mode: 0644]
texi/emacs-mime.texi [new file with mode: 0644]
texi/gnus-ja.texi
texi/gnus.texi

index 21f0fd6..ee05b87 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,47 +1,6 @@
-1998-07-10  Keiichi Suzuki  <kei-suzu@mail.wbs.ne.jp>
+1998-07-19  Tatsuya Ichikawa  <t-ichi@po.shiojiri.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-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.
+       * lisp/pop3-fma.el: Change version No to 1.00.
 
 1998-06-30  Keisuke Mori   <ksk@ntts.com>
 
index 71e58c7..0c5b11a 100644 (file)
--- a/GNUS-NEWS
+++ b/GNUS-NEWS
@@ -98,3 +98,5 @@ updated by the `gnus-start-date-timer' command.
 *** 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.
diff --git a/lisp/base64.el b/lisp/base64.el
new file mode 100644 (file)
index 0000000..b96e890
--- /dev/null
@@ -0,0 +1,274 @@
+;;; base64.el,v --- Base64 encoding functions
+;; Author: Kyle E. Jones
+;; Created: 1997/03/12 14:37:09
+;; Version: 1.6
+;; Keywords: extensions
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1997 Kyle E. Jones
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; For non-MULE
+(if (not (fboundp 'char-int))
+    (fset 'char-int 'identity))
+
+(defvar base64-alphabet
+  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
+
+(defvar base64-decoder-program nil
+  "*Non-nil value should be a string that names a MIME base64 decoder.
+The program should expect to read base64 data on its standard
+input and write the converted data to its standard output.")
+
+(defvar base64-decoder-switches nil
+  "*List of command line flags passed to the command named by
+base64-decoder-program.")
+
+(defvar base64-encoder-program nil
+  "*Non-nil value should be a string that names a MIME base64 encoder.
+The program should expect arbitrary data on its standard
+input and write base64 data to its standard output.")
+
+(defvar base64-encoder-switches nil
+  "*List of command line flags passed to the command named by
+base64-encoder-program.")
+
+(defconst base64-alphabet-decoding-alist
+  '(
+    ( ?A . 00) ( ?B . 01) ( ?C . 02) ( ?D . 03) ( ?E . 04) ( ?F . 05)
+    ( ?G . 06) ( ?H . 07) ( ?I . 08) ( ?J . 09) ( ?K . 10) ( ?L . 11)
+    ( ?M . 12) ( ?N . 13) ( ?O . 14) ( ?P . 15) ( ?Q . 16) ( ?R . 17)
+    ( ?S . 18) ( ?T . 19) ( ?U . 20) ( ?V . 21) ( ?W . 22) ( ?X . 23)
+    ( ?Y . 24) ( ?Z . 25) ( ?a . 26) ( ?b . 27) ( ?c . 28) ( ?d . 29)
+    ( ?e . 30) ( ?f . 31) ( ?g . 32) ( ?h . 33) ( ?i . 34) ( ?j . 35)
+    ( ?k . 36) ( ?l . 37) ( ?m . 38) ( ?n . 39) ( ?o . 40) ( ?p . 41)
+    ( ?q . 42) ( ?r . 43) ( ?s . 44) ( ?t . 45) ( ?u . 46) ( ?v . 47)
+    ( ?w . 48) ( ?x . 49) ( ?y . 50) ( ?z . 51) ( ?0 . 52) ( ?1 . 53)
+    ( ?2 . 54) ( ?3 . 55) ( ?4 . 56) ( ?5 . 57) ( ?6 . 58) ( ?7 . 59)
+    ( ?8 . 60) ( ?9 . 61) ( ?+ . 62) ( ?/ . 63)
+   ))
+
+(defvar base64-alphabet-decoding-vector
+  (let ((v (make-vector 123 nil))
+       (p base64-alphabet-decoding-alist))
+    (while p
+      (aset v (car (car p)) (cdr (car p)))
+      (setq p (cdr p)))
+    v))
+
+(defun base64-run-command-on-region (start end output-buffer command
+                                          &rest arg-list)
+  (let ((tempfile nil) status errstring)
+    (unwind-protect
+       (progn
+         (setq tempfile (make-temp-name "base64"))
+         (setq status
+               (apply 'call-process-region
+                      start end command nil
+                      (list output-buffer tempfile)
+                      nil arg-list))
+         (cond ((equal status 0) t)
+               ((zerop (save-excursion
+                         (set-buffer (find-file-noselect tempfile))
+                         (buffer-size)))
+                t)
+               (t (save-excursion
+                    (set-buffer (find-file-noselect tempfile))
+                    (setq errstring (buffer-string))
+                    (kill-buffer nil)
+                    (cons status errstring)))))
+      (condition-case ()
+         (delete-file tempfile)
+       (error nil)))))
+
+(defun base64-insert-char (char &optional count ignored buffer)
+  (condition-case nil
+      (progn
+       (insert-char char count ignored buffer)
+       (fset 'base64-insert-char 'insert-char))
+    (wrong-number-of-arguments
+     (fset 'base64-insert-char 'base64-xemacs-insert-char)
+     (base64-insert-char char count ignored buffer))))
+
+(defun base64-xemacs-insert-char (char &optional count ignored buffer)
+  (if (and buffer (eq buffer (current-buffer)))
+      (insert-char char count)
+    (save-excursion
+      (set-buffer buffer)
+      (insert-char char count))))
+
+(defun base64-decode-region (start end)
+  (interactive "r")
+  (message "Decoding base64...")
+  (let ((work-buffer nil)
+       (done nil)
+       (counter 0)
+       (bits 0)
+       (lim 0) inputpos
+       (non-data-chars (concat "^=" base64-alphabet)))
+    (unwind-protect
+       (save-excursion
+         (setq work-buffer (generate-new-buffer " *base64-work*"))
+         (buffer-disable-undo work-buffer)
+         (if base64-decoder-program
+             (let* ((binary-process-output t) ; any text already has CRLFs
+                    (status (apply 'base64-run-command-on-region
+                                  start end work-buffer
+                                  base64-decoder-program
+                                  base64-decoder-switches)))
+               (if (not (eq status t))
+                   (error "%s" (cdr status))))
+           (goto-char start)
+           (skip-chars-forward non-data-chars end)
+           (while (not done)
+             (setq inputpos (point))
+             (cond
+              ((> (skip-chars-forward base64-alphabet end) 0)
+               (setq lim (point))
+               (while (< inputpos lim)
+                 (setq bits (+ bits 
+                               (aref base64-alphabet-decoding-vector
+                                     (char-int (char-after inputpos)))))
+                 (setq counter (1+ counter)
+                       inputpos (1+ inputpos))
+                 (cond ((= counter 4)
+                        (base64-insert-char (lsh bits -16) 1 nil work-buffer)
+                        (base64-insert-char (logand (lsh bits -8) 255) 1 nil
+                                        work-buffer)
+                        (base64-insert-char (logand bits 255) 1 nil
+                                            work-buffer)
+                        (setq bits 0 counter 0))
+                       (t (setq bits (lsh bits 6)))))))
+             (cond
+              ((= (point) end)
+               (if (not (zerop counter))
+                   (error "at least %d bits missing at end of base64 encoding"
+                          (* (- 4 counter) 6)))
+               (setq done t))
+              ((= (char-after (point)) ?=)
+               (setq done t)
+               (cond ((= counter 1)
+                      (error "at least 2 bits missing at end of base64 encoding"))
+                     ((= counter 2)
+                      (base64-insert-char (lsh bits -10) 1 nil work-buffer))
+                     ((= counter 3)
+                      (base64-insert-char (lsh bits -16) 1 nil work-buffer)
+                      (base64-insert-char (logand (lsh bits -8) 255)
+                                          1 nil work-buffer))
+                     ((= counter 0) t)))
+              (t (skip-chars-forward non-data-chars end)))))
+         (or (markerp end) (setq end (set-marker (make-marker) end)))
+         (goto-char start)
+         (insert-buffer-substring work-buffer)
+         (delete-region (point) end))
+      (and work-buffer (kill-buffer work-buffer))))
+  (message "Decoding base64... done"))
+
+(defun base64-encode-region (start end)
+  (interactive "r")
+  (message "Encoding base64...")
+  (let ((work-buffer nil)
+       (counter 0)
+       (cols 0)
+       (bits 0)
+       (alphabet base64-alphabet)
+       inputpos)
+    (unwind-protect
+       (save-excursion
+         (setq work-buffer (generate-new-buffer " *base64-work*"))
+         (buffer-disable-undo work-buffer)
+         (if base64-encoder-program
+             (let ((status (apply 'base64-run-command-on-region
+                                  start end work-buffer
+                                  base64-encoder-program
+                                  base64-encoder-switches)))
+               (if (not (eq status t))
+                   (error "%s" (cdr status))))
+           (setq inputpos start)
+           (while (< inputpos end)
+             (setq bits (+ bits (char-int (char-after inputpos))))
+             (setq counter (1+ counter))
+             (cond ((= counter 3)
+                    (base64-insert-char (aref alphabet (lsh bits -18)) 1 nil
+                                        work-buffer)
+                    (base64-insert-char
+                     (aref alphabet (logand (lsh bits -12) 63))
+                     1 nil work-buffer)
+                    (base64-insert-char
+                     (aref alphabet (logand (lsh bits -6) 63))
+                     1 nil work-buffer)
+                    (base64-insert-char
+                     (aref alphabet (logand bits 63))
+                     1 nil work-buffer)
+                    (setq cols (+ cols 4))
+                    (cond ((= cols 72)
+                           (base64-insert-char ?\n 1 nil work-buffer)
+                           (setq cols 0)))
+                    (setq bits 0 counter 0))
+                   (t (setq bits (lsh bits 8))))
+             (setq inputpos (1+ inputpos)))
+           ;; write out any remaining bits with appropriate padding
+           (if (= counter 0)
+               nil
+             (setq bits (lsh bits (- 16 (* 8 counter))))
+             (base64-insert-char (aref alphabet (lsh bits -18)) 1 nil
+                                 work-buffer)
+             (base64-insert-char (aref alphabet (logand (lsh bits -12) 63))
+                                 1 nil work-buffer)
+             (if (= counter 1)
+                 (base64-insert-char ?= 2 nil work-buffer)
+               (base64-insert-char (aref alphabet (logand (lsh bits -6) 63))
+                                   1 nil work-buffer)
+               (base64-insert-char ?= 1 nil work-buffer)))
+           (if (> cols 0)
+               (base64-insert-char ?\n 1 nil work-buffer)))
+         (or (markerp end) (setq end (set-marker (make-marker) end)))
+         (goto-char start)
+         (insert-buffer-substring work-buffer)
+         (delete-region (point) end))
+      (and work-buffer (kill-buffer work-buffer))))
+  (message "Encoding base64... done"))
+
+(defun base64-encode (string)
+  (save-excursion
+    (set-buffer (get-buffer-create " *base64-encode*"))
+    (erase-buffer)
+    (insert string)
+    (base64-encode-region (point-min) (point-max))
+    (skip-chars-backward " \t\r\n")
+    (delete-region (point-max) (point))
+    (prog1
+       (buffer-string)
+      (kill-buffer (current-buffer)))))
+
+(defun base64-decode (string)
+  (save-excursion
+    (set-buffer (get-buffer-create " *base64-decode*"))
+    (erase-buffer)
+    (insert string)
+    (base64-decode-region (point-min) (point-max))
+    (goto-char (point-max))
+    (skip-chars-backward " \t\r\n")
+    (delete-region (point-max) (point))
+    (prog1
+       (buffer-string)
+      (kill-buffer (current-buffer)))))  
+
+(provide 'base64)
diff --git a/lisp/date.el b/lisp/date.el
new file mode 100644 (file)
index 0000000..b593e1c
--- /dev/null
@@ -0,0 +1,124 @@
+;;; date.el --- Date and time handling functions
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;;     Masanobu Umeda <umerin@mse.kyutech.ac.jp>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'timezone)
+
+(defun parse-time-string (date)
+  "Convert DATE into time."
+  (decode-time
+   (condition-case ()
+       (let* ((d1 (timezone-parse-date date))
+             (t1 (timezone-parse-time (aref d1 3))))
+        (apply 'encode-time
+               (mapcar (lambda (el)
+                         (and el (string-to-number el)))
+                       (list
+                        (aref t1 2) (aref t1 1) (aref t1 0)
+                        (aref d1 2) (aref d1 1) (aref d1 0)
+                        (number-to-string
+                         (* 60 (timezone-zone-to-minute (aref d1 4))))))))
+     ;; If we get an error, then we just return a 0 time.
+     (error (list 0 0)))))
+
+(defun date-to-time (date)
+  "Convert DATE into time."
+  (apply 'encode-time (parse-time-string date)))
+
+(defun time-less-p (t1 t2)
+  "Say whether time T1 is less than time T2."
+  (or (< (car t1) (car t2))
+      (and (= (car t1) (car t2))
+          (< (nth 1 t1) (nth 1 t2)))))
+
+(defun days-to-time (days)
+  "Convert DAYS into time."
+  (let* ((seconds (* 1.0 days 60 60 24))
+        (rest (expt 2 16))
+        (ms (condition-case nil (floor (/ seconds rest))
+              (range-error (expt 2 16)))))
+    (list ms (condition-case nil (round (- seconds (* ms rest)))
+              (range-error (expt 2 16))))))
+
+(defun time-since (time)
+  "Return the time since TIME, which is either an internal time or a date."
+  (when (stringp time)
+    ;; Convert date strings to internal time.
+    (setq time (date-to-time time)))
+  (let* ((current (current-time))
+        (rest (when (< (nth 1 current) (nth 1 time))
+                (expt 2 16))))
+    (list (- (+ (car current) (if rest -1 0)) (car time))
+         (- (+ (or rest 0) (nth 1 current)) (nth 1 time)))))
+
+(defun subtract-time (t1 t2)
+  "Subtract two internal times."
+  (let ((borrow (< (cadr t1) (cadr t2))))
+    (list (- (car t1) (car t2) (if borrow 1 0))
+         (- (+ (if borrow 65536 0) (cadr t1)) (cadr t2)))))
+
+(defun date-to-day (date)
+  "Return the number of days between year 1 and DATE."
+  (time-to-day (date-to-time date)))
+  
+(defun days-between (date1 date2)
+  "Return the number of days between DATE1 and DATE2."
+  (- (date-to-day date1) (date-to-day date2)))
+
+(defun date-leap-year-p (year)
+  "Return t if YEAR is a leap year."
+  (or (and (zerop (% year 4))
+          (not (zerop (% year 100))))
+      (zerop (% year 400))))
+
+(defun time-to-day-in-year (time)
+  "Return the day number within the year of the date month/day/year."
+  (let* ((tim (decode-time time))
+        (month (nth 4 tim))
+        (day (nth 3 tim))
+        (year (nth 5 tim))
+        (day-of-year (+ day (* 31 (1- month)))))
+    (when (> month 2)
+      (setq day-of-year (- day-of-year (/ (+ 23 (* 4 month)) 10)))
+      (when (date-leap-year-p year)
+       (setq day-of-year (1+ day-of-year))))
+    day-of-year))
+
+(defun time-to-day (time)
+  "The number of days between the Gregorian date 0001-12-31bce and TIME.
+The Gregorian date Sunday, December 31, 1bce is imaginary."
+  (let* ((tim (decode-time time))
+        (month (nth 4 tim))
+        (day (nth 3 tim))
+        (year (nth 5 tim)))
+    (+ (time-to-day-in-year time)      ;       Days this year
+       (* 365 (1- year))               ;       + Days in prior years
+       (/ (1- year) 4)                 ;       + Julian leap years
+       (- (/ (1- year) 100))           ;       - century years
+       (/ (1- year) 400))))            ;       + Gregorian leap years
+
+(provide 'date)
+
+;;; date.el ends here
diff --git a/lisp/drums.el b/lisp/drums.el
new file mode 100644 (file)
index 0000000..db982b7
--- /dev/null
@@ -0,0 +1,186 @@
+;;; drums.el --- Functions for parsing RFC822bis headers
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; DRUMS is and IETF Working Group that works (or worked) on the
+;; successor to RFC822, "Standard For The Format Of Arpa Internet Text
+;; Messages".  This library is based on
+;; draft-ietf-drums-msg-fmt-05.txt, released on 1998-08-05.
+
+;;; Code:
+
+(require 'date)
+
+(defvar drums-no-ws-ctl-token "\001-\010\013\014\016-\037\177"
+  "US-ASCII control characters excluding CR, LF and white space.")
+(defvar drums-text-token "\001-\011\013\014\016-\177"
+  "US-ASCII characters exlcuding CR and LF.")
+(defvar drums-specials-token "()<>[]:;@\\,.\""
+  "Special characters.")
+(defvar drums-quote-token "\\"
+  "Quote character.")
+(defvar drums-wsp-token " \t"
+  "White space.")
+(defvar drums-fws-regexp
+  (concat "[" drums-wsp-token "]*\n[" drums-wsp-token "]+")
+  "Folding white space.")
+(defvar drums-atext-token "-^a-zA-Z0-9!#$%&'*+/=?_`{|}~"
+  "Textual token.")
+(defvar drums-dot-atext-token "-^a-zA-Z0-9!#$%&'*+/=?_`{|}~."
+  "Textual token including full stop.")
+(defvar drums-qtext-token
+  (concat drums-no-ws-ctl-token "\041\043-\133\135-\177")
+  "Non-white-space control characaters, plus the rest of ASCII excluding backslash and doublequote.")
+  
+(defvar drums-syntax-table
+  (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
+    (modify-syntax-entry ?\\ "/" table)
+    (modify-syntax-entry ?< "(" table)
+    (modify-syntax-entry ?> ")" table)
+    table))
+
+(defsubst drums-init (string)
+  (set-syntax-table drums-syntax-table)
+  (insert string)
+  (drums-unfold-fws)
+  (goto-char (point-min)))
+
+(defun drums-remove-comments (string)
+  "Remove comments from STRING."
+  (with-temp-buffer
+    (let (c)
+      (drums-init string)
+      (while (not (eobp))
+       (setq c (following-char))
+       (cond
+        ((eq c ?\")
+         (forward-sexp 1))
+        ((eq c ?\()
+         (delete-region (point) (progn (forward-sexp 1) (point))))
+        (t
+         (forward-char 1))))
+      (buffer-string))))
+
+(defun drums-remove-whitespace (string)
+  "Remove comments from STRING."
+  (with-temp-buffer
+    (drums-init string)
+    (let (c)
+      (while (not (eobp))
+       (setq c (following-char))
+       (cond
+        ((eq c ?\")
+         (forward-sexp 1))
+        ((memq c '(? ?\t))
+         (delete-char 1))
+        (t
+         (forward-char 1))))
+      (buffer-string))))
+
+(defun drums-get-comment (string)
+  "Return the first comment in STRING."
+  (with-temp-buffer
+    (drums-init string)
+    (let (result c)
+      (while (not (eobp))
+       (setq c (following-char))
+       (cond
+        ((eq c ?\")
+         (forward-sexp 1))
+        ((eq c ?\()
+         (setq result
+               (buffer-substring
+                (1+ (point))
+                (progn (forward-sexp 1) (1- (point)))))
+         (goto-char (point-max)))
+        (t
+         (forward-char 1))))
+      result)))
+
+(defun drums-parse-address (string)
+  "Parse STRING and return a MAILBOX / DISPLAY-NAME pair."
+  (with-temp-buffer
+    (let (display-name mailbox c)
+      (drums-init string)
+      (while (not (eobp))
+       (setq c (following-char))
+       (cond
+        ((or (eq c ? )
+             (eq c ?\t))
+         (forward-char 1))
+        ((eq c ?\()
+         (forward-sexp 1))
+        ((eq c ?\")
+         (push (buffer-substring
+                (1+ (point)) (progn (forward-sexp 1) (1- (point))))
+               display-name))
+        ((looking-at (concat "[" drums-atext-token "]"))
+         (push (buffer-substring (point) (progn (forward-word 1) (point)))
+               display-name))
+        ((eq c ?<)
+         (setq mailbox
+               (drums-remove-whitespace
+                (drums-remove-comments
+                 (buffer-substring
+                  (1+ (point))
+                  (progn (forward-sexp 1) (1- (point))))))))
+        (t (error "Unknown symbol: %c" c))))
+      ;; If we found no display-name, then we look for comments.
+      (if display-name
+         (setq display-name (mapconcat 'identity (nreverse display-name) " "))
+       (setq display-name (drums-get-comment string)))
+      (when mailbox
+       (cons mailbox display-name)))))
+
+(defun drums-parse-addresses (string)
+  "Parse STRING and return a list of MAILBOX / DISPLAY-NAME pairs."
+  (with-temp-buffer
+    (drums-init string)
+    (let ((beg (point))
+         pairs c)
+      (while (not (eobp))
+       (setq c (following-char))
+       (cond
+        ((memq c '(?\" ?< ?\())
+         (forward-sexp 1))
+        ((eq c ?,)
+         (push (drums-parse-address (buffer-substring beg (1- (point))))
+               pairs)
+         (setq beg (point)))
+        (t
+         (forward-char 1))))
+      (nreverse pairs))))
+
+(defun drums-unfold-fws ()
+  "Unfold folding white space in the current buffer."
+  (goto-char (point-min))
+  (while (re-search-forward drums-fws-regexp nil t)
+    (replace-match " " t t))
+  (goto-char (point-min)))
+
+(defun drums-parse-date (string)
+  "Return an Emacs time spec from STRING."
+  (encode-time (parse-time-string string)))
+    
+(provide 'drums)
+
+;;; drums.el ends here
index a386b4d..02480f7 100644 (file)
@@ -3225,7 +3225,7 @@ forbidden in URL encoding."
 ;;;
 
 (defun gnus-article-header-presentation-method (entity situation)
-  (mime-insert-decoded-header entity)
+  (mime-insert-decoded-header entity nil nil default-mime-charset)
   )
 
 (set-alist 'mime-header-presentation-method-alist
@@ -3241,6 +3241,9 @@ forbidden in URL encoding."
     (gnus-summary-select-article nil t)
     ))
 
+(set-alist 'mime-raw-representation-type-alist
+          'gnus-original-article-mode 'binary)
+
 (set-alist 'mime-preview-quitting-method-alist
           'gnus-original-article-mode #'gnus-mime-preview-quitting-method)
 
index 5dd0f89..8866867 100644 (file)
@@ -1,12 +1,7 @@
 ;;; gnus-cite.el --- parse citations in articles for Gnus
 ;; Copyright (C) 1995,96,97,98 Free Software Foundation, Inc.
 
-;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
-;; Keywords: news, mail
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; Author: Per Abhiddenware; 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.
@@ -52,8 +47,13 @@ article has citations."
   :type '(choice (const :tag "no" nil)
                  (const :tag "yes" t)))
 
-(defcustom gnus-cited-text-button-line-format "%(%{[...]%}%)\n"
-  "Format of cited text buttons."
+(defcustom gnus-cited-opened-text-button-line-format "%(%{[-]%}%)\n"
+  "Format of opened cited text buttons."
+  :group 'gnus-cite
+  :type 'string)
+
+(defcustom gnus-cited-closed-text-button-line-format "%(%{[+]%}%)\n"
+  "Format of closed cited text buttons."
   :group 'gnus-cite
   :type 'string)
 
@@ -100,7 +100,7 @@ The first regexp group should match the Supercite attribution."
   :group 'gnus-cite
   :type 'integer)
 
-(defcustom gnus-cite-attribution-prefix 
+(defcustom gnus-cite-attribution-prefix
   "In article\\|in <\\|On \\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\),"
   "*Regexp matching the beginning of an attribution line."
   :group 'gnus-cite
@@ -114,7 +114,7 @@ The text matching the first grouping will be used as a button."
   :type 'regexp)
 
 (defface gnus-cite-attribution-face '((t
-                                      (:underline t)))
+                                      (:italic t)))
   "Face used for attribution lines.")
 
 (defcustom gnus-cite-attribution-face 'gnus-cite-attribution-face
@@ -281,11 +281,16 @@ This should make it easier to see who wrote what."
 ;; PREFIX: Is the citation prefix of the attribution line(s), and
 ;; TAG: Is a Supercite tag, if any.
 
-(defvar gnus-cited-text-button-line-format-alist
+(defvar gnus-cited-opened-text-button-line-format-alist
   `((?b (marker-position beg) ?d)
     (?e (marker-position end) ?d)
+    (?n (count-lines beg end) ?d)
     (?l (- end beg) ?d)))
-(defvar gnus-cited-text-button-line-format-spec nil)
+(defvar gnus-cited-opened-text-button-line-format-spec nil)
+(defvar gnus-cited-closed-text-button-line-format-alist
+  gnus-cited-opened-text-button-line-format-alist)
+(defvar gnus-cited-closed-text-button-line-format-spec nil)
+
 
 ;;; Commands:
 
@@ -450,7 +455,8 @@ See the documentation for `gnus-article-highlight-citation'.
 If given a negative prefix, always show; if given a positive prefix,
 always hide."
   (interactive (append (gnus-article-hidden-arg) (list 'force)))
-  (gnus-set-format 'cited-text-button t)
+  (gnus-set-format 'cited-opened-text-button t)
+  (gnus-set-format 'cited-closed-text-button t)
   (save-excursion
     (set-buffer gnus-article-buffer)
     (cond
@@ -465,7 +471,7 @@ always hide."
            (inhibit-point-motion-hooks t)
            (props (nconc (list 'article-type 'cite)
                          gnus-hidden-properties))
-           beg end)
+           beg end start)
        (while marks
          (setq beg nil
                end nil)
@@ -494,26 +500,49 @@ always hide."
            (unless (save-excursion (search-backward "\n\n" nil t))
              (insert "\n"))
            (put-text-property
-            (point)
+            (setq start (point-marker))
             (progn
               (gnus-article-add-button
                (point)
-               (progn (eval gnus-cited-text-button-line-format-spec) (point))
+               (progn (eval gnus-cited-closed-text-button-line-format-spec)
+                      (point))
                `gnus-article-toggle-cited-text
-               (cons beg end))
+               (list (cons beg end) start))
               (point))
             'article-type 'annotation)
            (set-marker beg (point)))))))))
 
-(defun gnus-article-toggle-cited-text (region)
+(defun gnus-article-toggle-cited-text (args)
   "Toggle hiding the text in REGION."
-  (let (buffer-read-only)
-    (funcall 
-     (if (text-property-any
-         (car region) (1- (cdr region))
-         (car gnus-hidden-properties) (cadr gnus-hidden-properties))
+  (let* ((region (car args))
+        (start (cadr args))
+        (hidden
+         (text-property-any
+          (car region) (1- (cdr region))
+          (car gnus-hidden-properties) (cadr gnus-hidden-properties)))
+        (inhibit-point-motion-hooks t)
+        buffer-read-only)
+    (funcall
+     (if hidden
         'remove-text-properties 'gnus-add-text-properties)
-     (car region) (cdr region) gnus-hidden-properties)))
+     (car region) (cdr region) gnus-hidden-properties)
+    (save-excursion
+      (goto-char start)
+      (gnus-delete-line)
+      (put-text-property
+       (point)
+       (progn
+        (gnus-article-add-button
+         (point)
+         (progn (eval
+                 (if hidden
+                     gnus-cited-opened-text-button-line-format-spec
+                   gnus-cited-closed-text-button-line-format-spec))
+                (point))
+         `gnus-article-toggle-cited-text
+         args)
+        (point))
+       'article-type 'annotation))))
 
 (defun gnus-article-hide-citation-maybe (&optional arg force)
   "Toggle hiding of cited text that has an attribution line.
@@ -535,27 +564,27 @@ See also the documentation for `gnus-article-highlight-citation'."
            (atts gnus-cite-attribution-alist)
            (buffer-read-only nil)
            (inhibit-point-motion-hooks t)
-           (hiden 0)
+           (hidden 0)
            total)
        (goto-char (point-max))
        (gnus-article-search-signature)
        (setq total (count-lines start (point)))
        (while atts
-         (setq hiden (+ hiden (length (cdr (assoc (cdar atts)
-                                                  gnus-cite-prefix-alist))))
+         (setq hidden (+ hidden (length (cdr (assoc (cdar atts)
+                                                    gnus-cite-prefix-alist))))
                atts (cdr atts)))
        (when (or force
-                 (and (> (* 100 hiden) (* gnus-cite-hide-percentage total))
-                      (> hiden gnus-cite-hide-absolute)))
+                 (and (> (* 100 hidden) (* gnus-cite-hide-percentage total))
+                      (> hidden gnus-cite-hide-absolute)))
          (setq atts gnus-cite-attribution-alist)
          (while atts
            (setq total (cdr (assoc (cdar atts) gnus-cite-prefix-alist))
                  atts (cdr atts))
            (while total
-             (setq hiden (car total)
+             (setq hidden (car total)
                    total (cdr total))
-             (goto-line hiden)
-             (unless (assq hiden gnus-cite-attribution-alist)
+             (goto-line hidden)
+             (unless (assq hidden gnus-cite-attribution-alist)
                (gnus-add-text-properties
                 (point) (progn (forward-line 1) (point))
                 (nconc (list 'article-type 'cite)
index 1bd882d..025273b 100644 (file)
@@ -170,11 +170,10 @@ DOC is a documentation string for the parameter.")
 (defvar gnus-custom-method)
 (defvar gnus-custom-group)
 
-(defun gnus-group-customize (group &optional part)
+(defun gnus-group-customize (group)
   "Edit the group on the current line."
   (interactive (list (gnus-group-group-name)))
-  (let ((part (or part 'info))
-       info
+  (let (info
        (types (mapcar (lambda (entry)
                         `(cons :format "%v%h\n"
                                :doc ,(nth 2 entry)
@@ -186,8 +185,8 @@ DOC is a documentation string for the parameter.")
     (unless (setq info (gnus-get-info group))
       (error "Killed group; can't be edited"))
     ;; Ready.
-    (kill-buffer (get-buffer-create "*Gnus Customize*"))
-    (switch-to-buffer (get-buffer-create "*Gnus Customize*"))
+    (kill-buffer (gnus-get-buffer-create "*Gnus Customize*"))
+    (switch-to-buffer (gnus-get-buffer-create "*Gnus Customize*"))
     (gnus-custom-mode)
     (make-local-variable 'gnus-custom-group)
     (setq gnus-custom-group group)
@@ -544,8 +543,8 @@ eh?")))
                         ,(nth 1 entry)))
               gnus-score-parameters)))
     ;; Ready.
-    (kill-buffer (get-buffer-create "*Gnus Customize*"))
-    (switch-to-buffer (get-buffer-create "*Gnus Customize*"))
+    (kill-buffer (gnus-get-buffer-create "*Gnus Customize*"))
+    (switch-to-buffer (gnus-get-buffer-create "*Gnus Customize*"))
     (gnus-custom-mode)
     (make-local-variable 'gnus-custom-score-alist)
     (setq gnus-custom-score-alist scores)
index 8138113..7328093 100644 (file)
@@ -58,7 +58,9 @@
          from to)
       (goto-line number)
       (unless (eobp)            ; Sometimes things become confused (broken).
-       (forward-char (chars-in-string prefix))
+        (if (boundp 'MULE)
+            (forward-char (chars-in-string prefix))
+          (forward-char (length 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))))
 
-    (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-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 ()
index c4fd928..93ef915 100644 (file)
@@ -234,7 +234,7 @@ If this times out we give up and assume that something has died..." )
 (defun bbb-connect-to-bbbd (host port)
   (unless grouplens-bbb-buffer
     (setq grouplens-bbb-buffer
-         (get-buffer-create (format " *BBBD trace: %s*" host)))
+         (gnus-get-buffer-create (format " *BBBD trace: %s*" host)))
     (save-excursion
       (set-buffer grouplens-bbb-buffer)
       (make-local-variable 'bbb-read-point)
index be64979..a3b5418 100644 (file)
@@ -184,7 +184,7 @@ arguments necessary for the job.")
 
 (defun gnus-get-buffer-name (variable)
   "Returns the buffer name associated with the contents of a variable."
-  (let ((buf (get-buffer-create (gnus-window-to-buffer-helper
+  (let ((buf (gnus-get-buffer-create (gnus-window-to-buffer-helper
                                 (cdr 
                                  (assq variable gnus-window-to-buffer))))))
     (and buf
@@ -211,10 +211,9 @@ arguments necessary for the job.")
     (save-excursion
       (if (get-buffer name)
          (set-buffer name)
-       (set-buffer (get-buffer-create name))
+       (set-buffer (gnus-get-buffer-create name))
        (buffer-disable-undo)
        (setq buffer-read-only t)
-       (gnus-add-current-to-buffer-list)
        (add-hook 'gnus-summary-prepare-exit-hook 'gnus-picons-kill-buffer))
       (current-buffer))))
 
index fe6072e..f7e0495 100644 (file)
@@ -250,11 +250,11 @@ is restarted, and sometimes reloaded."
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "6.8.0"
+(defconst gnus-version-number "6.7.8"
   "Version number for this version of gnus.")
 
 (defconst gnus-version
-  (format "Chao-gnus %s (based on Gnus 5.6.22; for SEMI 1.8/FLIM 1.8)"
+  (format "Semi-gnus %s (based on Gnus 5.6.22; for SEMI 1.8/FLIM 1.7)"
           gnus-version-number)
   "Version string for this version of gnus.")
 
diff --git a/lisp/ietf-drums.el b/lisp/ietf-drums.el
new file mode 100644 (file)
index 0000000..2ef7d61
--- /dev/null
@@ -0,0 +1,242 @@
+;;; ietf-drums.el --- Functions for parsing RFC822bis headers
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; DRUMS is an IETF Working Group that works (or worked) on the
+;; successor to RFC822, "Standard For The Format Of Arpa Internet Text
+;; Messages".  This library is based on
+;; draft-ietf-drums-msg-fmt-05.txt, released on 1998-08-05.
+
+;;; Code:
+
+(require 'time-date)
+(require 'mm-util)
+
+(defvar ietf-drums-no-ws-ctl-token "\001-\010\013\014\016-\037\177"
+  "US-ASCII control characters excluding CR, LF and white space.")
+(defvar ietf-drums-text-token "\001-\011\013\014\016-\177"
+  "US-ASCII characters exlcuding CR and LF.")
+(defvar ietf-drums-specials-token "()<>[]:;@\\,.\""
+  "Special characters.")
+(defvar ietf-drums-quote-token "\\"
+  "Quote character.")
+(defvar ietf-drums-wsp-token " \t"
+  "White space.")
+(defvar ietf-drums-fws-regexp
+  (concat "[" ietf-drums-wsp-token "]*\n[" ietf-drums-wsp-token "]+")
+  "Folding white space.")
+(defvar ietf-drums-atext-token "-^a-zA-Z0-9!#$%&'*+/=?_`{|}~"
+  "Textual token.")
+(defvar ietf-drums-dot-atext-token "-^a-zA-Z0-9!#$%&'*+/=?_`{|}~."
+  "Textual token including full stop.")
+(defvar ietf-drums-qtext-token
+  (concat ietf-drums-no-ws-ctl-token "\041\043-\133\135-\177")
+  "Non-white-space control characaters, plus the rest of ASCII excluding backslash and doublequote.")
+(defvar ietf-drums-tspecials "][()<>@,;:\\\"/?="
+  "Tspecials.")
+
+(defvar ietf-drums-syntax-table
+  (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
+    (modify-syntax-entry ?\\ "/" table)
+    (modify-syntax-entry ?< "(" table)
+    (modify-syntax-entry ?> ")" table)
+    (modify-syntax-entry ?@ "w" table)
+    (modify-syntax-entry ?/ "w" table)
+    (modify-syntax-entry ?= " " table)
+    (modify-syntax-entry ?* " " table)
+    (modify-syntax-entry ?\; " " table)
+    (modify-syntax-entry ?\' " " table)
+    table))
+
+(defun ietf-drums-token-to-list (token)
+  "Translate TOKEN into a list of characters."
+  (let ((i 0)
+       b e c out range)
+    (while (< i (length token))
+      (setq c (mm-char-int (aref token i)))
+      (incf i)
+      (cond
+       ((eq c (mm-char-int ?-))
+       (if b
+           (setq range t)
+         (push c out)))
+       (range
+       (while (<= b c)
+         (push (mm-make-char 'ascii b) out)
+         (incf b))
+       (setq range nil))
+       ((= i (length token))
+       (push (mm-make-char 'ascii c) out))
+       (t
+       (setq b c))))
+    (nreverse out)))
+
+(defsubst ietf-drums-init (string)
+  (set-syntax-table ietf-drums-syntax-table)
+  (insert string)
+  (ietf-drums-unfold-fws)
+  (goto-char (point-min)))
+
+(defun ietf-drums-remove-comments (string)
+  "Remove comments from STRING."
+  (with-temp-buffer
+    (let (c)
+      (ietf-drums-init string)
+      (while (not (eobp))
+       (setq c (following-char))
+       (cond
+        ((eq c ?\")
+         (forward-sexp 1))
+        ((eq c ?\()
+         (delete-region (point) (progn (forward-sexp 1) (point))))
+        (t
+         (forward-char 1))))
+      (buffer-string))))
+
+(defun ietf-drums-remove-whitespace (string)
+  "Remove comments from STRING."
+  (with-temp-buffer
+    (ietf-drums-init string)
+    (let (c)
+      (while (not (eobp))
+       (setq c (following-char))
+       (cond
+        ((eq c ?\")
+         (forward-sexp 1))
+        ((eq c ?\()
+         (forward-sexp 1))
+        ((memq c '(? ?\t ?\n))
+         (delete-char 1))
+        (t
+         (forward-char 1))))
+      (buffer-string))))
+
+(defun ietf-drums-get-comment (string)
+  "Return the first comment in STRING."
+  (with-temp-buffer
+    (ietf-drums-init string)
+    (let (result c)
+      (while (not (eobp))
+       (setq c (following-char))
+       (cond
+        ((eq c ?\")
+         (forward-sexp 1))
+        ((eq c ?\()
+         (setq result
+               (buffer-substring
+                (1+ (point))
+                (progn (forward-sexp 1) (1- (point))))))
+        (t
+         (forward-char 1))))
+      result)))
+
+(defun ietf-drums-parse-address (string)
+  "Parse STRING and return a MAILBOX / DISPLAY-NAME pair."
+  (with-temp-buffer
+    (let (display-name mailbox c display-string)
+      (ietf-drums-init string)
+      (while (not (eobp))
+       (setq c (following-char))
+       (cond
+        ((or (eq c ? )
+             (eq c ?\t))
+         (forward-char 1))
+        ((eq c ?\()
+         (forward-sexp 1))
+        ((eq c ?\")
+         (push (buffer-substring
+                (1+ (point)) (progn (forward-sexp 1) (1- (point))))
+               display-name))
+        ((looking-at (concat "[" ietf-drums-atext-token "@" "]"))
+         (push (buffer-substring (point) (progn (forward-sexp 1) (point)))
+               display-name))
+        ((eq c ?<)
+         (setq mailbox
+               (ietf-drums-remove-whitespace
+                (ietf-drums-remove-comments
+                 (buffer-substring
+                  (1+ (point))
+                  (progn (forward-sexp 1) (1- (point))))))))
+        (t (error "Unknown symbol: %c" c))))
+      ;; If we found no display-name, then we look for comments.
+      (if display-name
+         (setq display-string
+               (mapconcat 'identity (reverse display-name) " "))
+       (setq display-string (ietf-drums-get-comment string)))
+      (if (not mailbox)
+         (when (string-match "@" display-string)
+           (cons
+            (mapconcat 'identity (nreverse display-name) "")
+            (ietf-drums-get-comment string)))
+       (cons mailbox display-string)))))
+
+(defun ietf-drums-parse-addresses (string)
+  "Parse STRING and return a list of MAILBOX / DISPLAY-NAME pairs."
+  (with-temp-buffer
+    (ietf-drums-init string)
+    (let ((beg (point))
+         pairs c)
+      (while (not (eobp))
+       (setq c (following-char))
+       (cond
+        ((memq c '(?\" ?< ?\())
+         (forward-sexp 1))
+        ((eq c ?,)
+         (push (ietf-drums-parse-address (buffer-substring beg (point)))
+               pairs)
+         (forward-char 1)
+         (setq beg (point)))
+        (t
+         (forward-char 1))))
+      (push (ietf-drums-parse-address (buffer-substring beg (point)))
+           pairs)
+      (nreverse pairs))))
+
+(defun ietf-drums-unfold-fws ()
+  "Unfold folding white space in the current buffer."
+  (goto-char (point-min))
+  (while (re-search-forward ietf-drums-fws-regexp nil t)
+    (replace-match " " t t))
+  (goto-char (point-min)))
+
+(defun ietf-drums-parse-date (string)
+  "Return an Emacs time spec from STRING."
+  (apply 'encode-time (parse-time-string string)))
+
+(defun ietf-drums-narrow-to-header ()
+  "Narrow to the header section in the current buffer."
+  (narrow-to-region
+   (goto-char (point-min))
+   (if (search-forward "\n\n" nil 1)
+       (1- (point))
+     (point-max)))
+  (goto-char (point-min)))
+
+(defun ietf-drums-quote-string (string)
+  "Quote string if it needs quoting to be displayed in a header."
+  (if (string-match (concat "[^" ietf-drums-atext-token "]") string)
+      (concat "\"" string "\"")
+    string))
+
+(provide 'ietf-drums)
+
+;;; ietf-drums.el ends here
diff --git a/lisp/mail-parse.el b/lisp/mail-parse.el
new file mode 100644 (file)
index 0000000..095e114
--- /dev/null
@@ -0,0 +1,65 @@
+;;; mail-parse.el --- Interface functions for parsing mail
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; This file contains wrapper functions for a wide range of mail
+;; parsing functions.  The idea is that there are low-level libraries
+;; that impement according to various specs (RFC2231, DRUMS, USEFOR),
+;; but that programmers that want to parse some header (say,
+;; Content-Type) will want to use the latest spec.
+;;
+;; So while each low-level library (rfc2231.el, for instance) decodes
+;; faithfully according to that (proposed) standard, this library is
+;; the interface library.  If some later RFC supersedes RFC2231, one
+;; would just have to write a new low-level library, adjust the
+;; aliases in this library, and the users and programmers won't notice
+;; any changes.
+
+;;; Code:
+
+(require 'drums)
+(require 'rfc2231)
+(require 'rfc2047)
+
+(defalias 'mail-header-parse-content-type 'rfc2231-parse-string)
+(defalias 'mail-header-parse-content-disposition 'rfc2231-parse-string)
+(defalias 'mail-content-type-get 'rfc2231-get-value)
+
+(defalias 'mail-header-remove-comments 'drums-remove-comments)
+(defalias 'mail-header-remove-whitespace 'drums-remove-whitespace)
+(defalias 'mail-header-get-comment 'drums-get-comment)
+(defalias 'mail-header-parse-address 'drums-parse-address)
+(defalias 'mail-header-parse-addresses 'drums-parse-addresses)
+(defalias 'mail-header-parse-date 'drums-parse-date)
+(defalias 'mail-narrow-to-head 'drums-narrow-to-header)
+(defalias 'mail-quote-string 'drums-quote-string)
+
+(defalias 'mail-header-narrow-to-field 'rfc2047-narrow-to-field)
+(defalias 'mail-encode-encoded-word-region 'rfc2047-encode-region)
+(defalias 'mail-encode-encoded-word-buffer 'rfc2047-encode-message-header)
+(defalias 'mail-encode-encoded-word-string 'rfc2047-encode-string)
+(defalias 'mail-decode-encoded-word-region 'rfc2047-decode-region)
+(defalias 'mail-decode-encoded-word-string 'rfc2047-decode-string)
+
+(provide 'mail-parse)
+
+;;; mail-parse.el ends here
diff --git a/lisp/mailcap.el b/lisp/mailcap.el
new file mode 100644 (file)
index 0000000..c5249f3
--- /dev/null
@@ -0,0 +1,847 @@
+;;; mailcap.el --- Functions for displaying MIME parts
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: William M. Perry <wmperry@aventail.com>
+;;     Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Keywords: news, mail
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-and-compile
+  (require 'cl))
+(require 'mail-parse)
+
+(defvar mailcap-parse-args-syntax-table
+  (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
+    (modify-syntax-entry ?' "\"" table)
+    (modify-syntax-entry ?` "\"" table)
+    (modify-syntax-entry ?{ "(" table)
+    (modify-syntax-entry ?} ")" table)
+    table)
+  "A syntax table for parsing sgml attributes.")
+
+(defvar mailcap-mime-data
+  '(("application"
+     ("x-x509-ca-cert"
+      (viewer . ssl-view-site-cert)
+      (test . (fboundp 'ssl-view-site-cert))
+      (type . "application/x-x509-ca-cert"))
+     ("x-x509-user-cert"
+      (viewer . ssl-view-user-cert)
+      (test . (fboundp 'ssl-view-user-cert))
+      (type . "application/x-x509-user-cert"))
+     ("octet-stream"
+      (viewer . mailcap-save-binary-file)
+      (type ."application/octet-stream"))
+     ("dvi"
+      (viewer . "open %s")
+      (type   . "application/dvi")
+      (test   . (eq (mm-device-type) 'ns)))
+     ("dvi"
+      (viewer . "xdvi %s")
+      (test   . (eq (mm-device-type) 'x))
+      ("needsx11")
+      (type   . "application/dvi"))
+     ("dvi"
+      (viewer . "dvitty %s")
+      (test   . (not (getenv "DISPLAY")))
+      (type   . "application/dvi"))
+     ("emacs-lisp"
+      (viewer . mailcap-maybe-eval)
+      (type   . "application/emacs-lisp"))
+     ("x-tar"
+      (viewer . mailcap-save-binary-file)
+      (type   . "application/x-tar"))
+     ("x-latex"
+      (viewer . tex-mode)
+      (test   . (fboundp 'tex-mode))
+      (type   . "application/x-latex"))
+     ("x-tex"
+      (viewer . tex-mode)
+      (test   . (fboundp 'tex-mode))
+      (type   . "application/x-tex"))
+     ("latex"
+      (viewer . tex-mode)
+      (test   . (fboundp 'tex-mode))
+      (type   . "application/latex"))
+     ("tex"
+      (viewer . tex-mode)
+      (test   . (fboundp 'tex-mode))
+      (type   . "application/tex"))
+     ("texinfo"
+      (viewer . texinfo-mode)
+      (test   . (fboundp 'texinfo-mode))
+      (type   . "application/tex"))
+     ("zip"
+      (viewer . mailcap-save-binary-file)
+      (type   . "application/zip")
+      ("copiousoutput"))
+     ("pdf"
+      (viewer . "acroread %s")
+      (type   . "application/pdf"))
+     ("postscript"
+      (viewer . "open %s")
+      (type   . "application/postscript")
+      (test   . (eq (mm-device-type) 'ns)))
+     ("postscript"
+      (viewer . "ghostview %s")
+      (type . "application/postscript")
+      (test   . (eq (mm-device-type) 'x))
+      ("needsx11"))
+     ("postscript"
+      (viewer . "ps2ascii %s")
+      (type . "application/postscript")
+      (test . (not (getenv "DISPLAY")))
+      ("copiousoutput")))
+    ("audio"
+     ("x-mpeg"
+      (viewer . "maplay %s")
+      (type   . "audio/x-mpeg"))
+     (".*"
+      (viewer . mm-view-sound-file)
+      (test   . (or (featurep 'nas-sound)
+                     (featurep 'native-sound)))
+      (type   . "audio/*"))
+     (".*"
+      (viewer . "showaudio")
+      (type   . "audio/*")))
+    ("message"
+     ("rfc-*822"
+      (viewer . gnus-article-prepare-display)
+      (test   . (and (featurep 'gnus)
+                    (gnus-alive-p)))
+      (type   . "message/rfc-822"))
+     ("rfc-*822"
+      (viewer . vm-mode)
+      (test   . (fboundp 'vm-mode))
+      (type   . "message/rfc-822"))
+     ("rfc-*822"
+      (viewer . w3-mode)
+      (test   . (fboundp 'w3-mode))
+      (type   . "message/rfc-822"))
+     ("rfc-*822"
+      (viewer . view-mode)
+      (test   . (fboundp 'view-mode))
+      (type   . "message/rfc-822"))
+     ("rfc-*822"
+      (viewer . fundamental-mode)
+      (type   . "message/rfc-822")))
+    ("image"
+     ("x-xwd"
+      (viewer  . "xwud -in %s")
+      (type    . "image/x-xwd")
+      ("compose" . "xwd -frame > %s")
+      (test    . (eq (mm-device-type) 'x))
+      ("needsx11"))
+     ("x11-dump"
+      (viewer . "xwud -in %s")
+      (type . "image/x-xwd")
+      ("compose" . "xwd -frame > %s")
+      (test   . (eq (mm-device-type) 'x))
+      ("needsx11"))
+     ("windowdump"
+      (viewer . "xwud -in %s")
+      (type . "image/x-xwd")
+      ("compose" . "xwd -frame > %s")
+      (test   . (eq (mm-device-type) 'x))
+      ("needsx11"))
+     (".*"
+      (viewer . "aopen %s")
+      (type   . "image/*")
+      (test   . (eq (mm-device-type) 'ns)))
+     (".*"
+      (viewer . "xv -perfect %s")
+      (type . "image/*")
+      (test   . (eq (mm-device-type) 'x))
+      ("needsx11")))
+    ("text"
+     ("plain"
+      (viewer  . w3-mode)
+      (test    . (fboundp 'w3-mode))
+      (type    . "text/plain"))
+     ("plain"
+      (viewer  . view-mode)
+      (test    . (fboundp 'view-mode))
+      (type    . "text/plain"))
+     ("plain"
+      (viewer  . fundamental-mode)
+      (type    . "text/plain"))
+     ("enriched"
+      (viewer . enriched-decode-region)
+      (test   . (fboundp 'enriched-decode))
+      (type   . "text/enriched"))
+     ("html"
+      (viewer . mm-w3-prepare-buffer)
+      (test   . (fboundp 'w3-prepare-buffer))
+      (type   . "text/html")))
+    ("video"
+     ("mpeg"
+      (viewer . "mpeg_play %s")
+      (type   . "video/mpeg")
+      (test   . (eq (mm-device-type) 'x))
+      ("needsx11")))
+    ("x-world"
+     ("x-vrml"
+      (viewer  . "webspace -remote %s -URL %u")
+      (type    . "x-world/x-vrml")
+      ("description"
+       "VRML document")))
+    ("archive"
+     ("tar"
+      (viewer . tar-mode)
+      (type . "archive/tar")
+      (test . (fboundp 'tar-mode)))))
+     "*The mailcap structure is an assoc list of assoc lists.
+1st assoc list is keyed on the major content-type
+2nd assoc list is keyed on the minor content-type (which can be a regexp)
+
+Which looks like:
+-----------------
+ ((\"application\"
+   (\"postscript\" . <info>))
+  (\"text\"
+   (\"plain\" . <info>)))
+
+Where <info> is another assoc list of the various information
+related to the mailcap RFC.  This is keyed on the lowercase
+attribute name (viewer, test, etc).  This looks like:
+ ((viewer . viewerinfo)
+  (test   . testinfo)
+  (xxxx   . \"string\"))
+
+Where viewerinfo specifies how the content-type is viewed.  Can be
+a string, in which case it is run through a shell, with
+appropriate parameters, or a symbol, in which case the symbol is
+funcall'd, with the buffer as an argument.
+
+testinfo is a list of strings, or nil.  If nil, it means the
+viewer specified is always valid.  If it is a list of strings,
+these are used to determine whether a viewer passes the 'test' or
+not.")
+
+(defvar mailcap-download-directory nil
+  "*Where downloaded files should go by default.")
+
+(defvar mailcap-temporary-directory (or (getenv "TMPDIR") "/tmp")
+  "*Where temporary files go.")
+
+;;;
+;;; Utility functions
+;;;
+
+(defun mailcap-generate-unique-filename (&optional fmt)
+  "Generate a unique filename in mailcap-temporary-directory"
+  (if (not fmt)
+      (let ((base (format "mailcap-tmp.%d" (user-real-uid)))
+           (fname "")
+           (x 0))
+       (setq fname (format "%s%d" base x))
+       (while (file-exists-p
+               (expand-file-name fname mailcap-temporary-directory))
+         (setq x (1+ x)
+               fname (concat base (int-to-string x))))
+       (expand-file-name fname mailcap-temporary-directory))
+    (let ((base (concat "mm" (int-to-string (user-real-uid))))
+         (fname "")
+         (x 0))
+      (setq fname (format fmt (concat base (int-to-string x))))
+      (while (file-exists-p
+             (expand-file-name fname mailcap-temporary-directory))
+       (setq x (1+ x)
+             fname (format fmt (concat base (int-to-string x)))))
+      (expand-file-name fname mailcap-temporary-directory))))
+
+(defun mailcap-save-binary-file ()
+  (goto-char (point-min))
+  (let ((file (read-file-name
+              "Filename to save as: "
+              (or mailcap-download-directory "~/")))
+       (require-final-newline nil))
+    (write-region (point-min) (point-max) file)
+    (kill-buffer (current-buffer))))
+
+(defun mailcap-maybe-eval ()
+  "Maybe evaluate a buffer of emacs lisp code"
+  (if (yes-or-no-p "This is emacs-lisp code, evaluate it? ")
+      (eval-buffer (current-buffer))
+    (emacs-lisp-mode)))
+
+;;;
+;;; The mailcap parser
+;;;
+
+(defun mailcap-replace-regexp (regexp to-string)
+  ;; Quiet replace-regexp.
+  (goto-char (point-min))
+  (while (re-search-forward regexp nil t)
+    (replace-match to-string t nil)))
+
+(defvar mailcap-parsed-p nil)
+
+(defun mailcap-parse-mailcaps (&optional path force)
+  "Parse out all the mailcaps specified in a unix-style path string PATH.
+If FORCE, re-parse even if already parsed."
+  (interactive (list nil t))
+  (when (or (not mailcap-parsed-p)
+           force)
+    (cond
+     (path nil)
+     ((getenv "MAILCAPS") (setq path (getenv "MAILCAPS")))
+     ((memq system-type '(ms-dos ms-windows windows-nt))
+      (setq path (mapconcat 'expand-file-name '("~/mail.cap" "~/etc/mail.cap")
+                           ";")))
+     (t (setq path (mapconcat 'expand-file-name
+                             '("~/.mailcap"
+                               "/etc/mailcap:/usr/etc/mailcap"
+                               "/usr/local/etc/mailcap") ":"))))
+    (let ((fnames (reverse
+                  (split-string
+                   path (if (memq system-type
+                                  '(ms-dos ms-windows windows-nt))
+                            ";"
+                          ":"))))
+         fname)
+      (while fnames
+       (setq fname (car fnames))
+       (if (and (file-exists-p fname) (file-readable-p fname))
+           (mailcap-parse-mailcap (car fnames)))
+       (setq fnames (cdr fnames))))
+    (setq mailcap-parsed-p t)))
+
+(defun mailcap-parse-mailcap (fname)
+  ;; Parse out the mailcap file specified by FNAME
+  (let (major                          ; The major mime type (image/audio/etc)
+       minor                           ; The minor mime type (gif, basic, etc)
+       save-pos                        ; Misc saved positions used in parsing
+       viewer                          ; How to view this mime type
+       info                            ; Misc info about this mime type
+       )
+    (with-temp-buffer
+      (insert-file-contents fname)
+      (set-syntax-table mailcap-parse-args-syntax-table)
+      (mailcap-replace-regexp "#.*" "")        ; Remove all comments
+      (mailcap-replace-regexp "\n+" "\n") ; And blank lines
+      (mailcap-replace-regexp "\\\\[ \t\n]+" " ") ; And collapse spaces
+      (mailcap-replace-regexp (concat (regexp-quote "\\") "[ \t]*\n") "")
+      (goto-char (point-max))
+      (skip-chars-backward " \t\n")
+      (delete-region (point) (point-max))
+      (goto-char (point-min))
+      (while (not (eobp))
+       (skip-chars-forward " \t\n")
+       (setq save-pos (point)
+             info nil)
+       (skip-chars-forward "^/;")
+       (downcase-region save-pos (point))
+       (setq major (buffer-substring save-pos (point)))
+       (skip-chars-forward "/ \t\n")
+       (setq save-pos (point))
+       (skip-chars-forward "^;")
+       (downcase-region save-pos (point))
+       (setq minor
+             (cond
+              ((= ?* (or (char-after save-pos) 0)) ".*")
+              ((= (point) save-pos) ".*")
+              (t (buffer-substring save-pos (point)))))
+       (skip-chars-forward "; \t\n")
+       ;;; Got the major/minor chunks, now for the viewers/etc
+       ;;; The first item _must_ be a viewer, according to the
+       ;;; RFC for mailcap files (#1343)
+       (skip-chars-forward "; \t\n")
+       (setq save-pos (point))
+       (skip-chars-forward "^;\n")
+       (if (= (or (char-after save-pos) 0) ?')
+           (setq viewer (progn
+                          (narrow-to-region (1+ save-pos) (point))
+                          (goto-char (point-min))
+                          (prog1
+                              (read (current-buffer))
+                            (goto-char (point-max))
+                            (widen))))
+         (setq viewer (buffer-substring save-pos (point))))
+       (setq save-pos (point))
+       (end-of-line)
+       (setq info (nconc (list (cons 'viewer viewer)
+                               (cons 'type (concat major "/"
+                                                   (if (string= minor ".*")
+                                                       "*" minor))))
+                         (mailcap-parse-mailcap-extras save-pos (point))))
+       (mailcap-mailcap-entry-passes-test info)
+       (mailcap-add-mailcap-entry major minor info)))))
+
+(defun mailcap-parse-mailcap-extras (st nd)
+  ;; Grab all the extra stuff from a mailcap entry
+  (let (
+       name                            ; From name=
+       value                           ; its value
+       results                         ; Assoc list of results
+       name-pos                        ; Start of XXXX= position
+       val-pos                         ; Start of value position
+       done                            ; Found end of \'d ;s?
+       )
+    (save-restriction
+      (narrow-to-region st nd)
+      (goto-char (point-min))
+      (skip-chars-forward " \n\t;")
+      (while (not (eobp))
+       (setq done nil)
+       (skip-chars-forward " \";\n\t")
+       (setq name-pos (point))
+       (skip-chars-forward "^ \n\t=")
+       (downcase-region name-pos (point))
+       (setq name (buffer-substring name-pos (point)))
+       (skip-chars-forward " \t\n")
+       (if (/= (or (char-after (point)) 0)  ?=) ; There is no value
+           (setq value nil)
+         (skip-chars-forward " \t\n=")
+         (setq val-pos (point))
+         (if (memq (char-after val-pos) '(?\" ?'))
+             (progn
+               (setq val-pos (1+ val-pos))
+               (condition-case nil
+                   (progn
+                     (forward-sexp 1)
+                     (backward-char 1))
+                 (error (goto-char (point-max)))))
+           (while (not done)
+             (skip-chars-forward "^;")
+             (if (= (or (char-after (1- (point))) 0) ?\\ )
+                 (progn
+                   (subst-char-in-region (1- (point)) (point) ?\\ ? )
+                   (skip-chars-forward ";"))
+               (setq done t))))
+         (setq value (buffer-substring val-pos (point))))
+       (setq results (cons (cons name value) results)))
+      results)))
+
+(defun mailcap-mailcap-entry-passes-test (info)
+  ;; Return t iff a mailcap entry passes its test clause or no test
+  ;; clause is present.
+  (let (status                         ; Call-process-regions return value
+       (test (assq 'test info))        ; The test clause
+       )
+    (setq status (and test (split-string (cdr test) " ")))
+    (if (and (assoc "needsx11" info) (not (getenv "DISPLAY")))
+       (setq status nil)
+      (cond
+       ((and (equal (nth 0 status) "test")
+            (equal (nth 1 status) "-n")
+            (or (equal (nth 2 status) "$DISPLAY")
+                (equal (nth 2 status) "\"$DISPLAY\"")))
+       (setq status (if (getenv "DISPLAY") t nil)))
+       ((and (equal (nth 0 status) "test")
+            (equal (nth 1 status) "-z")
+            (or (equal (nth 2 status) "$DISPLAY")
+                (equal (nth 2 status) "\"$DISPLAY\"")))
+       (setq status (if (getenv "DISPLAY") nil t)))
+       (test nil)
+       (t nil)))
+    (and test (listp test) (setcdr test status))))
+
+;;;
+;;; The action routines.
+;;;
+
+(defun mailcap-possible-viewers (major minor)
+  ;; Return a list of possible viewers from MAJOR for minor type MINOR
+  (let ((exact '())
+       (wildcard '()))
+    (while major
+      (cond
+       ((equal (car (car major)) minor)
+       (setq exact (cons (cdr (car major)) exact)))
+       ((string-match (car (car major)) minor)
+       (setq wildcard (cons (cdr (car major)) wildcard))))
+      (setq major (cdr major)))
+    (nconc (nreverse exact) (nreverse wildcard))))
+
+(defun mailcap-unescape-mime-test (test type-info)
+  (let (save-pos save-chr subst)
+    (cond
+     ((symbolp test) test)
+     ((and (listp test) (symbolp (car test))) test)
+     ((or (stringp test)
+         (and (listp test) (stringp (car test))
+              (setq test (mapconcat 'identity test " "))))
+      (with-temp-buffer
+       (insert test)
+       (goto-char (point-min))
+       (while (not (eobp))
+         (skip-chars-forward "^%")
+         (if (/= (- (point)
+                    (progn (skip-chars-backward "\\\\")
+                           (point)))
+                 0)                    ; It is an escaped %
+             (progn
+               (delete-char 1)
+               (skip-chars-forward "%."))
+           (setq save-pos (point))
+           (skip-chars-forward "%")
+           (setq save-chr (char-after (point)))
+           (cond
+            ((null save-chr) nil)
+            ((= save-chr ?t)
+             (delete-region save-pos (progn (forward-char 1) (point)))
+             (insert (or (cdr (assq 'type type-info)) "\"\"")))
+            ((= save-chr ?M)
+             (delete-region save-pos (progn (forward-char 1) (point)))
+             (insert "\"\""))
+            ((= save-chr ?n)
+             (delete-region save-pos (progn (forward-char 1) (point)))
+             (insert "\"\""))
+            ((= save-chr ?F)
+             (delete-region save-pos (progn (forward-char 1) (point)))
+             (insert "\"\""))
+            ((= save-chr ?{)
+             (forward-char 1)
+             (skip-chars-forward "^}")
+             (downcase-region (+ 2 save-pos) (point))
+             (setq subst (buffer-substring (+ 2 save-pos) (point)))
+             (delete-region save-pos (1+ (point)))
+             (insert (or (cdr (assoc subst type-info)) "\"\"")))
+            (t nil))))
+       (buffer-string)))
+     (t (error "Bad value to mailcap-unescape-mime-test. %s" test)))))
+
+(defvar mailcap-viewer-test-cache nil)
+
+(defun mailcap-viewer-passes-test (viewer-info type-info)
+  ;; Return non-nil iff the viewer specified by VIEWER-INFO passes its
+  ;; test clause (if any).
+  (let* ((test-info (assq 'test viewer-info))
+        (test (cdr test-info))
+        (otest test)
+        (viewer (cdr (assoc 'viewer viewer-info)))
+        (default-directory (expand-file-name "~/"))
+        status parsed-test cache result)
+    (if (setq cache (assoc test mailcap-viewer-test-cache))
+       (cadr cache)
+      (setq
+       result
+       (cond
+       ((not test-info) t)             ; No test clause
+       ((not test) nil)                ; Already failed test
+       ((eq test t) t)                 ; Already passed test
+       ((and (symbolp test)            ; Lisp function as test
+             (fboundp test))
+        (funcall test type-info))
+       ((and (symbolp test)            ; Lisp variable as test
+             (boundp test))
+        (symbol-value test))
+       ((and (listp test)              ; List to be eval'd
+             (symbolp (car test)))
+        (eval test))
+       (t
+        (setq test (mailcap-unescape-mime-test test type-info)
+              test (list shell-file-name nil nil nil
+                         shell-command-switch test)
+              status (apply 'call-process test))
+        (= 0 status))))
+      (push (list otest result) mailcap-viewer-test-cache)
+      result)))
+
+(defun mailcap-add-mailcap-entry (major minor info)
+  (let ((old-major (assoc major mailcap-mime-data)))
+    (if (null old-major)               ; New major area
+       (setq mailcap-mime-data
+             (cons (cons major (list (cons minor info)))
+                   mailcap-mime-data))
+      (let ((cur-minor (assoc minor old-major)))
+       (cond
+        ((or (null cur-minor)          ; New minor area, or
+             (assq 'test info))        ; Has a test, insert at beginning
+         (setcdr old-major (cons (cons minor info) (cdr old-major))))
+        ((and (not (assq 'test info)) ; No test info, replace completely
+              (not (assq 'test cur-minor)))
+         (setcdr cur-minor info))
+        (t
+         (setcdr old-major (cons (cons minor info) (cdr old-major)))))))))
+
+;;;
+;;; The main whabbo
+;;;
+
+(defun mailcap-viewer-lessp (x y)
+  ;; Return t iff viewer X is more desirable than viewer Y
+  (let ((x-wild (string-match "[*?]" (or (cdr-safe (assq 'type x)) "")))
+       (y-wild (string-match "[*?]" (or (cdr-safe (assq 'type y)) "")))
+       (x-lisp (not (stringp (or (cdr-safe (assq 'viewer x)) ""))))
+       (y-lisp (not (stringp (or (cdr-safe (assq 'viewer y)) "")))))
+    (cond
+     ((and x-lisp (not y-lisp))
+      t)
+     ((and (not y-lisp) x-wild (not y-wild))
+      t)
+     ((and (not x-wild) y-wild)
+      t)
+     (t nil))))
+
+(defun mailcap-mime-info (string &optional request)
+  "Get the MIME viewer command for STRING, return nil if none found.
+Expects a complete content-type header line as its argument.
+
+Second argument REQUEST specifies what information to return.  If it is
+nil or the empty string, the viewer (second field of the mailcap
+entry) will be returned.  If it is a string, then the mailcap field
+corresponding to that string will be returned (print, description,
+whatever).  If a number, then all the information for this specific
+viewer is returned.  If `all', then all possible viewers for
+this type is returned."
+  (let (
+       major                           ; Major encoding (text, etc)
+       minor                           ; Minor encoding (html, etc)
+       info                            ; Other info
+       save-pos                        ; Misc. position during parse
+       major-info                      ; (assoc major mailcap-mime-data)
+       minor-info                      ; (assoc minor major-info)
+       test                            ; current test proc.
+       viewers                         ; Possible viewers
+       passed                          ; Viewers that passed the test
+       viewer                          ; The one and only viewer
+       ctl)
+    (save-excursion
+      (setq ctl (mail-header-parse-content-type (or string "text/plain")))
+      (setq major (split-string (car ctl) "/"))
+      (setq minor (cadr major)
+           major (car major))
+      (when (setq major-info (cdr (assoc major mailcap-mime-data)))
+       (when (setq viewers (mailcap-possible-viewers major-info minor))
+         (setq info (mapcar (lambda (a) (cons (symbol-name (car a))
+                                              (cdr a)))
+                            (cdr ctl)))
+         (while viewers
+           (if (mailcap-viewer-passes-test (car viewers) info)
+               (setq passed (cons (car viewers) passed)))
+           (setq viewers (cdr viewers)))
+         (setq passed (sort passed 'mailcap-viewer-lessp))
+         (setq viewer (car passed))))
+      (when (and (stringp (cdr (assq 'viewer viewer)))
+                passed)
+       (setq viewer (car passed)))
+      (cond
+       ((and (null viewer) (not (equal major "default")) request)
+       (mailcap-mime-info "default" request))
+       ((or (null request) (equal request ""))
+       (mailcap-unescape-mime-test (cdr (assq 'viewer viewer)) info))
+       ((stringp request)
+       (if (or (eq request 'test) (eq request 'viewer))
+           (mailcap-unescape-mime-test
+            (cdr-safe (assoc request viewer)) info)))
+       ((eq request 'all)
+       passed)
+       (t
+       ;; MUST make a copy *sigh*, else we modify mailcap-mime-data
+       (setq viewer (copy-tree viewer))
+       (let ((view (assq 'viewer viewer))
+             (test (assq 'test viewer)))
+         (if view (setcdr view (mailcap-unescape-mime-test (cdr view) info)))
+         (if test (setcdr test (mailcap-unescape-mime-test (cdr test) info))))
+       viewer)))))
+
+;;;
+;;; Experimental MIME-types parsing
+;;;
+
+(defvar mailcap-mime-extensions
+  '((""          . "text/plain")
+    (".abs"      . "audio/x-mpeg")
+    (".aif"      . "audio/aiff")
+    (".aifc"     . "audio/aiff")
+    (".aiff"     . "audio/aiff")
+    (".ano"      . "application/x-annotator")
+    (".au"       . "audio/ulaw")
+    (".avi"      . "video/x-msvideo")
+    (".bcpio"    . "application/x-bcpio")
+    (".bin"      . "application/octet-stream")
+    (".cdf"      . "application/x-netcdr")
+    (".cpio"     . "application/x-cpio")
+    (".csh"      . "application/x-csh")
+    (".dvi"      . "application/x-dvi")
+    (".el"       . "application/emacs-lisp")
+    (".eps"      . "application/postscript")
+    (".etx"      . "text/x-setext")
+    (".exe"      . "application/octet-stream")
+    (".fax"      . "image/x-fax")
+    (".gif"      . "image/gif")
+    (".hdf"      . "application/x-hdf")
+    (".hqx"      . "application/mac-binhex40")
+    (".htm"      . "text/html")
+    (".html"     . "text/html")
+    (".icon"     . "image/x-icon")
+    (".ief"      . "image/ief")
+    (".jpg"      . "image/jpeg")
+    (".macp"     . "image/x-macpaint")
+    (".man"      . "application/x-troff-man")
+    (".me"       . "application/x-troff-me")
+    (".mif"      . "application/mif")
+    (".mov"      . "video/quicktime")
+    (".movie"    . "video/x-sgi-movie")
+    (".mp2"      . "audio/x-mpeg")
+    (".mp3"      . "audio/x-mpeg")
+    (".mp2a"     . "audio/x-mpeg2")
+    (".mpa"      . "audio/x-mpeg")
+    (".mpa2"     . "audio/x-mpeg2")
+    (".mpe"      . "video/mpeg")
+    (".mpeg"     . "video/mpeg")
+    (".mpega"    . "audio/x-mpeg")
+    (".mpegv"    . "video/mpeg")
+    (".mpg"      . "video/mpeg")
+    (".mpv"      . "video/mpeg")
+    (".ms"       . "application/x-troff-ms")
+    (".nc"       . "application/x-netcdf")
+    (".nc"       . "application/x-netcdf")
+    (".oda"      . "application/oda")
+    (".pbm"      . "image/x-portable-bitmap")
+    (".pdf"      . "application/pdf")
+    (".pgm"      . "image/portable-graymap")
+    (".pict"     . "image/pict")
+    (".png"      . "image/png")
+    (".pnm"      . "image/x-portable-anymap")
+    (".ppm"      . "image/portable-pixmap")
+    (".ps"       . "application/postscript")
+    (".qt"       . "video/quicktime")
+    (".ras"      . "image/x-raster")
+    (".rgb"      . "image/x-rgb")
+    (".rtf"      . "application/rtf")
+    (".rtx"      . "text/richtext")
+    (".sh"       . "application/x-sh")
+    (".sit"      . "application/x-stuffit")
+    (".snd"      . "audio/basic")
+    (".src"      . "application/x-wais-source")
+    (".tar"      . "archive/tar")
+    (".tcl"      . "application/x-tcl")
+    (".tcl"      . "application/x-tcl")
+    (".tex"      . "application/x-tex")
+    (".texi"     . "application/texinfo")
+    (".tga"      . "image/x-targa")
+    (".tif"      . "image/tiff")
+    (".tiff"     . "image/tiff")
+    (".tr"       . "application/x-troff")
+    (".troff"    . "application/x-troff")
+    (".tsv"      . "text/tab-separated-values")
+    (".txt"      . "text/plain")
+    (".vbs"      . "video/mpeg")
+    (".vox"      . "audio/basic")
+    (".vrml"     . "x-world/x-vrml")
+    (".wav"      . "audio/x-wav")
+    (".wrl"      . "x-world/x-vrml")
+    (".xbm"      . "image/xbm")
+    (".xpm"      . "image/x-pixmap")
+    (".xwd"      . "image/windowdump")
+    (".zip"      . "application/zip")
+    (".ai"       . "application/postscript")
+    (".jpe"      . "image/jpeg")
+    (".jpeg"     . "image/jpeg"))
+  "*An assoc list of file extensions and the MIME content-types they
+correspond to.")
+
+(defun mailcap-parse-mimetypes (&optional path)
+  ;; Parse out all the mimetypes specified in a unix-style path string PATH
+  (cond
+   (path nil)
+   ((getenv "MIMETYPES") (setq path (getenv "MIMETYPES")))
+   ((memq system-type '(ms-dos ms-windows windows-nt))
+    (setq path (mapconcat 'expand-file-name
+                         '("~/mime.typ" "~/etc/mime.typ") ";")))
+   (t (setq path (mapconcat 'expand-file-name
+                           '("~/.mime-types"
+                             "/etc/mime-types:/usr/etc/mime-types"
+                             "/usr/local/etc/mime-types"
+                             "/usr/local/www/conf/mime-types") ":"))))
+  (let ((fnames (reverse
+                (split-string path
+                              (if (memq system-type
+                                        '(ms-dos ms-windows windows-nt))
+                                  ";" ":"))))
+       fname)
+    (while fnames
+      (setq fname (car fnames))
+      (if (and (file-exists-p fname) (file-readable-p fname))
+         (mailcap-parse-mimetype-file (car fnames)))
+      (setq fnames (cdr fnames)))))
+
+(defun mailcap-parse-mimetype-file (fname)
+  ;; Parse out a mime-types file
+  (let (type                           ; The MIME type for this line
+       extns                           ; The extensions for this line
+       save-pos                        ; Misc. saved buffer positions
+       )
+    (with-temp-buffer
+      (insert-file-contents fname)
+      (mailcap-replace-regexp "#.*" "")
+      (mailcap-replace-regexp "\n+" "\n")
+      (mailcap-replace-regexp "[ \t]+$" "")
+      (goto-char (point-max))
+      (skip-chars-backward " \t\n")
+      (delete-region (point) (point-max))
+      (goto-char (point-min))
+      (while (not (eobp))
+       (skip-chars-forward " \t\n")
+       (setq save-pos (point))
+       (skip-chars-forward "^ \t")
+       (downcase-region save-pos (point))
+       (setq type (buffer-substring save-pos (point)))
+       (while (not (eolp))
+         (skip-chars-forward " \t")
+         (setq save-pos (point))
+         (skip-chars-forward "^ \t\n")
+         (setq extns (cons (buffer-substring save-pos (point)) extns)))
+       (while extns
+         (setq mailcap-mime-extensions
+               (cons
+                (cons (if (= (string-to-char (car extns)) ?.)
+                          (car extns)
+                        (concat "." (car extns))) type)
+                mailcap-mime-extensions)
+               extns (cdr extns)))))))
+
+(defun mailcap-extension-to-mime (extn)
+  "Return the MIME content type of the file extensions EXTN."
+  (if (and (stringp extn)
+          (not (eq (string-to-char extn) ?.)))
+      (setq extn (concat "." extn)))
+  (cdr (assoc (downcase extn) mailcap-mime-extensions)))
+
+(defvar mailcap-binary-suffixes
+  (if (memq system-type '(ms-dos windows-nt))
+      '(".exe" ".com" ".bat" ".cmd" ".btm" "")
+    '("")))
+
+(defun mailcap-command-p (command)
+  "Say whether COMMAND is in the exec path.
+The path of COMMAND will be returned iff COMMAND is a command."
+  (let ((path (if (file-name-absolute-p command) '(nil) exec-path))
+       file dir)
+    (catch 'found
+      (while (setq dir (pop path))
+       (let ((suffixes mailcap-binary-suffixes))
+         (while suffixes
+           (when (and (file-executable-p
+                       (setq file (expand-file-name
+                                   (concat command (pop suffixes))
+                                   dir)))
+                      (not (file-directory-p file)))
+             (throw 'found file))))))))
+
+(provide 'mailcap)
+
+;;; mailcap.el ends here
index 013df8f..f761af0 100644 (file)
@@ -927,7 +927,7 @@ The cdr of ech entry is a function for applying the face to a region.")
     (Lines)
     (Expires)
     (Message-ID)
-    (References . message-fill-references)
+    (References . message-shorten-references)
     (X-Mailer)
     (X-Newsreader))
   "Alist used for formatting headers.")
diff --git a/lisp/mm-decode.el b/lisp/mm-decode.el
new file mode 100644 (file)
index 0000000..e1d50ed
--- /dev/null
@@ -0,0 +1,134 @@
+;;; mm-decode.el --- Function for decoding MIME things
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is not yet part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'base64)
+(require 'qp)
+(require 'nnheader)
+
+(defvar mm-charset-regexp (concat "[^" "][\000-\040()<>@,\;:\\\"/?.=" "]+"))
+
+(defvar mm-encoded-word-regexp
+  (concat "=\\?\\(" mm-charset-regexp "\\)\\?\\(B\\|Q\\)\\?"
+         "\\([!->@-~]+\\)\\?="))
+
+(defun mm-decode-words-region (start end)
+  "Decode MIME-encoded words in region between START and END."
+  (interactive "r")
+  (save-excursion
+    (save-restriction
+      (narrow-to-region start end)
+      (goto-char (point-min))
+      ;; Remove whitespace between encoded words.
+      (while (re-search-forward
+             (concat "\\(" mm-encoded-word-regexp "\\)"
+                     "\\(\n?[ \t]\\)+"
+                     "\\(" mm-encoded-word-regexp "\\)")
+             nil t)
+       (delete-region (goto-char (match-end 1)) (match-beginning 6)))
+      ;; Decode the encoded words.
+      (goto-char (point-min))
+      (while (re-search-forward mm-encoded-word-regexp nil t)
+       (insert (mm-decode-word
+                (prog1
+                    (match-string 0)
+                  (delete-region (match-beginning 0) (match-end 0)))))))))
+
+(defun mm-decode-words-string (string)
+ "Decode the quoted-printable-encoded STRING and return the results."
+ (with-temp-buffer
+   (insert string)
+   (inline
+     (mm-decode-words-region (point-min) (point-max)))
+   (buffer-string)))
+
+(defun mm-decode-word (word)
+  "Decode WORD and return it if it is an encoded word.
+Return WORD if not."
+  (if (not (string-match mm-encoded-word-regexp word))
+      word
+    (or
+     (condition-case nil
+        (mm-decode-text
+         (match-string 1 word)
+         (upcase (match-string 2 word))
+         (match-string 3 word))
+       (error word))
+     word)))
+
+(eval-and-compile
+  (if (fboundp 'decode-coding-string)
+      (fset 'mm-decode-coding-string 'decode-coding-string)
+    (fset 'mm-decode-coding-string (lambda (s a) s))))
+
+(defun mm-decode-text (charset encoding string)
+  "Decode STRING as an encoded text.
+Valid ENCODINGs are \"B\" and \"Q\".
+If your Emacs implementation can't decode CHARSET, it returns nil."
+  (let ((cs (mm-charset-to-coding-system charset)))
+    (when cs
+      (mm-decode-coding-string
+       (cond
+       ((equal "B" encoding)
+        (base64-decode string))
+       ((equal "Q" encoding)
+        (quoted-printable-decode-string
+         (nnheader-replace-chars-in-string string ?_ ? )))
+       (t (error "Invalid encoding: %s" encoding)))
+       cs))))
+
+(defvar mm-charset-coding-system-alist
+  (let ((rest
+        '((us-ascii . iso-8859-1)
+          (gb2312 . cn-gb-2312)
+          (iso-2022-jp-2 . iso-2022-7bit-ss2)
+          (x-ctext . ctext)))
+       (systems (coding-system-list))
+       dest)
+    (while rest
+      (let ((pair (car rest)))
+       (unless (memq (car pair) systems)
+         (setq dest (cons pair dest))))
+      (setq rest (cdr rest)))
+    dest)
+  "Charset/coding system alist.")
+
+(defun mm-charset-to-coding-system (charset &optional lbt)
+  "Return coding-system corresponding to CHARSET.
+CHARSET is a symbol naming a MIME charset.
+If optional argument LBT (`unix', `dos' or `mac') is specified, it is
+used as the line break code type of the coding system."
+  (when (stringp charset)
+    (setq charset (intern (downcase charset))))
+  (setq charset
+       (or (cdr (assq charset mm-charset-coding-system-alist))
+           charset))
+  (when lbt
+    (setq charset (intern (format "%s-%s" charset lbt))))
+  (when (memq charset (coding-system-list))
+    charset))
+
+(provide 'mm-decode)
+
+;; qp.el ends here
diff --git a/lisp/mm-encode.el b/lisp/mm-encode.el
new file mode 100644 (file)
index 0000000..875d12f
--- /dev/null
@@ -0,0 +1,202 @@
+;;; mm-encode.el --- Functions for encoding MIME things
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;;     MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; This file is not yet part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(defvar mm-header-encoding-alist
+  '(("X-Nsubject" . iso-2022-jp-2)
+    ("Newsgroups" . nil)
+    ("Message-ID" . nil)
+    (t . mime))
+  "*Header/encoding method alist.
+The list is traversed sequentially.  The keys can either be a
+header regexp or `t'.
+
+The values can be:
+
+1) nil, in which case no encoding is done;
+2) `mime', in which case the header will be encoded according to RFC1522;
+3) a charset, in which case it will be encoded as that charse;
+4) `default', in which case the field will be encoded as the rest
+   of the article.")
+
+(defvar mm-mime-mule-charset-alist
+  '((us-ascii ascii)
+    (iso-8859-1 latin-iso8859-1)
+    (iso-8859-2 latin-iso8859-2)
+    (iso-8859-3 latin-iso8859-3)
+    (iso-8859-4 latin-iso8859-4)
+    (iso-8859-5 cyrillic-iso8859-5)
+    (koi8-r cyrillic-iso8859-5)
+    (iso-8859-6 arabic-iso8859-6)
+    (iso-8859-7 greek-iso8859-7)
+    (iso-8859-8 hebrew-iso8859-8)
+    (iso-8859-9 latin-iso8859-9)
+    (iso-2022-jp latin-jisx0201
+                japanese-jisx0208-1978 japanese-jisx0208)
+    (euc-kr korean-ksc5601)
+    (cn-gb-2312 chinese-gb2312)
+    (cn-big5 chinese-big5-1 chinese-big5-2)
+    (iso-2022-jp-2 latin-iso8859-1 greek-iso8859-7
+                  latin-jisx0201 japanese-jisx0208-1978
+                  chinese-gb2312 japanese-jisx0208
+                  korean-ksc5601 japanese-jisx0212)
+    (iso-2022-int-1 latin-iso8859-1 greek-iso8859-7
+                   latin-jisx0201 japanese-jisx0208-1978
+                   chinese-gb2312 japanese-jisx0208
+                   korean-ksc5601 japanese-jisx0212
+                   chinese-cns11643-1 chinese-cns11643-2)
+    (iso-2022-int-1 latin-iso8859-1 latin-iso8859-2
+                   cyrillic-iso8859-5 greek-iso8859-7
+                   latin-jisx0201 japanese-jisx0208-1978
+                   chinese-gb2312 japanese-jisx0208
+                   korean-ksc5601 japanese-jisx0212
+                   chinese-cns11643-1 chinese-cns11643-2
+                   chinese-cns11643-3 chinese-cns11643-4
+                   chinese-cns11643-5 chinese-cns11643-6
+                   chinese-cns11643-7))
+  "Alist of MIME-charset/MULE-charsets.")
+
+(defvar mm-mime-charset-encoding-alist
+  '((us-ascii . nil)
+    (iso-8859-1 . Q)
+    (iso-8859-2 . Q)
+    (iso-8859-3 . Q)
+    (iso-8859-4 . Q)
+    (iso-8859-5 . Q)
+    (koi8-r . Q)
+    (iso-8859-7 . Q)
+    (iso-8859-8 . Q)
+    (iso-8859-9 . Q)
+    (iso-2022-jp . B)
+    (iso-2022-kr . B)
+    (gb2312 . B)
+    (cn-gb . B)
+    (cn-gb-2312 . B)
+    (euc-kr . B)
+    (iso-2022-jp-2 . B)
+    (iso-2022-int-1 . B))
+  "Alist of MIME charsets to MIME encodings.
+Valid encodings are nil, `Q' and `B'.")
+
+(defvar mm-mime-encoding-function-alist
+  '((Q . quoted-printable-encode-region)
+    (B . base64-encode-region)
+    (nil . ignore))
+  "Alist of MIME encodings to encoding functions.")
+
+(defun mm-encode-message-header ()
+  "Encode the message header according to `mm-header-encoding-alist'."
+  (when (featurep 'mule)
+    (save-excursion
+      (save-restriction
+       (message-narrow-to-headers)
+       (let ((alist mm-header-encoding-alist)
+             elem method)
+         (while (not (eobp))
+           (save-restriction
+             (message-narrow-to-field)
+             (when (find-non-ascii-charset-region (point-min) (point-max))
+               ;; We found something that may perhaps be encoded.
+               (while (setq elem (pop alist))
+                 (when (or (and (stringp (car elem))
+                                (looking-at (car elem)))
+                           (eq (car elem) t))
+                   (setq alist nil
+                         method (cdr elem))))
+               (when method
+                 (cond
+                  ((eq method 'mime)
+                   (mm-encode-words-region (point-min) (point-max)))
+                  ;; Hm.
+                  (t))))
+             (goto-char (point-max)))))))))
+
+(defun mm-encode-words-region (b e)
+  "Encode all encodable words in REGION."
+  (let (prev c start qstart qprev qend)
+    (save-excursion
+      (goto-char b)
+      (while (re-search-forward "[^ \t\n]+" nil t)
+       (save-restriction
+         (narrow-to-region (match-beginning 0) (match-end 0))
+         (goto-char (setq start (point-min)))
+         (setq prev nil)
+         (while (not (eobp))
+           (unless (eq (setq c (char-charset (following-char))) 'ascii)
+             (cond
+              ((eq c prev)
+               )
+              ((null prev)
+               (setq qstart (or qstart start)
+                     qend (point-max)
+                     qprev c)
+               (setq prev c))
+              (t
+               ;(mm-encode-word-region start (setq start (point)) prev)
+               (setq prev c)
+               )))
+           (forward-char 1)))
+       (when (and (not prev) qstart)
+         (mm-encode-word-region qstart qend qprev)
+         (setq qstart nil)))
+      (when qstart
+       (mm-encode-word-region qstart qend qprev)
+       (setq qstart nil)))))
+
+(defun mm-encode-words-string (string)
+  "Encode words in STRING."
+  (with-temp-buffer
+    (insert string)
+    (mm-encode-words-region (point-min) (point-max))
+    (buffer-string)))
+
+(defun mm-mule-charset-to-mime-charset (charset)
+  "Return the MIME charset corresponding to MULE CHARSET."
+  (let ((alist mm-mime-mule-charset-alist)
+       out)
+    (while alist
+      (when (memq charset (cdar alist))
+       (setq out (caar alist)
+             alist nil))
+      (pop alist))
+    out))
+
+(defun mm-encode-word-region (b e charset)
+  "Encode the word in the region with CHARSET."
+  (let* ((mime-charset (mm-mule-charset-to-mime-charset charset))
+        (encoding (cdr (assq mime-charset mm-mime-charset-encoding-alist))))
+    (save-restriction
+      (narrow-to-region b e)
+      (funcall (cdr (assq encoding mm-mime-encoding-function-alist))
+              b e)
+      (goto-char (point-min))
+      (insert "=?" (upcase (symbol-name mime-charset)) "?"
+             (symbol-name encoding) "?")
+      (goto-char (point-max))
+      (insert "?="))))
+
+(provide 'mm-encode)
+
+;;; mm-encode.el ends here
diff --git a/lisp/mm-util.el b/lisp/mm-util.el
new file mode 100644 (file)
index 0000000..67018f4
--- /dev/null
@@ -0,0 +1,144 @@
+;;; mm-util.el --- Utility functions for MIME things
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;;     MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-and-compile
+  (if (fboundp 'decode-coding-string)
+      (fset 'mm-decode-coding-string 'decode-coding-string)
+    (fset 'mm-decode-coding-string (lambda (s a) s))))
+
+(eval-and-compile
+  (if (fboundp 'encode-coding-string)
+      (fset 'mm-encode-coding-string 'encode-coding-string)
+    (fset 'mm-encode-coding-string (lambda (s a) s))))
+
+(eval-and-compile
+  (if (fboundp 'coding-system-list)
+      (fset 'mm-coding-system-list 'coding-system-list)
+    (fset 'mm-coding-system-list 'ignore)))
+
+(defvar mm-mime-mule-charset-alist
+  '((us-ascii ascii)
+    (iso-8859-1 latin-iso8859-1)
+    (iso-8859-2 latin-iso8859-2)
+    (iso-8859-3 latin-iso8859-3)
+    (iso-8859-4 latin-iso8859-4)
+    (iso-8859-5 cyrillic-iso8859-5)
+    (koi8-r cyrillic-iso8859-5)
+    (iso-8859-6 arabic-iso8859-6)
+    (iso-8859-7 greek-iso8859-7)
+    (iso-8859-8 hebrew-iso8859-8)
+    (iso-8859-9 latin-iso8859-9)
+    (iso-2022-jp latin-jisx0201
+                japanese-jisx0208-1978 japanese-jisx0208)
+    (euc-kr korean-ksc5601)
+    (cn-gb-2312 chinese-gb2312)
+    (cn-big5 chinese-big5-1 chinese-big5-2)
+    (iso-2022-jp-2 latin-iso8859-1 greek-iso8859-7
+                  latin-jisx0201 japanese-jisx0208-1978
+                  chinese-gb2312 japanese-jisx0208
+                  korean-ksc5601 japanese-jisx0212)
+    (iso-2022-int-1 latin-iso8859-1 greek-iso8859-7
+                   latin-jisx0201 japanese-jisx0208-1978
+                   chinese-gb2312 japanese-jisx0208
+                   korean-ksc5601 japanese-jisx0212
+                   chinese-cns11643-1 chinese-cns11643-2)
+    (iso-2022-int-1 latin-iso8859-1 latin-iso8859-2
+                   cyrillic-iso8859-5 greek-iso8859-7
+                   latin-jisx0201 japanese-jisx0208-1978
+                   chinese-gb2312 japanese-jisx0208
+                   korean-ksc5601 japanese-jisx0212
+                   chinese-cns11643-1 chinese-cns11643-2
+                   chinese-cns11643-3 chinese-cns11643-4
+                   chinese-cns11643-5 chinese-cns11643-6
+                   chinese-cns11643-7))
+  "Alist of MIME-charset/MULE-charsets.")
+
+(defvar mm-charset-coding-system-alist
+  (let ((rest
+        '((us-ascii . iso-8859-1)
+          (gb2312 . cn-gb-2312)
+          (iso-2022-jp-2 . iso-2022-7bit-ss2)
+          (x-ctext . ctext)))
+       (systems (mm-coding-system-list))
+       dest)
+    (while rest
+      (let ((pair (car rest)))
+       (unless (memq (car pair) systems)
+         (setq dest (cons pair dest))))
+      (setq rest (cdr rest)))
+    dest)
+  "Charset/coding system alist.")
+
+(defun mm-mule-charset-to-mime-charset (charset)
+  "Return the MIME charset corresponding to MULE CHARSET."
+  (let ((alist mm-mime-mule-charset-alist)
+       out)
+    (while alist
+      (when (memq charset (cdar alist))
+       (setq out (caar alist)
+             alist nil))
+      (pop alist))
+    out))
+
+(defun mm-charset-to-coding-system (charset &optional lbt)
+  "Return coding-system corresponding to CHARSET.
+CHARSET is a symbol naming a MIME charset.
+If optional argument LBT (`unix', `dos' or `mac') is specified, it is
+used as the line break code type of the coding system."
+  (when (stringp charset)
+    (setq charset (intern (downcase charset))))
+  (setq charset
+       (or (cdr (assq charset mm-charset-coding-system-alist))
+           charset))
+  (when lbt
+    (setq charset (intern (format "%s-%s" charset lbt))))
+  (cond
+   ;; Running in a non-MULE environment.
+   ((and (null (mm-coding-system-list))
+        (eq charset 'iso-8859-1))
+    charset)
+   ;; Check to see whether we can handle this charset.
+   ((memq charset (mm-coding-system-list))
+    charset)
+   ;; Nope.
+   (t
+    nil)))
+
+(defun mm-replace-chars-in-string (string from to)
+  "Replace characters in STRING from FROM to TO."
+  (let ((string (substring string 0))  ;Copy string.
+       (len (length string))
+       (idx 0))
+    ;; Replace all occurrences of FROM with TO.
+    (while (< idx len)
+      (when (= (aref string idx) from)
+       (aset string idx to))
+      (setq idx (1+ idx)))
+    string))
+
+(provide 'mm-util)
+
+;;; mm-util.el ends here
diff --git a/lisp/mm-view.el b/lisp/mm-view.el
new file mode 100644 (file)
index 0000000..b9756e9
--- /dev/null
@@ -0,0 +1,104 @@
+;;; mm-view.el --- Functions for viewing MIME objects
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'mail-parse)
+(require 'mailcap)
+(require 'mm-bodies)
+
+;;;
+;;; Functions for displaying various formats inline
+;;;
+
+(defun mm-inline-image (handle)
+  (let ((type (cadr (split-string (car (mm-handle-type handle)) "/")))
+       buffer-read-only image)
+    (mm-with-unibyte-buffer
+      (insert-buffer-substring (mm-handle-buffer handle))
+      (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+      (setq image (make-image-specifier
+                  (vector (intern type) :data (buffer-string)))))
+    (let ((annot (make-annotation image nil 'text)))
+      (set-extent-property annot 'mm t)
+      (set-extent-property annot 'duplicable t)
+      (mm-handle-set-undisplayer handle annot))
+    (insert " ")))
+
+(defun mm-inline-text (handle)
+  (let ((type (cadr (split-string (car (mm-handle-type handle)) "/")))
+       text buffer-read-only)
+    (cond
+     ((equal type "plain")
+      (with-temp-buffer
+       (insert-buffer-substring (mm-handle-buffer handle))
+       (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+       (setq text (buffer-string)))
+      (let ((b (point)))
+       (insert text)
+       (save-restriction
+         (narrow-to-region b (point))
+         (let ((charset (mail-content-type-get
+                         (mm-handle-type handle) 'charset)))
+           (when charset
+             (mm-decode-body charset nil)))
+         (mm-handle-set-undisplayer
+          handle
+          `(lambda ()
+             (let (buffer-read-only)
+               (delete-region
+                ,(set-marker (make-marker) (point-min))
+                ,(set-marker (make-marker) (point-max)))))))))
+     ((equal type "html")
+      (save-excursion
+       (w3-do-setup)
+       (mm-with-unibyte-buffer
+         (insert-buffer-substring (mm-handle-buffer handle))
+         (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+         (require 'url)
+         (save-window-excursion
+           (w3-region (point-min) (point-max))
+           (setq text (buffer-string))))
+       (let ((b (point)))
+         (insert text)
+         (mm-handle-set-undisplayer
+          handle
+          `(lambda ()
+             (let (buffer-read-only)
+               (delete-region ,(set-marker (make-marker) b)
+                              ,(set-marker (make-marker) (point)))))))))
+     )))
+
+(defun mm-inline-audio (handle)
+  (message "Not implemented"))
+
+(defun mm-view-sound-file ()
+  (message "Not implemented"))
+
+(defun mm-w3-prepare-buffer ()
+  (require 'w3)
+  (w3-prepare-buffer))
+
+(provide 'mm-view)
+
+;; mm-view.el ends here
diff --git a/lisp/mm.el b/lisp/mm.el
new file mode 100644 (file)
index 0000000..1b57cb1
--- /dev/null
@@ -0,0 +1,1283 @@
+;;; mm.el,v --- Mailcap parsing routines, and MIME handling
+;; Author: wmperry
+;; Created: 1996/05/28 02:46:51
+;; Version: 1.96
+;; Keywords: mail, news, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1994, 1995, 1996 by William M. Perry <wmperry@cs.indiana.edu>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Generalized mailcap parsing and access routines
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Data structures
+;;; ---------------
+;;; The mailcap structure is an assoc list of assoc lists.
+;;; 1st assoc list is keyed on the major content-type
+;;; 2nd assoc list is keyed on the minor content-type (which can be a regexp)
+;;;
+;;; Which looks like:
+;;; -----------------
+;;; (
+;;;  ("application"
+;;;   ("postscript" . <info>)
+;;;  )
+;;;  ("text"
+;;;   ("plain" . <info>)
+;;;  )
+;;; )
+;;;
+;;; Where <info> is another assoc list of the various information
+;;; related to the mailcap RFC.  This is keyed on the lowercase
+;;; attribute name (viewer, test, etc).  This looks like:
+;;; (("viewer" . viewerinfo)
+;;;  ("test"   . testinfo)
+;;;  ("xxxx"   . "string")
+;;; )
+;;;
+;;; Where viewerinfo specifies how the content-type is viewed.  Can be
+;;; a string, in which case it is run through a shell, with
+;;; appropriate parameters, or a symbol, in which case the symbol is
+;;; funcall'd, with the buffer as an argument.
+;;;
+;;; testinfo is a list of strings, or nil.  If nil, it means the
+;;; viewer specified is always valid.  If it is a list of strings,
+;;; these are used to determine whether a viewer passes the 'test' or
+;;; not.
+;;;
+;;; The main interface to this code is:
+;;;
+;;; To set everything up:
+;;;
+;;;  (mm-parse-mailcaps [path])
+;;;
+;;;  Where PATH is a unix-style path specification (: separated list
+;;;  of strings).  If PATH is nil, the environment variable MAILCAPS
+;;;  will be consulted.  If there is no environment variable, then a
+;;;  default list of paths is used.
+;;;
+;;; To retrieve the information:
+;;;  (mm-mime-info st [nd] [request])
+;;;
+;;;  Where st and nd are positions in a buffer that contain the
+;;;  content-type header information of a mail/news/whatever message.
+;;;  st can optionally be a string that contains the content-type
+;;;  information.
+;;;
+;;;  Third argument REQUEST specifies what information to return.  If
+;;;  it is nil or the empty string, the viewer (second field of the
+;;;  mailcap entry) will be returned.  If it is a string, then the
+;;;  mailcap field corresponding to that string will be returned
+;;;  (print, description, whatever).  If a number, then all the
+;;;  information for this specific viewer is returned.
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Variables, etc
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(eval-and-compile
+  (require 'cl)
+;LMI was here
+  ;;(require 'devices)
+  )
+
+(defconst mm-version (let ((x "1.96"))
+                      (if (string-match "Revision: \\([^ \t\n]+\\)" x)
+                          (substring x (match-beginning 1) (match-end 1))
+                        x))
+  "Version # of MM package")
+
+(defvar mm-parse-args-syntax-table
+  (copy-syntax-table emacs-lisp-mode-syntax-table)
+  "A syntax table for parsing sgml attributes.")
+
+(modify-syntax-entry ?' "\"" mm-parse-args-syntax-table)
+(modify-syntax-entry ?` "\"" mm-parse-args-syntax-table)
+(modify-syntax-entry ?{ "(" mm-parse-args-syntax-table)
+(modify-syntax-entry ?} ")" mm-parse-args-syntax-table)
+
+(defvar mm-mime-data
+  '(
+    ("multipart"   . (
+                     ("alternative". (("viewer" . mm-multipart-viewer)
+                                      ("type"   . "multipart/alternative")))
+                     ("mixed"      . (("viewer" . mm-multipart-viewer)
+                                      ("type"   . "multipart/mixed")))
+                     (".*"         . (("viewer" . mm-save-binary-file)
+                                      ("type"   . "multipart/*")))
+                     )
+     )
+    ("application" . (
+                     ("x-x509-ca-cert" . (("viewer" . ssl-view-site-cert)
+                                          ("test" . (fboundp 'ssl-view-site-cert))
+                                          ("type" . "application/x-x509-ca-cert")))
+                     ("x-x509-user-cert" . (("viewer" . ssl-view-user-cert)
+                                            ("test" . (fboundp 'ssl-view-user-cert))
+                                            ("type" . "application/x-x509-user-cert")))
+                     ("octet-stream" . (("viewer" . mm-save-binary-file)
+                                        ("type" ."application/octet-stream")))
+                     ("dvi"        . (("viewer" . "open %s")
+                                      ("type"   . "application/dvi")
+                                      ("test"   . (eq (device-type) 'ns))))
+                     ("dvi"        . (("viewer" . "xdvi %s")
+                                      ("test"   . (eq (device-type) 'x))
+                                      ("needsx11")
+                                      ("type"   . "application/dvi")))
+                     ("dvi"        . (("viewer" . "dvitty %s")
+                                      ("test"   . (not (getenv "DISPLAY")))
+                                      ("type"   . "application/dvi")))
+                     ("emacs-lisp" . (("viewer" . mm-maybe-eval)
+                                      ("type"   . "application/emacs-lisp")))
+;                    ("x-tar"      . (("viewer" . tar-mode)
+;                                     ("test"   . (fboundp 'tar-mode))
+;                                     ("type"   . "application/x-tar")))
+                     ("x-tar"      . (("viewer" . mm-save-binary-file)
+                                      ("type"   . "application/x-tar")))
+                     ("x-latex"    . (("viewer" . tex-mode)
+                                      ("test"   . (fboundp 'tex-mode))
+                                      ("type"   . "application/x-latex")))
+                     ("x-tex"      . (("viewer" . tex-mode)
+                                      ("test"   . (fboundp 'tex-mode))
+                                      ("type"   . "application/x-tex")))
+                     ("latex"      . (("viewer" . tex-mode)
+                                      ("test"   . (fboundp 'tex-mode))
+                                      ("type"   . "application/latex")))
+                     ("tex"        . (("viewer" . tex-mode)
+                                      ("test"   . (fboundp 'tex-mode))
+                                      ("type"   . "application/tex")))
+                     ("texinfo"    . (("viewer" . texinfo-mode)
+                                      ("test"   . (fboundp 'texinfo-mode))
+                                      ("type"   . "application/tex")))
+                     ("zip"        . (("viewer" . mm-save-binary-file)
+                                      ("type"   . "application/zip")
+                                      ("copiousoutput")))
+                     ("pdf"        . (("viewer" . "acroread %s")
+                                      ("type"   . "application/pdf")))
+                     ("postscript" . (("viewer" . "open %s")
+                                      ("type"   . "application/postscript")
+                                      ("test"   . (eq (device-type) 'ns))))
+                     ("postscript" . (("viewer" . "ghostview %s")
+                                      ("type" . "application/postscript")
+                                      ("test"   . (eq (device-type) 'x))
+                                      ("needsx11")))
+                     ("postscript" . (("viewer" . "ps2ascii %s")
+                                      ("type" . "application/postscript")
+                                      ("test" . (not (getenv "DISPLAY")))
+                                      ("copiousoutput")))
+                     ))
+    ("audio"       . (
+                     ("x-mpeg" . (("viewer" . "maplay %s")
+                                  ("type"   . "audio/x-mpeg")))
+                     (".*" . (("viewer" . mm-play-sound-file)
+                              ("test"   . (or (featurep 'nas-sound)
+                                              (featurep 'native-sound)))
+                              ("type"   . "audio/*")))
+                     (".*" . (("viewer" . "showaudio")
+                              ("type"   . "audio/*")))
+                     ))
+    ("message"     . (
+                     ("rfc-*822" . (("viewer" . vm-mode)
+                                    ("test"   . (fboundp 'vm-mode))
+                                    ("type"   . "message/rfc-822")))
+                     ("rfc-*822" . (("viewer" . w3-mode)
+                                    ("test"   . (fboundp 'w3-mode))
+                                    ("type"   . "message/rfc-822")))
+                     ("rfc-*822" . (("viewer" . view-mode)
+                                    ("test"   . (fboundp 'view-mode))
+                                    ("type"   . "message/rfc-822")))
+                     ("rfc-*822" . (("viewer" . fundamental-mode)
+                                    ("type"   . "message/rfc-822")))
+                     ))
+    ("image"       . (
+                     ("x-xwd" . (("viewer"  . "xwud -in %s")
+                                 ("type"    . "image/x-xwd")
+                                 ("compose" . "xwd -frame > %s")
+                                 ("test"    . (eq (device-type) 'x))
+                                 ("needsx11")))
+                     ("x11-dump" . (("viewer" . "xwud -in %s")
+                                    ("type" . "image/x-xwd")
+                                    ("compose" . "xwd -frame > %s")
+                                    ("test"   . (eq (device-type) 'x))
+                                    ("needsx11")))
+                     ("windowdump" . (("viewer" . "xwud -in %s")
+                                      ("type" . "image/x-xwd")
+                                      ("compose" . "xwd -frame > %s")
+                                      ("test"   . (eq (device-type) 'x))
+                                      ("needsx11")))
+                     (".*" . (("viewer" . "open %s")
+                              ("type"   . "image/*")
+                              ("test"   . (eq (device-type) 'ns))))
+                     (".*" . (("viewer" . "xv -perfect %s")
+                              ("type" . "image/*")
+                              ("test"   . (eq (device-type) 'x))
+                              ("needsx11")))
+                     ))
+    ("text"        . (
+                     ("plain" . (("viewer"  . w3-mode)
+                                 ("test"    . (fboundp 'w3-mode))
+                                 ("type"    . "text/plain")))
+                     ("plain" . (("viewer"  . view-mode)
+                                 ("test"    . (fboundp 'view-mode))
+                                 ("type"    . "text/plain")))
+                     ("plain" . (("viewer"  . fundamental-mode)
+                                 ("type"    . "text/plain")))
+                     ("enriched" . (("viewer" . enriched-decode-region)
+                                    ("test"   . (fboundp
+                                                 'enriched-decode-region))
+                                    ("type"   . "text/enriched")))
+                     ("html"  . (("viewer" . w3-prepare-buffer)
+                                 ("test"   . (fboundp 'w3-prepare-buffer))
+                                 ("type"   . "text/html")))
+                     ))
+    ("video"       . (
+                     ("mpeg" . (("viewer" . "mpeg_play %s")
+                                ("type"   . "video/mpeg")
+                                ("test"   . (eq (device-type) 'x))
+                                ("needsx11")))
+                     ))
+    ("x-world"     . (
+                     ("x-vrml" . (("viewer"  . "webspace -remote %s -URL %u")
+                                  ("type"    . "x-world/x-vrml")
+                                  ("description"
+                                   "VRML document")))))
+    ("archive"     . (
+                     ("tar"  . (("viewer" . tar-mode)
+                                ("type" . "archive/tar")
+                                ("test" . (fboundp 'tar-mode))))
+                     ))
+    )
+  "*The mailcap structure is an assoc list of assoc lists.
+1st assoc list is keyed on the major content-type
+2nd assoc list is keyed on the minor content-type (which can be a regexp)
+
+Which looks like:
+-----------------
+(
+ (\"application\"
+  (\"postscript\" . <info>)
+ )
+ (\"text\"
+  (\"plain\" . <info>)
+ )
+)
+
+Where <info> is another assoc list of the various information
+related to the mailcap RFC.  This is keyed on the lowercase
+attribute name (viewer, test, etc).  This looks like:
+((\"viewer\" . viewerinfo)
+ (\"test\"   . testinfo)
+ (\"xxxx\"   . \"string\")
+)
+
+Where viewerinfo specifies how the content-type is viewed.  Can be
+a string, in which case it is run through a shell, with
+appropriate parameters, or a symbol, in which case the symbol is
+funcall'd, with the buffer as an argument.
+
+testinfo is a list of strings, or nil.  If nil, it means the
+viewer specified is always valid.  If it is a list of strings,
+these are used to determine whether a viewer passes the 'test' or
+not.")
+
+(defvar mm-content-transfer-encodings
+  '(("base64"     . base64-decode-region)
+    ("7bit"       . ignore)
+    ("8bit"       . ignore)
+    ("binary"     . ignore)
+    ("x-compress" . ("uncompress" "-c"))
+    ("x-gzip"     . ("gzip" "-dc"))
+    ("compress"   . ("uncompress" "-c"))
+    ("gzip"       . ("gzip" "-dc"))
+    ("x-hqx"      . ("mcvert" "-P" "-s" "-S"))
+    ("quoted-printable" . mm-decode-quoted-printable)
+    )
+  "*An assoc list of content-transfer-encodings and how to decode them.")
+
+(defvar mm-download-directory nil
+  "*Where downloaded files should go by default.")
+
+(defvar mm-temporary-directory (or (getenv "TMPDIR") "/tmp")
+  "*Where temporary files go.")
+
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; A few things from w3 and url, just in case this is used without them
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun mm-generate-unique-filename (&optional fmt)
+  "Generate a unique filename in mm-temporary-directory"
+  (if (not fmt)
+      (let ((base (format "mm-tmp.%d" (user-real-uid)))
+           (fname "")
+           (x 0))
+       (setq fname (format "%s%d" base x))
+       (while (file-exists-p
+               (expand-file-name fname mm-temporary-directory))
+         (setq x (1+ x)
+               fname (concat base (int-to-string x))))
+       (expand-file-name fname mm-temporary-directory))
+    (let ((base (concat "mm" (int-to-string (user-real-uid))))
+         (fname "")
+         (x 0))
+      (setq fname (format fmt (concat base (int-to-string x))))
+      (while (file-exists-p
+             (expand-file-name fname mm-temporary-directory))
+       (setq x (1+ x)
+             fname (format fmt (concat base (int-to-string x)))))
+      (expand-file-name fname mm-temporary-directory))))
+
+(if (and (fboundp 'copy-tree)
+        (subrp (symbol-function 'copy-tree)))
+    (fset 'mm-copy-tree 'copy-tree)
+  (defun mm-copy-tree (tree)
+    (if (consp tree)
+       (cons (mm-copy-tree (car tree))
+             (mm-copy-tree (cdr tree)))
+      (if (vectorp tree)
+         (let* ((new (copy-sequence tree))
+                (i (1- (length new))))
+           (while (>= i 0)
+             (aset new i (mm-copy-tree (aref new i)))
+             (setq i (1- i)))
+           new)
+       tree))))
+
+;LMI was here
+;(require 'mule-sysdp)
+
+(if (not (fboundp 'w3-save-binary-file))
+    (defun mm-save-binary-file ()
+      ;; Ok, this is truly fucked.  In XEmacs, if you use the mouse to select
+      ;; a URL that gets saved via this function, read-file-name will pop up a
+      ;; dialog box for file selection.  For some reason which buffer we are in
+      ;; gets royally screwed (even with save-excursions and the whole nine
+      ;; yards).  SO, we just keep the old buffer name around and away we go.
+      (let ((old-buff (current-buffer))
+           (file (read-file-name "Filename to save as: "
+                                 (or mm-download-directory "~/")
+                                 (file-name-nondirectory (url-view-url t))
+                                 nil
+                                 (file-name-nondirectory (url-view-url t))))
+           (require-final-newline nil))
+       (set-buffer old-buff)
+       (mule-write-region-no-coding-system (point-min) (point-max) file)
+       (kill-buffer (current-buffer))))
+  (fset 'mm-save-binary-file 'w3-save-binary-file))
+
+(defun mm-maybe-eval ()
+  "Maybe evaluate a buffer of emacs lisp code"
+  (if (yes-or-no-p "This is emacs-lisp code, evaluate it? ")
+      (eval-buffer (current-buffer))
+    (emacs-lisp-mode)))
+
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The mailcap parser
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-viewer-unescape (format &optional filename url)
+  (save-excursion
+    (set-buffer (get-buffer-create " *mm-parse*"))
+    (erase-buffer)
+    (insert format)
+    (goto-char (point-min))
+    (while (re-search-forward "%\\(.\\)" nil t)
+       (let ((escape (aref (match-string 1) 0)))
+        (replace-match "" t t)
+        (case escape
+          (?% (insert "%"))
+          (?s (insert (or filename "\"\"")))
+          (?u (insert (or url "\"\""))))))
+    (buffer-string)))
+
+(defun mm-in-assoc (elt list)
+  ;; Check to see if ELT matches any of the regexps in the car elements of LIST
+  (let (rslt)
+    (while (and list (not rslt))
+      (and (car (car list))
+          (string-match (car (car list)) elt)
+          (setq rslt (car list)))
+      (setq list (cdr list)))
+    rslt))
+
+(defun mm-replace-regexp (regexp to-string)
+  ;; Quiet replace-regexp.
+  (goto-char (point-min))
+  (while (re-search-forward regexp nil t)
+    (replace-match to-string t nil)))
+
+(defun mm-parse-mailcaps (&optional path)
+  ;; Parse out all the mailcaps specified in a unix-style path string PATH
+  (cond
+   (path nil)
+   ((getenv "MAILCAPS") (setq path (getenv "MAILCAPS")))
+   ((memq system-type '(ms-dos ms-windows windows-nt))
+    (setq path (mapconcat 'expand-file-name '("~/mail.cap" "~/etc/mail.cap")
+                         ";")))
+   (t (setq path (mapconcat 'expand-file-name
+                           '("~/.mailcap"
+                             "/etc/mailcap:/usr/etc/mailcap"
+                             "/usr/local/etc/mailcap") ":"))))
+  (let ((fnames (reverse
+                (mm-string-to-tokens path
+                                     (if (memq system-type
+                                               '(ms-dos ms-windows windows-nt))
+                                         ?;
+                                       ?:))))
+       fname)
+    (while fnames
+      (setq fname (car fnames))
+      (if (and (file-exists-p fname) (file-readable-p fname))
+         (mm-parse-mailcap (car fnames)))
+      (setq fnames (cdr fnames)))))
+
+(defun mm-parse-mailcap (fname)
+  ;; Parse out the mailcap file specified by FNAME
+  (let (major                          ; The major mime type (image/audio/etc)
+       minor                           ; The minor mime type (gif, basic, etc)
+       save-pos                        ; Misc saved positions used in parsing
+       viewer                          ; How to view this mime type
+       info                            ; Misc info about this mime type
+       )
+    (save-excursion
+      (set-buffer (get-buffer-create " *mailcap*"))
+      (erase-buffer)
+      (insert-file-contents fname)
+      (set-syntax-table mm-parse-args-syntax-table)
+      (mm-replace-regexp "#.*" "")              ; Remove all comments
+      (mm-replace-regexp "\n+" "\n")         ; And blank lines
+      (mm-replace-regexp "\\\\[ \t\n]+" " ") ; And collapse spaces
+      (mm-replace-regexp (concat (regexp-quote "\\") "[ \t]*\n") "")
+      (goto-char (point-max))
+      (skip-chars-backward " \t\n")
+      (delete-region (point) (point-max))
+      (goto-char (point-min))
+      (while (not (eobp))
+       (skip-chars-forward " \t\n")
+       (setq save-pos (point)
+             info nil)
+       (skip-chars-forward "^/;")
+       (downcase-region save-pos (point))
+       (setq major (buffer-substring save-pos (point)))
+       (skip-chars-forward "/ \t\n")
+       (setq save-pos (point))
+       (skip-chars-forward "^;")
+       (downcase-region save-pos (point))
+       (setq minor
+             (cond
+              ((= ?* (or (char-after save-pos) 0)) ".*")
+              ((= (point) save-pos) ".*")
+              (t (buffer-substring save-pos (point)))))
+       (skip-chars-forward "; \t\n")
+       ;;; Got the major/minor chunks, now for the viewers/etc
+       ;;; The first item _must_ be a viewer, according to the
+       ;;; RFC for mailcap files (#1343)
+       (skip-chars-forward "; \t\n")
+       (setq save-pos (point))
+       (skip-chars-forward "^;\n")
+       (if (= (or (char-after save-pos) 0) ?')
+           (setq viewer (progn
+                          (narrow-to-region (1+ save-pos) (point))
+                          (goto-char (point-min))
+                          (prog1
+                              (read (current-buffer))
+                            (goto-char (point-max))
+                            (widen))))
+         (setq viewer (buffer-substring save-pos (point))))
+       (setq save-pos (point))
+       (end-of-line)
+       (setq info (nconc (list (cons "viewer" viewer)
+                               (cons "type" (concat major "/"
+                                                    (if (string= minor ".*")
+                                                        "*" minor))))
+                         (mm-parse-mailcap-extras save-pos (point))))
+       (mm-mailcap-entry-passes-test info)
+       (mm-add-mailcap-entry major minor info)))))
+
+(defun mm-parse-mailcap-extras (st nd)
+  ;; Grab all the extra stuff from a mailcap entry
+  (let (
+       name                            ; From name=
+       value                           ; its value
+       results                         ; Assoc list of results
+       name-pos                        ; Start of XXXX= position
+       val-pos                         ; Start of value position
+       done                            ; Found end of \'d ;s?
+       )
+    (save-restriction
+      (narrow-to-region st nd)
+      (goto-char (point-min))
+      (skip-chars-forward " \n\t;")
+      (while (not (eobp))
+       (setq done nil)
+       (skip-chars-forward " \";\n\t")
+       (setq name-pos (point))
+       (skip-chars-forward "^ \n\t=")
+       (downcase-region name-pos (point))
+       (setq name (buffer-substring name-pos (point)))
+       (skip-chars-forward " \t\n")
+       (if (/= (or (char-after (point)) 0)  ?=) ; There is no value
+           (setq value nil)
+         (skip-chars-forward " \t\n=")
+         (setq val-pos (point))
+         (if (memq (char-after val-pos) '(?\" ?'))
+             (progn
+               (setq val-pos (1+ val-pos))
+               (condition-case nil
+                   (progn
+                     (forward-sexp 1)
+                     (backward-char 1))
+                 (error (goto-char (point-max)))))
+           (while (not done)
+             (skip-chars-forward "^;")
+             (if (= (or (char-after (1- (point))) 0) ?\\ )
+                 (progn
+                   (subst-char-in-region (1- (point)) (point) ?\\ ? )
+                   (skip-chars-forward ";"))
+               (setq done t))))
+         (setq value (buffer-substring val-pos (point))))
+       (setq results (cons (cons name value) results)))
+      results)))  
+
+(defun mm-string-to-tokens (str &optional delim)
+  "Return a list of words from the string STR"
+  (setq delim (or delim ? ))
+  (let (results y)
+    (mapcar
+     (function
+      (lambda (x)
+       (cond
+        ((and (= x delim) y) (setq results (cons y results) y nil))
+        ((/= x delim) (setq y (concat y (char-to-string x))))
+        (t nil)))) str)
+    (nreverse (cons y results))))
+
+(defun mm-mailcap-entry-passes-test (info)
+  ;; Return t iff a mailcap entry passes its test clause or no test
+  ;; clause is present.
+  (let (status                         ; Call-process-regions return value
+       (test (assoc "test" info)); The test clause
+       )
+    (setq status (and test (mm-string-to-tokens (cdr test))))
+    (if (and (assoc "needsx11" info) (not (getenv "DISPLAY")))
+       (setq status nil)
+      (cond
+       ((and (equal (nth 0 status) "test")
+            (equal (nth 1 status) "-n")
+            (or (equal (nth 2 status) "$DISPLAY")
+                (equal (nth 2 status) "\"$DISPLAY\"")))
+       (setq status (if (getenv "DISPLAY") t nil)))
+       ((and (equal (nth 0 status) "test")
+            (equal (nth 1 status) "-z")
+            (or (equal (nth 2 status) "$DISPLAY")
+                (equal (nth 2 status) "\"$DISPLAY\"")))
+       (setq status (if (getenv "DISPLAY") nil t)))
+       (test nil)
+       (t nil)))
+    (and test (listp test) (setcdr test status))))
+
+(defun mm-parse-args (st &optional nd nodowncase)
+  ;; Return an assoc list of attribute/value pairs from an RFC822-type string
+  (let (
+       name                            ; From name=
+       value                           ; its value
+       results                         ; Assoc list of results
+       name-pos                        ; Start of XXXX= position
+       val-pos                         ; Start of value position
+       )
+    (save-excursion
+      (if (stringp st)
+         (progn
+           (set-buffer (get-buffer-create " *mm-temp*"))
+           (set-syntax-table mm-parse-args-syntax-table)
+           (erase-buffer)
+           (insert st)
+           (setq st (point-min)
+                 nd (point-max)))
+       (set-syntax-table mm-parse-args-syntax-table))
+      (save-restriction
+       (narrow-to-region st nd)
+       (goto-char (point-min))
+       (while (not (eobp))
+         (skip-chars-forward "; \n\t")
+         (setq name-pos (point))
+         (skip-chars-forward "^ \n\t=;")
+         (if (not nodowncase)
+             (downcase-region name-pos (point)))
+         (setq name (buffer-substring name-pos (point)))
+         (skip-chars-forward " \t\n")
+         (if (/= (or (char-after (point)) 0)  ?=) ; There is no value
+             (setq value nil)
+           (skip-chars-forward " \t\n=")
+           (setq val-pos (point)
+                 value
+                 (cond
+                  ((or (= (or (char-after val-pos) 0) ?\")
+                       (= (or (char-after val-pos) 0) ?'))
+                   (buffer-substring (1+ val-pos)
+                                     (condition-case ()
+                                         (prog2
+                                             (forward-sexp 1)
+                                             (1- (point))
+                                           (skip-chars-forward "\""))
+                                       (error
+                                        (skip-chars-forward "^ \t\n")
+                                        (point)))))
+                  (t
+                   (buffer-substring val-pos
+                                     (progn
+                                       (skip-chars-forward "^;")
+                                       (skip-chars-backward " \t")
+                                       (point)))))))
+         (setq results (cons (cons name value) results))
+         (skip-chars-forward "; \n\t"))
+       results))))
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The action routines.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-possible-viewers (major minor)
+  ;; Return a list of possible viewers from MAJOR for minor type MINOR
+  (let ((exact '())
+       (wildcard '()))
+    (while major
+      (cond
+       ((equal (car (car major)) minor)
+       (setq exact (cons (cdr (car major)) exact)))
+       ((string-match (car (car major)) minor)
+       (setq wildcard (cons (cdr (car major)) wildcard))))
+      (setq major (cdr major)))
+    (nconc (nreverse exact) (nreverse wildcard))))
+
+(defun mm-unescape-mime-test (test type-info)
+  (let ((buff (get-buffer-create " *unescape*"))
+       save-pos save-chr subst)
+    (cond
+     ((symbolp test) test)
+     ((and (listp test) (symbolp (car test))) test)
+     ((or (stringp test)
+         (and (listp test) (stringp (car test))
+              (setq test (mapconcat 'identity test " "))))
+      (save-excursion
+       (set-buffer buff)
+       (erase-buffer)
+       (insert test)
+       (goto-char (point-min))
+       (while (not (eobp))
+         (skip-chars-forward "^%")
+         (if (/= (- (point)
+                    (progn (skip-chars-backward "\\\\")
+                           (point)))
+                 0) ; It is an escaped %
+             (progn
+               (delete-char 1)
+               (skip-chars-forward "%."))
+           (setq save-pos (point))
+           (skip-chars-forward "%")
+           (setq save-chr (char-after (point)))
+           (cond
+            ((null save-chr) nil)
+            ((= save-chr ?t)
+             (delete-region save-pos (progn (forward-char 1) (point)))
+             (insert (or (cdr (assoc "type" type-info)) "\"\"")))
+            ((= save-chr ?M)
+             (delete-region save-pos (progn (forward-char 1) (point)))
+             (insert "\"\""))
+            ((= save-chr ?n)
+             (delete-region save-pos (progn (forward-char 1) (point)))
+             (insert "\"\""))
+            ((= save-chr ?F)
+             (delete-region save-pos (progn (forward-char 1) (point)))
+             (insert "\"\""))
+            ((= save-chr ?{)
+             (forward-char 1)
+             (skip-chars-forward "^}")
+             (downcase-region (+ 2 save-pos) (point))
+             (setq subst (buffer-substring (+ 2 save-pos) (point)))
+             (delete-region save-pos (1+ (point)))
+             (insert (or (cdr (assoc subst type-info)) "\"\"")))
+            (t nil))))
+       (buffer-string)))
+     (t (error "Bad value to mm-unescape-mime-test. %s" test)))))
+
+(defun mm-viewer-passes-test (viewer-info type-info)
+  ;; Return non-nil iff the viewer specified by VIEWER-INFO passes its
+  ;; test clause (if any).
+  (let* ((test-info   (assoc "test"   viewer-info))
+        (test (cdr test-info))
+        (viewer (cdr (assoc "viewer" viewer-info)))
+        (default-directory (expand-file-name "~/"))
+        status
+        parsed-test
+       )
+    (cond
+     ((not test-info) t)               ; No test clause
+     ((not test) nil)                  ; Already failed test
+     ((eq test t) t)                   ; Already passed test
+     ((and (symbolp test)              ; Lisp function as test
+          (fboundp test))
+      (funcall test type-info))
+     ((and (symbolp test)              ; Lisp variable as test
+          (boundp test))
+      (symbol-value test))
+     ((and (listp test)                        ; List to be eval'd
+          (symbolp (car test)))
+      (eval test))
+     (t
+      (setq test (mm-unescape-mime-test test type-info)
+           test (list shell-file-name nil nil nil shell-command-switch test)
+           status (apply 'call-process test))
+      (= 0 status)))))
+
+(defun mm-add-mailcap-entry (major minor info)
+  (let ((old-major (assoc major mm-mime-data)))
+    (if (null old-major)               ; New major area
+       (setq mm-mime-data
+             (cons (cons major (list (cons minor info)))
+                   mm-mime-data))
+      (let ((cur-minor (assoc minor old-major)))
+       (cond
+        ((or (null cur-minor)          ; New minor area, or
+             (assoc "test" info))      ; Has a test, insert at beginning
+         (setcdr old-major (cons (cons minor info) (cdr old-major))))
+        ((and (not (assoc "test" info)); No test info, replace completely
+              (not (assoc "test" cur-minor)))
+         (setcdr cur-minor info))
+        (t
+         (setcdr old-major (cons (cons minor info) (cdr old-major)))))))))
+
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The main whabbo
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-viewer-lessp (x y)
+  ;; Return t iff viewer X is more desirable than viewer Y
+  (let ((x-wild (string-match "[*?]" (or (cdr-safe (assoc "type" x)) "")))
+       (y-wild (string-match "[*?]" (or (cdr-safe (assoc "type" y)) "")))
+       (x-lisp (not (stringp (or (cdr-safe (assoc "viewer" x)) ""))))
+       (y-lisp (not (stringp (or (cdr-safe (assoc "viewer" y)) "")))))
+    (cond
+     ((and x-lisp (not y-lisp))
+      t)
+     ((and (not y-lisp) x-wild (not y-wild))
+      t)
+     ((and (not x-wild) y-wild)
+      t)
+     (t nil))))
+
+(defun mm-mime-info (st &optional nd request)
+  "Get the mime viewer command for HEADERLINE, return nil if none found.
+Expects a complete content-type header line as its argument.  This can
+be simple like text/html, or complex like text/plain; charset=blah; foo=bar
+
+Third argument REQUEST specifies what information to return.  If it is
+nil or the empty string, the viewer (second field of the mailcap
+entry) will be returned.  If it is a string, then the mailcap field
+corresponding to that string will be returned (print, description,
+whatever).  If a number, then all the information for this specific
+viewer is returned."
+  (let (
+       major                           ; Major encoding (text, etc)
+       minor                           ; Minor encoding (html, etc)
+       info                            ; Other info
+       save-pos                        ; Misc. position during parse
+       major-info                      ; (assoc major mm-mime-data)
+       minor-info                      ; (assoc minor major-info)
+       test                            ; current test proc.
+       viewers                         ; Possible viewers
+       passed                          ; Viewers that passed the test
+       viewer                          ; The one and only viewer
+       )
+    (save-excursion
+      (cond
+       ((null st)
+       (set-buffer (get-buffer-create " *mimeparse*"))
+       (erase-buffer)
+       (insert "text/plain")
+       (setq st (point-min)))
+       ((stringp st)
+       (set-buffer (get-buffer-create " *mimeparse*"))
+       (erase-buffer)
+       (insert st)
+       (setq st (point-min)))
+       ((null nd)
+       (narrow-to-region st (progn (goto-char st) (end-of-line) (point))))
+       (t (narrow-to-region st nd)))
+      (goto-char st)
+      (skip-chars-forward ": \t\n")
+      (buffer-enable-undo)
+      (setq viewer
+           (catch 'mm-exit
+             (setq save-pos (point))
+             (skip-chars-forward "^/")
+             (downcase-region save-pos (point))
+             (setq major (buffer-substring save-pos (point)))
+             (if (not (setq major-info (cdr (assoc major mm-mime-data))))
+                 (throw 'mm-exit nil))
+             (skip-chars-forward "/ \t\n")
+             (setq save-pos (point))
+             (skip-chars-forward "^ \t\n;")
+             (downcase-region save-pos (point))
+             (setq minor (buffer-substring save-pos (point)))
+             (if (not
+                  (setq viewers (mm-possible-viewers major-info minor)))
+                 (throw 'mm-exit nil))
+             (skip-chars-forward "; \t")
+             (if (eolp)
+                 nil                           ; No qualifiers
+               (setq save-pos (point))
+               (end-of-line)
+               (setq info (mm-parse-args save-pos (point)))
+               )
+             (while viewers
+               (if (mm-viewer-passes-test (car viewers) info)
+                   (setq passed (cons (car viewers) passed)))
+               (setq viewers (cdr viewers)))
+             (setq passed (sort (nreverse passed) 'mm-viewer-lessp))
+             (car passed)))
+      (if (and (stringp (cdr (assoc "viewer" viewer)))
+              passed)
+         (setq viewer (car passed)))
+      (widen)
+      (cond
+       ((and (null viewer) (not (equal major "default")))
+       (mm-mime-info "default" nil request))
+       ((or (null request) (equal request ""))
+       (mm-unescape-mime-test (cdr (assoc "viewer" viewer)) info))
+       ((stringp request)
+       (if (or (string= request "test") (string= request "viewer"))
+           (mm-unescape-mime-test (cdr-safe (assoc request viewer)) info)))
+       (t
+       ;; MUST make a copy *sigh*, else we modify mm-mime-data
+       (setq viewer (mm-copy-tree viewer))
+       (let ((view (assoc "viewer" viewer))
+             (test (assoc "test" viewer)))
+         (if view (setcdr view (mm-unescape-mime-test (cdr view) info)))
+         (if test (setcdr test (mm-unescape-mime-test (cdr test) info))))
+       viewer)))))
+
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Experimental MIME-types parsing
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar mm-mime-extensions
+  '(
+    (""          . "text/plain")
+    (".abs"      . "audio/x-mpeg")
+    (".aif"      . "audio/aiff")
+    (".aifc"     . "audio/aiff")
+    (".aiff"     . "audio/aiff")
+    (".ano"      . "application/x-annotator")
+    (".au"       . "audio/ulaw")
+    (".avi"      . "video/x-msvideo")
+    (".bcpio"    . "application/x-bcpio")
+    (".bin"      . "application/octet-stream")
+    (".cdf"      . "application/x-netcdr")
+    (".cpio"     . "application/x-cpio")
+    (".csh"      . "application/x-csh")
+    (".dvi"      . "application/x-dvi")
+    (".el"       . "application/emacs-lisp")
+    (".eps"      . "application/postscript")
+    (".etx"      . "text/x-setext")
+    (".exe"      . "application/octet-stream")
+    (".fax"      . "image/x-fax")
+    (".gif"      . "image/gif")
+    (".hdf"      . "application/x-hdf")
+    (".hqx"      . "application/mac-binhex40")
+    (".htm"      . "text/html")
+    (".html"     . "text/html")
+    (".icon"     . "image/x-icon")
+    (".ief"      . "image/ief")
+    (".jpg"      . "image/jpeg")
+    (".macp"     . "image/x-macpaint")
+    (".man"      . "application/x-troff-man")
+    (".me"       . "application/x-troff-me")
+    (".mif"      . "application/mif")
+    (".mov"      . "video/quicktime")
+    (".movie"    . "video/x-sgi-movie")
+    (".mp2"      . "audio/x-mpeg")
+    (".mp2a"     . "audio/x-mpeg2")
+    (".mpa"      . "audio/x-mpeg")
+    (".mpa2"     . "audio/x-mpeg2")
+    (".mpe"      . "video/mpeg")
+    (".mpeg"     . "video/mpeg")
+    (".mpega"    . "audio/x-mpeg")
+    (".mpegv"    . "video/mpeg")
+    (".mpg"      . "video/mpeg")
+    (".mpv"      . "video/mpeg")
+    (".ms"       . "application/x-troff-ms")
+    (".nc"       . "application/x-netcdf")
+    (".nc"       . "application/x-netcdf")
+    (".oda"      . "application/oda")
+    (".pbm"      . "image/x-portable-bitmap")
+    (".pdf"      . "application/pdf")
+    (".pgm"      . "image/portable-graymap")
+    (".pict"     . "image/pict")
+    (".png"      . "image/png")
+    (".pnm"      . "image/x-portable-anymap")
+    (".ppm"      . "image/portable-pixmap")
+    (".ps"       . "application/postscript")
+    (".qt"       . "video/quicktime")
+    (".ras"      . "image/x-raster")
+    (".rgb"      . "image/x-rgb")
+    (".rtf"      . "application/rtf")
+    (".rtx"      . "text/richtext")
+    (".sh"       . "application/x-sh")
+    (".sit"      . "application/x-stuffit")
+    (".snd"      . "audio/basic")
+    (".src"      . "application/x-wais-source")
+    (".tar"      . "archive/tar")
+    (".tcl"      . "application/x-tcl")
+    (".tcl"      . "application/x-tcl")
+    (".tex"      . "application/x-tex")
+    (".texi"     . "application/texinfo")
+    (".tga"      . "image/x-targa")
+    (".tif"      . "image/tiff")
+    (".tiff"     . "image/tiff")
+    (".tr"       . "application/x-troff")
+    (".troff"    . "application/x-troff")
+    (".tsv"      . "text/tab-separated-values")
+    (".txt"      . "text/plain")
+    (".vbs"      . "video/mpeg")
+    (".vox"      . "audio/basic")
+    (".vrml"     . "x-world/x-vrml")
+    (".wav"      . "audio/x-wav")
+    (".wrl"      . "x-world/x-vrml")
+    (".xbm"      . "image/xbm")
+    (".xpm"      . "image/x-pixmap")
+    (".xwd"      . "image/windowdump")
+    (".zip"      . "application/zip")
+    (".ai"       . "application/postscript")
+    (".jpe"      . "image/jpeg")
+    (".jpeg"     . "image/jpeg")
+    )
+  "*An assoc list of file extensions and the MIME content-types they
+correspond to.")
+
+(defun mm-parse-mimetypes (&optional path)
+  ;; Parse out all the mimetypes specified in a unix-style path string PATH
+  (cond
+   (path nil)
+   ((getenv "MIMETYPES") (setq path (getenv "MIMETYPES")))
+   ((memq system-type '(ms-dos ms-windows windows-nt))
+    (setq path (mapconcat 'expand-file-name
+                         '("~/mime.typ" "~/etc/mime.typ") ";")))
+   (t (setq path (mapconcat 'expand-file-name
+                           '("~/.mime-types"
+                             "/etc/mime-types:/usr/etc/mime-types"
+                             "/usr/local/etc/mime-types"
+                             "/usr/local/www/conf/mime-types") ":"))))
+  (let ((fnames (reverse
+                (mm-string-to-tokens path
+                                     (if (memq system-type
+                                               '(ms-dos ms-windows windows-nt))
+                                         ?;
+                                       ?:))))
+       fname)
+    (while fnames
+      (setq fname (car fnames))
+      (if (and (file-exists-p fname) (file-readable-p fname))
+         (mm-parse-mimetype-file (car fnames)))
+      (setq fnames (cdr fnames)))))
+
+(defun mm-parse-mimetype-file (fname)
+  ;; Parse out a mime-types file
+  (let (type                           ; The MIME type for this line
+       extns                           ; The extensions for this line
+       save-pos                        ; Misc. saved buffer positions
+       )
+    (save-excursion
+      (set-buffer (get-buffer-create " *mime-types*"))
+      (erase-buffer)
+      (insert-file-contents fname)
+      (mm-replace-regexp "#.*" "")
+      (mm-replace-regexp "\n+" "\n")
+      (mm-replace-regexp "[ \t]+$" "")
+      (goto-char (point-max))
+      (skip-chars-backward " \t\n")
+      (delete-region (point) (point-max))
+      (goto-char (point-min))
+      (while (not (eobp))
+       (skip-chars-forward " \t\n")
+       (setq save-pos (point))
+       (skip-chars-forward "^ \t")
+       (downcase-region save-pos (point))
+       (setq type (buffer-substring save-pos (point)))
+       (while (not (eolp))
+         (skip-chars-forward " \t")
+         (setq save-pos (point))
+         (skip-chars-forward "^ \t\n")
+         (setq extns (cons (buffer-substring save-pos (point)) extns)))
+       (while extns
+         (setq mm-mime-extensions
+               (cons
+                (cons (if (= (string-to-char (car extns)) ?.)
+                          (car extns)
+                        (concat "." (car extns))) type) mm-mime-extensions)
+               extns (cdr extns)))))))
+
+(defun mm-extension-to-mime (extn)
+  "Return the MIME content type of the file extensions EXTN"
+  (if (and (stringp extn)
+          (not (eq (string-to-char extn) ?.)))
+      (setq extn (concat "." extn)))
+  (cdr (assoc (downcase extn) mm-mime-extensions)))
+
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Editing/Composition of body parts
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-compose-type (type)
+  ;; Compose a body section of MIME-type TYPE.
+  (let* ((info (mm-mime-info type nil 5))
+        (fnam (mm-generate-unique-filename))
+        (comp (or (cdr (assoc "compose" info))))
+        (ctyp (cdr (assoc "composetyped" info)))
+        (buff (get-buffer-create " *mimecompose*"))
+        (typeit (not ctyp))
+        (retval "")
+        (usef nil))
+    (setq comp (mm-unescape-mime-test (or comp ctyp) info))
+    (while (string-match "\\([^\\\\]\\)%s" comp)
+      (setq comp (concat (substring comp 0 (match-end 1)) fnam
+                        (substring comp (match-end 0) nil))
+           usef t))
+    (call-process shell-file-name nil
+                 (if usef nil buff)
+                 nil shell-command-switch comp)
+    (setq retval
+         (concat
+          (if typeit (concat "Content-type: " type "\r\n\r\n") "")
+          (if usef
+              (save-excursion
+                (set-buffer buff)
+                (erase-buffer)
+                (insert-file-contents fnam)
+                (buffer-string))
+            (save-excursion
+              (set-buffer buff)
+              (buffer-string)))
+          "\r\n"))
+    retval))   
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Misc.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-type-to-file (type)
+  "Return the file extension for content-type TYPE"
+  (rassoc type mm-mime-extensions))
+
+\f
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Miscellaneous MIME viewers written in elisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-play-sound-file (&optional buff)
+  "Play a sound file in buffer BUFF (defaults to current buffer)"
+  (setq buff (or buff (current-buffer)))
+  (let ((fname (mm-generate-unique-filename "%s.au"))
+       (synchronous-sounds t))         ; Play synchronously
+    (mule-write-region-no-coding-system (point-min) (point-max) fname)
+    (kill-buffer (current-buffer))
+    (play-sound-file fname)
+    (condition-case ()
+       (delete-file fname)
+      (error nil))))
+    
+(defun mm-parse-mime-headers (&optional no-delete)
+  "Return a list of the MIME headers at the top of this buffer.  If
+optional argument NO-DELETE is non-nil, don't delete the headers."
+  (let* ((st (point-min))
+        (nd (progn
+              (goto-char (point-min))
+              (skip-chars-forward " \t\n")
+              (if (re-search-forward "^\r*$" nil t)
+                  (1+ (point))
+                (point-max))))
+        save-pos
+        status
+        hname
+        hvalu
+        result
+        search
+        )
+    (narrow-to-region st (min nd (point-max)))
+    (goto-char (point-min))
+    (while (not (eobp))
+      (skip-chars-forward " \t\n\r")
+      (setq save-pos (point))
+      (skip-chars-forward "^:\n\r")
+      (downcase-region save-pos (point))
+      (setq hname (buffer-substring save-pos (point)))
+      (skip-chars-forward ": \t ")
+      (setq save-pos (point))
+      (skip-chars-forward "^\n\r")
+      (setq search t)
+      (while search
+       (skip-chars-forward "^\n\r")
+       (save-excursion
+         (skip-chars-forward "\n\r")
+         
+         (setq search
+               (string-match "[ \t]"
+                             (char-to-string
+                              (or (char-after (point)) ?a)))))
+       (if search
+           (skip-chars-forward "\n\r")))
+      (setq hvalu (buffer-substring save-pos (point))
+           result (cons (cons hname hvalu) result)))
+    (or no-delete (delete-region st nd))
+    result))
+
+(defun mm-find-available-multiparts (separator &optional buf)
+  "Return a list of mime-headers for the various body parts of a 
+multipart message in buffer BUF with separator SEPARATOR.
+The different multipart specs are put in `mm-temporary-directory'."
+  (let ((sep (concat "^--" separator "\r*$"))
+       headers
+       fname
+       results)
+    (save-excursion
+      (and buf (set-buffer buf))
+      (goto-char (point-min))
+      (while (re-search-forward sep nil t)
+       (let ((st (set-marker (make-marker)
+                             (progn
+                               (forward-line 1)
+                               (beginning-of-line)
+                               (point))))
+             (nd (set-marker (make-marker)
+                             (if (re-search-forward sep nil t)
+                                 (1- (match-beginning 0))
+                               (point-max)))))
+         (narrow-to-region st nd)
+         (goto-char st)
+         (if (looking-at "^\r*$")
+             (insert "Content-type: text/plain\n"
+                     "Content-length: " (int-to-string (- nd st)) "\n"))
+         (setq headers (mm-parse-mime-headers)
+               fname (mm-generate-unique-filename))
+         (let ((x (or (cdr (assoc "content-type" headers)) "text/plain")))
+           (if (string-match "name=\"*\\([^ \"]+\\)\"*" x)
+               (setq fname (expand-file-name
+                            (substring x (match-beginning 1)
+                                       (match-end 1))
+                            mm-temporary-directory))))
+         (widen)
+         (if (assoc "content-transfer-encoding" headers)
+             (let ((coding (cdr
+                            (assoc "content-transfer-encoding" headers)))
+                   (cmd nil))
+               (setq coding (and coding (downcase coding))
+                     cmd (or (cdr (assoc coding
+                                         mm-content-transfer-encodings))
+                             (read-string
+                              (concat "How shall I decode " coding "? ")
+                              "cat")))
+               (if (string= cmd "") (setq cmd "cat"))
+               (if (stringp cmd)
+                   (shell-command-on-region st nd cmd t)
+                 (funcall cmd st nd))
+               (or (eq cmd 'ignore) (set-marker nd (point)))))
+         (write-region st nd fname nil 5)
+         (delete-region st nd)
+         (setq results (cons
+                        (cons
+                         (cons "mm-filename" fname) headers) results)))))
+    results))
+
+(defun mm-format-multipart-as-html (&optional buf type)
+  (if buf (set-buffer buf))
+  (let* ((boundary (if (string-match
+                       "boundary[ \t]*=[ \t\"]*\\([^ \"\t\n]+\\)"
+                       type)
+                      (regexp-quote
+                       (substring type (match-beginning 1) (match-end 1)))))
+        (parts    (mm-find-available-multiparts boundary)))
+    (erase-buffer)
+    (insert "<html>\n"
+           " <head>\n"
+           "  <title>Multipart Message</title>\n"
+           " </head>\n"
+           " <body>\n"
+           "   <h1> Multipart message encountered </h1>\n"
+           "   <p> I have encountered a multipart MIME message.\n"
+           "       The following parts have been detected.  Please\n"
+           "       select which one you want to view.\n"
+           "   </p>\n"
+           "   <ul>\n"
+           (mapconcat 
+            (function (lambda (x)
+                        (concat "    <li> <a href=\"file:"
+                                (cdr (assoc "mm-filename" x))
+                                "\">"
+                                (or (cdr (assoc "content-description" x)) "")
+                                "--"
+                                (or (cdr (assoc "content-type" x))
+                                    "unknown type")
+                                "</a> </li>")))
+            parts "\n")
+           "   </ul>\n"
+           " </body>\n"
+           "</html>\n"
+           "<!-- Automatically generated by MM v" mm-version "-->\n")))
+
+(defun mm-multipart-viewer ()
+  (mm-format-multipart-as-html
+   (current-buffer)
+   (cdr (assoc "content-type" url-current-mime-headers)))
+  (let ((w3-working-buffer (current-buffer)))
+    (w3-prepare-buffer)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Transfer encodings we can decrypt automatically
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-decode-quoted-printable (&optional st nd)
+  (interactive)
+  (setq st (or st (point-min))
+       nd (or nd (point-max)))
+  (save-restriction
+    (narrow-to-region st nd)
+    (save-excursion
+      (let ((buffer-read-only nil))
+       (goto-char (point-min))
+       (while (re-search-forward "=[0-9A-F][0-9A-F]" nil t)
+         (replace-match 
+          (char-to-string 
+           (+
+            (* 16 (mm-hex-char-to-integer 
+                   (char-after (1+ (match-beginning 0)))))
+            (mm-hex-char-to-integer
+             (char-after (1- (match-end 0))))))))))
+    (goto-char (point-max))))
+
+;; Taken from hexl.el.
+(defun mm-hex-char-to-integer (character)
+  "Take a char and return its value as if it was a hex digit."
+  (if (and (>= character ?0) (<= character ?9))
+      (- character ?0)
+    (let ((ch (logior character 32)))
+      (if (and (>= ch ?a) (<= ch ?f))
+         (- ch (- ?a 10))
+       (error (format "Invalid hex digit `%c'." ch))))))
+
+
+\f
+(require 'base64)
+(provide 'mm)
index 321508c..5a673cd 100644 (file)
@@ -46,7 +46,9 @@
   "Where nnweb will save its files.")
 
 (defvoo nnweb-type 'dejanews
-  "What search engine type is being used.")
+  "What search engine type is being used.
+Valid types include `dejanews', `dejanewsold', `reference',
+and `altavista'.")
 
 (defvoo nnweb-type-definition
   '((dejanews
index aa1a97f..1dbad4c 100644 (file)
@@ -3,7 +3,7 @@
 ;;                                                           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
   :group 'mail
   :group 'news)
 
-(defconst pop3-fma-version-number "0.21")
+(defconst pop3-fma-version-number "1.00")
 (defconst pop3-fma-codename
 ;;  "Feel the wind"            ; 0.10
 ;;  "My home town"             ; 0.11
 ;;  "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
diff --git a/lisp/qp.el b/lisp/qp.el
new file mode 100644 (file)
index 0000000..1ef4a77
--- /dev/null
@@ -0,0 +1,90 @@
+;;; qp.el --- Quoted-printable functions
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(defvar quoted-printable-encoding-characters
+  (mapcar 'identity "0123456789ABCDEF"))
+
+(defun quoted-printable-decode-region (from to)
+  "Decode quoted-printable in the region between FROM and TO."
+  (interactive "r")
+  (save-excursion
+    (goto-char from)
+    (while (search-forward "=" to t)
+      (cond ((eq (following-char) ?\n)
+            (delete-char -1)
+            (delete-char 1))
+           ((and
+             (memq (following-char) quoted-printable-encoding-characters)
+             (memq (char-after (1+ (point)))
+                   quoted-printable-encoding-characters))
+            (subst-char-in-region
+             (1- (point)) (point) ?=
+             (string-to-number
+              (buffer-substring (point) (+ 2 (point)))
+              16))
+            (delete-char 2))
+           ((looking-at "=")
+            (delete-char 1))
+           ((message "Malformed MIME quoted-printable message"))))))
+
+(defun quoted-printable-decode-string (string)
+ "Decode the quoted-printable-encoded STRING and return the results."
+ (with-temp-buffer
+   (insert string)
+   (quoted-printable-decode-region (point-min) (point-max))
+   (buffer-string)))
+
+(defun quoted-printable-encode-region (from to)
+  "QP-encode the region between FROM and TO."
+  (interactive "r")
+  (save-excursion
+    (save-restriction
+      (narrow-to-region from to)
+      (goto-char (point-min))
+      (while (re-search-forward "[\000-\007\013\015-\037\200-\237=]" nil t)
+       (insert
+        (prog1
+            (format "=%x" (char-after (1- (point))))
+          (delete-char -1))))
+      ;; Fold long lines.
+      (goto-char (point-min))
+      (end-of-line)
+      (while (> (current-column) 72)
+       (beginning-of-line)
+       (forward-char 72)
+       (search-backward "=" (- (point) 2) t)
+       (insert "=\n")
+       (end-of-line)))))
+
+(defun quoted-printable-encode-string (string)
+ "QP-encode STRING and return the results."
+ (with-temp-buffer
+   (insert string)
+   (quoted-printable-encode-region (point-min) (point-max))
+   (buffer-string)))
+
+(provide 'qp)
+
+;; qp.el ends here
diff --git a/lisp/rfc1522.el b/lisp/rfc1522.el
new file mode 100644 (file)
index 0000000..98c8ea8
--- /dev/null
@@ -0,0 +1,276 @@
+;;; rfc1522.el --- Functions for encoding and decoding rfc1522 messages
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;;     MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'base64)
+(require 'qp)
+(require 'mm-util)
+
+(defvar rfc1522-header-encoding-alist
+  '(("Newsgroups" . nil)
+    ("Message-ID" . nil)
+    (t . mime))
+  "*Header/encoding method alist.
+The list is traversed sequentially.  The keys can either be
+header regexps or `t'.
+
+The values can be:
+
+1) nil, in which case no encoding is done;
+2) `mime', in which case the header will be encoded according to RFC1522;
+3) a charset, in which case it will be encoded as that charse;
+4) `default', in which case the field will be encoded as the rest
+   of the article.")
+
+(defvar rfc1522-charset-encoding-alist
+  '((us-ascii . nil)
+    (iso-8859-1 . Q)
+    (iso-8859-2 . Q)
+    (iso-8859-3 . Q)
+    (iso-8859-4 . Q)
+    (iso-8859-5 . Q)
+    (koi8-r . Q)
+    (iso-8859-7 . Q)
+    (iso-8859-8 . Q)
+    (iso-8859-9 . Q)
+    (iso-2022-jp . B)
+    (iso-2022-kr . B)
+    (gb2312 . B)
+    (cn-gb . B)
+    (cn-gb-2312 . B)
+    (euc-kr . B)
+    (iso-2022-jp-2 . B)
+    (iso-2022-int-1 . B))
+  "Alist of MIME charsets to RFC1522 encodings.
+Valid encodings are nil, `Q' and `B'.")
+
+(defvar rfc1522-encoding-function-alist
+  '((Q . rfc1522-q-encode-region)
+    (B . base64-encode-region)
+    (nil . ignore))
+  "Alist of RFC1522 encodings to encoding functions.")
+
+(defvar rfc1522-q-encoding-alist
+  '(("\\(From\\|Cc\\|To\\|Bcc\||Reply-To\\):" . "[^-A-Za-z0-9!*+/=_]")
+    ("." . "[\000-\007\013\015-\037\200-\377=_?]"))
+  "Alist of header regexps and valid Q characters.")
+
+;;;
+;;; Functions for encoding RFC1522 messages
+;;;
+
+(defun rfc1522-narrow-to-field ()
+  "Narrow the buffer to the header on the current line."
+  (beginning-of-line)
+  (narrow-to-region
+   (point)
+   (progn
+     (forward-line 1)
+     (if (re-search-forward "^[^ \n\t]" nil t)
+        (progn
+          (beginning-of-line)
+          (point))
+       (point-max))))
+  (goto-char (point-min)))
+
+;;;###autoload
+(defun rfc1522-encode-message-header ()
+  "Encode the message header according to `rfc1522-header-encoding-alist'.
+Should be called narrowed to the head of the message."
+  (interactive "*")
+  (when (featurep 'mule)
+    (save-excursion
+      (let ((alist rfc1522-header-encoding-alist)
+           elem method)
+       (while (not (eobp))
+         (save-restriction
+           (rfc1522-narrow-to-field)
+           (when (find-non-ascii-charset-region (point-min) (point-max))
+             ;; We found something that may perhaps be encoded.
+             (while (setq elem (pop alist))
+               (when (or (and (stringp (car elem))
+                              (looking-at (car elem)))
+                         (eq (car elem) t))
+                 (setq alist nil
+                       method (cdr elem))))
+             (when method
+               (cond
+                ((eq method 'mime)
+                 (rfc1522-encode-region (point-min) (point-max)))
+                ;; Hm.
+                (t))))
+           (goto-char (point-max))))))))
+
+(defun rfc1522-encode-region (b e)
+  "Encode all encodable words in REGION."
+  (let (prev c start qstart qprev qend)
+    (save-excursion
+      (goto-char b)
+      (while (re-search-forward "[^ \t\n]+" nil t)
+       (save-restriction
+         (narrow-to-region (match-beginning 0) (match-end 0))
+         (goto-char (setq start (point-min)))
+         (setq prev nil)
+         (while (not (eobp))
+           (unless (eq (setq c (char-charset (following-char))) 'ascii)
+             (cond
+              ((eq c prev)
+               )
+              ((null prev)
+               (setq qstart (or qstart start)
+                     qend (point-max)
+                     qprev c)
+               (setq prev c))
+              (t
+               ;(rfc1522-encode start (setq start (point)) prev)
+               (setq prev c))))
+           (forward-char 1)))
+       (when (and (not prev) qstart)
+         (rfc1522-encode qstart qend qprev)
+         (setq qstart nil)))
+      (when qstart
+       (rfc1522-encode qstart qend qprev)
+       (setq qstart nil)))))
+
+(defun rfc1522-encode-string (string)
+  "Encode words in STRING."
+  (with-temp-buffer
+    (insert string)
+    (rfc1522-encode-region (point-min) (point-max))
+    (buffer-string)))
+
+(defun rfc1522-encode (b e charset)
+  "Encode the word in the region with CHARSET."
+  (let* ((mime-charset (mm-mule-charset-to-mime-charset charset))
+        (encoding (cdr (assq mime-charset
+                             rfc1522-charset-encoding-alist)))
+        (start (concat
+                "=?" (downcase (symbol-name mime-charset)) "?"
+                (downcase (symbol-name encoding)) "?")))
+    (save-restriction
+      (narrow-to-region b e)
+      (insert
+       (prog1
+          (mm-encode-coding-string (buffer-string) mime-charset)
+        (delete-region (point-min) (point-max))))
+      (funcall (cdr (assq encoding rfc1522-encoding-function-alist))
+              (point-min) (point-max))
+      (goto-char (point-min))
+      (insert start)
+      (goto-char (point-max))
+      (insert "?=")
+      ;; Encoded words can't be more than 75 chars long, so we have to
+      ;; split the long ones up.
+      (end-of-line)
+      (while (> (current-column) 74)
+       (beginning-of-line)
+       (forward-char 73)
+       (insert "?=\n " start)
+       (end-of-line)))))
+
+(defun rfc1522-q-encode-region (b e)
+  "Encode the header contained in REGION with the Q encoding."
+  (save-excursion
+    (save-restriction
+      (narrow-to-region (goto-char b) e)
+      (let ((alist rfc1522-q-encoding-alist))
+       (while alist
+         (when (looking-at (caar alist))
+           (quoted-printable-encode-region b e nil (cdar alist))
+           (subst-char-in-region (point-min) (point-max) ?  ?_))
+         (pop alist))))))
+
+;;;
+;;; Functions for decoding RFC1522 messages
+;;;
+
+(defvar rfc1522-encoded-word-regexp
+  "=\\?\\([^][\000-\040()<>@,\;:\\\"/?.=]+\\)\\?\\(B\\|Q\\)\\?\\([!->@-~]+\\)\\?=")
+
+;;;###autoload
+(defun rfc1522-decode-region (start end)
+  "Decode MIME-encoded words in region between START and END."
+  (interactive "r")
+  (save-excursion
+    (save-restriction
+      (narrow-to-region start end)
+      (goto-char (point-min))
+      ;; Remove whitespace between encoded words.
+      (while (re-search-forward
+             (concat "\\(" rfc1522-encoded-word-regexp "\\)"
+                     "\\(\n?[ \t]\\)+"
+                     "\\(" rfc1522-encoded-word-regexp "\\)")
+             nil t)
+       (delete-region (goto-char (match-end 1)) (match-beginning 6)))
+      ;; Decode the encoded words.
+      (goto-char (point-min))
+      (while (re-search-forward rfc1522-encoded-word-regexp nil t)
+       (insert (rfc1522-parse-and-decode
+                (prog1
+                    (match-string 0)
+                  (delete-region (match-beginning 0) (match-end 0)))))))))
+
+;;;###autoload
+(defun rfc1522-decode-string (string)
+ "Decode the quoted-printable-encoded STRING and return the results."
+ (with-temp-buffer
+   (insert string)
+   (inline
+     (rfc1522-decode-region (point-min) (point-max)))
+   (buffer-string)))
+
+(defun rfc1522-parse-and-decode (word)
+  "Decode WORD and return it if it is an encoded word.
+Return WORD if not."
+  (if (not (string-match rfc1522-encoded-word-regexp word))
+      word
+    (or
+     (condition-case nil
+        (rfc1522-decode
+         (match-string 1 word)
+         (upcase (match-string 2 word))
+         (match-string 3 word))
+       (error word))
+     word)))
+
+(defun rfc1522-decode (charset encoding string)
+  "Decode STRING as an encoded text.
+Valid ENCODINGs are \"B\" and \"Q\".
+If your Emacs implementation can't decode CHARSET, it returns nil."
+  (let ((cs (mm-charset-to-coding-system charset)))
+    (when cs
+      (mm-decode-coding-string
+       (cond
+       ((equal "B" encoding)
+        (base64-decode string))
+       ((equal "Q" encoding)
+        (quoted-printable-decode-string
+         (mm-replace-chars-in-string string ?_ ? )))
+       (t (error "Invalid encoding: %s" encoding)))
+       cs))))
+
+(provide 'rfc1522)
+
+;;; rfc1522.el ends here
diff --git a/lisp/rfc2047.el b/lisp/rfc2047.el
new file mode 100644 (file)
index 0000000..81241c2
--- /dev/null
@@ -0,0 +1,289 @@
+;;; rfc2047.el --- Functions for encoding and decoding rfc2047 messages
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;;     MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'base64)
+(require 'qp)
+(require 'mm-util)
+
+(defvar rfc2047-unencoded-charsets '(ascii latin-iso8859-1)
+  "List of MULE charsets not to encode.")
+
+(defvar rfc2047-header-encoding-alist
+  '(("Newsgroups" . nil)
+    ("Message-ID" . nil)
+    (t . mime))
+  "*Header/encoding method alist.
+The list is traversed sequentially.  The keys can either be
+header regexps or `t'.
+
+The values can be:
+
+1) nil, in which case no encoding is done;
+2) `mime', in which case the header will be encoded according to RFC2047;
+3) a charset, in which case it will be encoded as that charse;
+4) `default', in which case the field will be encoded as the rest
+   of the article.")
+
+(defvar rfc2047-charset-encoding-alist
+  '((us-ascii . nil)
+    (iso-8859-1 . Q)
+    (iso-8859-2 . Q)
+    (iso-8859-3 . Q)
+    (iso-8859-4 . Q)
+    (iso-8859-5 . Q)
+    (koi8-r . Q)
+    (iso-8859-7 . Q)
+    (iso-8859-8 . Q)
+    (iso-8859-9 . Q)
+    (iso-2022-jp . B)
+    (iso-2022-kr . B)
+    (gb2312 . B)
+    (cn-gb . B)
+    (cn-gb-2312 . B)
+    (euc-kr . B)
+    (iso-2022-jp-2 . B)
+    (iso-2022-int-1 . B))
+  "Alist of MIME charsets to RFC2047 encodings.
+Valid encodings are nil, `Q' and `B'.")
+
+(defvar rfc2047-encoding-function-alist
+  '((Q . rfc2047-q-encode-region)
+    (B . base64-encode-region)
+    (nil . ignore))
+  "Alist of RFC2047 encodings to encoding functions.")
+
+(defvar rfc2047-q-encoding-alist
+  '(("\\(From\\|Cc\\|To\\|Bcc\||Reply-To\\):" . "[^-A-Za-z0-9!*+/=_]")
+    ("." . "[\000-\007\013\015-\037\200-\377=_?]"))
+  "Alist of header regexps and valid Q characters.")
+
+;;;
+;;; Functions for encoding RFC2047 messages
+;;;
+
+(defun rfc2047-narrow-to-field ()
+  "Narrow the buffer to the header on the current line."
+  (beginning-of-line)
+  (narrow-to-region
+   (point)
+   (progn
+     (forward-line 1)
+     (if (re-search-forward "^[^ \n\t]" nil t)
+        (progn
+          (beginning-of-line)
+          (point))
+       (point-max))))
+  (goto-char (point-min)))
+
+;;;###autoload
+(defun rfc2047-encode-message-header ()
+  "Encode the message header according to `rfc2047-header-encoding-alist'.
+Should be called narrowed to the head of the message."
+  (interactive "*")
+  (when (featurep 'mule)
+    (save-excursion
+      (let ((alist rfc2047-header-encoding-alist)
+           elem method)
+       (while (not (eobp))
+         (save-restriction
+           (rfc2047-narrow-to-field)
+           (when (rfc2047-encodable-p)
+             ;; We found something that may perhaps be encoded.
+             (while (setq elem (pop alist))
+               (when (or (and (stringp (car elem))
+                              (looking-at (car elem)))
+                         (eq (car elem) t))
+                 (setq alist nil
+                       method (cdr elem))))
+             (when method
+               (cond
+                ((eq method 'mime)
+                 (rfc2047-encode-region (point-min) (point-max)))
+                ;; Hm.
+                (t))))
+           (goto-char (point-max))))))))
+
+(defun rfc2047-encodable-p ()
+  "Say whether the current (narrowed) buffer contains characters that need encoding."
+  (let ((charsets (find-charset-region (point-min) (point-max)))
+       (cs rfc2047-unencoded-charsets)
+       found)
+    (while charsets
+      (unless (memq (pop charsets) cs)
+       (setq found t)))
+    found))
+
+(defun rfc2047-encode-region (b e)
+  "Encode all encodable words in REGION."
+  (let (prev c start qstart qprev qend)
+    (save-excursion
+      (goto-char b)
+      (while (re-search-forward "[^ \t\n]+" nil t)
+       (save-restriction
+         (narrow-to-region (match-beginning 0) (match-end 0))
+         (goto-char (setq start (point-min)))
+         (setq prev nil)
+         (while (not (eobp))
+           (unless (eq (setq c (char-charset (following-char))) 'ascii)
+             (cond
+              ((eq c prev)
+               )
+              ((null prev)
+               (setq qstart (or qstart start)
+                     qend (point-max)
+                     qprev c)
+               (setq prev c))
+              (t
+               ;(rfc2047-encode start (setq start (point)) prev)
+               (setq prev c))))
+           (forward-char 1)))
+       (when (and (not prev) qstart)
+         (rfc2047-encode qstart qend qprev)
+         (setq qstart nil)))
+      (when qstart
+       (rfc2047-encode qstart qend qprev)
+       (setq qstart nil)))))
+
+(defun rfc2047-encode-string (string)
+  "Encode words in STRING."
+  (with-temp-buffer
+    (insert string)
+    (rfc2047-encode-region (point-min) (point-max))
+    (buffer-string)))
+
+(defun rfc2047-encode (b e charset)
+  "Encode the word in the region with CHARSET."
+  (let* ((mime-charset (mm-mule-charset-to-mime-charset charset))
+        (encoding (cdr (assq mime-charset
+                             rfc2047-charset-encoding-alist)))
+        (start (concat
+                "=?" (downcase (symbol-name mime-charset)) "?"
+                (downcase (symbol-name encoding)) "?")))
+    (save-restriction
+      (narrow-to-region b e)
+      (insert
+       (prog1
+          (mm-encode-coding-string (buffer-string) mime-charset)
+        (delete-region (point-min) (point-max))))
+      (funcall (cdr (assq encoding rfc2047-encoding-function-alist))
+              (point-min) (point-max))
+      (goto-char (point-min))
+      (insert start)
+      (goto-char (point-max))
+      (insert "?=")
+      ;; Encoded words can't be more than 75 chars long, so we have to
+      ;; split the long ones up.
+      (end-of-line)
+      (while (> (current-column) 74)
+       (beginning-of-line)
+       (forward-char 73)
+       (insert "?=\n " start)
+       (end-of-line)))))
+
+(defun rfc2047-q-encode-region (b e)
+  "Encode the header contained in REGION with the Q encoding."
+  (save-excursion
+    (save-restriction
+      (narrow-to-region (goto-char b) e)
+      (let ((alist rfc2047-q-encoding-alist))
+       (while alist
+         (when (looking-at (caar alist))
+           (quoted-printable-encode-region b e nil (cdar alist))
+           (subst-char-in-region (point-min) (point-max) ?  ?_))
+         (pop alist))))))
+
+;;;
+;;; Functions for decoding RFC2047 messages
+;;;
+
+(defvar rfc2047-encoded-word-regexp
+  "=\\?\\([^][\000-\040()<>@,\;:\\\"/?.=]+\\)\\?\\(B\\|Q\\)\\?\\([!->@-~]+\\)\\?=")
+
+;;;###autoload
+(defun rfc2047-decode-region (start end)
+  "Decode MIME-encoded words in region between START and END."
+  (interactive "r")
+  (save-excursion
+    (save-restriction
+      (narrow-to-region start end)
+      (goto-char (point-min))
+      ;; Remove whitespace between encoded words.
+      (while (re-search-forward
+             (concat "\\(" rfc2047-encoded-word-regexp "\\)"
+                     "\\(\n?[ \t]\\)+"
+                     "\\(" rfc2047-encoded-word-regexp "\\)")
+             nil t)
+       (delete-region (goto-char (match-end 1)) (match-beginning 6)))
+      ;; Decode the encoded words.
+      (goto-char (point-min))
+      (while (re-search-forward rfc2047-encoded-word-regexp nil t)
+       (insert (rfc2047-parse-and-decode
+                (prog1
+                    (match-string 0)
+                  (delete-region (match-beginning 0) (match-end 0)))))))))
+
+;;;###autoload
+(defun rfc2047-decode-string (string)
+ "Decode the quoted-printable-encoded STRING and return the results."
+ (with-temp-buffer
+   (insert string)
+   (inline
+     (rfc2047-decode-region (point-min) (point-max)))
+   (buffer-string)))
+
+(defun rfc2047-parse-and-decode (word)
+  "Decode WORD and return it if it is an encoded word.
+Return WORD if not."
+  (if (not (string-match rfc2047-encoded-word-regexp word))
+      word
+    (or
+     (condition-case nil
+        (rfc2047-decode
+         (match-string 1 word)
+         (upcase (match-string 2 word))
+         (match-string 3 word))
+       (error word))
+     word)))
+
+(defun rfc2047-decode (charset encoding string)
+  "Decode STRING as an encoded text.
+Valid ENCODINGs are \"B\" and \"Q\".
+If your Emacs implementation can't decode CHARSET, it returns nil."
+  (let ((cs (mm-charset-to-coding-system charset)))
+    (when cs
+      (mm-decode-coding-string
+       (cond
+       ((equal "B" encoding)
+        (base64-decode string))
+       ((equal "Q" encoding)
+        (quoted-printable-decode-string
+         (mm-replace-chars-in-string string ?_ ? )))
+       (t (error "Invalid encoding: %s" encoding)))
+       cs))))
+
+(provide 'rfc2047)
+
+;;; rfc2047.el ends here
diff --git a/lisp/rfc2231.el b/lisp/rfc2231.el
new file mode 100644 (file)
index 0000000..2998472
--- /dev/null
@@ -0,0 +1,142 @@
+;;; rfc2231.el --- Functions for decoding rfc2231 headers
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'drums)
+
+(defun rfc2231-get-value (ct attribute)
+  "Return the value of ATTRIBUTE from CT."
+  (cdr (assq attribute (cdr ct))))
+
+(defun rfc2231-parse-string (string)
+  "Parse STRING and return a list.
+The list will be on the form
+ `(name (attribute . value) (attribute . value)...)"
+  (with-temp-buffer
+    (let ((ttoken (drums-token-to-list drums-text-token))
+         (stoken (drums-token-to-list drums-tspecials))
+         (ntoken (drums-token-to-list "0-9"))
+         (prev-value "")
+         display-name mailbox c display-string parameters
+         attribute value type subtype number encoded
+         prev-attribute)
+      (drums-init (mail-header-remove-whitespace
+                  (mail-header-remove-comments string)))
+      (let ((table (copy-syntax-table drums-syntax-table)))
+       (modify-syntax-entry ?\' "w" table)
+       (set-syntax-table table))
+      (setq c (following-char))
+      (when (and (memq c ttoken)
+                (not (memq c stoken)))
+       (setq type (downcase (buffer-substring
+                             (point) (progn (forward-sexp 1) (point)))))
+       ;; Do the params
+       (while (not (eobp))
+         (setq c (following-char))
+         (unless (eq c ?\;)
+           (error "Invalid header: %s" string))
+         (forward-char 1)
+         (setq c (following-char))
+         (if (and (memq c ttoken)
+                  (not (memq c stoken)))
+             (setq attribute
+                   (intern
+                    (downcase
+                     (buffer-substring
+                      (point) (progn (forward-sexp 1) (point))))))
+           (error "Invalid header: %s" string))
+         (setq c (following-char))
+         (setq encoded nil)
+         (when (eq c ?*)
+           (forward-char 1)
+           (setq c (following-char))
+           (when (memq c ntoken)
+             (setq number
+                   (string-to-number
+                    (buffer-substring
+                     (point) (progn (forward-sexp 1) (point)))))
+             (setq c (following-char))
+             (when (eq c ?*)
+               (setq encoded t)
+               (forward-char 1)
+               (setq c (following-char)))))
+         ;; See if we have any previous continuations.
+         (when (and prev-attribute
+                    (not (eq prev-attribute attribute)))
+           (push (cons prev-attribute prev-value) parameters)
+           (setq prev-attribute nil
+                 prev-value ""))
+         (unless (eq c ?=)
+           (error "Invalid header: %s" string))
+         (forward-char 1)
+         (setq c (following-char))
+         (cond
+          ((eq c ?\")
+           (setq value
+                 (buffer-substring (1+ (point))
+                                   (progn (forward-sexp 1) (1- (point))))))
+          ((and (memq c ttoken)
+                (not (memq c stoken)))
+           (setq value (buffer-substring
+                        (point) (progn (forward-sexp 1) (point)))))
+          (t
+           (error "Invalid header: %s" string)))
+         (when encoded
+           (setq value (rfc2231-decode-encoded-string value)))
+         (if number
+             (setq prev-attribute attribute
+                   prev-value (concat prev-value value))
+           (push (cons attribute value) parameters)))
+
+       ;; Take care of any final continuations.
+       (when prev-attribute
+         (push (cons prev-attribute prev-value) parameters))
+
+       `(,type ,@(nreverse parameters))))))
+
+(defun rfc2231-decode-encoded-string (string)
+  "Decode an RFC2231-encoded string.
+These look like \"us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A\"."
+  (with-temp-buffer
+    (let ((elems (split-string string "'")))
+      ;; The encoded string may contain zero to two single-quote
+      ;; marks.  This should give us the encoded word stripped
+      ;; of any preceding values.
+      (insert (car (last elems)))
+      (goto-char (point-min))
+      (while (search-forward "%" nil t)
+       (insert
+        (prog1
+            (string-to-number (buffer-substring (point) (+ (point) 2)) 16)
+          (delete-region (1- (point)) (+ (point) 2)))))
+      ;; Encode using the charset, if any.
+      (when (and (< (length elems) 1)
+                (not (equal (intern (car elems)) 'us-ascii)))
+       (mm-decode-coding-region (point-min) (point-max)
+                                (intern (car elems))))
+      (buffer-string))))
+
+(provide 'rfc2231)
+
+;;; rfc2231.el ends here
diff --git a/lisp/time-date.el b/lisp/time-date.el
new file mode 100644 (file)
index 0000000..cd6f9e9
--- /dev/null
@@ -0,0 +1,138 @@
+;;; time-date.el --- Date and time handling functions
+;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;;     Masanobu Umeda <umerin@mse.kyutech.ac.jp>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-and-compile
+  (eval
+   '(if (not (string-match "XEmacs" emacs-version))
+       (require 'parse-time)
+
+      (require 'timezone)
+      (defun parse-time-string (date)
+       "Convert DATE into time."
+       (decode-time
+        (condition-case ()
+            (let* ((d1 (timezone-parse-date date))
+                   (t1 (timezone-parse-time (aref d1 3))))
+              (apply 'encode-time
+                     (mapcar (lambda (el)
+                               (and el (string-to-number el)))
+                             (list
+                              (aref t1 2) (aref t1 1) (aref t1 0)
+                              (aref d1 2) (aref d1 1) (aref d1 0)
+                              (number-to-string
+                               (* 60 (timezone-zone-to-minute (aref d1 4))))))))
+          ;; If we get an error, then we just return a 0 time.
+          (error (list 0 0))))))))
+
+(defun date-to-time (date)
+  "Convert DATE into time."
+  (apply 'encode-time (parse-time-string date)))
+
+(defun time-to-float (time)
+  "Convert TIME to a floating point number."
+  (+ (* (car time) 65536.0)
+     (cadr time)))
+
+(defun float-to-time (float)
+  "Convert FLOAT (a floating point number) to an Emacs time structure."
+  (list (floor float 65536)
+       (floor (mod float 65536))))
+
+(defun time-less-p (t1 t2)
+  "Say whether time T1 is less than time T2."
+  (or (< (car t1) (car t2))
+      (and (= (car t1) (car t2))
+          (< (nth 1 t1) (nth 1 t2)))))
+
+(defun days-to-time (days)
+  "Convert DAYS into time."
+  (let* ((seconds (* 1.0 days 60 60 24))
+        (rest (expt 2 16))
+        (ms (condition-case nil (floor (/ seconds rest))
+              (range-error (expt 2 16)))))
+    (list ms (condition-case nil (round (- seconds (* ms rest)))
+              (range-error (expt 2 16))))))
+
+(defun time-since (time)
+  "Return the time since TIME, which is either an internal time or a date."
+  (when (stringp time)
+    ;; Convert date strings to internal time.
+    (setq time (date-to-time time)))
+  (let* ((current (current-time))
+        (rest (when (< (nth 1 current) (nth 1 time))
+                (expt 2 16))))
+    (list (- (+ (car current) (if rest -1 0)) (car time))
+         (- (+ (or rest 0) (nth 1 current)) (nth 1 time)))))
+
+(defun subtract-time (t1 t2)
+  "Subtract two internal times."
+  (let ((borrow (< (cadr t1) (cadr t2))))
+    (list (- (car t1) (car t2) (if borrow 1 0))
+         (- (+ (if borrow 65536 0) (cadr t1)) (cadr t2)))))
+
+(defun date-to-day (date)
+  "Return the number of days between year 1 and DATE."
+  (time-to-day (date-to-time date)))
+  
+(defun days-between (date1 date2)
+  "Return the number of days between DATE1 and DATE2."
+  (- (date-to-day date1) (date-to-day date2)))
+
+(defun date-leap-year-p (year)
+  "Return t if YEAR is a leap year."
+  (or (and (zerop (% year 4))
+          (not (zerop (% year 100))))
+      (zerop (% year 400))))
+
+(defun time-to-day-in-year (time)
+  "Return the day number within the year of the date month/day/year."
+  (let* ((tim (decode-time time))
+        (month (nth 4 tim))
+        (day (nth 3 tim))
+        (year (nth 5 tim))
+        (day-of-year (+ day (* 31 (1- month)))))
+    (when (> month 2)
+      (setq day-of-year (- day-of-year (/ (+ 23 (* 4 month)) 10)))
+      (when (date-leap-year-p year)
+       (setq day-of-year (1+ day-of-year))))
+    day-of-year))
+
+(defun time-to-day (time)
+  "The number of days between the Gregorian date 0001-12-31bce and TIME.
+The Gregorian date Sunday, December 31, 1bce is imaginary."
+  (let* ((tim (decode-time time))
+        (month (nth 4 tim))
+        (day (nth 3 tim))
+        (year (nth 5 tim)))
+    (+ (time-to-day-in-year time)      ;       Days this year
+       (* 365 (1- year))               ;       + Days in prior years
+       (/ (1- year) 4)                 ;       + Julian leap years
+       (- (/ (1- year) 100))           ;       - century years
+       (/ (1- year) 400))))            ;       + Gregorian leap years
+
+(provide 'time-date)
+
+;;; time-date.el ends here
diff --git a/texi/emacs-mime.texi b/texi/emacs-mime.texi
new file mode 100644 (file)
index 0000000..f333fa5
--- /dev/null
@@ -0,0 +1,755 @@
+\input texinfo                  @c -*-texinfo-*-
+
+@setfilename message
+@settitle Emacs MIME Manual
+@synindex fn cp
+@synindex vr cp
+@synindex pg cp
+@c @direntry
+@c * Emacs MIME: (emacs-mime).   The MIME de/composition library.
+@c @end direntry
+@iftex
+@finalout
+@end iftex
+@setchapternewpage odd
+
+@ifinfo
+
+This file documents the Emacs MIME interface functionality.
+
+Copyright (C) 1996 Free Software Foundation, Inc.
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+@ignore
+Permission is granted to process this file through Tex and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+
+@end ignore
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions.
+@end ifinfo
+
+@tex
+
+@titlepage
+@title Emacs MIME Manual
+
+@author by Lars Magne Ingebrigtsen
+@page
+
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1998 Free Software Foundation, Inc. 
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the
+entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions.
+
+@end titlepage
+@page
+
+@end tex
+
+@node Top
+@top Emacs MIME
+
+This manual documents the libraries used to compose and display
+@sc{mime} messages.
+
+This is not a manual meant for users; it's a manual directed at people
+who want to write functions and commands that manipulate @sc{mime}
+elements.
+
+@sc{mime} is short for @dfn{Multipurpose Internet Mail Extensions}.
+This standard is documented in a number of RFCs; mainly RFC2045 (Format
+of Internet Message Bodies), RFC2046 (Media Types), RFC2047 (Message
+Header Extensions for Non-ASCII Text), RFC2048 (Registration
+Procedures), RFC2049 (Conformance Criteria and Examples).  It is highly
+recommended that anyone who intends writing @sc{mime}-compliant software
+read at least RFC2045 and RFC2047.
+
+@menu
+* Basic Functions::       Utility and basic parsing functions.
+* Decoding and Viewing::  A framework for decoding and viewing.
+* Index::                 Function and variable index.
+@end menu
+
+
+@node Basic Functions
+@chapter Basic Functions
+
+This chapter describes the basic, ground-level functions for parsing and
+handling.  Covered here is parsing @code{From} lines, removing comments
+from header lines, decoding encoded words, parsing date headers and so
+on.  High-level functionality is dealt with in the next chapter
+(@pxref{Decoding and Viewing}).
+
+@menu
+* mail-parse::   The generalized @sc{mime} and mail interface.
+* rfc2231::      Parsing @code{Content-Type} headers.
+* drums::        Handling mail headers defined by RFC822bis.
+* rfc2047::      En/decoding encoded words in headers.
+* time-date::    Functions for parsing dates and manipulating time.
+* qp::           Quoted-Printable en/decoding.
+* base64::       Base64 en/decoding.
+* mailcap::      How parts are displayed is specified by the @file{.mailcap} file
+@end menu
+
+
+@node mail-parse
+@section mail-parse
+
+It is perhaps misleading to place the @code{mail-parse} library in this
+chapter.  It is not a basic low-level library---rather, it is an
+abstraction over the actual low-level libraries that are described in the
+subsequent sections.
+
+Standards change, and so programs have to change to fit in the new
+mold.  For instance, RFC2045 describes a syntax for the
+@code{Content-Type} header that only allows ASCII characters in the
+parameter list.  RFC2231 expands on RFC2045 syntax to provide a scheme
+for continuation headers and non-ASCII characters.
+
+The traditional way to deal with this is just to update the library
+functions to parse the new syntax.  However, this is sometimes the wrong
+thing to do.  In some instances it may be vital to be able to understand
+both the old syntax as well as the new syntax, and if there is only one
+library, one must choose between the old version of the library and the
+new version of the library.
+
+The Emacs MIME library takes a different tack.  It defines a series of
+low-level libraries (@file{rfc2047.el}, @file{rfc2231.el} and so on)
+that parses strictly according to the corresponding standard.  However,
+normal programs would not use the functions provided by these libraries
+directly, but instead use the functions provided by the
+@code{mail-parse} library.  The functions in this library are just
+aliases to the corresponding functions in the latest low-level
+libraries.  Using this scheme, programs get a consistent interface they
+can use, and library developers are free to create write code that
+handles new standards.
+
+The following functions are defined by this library:
+
+@table @code
+@item mail-header-parse-content-type
+@findex mail-header-parse-content-type
+Parse a @code{Content-Type} header and return a list on the following
+format:
+
+@lisp
+("type/subtype"
+ (attribute1 . value1)
+ (attribute2 . value2)
+ ...)
+@end lisp
+
+Here's an example:
+
+@example
+(mail-header-parse-content-type
+ "image/gif; name=\"b980912.gif\"")
+=> ("image/gif" (name . "b980912.gif"))
+@end example
+
+@item mail-header-parse-content-disposition
+@findex mail-header-parse-content-disposition
+Parse a @code{Content-Disposition} header and return a list on the same
+format as the function above.
+
+@item mail-content-type-get
+@findex mail-content-type-get
+Takes two parameters---a list on the format above, and an attribute.
+Returns the value of the attribute.
+
+@example
+(mail-content-type-get
+ '("image/gif" (name . "b980912.gif")) 'name)
+=> "b980912.gif"
+@end example
+
+@item mail-header-remove-comments
+@findex mail-header-remove-comments
+Return a comment-free version of a header.
+
+@example
+(mail-header-remove-comments
+ "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)")
+=> "Gnus/5.070027  "
+@end example
+
+@item mail-header-remove-whitespace
+@findex mail-header-remove-whitespace
+Remove linear white space from a header.  Space inside quoted strings
+and comments is preserved.
+
+@example
+(mail-header-remove-whitespace
+ "image/gif; name=\"Name with spaces\"")
+=> "image/gif;name=\"Name with spaces\""
+@end example
+
+@item mail-header-get-comment
+@findex mail-header-get-comment
+Return the last comment in a header.
+
+@example
+(mail-header-get-comment 
+ "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)")
+=> "Finnish Landrace" 
+@end example
+
+@item mail-header-parse-address
+@findex mail-header-parse-address
+Parse an address and return a list containing the mailbox and the
+plaintext name.
+
+@example
+(mail-header-parse-address
+ "Hrvoje Niksic <hniksic@@srce.hr>")
+=> ("hniksic@@srce.hr" . "Hrvoje Niksic")
+@end example
+
+@item mail-header-parse-addresses
+@findex mail-header-parse-addresses
+Parse a string with list of addresses and return a list of elements like
+the one described above.
+
+@example
+(mail-header-parse-addresses
+ "Hrvoje Niksic <hniksic@@srce.hr>, Steinar Bang <sb@@metis.no>")
+=> (("hniksic@@srce.hr" . "Hrvoje Niksic")
+     ("sb@@metis.no" . "Steinar Bang"))
+@end example
+
+@item mail-header-parse-date
+@findex mail-header-parse-date
+Parse a date string and return an Emacs time structure.
+
+@item mail-narrow-to-head
+@findex mail-narrow-to-head
+Narrow the buffer to the header section of the buffer.  Point is placed
+at the beginning of the narrowed buffer.
+
+@item mail-header-narrow-to-field
+@findex mail-header-narrow-to-field
+Narrow the buffer to the header under point.
+
+@item mail-encode-encoded-word-region
+@findex mail-encode-encoded-word-region
+Encode the non-ASCII words in the region.  For instance,
+@samp{Naïve} is encoded as @samp{=?iso-8859-1?q?Na=EFve?=}.
+
+@item mail-encode-encoded-word-buffer
+@findex mail-encode-encoded-word-buffer
+Encode the non-ASCII words in the current buffer.  This function is
+meant to be called narrowed to the headers of a message.
+
+@item mail-encode-encoded-word-string
+@findex mail-encode-encoded-word-string
+Encode the words that need encoding in a string, and return the result.
+
+@example
+(mail-encode-encoded-word-string
+ "This is naïve, baby")
+=> "This is =?iso-8859-1?q?na=EFve,?= baby"
+@end example
+
+@item mail-decode-encoded-word-region
+@findex mail-decode-encoded-word-region
+Decode the encoded words in the region.
+
+@item mail-decode-encoded-word-string
+@findex mail-decode-encoded-word-string
+Decode the encoded words in the string and return the result.
+
+@example
+(mail-decode-encoded-word-string
+ "This is =?iso-8859-1?q?na=EFve,?= baby")
+=> "This is naïve, baby"
+@end example
+
+@end table
+
+Currently, @code{mail-parse} is an abstraction over @code{drums},
+@code{rfc2047} and @code{rfc2231}.  These are documented in the
+subsequent sections.
+
+
+@node rfc2231
+@section rfc2231
+
+RFC2231 defines a syntax for the @code{Content-Type} and
+@code{Content-Disposition} headers.  Its snappy name is @dfn{MIME
+Parameter Value and Encoded Word Extensions: Character Sets, Languages,
+and Continuations}.
+
+In short, these headers look something like this:
+
+@example
+Content-Type: application/x-stuff;
+ title*0*=us-ascii'en'This%20is%20even%20more%20;
+ title*1*=%2A%2A%2Afun%2A%2A%2A%20;
+ title*2="isn't it!"
+@end example
+
+They usually aren't this bad, though.
+
+The following functions are defined by this library:
+
+@table @code
+@item rfc2231-parse-string
+@findex rfc2231-parse-string
+Parse a @code{Content-Type} header and return a list describing its
+elements.
+
+@example
+(rfc2231-parse-string
+ "application/x-stuff; 
+ title*0*=us-ascii'en'This%20is%20even%20more%20;
+ title*1*=%2A%2A%2Afun%2A%2A%2A%20;
+ title*2=\"isn't it!\"")
+=> ("application/x-stuff"
+    (title . "This is even more ***fun*** isn't it!"))
+@end example
+
+@item rfc2231-get-value
+@findex rfc2231-get-value
+Takes one of the lists on the format above and return
+the value of the specified attribute.
+
+@end table
+
+
+@node drums
+@section drums
+
+@dfn{drums} is an IETF working group that is working on the replacement
+for RFC822.
+
+The functions provided by this library include:
+
+@table @code
+@item drums-remove-comments
+@findex drums-remove-comments
+Remove the comments from the argument and return the results.
+
+@item drums-remove-whitespace
+@findex drums-remove-whitespace
+Remove linear white space from the string and return the results.
+Spaces inside quoted strings and comments are left untouched.
+
+@item drums-get-comment
+@findex drums-get-comment
+Return the last most comment from the string.
+
+@item drums-parse-address
+@findex drums-parse-address
+Parse an address string and return a list that contains the mailbox and
+the plain text name.
+
+@item drums-parse-addresses
+@findex drums-parse-addresses
+Parse a string that contains any number of comma-separated addresses and
+return a list that contains mailbox/plain text pairs.
+
+@item drums-parse-date
+@findex drums-parse-date
+Parse a date string and return an Emacs time structure.
+
+@item drums-narrow-to-header
+@findex drums-narrow-to-header
+Narrow the buffer to the header section of the current buffer.
+
+@end table
+
+
+@node rfc2047
+@section rfc2047
+
+RFC2047 (Message Header Extensions for Non-ASCII Text) specifies how
+non-ASCII text in headers are to be encoded.  This is actually rather
+complicated, so a number of variables are necessary to tweak what this
+library does.
+
+The following variables are tweakable:
+
+@table @code
+@item rfc2047-default-charset
+@vindex rfc2047-default-charset
+Characters in this charset should not be decoded by this library.
+This defaults to @code{iso-8859-1}.
+
+@item rfc2047-header-encoding-list
+@vindex rfc2047-header-encoding-list
+This is an alist of header / encoding-type pairs.  Its main purpose is
+to prevent encoding of certain headers.
+
+The keys can either be header regexps, or @code{t}.
+
+The values can be either @code{nil}, in which case the header(s) in
+question won't be encoded, or @code{mime}, which means that they will be
+encoded.
+
+@item rfc2047-charset-encoding-alist
+@vindex rfc2047-charset-encoding-alist
+RFC2047 specifies two forms of encoding---@code{Q} (a
+Quoted-Printable-like encoding) and @code{B} (base64).  This alist
+specifies which charset should use which encoding.
+
+@item rfc2047-encoding-function-alist
+@vindex rfc2047-encoding-function-alist
+This is an alist of encoding / function pairs.  The encodings are
+@code{Q}, @code{B} and @code{nil}.
+
+@item rfc2047-q-encoding-alist
+@vindex rfc2047-q-encoding-alist
+The @code{Q} encoding isn't quite the same for all headers.  Some
+headers allow a narrower range of characters, and that is what this
+variable is for.  It's an alist of header regexps / allowable character
+ranges. 
+
+@item rfc2047-encoded-word-regexp
+@vindex rfc2047-encoded-word-regexp
+When decoding words, this library looks for matches to this regexp. 
+
+@end table
+
+Those were the variables, and these are this functions:
+
+@table @code
+@item rfc2047-narrow-to-field
+@findex rfc2047-narrow-to-field
+Narrow the buffer to the header on the current line.
+
+@item rfc2047-encode-message-header
+@findex rfc2047-encode-message-header
+Should be called narrowed to the header of a message.  Encodes according
+to @code{rfc2047-header-encoding-alist}.
+
+@item rfc2047-encode-region
+@findex rfc2047-encode-region
+Encodes all encodable words in the region specified.
+
+@item rfc2047-encode-string
+@findex rfc2047-encode-string
+Encode a string and return the results.
+
+@item rfc2047-decode-region
+@findex rfc2047-decode-region
+Decode the encoded words in the region.
+
+@item rfc2047-decode-string
+@findex rfc2047-decode-string
+Decode a string and return the results.
+
+@end table
+
+
+@node time-date
+@section time-date
+
+While not really a part of the @sc{mime} library, it is convenient to
+document this library here.  It deals with parsing @code{Date} headers
+and manipulating time.  (Not by using tesseracts, though, I'm sorry to
+say.)
+
+These functions converts between five formats: A date string, an Emacs
+time structure, a decoded time list, a second number, and a day number.
+
+The functions have quite self-explanatory names, so the following just
+gives an overview of which functions are available.
+
+@example
+(parse-time-string "Sat Sep 12 12:21:54 1998 +0200")
+=> (54 21 12 12 9 1998 6 nil 7200)
+
+(date-to-time "Sat Sep 12 12:21:54 1998 +0200")
+=> (13818 19266)
+
+(time-to-seconds '(13818 19266))
+=> 905595714.0
+
+(seconds-to-time 905595714.0)
+=> (13818 19266 0)
+
+(time-to-day '(13818 19266))
+=> 729644
+
+(days-to-time 729644)
+=> (961933 65536)
+
+(time-since '(13818 19266))
+=> (0 430)
+
+(time-less-p '(13818 19266) '(13818 19145))
+=> nil
+
+(subtract-time '(13818 19266) '(13818 19145))
+=> (0 121)
+
+(days-between "Sat Sep 12 12:21:54 1998 +0200"
+              "Sat Sep 07 12:21:54 1998 +0200")
+=> 5
+
+(date-leap-year-p 2000)
+=> t
+
+(time-to-day-in-year '(13818 19266))
+=> 255
+
+@end example
+
+And finally, we have @code{safe-date-to-time}, which does the same as
+@code{date-to-time}, but returns a zero time if the date is
+syntactically malformed.
+
+
+
+@node qp
+@section qp
+
+This library deals with decoding and encoding Quoted-Printable text.
+
+Very briefly explained, qp encoding means translating all 8-bit
+characters (and lots of control characters) into things that look like
+@samp{=EF}; that is, an equal sign followed by the byte encoded as a hex
+string.
+
+The following functions are defined by the library:
+
+@table @code
+@item quoted-printable-decode-region
+@findex quoted-printable-decode-region
+QP-decode all the encoded text in the specified region.
+
+@item quoted-printable-decode-string
+@findex quoted-printable-decode-string
+Decode the QP-encoded text in a string and return the results.
+
+@item quoted-printable-encode-region
+@findex quoted-printable-encode-region
+QP-encode all the encodable characters in the specified region.  The third
+optional parameter @var{fold} specifies whether to fold long lines.
+(Long here means 72.)
+
+@item quoted-printable-encode-string
+@findex quoted-printable-encode-string
+QP-encode all the encodable characters in a string and return the
+results.
+
+@end table
+
+
+@node base64
+@section base64
+
+Base64 is an encoding that encodes three bytes into four characters,
+thereby increasing the size by about 33%.  The alphabet used for
+encoding is very resistant to mangling during transit.
+
+The following functions are defined by this library:
+
+@table @code
+@item base64-encode-region
+@findex base64-encode-region
+base64 encode the selected region.  Return the length of the encoded
+text.  Optional third argument @var{no-line-break} means do not break
+long lines into shorter lines.
+
+@item base64-encode-string
+@findex base64-encode-string
+base64 encode a string and return the result.
+
+@item base64-decode-region
+@findex base64-decode-region
+base64 decode the selected region.  Return the length of the decoded
+text.  If the region can't be decoded, return @code{nil} and don't
+modify the buffer.
+
+@item base64-decode-string
+@findex base64-decode-string
+base64 decode a string and return the result.  If the string can't be
+decoded, @code{nil} is returned.
+
+@end table
+
+
+@node mailcap
+@section mailcap
+
+The @file{~/.mailcap} file is parsed by most @sc{mime}-aware message
+handlers and describes how elements are supposed to be displayed.
+Here's an example file:
+
+@example
+image/*; xv -8 %s
+audio/x-pn-realaudio; rvplayer %s
+@end example
+
+This says that all image files should be displayed with @samp{xv}, and
+that realaudio files should be played by @samp{rvplayer}.
+
+The @code{mailcap} library parses this file, and provides functions for
+matching types.
+
+@table @code
+@item mailcap-mime-data
+@vindex mailcap-mime-data
+This variable is an alist of alists containing backup viewing rules.
+
+@end table
+
+Interface functions:
+
+@table @code
+@item mailcap-parse-mailcaps
+@findex mailcap-parse-mailcaps
+Parse the @code{~/.mailcap} file.
+
+@item mailcap-mime-info
+Takes a @sc{mime} type as its argument and returns the matching viewer.
+
+@end table
+
+
+
+
+@node Decoding and Viewing
+@chapter Decoding and Viewing
+
+This chapter deals with decoding and viewing @sc{mime} messages on a
+higher level.
+
+The main idea is to first analyze a @sc{mime} article, and then allow
+other programs to do things based on the list of @dfn{handles} that are
+returned as a result of this analyzation.
+
+@menu
+* Dissection::  Analyzing a @sc{mime} message.
+* Handles::     Handle manipulations.
+* Display::     Displaying handles.
+@end menu
+
+
+@node Dissection
+@section Dissection
+
+The @code{mm-dissect-buffer} is the function responsible for dissecting
+a @sc{mime} article.  If given a multipart message, it will recursively
+descend the message, following the structure, and return a tree of
+@sc{mime} handles that describes the structure of the message.
+
+
+@node Handles
+@section Handles
+
+A @sc{mime} handle is a list that fully describes a @sc{mime}
+component.
+
+The following macros can be used to access elements in a handle:
+
+@table @code
+@item mm-handle-buffer
+@findex mm-handle-buffer
+Return the buffer that holds the contents of the undecoded @sc{mime}
+part.
+
+@item mm-handle-type
+@findex mm-handle-type
+Return the parsed @code{Content-Type} of the part.
+
+@item mm-handle-encoding
+@findex mm-handle-encoding
+Return the @code{Content-Transfer-Encoding} of the part.
+
+@item mm-handle-undisplayer
+@findex mm-handle-undisplayer
+Return the object that can be used to remove the displayed part (if it
+has been displayed).
+
+@item mm-handle-set-undisplayer
+@findex mm-handle-set-undisplayer
+Set the undisplayer object.
+
+@item mm-handle-disposition
+@findex mm-handle-disposition
+Return the parsed @code{Content-Disposition} of the part.
+
+@item mm-handle-disposition
+@findex mm-handle-disposition
+Return the description of the part.
+
+@item mm-get-content-id
+Returns the handle(s) referred to by @code{Content-ID}.
+
+@end table
+
+
+@node Display
+@section Display
+
+Functions for displaying, removing and saving.
+
+@table @code
+@item mm-display-part
+@findex mm-display-part
+Display the part.
+
+@item mm-remove-part
+@findex mm-remove-part
+Remove the part (if it has been displayed).
+
+@item mm-inlinable-p
+@findex mm-inlinable-p
+Say whether a @sc{mime} type can be displayed inline.
+
+@item mm-automatic-display-p
+@findex mm-automatic-display-p
+Say whether a @sc{mime} type should be displayed automatically.
+
+@item mm-destroy-part
+@findex mm-destroy-part
+Free all resources occupied by a part.
+
+@item mm-save-part
+@findex mm-save-part
+Offer to save the part in a file.
+
+@item mm-pipe-part
+@findex mm-pipe-part
+Offer to pipe the part to some process.
+
+@item mm-interactively-view-part
+@findex mm-interactively-view-part
+Prompt for a mailcap method to use to view the part.
+
+@end table
+
+@node Index
+@chapter Index
+@printindex cp
+
+@summarycontents
+@contents
+@bye
+
+@c End:
index a3b1c77..c0dee20 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename gnus-ja
-@settitle Semi-gnus 6.8.0 Manual
+@settitle Semi-gnus 6.7.7 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -342,7 +342,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Semi-gnus 6.8.0 Manual
+@title Semi-gnus 6.7.7 Manual
 
 @author by Lars Magne Ingebrigtsen
 @author by members of Semi-gnus mailing-list
@@ -396,7 +396,7 @@ Semi-gnus \e$B$O!"Bg$-$J3($,F~$C$F$$$?$j$5$^$6$^$J7A<0$rMQ$$$?$j$7$F$$$k$A$g$C\e(B
 \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.8.0 \e$B$KBP1~$7$^$9!#\e(B
+\e$B$3$N@bL@=q$O\e(B Semi-gnus 6.7.7 \e$B$KBP1~$7$^$9!#\e(B
 
 @end ifinfo
 
@@ -980,11 +980,6 @@ gnus \e$B$O%U%!%$%k\e(B@file{.newsrc} \e$B$NCV$+$l$F$$$k%G%#%l%/%H%j\e(B (\e$B$3$l$OI
 \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
@@ -1294,9 +1289,9 @@ gnus \e$B$,$=$l$rD4$Y$k$3$H$O$"$j$^$;$s!#\e(BGnus \e$B$OI,MW$H$9$kA4$F$N<B>pJs$r!"%
 @cindex group modeline
 
 @vindex gnus-group-mode-line-format
-\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
+\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
 
 @table @samp
 @item S
@@ -1992,9 +1987,7 @@ alt.sysadmin.recovery shaving} \e$B$N$h$&$J%^%C%A$9$kJ8;zNs$rMQ$$$k$3$H$K$h$C\e(B
 \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@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
+\e$B9g$J$I!"$7$P$i$/;~4V$,$+$+$k$+$b$7$l$^$;$s!#\e(B
 
 
 @node Group Parameters
@@ -2694,10 +2687,9 @@ Gnus
 @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!#\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
+\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
 
 @item T M
 @kindex T M (Topic)
@@ -3331,7 +3323,7 @@ Gnus \e$B$OJQ?t\e(B @code{gnus-extract-address-components} \e$B$NCM$r\e(B @code{From
 @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-score} \e$B$H$N:9$,\e(B @code{gnus-summary-zcore-fuzz}
+@code{gnus-summary-default-zcore}\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
@@ -3381,9 +3373,9 @@ Gnus \e$B$OJQ?t\e(B @code{gnus-extract-address-components} \e$B$NCM$r\e(B @code{From
 @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 (@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$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$B0J2<$,$"$J$?$,M7$V$3$H$N$G$-$k$=$l$>$l$NMWAG$G$9!'\e(B
 
@@ -3394,8 +3386,6 @@ Formatting})\e$B!#\e(B@code{gnus-summary-mode-line-format} \e$B$r2?$G$b9%$-$J$b$N$K
 \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
@@ -6266,8 +6256,7 @@ Highlighting} \e$B$b;2>H$7$F$/$@$5$$!#\e(B
 @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!#%Z!<%8$N6h@Z$j$KIU$$$F$O\e(B 
-@xref{Misc Article} \e$B$r;2>H$7$F2<$5$$!#\e(B
+(@code{gnus-summary-stop-page-breaking})\e$B!#\e(B
 
 @item W r
 @kindex W r \e$B!J35N,!K\e(B
@@ -6915,9 +6904,9 @@ gnus \e$B$N5-;vA*Br4X?t$r5-;v72$r\e(B uudecode \e$B$7$=$N7k2L$rI=<($9$k$h$&$KJQ99$9
 
 @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\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
+\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
 
 @item gnus-selected-tree-face
 @vindex gnus-selected-tree-face
@@ -7816,7 +7805,7 @@ Washing}, @pxref{Article Buttons}, @pxref{Article Date} \e$B$r;2>H$7$F$/$@$5$$!#\e
 @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{C-c ^} \e$B$r2!\e(B
+\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$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
 
@@ -7890,9 +7879,9 @@ Washing}, @pxref{Article Buttons}, @pxref{Article Date} \e$B$r;2>H$7$F$/$@$5$$!#\e
 
 @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$?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
+\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
 
 @table @samp
 @item w
@@ -8435,8 +8424,7 @@ Buffer})\e$B!#\e(B
 
 @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\e(B (@pxref{Mode Line Formatting})\e$B!#0J2<$N;XDj$OM}\e(B
-\e$B2r$5$l$^$9\e(B:
+\e$B%?%^%$%:$9$k;v$,$G$-$^$9!#0J2<$N;XDj$OM}2r$5$l$^$9\e(B:
 
 @table @samp
 @item S
@@ -8897,16 +8885,14 @@ machine nntp.ifi.uio.no login larsi force yes
 @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(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
+\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
 
 @code{nntp-open-rlogin} \e$B$K4XO"$7$?JQ?t$G$9\e(B:
 
@@ -8927,10 +8913,6 @@ machine nntp.ifi.uio.no login larsi force yes
 
 @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
@@ -8968,26 +8950,6 @@ machine nntp.ifi.uio.no login larsi force yes
 
 @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
@@ -9463,7 +9425,7 @@ gnus \e$B$,<+J,<+?H$G\e(B POP \e$B%a!<%kJ8;zNs$rH/8+$7$h$&$H$7$^$9!#$I$N$h$&$J>l9g$
 
 @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!#IaDL$N@55,I=8=$N9gCW$,$J$5$l$^$9!#Nc$O2<$NJ}$r8+$F2<$5$$!#\e(B
+\e$B$9!#\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
@@ -9513,10 +9475,6 @@ table) \e$B$K=>$C$F40A4$K9gCW$7$J$1$l$P$J$j$^$;$s!#@55,I=8=$G%U%#!<%k%IL>$+\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 
@@ -10910,32 +10868,6 @@ Newsgroups: alt.religion.emacs
 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
@@ -11403,7 +11335,7 @@ gnus \e$B%(!<%8%'%s%H$,$=$N5-;v$r\e(B SPAM \e$B$@$H8+Pv$7$?$i??!#$3$NH/8+E*\e(B
 
 @item gnus-category-mode-line-format
 @vindex gnus-category-mode-line-format
-\e$BJ,N`%b!<%I9T$NMM<0\e(B (@pxref{Mode Line Formatting})\e$B!#\e(B
+\e$BJ,N`%b!<%I9T$NMM<0!#\e(B
 
 @item gnus-agent-short-article
 @vindex gnus-agent-short-article
@@ -11698,7 +11630,7 @@ Gnus \e$B$O35N,%P%C%U%!$r:n@.$9$kA0$K!"8=:_$N%0%k!<%W$KE,MQ$5$l$k$I$s$J\e(B
 * Scoring Tips::             \e$B$I$&$d$C$F8z2LE*$K%9%3%"$rIU$1$k$+!#\e(B
 * Reverse Scoring::          \e$B8E$$$b$N$N;R$G$"$k$H$$$&LdBj$OLdBj$G$O$J$$!#\e(B
 * Global Score Files::       \e$BCO$r$D$+$_!"<*$r@Z$jNv$/%9%3%"%U%!%$%k!#\e(B
-* Kill Files::               \e$B$=$l$i$O$^$@$3$3$K$"$j$^$9$,!"L5;k$9$k;v$,$G$-$k!#\e(B
+* Kill Files::               \e$B$=$l$i$O$^$@$3$3$K$"$j$^$9$,!"L5;k$9$k;v$,$G$-$^$9!#\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
@@ -11749,6 +11681,12 @@ Gnus \e$B$O35N,%P%C%U%!$r:n@.$9$kA0$K!"8=:_$N%0%k!<%W$KE,MQ$5$l$k$I$s$J\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
@@ -12208,31 +12146,11 @@ Gnus \e$B$O0lHLE*$J%9%3%"%U%!%$%k$rFCDj$N%9%3%"%U%!%$%k8~$1$N$b$N$h$jA0$KE,\e(B
 
 @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!#\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
+@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
 
 @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:
@@ -12976,7 +12894,7 @@ GNUS \e$B>C5n%U%!%$%k$rJT=8$9$k$?$a$NFs$D$N35N,%P%C%U%!4X?t$,$"$j$^\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.stud.ifi.uio.no/~larsi/ding-other/gnus-kill-to-score}
+@file{http://www.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
@@ -13389,1825 +13307,3 @@ Gnus \e$B$O\e(B1\e$BF|$K\e(B1\e$B2s%9%3%"$rIeGT$5$;$h$&$H$7$^$9!#Nc$($P!"$b$7\e(B gnus
 \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
-
-
index 7e88b02..40a4fee 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename gnus
-@settitle Semi-gnus 6.8.0 Manual
+@settitle Semi-gnus 6.7.8 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -316,7 +316,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Semi-gnus 6.8.0 Manual
+@title Semi-gnus 6.7.8 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -359,7 +359,7 @@ internationalization/localization and multiscript features based on MULE
 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.8.0
+This manual corresponds to Semi-Gnus 6.7.8
 
 @end ifinfo
 
@@ -3821,7 +3821,7 @@ This command is mainly used if you have several accounts and want to
 ship a mail to a different account of yours.  (If you're both
 @code{root} and @code{postmaster} and get a mail for @code{postmaster}
 to the @code{root} account, you may want to resend it to
-@code{postmaster}.  Ordnung mu\e,A_\e(B sein!
+@code{postmaster}.  Ordnung mu\e(I_\e(B sein!
 
 This command understands the process/prefix convention
 (@pxref{Process/Prefix}).
@@ -10972,7 +10972,7 @@ group as read.
 
 If the search engine changes its output substantially, @code{nnweb}
 won't be able to parse it and will fail.  One could hardly fault the Web
-providers if they were to do this---their @emph{raison d'\e,Aj\e(Btre} is to
+providers if they were to do this---their @emph{raison d'\e$BsU\e(Bre} 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.
@@ -13369,7 +13369,7 @@ then this operator will return @code{false}.
 
 @item !
 @itemx not
-@itemx \e,A,\e(B
+@itemx \e(I,\e(B
 This logical operator only takes a single argument.  It returns the
 logical negation of the value of its argument.
 
@@ -15652,7 +15652,7 @@ David Moore---rewrite of @file{nnvirtual.el} and many other things.
 Kevin Davidson---came up with the name @dfn{ding}, so blame him.
 
 @item
-Fran\e,Ag\e(Bois Pinard---many, many interesting and thorough bug reports, as
+Fran\e$BmP\e(Bis Pinard---many, many interesting and thorough bug reports, as
 well as autoconf support.
 
 @end itemize
@@ -15665,7 +15665,7 @@ The following people have contributed many patches and suggestions:
 Christopher Davis,
 Andrew Eskilsson,
 Kai Grossjohann,
-David K\e,Ae\e(Bgedal,
+David K\e$BiH\e(Bedal,
 Richard Pieri,
 Fabrice Popineau,
 Daniel Quinlan,
@@ -15735,7 +15735,7 @@ Marc Horowitz,
 Gunnar Horrigmo,
 Richard Hoskins,
 Brad Howes,
-Fran\e,Ag\e(Bois Felix Ingrand,
+Fran\e$BmP\e(Bis Felix Ingrand,
 Ishikawa Ichiro, @c Ishikawa
 Lee Iverson,
 Iwamuro Motonori, @c Iwamuro
@@ -17155,8 +17155,8 @@ From: Jason L Tibbitts III <tibbs@@hpc.uh.edu>
 @end example
 
 @item
- tanken var at n\e,Ae\e(Br du bruker `gnus-startup-file' som prefix (FOO) til \e$B\e,A\e(Bi\e,A\e(Blete
-opp en fil FOO-SERVER, FOO-SERVER.el, FOO-SERVER.eld, kan du la den v\e,Af\e(Bre en
+ 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
 liste hvor du bruker hvert element i listen som FOO, istedet.  da kunne man
 hatt forskjellige serveres startup-filer forskjellige steder.
 
@@ -17229,8 +17229,8 @@ there was a sci.somethingelse group or section, then it should prompt
 for sci? first the sci.something? then sci.somethingelse?...
 
 @item
-Ja, det burde v\e,Af\e(Bre en m\e,Ae\e(Bte \e,Ae\e(B si slikt.  Kanskje en ny variabel?
-`gnus-use-few-score-files'?  S\e,Ae\e(B kunne score-regler legges til den
+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
 "mest" lokale score-fila.  F. eks. ville no-gruppene betjenes av
 "no.all.SCORE", osv.
 
@@ -17563,7 +17563,7 @@ the current process mark set onto the stack.
 
 @item
  gnus-article-hide-pgp
-Selv ville jeg nok ha valgt \e$B\e,A\e(Bi\e,A\e(Bslette den dersom teksten matcher
+Selv ville jeg nok ha valgt \92é\81slette den dersom teksten matcher
 @example
 "\\(This\s+\\)?[^ ]+ has been automatically signed by"
 @end example