*** empty log message ***
[gnus] / lisp / gnus-start.el
index 64c0272..243f81d 100644 (file)
@@ -32,6 +32,7 @@
 (require 'gnus-range)
 (require 'gnus-util)
 (require 'message)
+(eval-when-compile (require 'cl))
 
 (defcustom gnus-startup-file (nnheader-concat gnus-home-directory ".newsrc")
   "Your `.newsrc' file.
   :type 'file)
 
 (defcustom gnus-init-file (nnheader-concat gnus-home-directory ".gnus")
-  "Your Gnus elisp startup file.
-If a file with the .el or .elc suffixes exist, it will be read
-instead."
+  "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)
 
 (defcustom gnus-site-init-file
-  (ignore-errors
-    (concat (file-name-directory
-            (directory-file-name installation-directory))
-           "site-lisp/gnus-init"))
-  "The site-wide Gnus elisp startup file.
-If a file with the .el or .elc suffixes exist, it will be read
-instead."
+  (condition-case nil
+      (concat (file-name-directory
+              (directory-file-name installation-directory))
+             "site-lisp/gnus-init")
+    (error nil))
+  "The site-wide Gnus Emacs-Lisp startup file name, or nil if none.
+If a file with the `.el' or `.elc' suffixes exists, it will be read instead."
   :group 'gnus-start
-  :type 'file)
+  :type '(choice file (const nil)))
 
 (defcustom gnus-default-subscribed-newsgroups nil
-  "This variable lists what newsgroups should be subscribed the first time Gnus is used.
-It should be a list of strings.
-If it is `t', Gnus will not do anything special the first time it is
+  "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."
   :group 'gnus-start
-  :type '(repeat string))
+  :type '(choice (repeat string) (const :tag "Nothing special" t)))
 
 (defcustom gnus-use-dribble-file t
   "*Non-nil means that Gnus will use a dribble file to store user updates.
@@ -79,7 +79,7 @@ saved will be used."
   :group 'gnus-dribble-file
   :type '(choice directory (const nil)))
 
-(defcustom gnus-check-new-newsgroups t
+(defcustom gnus-check-new-newsgroups 'ask-server
   "*Non-nil means that Gnus will run gnus-find-new-newsgroups at startup.
 This normally finds new newsgroups by comparing the active groups the
 servers have already reported with those Gnus already knows, either alive
@@ -123,7 +123,7 @@ check for bogus newsgroups with \\<gnus-group-mode-map>\\[gnus-group-check-bogus
   :group 'gnus-start-server
   :type 'boolean)
 
-(defcustom gnus-read-active-file t
+(defcustom gnus-read-active-file 'some
   "*Non-nil means that Gnus will read the entire active file at startup.
 If this variable is nil, Gnus will only know about the groups in your
 `.newsrc' file.
@@ -337,6 +337,12 @@ 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.
+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."
   :group 'gnus-start
@@ -642,14 +648,19 @@ prompt the user for the name of an NNTP server to use."
 
     (gnus-splash)
     (gnus-clear-system)
+    (run-hooks 'gnus-before-startup-hook)
     (nnheader-init-server-buffer)
-    (gnus-read-init-file)
     (setq gnus-slave slave)
+    (gnus-read-init-file)
 
-    (when (and (string-match "XEmacs" (emacs-version))
-              gnus-simple-splash)
+    (when gnus-simple-splash
       (setq gnus-simple-splash nil)
-      (gnus-xmas-splash))
+      (cond
+       (gnus-xemacs
+       (gnus-xmas-splash))
+       ((and (eq window-system 'x)
+            (= (frame-height) (1+ (window-height))))
+       (gnus-x-splash))))
 
     (let ((level (and (numberp arg) (> arg 0) arg))
          did-connect)
@@ -679,6 +690,7 @@ prompt the user for the name of an NNTP server to use."
 
          ;; Do the actual startup.
          (gnus-setup-news nil level dont-connect)
+         (gnus-start-draft-setup)
          ;; Generate the group buffer.
          (gnus-group-list-groups level)
          (gnus-group-first-unread-group)
@@ -686,12 +698,21 @@ prompt the user for the name of an NNTP server to use."
          (gnus-group-set-mode-line)
          (run-hooks 'gnus-started-hook))))))
 
+(defun gnus-start-draft-setup ()
+  "Make sure the draft group exists."
+  (unless (gnus-gethash "nndraft:draft" gnus-newsrc-hashtb)
+    (gnus-request-create-group "draft" '(nndraft ""))
+    (let ((gnus-level-default-subscribed 1))
+      (gnus-subscribe-group "nndraft:draft" nil '(nndraft "")))
+    (gnus-group-set-parameter
+     "nndraft:draft" 'gnus-dummy '((gnus-draft-mode)))))
+
 ;;;###autoload
 (defun gnus-unload ()
   "Unload all Gnus features."
   (interactive)
   (unless (boundp 'load-history)
-    (error "Sorry, `gnus-unload' is not implemented in this Emacs version."))
+    (error "Sorry, `gnus-unload' is not implemented in this Emacs version"))
   (let ((history load-history)
        feature)
     (while history
@@ -840,7 +861,7 @@ If LEVEL is non-nil, the news will be set up at level LEVEL."
     ;; done in `gnus-get-unread-articles'.
     (and gnus-read-active-file
         (not level)
-        (gnus-read-active-file))
+        (gnus-read-active-file nil dont-connect))
 
     (unless gnus-active-hashtb
       (setq gnus-active-hashtb (gnus-make-hashtable 4096)))
@@ -897,8 +918,8 @@ 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."
+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)
@@ -1052,7 +1073,8 @@ the server for new groups."
       nil
     (gnus-message 6 "First time user; subscribing you to default groups")
     (unless (gnus-read-active-file-p)
-      (gnus-read-active-file))
+      (let ((gnus-read-active-file t))
+       (gnus-read-active-file)))
     (setq gnus-newsrc-last-checked-date (current-time-string))
     (let ((groups gnus-default-subscribed-newsgroups)
          group)
@@ -1211,7 +1233,8 @@ the server for new groups."
           (format
            "(gnus-group-set-info '%S)" info)))))
       (when gnus-group-change-level-function
-       (funcall gnus-group-change-level-function group level oldlevel)))))
+       (funcall gnus-group-change-level-function
+                group level oldlevel previous)))))
 
 (defun gnus-kill-newsgroup (newsgroup)
   "Obsolete function.  Kills a newsgroup."
@@ -1313,12 +1336,13 @@ newsgroup."
         ;; command may have responded with the `(0 . 0)'.  We
         ;; ignore this if we already have an active entry
         ;; for the group.
-        (unless (and (zerop (car active))
-                     (zerop (cdr active))
-                     (gnus-active group))
-          (gnus-set-active group active))
-        ;; Return the new active info.
-        active)))
+        (if (and (zerop (car active))
+                 (zerop (cdr active))
+                 (gnus-active group))
+            (gnus-active group)
+          (gnus-set-active group active)
+          ;; Return the new active info.
+          active))))
 
 (defun gnus-get-unread-articles-in-group (info active &optional update)
   (when active
@@ -1561,11 +1585,12 @@ newsgroup."
   (gnus-dribble-touch))
 
 ;; Get the active file(s) from the backend(s).
-(defun gnus-read-active-file (&optional force)
+(defun gnus-read-active-file (&optional force not-native)
   (gnus-group-set-mode-line)
   (let ((methods
         (append
-         (if (gnus-check-server gnus-select-method)
+         (if (and (not not-native)
+                  (gnus-check-server gnus-select-method))
              ;; The native server is available.
              (cons gnus-select-method gnus-secondary-select-methods)
            ;; The native server is down, so we just do the
@@ -1617,18 +1642,20 @@ newsgroup."
                     1.2 "Cannot read partial active file from %s server."
                     (car method)))
                   ((eq list-type 'active)
-                   (gnus-active-to-gnus-format method gnus-active-hashtb))
+                   (gnus-active-to-gnus-format
+                    method gnus-active-hashtb nil t))
                   (t
-                   (gnus-groups-to-gnus-format method gnus-active-hashtb))))))
+                   (gnus-groups-to-gnus-format
+                    method gnus-active-hashtb t))))))
             ((null method)
              t)
             (t
              (if (not (gnus-request-list method))
                  (unless (equal method gnus-message-archive-method)
-                   (gnus-error 1 "Cannot read active file from %s server."
+                   (gnus-error 1 "Cannot read active file from %s server"
                                (car method)))
                (gnus-message 5 mesg)
-               (gnus-active-to-gnus-format method gnus-active-hashtb)
+               (gnus-active-to-gnus-format method gnus-active-hashtb nil t)
                ;; We mark this active file as read.
                (push method gnus-have-read-active-file)
                (gnus-message 5 "%sdone" mesg))))))
@@ -1643,7 +1670,8 @@ newsgroup."
                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)
+(defun gnus-active-to-gnus-format (&optional method hashtb ignore-errors
+                                            real-active)
   (unless method
     (setq method gnus-select-method))
   (let ((cur (current-buffer))
@@ -1672,6 +1700,10 @@ newsgroup."
     (while (re-search-backward "[][';?()#]" nil t)
       (insert ?\\))
 
+    ;; Let the Gnus agent save the active file.
+    (when (and gnus-agent real-active)
+      (gnus-agent-save-active method))
+
     ;; If these are groups from a foreign select method, we insert the
     ;; group prefix in front of the group names.
     (when (not (gnus-server-equal
@@ -1720,7 +1752,7 @@ newsgroup."
        (widen)
        (forward-line 1)))))
 
-(defun gnus-groups-to-gnus-format (method &optional hashtb)
+(defun gnus-groups-to-gnus-format (method &optional hashtb real-active)
   ;; Parse a "groups" active file.
   (let ((cur (current-buffer))
        (hashtb (or hashtb
@@ -1735,6 +1767,10 @@ newsgroup."
                           (gnus-server-get-method nil gnus-select-method)))
                     (gnus-group-prefixed-name "" method))))
 
+    ;; Let the Gnus agent save the active file.
+    (when (and gnus-agent real-active)
+      (gnus-agent-save-groups method))
+    
     (goto-char (point-min))
     ;; We split this into to separate loops, one with the prefix
     ;; and one without to speed the reading up somewhat.
@@ -2207,7 +2243,8 @@ If FORCE is non-nil, the .newsrc file is read."
 
 (defun gnus-gnus-to-quick-newsrc-format ()
   "Insert Gnus variables such as gnus-newsrc-alist in lisp format."
-  (let ((print-quoted t))
+  (let ((print-quoted t)
+       (print-escape-newlines t))
     (insert ";; -*- emacs-lisp -*-\n")
     (insert ";; Gnus startup file.\n")
     (insert