*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Sun, 11 Oct 1998 00:31:15 +0000 (00:31 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Sun, 11 Oct 1998 00:31:15 +0000 (00:31 +0000)
41 files changed:
GNUS-NEWS
Makefile.in
lisp/ChangeLog
lisp/Makefile.in
lisp/gnus-agent.el
lisp/gnus-art.el
lisp/gnus-async.el
lisp/gnus-cache.el
lisp/gnus-draft.el
lisp/gnus-msg.el
lisp/gnus-score.el
lisp/gnus-soup.el
lisp/gnus-sum.el
lisp/gnus-uu.el
lisp/gnus-xmas.el
lisp/gnus.el
lisp/mailcap.el
lisp/message.el
lisp/mm-bodies.el
lisp/mm-decode.el
lisp/mm-util.el
lisp/mm-view.el
lisp/nnbabyl.el
lisp/nndraft.el
lisp/nnmail.el
lisp/nnmbox.el
lisp/nnml.el
lisp/nnvirtual.el
lisp/parse-time.el
lisp/uudecode.el [new file with mode: 0644]
texi/ChangeLog
texi/Makefile.in
texi/emacs-mime.texi
texi/gnus.texi
texi/message.texi
texi/pagestyle.sty [new file with mode: 0644]
texi/pixidx.sty [new file with mode: 0644]
texi/ps/gnus-big-logo.eps [new file with mode: 0644]
texi/ps/gnus-head.eps [new file with mode: 0644]
texi/splitindex [new file with mode: 0755]
texi/texi2latex.el [new file with mode: 0644]

index 75306e1..a2ca24f 100644 (file)
--- a/GNUS-NEWS
+++ b/GNUS-NEWS
@@ -1,2 +1,5 @@
 ** Gnus changes.
 
+*** gnus-auto-select-first can now be a function to be
+called to position point.
+
index b28cda9..a91fabc 100644 (file)
@@ -41,7 +41,7 @@ distclean:
        make clean
        rm -rf *~
        for i in lisp texi; do (cd $$i; make distclean); done
-       rm -f config.log config.status Makefile
+       rm -f config.log config.status config.cache Makefile
 
 osome:
        make EMACS=xemacs21 some
index 0555050..7667891 100644 (file)
@@ -1,3 +1,130 @@
+Sun Oct 11 02:28:40 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+
+       * gnus.el: Pterodactyl Gnus v0.34 is released.
+
+1998-10-11 02:15:41  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * mm-decode.el (mm-inline-media-tests): delivery-status.
+
+       * mm-view.el (mm-inline-text): Provide default.
+
+1998-10-11 01:01:37  Lloyd Zusman  <ljz@asfast.com>
+
+       * mailcap.el (mailcap-possible-viewers): Fix nils.
+
+1998-10-11 00:03:37  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-art.el (gnus-article-edit-exit): Don't do updates.
+       (article-update-date-lapsed): Record the buffer.
+       (article-update-date-lapsed): Do all windows that display article
+       buffers. 
+
+       * nnml.el (nnml-generate-nov-databases-1): Ditto.
+
+       * gnus-score.el (gnus-score-score-files-1): Ignore dotted files. 
+
+       * gnus-art.el (gnus-insert-mime-button): Mark buttons as
+       annoations. 
+
+       * gnus-msg.el (gnus-summary-mail-forward): Decode properly.
+
+1998-10-10 22:07:03  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-agent.el (gnus-category-add): Change default category to
+       'false. 
+
+       * nnvirtual.el (nnvirtual-update-read-and-marked): Don't nix out
+       scores. 
+
+       * gnus-draft.el (gnus-draft-send): Check server more.
+
+       * gnus-art.el (gnus-article-view-part): New command and keystroke.
+       (gnus-article-goto-part): New function.
+
+       * mm-view.el (mm-inline-text): Insert richtext properly.
+
+       * gnus-art.el (gnus-insert-mime-button): Store handle in alist. 
+
+1998-10-03 15:04:27  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * parse-time.el (parse-time-rules): Accept dates far into the past
+       and the future, and parse single-digit numbers as years.
+
+1998-10-02 04:46:46  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * mm-decode.el (mm-display-external): Chop off directories.
+
+1998-10-01 07:33:35  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * uudecode.el (uu-decode-region-external): Use
+       insert-file-contents-literally. 
+
+       * gnus-cache.el (gnus-cache-generate-active): Translate _ to :.
+
+1998-10-01 07:02:11  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * uudecode.el: New file.
+
+       * mm-bodies.el (mm-decode-content-transfer-encoding): Do
+       x-uuencode. 
+
+1998-10-01 05:19:35  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-art.el (gnus-mime-display-alternative): Set faces.
+
+       * message.el (message-fetch-field): Unfold properly.
+
+       * mm-bodies.el (mm-decode-content-transfer-encoding): Replace CRLF
+       in text/plain.
+
+1998-09-30 05:47:49  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-sum.el (gnus-summary-first-unread-subject): New command.
+       (gnus-auto-select-first): Removed.
+       (gnus-auto-select-first): Extended.
+       (gnus-summary-read-group-1): Use new value.
+
+1998-09-29 13:21:06  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * message.el (message-fix-before-sending): Space.
+
+       * nnmail.el (nnmail-find-file): Don't erase.
+
+Wed Sep 30 23:49:03 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-agent.el (gnus-agent-fetch-headers): Do not decode headers.
+
+Wed Sep 30 23:46:29 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-soup.el (gnus-soup-add-article): Do not decode headers.
+
+Wed Sep 30 23:44:08 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-soup.el (gnus-soup-pack-packet): Pack only if necesary.
+
+Sat Sep 26 03:04:18 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * mm-util.el (mm-with-unibyte-buffer): Make it work in XEmacs
+       20.4.
+
+1998-09-29 11:35:09  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-art.el (gnus-mime-view-all-parts): New command and
+       keystroke. 
+
+       * mm-decode.el (mm-display-external): Translate slashes.
+
+       * nnmail.el (nnmail-find-file): Restrict auto-mode-alist.
+
+       * nndraft.el (nndraft-retrieve-headers): Don't copy so much. 
+
+       * mm-decode.el (mm-quote-arg): Quote spaces.
+       (mm-display-external): Quote args.
+
+1998-09-24 22:27:55  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * mm-decode.el (mm-inlinable-part-p): New function.
+
 Thu Sep 24 20:28:31 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
        * gnus.el: Pterodactyl Gnus v0.33 is released.
index d143e8f..108c6fa 100644 (file)
@@ -12,22 +12,17 @@ INSTALL_DATA = @INSTALL_DATA@
 SHELL = /bin/sh
 VPATH = @srcdir@
 
-total:
-       rm -f *.elc ; $(EMACS) $(FLAGS) -f dgnushack-compile
-
-all:
+all total:
        rm -f *.elc ; $(EMACS) $(FLAGS) -f dgnushack-compile
 
 warn:
        rm -f *.elc ; $(EMACS) $(FLAGS) --eval '(dgnushack-compile t)' 2>&1 | egrep -v "variable G|inhibit-point-motion-hooks|coding-system|temp-results|variable gnus|variable nn|scroll-in-place|deactivate-mark|filladapt-mode|byte-code-function-p|print-quoted|ps-right-header|ps-left-header|article-inhibit|print-escape|ssl-program-arguments|message-log-max"
 
-clever:
-       $(EMACS) $(FLAGS) -f dgnushack-compile
-
-some:
+clever some:
        $(EMACS) $(FLAGS) -f dgnushack-compile
 
 install: clever
+       rm -f dgnushack.elc
        $(SHELL) $(top_srcdir)/mkinstalldirs $(lispdir)
        for p in *.elc; do \
          echo " $(INSTALL_DATA) $$p $(lispdir)/$$p"; \
index b4654fd..20c2380 100644 (file)
@@ -768,7 +768,8 @@ the actual number of articles toggled is returned."
                       (gnus-uncompress-range
                        (cons (1+ (caar (last gnus-agent-article-alist)))
                              (cdr (gnus-active group)))))
