Sync up with chao-6_9.
[elisp/gnus.git-] / lisp / gnus-start.el
index 0b328db..1d1260d 100644 (file)
@@ -1,7 +1,7 @@
 ;;; gnus-start.el --- startup functions for Gnus
 ;; Copyright (C) 1996,97,98 Free Software Foundation, Inc.
 
-;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news
 
 ;; This file is part of GNU Emacs.
 (eval-when-compile (require 'cl))
 
 (defcustom gnus-startup-file (nnheader-concat gnus-home-directory ".newsrc")
-  "*Your `.newsrc' file.
+  "Your `.newsrc' file.
 `.newsrc-SERVER' will be used instead if that exists."
   :group 'gnus-start
   :type 'file)
 
 (defcustom gnus-init-file (nnheader-concat gnus-home-directory ".gnus")
-  "*Your Gnus Emacs-Lisp startup file name.
+  "Your Gnus Emacs-Lisp startup file name.
 If a file with the `.el' or `.elc' suffixes exists, it will be read instead."
   :group 'gnus-start
   :type 'file)
@@ -58,7 +58,7 @@ If a file with the `.el' or `.elc' suffixes exists, it will be read instead."
   :type '(choice file (const nil)))
 
 (defcustom gnus-default-subscribed-newsgroups nil
-  "*List of newsgroups to subscribe, when a user runs Gnus the first time.
+  "List of newsgroups to subscribe, when a user runs Gnus the first time.
 The value should be a list of strings.
 If it is t, Gnus will not do anything special the first time it is
 started; it'll just use the normal newsgroups subscription methods."
@@ -254,8 +254,6 @@ for your decision; `gnus-subscribe-killed' kills all new groups;
                (function-item gnus-subscribe-zombies)
                function))
 
-;; Suggested by a bug report by Hallvard B Furuseth.
-;; <h.b.furuseth@usit.uio.no>.
 (defcustom gnus-subscribe-options-newsgroup-method
   'gnus-subscribe-alphabetically
   "*This function is called to subscribe newsgroups mentioned on \"options -n\" lines.
@@ -289,7 +287,7 @@ hierarchy in its entirety."
   :type 'boolean)
 
 (defcustom gnus-auto-subscribed-groups
-  "^nnml\\|^nnfolder\\|^nnmbox\\|^nnmh\\|^nnbabyl"
+  "nnml\\|^nnfolder\\|^nnmbox\\|^nnmh\\|^nnbabyl"
   "*All new groups that match this regexp will be subscribed automatically.
 Note that this variable only deals with new groups.  It has no effect
 whatsoever on old groups.
@@ -328,34 +326,34 @@ disc."
   :type 'boolean)
 
 (defcustom gnus-check-bogus-groups-hook nil
-  "*A hook run after removing bogus groups."
+  "A hook run after removing bogus groups."
   :group 'gnus-start-server
   :type 'hook)
 
 (defcustom gnus-startup-hook nil
-  "*A hook called at startup.
+  "A hook called at startup.
 This hook is called after Gnus is connected to the NNTP server."
   :group 'gnus-start
   :type 'hook)
 
 (defcustom gnus-before-startup-hook nil
-  "*A hook called at before startup.
+  "A hook called at before startup.
 This hook is called as the first thing when Gnus is started."
   :group 'gnus-start
   :type 'hook)
 
 (defcustom gnus-started-hook nil
-  "*A hook called as the last thing after startup."
+  "A hook called as the last thing after startup."
   :group 'gnus-start
   :type 'hook)
 
 (defcustom gnus-setup-news-hook nil
-  "*A hook after reading the .newsrc file, but before generating the buffer."
+  "A hook after reading the .newsrc file, but before generating the buffer."
   :group 'gnus-start
   :type 'hook)
 
 (defcustom gnus-get-new-news-hook nil
-  "*A hook run just before Gnus checks for new news."
+  "A hook run just before Gnus checks for new news."
   :group 'gnus-group-new
   :type 'hook)
 
@@ -367,26 +365,28 @@ This hook is called as the first thing when Gnus is started."
   :type 'hook)
 
 (defcustom gnus-save-newsrc-hook nil
-  "*A hook called before saving any of the newsrc files."
+  "A hook called before saving any of the newsrc files."
   :group 'gnus-newsrc
   :type 'hook)
 
 (defcustom gnus-save-quick-newsrc-hook nil
-  "*A hook called just before saving the quick newsrc file.
+  "A hook called just before saving the quick newsrc file.
 Can be used to turn version control on or off."
   :group 'gnus-newsrc
   :type 'hook)
 
 (defcustom gnus-save-standard-newsrc-hook nil
-  "*A hook called just before saving the standard newsrc file.
+  "A hook called just before saving the standard newsrc file.
 Can be used to turn version control on or off."
   :group 'gnus-newsrc
   :type 'hook)
 
-;;; Internal variables
+(defcustom gnus-always-read-dribble-file nil
+  "Uncoditionally read the dribble file."
+  :group 'gnus-newsrc
+  :type 'boolean)
 
-(defvar gnus-always-read-dribble-file nil
-  "Uncoditionally read the dribble file.")
+;;; Internal variables
 
 (defvar gnus-newsrc-file-version nil)
 (defvar gnus-override-subscribe-method nil)
@@ -579,6 +579,7 @@ the first newsgroup."
 (defvar gnus-newsgroup-unreads)
 (defvar nnoo-state-alist)
 (defvar gnus-current-select-method)
+
 (defun gnus-clear-system ()
   "Clear all variables and buffers."
   ;; Clear Gnus variables.
@@ -622,8 +623,9 @@ the first newsgroup."
     (kill-buffer (get-file-buffer (gnus-newsgroup-kill-file nil))))
   (gnus-kill-buffer nntp-server-buffer)
   ;; Kill Gnus buffers.
-  (while gnus-buffer-list
-    (gnus-kill-buffer (pop gnus-buffer-list)))
+  (let ((buffers (gnus-buffers)))
+    (when buffers
+      (mapcar 'kill-buffer buffers)))
   ;; Remove Gnus frames.
   (gnus-kill-gnus-frames))
 
@@ -655,8 +657,8 @@ prompt the user for the name of an NNTP server to use."
              (> arg 0)
              (max (car gnus-group-list-mode) arg))))
 
-    (gnus-splash)
     (gnus-clear-system)
+    (gnus-splash)
     (gnus-run-hooks 'gnus-before-startup-hook)
     (nnheader-init-server-buffer)
     (setq gnus-slave slave)
@@ -773,9 +775,8 @@ prompt the user for the name of an NNTP server to use."
   (let ((dribble-file (gnus-dribble-file-name)))
     (save-excursion
       (set-buffer (setq gnus-dribble-buffer
-                       (get-buffer-create
+                       (gnus-get-buffer-create
                         (file-name-nondirectory dribble-file))))
-      (gnus-add-current-to-buffer-list)
       (erase-buffer)
       (setq buffer-file-name dribble-file)
       (auto-save-mode t)
@@ -935,13 +936,25 @@ If LEVEL is non-nil, the news will be set up at level LEVEL."
   "Search for new newsgroups and add them.
 Each new newsgroup will be treated with `gnus-subscribe-newsgroup-method.'
 The `-n' option line from .newsrc is respected.
-If ARG (the prefix), use the `ask-server' method to query the server
-for new groups."
-  (interactive "P")
-  (let ((check (if (or (and arg (not (listp gnus-check-new-newsgroups)))
-                      (null gnus-read-active-file)
-                      (eq gnus-read-active-file 'some))
-                  'ask-server gnus-check-new-newsgroups)))
+
+With 1 C-u, use the `ask-server' method to query the server for new
+groups.
+With 2 C-u's, use most complete method possible to query the server
+for new groups, and subscribe the new groups as zombies."
+  (interactive "p")
+  (let* ((gnus-subscribe-newsgroup-method
+         gnus-subscribe-newsgroup-method)
+        (check (cond
+               ((or (and (= (or arg 1) 4)
+                         (not (listp gnus-check-new-newsgroups)))
+                    (null gnus-read-active-file)
+                    (eq gnus-read-active-file 'some))
+                'ask-server)
+               ((= (or arg 1) 16)
+                (setq gnus-subscribe-newsgroup-method
+                      'gnus-subscribe-zombies)
+                t)
+               (t gnus-check-new-newsgroups))))
     (unless (gnus-check-first-time-used)
       (if (or (consp check)
              (eq check 'ask-server))
@@ -1034,13 +1047,13 @@ for new groups."
     ;; Go through both primary and secondary select methods and
     ;; request new newsgroups.
     (while (setq method (gnus-server-get-method nil (pop methods)))
-      (setq new-newsgroups nil)
-      (setq gnus-override-subscribe-method method)
+      (setq new-newsgroups nil
+           gnus-override-subscribe-method method)
       (when (and (gnus-check-server method)
                 (gnus-request-newgroups date method))
        (save-excursion
-         (setq got-new t)
-         (setq hashtb (gnus-make-hashtable 100))
+         (setq got-new t
+               hashtb (gnus-make-hashtable 100))
          (set-buffer nntp-server-buffer)
          ;; Enter all the new groups into a hashtable.
          (gnus-active-to-gnus-format method hashtb 'ignore))
@@ -1076,9 +1089,10 @@ for new groups."
         hashtb))
       (when new-newsgroups
        (gnus-subscribe-hierarchical-interactive new-newsgroups)))
-    (when (> groups 0)
-      (gnus-message 6 "%d new newsgroup%s arrived."
-                   groups (if (> groups 1) "s have" " has")))
+     (if (> groups 0)
+        (gnus-message 5 "%d new newsgroup%s arrived"
+                      groups (if (> groups 1) "s have" " has"))
+       (gnus-message 5 "No new newsgroups"))
     (when got-new
       (setq gnus-newsrc-last-checked-date new-date))
     got-new))
@@ -1118,7 +1132,9 @@ for new groups."
            (gnus-group-change-level
             (car groups) gnus-level-default-subscribed gnus-level-killed))
          (setq groups (cdr groups)))
-       (gnus-group-make-help-group)
+       (save-excursion
+         (set-buffer gnus-group-buffer)
+         (gnus-group-make-help-group))
        (when gnus-novice-user
          (gnus-message 7 "`A k' to list killed groups"))))))
 
@@ -1370,6 +1386,7 @@ newsgroup."
                info (inline (gnus-find-method-for-group
                              (gnus-info-group info)))))
       (gnus-activate-group (gnus-info-group info) nil t))
+
     (let* ((range (gnus-info-read info))
           (num 0))
       ;; If a cache is present, we may have to alter the active info.
@@ -1481,6 +1498,10 @@ newsgroup."
          ;; These groups are foreign.  Check the level.
          (when (<= (gnus-info-level info) foreign-level)
            (setq active (gnus-activate-group group 'scan))
+           ;; Let the Gnus agent save the active file.
+           (when (and gnus-agent gnus-plugged active)
+             (gnus-agent-save-group-info
+              method (gnus-group-real-name group) active))
            (unless (inline (gnus-virtual-group-p group))
              (inline (gnus-close-group group)))
            (when (fboundp (intern (concat (symbol-name (car method))
@@ -1681,11 +1702,10 @@ newsgroup."
 
 
 (defun gnus-ignored-newsgroups-has-to-p ()
-  "T only when gnus-ignored-newsgroups includes \"^to\\\\.\" as an element."
+  "Non-nil iff gnus-ignored-newsgroups includes \"^to\\\\.\" as an element."
   ;; note this regexp is the same as:
   ;; (concat (regexp-quote "^to\\.") "\\($\\|" (regexp-quote "\\|") "\\)")
-  (string-match "\\^to\\\\\\.\\($\\|\\\\|\\)"
-               gnus-ignored-newsgroups))
+  (string-match "\\^to\\\\\\.\\($\\|\\\\|\\)" gnus-ignored-newsgroups))
 
 ;; Read an active file and place the results in `gnus-active-hashtb'.
 (defun gnus-active-to-gnus-format (&optional method hashtb ignore-errors
@@ -1970,7 +1990,8 @@ If FORCE is non-nil, the .newsrc file is read."
     (if (or (file-exists-p real-file)
            (file-exists-p (concat real-file ".el"))
            (file-exists-p (concat real-file ".eld")))
-       real-file file)))
+       real-file
+      file)))
 
 (defun gnus-newsrc-to-gnus-format ()
   (setq gnus-newsrc-options "")
@@ -2241,13 +2262,12 @@ If FORCE is non-nil, the .newsrc file is read."
            (gnus-gnus-to-newsrc-format)
            (gnus-message 8 "Saving %s...done" gnus-current-startup-file))
          ;; Save .newsrc.eld.
-         (set-buffer (get-buffer-create " *Gnus-newsrc*"))
+         (set-buffer (gnus-get-buffer-create " *Gnus-newsrc*"))
          (make-local-variable 'version-control)
          (setq version-control 'never)
          (setq buffer-file-name
                (concat gnus-current-startup-file ".eld"))
          (setq default-directory (file-name-directory buffer-file-name))
-         (gnus-add-current-to-buffer-list)
          (buffer-disable-undo (current-buffer))
          (erase-buffer)
          (gnus-message 5 "Saving %s.eld..." gnus-current-startup-file)
@@ -2363,6 +2383,13 @@ If FORCE is non-nil, the .newsrc file is read."
 ;;; Slave functions.
 ;;;
 
+(defvar gnus-slave-mode nil)
+
+(defun gnus-slave-mode ()
+  "Minor mode for slave Gnusae."
+  (gnus-add-minor-mode 'gnus-slave-mode " Slave" (make-sparse-keymap))
+  (gnus-run-hooks 'gnus-slave-mode-hook))
+
 (defun gnus-slave-save-newsrc ()
   (save-excursion
     (set-buffer gnus-dribble-buffer)
@@ -2389,7 +2416,7 @@ If FORCE is non-nil, the .newsrc file is read."
        ()                              ; There are no slave files to read.
       (gnus-message 7 "Reading slave newsrcs...")
       (save-excursion
-       (set-buffer (get-buffer-create " *gnus slave*"))
+       (set-buffer (gnus-get-buffer-create " *gnus slave*"))
        (buffer-disable-undo (current-buffer))
        (setq slave-files
              (sort (mapcar (lambda (file)