Sync with Oort Gnus (Translating gnus-ja.texi has not been done yet).
authoryamaoka <yamaoka>
Mon, 10 Sep 2001 00:58:40 +0000 (00:58 +0000)
committeryamaoka <yamaoka>
Mon, 10 Sep 2001 00:58:40 +0000 (00:58 +0000)
13 files changed:
ChangeLog
lisp/ChangeLog
lisp/gnus-agent.el
lisp/gnus-art.el
lisp/gnus-group.el
lisp/gnus-spec.el
lisp/gnus-srvr.el
lisp/gnus-xmas.el
lisp/mm-decode.el
lisp/nnfolder.el
lisp/nnml.el
texi/ChangeLog
texi/gnus.texi

index dea75a1..dbef953 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2001-09-10  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * lisp/gnus-xmas.el (gnus-tilde-pad-form): Abolished.  Use the
+       new function `gnus-correct-pad-form' instead.
+       * lisp/gnus-spec.el (gnus-tilde-pad-form): Ditto.
+
 2001-09-05  TSUCHIYA Masatoshi  <tsuchiya@namazu.org>
 
        * lisp/nnir.el (nnir-run-namazu): Fix a side effect when handling
index 6ae1de5..4074cfe 100644 (file)
@@ -1,3 +1,63 @@
+2001-09-09  Simon Josefsson  <jas@extundo.com>
+
+       * mm-decode.el (mm-inline-media-tests): Add
+       application/x-emacs-lisp.
+       (mm-attachment-override-types): Add
+       application/{x-,}pkcs7-signature.
+
+       * gnus-srvr.el (gnus-server-mode-hook, gnus-server-exit-hook) 
+       (gnus-server-line-format, gnus-server-mode-line-format) 
+       (gnus-server-browse-in-group-buffer): Customize.
+
+2001-09-08 16:00:00  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * nnml.el (nnml-marks-changed-p): Typo.
+       (nnml-save-marks, nnml-open-marks): Use gnus-sethash.
+       (nnml-marks-changed-p): Use gnus-gethash.
+       (nnml-marks-modtime): Use gnus-make-hashtable.
+
+       * nnfolder.el (nnfolder-marks-changed-p): Typo.
+       (nnfolder-request-expire-articles, nnfolder-save-marks) 
+       (nnfolder-open-marks): Typo.
+       (nnfolder-save-marks, nnfolder-open-marks): Use gnus-sethash.
+       (nnfolder-marks-changed-p): Use gnus-gethash.
+       (nnfolder-marks-modtime): Use gnus-make-hashtable.
+
+2001-09-08  Simon Josefsson  <jas@extundo.com>
+
+       * nnfolder.el (nnfolder-marks-modtime): New variable.
+       (nnfolder-marks-changed-p): New function.
+       (nnfolder-save-marks, nnfolder-open-marks): Save modtime.
+       (nnfolder-request-update-info): Don't update if marks didn't change.
+
+       * nnml.el (nnml-marks-modtime): New variable.
+       (nnml-marks-changed-p): New function.
+       (nnml-save-marks, nnml-open-marks): Save modtime.
+       (nnml-request-update-info): Don't update if marks didn't change.
+
+       * gnus-agent.el (gnus-agent-any-covered-gcc)
+       (gnus-agent-add-server, gnus-agent-remove-server): Use
+       gnus-agent-method-p.
+
+       * gnus-art.el (gnus-buttonized-mime-types): New variable.
+       (gnus-unbuttonized-mime-type-p): Use it.
+
+       * gnus-agent.el (gnus-agent-fetch-group): If online, actually
+       fetch group.
+
+2001-09-08  Simon Josefsson  <jas@extundo.com>
+       From Daniel Pittman <daniel@rimspace.net>
+
+       * gnus-spec.el (gnus-correct-pad-form): New function.
+       (gnus-parse-simple-format): Use it.
+
+2001-09-07  Simon Josefsson  <jas@extundo.com>
+
+       * gnus-group.el (gnus-group-sort-groups): Unmark all groups.
+       (gnus-group-sort-selected-groups): Ditto.  Suggested by Harry
+       Putnam <reader@newsguy.com>.
+       (gnus-group-sort-selected-groups): Touch dribble file.
+
 2001-09-07 Raja R Harinath  <harinath@cs.umn.edu>
 
        * nnml.el (nnml-filenames-are-evil): New variable.
index 1e6340a..fa97cce 100644 (file)
@@ -445,8 +445,7 @@ be a select method."
                                   gcc " ,")))))
           covered)
       (while (and (not covered) methods)
-       (setq covered
-             (member (car methods) gnus-agent-covered-methods)
+       (setq covered (gnus-agent-method-p (car methods))
              methods (cdr methods)))
       covered)))
 
@@ -481,14 +480,14 @@ be a select method."
   (let ((state gnus-plugged))
     (unwind-protect
        (progn
+         (unless group
+           (error "No group on the current line"))
          (unless state
-           (gnus-agent-toggle-plugged gnus-plugged)
-           (unless group
-             (error "No group on the current line"))
-           (let ((gnus-command-method (gnus-find-method-for-group group)))
-             (gnus-agent-with-fetch
-               (gnus-agent-fetch-group-1 group gnus-command-method)
-               (gnus-message 5 "Fetching %s...done" group)))))
+           (gnus-agent-toggle-plugged gnus-plugged))
+         (let ((gnus-command-method (gnus-find-method-for-group group)))
+           (gnus-agent-with-fetch
+             (gnus-agent-fetch-group-1 group gnus-command-method)
+             (gnus-message 5 "Fetching %s...done" group))))
       (when (and (not state)
                 gnus-plugged)
        (gnus-agent-toggle-plugged gnus-plugged)))))
@@ -578,7 +577,7 @@ be a select method."
   (unless server
     (error "No server on the current line"))
   (let ((method (gnus-server-get-method nil (gnus-server-server-name))))
-    (when (member method gnus-agent-covered-methods)
+    (when (gnus-agent-method-p method)
       (error "Server already in the agent program"))
     (push method gnus-agent-covered-methods)
     (gnus-server-update-server server)
@@ -591,7 +590,7 @@ be a select method."
   (unless server
     (error "No server on the current line"))
   (let ((method (gnus-server-get-method nil (gnus-server-server-name))))
-    (unless (member method gnus-agent-covered-methods)
+    (unless (gnus-agent-method-p method)
       (error "Server not in the agent program"))
     (setq gnus-agent-covered-methods
          (delete method gnus-agent-covered-methods))
index 79aaaae..2abe7a6 100644 (file)
@@ -709,7 +709,17 @@ displayed by the first non-nil matching CONTENT face."
   :type '(repeat regexp))
 
 (defcustom gnus-unbuttonized-mime-types '(".*/.*")
-  "List of MIME types that should not be given buttons when rendered inline."
+  "List of MIME types that should not be given buttons when rendered inline.
+See also `gnus-buttonized-mime-types' which may override this variable."
+  :version "21.1"
+  :group 'gnus-article-mime
+  :type '(repeat regexp))
+
+(defcustom gnus-buttonized-mime-types nil
+  "List of MIME types that should be given buttons when rendered inline.
+If set, this variable overrides `gnus-unbuttonized-mime-types'.
+To see e.g. security buttons you could set this to
+`(\"multipart/signed\")'."
   :version "21.1"
   :group 'gnus-article-mime
   :type '(repeat regexp))
@@ -4313,11 +4323,16 @@ If no internal viewer is available, use an external viewer."
 (defun gnus-unbuttonized-mime-type-p (type)
   "Say whether TYPE is to be unbuttonized."
   (unless gnus-inhibit-mime-unbuttonizing
-    (catch 'found
-      (let ((types gnus-unbuttonized-mime-types))
-       (while types
-         (when (string-match (pop types) type)
-           (throw 'found t)))))))
+    (when (catch 'found
+           (let ((types gnus-unbuttonized-mime-types))
+             (while types
+               (when (string-match (pop types) type)
+                 (throw 'found t)))))
+      (not (catch 'found
+            (let ((types gnus-buttonized-mime-types))
+              (while types
+                (when (string-match (pop types) type)
+                  (throw 'found t)))))))))
 
 (defun gnus-article-insert-newline ()
   "Insert a newline, but mark it as undeletable."
index 90b47eb..27784e8 100644 (file)
@@ -2635,6 +2635,7 @@ If REVERSE (the prefix), reverse the sorting order."
   (interactive (list gnus-group-sort-function current-prefix-arg))
   (funcall gnus-group-sort-alist-function
           (gnus-make-sort-function func) reverse)
+  (gnus-group-unmark-all-groups)
   (gnus-group-list-groups)
   (gnus-dribble-touch))
 
@@ -2701,7 +2702,9 @@ If REVERSE, sort in reverse order."
   (let ((groups (gnus-group-process-prefix n)))
     (funcall gnus-group-sort-selected-function
             groups (gnus-make-sort-function func) reverse)
-    (gnus-group-list-groups)))
+    (gnus-group-unmark-all-groups)
+    (gnus-group-list-groups)
+    (gnus-dribble-touch)))
 
 (defun gnus-group-sort-selected-flat (groups func reverse)
   (let (entries infos)
index 0171a91..a4cb769 100644 (file)
     (point) (progn ,@form (point))
     '(gnus-face t face ,(symbol-value (intern (format "gnus-face-%d" type))))))
 
-;;; Avoid byte-compile warning.
-(defun gnus-tilde-pad-form (el pad-width)
-  "Dummy function except for XEmacs-mule. It will be redefined
-by `gnus-xmas-redefine'."
-  (let ((val (if (symbolp el) (eval el) el)))
-    (` (, val))))
-
 (defun gnus-balloon-face-function (form type)
   `(gnus-put-text-property
     (point) (progn ,@form (point))
@@ -411,6 +404,22 @@ by `gnus-xmas-redefine'."
        (if (equal val ,ignore-value)
           "" val))))
 
+(defun gnus-correct-pad-form (el pad-width)
+  "Return a form that pads EL to PAD-WIDTH accounting for multi-column
+characters correctly. This is because `format' may pad to columns or to
+characters when given a pad value."
+  (let ((pad (abs pad-width)))
+    (if (symbolp el)
+       `(let ((need (- ,pad (gnus-correct-length ,el))))
+          (if (> need 0)
+              (concat ,el (make-string need ?\ ))
+            ,el))
+      `(let* ((val (eval ,el))
+             (need (- ,pad (gnus-correct-length ,el))))
+        (if (> need 0)
+            (concat ,el (make-string need ?\ ))
+          ,el)))))
+
 (defun gnus-parse-format (format spec-alist &optional insert)
   ;; This function parses the FORMAT string with the help of the
   ;; SPEC-ALIST and returns a list that can be eval'ed to return the
@@ -488,8 +497,7 @@ by `gnus-xmas-redefine'."
   ;; This function parses the FORMAT string with the help of the
   ;; SPEC-ALIST and returns a list that can be eval'ed to return a
   ;; string.
-  (let ((xemacs-mule-p (and (featurep 'xemacs) (featurep 'mule)))
-       max-width
+  (let (max-width
        spec flist fstring elem result dontinsert user-defined
        type value pad-width spec-beg cut-width ignore-value
        tilde-form tilde elem-type)
@@ -576,11 +584,14 @@ by `gnus-xmas-redefine'."
            (setq elem '("*" ?s))))
          (setq elem-type (cadr elem))
          ;; Insert the new format elements.
-         (and pad-width (not xemacs-mule-p)
-              (insert (number-to-string pad-width)))
+         (when (and pad-width
+                    (not (and (featurep 'xemacs)
+                              gnus-use-correct-string-widths)))
+           (insert (number-to-string pad-width)))
          ;; Create the form to be evaled.
          (if (or max-width cut-width ignore-value
-                 (and pad-width xemacs-mule-p))
+                 (and (featurep 'xemacs)
+                      gnus-use-correct-string-widths))
              (progn
                (insert ?s)
                (let ((el (car elem)))
@@ -594,8 +605,8 @@ by `gnus-xmas-redefine'."
                    (setq el (gnus-tilde-cut-form el cut-width)))
                  (when max-width
                    (setq el (gnus-tilde-max-form el max-width)))
-                 (and pad-width xemacs-mule-p
-                      (setq el (gnus-tilde-pad-form el pad-width)))
+                 (when pad-width
+                   (setq el (gnus-correct-pad-form el pad-width)))
                  (push el flist)))
            (insert elem-type)
            (push (car elem) flist))))
index bc9df3d..029d6aa 100644 (file)
 (require 'gnus-int)
 (require 'gnus-range)
 
-(defvar gnus-server-mode-hook nil
-  "Hook run in `gnus-server-mode' buffers.")
+(defcustom gnus-server-mode-hook nil
+  "Hook run in `gnus-server-mode' buffers."
+  :group 'gnus-server
+  :type 'hook)
 
-(defconst gnus-server-line-format "     {%(%h:%w%)} %s%a\n"
+(defcustom gnus-server-exit-hook nil
+  "Hook run when exiting the server buffer."
+  :group 'gnus-server
+  :type 'hook)
+
+(defcustom gnus-server-line-format "     {%(%h:%w%)} %s%a\n"
   "Format of server lines.
 It works along the same lines as a normal formatting string,
 with some simple extensions.
@@ -48,16 +55,19 @@ The following specs are understood:
 %n name
 %w address
 %s status
-%a agent covered")
-
-(defvar gnus-server-mode-line-format "Gnus: %%b"
-  "The format specification for the server mode line.")
+%a agent covered"
+  :group 'gnus-server-visual
+  :type 'string)
 
-(defvar gnus-server-exit-hook nil
-  "*Hook run when exiting the server buffer.")
+(defcustom gnus-server-mode-line-format "Gnus: %%b"
+  "The format specification for the server mode line."
+  :group 'gnus-server-visual
+  :type 'string)
 
-(defvar gnus-server-browse-in-group-buffer nil
-  "Whether browse server in group buffer.")
+(defcustom gnus-server-browse-in-group-buffer nil
+  "Whether browse server in group buffer."
+  :group 'gnus-server-visual
+  :type 'string)
 
 ;;; Internal variables.
 
index f691cb7..70acff9 100644 (file)
@@ -541,29 +541,7 @@ the resulting string may be narrower than END-COLUMN.
          (setq str (substring str from-idx idx))
          (if padding
              (concat head-padding str tail-padding)
-           str))))
-
-    (defun gnus-tilde-pad-form (el pad-width)
-      "Return a form that pads EL to PAD-WIDTH."
-      (let ((pad (abs pad-width)))
-       (if (symbolp el)
-           (if (< pad-width 0)
-               `(let ((val (format "%s" ,el)))
-                  (concat val (make-string
-                               (max 0 (- ,pad (string-width val))) ?\ )))
-             `(let ((val (format "%s" ,el)))
-                (concat (make-string
-                         (max 0 (- ,pad (string-width val))) ?\ )
-                        val)))
-         (if (< pad-width 0)
-             `(let ((val (eval ,el)))
-                (concat val (make-string
-                             (max 0 (- ,pad (string-width val))) ?\ )))
-           `(let ((val (eval ,el)))
-              (concat (make-string
-                       (max 0 (- ,pad (string-width val))) ?\ )
-                      val))))))
-    ))
+           str))))))
 
 ;;; XEmacs logo and toolbar.
 
index d300c6e..d370da8 100644 (file)
      (lambda (handle)
        (locate-library "diff-mode")))
     ("application/emacs-lisp" mm-display-elisp-inline identity)
+    ("application/x-emacs-lisp" mm-display-elisp-inline identity)
     ("text/html"
      mm-inline-text
      (lambda (handle)
@@ -226,7 +227,9 @@ when selecting a different article."
 
 (defcustom mm-attachment-override-types '("text/x-vcard"
                                          "application/pkcs7-mime"
-                                         "application/x-pkcs7-mime")
+                                         "application/x-pkcs7-mime"
+                                         "application/pkcs7-signature"
+                                         "application/x-pkcs7-signature")
   "Types to have \"attachment\" ignored if they can be displayed inline."
   :type '(repeat string)
   :group 'mime-display)
index 3f31789..979dfab 100644 (file)
@@ -163,6 +163,8 @@ This variable is a virtual server slot.  See the Gnus manual for details.")
 
 (defvoo nnfolder-marks-file-suffix ".mrk")
 
+(defvar nnfolder-marks-modtime (gnus-make-hashtable))
+
 \f
 
 ;;; Interface functions
@@ -426,7 +428,7 @@ This variable is a virtual server slot.  See the Gnus manual for details.")
              (with-temp-buffer
                (nnfolder-request-article (car maybe-expirable)
                                          newsgroup server (current-buffer))
-               (let ((nnml-current-directory nil))
+               (let ((nnfolder-current-directory nil))
                  (nnmail-expiry-target-group
                   nnmail-expiry-target newsgroup))))
            (nnheader-message 5 "Deleting article %d in %s..."
@@ -1170,7 +1172,7 @@ This command does not work if you use short group names."
   (when (and server
             (not (nnfolder-server-opened server)))
     (nnfolder-open-server server))
-  (unless nnfolder-marks-is-evil
+  (when (and (not nnfolder-marks-is-evil) (nnfolder-marks-changed-p group))
     (nnheader-message 8 "Updating marks for %s..." group)
     (nnfolder-open-marks group server)
     ;; Update info using `nnfolder-marks'.
@@ -1197,14 +1199,25 @@ This command does not work if you use short group names."
   (let ((nnfolder-directory (or nnfolder-marks-directory nnfolder-directory)))
     (concat (nnfolder-group-pathname group) nnfolder-marks-file-suffix)))
 
+(defun nnfolder-marks-changed-p (group)
+  (let ((file (nnfolder-group-marks-pathname group)))
+    (if (null (gnus-gethash file nnfolder-marks-modtime))
+       t ;; never looked at marks file, assume it has changed
+      (not (eq (gnus-gethash file nnfolder-marks-modtime)
+              (nth 5 (file-attributes file)))))))
+
 (defun nnfolder-save-marks (group server)
   (let ((file-name-coding-system nnmail-pathname-coding-system)
        (file (nnfolder-group-marks-pathname group)))
     (condition-case err
-       (with-temp-file file
-         (erase-buffer)
-         (princ nnfolder-marks (current-buffer))
-         (insert "\n"))
+       (progn
+         (with-temp-file file
+           (erase-buffer)
+           (princ nnfolder-marks (current-buffer))
+           (insert "\n"))
+         (gnus-sethash file
+                       (nth 5 (file-attributes file))
+                       nnfolder-marks-modtime))
       (error (or (gnus-yes-or-no-p
                  (format "Could not write to %s (%s).  Continue? " file err))
                 (error "Cannot write to %s (%s)" err))))))
@@ -1214,6 +1227,9 @@ This command does not work if you use short group names."
     (if (file-exists-p file)
        (setq nnfolder-marks (condition-case err
                                 (with-temp-buffer
+                                  (gnus-sethash file
+                                                (nth 5 (file-attributes file))
+                                                nnfolder-marks-modtime)
                                   (nnheader-insert-file-contents file)
                                   (read (current-buffer)))
                               (error (or (gnus-yes-or-no-p
index a292c6b..710c882 100644 (file)
@@ -128,8 +128,9 @@ This variable is a virtual server slot.  See the Gnus manual for details.")
 
 (defvoo nnml-marks nil)
 
-\f
+(defvar nnml-marks-modtime (gnus-make-hashtable))
 
+\f
 ;;; Interface functions.
 
 (nnoo-define-basics nnml)
@@ -951,7 +952,7 @@ Use the nov database for the current group if available."
 
 (deffoo nnml-request-update-info (group info &optional server)
   (nnml-possibly-change-directory group server)
-  (unless nnml-marks-is-evil
+  (when (and (not nnml-marks-is-evil) (nnml-marks-changed-p group))
     (nnheader-message 8 "Updating marks for %s..." group)
     (nnml-open-marks group server)
     ;; Update info using `nnml-marks'.
@@ -973,6 +974,14 @@ Use the nov database for the current group if available."
     (nnheader-message 8 "Updating marks for %s...done" group))
   info)
 
+(defun nnml-marks-changed-p (group)
+  (let ((file (expand-file-name nnml-marks-file-name
+                               (nnmail-group-pathname group nnml-directory))))
+    (if (null (gnus-gethash file nnml-marks-modtime))
+       t ;; never looked at marks file, assume it has changed
+      (not (eq (gnus-gethash file nnml-marks-modtime)
+            (nth 5 (file-attributes file)))))))
+
 (defun nnml-save-marks (group server)
   (let ((file-name-coding-system nnmail-pathname-coding-system)
        (file (expand-file-name nnml-marks-file-name
@@ -983,7 +992,10 @@ Use the nov database for the current group if available."
          (with-temp-file file
            (erase-buffer)
            (princ nnml-marks (current-buffer))
-           (insert "\n")))
+           (insert "\n"))
+         (gnus-sethash file
+                       (nth 5 (file-attributes file))
+                       nnml-marks-modtime))
       (error (or (gnus-yes-or-no-p
                  (format "Could not write to %s (%s).  Continue? " file err))
                 (error "Cannot write to %s (%s)" err))))))
@@ -995,6 +1007,9 @@ Use the nov database for the current group if available."
     (if (file-exists-p file)
        (setq nnml-marks (condition-case err
                             (with-temp-buffer
+                              (gnus-sethash file
+                                            (nth 5 (file-attributes file))
+                                            nnml-marks-modtime)
                               (nnheader-insert-file-contents file)
                               (read (current-buffer)))
                           (error (or (gnus-yes-or-no-p
index e0519b3..d9be9a8 100644 (file)
@@ -1,3 +1,15 @@
+2001-09-08  Simon Josefsson  <jas@extundo.com>
+
+       * gnus.texi (MIME Commands): Add gnus-buttonized-mime-types.
+
+2001-09-08  Kai Gro\e,A_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+       * gnus.texi (Topic Commands): Make this the first subsection of
+       `Group Topics'.  Rearrange keys to mention the most important keys
+       first and to have subsections.  Add some more explanation for
+       C-k/C-y.
+       (Group Buffer): Add comment from Alex Schroeder as todo item.
+
 2001-09-06  Kai Gro\e,A_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
 
        * gnus.texi (Fancy Mail Splitting): Mention `delete' near the
index bb72261..7317ad9 100644 (file)
@@ -1593,6 +1593,26 @@ default is @samp{Tuxedomoon.Jingle4.au}.
 @chapter Group Buffer
 @cindex group buffer
 
+@c Alex Schroeder suggests to rearrange this as follows:
+@c
+@c <kensanata> ok, just save it for reference.  I'll go to bed in a minute.
+@c   1. Selecting a Group, 2. (new) Finding a Group, 3. Group Levels,
+@c   4. Subscription Commands, 5. Group Maneuvering, 6. Group Data,
+@c   7. Group Score, 8. Group Buffer Format
+@c <kensanata> Group Levels should have more information on levels 5 to 9.  I
+@c   suggest to split the 4th paragraph ("Gnus considers groups...") as follows:
+@c <kensanata> First, "Gnus considers groups... (default 9)."
+@c <kensanata> New, a table summarizing what levels 1 to 9 mean.
+@c <kensanata> Third, "Gnus treats subscribed ... reasons of efficiency"
+@c <kensanata> Then expand the next paragraph or add some more to it.
+@c    This short one sentence explains levels 1 and 2, therefore I understand
+@c    that I should keep important news at 3 and boring news at 4.
+@c    Say so!  Then go on to explain why I should bother with levels 6 to 9.
+@c    Maybe keep those that you don't want to read temporarily at 6,
+@c    those that you never want to read at 8, those that offend your
+@c    human rights at 9...
+
+
 The @dfn{group buffer} lists all (or parts) of the available groups.  It
 is the first buffer shown when gnus starts, and will never be killed as
 long as gnus is active.
@@ -3331,69 +3351,28 @@ To get this @emph{fab} functionality you simply turn on (ooh!) the
 is a toggling command.)
 
 Go ahead, just try it.  I'll still be here when you get back.  La de
-dum...  Nice tune, that...  la la la...  What, you're back? Yes, and now
-press @kbd{l}.  There.  All your groups are now listed under
+dum...  Nice tune, that...  la la la...  What, you're back?  Yes, and
+now press @kbd{l}.  There.  All your groups are now listed under
 @samp{misc}.  Doesn't that make you feel all warm and fuzzy?  Hot and
 bothered?
 
 If you want this permanently enabled, you should add that minor mode to
-the hook for the group mode:
+the hook for the group mode.  Put the following line in your
+@file{~/.gnus} file:
 
 @lisp
 (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
 @end lisp
 
 @menu
-* Topic Variables::             How to customize the topics the Lisp Way.
 * Topic Commands::              Interactive E-Z commands.
+* Topic Variables::             How to customize the topics the Lisp Way.
 * Topic Sorting::               Sorting each topic individually.
 * Topic Topology::              A map of the world.
 * Topic Parameters::            Parameters that apply to all groups in a topic.
 @end menu
 
 
-@node Topic Variables
-@subsection Topic Variables
-@cindex topic variables
-
-Now, if you select a topic, it will fold/unfold that topic, which is
-really neat, I think.
-
-@vindex gnus-topic-line-format
-The topic lines themselves are created according to the
-@code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
-Valid elements are:
-
-@table @samp
-@item i
-Indentation.
-@item n
-Topic name.
-@item v
-Visibility.
-@item l
-Level.
-@item g
-Number of groups in the topic.
-@item a
-Number of unread articles in the topic.
-@item A
-Number of unread articles in the topic and all its subtopics.
-@end table
-
-@vindex gnus-topic-indent-level
-Each sub-topic (and the groups in the sub-topics) will be indented with
-@code{gnus-topic-indent-level} times the topic level number of spaces.
-The default is 2.
-
-@vindex gnus-topic-mode-hook
-@code{gnus-topic-mode-hook} is called in topic minor mode buffers.
-
-@vindex gnus-topic-display-empty-topics
-The @code{gnus-topic-display-empty-topics} says whether to display even
-topics that have no unread articles in them.  The default is @code{t}.
-
-
 @node Topic Commands
 @subsection Topic Commands
 @cindex topic commands
@@ -3402,6 +3381,16 @@ When the topic minor mode is turned on, a new @kbd{T} submap will be
 available.  In addition, a few of the standard keys change their
 definitions slightly.
 
+In general, the following kinds of operations are possible on topics.
+First of all, you want to create topics.  Secondly, you want to put
+groups in topics and to move them around until you have an order you
+like.  The third kind of operation is to show/hide parts of the whole
+shebang.  You might want to hide a topic including its subtopics and
+groups, to get a better overview of the other groups.
+
+Here is a list of the basic keys that you might need to set up topics
+the way you like.
+
 @table @kbd
 
 @item T n
@@ -3410,6 +3399,77 @@ definitions slightly.
 Prompt for a new topic name and create it
 (@code{gnus-topic-create-topic}).
 
+@item T TAB
+@itemx TAB
+@kindex T TAB (Topic)
+@kindex TAB (Topic)
+@findex gnus-topic-indent
+``Indent'' the current topic so that it becomes a sub-topic of the
+previous topic (@code{gnus-topic-indent}).  If given a prefix,
+``un-indent'' the topic instead.
+
+@item M-TAB
+@kindex M-TAB (Topic)
+@findex gnus-topic-unindent
+``Un-indent'' the current topic so that it becomes a sub-topic of the
+parent of its current parent (@code{gnus-topic-unindent}).
+
+@end table
+
+The following two keys can be used to move groups and topics around.
+They work like the well-known cut and paste.  @kbd{C-k} is like cut and
+@kbd{C-y} is like paste.  Of course, this being Emacs, we use the terms
+kill and yank rather than cut and paste.
+
+@table @kbd
+
+@item C-k
+@kindex C-k (Topic)
+@findex gnus-topic-kill-group
+Kill a group or topic (@code{gnus-topic-kill-group}).  All groups in the
+topic will be removed along with the topic.
+
+@item C-y
+@kindex C-y (Topic)
+@findex gnus-topic-yank-group
+Yank the previously killed group or topic
+(@code{gnus-topic-yank-group}).  Note that all topics will be yanked
+before all groups.
+
+So, to move a topic to the beginning of the list of topics, just hit
+@kbd{C-k} on it.  This is like the `cut' part of cut and paste.  Then,
+move the cursor to the beginning of the buffer (just below the `Gnus'
+topic) and hit @kbd{C-y}.  This is like the `paste' part of cut and
+paste.  Like I said -- E-Z.
+
+You can use @kbd{C-k} and @kbd{C-y} on groups as well as on topics.  So
+you can move topics around as well as groups.
+
+@end table
+
+After setting up the topics the way you like them, you might wish to
+hide a topic, or to show it again.  That's why we have the following
+key.
+
+@table @kbd
+
+@item RET
+@kindex RET (Topic)
+@findex gnus-topic-select-group
+@itemx SPACE
+Either select a group or fold a topic (@code{gnus-topic-select-group}).
+When you perform this command on a group, you'll enter the group, as
+usual.  When done on a topic line, the topic will be folded (if it was
+visible) or unfolded (if it was folded already).  So it's basically a
+toggling command on topics.  In addition, if you give a numerical
+prefix, group on that level (and lower) will be displayed.
+
+@end table
+
+Now for a list of other commands, in no particular order.
+
+@table @kbd
+
 @item T m
 @kindex T m (Topic)
 @findex gnus-topic-move-group
@@ -3485,32 +3545,6 @@ Mark all groups in the current topic with the process mark
 Remove the process mark from all groups in the current topic
 (@code{gnus-topic-unmark-topic}).
 
-@item T TAB
-@itemx TAB
-@kindex T TAB (Topic)
-@kindex TAB (Topic)
-@findex gnus-topic-indent
-``Indent'' the current topic so that it becomes a sub-topic of the
-previous topic (@code{gnus-topic-indent}).  If given a prefix,
-``un-indent'' the topic instead.
-
-@item M-TAB
-@kindex M-TAB (Topic)
-@findex gnus-topic-unindent
-``Un-indent'' the current topic so that it becomes a sub-topic of the
-parent of its current parent (@code{gnus-topic-unindent}).
-
-@item RET
-@kindex RET (Topic)
-@findex gnus-topic-select-group
-@itemx SPACE
-Either select a group or fold a topic (@code{gnus-topic-select-group}).
-When you perform this command on a group, you'll enter the group, as
-usual.  When done on a topic line, the topic will be folded (if it was
-visible) or unfolded (if it was folded already).  So it's basically a
-toggling command on topics.  In addition, if you give a numerical
-prefix, group on that level (and lower) will be displayed.
-
 @item C-c C-x
 @kindex C-c C-x (Topic)
 @findex gnus-topic-expire-articles
@@ -3518,19 +3552,6 @@ Run all expirable articles in the current group or topic through the
 expiry process (if any)
 (@code{gnus-topic-expire-articles}). (@pxref{Expiring Mail}).
 
-@item C-k
-@kindex C-k (Topic)
-@findex gnus-topic-kill-group
-Kill a group or topic (@code{gnus-topic-kill-group}).  All groups in the
-topic will be removed along with the topic.
-
-@item C-y
-@kindex C-y (Topic)
-@findex gnus-topic-yank-group
-Yank the previously killed group or topic
-(@code{gnus-topic-yank-group}).  Note that all topics will be yanked
-before all groups.
-
 @item T r
 @kindex T r (Topic)
 @findex gnus-topic-rename
@@ -3559,6 +3580,48 @@ Edit the topic parameters (@code{gnus-topic-edit-parameters}).
 @end table
 
 
+@node Topic Variables
+@subsection Topic Variables
+@cindex topic variables
+
+The previous section told you how to tell Gnus which topics to display.
+This section explains how to tell Gnus what to display about each topic.
+
+@vindex gnus-topic-line-format
+The topic lines themselves are created according to the
+@code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
+Valid elements are:
+
+@table @samp
+@item i
+Indentation.
+@item n
+Topic name.
+@item v
+Visibility.
+@item l
+Level.
+@item g
+Number of groups in the topic.
+@item a
+Number of unread articles in the topic.
+@item A
+Number of unread articles in the topic and all its subtopics.
+@end table
+
+@vindex gnus-topic-indent-level
+Each sub-topic (and the groups in the sub-topics) will be indented with
+@code{gnus-topic-indent-level} times the topic level number of spaces.
+The default is 2.
+
+@vindex gnus-topic-mode-hook
+@code{gnus-topic-mode-hook} is called in topic minor mode buffers.
+
+@vindex gnus-topic-display-empty-topics
+The @code{gnus-topic-display-empty-topics} says whether to display even
+topics that have no unread articles in them.  The default is @code{t}.
+
+
 @node Topic Sorting
 @subsection Topic Sorting
 @cindex topic sorting
@@ -8251,7 +8314,20 @@ To have all Vcards be ignored, you'd say something like this:
 @vindex gnus-unbuttonized-mime-types
 This is a list of regexps.  @sc{mime} types that match a regexp from
 this list won't have @sc{mime} buttons inserted unless they aren't
-displayed.  The default value is @code{(".*/.*")}.
+displayed or this variable is overriden by
+@code{gnus-buttonized-mime-types}.  The default value is
+@code{(".*/.*")}.
+
+@item gnus-buttonized-mime-types
+@vindex gnus-buttonized-mime-types
+This is a list of regexps.  @sc{mime} types that match a regexp from
+this list will have @sc{mime} buttons inserted unless they aren't
+displayed.  This variable overrides
+@code{gnus-unbuttonized-mime-types}.  The default value is @code{nil}.
+
+To see e.g. security buttons but no other buttons, you could set this
+variable to @code{("multipart/signed")} and leave
+@code{gnus-unbuttonized-mime-types} to the default value.
 
 @item gnus-article-mime-part-function
 @vindex gnus-article-mime-part-function