-                   (gnus-list-of-unread-articles group))))
+                   (gnus-list-of-unread-articles group)))
+       (gnus-decode-encoded-word-function 'identity)) 
     ;; Fetch them.
     (when articles
       (gnus-message 7 "Fetching headers for %s..." group)
@@ -931,9 +932,10 @@ the actual number of articles toggled is returned."
                                     (gnus-agent-false nil))))))
        ;; No, we need to decide what we want.
        (setq score-param
-             (let ((score-method (or 
-                                  (gnus-group-get-parameter group 'agent-score t)
-                                  (caddr category))))
+             (let ((score-method
+                    (or 
+                     (gnus-group-get-parameter group 'agent-score t)
+                     (caddr category))))
                (when score-method
                  (require 'gnus-score)
                  (if (eq score-method 'file)
@@ -1197,7 +1199,7 @@ The following commands are available:
   (interactive "SCategory name: ")
   (when (assq category gnus-category-alist)
     (error "Category %s already exists" category))
-  (push (list category 'true nil nil)
+  (push (list category 'false nil nil)
        gnus-category-alist)
   (gnus-category-write)
   (gnus-category-list))
index 6d1bc02..7c15648 100644 (file)
@@ -548,6 +548,7 @@ displayed by the first non-nil matching CONTENT face."
 
 ;;; Internal variables
 
+(defvar gnus-article-mime-handle-alist nil)
 (defvar article-lapsed-timer nil)
 (defvar gnus-article-current-summary nil)
 
@@ -1457,12 +1458,13 @@ function and want to see what the date was before converting."
   (let (deactivate-mark)
     (save-excursion
       (ignore-errors
-        (when (and (gnus-buffer-live-p gnus-article-buffer)
-                  (get-buffer-window gnus-article-buffer))
-          (set-buffer gnus-article-buffer)
-          (goto-char (point-min))
-          (when (re-search-forward "^X-Sent:" nil t)
-            (article-date-lapsed t)))))))
+       (walk-windows
+        (lambda (w)
+          (set-buffer (window-buffer w))
+          (when (eq major-mode 'gnus-article-mode)
+            (goto-char (point-min))
+            (when (re-search-forward "^X-Sent:" nil t)
+              (article-date-lapsed t)))))))))
 
 (defun gnus-start-date-timer (&optional n)
   "Start a timer to update the X-Sent header in the article buffers.
@@ -1890,8 +1892,6 @@ If variable `gnus-use-long-file-name' is non-nil, it is
   "\C-c\C-i" gnus-info-find-node
   "\C-c\C-b" gnus-bug
 
-  gnus-mouse-2 'widget-button-click
-  
   "\C-d" gnus-article-read-summary-keys
   "\M-*" gnus-article-read-summary-keys
   "\M-#" gnus-article-read-summary-keys
@@ -1962,6 +1962,7 @@ commands:
   (make-local-variable 'gnus-article-current-summary)
   (make-local-variable 'gnus-article-mime-handles)
   (make-local-variable 'gnus-article-decoded-p)
+  (make-local-variable 'gnus-article-mime-handle-alist)
   (gnus-set-default-directory)
   (buffer-disable-undo)
   (setq buffer-read-only t)
@@ -1979,6 +1980,7 @@ commands:
                         (substring name (match-end 0))))))
     (setq gnus-article-buffer name)
     (setq gnus-original-article-buffer original)
+    (setq gnus-article-mime-handle-alist nil)
     ;; This might be a variable local to the summary buffer.
     (unless gnus-single-article-buffer
       (save-excursion
@@ -2148,17 +2150,19 @@ If ALL-HEADERS is non-nil, no headers are hidden."
 ;;; Gnus MIME viewing functions
 ;;;
 
-(defvar gnus-mime-button-line-format "%{%([%t%d%n]%)%}\n"
+(defvar gnus-mime-button-line-format "%{%([%p. %t%d%n]%)%}\n"
   "The following specs can be used:
 %t  The MIME type
 %n  The `name' parameter
 %d  The description, if any
-%l  The length of the encoded part")
+%l  The length of the encoded part
+%p  The part identifier")
 
 (defvar gnus-mime-button-line-format-alist
   '((?t gnus-tmp-type ?s)
     (?n gnus-tmp-name ?s)
     (?d gnus-tmp-description ?s)
+    (?p gnus-tmp-id ?s)
     (?l gnus-tmp-length ?d)))
 
 (defvar gnus-mime-button-map nil)
@@ -2173,6 +2177,13 @@ If ALL-HEADERS is non-nil, no headers are hidden."
   (define-key gnus-mime-button-map "i" 'gnus-mime-inline-part)
   (define-key gnus-mime-button-map "|" 'gnus-mime-pipe-part))
 
+(defun gnus-mime-view-all-parts ()
+  "View all the MIME parts."
+  (interactive)
+  (let ((handles gnus-article-mime-handles))
+    (while handles
+      (mm-display-part (pop handles)))))
+
 (defun gnus-mime-save-part ()
   "Save the MIME part under point."
   (interactive)
@@ -2215,6 +2226,21 @@ If ALL-HEADERS is non-nil, no headers are hidden."
       (mm-insert-inline data contents)
       (goto-char b))))
 
+(defun gnus-article-view-part (n)
+  "View MIME part N, which is the numerical prefix."
+  (interactive "p")
+  (save-current-buffer
+    (set-buffer gnus-article-buffer)
+    (when (> n (length gnus-article-mime-handle-alist))
+      (error "No such part"))
+    (let ((handle (cdr (assq n gnus-article-mime-handle-alist))))
+      (gnus-article-goto-part n)
+      (mm-display-part handle))))
+
+(defun gnus-article-goto-part (n)
+  "Go to MIME part N."
+  (goto-char (text-property-any (point-min) (point-max) 'gnus-part n)))
+
 (defun gnus-insert-mime-button (handle)
   (let ((gnus-tmp-name (mail-content-type-get (mm-handle-type handle) 'name))
        (gnus-tmp-type (car (mm-handle-type handle)))
@@ -2222,7 +2248,9 @@ If ALL-HEADERS is non-nil, no headers are hidden."
        (gnus-tmp-length (save-excursion
                           (set-buffer (mm-handle-buffer handle))
                           (buffer-size)))
+       (gnus-tmp-id (1+ (length gnus-article-mime-handle-alist)))
        b e)
+    (push (cons gnus-tmp-id handle) gnus-article-mime-handle-alist)
     (setq gnus-tmp-name
          (if gnus-tmp-name
              (concat " (" gnus-tmp-name ")")
@@ -2237,6 +2265,8 @@ If ALL-HEADERS is non-nil, no headers are hidden."
      `(local-map ,gnus-mime-button-map
                 keymap ,gnus-mime-button-map
                 gnus-callback mm-display-part
+                gnus-part ,gnus-tmp-id
+                gnus-type annotation
                 gnus-data ,handle))
     (setq e (point))
     (widget-convert-button 'link b e :action 'gnus-widget-press-button
@@ -2258,7 +2288,8 @@ If ALL-HEADERS is non-nil, no headers are hidden."
     (let* ((handles (mm-dissect-buffer))
           handle name type b e)
       (mapcar 'mm-destroy-part gnus-article-mime-handles)
-      (setq gnus-article-mime-handles handles)
+      (setq gnus-article-mime-handles handles
+           gnus-article-mime-handle-alist nil)
       (when handles
        (goto-char (point-min))
        (search-forward "\n\n" nil t)
@@ -2269,6 +2300,7 @@ If ALL-HEADERS is non-nil, no headers are hidden."
              (insert "\n\n")
              (when (and (mm-automatic-display-p
                          (car (mm-handle-type handle)))
+                        (mm-inlinable-part-p (car (mm-handle-type handle)))
                         (or (not (mm-handle-disposition handle))
                             (equal (car (mm-handle-disposition handle))
                                    "inline")))
@@ -2296,6 +2328,8 @@ If ALL-HEADERS is non-nil, no headers are hidden."
                         (car (mm-handle-type handle))))
         (point))
        `(local-map ,gnus-mime-button-map
+                  ,gnus-mouse-face-prop ,gnus-article-mouse-face
+                  face ,gnus-article-button-face
                   keymap ,gnus-mime-button-map
                   gnus-callback
                   (lambda (handles)
@@ -2870,11 +2904,10 @@ groups."
          (setq gnus-original-article nil)))
       (set-window-configuration winconf)
       ;; Tippy-toe some to make sure that point remains where it was.
-      (let ((buf (current-buffer)))
+      (save-current-buffer
        (set-buffer curbuf)
        (set-window-start (get-buffer-window (current-buffer)) window-start)
-       (goto-char p)
-       (set-buffer buf)))))
+       (goto-char p)))))
 
 (defun gnus-article-edit-full-stops ()
   "Interactively repair spacing at end of sentences."
index 8da43cc..870192f 100644 (file)
@@ -213,11 +213,13 @@ It should return non-nil if the article is to be prefetched."
        (when arg
         (gnus-async-set-buffer)
         (gnus-async-with-semaphore
-         (push (list ',(intern (format "%s-%d" group article)
-                               gnus-asynch-obarray)
-                     ,mark (set-marker (make-marker) (point-max))
-                     ,group ,article)
-               gnus-async-article-alist)))
+         (setq
+          gnus-async-article-alist
+          (cons (list ',(intern (format "%s-%d" group article)
+                                gnus-asynch-obarray)
+                      ,mark (set-marker (make-marker) (point-max))
+                      ,group ,article)
+                gnus-async-article-alist))))
        (if (not (gnus-buffer-live-p ,summary))
           (gnus-async-with-semaphore
            (setq gnus-async-fetch-list nil))
index 333c2b7..a72ba8c 100644 (file)
@@ -640,6 +640,8 @@ If LOW, update the lower bound instead."
     (when top
       (gnus-message 5 "Generating the cache active file...")
       (setq gnus-cache-active-hashtb (gnus-make-hashtable 123)))
+    (when (string-match "^\\(nn[^_]+\\)_" group)
+      (setq group (replace-match "\\1:" t t group)))
     ;; Separate articles from all other files and directories.
     (while files
       (if (string-match "^[0-9]+$" (file-name-nondirectory (car files)))
index a05245b..8a4fdb9 100644 (file)
        (message-remove-header gnus-agent-meta-information-header)))
     ;; Then we send it.  If we have no meta-information, we just send
     ;; it and let Message figure out how.
-    (when (if type
-             (let ((message-this-is-news (eq type 'news))
-                   (message-this-is-mail (eq type 'mail))
-                   (gnus-post-method method)
-                   (message-post-method method))
-               (message-send-and-exit))
-           (message-send-and-exit))
+    (when (and (or (gnus-server-opened method)
+                  (gnus-open-server method))
+              (if type
+                  (let ((message-this-is-news (eq type 'news))
+                        (message-this-is-mail (eq type 'mail))
+                        (gnus-post-method method)
+                        (message-post-method method))
+                    (message-send-and-exit))
+                (message-send-and-exit)))
       (let ((gnus-verbose-backends nil))
        (gnus-request-expire-articles
         (list article) (or group "nndraft:queue") t)))))
index 523dfd2..0b0bc68 100644 (file)
@@ -615,10 +615,16 @@ If FULL-HEADERS (the prefix), include full headers when forwarding."
   (interactive "P")
   (gnus-setup-message 'forward
     (gnus-summary-select-article)
-    (set-buffer gnus-original-article-buffer)
-    (let ((message-included-forward-headers
-          (if full-headers "" message-included-forward-headers)))
-      (message-forward post))))
+    (let (text)
+      (save-excursion
+       (set-buffer gnus-original-article-buffer)
+       (setq text (buffer-string)))
+      (set-buffer (gnus-get-buffer-create " *Gnus forward*"))
+      (insert text)
+      (run-hooks 'gnus-article-decode-hook)
+      (let ((message-included-forward-headers
+            (if full-headers "" message-included-forward-headers)))
+       (message-forward post)))))
 
 (defun gnus-summary-resend-message (address n)
   "Resend the current article to ADDRESS."
index 0ab923b..f5505be 100644 (file)
@@ -2473,8 +2473,8 @@ SCORE is the score to add."
        seen out file)
     (while (setq file (pop files))
       (cond
-       ;; Ignore "." and "..".
-       ((member (file-name-nondirectory file) '("." ".."))
+       ;; Ignore files that start with a dot.
+       ((string-match "^\\." (file-name-nondirectory file))
        nil)
        ;; Add subtrees of directory to also be searched.
        ((and (file-directory-p file)
index 1c326cd..4e32484 100644 (file)
@@ -140,21 +140,19 @@ move those articles instead."
     (buffer-disable-undo tmp-buf)
     (save-excursion
       (while articles
-       ;; Find the header of the article.
-       (set-buffer gnus-summary-buffer)
-       (when (setq headers (gnus-summary-article-header (car articles)))
          ;; Put the article in a buffer.
-         (set-buffer tmp-buf)
-         (when (gnus-request-article-this-buffer
-                (car articles) gnus-newsgroup-name)
-           (save-restriction
-             (message-narrow-to-head)
-             (message-remove-header gnus-soup-ignored-headers t))
-           (gnus-soup-store gnus-soup-directory prefix headers
-                            gnus-soup-encoding-type
-                            gnus-soup-index-type)
-           (gnus-soup-area-set-number
-            area (1+ (or (gnus-soup-area-number area) 0)))))
+       (set-buffer tmp-buf)
+       (when (gnus-request-article-this-buffer
+              (car articles) gnus-newsgroup-name)
+         (setq headers (nnheader-parse-head t))
+         (save-restriction
+           (message-narrow-to-head)
+           (message-remove-header gnus-soup-ignored-headers t))
+         (gnus-soup-store gnus-soup-directory prefix headers
+                          gnus-soup-encoding-type
+                          gnus-soup-index-type)
+         (gnus-soup-area-set-number
+          area (1+ (or (gnus-soup-area-number area) 0))))
        ;; Mark article as read.
        (set-buffer gnus-summary-buffer)
        (gnus-summary-remove-process-mark (car articles))
@@ -168,11 +166,11 @@ move those articles instead."
   "Make a SOUP packet from the SOUP areas."
   (interactive)
   (gnus-soup-read-areas)
-  (unless (file-exists-p gnus-soup-directory)
-    (message "No such directory: %s" gnus-soup-directory))
-  (when (null (directory-files gnus-soup-directory nil "\\.MSG$"))
-    (message "No files to pack."))
-  (gnus-soup-pack gnus-soup-directory gnus-soup-packer))
+  (if (file-exists-p gnus-soup-directory)
+      (if (directory-files gnus-soup-directory nil "\\.MSG$")
+         (gnus-soup-pack gnus-soup-directory gnus-soup-packer)
+       (message "No files to pack."))
+    (message "No such directory: %s" gnus-soup-directory)))
 
 (defun gnus-group-brew-soup (n)
   "Make a soup packet from the current group.
index 23d1fed..57adb60 100644 (file)
@@ -252,8 +252,12 @@ equal will be included."
 (defcustom gnus-auto-select-first t
   "*If nil, don't select the first unread article when entering a group.
 If this variable is `best', select the highest-scored unread article
-in the group.  If neither nil nor `best', select the first unread
-article.
+in the group.  If t, select the first unread article.
+
+This variable can also be a function to place point on a likely
+subject line.  Useful values include `gnus-summary-first-unread-subject', 
+`gnus-summary-first-unread-article' and 
+`gnus-summary-best-unread-article'.
 
 If you want to prevent automatic selection of the first unread article
 in some newsgroups, set the variable to nil in
@@ -261,7 +265,10 @@ in some newsgroups, set the variable to nil in
   :group 'gnus-group-select
   :type '(choice (const :tag "none" nil)
                 (const best)
-                (sexp :menu-tag "first" t)))
+                (sexp :menu-tag "first" t)
+                (function-item gnus-summary-first-unread-subject)
+                (function-item gnus-summary-first-unread-article)
+                (function-item gnus-summary-best-unread-article)))
 
 (defcustom gnus-auto-select-next t
   "*If non-nil, offer to go to the next group from the end of the previous.
@@ -1242,7 +1249,8 @@ increase the score of each group you read."
     "L" gnus-summary-lower-score
     "\M-i" gnus-symbolic-argument
     "h" gnus-summary-select-article-buffer
-
+    "b" gnus-article-view-part
+    
     "V" gnus-summary-score-map
     "X" gnus-uu-extract-map
     "S" gnus-summary-send-map)
@@ -1401,7 +1409,9 @@ increase the score of each group you read."
 
   (gnus-define-keys (gnus-summary-wash-mime-map "M" gnus-summary-wash-map)
     "w" gnus-article-decode-mime-words
-    "c" gnus-article-decode-charset)
+    "c" gnus-article-decode-charset
+    "v" gnus-mime-view-all-parts
+    "b" gnus-article-view-part)
 
   (gnus-define-keys (gnus-summary-wash-time-map "T" gnus-summary-wash-map)
     "z" gnus-article-date-ut
@@ -1505,7 +1515,8 @@ increase the score of each group you read."
             ("MIME"
              ["Words" gnus-article-decode-mime-words t]
              ["Charset" gnus-article-decode-charset t]
-             ["QP" gnus-article-de-quoted-unreadable t])
+             ["QP" gnus-article-de-quoted-unreadable t]
+             ["View all" gnus-mime-view-all-parts])
              ("Date"
               ["Local" gnus-article-date-local t]
               ["ISO8601" gnus-article-date-iso8601 t]
@@ -2685,10 +2696,15 @@ If NO-DISPLAY, don't generate a summary buffer."
                 (not no-display)
                 gnus-newsgroup-unreads
                 gnus-auto-select-first)
-           (unless (if (eq gnus-auto-select-first 'best)
-                       (gnus-summary-best-unread-article)
-                     (gnus-summary-first-unread-article))
-             (gnus-configure-windows 'summary))
+           (progn
+             (gnus-configure-windows 'summary)
+             (cond
+              ((eq gnus-auto-select-first 'best)
+               (gnus-summary-best-unread-article))
+              ((eq gnus-auto-select-first t)
+               (gnus-summary-first-unread-article))
+              ((gnus-functionp gnus-auto-select-first)
+               (funcall gnus-auto-select-first))))
          ;; Don't select any articles, just move point to the first
          ;; article in the group.
          (goto-char (point-min))
@@ -5824,6 +5840,16 @@ Return nil if there are no unread articles."
        (gnus-summary-display-article (gnus-summary-article-number)))
     (gnus-summary-position-point)))
 
+(defun gnus-summary-first-unread-subject ()
+  "Place the point on the subject line of the first unread article.
+Return nil if there are no unread articles."
+  (interactive)
+  (prog1
+      (when (gnus-summary-first-subject t)
+       (gnus-summary-show-thread)
+       (gnus-summary-first-subject t))
+    (gnus-summary-position-point)))
+
 (defun gnus-summary-first-article ()
   "Select the first article.
 Return nil if there are no articles."
index 9db71ae..a90aba3 100644 (file)
@@ -834,8 +834,9 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
              (eq in-state 'first-and-last))
          (progn
            (setq state (list 'begin))
-           (save-excursion (set-buffer (gnus-get-buffer-create "*gnus-uu-body*"))
-                           (erase-buffer))
+           (save-excursion
+             (set-buffer (gnus-get-buffer-create "*gnus-uu-body*"))
+             (erase-buffer))
            (save-excursion
              (set-buffer (gnus-get-buffer-create "*gnus-uu-pre*"))
              (erase-buffer)
index 6eb65fe..7925cff 100644 (file)
@@ -258,21 +258,6 @@ call it with the value of the `gnus-data' text property."
                 (delete-extent extent)
                 nil)))
 
-;; Fixed by Christopher Davis <ckd@loiosh.kei.com>.
-(defun gnus-xmas-article-add-button (from to fun &optional data)
-  "Create a button between FROM and TO with callback FUN and data DATA."
-  (when gnus-article-button-face
-    (gnus-overlay-put (gnus-make-overlay from to)
-                     'face gnus-article-button-face))
-  (gnus-add-text-properties
-   from to
-   (nconc
-    (and gnus-article-mouse-face
-        (list 'mouse-face gnus-article-mouse-face))
-    (list 'gnus-callback fun)
-    (and data (list 'gnus-data data))
-    (list 'highlight t))))
-
 (defun gnus-xmas-window-top-edge (&optional window)
   (nth 1 (window-pixel-edges window)))
 
@@ -465,7 +450,6 @@ call it with the value of the `gnus-data' text property."
   (fset 'gnus-summary-recenter 'gnus-xmas-summary-recenter)
   (fset 'gnus-extent-start-open 'gnus-xmas-extent-start-open)
   (fset 'gnus-article-push-button 'gnus-xmas-article-push-button)
-  (fset 'gnus-article-add-button 'gnus-xmas-article-add-button)
   (fset 'gnus-window-top-edge 'gnus-xmas-window-top-edge)
   (fset 'gnus-read-event-char 'gnus-xmas-read-event-char)
   (fset 'gnus-group-startup-message 'gnus-xmas-group-startup-message)
index bb0f4b9..54163e2 100644 (file)
@@ -250,7 +250,7 @@ is restarted, and sometimes reloaded."
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "0.33"
+(defconst gnus-version-number "0.34"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Pterodactyl Gnus v%s" gnus-version-number)
@@ -1703,7 +1703,8 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
       gnus-article-show-all-headers
       gnus-article-edit-mode gnus-article-edit-article
       gnus-article-edit-done gnus-article-decode-encoded-words
-      gnus-start-date-timer gnus-stop-date-timer)
+      gnus-start-date-timer gnus-stop-date-timer
+      gnus-mime-view-all-parts)
      ("gnus-int" gnus-request-type)
      ("gnus-start" gnus-newsrc-parse-options gnus-1 gnus-no-server-1
       gnus-dribble-enter gnus-read-init-file gnus-dribble-touch)
index c5249f3..7caa74f 100644 (file)
@@ -469,7 +469,7 @@ If FORCE, re-parse even if already parsed."
       (cond
        ((equal (car (car major)) minor)
        (setq exact (cons (cdr (car major)) exact)))
-       ((string-match (car (car major)) minor)
+       ((and minor (string-match (car (car major)) minor))
        (setq wildcard (cons (cdr (car major)) wildcard))))
       (setq major (cdr major)))
     (nconc (nreverse exact) (nreverse wildcard))))
index a6beb4c..f3c7de3 100644 (file)
@@ -1022,7 +1022,9 @@ The cdr of ech entry is a function for applying the face to a region.")
   (let* ((inhibit-point-motion-hooks t)
         (value (mail-fetch-field header nil (not not-all))))
     (when value
-      (nnheader-replace-chars-in-string value ?\n ? ))))
+      (while (string-match "\n[\t ]+" value)
+       (setq value (replace-match " " t t value)))
+      value)))
 
 (defun message-narrow-to-field ()
   "Narrow the buffer to the header on the current line."
@@ -2002,7 +2004,7 @@ the user from the mailer."
   (message-check 'invisible-text
     (when (text-property-any (point-min) (point-max) 'invisible t)
       (put-text-property (point-min) (point-max) 'invisible nil)
-      (unless (yes-or-no-p "Invisible text found and made visible; continue posting?")
+      (unless (yes-or-no-p "Invisible text found and made visible; continue posting? ")
        (error "Invisible text found and made visible")))))
 
 (defun message-add-action (action &rest types)
index 135b974..044f52c 100644 (file)
@@ -30,6 +30,7 @@
 (require 'mm-util)
 (require 'rfc2047)
 (require 'qp)
+(require 'uudecode)
 
 (defun mm-encode-body ()
   "Encode a body.
@@ -93,18 +94,27 @@ If no encoding was done, nil is returned."
 ;;; Functions for decoding
 ;;;
 
-(defun mm-decode-content-transfer-encoding (encoding)
+(defun mm-decode-content-transfer-encoding (encoding &optional type)
   (cond
    ((eq encoding 'quoted-printable)
     (quoted-printable-decode-region (point-min) (point-max)))
    ((eq encoding 'base64)
-    (condition-case ()
-       (base64-decode-region (point-min) (point-max))
-      (error nil)))
+    (prog1
+       (condition-case ()
+           (base64-decode-region (point-min) (point-max))
+         (error nil))
+      (when (equal type "text/plain")
+       (goto-char (point-min))
+       (while (search-forward "\r\n" nil t)
+         (replace-match "\n" t t)))))
    ((memq encoding '(7bit 8bit binary))
     )
    ((null encoding)
     )
+   ((eq encoding 'x-uuencode)
+    (condition-case ()
+       (uu-decode-region (point-min) (point-max))
+      (error nil)))
    (t
     (error "Can't decode encoding %s" encoding))))
 
index 7090855..617d331 100644 (file)
@@ -40,6 +40,7 @@
     ("text/enriched" mm-inline-text t)
     ("text/richtext" mm-inline-text t)
     ("text/html" mm-inline-text (featurep 'w3))
+    ("message/delivery-status" mm-inline-text t)
     ("audio/wav" mm-inline-audio
      (and (or (featurep 'nas-sound) (featurep 'native-sound))
          (device-sound-enabled-p)))
       (insert-buffer-substring obuf beg)
       (current-buffer))))
 
+(defun mm-inlinable-part-p (type)
+  "Say whether TYPE can be displayed inline."
+  (eq (mm-user-method type) 'inline))
+
 (defun mm-display-part (handle &optional no-default)
   "Display the MIME part represented by HANDLE."
   (save-excursion
   "Display HANDLE using METHOD."
   (mm-with-unibyte-buffer
     (insert-buffer-substring (mm-handle-buffer handle))
-    (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+    (mm-decode-content-transfer-encoding
+     (mm-handle-encoding handle) (car (mm-handle-type handle)))
     (if (functionp method)
        (let ((cur (current-buffer)))
          (switch-to-buffer (generate-new-buffer "*mm*"))
        (make-directory dir)
        (set-file-modes dir 448)
        (if filename
-           (setq file (expand-file-name (or filename "mm.") dir))
+           (setq file (expand-file-name (file-name-nondirectory filename)
+                                        dir))
          (setq file (make-temp-name (expand-file-name "mm." dir))))
        (write-region (point-min) (point-max)
                      file nil 'nomesg nil 'no-conversion)
              (if needsterm
                  (start-process "*display*" nil
                                 "xterm"
-                                "-e" (format method file))
+                                "-e" shell-file-name "-c"
+                                (format method
+                                        (mm-quote-arg file)))
                (start-process "*display*" (generate-new-buffer "*mm*")
                               shell-file-name
-                              "-c" (format method file))))
+                              "-c" (format method
+                                           (mm-quote-arg file)))))
        (mm-handle-set-undisplayer handle (cons file process))
        (message "Displaying %s..." (format method file))))))
 
@@ -318,7 +328,7 @@ This overrides entries in the mailcap file."
   "Return a version of ARG that is safe to evaluate in a shell."
   (let ((pos 0) new-pos accum)
     ;; *** bug: we don't handle newline characters properly
-    (while (setq new-pos (string-match "[!`\"$\\& \t{}]" arg pos))
+    (while (setq new-pos (string-match "[!`\"$\\& \t{} ]" arg pos))
       (push (substring arg pos new-pos) accum)
       (push "\\" accum)
       (push (list (aref arg new-pos)) accum)
@@ -335,7 +345,9 @@ This overrides entries in the mailcap file."
   "Return the contents of HANDLE as a string."
   (mm-with-unibyte-buffer
     (insert-buffer-substring (mm-handle-buffer handle))
-    (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+    (mm-decode-content-transfer-encoding
+     (mm-handle-encoding handle)
+     (car (mm-handle-type handle)))
     (buffer-string)))
 
 (defvar mm-default-directory nil)
@@ -356,7 +368,9 @@ This overrides entries in the mailcap file."
     (setq mm-default-directory (file-name-directory file))
     (mm-with-unibyte-buffer
       (insert-buffer-substring (mm-handle-buffer handle))
-      (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+      (mm-decode-content-transfer-encoding
+       (mm-handle-encoding handle)
+       (car (mm-handle-type handle)))
       (when (or (not (file-exists-p file))
                (yes-or-no-p (format "File %s already exists; overwrite? "
                                     file)))
@@ -369,7 +383,9 @@ This overrides entries in the mailcap file."
          (read-string "Shell command on MIME part: " mm-last-shell-command)))
     (mm-with-unibyte-buffer
       (insert-buffer-substring (mm-handle-buffer handle))
-      (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+      (mm-decode-content-transfer-encoding
+       (mm-handle-encoding handle)
+       (car (mm-handle-type handle)))
       (shell-command-on-region (point-min) (point-max) command nil))))
 
 (defun mm-interactively-view-part (handle)
index 1db5d60..a24d3a8 100644 (file)
@@ -206,7 +206,8 @@ See also `with-temp-file' and `with-output-to-string'."
               (get-buffer-create (generate-new-buffer-name " *temp*")))
         (unwind-protect
             (with-current-buffer ,temp-buffer
-              ,@forms)
+              (let (buffer-file-coding-system)
+                ,@forms))
           (and (buffer-name ,temp-buffer)
                (kill-buffer ,temp-buffer))
           (setq-default enable-multibyte-characters ,multibyte))))))
index 10ab086..14ec63b 100644 (file)
@@ -36,7 +36,9 @@
        buffer-read-only image)
     (mm-with-unibyte-buffer
       (insert-buffer-substring (mm-handle-buffer handle))
-      (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+      (mm-decode-content-transfer-encoding
+       (mm-handle-encoding handle)
+       (car (mm-handle-type handle)))
       (setq image (make-image-specifier
                   (vector (intern type) :data (buffer-string)))))
     (let ((annot (make-annotation image nil 'text)))
@@ -52,7 +54,9 @@
      ((equal type "plain")
       (with-temp-buffer
        (insert-buffer-substring (mm-handle-buffer handle))
-       (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+       (mm-decode-content-transfer-encoding
+        (mm-handle-encoding handle)
+        (car (mm-handle-type handle)))
        (setq text (buffer-string)))
       (let ((b (point)))
        (insert text)
@@ -74,7 +78,9 @@
        (w3-do-setup)
        (mm-with-unibyte-buffer
          (insert-buffer-substring (mm-handle-buffer handle))
-         (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+         (mm-decode-content-transfer-encoding
+          (mm-handle-encoding handle)
+          (car (mm-handle-type handle)))
          (require 'url)
          (save-window-excursion
            (w3-region (point-min) (point-max))
       (save-excursion
        (mm-with-unibyte-buffer
          (insert-buffer-substring (mm-handle-buffer handle))
-         (mm-decode-content-transfer-encoding (mm-handle-encoding handle))
+         (mm-decode-content-transfer-encoding
+          (mm-handle-encoding handle)
+          (car (mm-handle-type handle)))
          (save-window-excursion
            (enriched-decode (point-min) (point-max))
-           (setq text (buffer-string))))
-       (mm-insert-inline handle text)))
-     )))
+           (setq text (buffer-string)))))
+      (mm-insert-inline handle text))
+     (t
+      (save-excursion
+       (mm-with-unibyte-buffer
+         (insert-buffer-substring (mm-handle-buffer handle))
+         (mm-decode-content-transfer-encoding
+          (mm-handle-encoding handle)
+          (car (mm-handle-type handle)))
+         (setq text (buffer-string))))
+      (mm-insert-inline handle text)))))
 
 (defun mm-insert-inline (handle text)
   "Insert TEXT inline from HANDLE."
index 5615341..8bdae37 100644 (file)
            start end number)
        (set-buffer (setq nnbabyl-mbox-buffer
                          (nnheader-find-file-noselect
-                          nnbabyl-mbox-file nil 'raw)))
+                          nnbabyl-mbox-file nil t)))
        ;; Save previous buffer mode.
        (setq nnbabyl-previous-buffer-mode
              (cons (cons (point-min) (point-max))
index c2736a7..52e2a01 100644 (file)
   (save-excursion
     (set-buffer nntp-server-buffer)
     (erase-buffer)
-    (let* ((buf (get-buffer-create " *draft headers*"))
-          article)
-      (set-buffer buf)
-      (erase-buffer)
+    (let* (article)
       ;; We don't support fetching by Message-ID.
       (if (stringp (car articles))
          'headers
        (while articles
-         (set-buffer buf)
+         (narrow-to-region (point) (point))
          (when (nndraft-request-article
                 (setq article (pop articles)) group server (current-buffer))
            (goto-char (point-min))
                (forward-line -1)
              (goto-char (point-max)))
            (delete-region (point) (point-max))
-           (set-buffer nntp-server-buffer)
-           (goto-char (point-max))
+           (goto-char (point-min))
            (insert (format "221 %d Article retrieved.\n" article))
-           (insert-buffer-substring buf)
+           (widen)
+           (goto-char (point-max))
            (insert ".\n")))
 
        (nnheader-fold-continuation-lines)
index 7bc8c23..f3eba42 100644 (file)
@@ -487,11 +487,12 @@ parameter.  It should return nil, `warn' or `delete'."
 (defun nnmail-find-file (file)
   "Insert FILE in server buffer safely."
   (set-buffer nntp-server-buffer)
-  (erase-buffer)
+  (delete-region (point-min) (point-max))
   (let ((format-alist nil)
         (after-insert-file-functions nil))
     (condition-case ()
        (let ((coding-system-for-read nnmail-file-coding-system)
+             (auto-mode-alist (nnheader-auto-mode-alist))
              (pathname-coding-system nnmail-file-coding-system))
          (insert-file-contents file)
          t)
@@ -1094,8 +1095,7 @@ FUNC will be called with the group name to determine the article number."
                       ;; group twice.
                       (not (assoc (car method) group-art)))
                  (push (cons (if regrepp
-                                 (replace-match
-                                  (car method) nil nil (car method))
+                                 (nnmail-expand-newtext (car method))
                                (car method))
                              (funcall func (car method)))
                        group-art))
index 8617d9b..13fc297 100644 (file)
     (save-excursion
       (set-buffer (setq nnmbox-mbox-buffer
                        (nnheader-find-file-noselect
-                        nnmbox-mbox-file nil 'raw)))
+                        nnmbox-mbox-file nil t)))
       (mm-enable-multibyte)
       (buffer-disable-undo)))
   (when (not nnmbox-group-alist)
            start end number)
        (set-buffer (setq nnmbox-mbox-buffer
                          (nnheader-find-file-noselect
-                          nnmbox-mbox-file nil 'raw)))
+                          nnmbox-mbox-file nil t)))
        (mm-enable-multibyte)
        (buffer-disable-undo)
 
index dd1c312..4f92163 100644 (file)
@@ -731,7 +731,7 @@ all.  This may very well take some time.")
     (let ((dirs (directory-files dir t nil t))
          dir)
       (while (setq dir (pop dirs))
-       (when (and (not (member (file-name-nondirectory dir) '("." "..")))
+       (when (and (not (string-match "^\\." (file-name-nondirectory dir)))
                   (file-directory-p dir))
          (nnml-generate-nov-databases-1 dir seen))))
     ;; Do this directory.
index 4829341..a6e92f5 100644 (file)
@@ -436,17 +436,21 @@ If UPDATE-P is not nil, call gnus-group-update-group on the components."
                        (nnvirtual-partition-sequence
                         (gnus-list-of-unread-articles
                          (nnvirtual-current-group)))))
-         (type-marks (mapcar (lambda (ml)
-                               (cons (car ml)
-                                     (nnvirtual-partition-sequence (cdr ml))))
-                             (gnus-info-marks (gnus-get-info
-                                               (nnvirtual-current-group)))))
+         (type-marks
+          (delq nil
+                (mapcar (lambda (ml)
+                          (if (eq (car ml) 'score)
+                              nil
+                            (cons (car ml)
+                                  (nnvirtual-partition-sequence (cdr ml)))))
+                        (gnus-info-marks (gnus-get-info
+                                          (nnvirtual-current-group))))))
          mark type groups carticles info entry)
 
       ;; Ok, atomically move all of the (un)read info, clear any old
       ;; marks, and move all of the current marks.  This way if someone
       ;; hits C-g, you won't leave the component groups in a half-way state.
-      (gnus-atomic-progn
+      (progn
        ;; move (un)read
        (let ((gnus-newsgroup-active nil)) ;workaround guns-update-read-articles
          (while (setq entry (pop unreads))
@@ -457,7 +461,11 @@ If UPDATE-P is not nil, call gnus-group-update-group on the components."
        (while groups
          (when (and (setq info (gnus-get-info (pop groups)))
                     (gnus-info-marks info))
-           (gnus-info-set-marks info nil)))
+           (gnus-info-set-marks
+            info
+            (if (assq 'score (gnus-info-marks info))
+                (list (assq 'score (gnus-info-marks info)))
+              nil))))
 
        ;; Ok, currently type-marks is an assq list with keys of a mark type,
        ;; with data of an assq list with keys of component group names
index 038541c..f076aea 100644 (file)
   `(((6) parse-time-weekdays)
     ((3) (1 31))
     ((4) parse-time-months)
-    ((5) (1970 2038))
+    ((5) (100 4038))
     ((2 1 0)
      ,#'(lambda () (and (stringp elt)
                        (= (length elt) 8)
                        (= (length elt) 7)
                        (= (aref elt 1) ?:)))
      [0 1] [2 4] [5 7])
-    ((5) (70 99) ,#'(lambda () (+ 1900 elt))))
+    ((5) (50 99) ,#'(lambda () (+ 1900 elt)))
+    ((5) (0 49) ,#'(lambda () (+ 2000 elt))))
   "(slots predicate extractor...)")
 
 (defun parse-time-string (string)
diff --git a/lisp/uudecode.el b/lisp/uudecode.el
new file mode 100644 (file)
index 0000000..2be3e6a
--- /dev/null
@@ -0,0 +1,198 @@
+;;; uudecode.el -- elisp native uudecode
+;; Copyright (c) 1998 by Shenghuo Zhu <zsh@cs.rochester.edu>
+
+;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
+;; $Revision: 1.1 $
+;; Keywords: uudecode
+
+;; 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:
+;;     Lots of codes are stolen from mm-decode.el, gnus-uu.el and
+;;     base64.el
+
+;;; Code:
+
+(if (not (fboundp 'char-int))
+    (fset 'char-int 'identity))
+
+(defvar uu-decoder-program "uudecode"
+  "*Non-nil value should be a string that names a uu decoder.
+The program should expect to read uu data on its standard
+input and write the converted data to its standard output.")
+
+(defvar uu-decoder-switches nil
+  "*List of command line flags passed to the command named by uu-decoder-program.")
+
+(defvar uu-alphabet "\040-\140")
+
+(defvar uu-begin-string "^begin[ \t]+[0-7][0-7][0-7][ \t]+\\(.*\\)$")
+(defvar uu-end-string "^end[ \t]*$")
+
+(defvar uu-body-line
+  (let ((i 61) (str "^M"))
+    (while (> (setq i (1- i)) 0)
+      (setq str (concat str "[^a-z]")))
+    (concat str ".?$")))
+
+(defvar uu-temporary-file-directory "/tmp/")
+
+(defun uu-decode-region-external (start end &optional file-name)
+  "Decode uuencoded files using an external program."
+  (interactive "r\nP")
+  (let ((cbuf (current-buffer)) tempfile firstline work-buffer status) 
+    (save-excursion
+      (goto-char start)
+      (when (re-search-forward uu-begin-string nil t)
+       (forward-line 1)
+       (setq firstline (point))
+       (cond ((null file-name))
+             ((stringp file-name))
+             (t 
+              (setq file-name (read-file-name "File to Name:" 
+                                              nil nil nil 
+                                              (match-string 1)))))
+       (setq tempfile (expand-file-name
+                       (or file-name (concat uu-temporary-file-directory
+                                             (make-temp-name "uu")))))
+       (let ((cdir default-directory) default-process-coding-system)
+         (unwind-protect
+             (progn
+               (set-buffer (setq work-buffer 
+                                 (generate-new-buffer " *uudecode-work*")))
+               (buffer-disable-undo work-buffer)
+               (insert "begin 600 " (file-name-nondirectory tempfile) "\n")
+               (insert-buffer-substring cbuf firstline end)
+               (cd (file-name-directory tempfile))
+               (apply 'call-process-region
+                      (point-min)
+                      (point-max)
+                      uu-decoder-program 
+                      nil
+                      nil
+                      nil
+                      uu-decoder-switches))
+           (cd cdir) (set-buffer cbuf)))
+       (if (file-exists-p tempfile)
+           (unless file-name
+             (goto-char start)
+             (delete-region start end)
+             (let (format-alist)
+               (insert-file-contents-literally tempfile)))
+         (message "Can not uudecode")))
+      (and work-buffer (kill-buffer work-buffer))
+      (condition-case ()
+         (or file-name (delete-file tempfile))
+       (error)))))
+
+(defun uu-insert-char (char &optional count ignored buffer)
+  (condition-case nil
+      (progn
+       (insert-char char count ignored buffer)
+       (fset 'uu-insert-char 'insert-char))
+    (wrong-number-of-arguments
+     (fset 'uu-insert-char 'uu-xemacs-insert-char)
+     (uu-insert-char char count ignored buffer))))
+
+(defun uu-xemacs-insert-char (char &optional count ignored buffer)
+  (if (or (null buffer) (eq buffer (current-buffer)))
+      (insert-char char count)
+    (save-excursion
+      (set-buffer buffer)
+      (insert-char char count))))
+
+(defun uu-decode-region (start end &optional file-name)
+  (interactive "r\nP")
+  (let ((work-buffer nil)
+       (done nil)
+       (counter 0)
+       (remain 0)
+       (bits 0)
+       (lim 0) inputpos
+       (non-data-chars (concat "^" uu-alphabet)))
+    (unwind-protect
+       (save-excursion
+         (goto-char start)
+         (when (re-search-forward uu-begin-string nil t)
+           (cond ((null file-name))
+                 ((stringp file-name))
+                 (t 
+                  (setq file-name (expand-file-name 
+                                   (read-file-name "File to Name:" 
+                                                   nil nil nil 
+                                                   (match-string 1))))))
+           (setq work-buffer (generate-new-buffer " *uudecode-work*"))
+           (buffer-disable-undo work-buffer)
+           (forward-line 1)
+           (skip-chars-forward non-data-chars end)
+           (while (not done)
+             (setq inputpos (point))
+             (setq remain 0 bits 0 counter 0)
+             (cond
+              ((> (skip-chars-forward uu-alphabet end) 0)
+               (setq lim (point))
+               (setq remain 
+                     (logand (- (char-int (char-after inputpos)) 32) 63))
+               (setq inputpos (1+ inputpos))
+               (if (= remain 0) (setq done t))
+               (while (and (< inputpos lim) (> remain 0))
+                 (setq bits (+ bits 
+                               (logand 
+                                (- 
+                                 (char-int (char-after inputpos)) 32) 63)))
+                 (if (/= counter 0) (setq remain (1- remain)))
+                 (setq counter (1+ counter)
+                       inputpos (1+ inputpos))
+                 (cond ((= counter 4)
+                        (uu-insert-char (lsh bits -16) 1 nil work-buffer)
+                        (uu-insert-char (logand (lsh bits -8) 255) 1 nil
+                                        work-buffer)
+                        (uu-insert-char (logand bits 255) 1 nil
+                                        work-buffer)
+                        (setq bits 0 counter 0))
+                       (t (setq bits (lsh bits 6)))))))
+             (cond
+                (done)
+                ((> 0 remain)
+                 (error "uucode line ends unexpectly")
+                 (setq done t))
+                ((and (= (point) end) (not done))
+                 (error "uucode ends unexpectly")
+                 (setq done t))
+                ((= counter 3)
+                 (uu-insert-char (logand (lsh bits -16) 255) 1 nil 
+                                 work-buffer)
+                 (uu-insert-char (logand (lsh bits -8) 255) 1 nil
+                                 work-buffer))
+                ((= counter 2)
+                 (uu-insert-char (logand (lsh bits -10) 255) 1 nil 
+                                 work-buffer)))
+             (skip-chars-forward non-data-chars end))
+           (if file-name
+               (save-excursion
+                 (set-buffer work-buffer)
+                 (write-file file-name))
+             (or (markerp end) (setq end (set-marker (make-marker) end)))
+             (goto-char start)
+             (insert-buffer-substring work-buffer)
+             (delete-region (point) end))))
+      (and work-buffer (kill-buffer work-buffer)))))
+
+(provide 'uudecode)
+
+;;; uudecode.el ends here
index d6388cc..420b033 100644 (file)
@@ -1,3 +1,12 @@
+1998-10-01 07:55:35  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.texi (Splitting Mail): Fix.
+       (Washing Mail): Fix.
+
+1998-09-30 05:54:45  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.texi (Selecting a Group): Addition.
+
 1998-09-13 08:58:56  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * dir (File): Updated.
index 107434a..c74b8b2 100644 (file)
@@ -112,6 +112,7 @@ distclean:
        make clean
        rm -f *.orig *.rej *.elc *~ gnus gnus-[0-9] gnus-[0-9][0-9] Makefile
        rm -f message message-[0-9]
+       rm -f emacs-mime
 
 install:
        $(SHELL) $(top_srcdir)/mkinstalldirs $(infodir)
index f333fa5..8a09c30 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo                  @c -*-texinfo-*-
 
-@setfilename message
+@setfilename emacs-mime
 @settitle Emacs MIME Manual
 @synindex fn cp
 @synindex vr cp
@@ -639,7 +639,7 @@ 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.
+returned as a result of this analysis.
 
 @menu
 * Dissection::  Analyzing a @sc{mime} message.
index affbed6..a315f96 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename gnus
-@settitle Pterodactyl Gnus 0.33 Manual
+@settitle Pterodactyl Gnus 0.34 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -318,7 +318,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Pterodactyl Gnus 0.33 Manual
+@title Pterodactyl Gnus 0.34 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -354,7 +354,7 @@ can be gotten by any nefarious means you can think of---@sc{nntp}, local
 spool or your mbox file.  All at the same time, if you want to push your
 luck.
 
-This manual corresponds to Pterodactyl Gnus 0.33.
+This manual corresponds to Pterodactyl Gnus 0.34.
 
 @end ifinfo
 
@@ -1495,8 +1495,26 @@ Select the first unread article when entering the group.
 @item best
 Select the highest scored article in the group when entering the
 group.
+
+@end table
+
+This variable can also be a function.  In that case, that function will
+be called to place point on a subject line, and/or select some article.
+Useful functions include:
+
+@table @code
+@item gnus-summary-first-unread-subject
+Place point on the subject line of the first unread article, but
+don't select the article.
+
+@item gnus-summary-first-unread-article
+Select the first unread article.
+
+@item gnus-summary-best-unread-article
+Select the highest-scored unread article.
 @end table
 
+
 If you want to prevent automatic selection in some group (say, in a
 binary group with Huge articles) you can set this variable to @code{nil}
 in @code{gnus-select-group-hook}, which is called when a group is
@@ -3245,7 +3263,12 @@ variable as a function for getting the name and address parts of a
 fast, and too simplistic solution; and
 @code{mail-extract-address-components}, which works very nicely, but is
 slower.  The default function will return the wrong answer in 5% of the
-cases.  If this is unacceptable to you, use the other function instead.
+cases.  If this is unacceptable to you, use the other function instead:
+
+@lisp
+(setq gnus-extract-address-components
+      'mail-extract-address-components)
+@end lisp
 
 @vindex gnus-summary-same-subject
 @code{gnus-summary-same-subject} is a string indicating that the current
@@ -4175,7 +4198,7 @@ You can set a bookmark in the current article.  Say you are reading a
 long thesis on cats' urinary tracts, and have to go home for dinner
 before you've finished reading the thesis.  You can then set a bookmark
 in the article, and Gnus will jump to this bookmark the next time it
-encounters the article.  @xref{Setting Marks}
+encounters the article.  @xref{Setting Marks}.
 
 @item
 @vindex gnus-replied-mark
@@ -4186,7 +4209,7 @@ answered) will be marked with an @samp{A} in the second column
 @item
 @vindex gnus-cached-mark
 Articles stored in the article cache will be marked with an @samp{*} in
-the second column (@code{gnus-cached-mark}).  @xref{Article Caching}
+the second column (@code{gnus-cached-mark}).  @xref{Article Caching}.
 
 @item
 @vindex gnus-saved-mark
@@ -4243,7 +4266,7 @@ article as unread.
 @kindex M t (Summary)
 @findex gnus-summary-tick-article-forward
 Tick the current article (@code{gnus-summary-tick-article-forward}).
-@xref{Article Caching}
+@xref{Article Caching}.
 
 @item M ?
 @itemx ?
@@ -4251,7 +4274,7 @@ Tick the current article (@code{gnus-summary-tick-article-forward}).
 @kindex M ? (Summary)
 @findex gnus-summary-mark-as-dormant
 Mark the current article as dormant
-(@code{gnus-summary-mark-as-dormant}).  @xref{Article Caching}
+(@code{gnus-summary-mark-as-dormant}).  @xref{Article Caching}.
 
 @item M d
 @itemx d
@@ -6513,7 +6536,7 @@ last.
 @kindex W b (Summary)
 @findex gnus-article-add-buttons
 Add clickable buttons to the article (@code{gnus-article-add-buttons}).
-@xref{Article Buttons}
+@xref{Article Buttons}.
 
 @item W B
 @kindex W B (Summary)
@@ -6803,6 +6826,11 @@ groups where people post using some common encoding (but do not include
 MIME headers), you can set the @code{charset} group/topic parameter to
 the required charset (@pxref{Group Parameters}).
 
+@item W M v
+@kindex W M v (Summary)
+View all the @sc{mime} parts in the current article
+(@code{gnus-mime-view-all-parts}). 
+
 @end table
 
 
@@ -9521,7 +9549,7 @@ contain @samp{\\1} forms, like the ones used by @code{replace-match} to
 insert sub-expressions from the matched text.  For instance:
 
 @lisp
-("list.\\1" "From:.*\\(.*\\)-list@@majordomo.com")
+("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com")
 @end lisp
 
 The second element can also be a function.  In that case, it will be
@@ -9640,11 +9668,6 @@ file, which is @file{~/.gnus-crash-box} by default.  If this file
 already exists, it will always be read (and incorporated) before any
 other spool files.
 
-@vindex nnmail-prepare-incoming-hook
-@item nnmail-prepare-incoming-hook
-This is run in a buffer that holds all the new incoming mail, and can be
-used for, well, anything, really.
-
 @vindex nnmail-split-hook
 @item nnmail-split-hook
 @findex article-decode-encoded-words
@@ -10129,7 +10152,8 @@ various functions that can be put in these hooks.
 @item nnmail-prepare-incoming-hook
 @vindex nnmail-prepare-incoming-hook
 This hook is called before doing anything with the mail and is meant for
-grand, sweeping gestures.  Functions to be used include:
+grand, sweeping gestures.  It is called in a buffer that contains all
+the new, incoming mail.  Functions to be used include:
 
 @table @code
 @item nnheader-ms-strip-cr
@@ -11485,6 +11509,7 @@ Of course, to use it as such, you have to learn a few new commands.
 * Agent Variables::        Customizing is fun.
 * Example Setup::          An example @file{.gnus.el} file for offline people.
 * Batching Agents::        How to fetch news from a @code{cron} job.
+* Agent Caveats::          What you think it'll do and what it does.
 @end menu
 
 
@@ -11547,7 +11572,7 @@ Agent (@pxref{Server Agent Commands}).  This will typically be only the
 primary select method, which is listed on the bottom in the buffer.
 
 @item
-Decide on download policy.  @xref{Agent Categories}
+Decide on download policy.  @xref{Agent Categories}.
 
 @item
 Uhm... that's it.
@@ -11753,7 +11778,6 @@ if it's to be specific to that group.
 In both of these places the @code{download score rule} can take one of
 three forms:
 
-@table @code
 @enumerate
 @item 
 Score rule
@@ -11849,7 +11873,6 @@ Group Parameter specification
 @end lisp
 @end itemize
 @end enumerate
-@end table
  
 @node The Category Buffer
 @subsubsection The Category Buffer
@@ -12001,7 +12024,7 @@ Fetch all eligible articles in all groups
 @kindex J S (Agent Group)
 @findex gnus-group-send-drafts
 Send all sendable messages in the draft group
-(@code{gnus-agent-fetch-session}).  @xref{Drafts}
+(@code{gnus-agent-fetch-session}).  @xref{Drafts}.
 
 @item J a
 @kindex J a (Agent Group)
@@ -12183,6 +12206,29 @@ emacs -batch -l ~/.emacs -f gnus-agent-batch >/dev/null
 @end example
 
 
+@node Agent Caveats
+@subsection Agent Caveats
+
+The Gnus Agent doesn't seem to work like most other offline
+newsreaders.  Here are some common questions that some imaginary people
+may ask:
+
+@table @dfn
+@item If I read an article while plugged, do they get entered into the
+Agent?
+
+@strong{No.}
+
+@item If I read an article while plugged, and the article already exists
+in the Agent, will it get downloaded once more?
+
+@strong{Yes.}
+
+@end table
+
+In short, when Gnus is unplugged, it only looks into the locally stored
+articles; when it's plugged, it only talks to your ISP.
+
 
 @node Scoring
 @chapter Scoring
@@ -18149,6 +18195,10 @@ like.
 @item
 Bouncing articles should do MIME.
 
+@item
+Crossposted articles should "inherit" the % or @ mark from the other
+groups it has been crossposted to, or something.  (Agent.)
+
 @item
 Solve the halting problem.
 
index a0dc854..72963c0 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename message
-@settitle Pterodactyl Message 0.33 Manual
+@settitle Pterodactyl Message 0.34 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -42,7 +42,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Pterodactyl Message 0.33 Manual
+@title Pterodactyl Message 0.34 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -83,7 +83,7 @@ Message mode buffers.
 * Key Index::         List of Message mode keys.
 @end menu
 
-This manual corresponds to Pterodactyl Message 0.33.  Message is
+This manual corresponds to Pterodactyl Message 0.34.  Message is
 distributed with the Gnus distribution bearing the same version number
 as this manual.
 
diff --git a/texi/pagestyle.sty b/texi/pagestyle.sty
new file mode 100644 (file)
index 0000000..ffd4529
--- /dev/null
@@ -0,0 +1,85 @@
+\def\verbatim@font{\fontencoding{OT1}\fontfamily{pcr}\fontsize{10pt}{10}\selectfont}
+
+\catcode `\÷ = \active
+\def ÷{\penalty10000\hskip0.001pt-\penalty\hyphenpenalty\hskip0.001pt\relax}
+
+\def \newpagestyle#1#2#3{\@namedef{ps@#1}{\def\@oddhead{#2}\def\@oddfoot{#3}%
+       \let\@evenhead\@oddhead \let\@evenfoot\@oddfoot}}
+\def \newdoublepagestyle#1#2#3#4#5{\@namedef{ps@#1}{\def\@evenhead{#2}%
+       \def\@oddhead{#3}%
+       \def\@evenfoot{#4}%
+       \def\@oddfoot{#5}}}
+
+\newlength{\headtextwidth}
+\setlength{\headtextwidth}{\textwidth}
+\addtolength{\headtextwidth}{2cm}
+\newlength{\headetextwidth}
+\setlength{\headetextwidth}{\headtextwidth}
+\addtolength{\headetextwidth}{-0.5cm}
+\newlength{\headotextwidth}
+\setlength{\headotextwidth}{\headtextwidth}
+\addtolength{\headotextwidth}{-0.35cm}
+\def\outputpage{%
+  \let \protect \noexpand
+  \shipout \vbox{%
+    \set@typeset@protect
+    \aftergroup\set@typeset@protect
+    \@shipoutsetup
+    \@begindvi
+    \vskip \topmargin
+    \moveright\@themargin \vbox {%
+      \setbox\@tempboxa \vbox to\headheight{%
+        \vfil
+        \color@hbox
+          \normalcolor
+          \hb@xt@ \headtextwidth {%
+            \let \label \@gobble
+            \let \index \@gobble
+            \let \glossary \@gobble %% 21 Jun 91
+            \@thehead
+            }%
+        \color@endbox
+        }%                        %% 22 Feb 87
+      \ifodd\c@page
+         \dp\@tempboxa \z@
+         \box\@tempboxa \mbox{} \\
+        \ifx \@oddhead\@empty\else
+   %      \rule{\headotextwidth}{0.5pt}
+         \fi
+      \else
+        \hskip -2.2cm
+         \dp\@tempboxa \z@
+         \box\@tempboxa \mbox{}
+       \\\mbox{}
+        \vskip 2pt
+        \hskip -2.0cm 
+        \ifx \@oddhead\@empty\else
+    %     \rule{\headetextwidth}{0.5pt}
+         \fi
+      \fi  
+      \vskip \headsep
+      \box\@outputbox
+      \baselineskip \footskip
+      \color@hbox
+        \normalcolor
+        \hb@xt@\textwidth{%
+          \let \label \@gobble
+          \let \index \@gobble      %% 22 Feb 87
+          \let \glossary \@gobble   %% 21 Jun 91
+          \@thefoot
+          }%
+      \color@endbox
+      }%
+    }%
+  \global \@colht \textheight
+  \stepcounter{page}%
+  \let\firstmark\botmark
+}
+
+\def\@makechapterhead#1{\gnuspagechapter{#1}}
+
+\setcounter{tocdepth}{3}
+\setcounter{secnumdepth}{3}
+
+\def\verbatim@font{\fontfamily{bcr}\fontsize{10pt}{10}\selectfont}
diff --git a/texi/pixidx.sty b/texi/pixidx.sty
new file mode 100644 (file)
index 0000000..13be2e5
--- /dev/null
@@ -0,0 +1,229 @@
+% SHOWIDX DOCUMENT-STYLE OPTION - released 16 June 1991
+%    for LaTeX version 2.09
+% Copyright (C) 1985, 1988, 1989, 1991 by Leslie Lamport
+% Modified by Lars Ingebrigtsen 1993
+%
+% Prints \index entries in outer margin. For use with book or report
+% style.  Note: makes \flushbottom the default.
+
+\typeout{Document style option `showidx' - released 16 June 1991}
+\typeout{Modified for use in eyesore.}
+
+\newbox\eye@boxa
+\newbox\eye@boxb
+\newbox\eye@boxc
+\newbox\eye@boxd
+\newbox\eye@boxe
+\newbox\eye@boxf
+\newbox\eye@boxg
+\newbox\eye@box
+\newbox\new@box
+
+  \global \setbox \eye@boxa \hbox{}
+  \global \setbox \eye@boxb \hbox{}
+  \global \setbox \eye@boxc \hbox{}
+  \global \setbox \eye@boxd \hbox{}
+  \global \setbox \eye@boxe \hbox{}
+  \global \setbox \eye@boxf \hbox{}
+  \global \setbox \eye@boxg \hbox{}
+
+\newdimen\eye@boxadim \global\eye@boxadim\z@
+\newdimen\eye@boxbdim \global\eye@boxbdim\z@
+\newdimen\eye@boxcdim \global\eye@boxcdim\z@
+\newdimen\eye@boxddim \global\eye@boxddim\z@
+\newdimen\eye@boxedim \global\eye@boxedim\z@
+\newdimen\eye@boxfdim \global\eye@boxfdim\z@
+\newdimen\eye@boxgdim \global\eye@boxgdim\z@
+
+\newdimen\gnus@horiz \global\gnus@horiz\z@
+\newdimen\gnus@vert \global\gnus@vert\z@
+
+
+\newdimen\eye@height
+\global\eye@height\textheight
+% \global\advance\eye@height 8cm
+
+\newdimen\eyeins@height
+\global\eyeins@height\z@
+
+\newdimen\eye@adjust
+\global\eye@adjust 0cm
+
+\newinsert\indexbox
+\dimen\indexbox=\maxdimen
+
+\newinsert\gnusbox
+\dimen\gnusbox=\maxdimen
+
+\newdimen\eye@dim
+\newdimen\new@dim
+\newdimen\doinsert
+
+\newdimen\eye@strutd
+\def\eye@strut#1{%
+  \eye@strutd#1
+  \advance\eye@strutd\eye@adjust
+  \advance\eye@strutd -1mm
+  \raisebox{-\eye@strutd}[0pt][0pt]{\rule{1mm}{\eye@strutd}}
+}
+
+\newdimen\eye@tmpd
+\newbox\eye@tmpba
+\newbox\eye@tmpbb
+\def\eye@insbox#1#2#3{%
+  \eye@dim#2
+  \advance\eye@dim\ht#3
+  \advance\eye@dim\eye@adjust
+  \ifdim \eye@dim < \eye@height 
+    \global#2\eye@dim
+    \global\setbox#1
+       \hbox{\unhbox#1
+%             \eye@strut{\ht#3}
+             \unhbox#3
+             \vrule \@height 1cm \@width\z@}
+    \setbox #3 \hbox{}
+  \fi}
+
+\def\@showidx#1{
+  \setbox\new@box\hbox{#1}
+  % \typeout{Vi er i showidx.}
+  \new@dim\z@
+  \ifdim \ht\new@box > \z@
+    \eye@insbox\eye@boxa\eye@boxadim\new@box 
+    \ifdim \ht\new@box > \z@
+    \eye@insbox\eye@boxb\eye@boxbdim\new@box 
+    \ifdim \ht\new@box > \z@
+    \eye@insbox\eye@boxc\eye@boxcdim\new@box 
+    \ifdim \ht\new@box > \z@
+    \eye@insbox\eye@boxd\eye@boxddim\new@box 
+    \ifdim \ht\new@box > \z@
+    \eye@insbox\eye@boxe\eye@boxedim\new@box 
+    \ifdim \ht\new@box > \z@
+    \eye@insbox\eye@boxf\eye@boxfdim\new@box 
+    \ifdim \ht\new@box > \z@
+    \eye@insbox\eye@boxg\eye@boxgdim\new@box 
+    \ifdim \ht\new@box > \z@
+    \else
+      \typeout{Discarding index.}
+    \fi\fi\fi\fi\fi\fi\fi
+  \fi
+
+    \doinsert \z@
+    \ifdim \eyeins@height > \z@
+      \eye@dim\eyeins@height
+      \advance\eye@dim\eye@boxadim
+      \ifdim \eye@dim < \eye@height 
+         \global\eyeins@height\eye@dim
+         \doinsert 1pt
+      \fi
+   \else
+     \doinsert 1pt
+     \global\eyeins@height\eye@boxadim
+   \fi
+
+  \ifdim \ht\eye@boxa > \z@
+  
+    \ifdim \doinsert > \z@
+%      \typeout{Vi inserter i indexbox.}
+      \insert\indexbox{
+         \small
+         \hsize\marginparwidth
+         \hangindent\marginparsep 
+         \parindent\z@
+         \parfillskip\@flushglue
+         \everypar{}\let\par\@@par 
+         \lineskip\normallineskip
+         \baselineskip .8\normalbaselineskip
+         \ifodd\c@page\raggedleft\else\raggedright\fi
+         \leavevmode
+         \relax
+         \unhbox\eye@boxa
+         \relax
+      }
+      \global \setbox \eye@boxa \copy\eye@boxb
+      \global \setbox \eye@boxb \copy\eye@boxc
+      \global \setbox \eye@boxc \copy\eye@boxd
+      \global \setbox \eye@boxd \copy\eye@boxe
+      \global \setbox \eye@boxe \copy\eye@boxf
+      \global \setbox \eye@boxf \copy\eye@boxg
+      \global \setbox \eye@boxg \hbox{}
+      \global \eye@boxadim\eye@boxbdim
+      \global \eye@boxbdim\eye@boxcdim
+      \global \eye@boxcdim\eye@boxddim
+      \global \eye@boxddim\eye@boxedim
+      \global \eye@boxedim\eye@boxfdim
+      \global \eye@boxfdim\eye@boxgdim
+      \global \eye@boxgdim\z@
+    \fi
+  \fi
+
+}
+
+\def\@rightidx{\hskip\columnwidth \hskip\marginparsep}
+\def\@leftidx{\hskip-\marginparsep \hskip-\marginparwidth}
+
+\def\@mkidx{
+
+%  \typeout{Vi er i mkidx 1.}
+
+  \vbox to \z@{
+    \vskip \gnus@vert
+    \hbox{
+      \hskip \gnus@horiz
+      \box\gnusbox
+    }\vss
+  }
+  \vbox to \z@{ 
+    \ifdim \eyeins@height < \textheight
+      \eye@dim \textheight
+      \advance \eye@dim -\eyeins@height
+%      \vskip \eye@dim
+    \else 
+      \eye@dim \eye@height
+      \advance \eye@dim -3cm
+      \ifdim \eyeins@height > \eye@dim
+      %   \vskip -3cm
+    \fi\fi
+    \hbox{
+      \ifodd\c@page \@rightidx \else \@leftidx \fi
+      \box\indexbox
+    }\vss
+  }
+
+  \global\eyeins@height\z@
+
+}
+
+\def\raggedbottom{\def\@textbottom{\vskip
+      \z@ plus.0001fil}\let\@texttop\@mkidx}
+\def\flushbottom{\let\@textbottom\relax \let\@texttop\@mkidx}
+
+\def\margindex#1{\@bsphack
+\begingroup\@sanitize\catcode32=10\relax\@showidx{#1}
+ \endgroup\@esphack}
+
+\def\@gnusfig#1{
+  \insert\gnusbox{
+     \small
+     \hsize\textwidth
+     \hangindent\marginparsep 
+     \parindent\z@
+     \parfillskip\@flushglue
+     \everypar{}\let\par\@@par 
+     \lineskip\normallineskip
+     \baselineskip .8\normalbaselineskip
+     \ifodd\c@page\raggedleft\else\raggedright\fi
+     \leavevmode
+     \relax
+     #1
+     \relax
+  }
+}
+
+\def\gnusfig#1#2#3{\@bsphack
+\begingroup\@sanitize\catcode32=10\relax\@gnusfig{#3}\global\gnus@horiz#1 \global\gnus@vert#2
+ \endgroup\@esphack}
+
+\flushbottom
+
+\endinput
diff --git a/texi/ps/gnus-big-logo.eps b/texi/ps/gnus-big-logo.eps
new file mode 100644 (file)
index 0000000..88ea3b8
--- /dev/null
@@ -0,0 +1,213 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%Creator: Adobe Illustrator 88(TM) format generated by CorelTRACE Version 2.0C
+%%Title:  /home/menja/c/larsi/rgnus/texi/ps/eegnu.eps
+%%BoundingBox: 0 0 890.3 909.7
+%%CreationDate: Fri Oct 11 14:59:05 1996
+%%DocumentFonts:
+%%ColorUsage: B & W
+%%TileBox: 0 0 890.3 909.7
+%%EndComments
+%%BeginProcSet:Adobe_Illustrator_1.1 0 0
+% Copyright 1992 Corel Corporation.
+
+% All rights reserved.
+/wPSMDict 150 dict def
+wPSMDict begin
+/bd {bind def} bind def
+/ld {load def} bd
+/xd {exch def} bd
+/_ null def
+/$c 0 def
+/$m 0 def
+/$y 0 def
+/$k 0 def
+/$t 1 def
+/$n _ def
+/$o 0 def
+/$C 0 def
+/$M 0 def
+/$Y 0 def
+/$K 0 def
+/$T 1 def
+/$N _ def
+/$O 0 def
+/$h false def
+/$al 0 def
+/$tr 0 def
+/$le 0 def
+/$lx 0 def
+/$ly 0 def
+/$ctm matrix currentmatrix def
+/@cp /closepath ld
+/@gs /gsave ld
+/@gr /grestore ld
+/@MN {2 copy le{pop}{exch pop}ifelse}bd
+/setcmykcolor where {pop}{/setcmykcolor{4 1 roll
+3 {3 index add 1 @MN 1 exch sub 3 1 roll} repeat
+setrgbcolor
+pop}bd}ifelse
+/@tc{dup 1 ge{pop}{4 {dup
+6 -1 roll
+mul
+exch}repeat
+pop}ifelse}bd
+/@scc{$c $m $y $k $t @tc setcmykcolor true}bd
+/@SCC{$C $M $Y $K $T @tc setcmykcolor true}bd
+/@sm{/$ctm $ctm currentmatrix def}bd
+/x {/$t xd /$n xd
+/$k xd /$y xd /$m xd /$c xd}bd
+/X {/$T xd /$N xd
+/$K xd /$Y xd /$M xd /$C xd}bd
+/g {1 exch sub 0 0 0
+4 -1 roll
+_ 1 x}bd
+/G {1 exch sub 0 0 0
+4 -1 roll
+_ 1 X}bd
+/k {_ 1 x}bd
+/K {_ 1 X}bd
+/d /setdash ld
+/i {dup 0 ne {setflat} {pop} ifelse}bd
+/j /setlinejoin ld
+/J /setlinecap ld
+/M /setmiterlimit ld
+/w /setlinewidth ld
+/O {/$o xd}bd
+/R {/$O xd}bd
+/c /curveto ld
+/C /c ld
+/l /lineto ld
+/L /l ld
+/m /moveto ld
+/n /newpath ld
+/N /newpath ld
+/F {@scc{eofill}if n} bd
+/f {@cp F}bd
+/S {@SCC{stroke}if n} bd
+/s {@cp
+S}bd
+/B {@gs F @gr
+S}bd
+/b {@cp B }bd
+/u {}bd
+/U {}bd
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+1 i
+2 J
+0 j
+4 M
+[]0 d
+
+%%Note: traced as Normal_Outline
+0 g
+163.4 2.9 m
+197.1 51.5 223.7 94.3 251.6 130.7 C
+283.4 176.1 312.0 216.3 342.8 256.8 C
+373.2 303.2 401.1 342.1 420.0 396.9 C
+421.2 403.1 425.1 408.9 424.5 413.5 C
+395.6 371.6 368.4 326.2 337.2 285.0 C
+306.1 247.4 276.3 199.4 244.5 161.5 C
+212.1 116.7 182.9 79.1 168.6 20.4 C
+166.3 13.9 164.7 8.1 162.4 2.2 C
+162.4 2.2 163.4 2.9 163.4 2.9 C
+f
+0 g
+428.1 170.2 m
+428.1 170.2 429.7 170.2 430.0 170.5 C
+454.7 211.4 474.8 275.6 504.0 301.9 C
+512.1 300.6 515.0 280.8 527.3 283.1 C
+534.8 284.4 536.4 284.1 542.9 288.9 C
+571.4 331.1 600.3 374.5 623.6 423.2 C
+640.2 454.7 661.6 492.9 663.5 517.6 C
+660.3 515.6 L
+633.7 468.6 613.2 419.6 582.4 378.4 C
+572.1 367.1 566.5 352.8 550.7 348.3 C
+543.2 348.3 536.1 354.4 530.5 363.8 C
+528.9 367.1 528.9 368.1 525.4 369.7 C
+495.5 333.7 466.7 282.8 446.5 233.5 C
+436.2 206.2 433.2 190.0 427.4 170.5 C
+427.4 170.5 428.1 170.2 428.1 170.2 C
+f
+0 g
+754.7 271.7 m
+783.8 345.7 780.3 386.2 794.2 447.5 C
+806.2 497.1 819.2 543.8 843.5 614.9 C
+869.5 690.4 875.0 731.0 888.0 787.1 C
+892.5 826.7 892.8 865.9 869.5 898.7 C
+853.9 908.7 841.9 912.3 822.1 909.4 C
+785.5 890.2 764.1 846.4 749.8 799.7 C
+750.4 793.6 750.8 791.3 755.0 788.1 C
+755.6 788.1 756.9 788.1 757.9 788.1 C
+772.8 803.3 773.8 842.9 796.8 849.0 C
+817.6 849.0 826.3 847.7 840.3 834.8 C
+855.8 799.7 856.2 789.4 858.1 755.0 C
+855.2 687.5 836.7 643.7 819.8 576.9 C
+801.7 513.7 781.9 454.3 772.8 406.7 C
+766.3 361.6 755.0 332.4 754.0 271.7 C
+754.0 271.7 754.7 271.7 754.7 271.7 C
+f
+0 g
+383.0 484.8 m
+421.2 539.0 420.6 593.1 405.4 650.9 C
+395.0 674.5 382.7 683.6 367.7 695.0 C
+354.8 681.0 339.2 664.2 330.1 640.2 C
+330.1 640.2 330.1 638.5 330.4 638.2 C
+351.5 628.8 372.3 592.2 378.1 567.2 C
+381.0 544.5 378.8 505.2 382.3 484.8 C
+382.3 484.8 383.0 484.8 383.0 484.8 C
+f
+0 g
+120.6 509.8 m
+171.2 511.7 215.0 550.7 255.8 589.6 C
+283.4 609.7 302.2 627.8 315.8 663.5 C
+280.8 636.9 238.3 595.7 192.6 571.7 C
+179.6 566.2 162.4 565.6 147.8 570.4 C
+139.4 578.2 136.2 580.5 136.5 588.6 C
+144.6 635.3 192.3 684.3 217.6 724.8 C
+223.4 738.1 235.7 745.9 238.3 758.9 C
+204.3 726.8 174.1 677.1 147.5 634.3 C
+127.1 600.3 95.3 560.1 102.1 520.5 C
+107.0 510.8 111.8 513.7 120.6 509.8 C
+f
+0 g
+621.7 657.7 m
+669.0 661.2 703.4 716.1 724.8 769.6 C
+730.7 779.0 728.7 785.5 731.3 792.9 C
+711.8 758.5 695.0 728.4 656.7 720.9 C
+638.2 720.3 635.0 721.9 624.9 732.6 C
+621.7 736.5 620.4 739.4 618.1 744.3 C
+588.6 683.0 L
+593.1 671.6 598.3 665.5 608.1 661.9 C
+612.0 661.6 617.8 659.0 621.7 657.7 C
+f
+0 g
+502.0 681.0 m
+526.7 680.4 547.7 694.7 565.2 716.1 C
+576.0 734.9 583.1 755.0 592.2 775.4 C
+592.2 779.6 591.5 783.2 592.8 786.8 C
+582.4 775.7 571.4 752.7 549.7 746.5 C
+520.8 736.2 500.7 751.4 481.6 766.7 C
+440.4 802.3 416.7 847.7 366.8 868.5 C
+346.3 878.2 335.0 875.6 319.1 869.5 C
+300.3 862.7 292.8 850.7 279.2 833.8 C
+285.0 838.3 271.7 828.6 277.2 833.5 C
+268.5 845.8 244.2 875.3 220.8 881.1 C
+168.6 888.3 147.5 809.8 96.3 789.4 C
+83.3 784.8 72.0 776.7 61.2 781.6 C
+41.5 794.2 38.2 804.6 27.5 824.1 C
+2.2 764.7 L
+9.0 751.1 16.8 730.3 32.1 725.1 C
+45.0 720.3 55.1 721.6 68.1 727.1 C
+91.1 745.2 116.4 758.9 132.0 779.3 C
+140.1 789.4 146.5 797.5 157.6 808.5 C
+166.3 816.6 176.1 823.1 187.7 827.0 C
+219.2 813.0 240.6 789.7 259.1 759.5 C
+275.3 782.5 284.7 815.0 321.4 810.1 C
+373.9 801.4 405.0 751.7 443.6 715.1 C
+462.8 694.7 478.3 687.2 502.0 681.0 C
+f
+%%Trailer
+end
+showpage
diff --git a/texi/ps/gnus-head.eps b/texi/ps/gnus-head.eps
new file mode 100644 (file)
index 0000000..82206f8
--- /dev/null
@@ -0,0 +1,150 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%Creator: Adobe Illustrator 88(TM) format generated by CorelTRACE Version 2.0C
+%%Title:  /home/menja/c/larsi/gnus-head.eps
+%%BoundingBox: 0 0 430.6 312.5
+%%CreationDate: Sat Feb  3 13:06:12 1996
+%%DocumentFonts:
+%%ColorUsage: B & W
+%%TileBox: 0 0 430.6 312.5
+%%EndComments
+%%BeginProcSet:Adobe_Illustrator_1.1 0 0
+% Copyright 1992 Corel Corporation.
+
+% All rights reserved.
+/wPSMDict 150 dict def
+wPSMDict begin
+/bd {bind def} bind def
+/ld {load def} bd
+/xd {exch def} bd
+/_ null def
+/$c 0 def
+/$m 0 def
+/$y 0 def
+/$k 0 def
+/$t 1 def
+/$n _ def
+/$o 0 def
+/$C 0 def
+/$M 0 def
+/$Y 0 def
+/$K 0 def
+/$T 1 def
+/$N _ def
+/$O 0 def
+/$h false def
+/$al 0 def
+/$tr 0 def
+/$le 0 def
+/$lx 0 def
+/$ly 0 def
+/$ctm matrix currentmatrix def
+/@cp /closepath ld
+/@gs /gsave ld
+/@gr /grestore ld
+/@MN {2 copy le{pop}{exch pop}ifelse}bd
+/setcmykcolor where {pop}{/setcmykcolor{4 1 roll
+3 {3 index add 1 @MN 1 exch sub 3 1 roll} repeat
+setrgbcolor
+pop}bd}ifelse
+/@tc{dup 1 ge{pop}{4 {dup
+6 -1 roll
+mul
+exch}repeat
+pop}ifelse}bd
+/@scc{$c $m $y $k $t @tc setcmykcolor true}bd
+/@SCC{$C $M $Y $K $T @tc setcmykcolor true}bd
+/@sm{/$ctm $ctm currentmatrix def}bd
+/x {/$t xd /$n xd
+/$k xd /$y xd /$m xd /$c xd}bd
+/X {/$T xd /$N xd
+/$K xd /$Y xd /$M xd /$C xd}bd
+/g {1 exch sub 0 0 0
+4 -1 roll
+_ 1 x}bd
+/G {1 exch sub 0 0 0
+4 -1 roll
+_ 1 X}bd
+/k {_ 1 x}bd
+/K {_ 1 X}bd
+/d /setdash ld
+/i {dup 0 ne {setflat} {pop} ifelse}bd
+/j /setlinejoin ld
+/J /setlinecap ld
+/M /setmiterlimit ld
+/w /setlinewidth ld
+/O {/$o xd}bd
+/R {/$O xd}bd
+/c /curveto ld
+/C /c ld
+/l /lineto ld
+/L /l ld
+/m /moveto ld
+/n /newpath ld
+/N /newpath ld
+/F {@scc{eofill}if n} bd
+/f {@cp F}bd
+/S {@SCC{stroke}if n} bd
+/s {@cp
+S}bd
+/B {@gs F @gr
+S}bd
+/b {@cp B }bd
+/u {}bd
+/U {}bd
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+1 i
+2 J
+0 j
+4 M
+[]0 d
+
+%%Note: traced as Normal_Outline
+0 g
+267.8 10.0 m
+291.8 50.8 294.2 95.0 278.8 136.8 C
+270.2 147.3 264.9 154.5 252.4 156.9 C
+227.0 119.5 L
+256.3 98.8 267.3 63.3 264.0 12.4 C
+264.4 10.5 265.9 9.1 265.9 9.1 C
+265.9 9.1 267.8 10.0 267.8 10.0 C
+f
+0 g
+79.2 40.3 m
+116.6 43.6 150.2 75.3 180.9 103.6 C
+197.2 121.4 204.0 133.4 217.9 150.7 C
+216.4 151.2 215.0 152.1 213.1 152.1 C
+178.0 128.6 147.3 81.1 102.2 86.8 C
+98.4 88.8 95.0 89.2 92.6 92.1 C
+87.3 120.4 126.2 159.8 141.1 182.8 C
+148.8 193.4 159.3 203.0 159.8 217.4 C
+131.0 190.0 98.8 140.6 71.5 90.7 C
+65.2 76.3 58.0 67.6 63.3 53.7 C
+68.6 45.1 70.5 43.2 79.2 40.3 C
+f
+0 g
+355.6 161.2 m
+376.3 159.3 388.3 171.8 404.6 184.3 C
+412.3 201.1 422.4 223.2 423.3 237.6 C
+416.6 234.2 410.8 229.4 405.1 217.4 C
+399.8 211.6 386.8 206.8 378.7 207.8 C
+334.0 206.4 308.1 288.4 252.4 297.1 C
+236.1 299.5 229.9 291.8 214.5 285.6 C
+203.0 270.2 L
+193.4 281.7 175.2 306.7 147.8 303.3 C
+115.2 279.8 101.2 238.5 57.6 230.8 C
+42.7 235.2 26.8 240.9 21.1 253.4 C
+19.6 257.7 19.6 260.1 16.8 262.5 C
+14.4 259.2 12.9 257.7 11.5 253.4 C
+20.1 231.8 12.4 207.8 31.6 190.5 C
+45.6 184.8 60.4 188.1 74.8 201.6 C
+103.6 220.3 113.2 256.3 142.5 259.2 C
+164.1 248.1 178.5 237.1 189.1 214.0 C
+208.8 241.9 L
+225.6 253.4 243.8 250.0 262.0 241.4 C
+294.2 215.0 325.9 167.5 355.6 161.2 C
+f
+%%Trailer
+end
+showpage
diff --git a/texi/splitindex b/texi/splitindex
new file mode 100755 (executable)
index 0000000..956ad3d
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/sh
+match='M-x |(Group)|(Summary)|(Article)|(Server)|(Browse)|(Post)|(Mail)|(Score)|(Binary)|(Topic)|(Pick)'
+fun='{gnus-|{nn.*-|{grouplens-'
+egrep "$match" gnus.idx > gnus.kidx
+egrep "$fun" gnus.idx > gnus.gidx
+egrep -v "$match|$fun" gnus.idx > gnus.cidx
diff --git a/texi/texi2latex.el b/texi/texi2latex.el
new file mode 100644 (file)
index 0000000..ccd53a8
--- /dev/null
@@ -0,0 +1,313 @@
+;;; texi2latex.el --- convert a texi file into a LaTeX file.
+;; Copyright (C) 1996 Lars Magne Ingebrigtsen
+
+(require 'cl)
+
+(defun latexi-discard-until (string)
+  (let ((beg (match-beginning 0)))
+    (unless (re-search-forward (concat "^@end +" string "[ \t]*\n") nil t)
+      (error "No end: %s" string))
+    (delete-region beg (match-end 0))))
+
+(defun latexi-strip-line ()
+  (delete-region (progn (beginning-of-line) (point))
+                (progn (forward-line 1) (point))))
+
+(defun latexi-switch-line (command arg)
+  (latexi-strip-line)
+  (insert (format "\\%s{%s}\n" command arg)))
+
+(defun latexi-index-command (command arg)
+  (latexi-strip-line)
+  (insert (format "\\gnus%sindex{%s}\n" 
+                 (if (equal command "kindex") "k" "")
+                 arg)))
+
+(defun latexi-begin-command (command)
+  (latexi-strip-line)
+  (insert (format "\\begin{%s}\n" command)))
+
+(defun latexi-exchange-command (command arg)
+  (delete-region (match-beginning 0) (match-end 0))
+  (insert (format "\\%s{%s}" command arg)))
+
+(defun latexi-translate ()
+  "Translate."
+  (interactive)
+  (latexi-translate-file "gnus")
+  (latexi-translate-file "gnus-faq"))
+
+(defun latexi-translate-file (file)
+  "Translate file a LaTeX file."
+  (let ((item-string "")
+       (item-stack nil)
+       (list-stack nil)
+       (latexi-buffer (get-buffer-create "*LaTeXi*"))
+       verbatim
+       (regexp 
+        (concat 
+           "@\\([^{} \t\n]+\\)"
+           "\\(\\( +\\(.*$\\)\\|[ \t]*$\\)\\|{\\([^}]*\\)}\\)"))
+       (cur (find-file-noselect (concat file ".texi")))
+       (times 3)
+       (chapter 0)
+       command arg)
+    (pop-to-buffer latexi-buffer)
+    (buffer-disable-undo)
+    (erase-buffer)
+    (insert-buffer-substring cur)
+    (goto-char (point-min))
+    (latexi-strip-line)
+    (latexi-translate-string "%@{" "\\gnuspercent{}\\gnusbraceleft{}")
+    (latexi-translate-string "%@}" "\\gnuspercent{}\\gnusbraceright{}")
+    (latexi-translate-string "%1@{" "\\gnuspercent{}1\\gnusbraceright{}")
+;    (while (re-search-forward "{\"[^\"]*\\(\\\\\\)[^\"]*\"}\\\\" nil t)
+;      (replace-match "\\verb+\\\\+ " t t))
+    (while (not (zerop (decf times)))
+      (goto-char (point-min))
+      (while (re-search-forward regexp nil t)
+       (setq command (match-string 1))
+       (if (match-beginning 3)
+           (progn
+             (setq arg (or (match-string 4) ""))
+             (save-match-data
+               (when (string-match "[ \t]+$" arg)
+                 (setq arg (substring arg 0 (match-beginning 0)))))
+             (cond 
+              ((member command '("c" "comment"))
+               (if (string-match "@icon" (or arg ""))
+                   (progn
+                     (beginning-of-line)
+                     (delete-region (point) (+ (point) 4))
+                     (insert "\\gnus"))
+                 (delete-region (match-beginning 0) 
+                                (progn (end-of-line) (point))))
+               (if (equal arg "@head")
+                   (insert "\\gnusinteresting")))
+              ((member command '("setfilename" 
+                                 "synindex" "setchapternewpage"
+                                 "summarycontents" "bye"
+                                 "top" "iftex" "cartouche" 
+                                 "iflatex" "finalout" "vskip"))
+               (latexi-strip-line))
+              ((member command '("menu" "tex" "ifinfo" "ignore"))
+               (latexi-discard-until command))
+              ((member command '("subsection" "subsubsection"))
+               (latexi-switch-line command arg))
+              ((member command '("chapter"))
+               (latexi-switch-line 
+                (format 
+                 "gnus%s{\\epsfig{figure=tmp/new-herd-%d.ps,scale=.5}}"
+                  command (incf chapter))
+                arg))
+              ((member command '("section"))
+               (latexi-switch-line (format "gnus%s" command) arg))
+              ((member command '("cindex" "findex" "kindex" "vindex"))
+               (latexi-index-command command arg))
+              ((member command '("*"))
+               (delete-char -2)
+               (insert "\\\\"))
+              ((equal command "sp")
+               (replace-match "" t t))
+              ((equal command "node")
+               (latexi-strip-line)
+               (insert (format "\\label{%s}\n" arg)))
+              ((equal command "contents")
+               (latexi-strip-line)
+               ;;(insert (format "\\tableofcontents\n" arg))
+               )
+              ((member command '("titlepage"))
+               (latexi-begin-command command))
+              ((member command '("lisp" "example"))
+               (latexi-strip-line)
+               (insert (format "\\begin{verbatim}\n"))
+               (setq verbatim (point)))
+              ((member command '("center"))
+               (latexi-strip-line)
+               (insert (format "\\begin{%s}%s\\end{%s}\n"
+                               command arg command)))
+              ((member command '("end"))
+               (cond
+                ((member arg '("titlepage"))
+                 (latexi-strip-line)
+                 (insert (format "\\end{%s}\n" arg)))
+                ((equal arg "quotation")
+                 (latexi-strip-line)
+                 (insert (format "\\end{verse}\n")))
+                ((member arg '("lisp" "example"))
+                 (latexi-strip-line)
+                 (save-excursion
+                   (save-restriction
+                     (narrow-to-region verbatim (point))
+                     (goto-char (point-min))
+                     (while (search-forward "@{" nil t)
+                       (replace-match "{" t t))
+                     (goto-char (point-min))
+                     (while (search-forward "@}" nil t)
+                       (replace-match "}" t t))))
+                 (setq verbatim nil)
+                 (insert "\\end{verbatim}\n"))
+                ((member arg '("table"))
+                 (setq item-string (pop item-stack))
+                 (latexi-strip-line)
+                 (insert (format "\\end{%slist}\n" (pop list-stack))))
+                ((member arg '("itemize" "enumerate"))
+                 (setq item-string (pop item-stack))
+                 (latexi-strip-line)
+                 (insert (format "\\end{%s}\n" arg)))
+                ((member arg '("iflatex" "iftex" "cartouche"))
+                 (latexi-strip-line))
+                (t
+                 (error "Unknown end arg: %s" arg))))
+              ((member command '("table"))
+               (push item-string item-stack)
+               (push (substring arg 1) list-stack)
+               (setq item-string 
+                     (format "[@%s{%%s}]" (car list-stack)))
+               (latexi-strip-line)
+               (insert (format "\\begin{%slist}\n" (car list-stack))))
+              ((member command '("itemize" "enumerate"))
+               (push item-string item-stack)
+               (cond 
+                ((member arg '("@bullet"))
+                 (setq item-string "[\\gnusbullet]"))
+                (t
+                 (setq item-string "")))
+               (latexi-strip-line)
+               (insert (format "\\begin{%s}\n" command)))
+              ((member command '("item"))
+               (latexi-strip-line)
+               (insert (format "\\%s%s\n" command (format item-string arg))))
+              ((equal command "itemx")
+               (latexi-strip-line)
+               (insert (format "\\gnusitemx{%s}\n" (format item-string arg))))
+              ((eq (aref command 0) ?@)
+               (goto-char (match-beginning 0))
+               (delete-char 2)
+               (insert "duppat{}"))
+              ((equal command "settitle")
+               (latexi-strip-line)
+               (insert (format "\\newcommand{\\gnustitlename}{%s}\n" arg)))
+              ((equal command "title")
+               (latexi-strip-line)
+               (insert (format "\\gnustitlename{%s}\n" arg)))
+              ((equal command "author")
+               (latexi-strip-line)
+               (insert (format "\\gnusauthor{%s}\n" arg)))
+              ((equal command "quotation")
+               (latexi-begin-command "verse"))
+              ((equal command "page")
+               (latexi-strip-line)
+               (insert (format "\\newpage\n" arg)))
+              ((equal command "'s")
+               (goto-char (match-beginning 0))
+               (delete-char 1))
+              ((equal command "include")
+               (latexi-strip-line)
+               (insert "\\input{gnus-faq.latexi}\n"))
+              ((equal command "printindex")
+               (latexi-strip-line)
+               ;;(insert 
+               ;; (format 
+               ;;  "\\begin{theindex}\\input{gnus.%s}\\end{theindex}\n" arg))
+               )
+              (t
+               (error "Unknown command: %s" command))))
+         ;; These are commands with {}.
+         (setq arg (match-string 5))
+         (cond 
+          ((member command '("xref" "pxref"))
+           (latexi-exchange-command (concat "gnus" command) arg))
+          ((member command '("sc" "file" "dfn" "emph" "kbd" 
+                             "code" "samp" "var" "strong" "i"))
+           (goto-char (match-beginning 0))
+           (delete-char 1)
+           (insert "\\gnus"))
+          ((member command '("copyright"))
+           (goto-char (match-beginning 0))
+           (delete-char 1)
+           (insert "\\"))
+          ((eq (aref command 0) ?@)
+           (goto-char (match-beginning 0))
+           (delete-char 2)
+           (insert "duppat{}"))
+          (t
+           (error "Unknown command: %s" command))))))
+    (latexi-translate-string "$" "\\gnusdollar{}")
+    (latexi-translate-string "&" "\\gnusampersand{}")
+    (latexi-translate-string "%" "\\gnuspercent{}")
+    (latexi-translate-string "#" "\\gnushash{}")
+    (latexi-translate-string "^" "\\gnushat{}")
+    (latexi-translate-string "~" "\\gnustilde{}")
+    (latexi-translate-string "_" "\\gnusunderline{}")
+    (latexi-translate-string "¬" "\\gnusnot{}")
+    (goto-char (point-min))
+    (while (search-forward "duppat{}" nil t)
+      (replace-match "@" t t))
+    (latexi-translate-string "@@" "@")
+    (latexi-translate-string "<" "\\gnusless{}")
+    (latexi-translate-string ">" "\\gnusgreater{}")
+    (goto-char (point-min))
+    (search-forward "label{Top}" nil t)
+    (while (re-search-forward "\\\\[ntr]\\b" nil t)
+      (when (save-match-data
+             (or (not (save-excursion
+                        (search-backward "begin{verbatim}" nil t)))
+                 (> (save-excursion
+                      (search-backward "end{verbatim"))
+                    (save-excursion
+                      (search-backward "begin{verbatim}")))))
+       (goto-char (match-beginning 0))
+       (delete-char 1)
+       (insert "\\gnusbackslash{}")))
+    (latexi-translate-string "\\\\" "\\gnusbackslash{}")
+    (goto-char (point-min))
+    (while (re-search-forward "\\\\[][{}]" nil t)
+      (goto-char (match-beginning 0))
+      (delete-char 1))
+    (latexi-contributors)
+    (write-region (point-min) (point-max) (concat file ".latexi"))))
+
+(defun latexi-translate-string (in out)
+  (let (yes)
+    (goto-char (point-min))
+    (search-forward "label{Top}" nil t)
+    (while (search-forward in nil t)
+      (when (save-match-data
+             (or (not (save-excursion
+                        (search-backward "begin{verbatim}" nil t)))
+                 (> (save-excursion
+                      (re-search-backward "end{verbatim}\\|end{verse}"))
+                    (save-excursion
+                      (re-search-backward
+                       "begin{verbatim}\\|begin{verse}")))))
+       (replace-match out t t)))))
+
+(defun latexi-contributors ()
+  (goto-char (point-min))
+  (when (re-search-forward "^Also thanks to the following" nil t)
+    (forward-line 2)
+    (narrow-to-region
+     (point)
+     (1- (search-forward "\n\n")))
+    (when (re-search-backward "^and" nil t)
+      (latexi-strip-line))
+    (goto-char (point-min))
+    (while (re-search-forward "[.,] *$" nil t)
+      (replace-match "" t t))
+    (goto-char (point-min))
+    (let (names)
+      (while (not (eobp))
+       (push (buffer-substring (point) (progn (end-of-line) (point)))
+             names)
+       (forward-line 1))
+      (delete-region (point-min) (point-max))
+      (insert "\\begin{tabular}{lll}\n")
+      (setq names (nreverse (delete "" names)))
+      (while names
+       (insert (pop names) " & " (or (pop names) "\\mbox{}") 
+               " & " (or (pop names) "\\mbox{}") 
+               "\\\\\n"))
+      (insert "\\end{tabular}\n")
+      (widen))))
+       
\ No newline at end of file