*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 02:48:15 +0000 (02:48 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 02:48:15 +0000 (02:48 +0000)
17 files changed:
lisp/ChangeLog
lisp/browse-url.el [new file with mode: 0644]
lisp/custom.el
lisp/gnus-cache.el
lisp/gnus-ems.el
lisp/gnus-kill.el
lisp/gnus-msg.el
lisp/gnus-score.el
lisp/gnus-vis.el
lisp/gnus-vm.el
lisp/gnus.el
lisp/nnbabyl.el
lisp/nnfolder.el
lisp/nnmbox.el
lisp/nnmh.el
lisp/nnml.el
texi/gnus.texi

index bb3c136..7388dc6 100644 (file)
@@ -1,3 +1,71 @@
+Sat Jul 15 20:08:47 1995  Lars Magne Ingebrigtsen  <lingebri@sunscipw.cern.ch>
+
+       * gnus-kill.el (gnus-kill-save-kill-file): New variable.
+       (gnus-kill-parse-gnus-kill-file): Don't save kill files unless you
+       really want to.
+
+Sat Jul 15 03:54:00 1995  Sudish Joseph <joseph@cis.ohio-state.edu>
+
+       * gnus-vis.el (gnus-article-add-button): Use overlays for
+         gnus-article-button-face to ensure that it gets priority
+         during display.
+
+Sat Jul 15 17:50:23 1995  Lars Magne Ingebrigtsen  <lingebri@sunscipw.cern.ch>
+
+       * gnus.el (gnus-article-summary-command-nosave): Pop instead of
+       switch to the summary buffer. 
+
+       * gnus-score.el (gnus-summary-increase-score): Make sure
+       gnus-score-winconf isn't nil. 
+
+       * gnus-vm.el: Use gnus-article-copy instead of the article buffer.
+
+       * gnus-vis.el (gnus-summary-make-menu-bar): Don't recreate menus
+       if the are already created. 
+
+       * gnus.el (gnus-group-get-new-news): Would not check unread
+       articles when using permament levels. 
+
+       * nnfolder.el (nnfolder-request-accept-article): Didn't accept a
+       respool request. 
+
+       * gnus-score.el (gnus-score-add-followups): Bugged out all over
+       the place. 
+
+Fri Jul 14 15:25:20 1995  Per Abrahamsen  <abraham@dina.kvl.dk>
+
+       * gnus-vis.el (gnus-button-url): Default to `gnus-netscape-open-url'.
+       (gnus-netscape-open-url): New function.
+       (gnus-netscape-start-url): New function.
+
+Fri Jul 14 10:03:07 1995  Lars Magne Ingebrigtsen  <lingebri@sunscipw.cern.ch>
+
+       * gnus.el (gnus-cache-removeable-articles): Make this a local
+       variable to the summary buffers.
+
+       * gnus-cache.el (gnus-cache-change-buffer): Don't reset 
+        gnus-cache-removeable-articles here.
+
+       * gnus-msg.el (gnus-summary-followup): Make sure we get the
+       current headers. 
+
+       * gnus-ems.el: Removed def for `gnus-header-face-alist'.
+       (gnus-ems-redefine): Redefined gnus-article-push-button for
+       XEmacs. 
+
+Thu Jul 13 12:12:15 1995  Scott Byer  <byer@mv.us.adobe.com>
+
+       * nnfolder.el (nnfolder-request-expire-articles) commented out
+       line that was causing a problem when exiting group.
+
+       * nnfolder.el (nnfolder-request-list) always get the active list
+       from the file, since we're being more careful to keep it up to
+       date.  Fixes new-group creation problems.
+
+       * nnfolder.el (nnfolder-request-group) added timestamp check on
+       active file.  Fixed problem of new messages not being shown upon
+       first starting up (ding).
+
 Thu Jul 13 00:14:09 1995  Lars Magne Ingebrigtsen  <lingebri@sunscipw.cern.ch>
 
        * nndoc.el (nndoc-type-to-regexp): Some digests do not start with
 Thu Jul 13 00:14:09 1995  Lars Magne Ingebrigtsen  <lingebri@sunscipw.cern.ch>
 
        * nndoc.el (nndoc-type-to-regexp): Some digests do not start with
diff --git a/lisp/browse-url.el b/lisp/browse-url.el
new file mode 100644 (file)
index 0000000..6b97644
--- /dev/null
@@ -0,0 +1,439 @@
+;;; browse-url.el --- ask a WWW browser to load a URL
+
+;; Copyright 1995 Free Software Foundation, Inc.
+
+;; Author: Denis Howe <dbh@doc.ic.ac.uk>
+;; Maintainer: Denis Howe <dbh@doc.ic.ac.uk>
+;; Created: 03 Apr 1995
+;; Version: 0.16 17 May 1995
+;; Keywords: hypertext
+;; X-Home page: http://wombat.doc.ic.ac.uk/
+
+;; 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 1, 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, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Commentary:
+
+;; The latest version of this package should be available from
+;; <URL:http://wombat.doc.ic.ac.uk/emacs/browse-url.el>.
+
+;; This package provides functions which read a URL (Uniform Resource
+;; Locator) from the minibuffer, defaulting to the URL around point,
+;; and ask a World-Wide Web browser to load it.  It can also load the
+;; URL associated with the current buffer.  Different browsers use
+;; different methods of remote control so there is one function for
+;; each supported browser.  If the chosen browser is not running, it
+;; is started.  Currently there is support for:
+
+;; Function             Browser     Earliest version
+;; browse-url-netscape  Netscape    1.1b1         
+;; browse-url-mosaic    XMosaic     <= 2.4
+;; browse-url-w3        w3          0
+;; browse-url-iximosaic IXI Mosaic  ?
+
+;; Note that earlier versions of Netscape did not have remote control.
+;; <URL:http://home.netscape.com/newsref/std/x-remote.html> and
+;; <URL:http://home.netscape.com/info/APIs/>.
+
+;; If using Mosaic, check the definition of browse-url-usr1-signal
+;; below.
+;; <URL:http://www.ncsa.uiuc.edu/SDG/Software/XMosaic/remote-control.html>
+
+;; William M. Perry's excellent "w3" WWW browser for
+;; Emacs <URL:ftp://cs.indiana.edu/pub/elisp/w3/>
+;; has a function w3-follow-url-at-point, but that
+;; doesn't let you edit the URL like browse-url.
+
+;; I recommend Nelson Minar <nelson@santafe.edu>'s excellent
+;; html-helper-mode.el for editing HTML and thank Nelson for
+;; his many useful comments on this code.
+;; <URL:http://www.santafe.edu/~nelson/hhm-beta/>
+
+;; This package generalises function html-previewer-process in Marc
+;; Andreessen <marca@ncsa.uiuc.edu>'s html-mode (LCD
+;; modes/html-mode.el.Z) and provides better versions of the URL
+;; functions in Michelangelo Grigni <mic@cs.ucsd.edu>'s ffap.el
+;; (find-file-at-point) <URL:ftp://cs.ucsd.edu:/pub/mic/>.  The huge
+;; hyperbole package also contains similar functions.
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Help!
+
+;; Can you write and test some code for the Macintrash and Windoze
+;; Netscape remote control APIs?  (See the URL above).
+
+;; Did earlier versions of Mosaic have remote control?
+
+;; Do any other browsers have remote control?
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Installation
+
+;; In your ~/.emacs, put:
+;;
+;;     (setq browse-url-browser-function
+;;           (if (eq window-system 'x)
+;;               'browse-url-netscape ; or browse-url-mosaic
+;;             'browse-url-w3))
+;;     (autoload browse-url-browser-function "browse-url.el"
+;;       "Ask a WWW browser to show a URL." t)
+;; Bind this to control-X w (normally undefined):
+;;     (global-set-key "\C-xw" browse-url-browser-function)
+;;     ;; Note: no quote       ^
+
+;; For viewing current buffer:
+;;
+;;     (autoload 'browse-url-of-file "browse-url.el"
+;;       "Ask a WWW browser to display the current file." t)
+;;     (setq browse-url-save-file t)   ; Always save
+
+;; To get round the Netscape caching problem, you could try either of
+;; the following (but not both).  EITHER write-file in
+;; html-helper-mode makes Netscape reload document:
+;;
+;;     (autoload 'browse-url-netscape-reload "browse-url.el"
+;;       "Ask a WWW browser to redisplay the current file." t)
+;;     (add-hook 'html-helper-mode-hook
+;;               (function (lambda ()
+;;                  (add-hook 'local-write-file-hooks
+;;                            (function (lambda ()
+;;                               (let ((local-write-file-hooks))
+;;                                 (save-buffer))
+;;                               (browse-url-netscape-reload)
+;;                               t))                   ; => file written by hook
+;;                            t))))                    ; append to l-w-f-hooks
+;;
+;; [Does this work for html-mode too?]
+
+;; OR browse-url-of-file ask Netscape to load and then reload the
+;; file:
+;;
+;;     (add-hook 'browse-url-of-file-hook 'browse-url-netscape-reload)
+
+;; You may also want to customise browse-url-netscape-arguments, eg.
+;;
+;;     (setq browse-url-netscape-arguments '("-install"))
+;;
+;; or similarly for the other browsers. 
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Change Log:
+
+;; 0.00 03 Apr 1995 Denis Howe <dbh@doc.ic.ac.uk>
+;;     Created.
+
+;; 0.01 04 Apr 1995
+;;     All names start with "browse-url-".  Added provide.
+
+;; 0.02 05 Apr 1995
+;;     Save file at start of browse-url-of-file.
+;;     Use start-process instead of start-process-shell-command.
+
+;; 0.03 06 Apr 1995
+;;     Add browse-url-netscape-reload, browse-url-netscape-command.
+;;     browse-url-of-file save file option.
+
+;; 0.04 08 Apr 1995
+;;     b-u-file-url separate function.  Change b-u-filename-alist
+;;     default.
+
+;; 0.05 09 Apr 1995
+;;     Added b-u-of-file-hook.
+
+;; 0.06 11 Apr 1995
+;;     Improved .emacs suggestions and documentation.
+
+;; 0.07 13 Apr 1995
+;;     Added browse-url-interactive-arg optional prompt.
+
+;; 0.08 18 Apr 1995
+;;     Exclude final "." from browse-url-regexp.
+
+;; 0.09 21 Apr 1995
+;;     Added mouse-set-point to browse-url-interactive-arg.
+
+;; 0.10 24 Apr 1995
+;;     Added Mosaic signal sending variations.
+;;     Thanks Brian K Servis <servis@ecn.purdue.edu>.
+;;     Don't use xprop for Netscape.
+
+;; 0.11 25 Apr 1995
+;;     Fix reading of ~/.mosaicpid.  Thanks Dag.H.Wanvik@kvatro.no.
+
+;; 0.12 27 Apr 1995
+;;     Interactive prefix arg => URL *after* point.
+;;     Thanks Michelangelo Grigni <mic@cs.ucsd.edu>.
+;;     Added IXI Mosaic support.
+;;     Thanks David Karr <dkarr@nmo.gtegsc.com>.
+
+;; 0.13 28 Apr 1995
+;;     Exclude final [,;] from browse-url-regexp.
+
+;; 0.14 02 May 1995
+;;     Provide browser argument variables.
+
+;; 0.15 07 May 1995
+;;     More Netscape options.  Thanks Peter Arius
+;;     <arius@immd2.informatik.uni-erlangen.de>.
+
+;; 0.16 17 May 1995
+;;     Added browse-url-at-mouse.
+;;     Thanks Wayne Mesard <wmesard@sgi.com>
+
+;; 0.17 27 Jun 1995
+;;     Renamed browse-url-at-point to browse-url-url-at-point.
+;;     Added browse-url-at-point.
+;;     Thanks Jonathan Cano <cano@patch.tandem.com>.
+
+;; Netscape can cache Web pages so it may be necessary to tell it to
+;; reload the current page if it has changed (eg. if you have edited
+;; it).  There is currently no perfect automatic solution to this.
+
+;; Netscape allows you to specify the id of the window you want to
+;; control but which window DO you want to control and how do you
+;; discover its id?
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Code:
+
+(defvar browse-url-regexp
+  "\\(https?://\\|ftp://\\|gopher://\\|telnet://\\|wais://\\|file:/\\|s?news:\\|mailto:\\)[^]\t\n \"'()<>[^`{}]*[^]\t\n \"'()<>[^`{}.,;]+"
+  "A regular expression probably matching a URL.")
+
+(defvar browse-url-browser-function
+  'browse-url-netscape
+  "*Function to display the current buffer in a WWW browser.
+Used by function `browse-url-of-file'.")
+
+(defvar browse-url-netscape-arguments nil
+  "*A list of strings to pass to Netscape as arguments.")
+
+(defvar browse-url-netscape-new-window-p nil
+  "*If non-nil, Netscape always opens a new window.
+Passing an interactive argument to \\[browse-url-netscape] reverses
+the effect of this variable.  Requires Netscape version 1.1N or
+later.")
+
+(defvar browse-url-mosaic-arguments nil
+  "*A list of strings to pass to Mosaic as arguments.")
+
+(defvar browse-url-filename-alist
+  '(("^/+" . "file:/"))
+  "An alist of (REGEXP . STRING) pairs.
+Any substring of a filename matching one of the REGEXPs is replaced by
+the corresponding STRING.  All pairs are applied in the order given.
+Used by function `browse-url-of-file'.")
+
+(defvar browse-url-save-file nil
+  "If non-nil, save the buffer before displaying its file.
+Used by function `browse-url-of-file'.")
+
+(defvar browse-url-of-file-hook nil
+  "A hook to be run with run-hook after `browse-url-of-file' has asked
+a browser to load a file.
+
+Set this to `browse-url-netscape-reload' to force Netscape to load the
+file rather than displaying a cached copy.")
+
+(defvar browse-url-usr1-signal
+  (if (and (boundp 'emacs-major-version)
+          (or (> emacs-major-version 19) (>= emacs-minor-version 29)))
+      'sigusr1
+    30)                                        ; Check /usr/include/signal.h.
+  "The argument to `signal-process' for sending SIGUSR1 to XMosaic.
+Emacs 19.29 accepts 'sigusr1, earlier versions require an integer
+which is 30 on SunOS and 16 on HP-UX and Solaris.")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; URL input
+
+;; thingatpt.el doesn't work for complex regexps.
+
+(defun browse-url-url-at-point ()
+  "Return the URL around or before point.
+Then search backwards for the start of a URL.  If no URL found, return
+the empty string."
+  (if (or (looking-at browse-url-regexp)       ; Already at start
+         (let ((eol (save-excursion (end-of-line) (point))))
+           ;; Search forwards for the next URL or end of line in case
+           ;; we're in the middle of one.
+           (and (re-search-forward browse-url-regexp eol 'lim)
+                (goto-char (match-beginning 0)))
+           ;; Now back to where we started or earlier.
+           (re-search-backward browse-url-regexp nil t)))
+      (buffer-substring (match-beginning 0) (match-end 0))
+    ""))                               ; No match
+
+;; Todo: restrict to around or immediately before point.  Expand bare
+;; hostname to URL.
+
+(defun browse-url-interactive-arg (&optional prompt)
+  "Read a URL from the minibuffer, optionally prompting with PROMPT.
+Default to the URL at or before point.  If bound to a mouse button,
+set point to the position clicked.  Return the result as a list for
+use in `interactive'."
+  (let ((event (elt (this-command-keys) 0)))
+    (and (listp event) (mouse-set-point event)))
+  (list (read-string (or prompt "URL: ") (browse-url-url-at-point))))
+
+(defun browse-url-at-point ()
+  "Pass the URL at or before point to a WWW browser."
+  (interactive)
+  (funcall browse-url-browser-function (browse-url-at-point)))
+
+(defun browse-url-at-mouse (event)
+  "Ask a browser to load a URL clicked with the mouse.
+The URL is the one around or before the position of the mouse click
+but point is not changed.  The URL is loaded using variable
+`browse-url-browser-function'."
+  (interactive "e")
+  (save-excursion
+    (let ((posn (event-start event)))
+      (set-buffer (window-buffer (posn-window posn)))
+      (goto-char (posn-point posn))
+      (let ((url (browse-url-url-at-point)))
+       (if (string-equal url "")
+           (error "No URL found"))
+       (funcall browse-url-browser-function url)))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Browse current buffer
+
+(defun browse-url-of-file (&optional file)
+  "Ask a WWW browser to display FILE.
+Display the current buffer's file if FILE is nil or if called
+interactively.  Turn the filename into a URL by performing
+replacements given in variable `browse-url-filename-alist'.  Pass the
+URL to a browser using variable `browse-url-browser-function' then run
+`browse-url-of-file-hook'."
+  (interactive)
+  (setq file (or file
+                (buffer-file-name)
+                (and (boundp 'dired-directory) dired-directory)))
+  (let ((buf (get-file-buffer file)))
+    (if buf (save-excursion
+             (set-buffer buf)
+             (cond
+              ((not (buffer-modified-p)))
+              (browse-url-save-file (save-buffer))
+              (t (message "%s modified since last save" file))))))
+  (funcall browse-url-browser-function
+          (browse-url-file-url file))
+  (run-hooks 'browse-url-of-file-hook))
+
+(defun browse-url-file-url (file)
+  "Return the URL corresponding to FILE.
+Uses variable `browse-url-filename-alist' to map filenames to URLs."
+  (let ((maps browse-url-filename-alist))
+    (while maps
+      (let* ((map (car maps))
+            (from-re (car map))
+            (to-string (cdr map)))
+       (setq maps (cdr maps))
+       (if (string-match from-re file)
+           (setq file (concat (substring file 0 (match-beginning 0))
+                              to-string
+                              (substring file (match-end 0))))))))
+  file)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Browser-specific functions
+
+(defun browse-url-netscape (url &optional new-window)
+  "Ask the Netscape WWW browser to load URL.
+
+Default to the URL around or before point.  The strings in variable
+`browse-url-netscape-arguments' are also passed to Netscape.
+
+If variable `browse-url-netscape-new-window-p' is non-nil, load the
+document in a new Netscape window, otherwise use a random existing
+one.  If optional argument NEW-WINDOW (prefix argument if interactive)
+is non-nil, the effect of browse-url-netscape-new-window-p is
+reversed."
+  (interactive (append (browse-url-interactive-arg "Netscape URL: ")
+                      (list (not (eq (null browse-url-netscape-new-window-p)
+                                     (null current-prefix-arg))))))
+  (or (zerop
+       (apply 'call-process "netscape" nil nil nil
+             (append browse-url-netscape-arguments
+                     (if new-window '("-noraise"))
+                     (list "-remote" 
+                           (concat "openURL(" url 
+                                   (if new-window ",new-window")
+                                   ")")))))
+      (progn                           ; Netscape not running - start it
+       (message "Starting Netscape...")
+       (apply 'start-process "netscape" nil "netscape"
+              (append browse-url-netscape-arguments (list url))))))
+
+(defun browse-url-netscape-reload ()
+  "Ask Netscape to reload its current document."
+  (interactive)
+  (browse-url-netscape-command "reload"))
+
+(defun browse-url-netscape-command (command)
+  "Send a remote control command to Netscape."
+  (apply 'start-process "netscape" nil "netscape"
+        (append browse-url-netscape-arguments
+                (list "-remote" command))))
+
+(defun browse-url-mosaic (url)
+  "Ask the XMosaic WWW browser to load URL.
+Default to the URL around or before point."
+  (interactive (browse-url-interactive-arg "Mosaic URL: "))
+  (let ((pidfile (expand-file-name "~/.mosaicpid"))
+       pid pidbuf)
+    (if (file-readable-p pidfile)
+       (save-excursion
+         (find-file pidfile)
+         (goto-char (point-min))
+         (setq pid (read (current-buffer)))
+         (kill-buffer nil)))
+    (if (and pid (zerop (signal-process pid 0))) ; Mosaic running
+       (save-excursion
+         (find-file (format "/tmp/Mosaic.%d" pid))
+         (erase-buffer)
+         (insert "goto\n" url "\n")
+         (save-buffer)
+         (kill-buffer nil)
+         ;; Send signal SIGUSR to Mosaic
+         (message "Signalling Mosaic...")
+         (signal-process pid browse-url-usr1-signal)
+         ;; Or you could try:
+         ;; (call-process "kill" nil 0 nil "-USR1" (int-to-string pid))
+         )
+      ;; Mosaic not running - start it
+      (message "Starting Mosaic...")
+      (apply 'start-process "xmosaic" nil "xmosaic"
+            (append browse-url-mosaic-arguments (list url))))))
+
+(defun browse-url-iximosaic (url)
+  "Ask the IXIMosaic WWW browser to load URL.
+Default to the URL around or before point."
+  (interactive (browse-url-interactive-arg "IXI Mosaic URL: "))
+  (start-process "tellw3b" nil "tellw3b"
+                "-service WWW_BROWSER ixi_showurl " url))
+
+(defun browse-url-w3 (url)
+  "Ask the w3 WWW browser to load URL.
+Default to the URL around or before point."
+  (interactive (browse-url-interactive-arg "W3 URL: "))
+  (w3-fetch url))
+
+(provide 'browse-url)
+
+;;; browse-url.el ends here
index 1a1aaea..e210e50 100644 (file)
@@ -123,6 +123,18 @@ STRING should be given if the last search was by `string-match' on STRING."
           (and (symbolp x) (assq x global-face-data)))
        t)))
       
           (and (symbolp x) (assq x global-face-data)))
        t)))
       
+(defvar x-colors nil)
+(defvar custom-button-face nil)
+(defvar custom-modified-list nil)
+(defvar custom-field-uninitialized-face nil)
+(defvar custom-field-invalid-face nil)
+(defvar custom-field-modified-face nil)
+(defvar custom-field-face nil)
+(defvar custom-button-properties nil)
+(defvar custom-documentation-properties nil)
+(defvar custom-mouse-face nil)
+(defvar custom-field-active-face nil)
+
 (or (fboundp 'modify-face)
     ;; Introduced in Emacs 19.29.
     (defun modify-face (face foreground background stipple
 (or (fboundp 'modify-face)
     ;; Introduced in Emacs 19.29.
     (defun modify-face (face foreground background stipple
index 7124fd6..38999e4 100644 (file)
@@ -38,7 +38,6 @@
 \f
 
 (defvar gnus-cache-buffer nil)
 \f
 
 (defvar gnus-cache-buffer nil)
-(defvar gnus-cache-removeable-articles nil)
 
 \f
 
 
 \f
 
@@ -68,8 +67,7 @@
           (setcar gnus-cache-buffer group)
           (let ((file (gnus-cache-file-name group ".overview")))
             (and (file-exists-p file)
           (setcar gnus-cache-buffer group)
           (let ((file (gnus-cache-file-name group ".overview")))
             (and (file-exists-p file)
-                 (insert-file-contents file))))))
-  (setq gnus-cache-removeable-articles nil))
+                 (insert-file-contents file)))))))
 
 
 ;; Just save the overview buffer.
 
 
 ;; Just save the overview buffer.
   (let ((articles gnus-cache-removeable-articles)
        (cache-articles (gnus-cache-articles-in-group gnus-newsgroup-name))
        article)
   (let ((articles gnus-cache-removeable-articles)
        (cache-articles (gnus-cache-articles-in-group gnus-newsgroup-name))
        article)
+    (gnus-cache-change-buffer gnus-newsgroup-name)
     (while articles
       (setq article (car articles)
            articles (cdr articles))
     (while articles
       (setq article (car articles)
            articles (cdr articles))
          ;; The article was in the cache, so we see whether we are
          ;; supposed to remove it from the cache.
          (gnus-cache-possibly-remove-article
          ;; The article was in the cache, so we see whether we are
          ;; supposed to remove it from the cache.
          (gnus-cache-possibly-remove-article
-          gnus-newsgroup-name article 
-          (memq article gnus-newsgroup-marked)
+          article (memq article gnus-newsgroup-marked)
           (memq article gnus-newsgroup-dormant)
           (or (memq article gnus-newsgroup-unreads)
               (memq article gnus-newsgroup-unselected)))))))
 
 (defun gnus-cache-possibly-remove-article 
           (memq article gnus-newsgroup-dormant)
           (or (memq article gnus-newsgroup-unreads)
               (memq article gnus-newsgroup-unselected)))))))
 
 (defun gnus-cache-possibly-remove-article 
-  (group article ticked dormant unread)
-  (let ((file (gnus-cache-file-name group article)))
+  (article ticked dormant unread)
+  (let ((file (gnus-cache-file-name gnus-newsgroup-name article)))
     (if (or (not (file-exists-p file))
            (not (gnus-cache-member-of-class
                  gnus-cache-remove-articles ticked dormant unread)))
        nil
       (save-excursion
        (delete-file file)
     (if (or (not (file-exists-p file))
            (not (gnus-cache-member-of-class
                  gnus-cache-remove-articles ticked dormant unread)))
        nil
       (save-excursion
        (delete-file file)
-       (gnus-cache-change-buffer group)
        (set-buffer (cdr gnus-cache-buffer))
        (goto-char (point-min))
        (if (or (looking-at (concat (int-to-string article) "\t"))
        (set-buffer (cdr gnus-cache-buffer))
        (goto-char (point-min))
        (if (or (looking-at (concat (int-to-string article) "\t"))
index ef9e035..974fb67 100644 (file)
@@ -77,9 +77,6 @@ To check for marks, e.g. to underline replied articles, use
                    (setq props (nthcdr 2 props)))
                (remove-text-properties start end ())))))
 
                    (setq props (nthcdr 2 props)))
                (remove-text-properties start end ())))))
 
-    (defvar gnus-header-face-alist 
-      '(("" bold italic)))
-    
     (or (fboundp 'make-overlay) (fset 'make-overlay 'make-extent))
     (or (fboundp 'overlay-put) (fset 'overlay-put 'set-extent-property))
     (or (fboundp 'move-overlay) 
     (or (fboundp 'make-overlay) (fset 'make-overlay 'make-extent))
     (or (fboundp 'overlay-put) (fset 'overlay-put 'set-extent-property))
     (or (fboundp 'move-overlay) 
@@ -392,6 +389,16 @@ NOTE: This command only works with newsgroups that use real or simulated NNTP."
              (setq pslist (cdr pslist)))))))
 
 
              (setq pslist (cdr pslist)))))))
 
 
+    (defun gnus-article-push-button (event)
+      "Check text under the mouse pointer for a callback function.
+If the text under the mouse pointer has a `gnus-callback' property,
+call it with the value of the `gnus-data' text property."
+      (interactive "e")
+      (set-buffer (window-buffer (event-window event)))
+      (let* ((pos (event-closest-point event))
+            (data (get-text-property pos 'gnus-data))
+            (fun (get-text-property pos 'gnus-callback)))
+       (if fun (funcall fun data))))
 
     )
 
 
     )
 
index dffe4dd..1406575 100644 (file)
@@ -33,6 +33,9 @@
 (defvar gnus-kill-expiry-days 7
   "*Number of days before expiring unused kill file entries.")
 
 (defvar gnus-kill-expiry-days 7
   "*Number of days before expiring unused kill file entries.")
 
+(defvar gnus-kill-save-kill-file nil
+  "*If non-nil, will save kill files after processing them.")
+
 (defvar gnus-winconf-kill-file nil)
 
 \f
 (defvar gnus-winconf-kill-file nil)
 
 \f
@@ -411,7 +414,10 @@ Returns the number of articles marked as read."
        (save-excursion
          (set-buffer gnus-summary-buffer)
          (condition-case () (eval form) (error nil)))))
        (save-excursion
          (set-buffer gnus-summary-buffer)
          (condition-case () (eval form) (error nil)))))
-    (and (buffer-modified-p) (save-buffer))))
+    (and (buffer-modified-p) 
+        gnus-kill-save-kill-file
+        (save-buffer))
+    (set-buffer-modified-p nil)))
 
 ;; Parse an rn killfile.
 (defun gnus-kill-parse-rn-kill-file ()
 
 ;; Parse an rn killfile.
 (defun gnus-kill-parse-rn-kill-file ()
index 817cc9f..696a8c4 100644 (file)
@@ -287,7 +287,7 @@ If prefix argument YANK is non-nil, original article is yanked automatically."
   (if yank-articles (gnus-summary-goto-subject (car yank-articles)))
   (save-window-excursion
     (gnus-summary-select-article))
   (if yank-articles (gnus-summary-goto-subject (car yank-articles)))
   (save-window-excursion
     (gnus-summary-select-article))
-  (let ((headers gnus-current-headers)
+  (let ((headers (gnus-get-header-by-number (gnus-summary-article-number)))
        (gnus-newsgroup-name gnus-newsgroup-name))
     ;; Check Followup-To: poster.
     (set-buffer gnus-article-buffer)
        (gnus-newsgroup-name gnus-newsgroup-name))
     ;; Check Followup-To: poster.
     (set-buffer gnus-article-buffer)
index d64fbe1..d8d8be6 100644 (file)
@@ -170,7 +170,8 @@ of the last successful match.")
     (and (get-buffer "*Score Help*")
         (progn
           (kill-buffer "*Score Help*")
     (and (get-buffer "*Score Help*")
         (progn
           (kill-buffer "*Score Help*")
-          (set-window-configuration gnus-score-help-winconf)))
+          (and gnus-score-help-winconf
+               (set-window-configuration gnus-score-help-winconf))))
 
     (or (setq entry (assq (downcase hchar) char-to-header))
        (progn
 
     (or (setq entry (assq (downcase hchar) char-to-header))
        (progn
@@ -207,7 +208,8 @@ of the last successful match.")
 
       (and (get-buffer "*Score Help*")
           (progn
 
       (and (get-buffer "*Score Help*")
           (progn
-            (set-window-configuration gnus-score-help-winconf)
+            (and gnus-score-help-winconf
+                 (set-window-configuration gnus-score-help-winconf))
             (kill-buffer "*Score Help*")))
       
       (or (setq type (nth 1 (assq (downcase tchar) char-to-type)))
             (kill-buffer "*Score Help*")))
       
       (or (setq type (nth 1 (assq (downcase tchar) char-to-type)))
@@ -239,7 +241,8 @@ of the last successful match.")
 
        (and (get-buffer "*Score Help*")
             (progn
 
        (and (get-buffer "*Score Help*")
             (progn
-              (set-window-configuration gnus-score-help-winconf)
+              (and gnus-score-help-winconf
+                   (set-window-configuration gnus-score-help-winconf))
               (kill-buffer "*Score Help*")))
 
        (if mimic (message "%c %c %c" prefix hchar tchar pchar)
               (kill-buffer "*Score Help*")))
 
        (if mimic (message "%c %c %c" prefix hchar tchar pchar)
@@ -1082,6 +1085,7 @@ SCORE is the score to add."
   ;; Insert the unique article headers in the buffer.
   (let ((gnus-score-index (nth 1 (assoc header gnus-header-index)))
        (current-score-file gnus-current-score-file)
   ;; Insert the unique article headers in the buffer.
   (let ((gnus-score-index (nth 1 (assoc header gnus-header-index)))
        (current-score-file gnus-current-score-file)
+       (all-scores scores)
        ;; gnus-score-index is used as a free variable.
        alike last this art entries alist articles)
 
        ;; gnus-score-index is used as a free variable.
        alike last this art entries alist articles)
 
@@ -1147,7 +1151,8 @@ SCORE is the score to add."
                       (while arts
                         (setq art (car arts)
                               arts (cdr arts))
                       (while arts
                         (setq art (car arts)
                               arts (cdr arts))
-                        (gnus-score-add-followups (car art) score)))))
+                        (gnus-score-add-followups 
+                         (car art) score all-scores)))))
            (while (funcall search-func match nil t)
              (end-of-line)
              (setq found (setq arts (get-text-property (point) 'articles)))
            (while (funcall search-func match nil t)
              (end-of-line)
              (setq found (setq arts (get-text-property (point) 'articles)))
@@ -1155,7 +1160,7 @@ SCORE is the score to add."
              (while arts
                (setq art (car arts)
                      arts (cdr arts))
              (while arts
                (setq art (car arts)
                      arts (cdr arts))
-               (gnus-score-add-followups (car art) score))))
+               (gnus-score-add-followups (car art) score all-scores))))
          ;; Update expire date
          (cond ((null date))           ;Permanent entry.
                (found                  ;Match, update date.
          ;; Update expire date
          (cond ((null date))           ;Permanent entry.
                (found                  ;Match, update date.
@@ -1169,21 +1174,22 @@ SCORE is the score to add."
     ;; We change the score file back to the previous one.
     (gnus-score-load-file current-score-file)))
 
     ;; We change the score file back to the previous one.
     (gnus-score-load-file current-score-file)))
 
-(defun gnus-score-add-followups (header score)
+(defun gnus-score-add-followups (header score scores)
   (save-excursion
     (set-buffer gnus-summary-buffer)
   (save-excursion
     (set-buffer gnus-summary-buffer)
-    (let ((id (header-id header))
-         dont)
+    (let* ((id (header-id header))
+          (scores (car scores))
+          entry dont)
       ;; Don't enter a score if there already is one.
       ;; Don't enter a score if there already is one.
-      (while score
-       (and (equal "references" (car (car score)))
-            (or (null (nth 3 (car score)))
-                (eq 's (nth 3 (car score))))
+      (while scores
+       (setq entry (car scores))
+       (and (equal "references" (car entry))
+            (or (null (nth 3 (car (cdr entry))))
+                (eq 's (nth 3 (car (cdr entry)))))
             (progn
             (progn
-              (if (assoc id (car score))
-                  (setq dont t))
-              (setq score nil)))
-       (setq score (cdr score)))
+              (if (assoc id entry)
+                  (setq dont t))))
+       (setq scores (cdr scores)))
       (or dont
          (gnus-summary-score-entry 
           "references" id 's score (current-time-string) nil t)))))
       (or dont
          (gnus-summary-score-entry 
           "references" id 's score (current-time-string) nil t)))))
index 840c5a6..02f5601 100644 (file)
               (cons '(and (> score default) 
                           (or (= mark gnus-dormant-mark)
                               (= mark gnus-ticked-mark)))
               (cons '(and (> score default) 
                           (or (= mark gnus-dormant-mark)
                               (= mark gnus-ticked-mark)))
-              (custom-face-lookup "red" nil nil t nil nil))
+                    (custom-face-lookup "pink" nil nil t nil nil))
               (cons '(and (< score default) 
                           (or (= mark gnus-dormant-mark)
                               (= mark gnus-ticked-mark)))
               (cons '(and (< score default) 
                           (or (= mark gnus-dormant-mark)
                               (= mark gnus-ticked-mark)))
-              (custom-face-lookup "red" nil nil nil t nil))
+                    (custom-face-lookup "pink" nil nil nil t nil))
               (cons '(or (= mark gnus-dormant-mark)
                          (= mark gnus-ticked-mark))
               (cons '(or (= mark gnus-dormant-mark)
                          (= mark gnus-ticked-mark))
-              (custom-face-lookup "red" nil nil nil nil nil))
+                    (custom-face-lookup "pink" nil nil nil nil nil))
 
               (cons '(and (> score default) (= mark gnus-ancient-mark))
 
               (cons '(and (> score default) (= mark gnus-ancient-mark))
-              (custom-face-lookup "blue" nil nil t nil nil))
+                    (custom-face-lookup "SkyBlue" nil nil t nil nil))
               (cons '(and (< score default) (= mark gnus-ancient-mark))
               (cons '(and (< score default) (= mark gnus-ancient-mark))
-              (custom-face-lookup "blue" nil nil nil t nil))
+                    (custom-face-lookup "SkyBlue" nil nil nil t nil))
               (cons '(= mark gnus-ancient-mark)
               (cons '(= mark gnus-ancient-mark)
-              (custom-face-lookup "blue" nil nil nil nil nil))
+                    (custom-face-lookup "SkyBlue" nil nil nil nil nil))
 
               (cons '(and (> score default) (= mark gnus-unread-mark))
 
               (cons '(and (> score default) (= mark gnus-unread-mark))
-              (custom-face-lookup "green" nil nil t nil nil))
+                    (custom-face-lookup "green" nil nil t nil nil))
               (cons '(and (< score default) (= mark gnus-unread-mark))
               (cons '(and (< score default) (= mark gnus-unread-mark))
-              (custom-face-lookup "green" nil nil nil t nil))
+                    (custom-face-lookup "green" nil nil nil t nil))
               (cons '(= mark gnus-unread-mark)
               (cons '(= mark gnus-unread-mark)
-              (custom-face-lookup "green" nil nil nil nil nil))
+                    (custom-face-lookup "green" nil nil nil nil nil))
 
               (cons '(> score default) 'bold)
               (cons '(< score default) 'italic)))
 
               (cons '(> score default) 'bold)
               (cons '(< score default) 'italic)))
               (cons '(and (> score default) 
                           (or (= mark gnus-dormant-mark)
                               (= mark gnus-ticked-mark)))
               (cons '(and (> score default) 
                           (or (= mark gnus-dormant-mark)
                               (= mark gnus-ticked-mark)))
-              (custom-face-lookup "firebrick" nil nil t nil nil))
+                    (custom-face-lookup "firebrick" nil nil t nil nil))
               (cons '(and (< score default) 
                           (or (= mark gnus-dormant-mark)
                               (= mark gnus-ticked-mark)))
               (cons '(and (< score default) 
                           (or (= mark gnus-dormant-mark)
                               (= mark gnus-ticked-mark)))
-              (custom-face-lookup "firebrick" nil nil nil t nil))
+                    (custom-face-lookup "firebrick" nil nil nil t nil))
               (cons '(or (= mark gnus-dormant-mark)
                          (= mark gnus-ticked-mark))
               (cons '(or (= mark gnus-dormant-mark)
                          (= mark gnus-ticked-mark))
-              (custom-face-lookup "firebrick" nil nil nil nil nil))
+                    (custom-face-lookup "firebrick" nil nil nil nil nil))
 
               (cons '(and (> score default) (= mark gnus-ancient-mark))
 
               (cons '(and (> score default) (= mark gnus-ancient-mark))
-              (custom-face-lookup "RoyalBlue" nil nil t nil nil))
+                    (custom-face-lookup "RoyalBlue" nil nil t nil nil))
               (cons '(and (< score default) (= mark gnus-ancient-mark))
               (cons '(and (< score default) (= mark gnus-ancient-mark))
-              (custom-face-lookup "RoyalBlue" nil nil nil t nil))
+                    (custom-face-lookup "RoyalBlue" nil nil nil t nil))
               (cons '(= mark gnus-ancient-mark)
               (cons '(= mark gnus-ancient-mark)
-              (custom-face-lookup "RoyalBlue" nil nil nil nil nil))
+                    (custom-face-lookup "RoyalBlue" nil nil nil nil nil))
 
               (cons '(and (> score default) (= mark gnus-unread-mark))
 
               (cons '(and (> score default) (= mark gnus-unread-mark))
-              (custom-face-lookup "DarkGreen" nil nil t nil nil))
+                    (custom-face-lookup "DarkGreen" nil nil t nil nil))
               (cons '(and (< score default) (= mark gnus-unread-mark))
               (cons '(and (< score default) (= mark gnus-unread-mark))
-              (custom-face-lookup "DarkGreen" nil nil nil t nil))
+                    (custom-face-lookup "DarkGreen" nil nil nil t nil))
               (cons '(= mark gnus-unread-mark)
               (cons '(= mark gnus-unread-mark)
-              (custom-face-lookup "DarkGreen" nil nil nil nil nil))
+                    (custom-face-lookup "DarkGreen" nil nil nil nil nil))
 
               (cons '(> score default) 'bold)
               (cons '(< score default) 'italic))))
 
               (cons '(> score default) 'bold)
               (cons '(< score default) 'italic))))
-       "*Alist of `(FORM . FACE)'.
+  "*Alist of `(FORM . FACE)'.
 Summary lines are highlighted with the FACE for the first FORM which
 evaluate to a non-nil value.  
 
 Summary lines are highlighted with the FACE for the first FORM which
 evaluate to a non-nil value.  
 
@@ -123,24 +123,24 @@ The latter can be used like this:
         '(("" bold italic)))
        ((eq gnus-background-mode 'dark)
         (list (list "From" nil 
         '(("" bold italic)))
        ((eq gnus-background-mode 'dark)
         (list (list "From" nil 
-                      (custom-face-lookup "blue" nil nil t t nil))
-                (list "Subject" nil 
-                      (custom-face-lookup "red" nil nil t t nil))
-                (list "Newsgroups:.*," nil
-                      (custom-face-lookup "yellow" nil nil t t nil))
-                (list "" 
-                      (custom-face-lookup "cyan" nil nil t nil nil)
-                      (custom-face-lookup "green" nil nil nil t nil))))
+                    (custom-face-lookup "SkyeBlue" nil nil t t nil))
+              (list "Subject" nil 
+                    (custom-face-lookup "pink" nil nil t t nil))
+              (list "Newsgroups:.*," nil
+                    (custom-face-lookup "yellow" nil nil t t nil))
+              (list "" 
+                    (custom-face-lookup "cyan" nil nil t nil nil)
+                    (custom-face-lookup "green" nil nil nil t nil))))
        (t
         (list (list "From" nil 
        (t
         (list (list "From" nil 
-                      (custom-face-lookup "RoyalBlue" nil nil t t nil))
-                (list "Subject" nil 
-                      (custom-face-lookup "firebrick" nil nil t t nil))
-                (list "Newsgroups:.*," nil
-                      (custom-face-lookup "dark orange" nil nil t t nil))
-                (list ""
-                      (custom-face-lookup "purple" nil nil t nil nil)
-                      (custom-face-lookup "DarkGreen" nil nil nil t nil)))))
+                    (custom-face-lookup "RoyalBlue" nil nil t t nil))
+              (list "Subject" nil 
+                    (custom-face-lookup "firebrick" nil nil t t nil))
+              (list "Newsgroups:.*," nil
+                    (custom-face-lookup "dark orange" nil nil t t nil))
+              (list ""
+                    (custom-face-lookup "purple" nil nil t nil nil)
+                    (custom-face-lookup "DarkGreen" nil nil nil t nil)))))
   "Alist of headers and faces used for highlighting them.
 The entries in the list has the form `(REGEXP NAME CONTENT)', where
 REGEXP is a regular expression matching the beginning of the header,
   "Alist of headers and faces used for highlighting them.
 The entries in the list has the form `(REGEXP NAME CONTENT)', where
 REGEXP is a regular expression matching the beginning of the header,
@@ -188,19 +188,17 @@ PAR: is a number of a regexp grouping whose text will be passed to CALLBACK.
 CALLBACK can also be a variable, in that case the value of that
 variable it the real callback function.")
 
 CALLBACK can also be a variable, in that case the value of that
 variable it the real callback function.")
 
-(defvar gnus-button-url (cond ((fboundp 'w3-fetch)
-                              'w3-fetch)
-                             ((fboundp 'highlight-headers-follow-url-netscape)
-                              'highlight-headers-follow-url-netscape)
-                             (t nil))
+(defvar gnus-button-url 'gnus-netscape-open-url
   "Function to fetch URL.  
 The function will be called with one argument, the URL to fetch.
 Useful values of this function are:
 
 w3-fetch: 
    defined in the w3 emacs package by William M. Perry.
   "Function to fetch URL.  
 The function will be called with one argument, the URL to fetch.
 Useful values of this function are:
 
 w3-fetch: 
    defined in the w3 emacs package by William M. Perry.
-highlight-headers-follow-url-netscape: 
-   from `highlight-headers.el' for loading NetScape 1.1.")
+gnus-netscape-open-url:
+   open url in existing netscape, start netscape if none found.
+gnus-netscape-start-url:
+   start new netscape with url.")
 
 \f
 
 
 \f
 
@@ -220,323 +218,328 @@ highlight-headers-follow-url-netscape:
 
 (defun gnus-group-make-menu-bar ()
   (gnus-visual-turn-off-edit-menu 'group)
 
 (defun gnus-group-make-menu-bar ()
   (gnus-visual-turn-off-edit-menu 'group)
-
-  (easy-menu-define
-   gnus-group-reading-menu
-   gnus-group-mode-map
-   ""
-   '("Group"
-     ["Read" gnus-group-read-group t]
-     ["Select" gnus-group-select-group t]
-     ["Catch up" gnus-group-catchup-current t]
-     ["Catch up all articles" gnus-group-catchup-current-all t]
-     ["Check for new articles" gnus-group-get-new-news-this-group t]
-     ["Toggle subscription" gnus-group-unsubscribe-current-group t]
-     ["Kill" gnus-group-kill-group t]
-     ["Yank" gnus-group-yank-group t]
-     ["Describe" gnus-group-describe-group t]
-     ["Fetch FAQ" gnus-group-fetch-faq t]
-     ["Edit kill file" gnus-group-edit-local-kill t]
-     ["Expire articles" gnus-group-expire-articles t]
-     ["Set group level" gnus-group-set-current-level t]
-     ))
+  (and 
+   (not (boundp 'gnus-group-reading-menu)) ;JMP
+   (easy-menu-define
+    gnus-group-reading-menu
+    gnus-group-mode-map
+    ""
+    '("Group"
+      ["Read" gnus-group-read-group t]
+      ["Select" gnus-group-select-group t]
+      ["Catch up" gnus-group-catchup-current t]
+      ["Catch up all articles" gnus-group-catchup-current-all t]
+      ["Check for new articles" gnus-group-get-new-news-this-group t]
+      ["Toggle subscription" gnus-group-unsubscribe-current-group t]
+      ["Kill" gnus-group-kill-group t]
+      ["Yank" gnus-group-yank-group t]
+      ["Describe" gnus-group-describe-group t]
+      ["Fetch FAQ" gnus-group-fetch-faq t]
+      ["Edit kill file" gnus-group-edit-local-kill t]
+      ["Expire articles" gnus-group-expire-articles t]
+      ["Set group level" gnus-group-set-current-level t]
+      ))
   
   
-  (easy-menu-define
-   gnus-group-group-menu
-   gnus-group-mode-map
-   ""
-   '("Groups"
-     ("Listing"
-      ["List subscribed groups" gnus-group-list-groups t]
-      ["List all groups" gnus-group-list-all-groups t]
-      ["List groups matching..." gnus-group-list-matching t]
-      ["List killed groups" gnus-group-list-killed t]
-      ["List zombie groups" gnus-group-list-zombies t]
-      ["Describe all groups" gnus-group-describe-all-groups t]
-      ["Group apropos" gnus-group-apropos t]
-      ["Group and description apropos" gnus-group-description-apropos t]
-      ["List groups matching..." gnus-group-list-matching t])
-     ("Mark"
-      ["Mark group" gnus-group-mark-group t]
-      ["Unmark group" gnus-group-unmark-group t]
-      ["Mark region" gnus-group-mark-region t])
-     ("Subscribe"
-      ["Subscribe to random group" gnus-group-unsubscribe-group t]
-      ["Kill all newsgroups in region" gnus-group-kill-region t]
-      ["Kill all zombie groups" gnus-group-kill-all-zombies t])
-     ("Foreign groups"
-      ["Make a foreign group" gnus-group-make-group t]
-      ["Edit a group entry" gnus-group-edit-group t]
-      ["Add a directory group" gnus-group-make-directory-group t]
-      ["Add the help group" gnus-group-make-help-group t]
-      ["Add the archive group" gnus-group-make-archive-group t]
-      ["Make a doc group" gnus-group-make-doc-group t]
-      ["Make a kiboze group" gnus-group-make-kiboze-group t]
-      ["Make a virtual group" gnus-group-make-empty-virtual t]
-      ["Add a group to a virtual" gnus-group-add-to-virtual t])
-     ["Read a directory as a group" gnus-group-enter-directory t]
-     ["Jump to group" gnus-group-jump-to-group t]
-     ["Best unread group" gnus-group-best-unread-group t]
-     ))
-
-  (easy-menu-define
-   gnus-group-post-menu
-   gnus-group-mode-map
-   ""
-   '("Post"
-     ["Send a mail" gnus-group-mail t]
-     ["Post an article" gnus-group-post-news t]
-     ))
+   (easy-menu-define
+    gnus-group-group-menu
+    gnus-group-mode-map
+    ""
+    '("Groups"
+      ("Listing"
+       ["List subscribed groups" gnus-group-list-groups t]
+       ["List all groups" gnus-group-list-all-groups t]
+       ["List groups matching..." gnus-group-list-matching t]
+       ["List killed groups" gnus-group-list-killed t]
+       ["List zombie groups" gnus-group-list-zombies t]
+       ["Describe all groups" gnus-group-describe-all-groups t]
+       ["Group apropos" gnus-group-apropos t]
+       ["Group and description apropos" gnus-group-description-apropos t]
+       ["List groups matching..." gnus-group-list-matching t])
+      ("Mark"
+       ["Mark group" gnus-group-mark-group t]
+       ["Unmark group" gnus-group-unmark-group t]
+       ["Mark region" gnus-group-mark-region t])
+      ("Subscribe"
+       ["Subscribe to random group" gnus-group-unsubscribe-group t]
+       ["Kill all newsgroups in region" gnus-group-kill-region t]
+       ["Kill all zombie groups" gnus-group-kill-all-zombies t])
+      ("Foreign groups"
+       ["Make a foreign group" gnus-group-make-group t]
+       ["Edit a group entry" gnus-group-edit-group t]
+       ["Add a directory group" gnus-group-make-directory-group t]
+       ["Add the help group" gnus-group-make-help-group t]
+       ["Add the archive group" gnus-group-make-archive-group t]
+       ["Make a doc group" gnus-group-make-doc-group t]
+       ["Make a kiboze group" gnus-group-make-kiboze-group t]
+       ["Make a virtual group" gnus-group-make-empty-virtual t]
+       ["Add a group to a virtual" gnus-group-add-to-virtual t])
+      ["Read a directory as a group" gnus-group-enter-directory t]
+      ["Jump to group" gnus-group-jump-to-group t]
+      ["Best unread group" gnus-group-best-unread-group t]
+      ))
+
+   (easy-menu-define
+    gnus-group-post-menu
+    gnus-group-mode-map
+    ""
+    '("Post"
+      ["Send a mail" gnus-group-mail t]
+      ["Post an article" gnus-group-post-news t]
+      ))
   
   
-  (easy-menu-define
-   gnus-group-misc-menu
-   gnus-group-mode-map
-   ""
-   '("Misc"
-     ["Send a bug report" gnus-bug t]
-     ["Check for new news" gnus-group-get-new-news t]     
-     ["Delete bogus groups" gnus-group-check-bogus-groups t]
-     ["Find new newsgroups" gnus-find-new-newsgroups t]
-     ["Restart Gnus" gnus-group-restart t]
-     ["Read init file" gnus-group-read-init-file t]
-     ["Browse foreign server" gnus-group-browse-foreign-server t]
-     ["Enter server buffer" gnus-group-enter-server-mode t]
-     ["Expire expirable articles" gnus-group-expire-all-groups t]
-     ["Generate any kiboze groups" nnkiboze-generate-groups t]
-     ["Gnus version" gnus-version t]
-     ["Save .newsrc files" gnus-group-save-newsrc t]
-     ["Suspend Gnus" gnus-group-suspend t]
-     ["Clear dribble buffer" gnus-group-clear-dribble t]
-     ["Exit from Gnus" gnus-group-exit t]
-     ["Exit without saving" gnus-group-quit t]
-     ["Edit global kill file" gnus-group-edit-global-kill t]
-     ["Sort group buffer" gnus-group-sort-groups t]
-     ))
-
+   (easy-menu-define
+    gnus-group-misc-menu
+    gnus-group-mode-map
+    ""
+    '("Misc"
+      ["Send a bug report" gnus-bug t]
+      ["Check for new news" gnus-group-get-new-news t]     
+      ["Delete bogus groups" gnus-group-check-bogus-groups t]
+      ["Find new newsgroups" gnus-find-new-newsgroups t]
+      ["Restart Gnus" gnus-group-restart t]
+      ["Read init file" gnus-group-read-init-file t]
+      ["Browse foreign server" gnus-group-browse-foreign-server t]
+      ["Enter server buffer" gnus-group-enter-server-mode t]
+      ["Expire expirable articles" gnus-group-expire-all-groups t]
+      ["Generate any kiboze groups" nnkiboze-generate-groups t]
+      ["Gnus version" gnus-version t]
+      ["Save .newsrc files" gnus-group-save-newsrc t]
+      ["Suspend Gnus" gnus-group-suspend t]
+      ["Clear dribble buffer" gnus-group-clear-dribble t]
+      ["Exit from Gnus" gnus-group-exit t]
+      ["Exit without saving" gnus-group-quit t]
+      ["Edit global kill file" gnus-group-edit-global-kill t]
+      ["Sort group buffer" gnus-group-sort-groups t]
+      ))
+   )                                   ;JMP
   )
 
 ;; Server mode
 (defun gnus-server-make-menu-bar ()
   (gnus-visual-turn-off-edit-menu 'server)
   )
 
 ;; Server mode
 (defun gnus-server-make-menu-bar ()
   (gnus-visual-turn-off-edit-menu 'server)
-
-  (easy-menu-define
-   gnus-server-menu
-   gnus-server-mode-map
-   ""
-   '("Server"
-     ["Add" gnus-server-add-server t]
-     ["Browse" gnus-server-read-server t]
-     ["List" gnus-server-list-servers t]
-     ["Kill" gnus-server-kill-server t]
-     ["Yank" gnus-server-yank-server t]
-     ["Copy" gnus-server-copy-server t]
-     ["Edit" gnus-server-edit-server t]
-     ["Exit" gnus-server-exit t]
-     )))
+  (and 
+   (not (boundp 'gnus-server-menu))    ;JMP
+   (easy-menu-define
+    gnus-server-menu
+    gnus-server-mode-map
+    ""
+    '("Server"
+      ["Add" gnus-server-add-server t]
+      ["Browse" gnus-server-read-server t]
+      ["List" gnus-server-list-servers t]
+      ["Kill" gnus-server-kill-server t]
+      ["Yank" gnus-server-yank-server t]
+      ["Copy" gnus-server-copy-server t]
+      ["Edit" gnus-server-edit-server t]
+      ["Exit" gnus-server-exit t]
+      ))))
 
 ;; Browse mode
 (defun gnus-browse-make-menu-bar ()
   (gnus-visual-turn-off-edit-menu 'browse)
 
 ;; Browse mode
 (defun gnus-browse-make-menu-bar ()
   (gnus-visual-turn-off-edit-menu 'browse)
-
-  (easy-menu-define
-   gnus-browse-menu
-   gnus-browse-mode-map
-   ""
-   '("Browse"
-     ["Subscribe" gnus-browse-unsubscribe-current-group t]
-     ["Read" gnus-group-read-group t]
-     ["Exit" gnus-browse-exit t]
-     )))
+  (and 
+   (not (boundp 'gnus-browse-menu))    ;JMP
+   (easy-menu-define
+    gnus-browse-menu
+    gnus-browse-mode-map
+    ""
+    '("Browse"
+      ["Subscribe" gnus-browse-unsubscribe-current-group t]
+      ["Read" gnus-group-read-group t]
+      ["Exit" gnus-browse-exit t]
+      ))))
 
 ;; Summary buffer
 (defun gnus-summary-make-menu-bar ()
   (gnus-visual-turn-off-edit-menu 'summary)
 
 
 ;; Summary buffer
 (defun gnus-summary-make-menu-bar ()
   (gnus-visual-turn-off-edit-menu 'summary)
 
-  (easy-menu-define
-   gnus-summary-mark-menu
-   gnus-summary-mode-map
-   ""
-   '("Mark"
-     ("Read"
-      ["Mark as read" gnus-summary-mark-as-read-forward t]
-      ["Mark same subject and select" gnus-summary-kill-same-subject-and-select t]
-      ["Mark same subject" gnus-summary-kill-same-subject t]
-      ["Catchup" gnus-summary-catchup t]
-      ["Catchup all" gnus-summary-catchup-all t]
-      ["Catchup to here" gnus-summary-catchup-to-here t]
-      ["Catchup region" gnus-summary-mark-region-as-read t])
-     ("Various"
-      ["Tick" gnus-summary-tick-article-forward t]
-      ["Mark as dormant" gnus-summary-mark-as-dormant t]
-      ["Remove marks" gnus-summary-clear-mark-forward t]
-      ["Set expirable mark" gnus-summary-mark-as-expirable t]
-      ["Set bookmark" gnus-summary-set-bookmark t]
-      ["Remove bookmark" gnus-summary-remove-bookmark t])
-     ("Display"
-      ["Remove lines marked as read" gnus-summary-remove-lines-marked-as-read t]
-      ["Remove lines marked with..." gnus-summary-remove-lines-marked-with t]
-      ["Show dormant articles" gnus-summary-show-all-dormant t]
-      ["Hide dormant articles" gnus-summary-hide-all-dormant t]
-      ["Show expunged articles" gnus-summary-show-all-expunged t])
-     ("Process mark"
-      ["Set mark" gnus-summary-mark-as-processable t]
-      ["Remove mark" gnus-summary-unmark-as-processable t]
-      ["Remove all marks" gnus-summary-unmark-all-processable t]
-      ["Mark series" gnus-uu-mark-series t]
-      ["Mark region" gnus-uu-mark-region t]
-      ["Mark by regexp" gnus-uu-mark-by-regexp t]
-      ["Mark all" gnus-uu-mark-all t]
-      ["Mark sparse" gnus-uu-mark-sparse t]
-      ["Mark thread" gnus-uu-mark-thread t]
-      )
-     ))
-
-  (easy-menu-define
-   gnus-summary-move-menu
-   gnus-summary-mode-map
-   ""
-   '("Move"
-     ["Scroll article forwards" gnus-summary-next-page t]
-     ["Next unread article" gnus-summary-next-unread-article t]
-     ["Previous unread article" gnus-summary-prev-unread-article t]
-     ["Next article" gnus-summary-next-article t]
-     ["Previous article" gnus-summary-prev-article t]
-     ["Next article same subject" gnus-summary-next-same-subject t]
-     ["Previous article same subject" gnus-summary-prev-same-subject t]
-     ["First unread article" gnus-summary-first-unread-article t]
-     ["Go to subject number..." gnus-summary-goto-subject t]
-     ["Go to the last article" gnus-summary-goto-last-article t]
-     ["Pop article off history" gnus-summary-pop-article t]
-     ))
-
-  (easy-menu-define
-   gnus-summary-article-menu
-   gnus-summary-mode-map
-   ""
-   '("Article"
-     ("Hide"
-      ("Date"
-       ["Local" gnus-article-date-local t]
-       ["UT" gnus-article-date-local t]
-       ["Lapsed" gnus-article-date-local t])
-      ["Headers" gnus-article-hide-headers t]
-      ["Signature" gnus-article-hide-signature t]
-      ["Citation" gnus-article-hide-citation t]
-      ["Overstrike" gnus-article-treat-overstrike t]
-      ["Word wrap" gnus-article-word-wrap t]
-      ["CR" gnus-article-remove-cr t]
-      ["Show X-Face" gnus-article-display-x-face t]
-      ["Quoted-Printable" gnus-article-de-quoted-unreadable t])
-     ("Extract"
-      ["Uudecode" gnus-uu-decode-uu t]
-      ["Uudecode and save" gnus-uu-decode-uu-and-save t]
-      ["Unshar" gnus-uu-decode-unshar t]
-      ["Unshar and save" gnus-uu-decode-unshar-and-save t]
-      ["Save" gnus-uu-decode-save t]
-      ["Binhex" gnus-uu-decode-binhex t])
-     ["Enter digest buffer" gnus-summary-enter-digest-group t]
-     ["Isearch article" gnus-summary-isearch-article t]
-     ["Search all articles" gnus-summary-search-article-forward t]
-     ["Beginning of the article" gnus-summary-beginning-of-article t]
-     ["End of the article" gnus-summary-end-of-article t]
-     ["Fetch parent of article" gnus-summary-refer-parent-article t]
-     ["Fetch article with id..." gnus-summary-refer-article t]
-     ["Stop page breaking" gnus-summary-stop-page-breaking t]
-     ["Rot 13" gnus-summary-caesar-message t]
-     ["Redisplay" gnus-summary-show-article t]
-     ["Toggle header" gnus-summary-toggle-header t]
-     ["Toggle MIME" gnus-summary-toggle-mime t]
-     ["Save" gnus-summary-save-article t]
-     ["Save in mail format" gnus-summary-save-article-mail t]
-     ["Pipe through a filter" gnus-summary-pipe-output t]
-     ("Mail articles"
-      ["Respool article" gnus-summary-respool-article t]
-      ["Move article" gnus-summary-move-article t]
-      ["Copy article" gnus-summary-copy-article t]
-      ["Import file" gnus-summary-import-article t]
-      ["Edit article" gnus-summary-edit-article t]
-      ["Delete article" gnus-summary-delete-article t])
-     ))
-
-  (easy-menu-define
-   gnus-summary-thread-menu
-   gnus-summary-mode-map
-   ""
-   '("Threads"
-     ["Toggle threading" gnus-summary-toggle-threads t]
-     ["Display hidden thread" gnus-summary-show-thread t]
-     ["Hide thread" gnus-summary-hide-thread t]
-     ["Go to next thread" gnus-summary-next-thread t]
-     ["Go to previous thread" gnus-summary-prev-thread t]
-     ["Go down thread" gnus-summary-down-thread t]
-     ["Go up thread" gnus-summary-up-thread t]
-     ["Mark thread as read" gnus-summary-kill-thread t]
-     ["Lower thread score" gnus-summary-lower-thread t]
-     ["Raise thread score" gnus-summary-raise-thread t]
-     ))
-
-  (easy-menu-define
-   gnus-summary-misc-menu
-   gnus-summary-mode-map
-   ""
-   '("Misc"
-     ("Sort"
-      ["Sort by number" gnus-summary-sort-by-number t]
-      ["Sort by author" gnus-summary-sort-by-author t]
-      ["Sort by subject" gnus-summary-sort-by-subject t]
-      ["Sort by date" gnus-summary-sort-by-date t]
-      ["Sort by score" gnus-summary-sort-by-score t])
-     ("Exit"
-      ["Catchup and exit" gnus-summary-catchup-and-exit t]
-      ["Catchup and goto next" gnus-summary-catchup-and-goto-next-group t]
-      ["Exit group" gnus-summary-exit t]
-      ["Exit group without updating" gnus-summary-exit-no-update t]
-      ["Reselect group" gnus-summary-reselect-current-group t]
-      ["Rescan group" gnus-summary-rescan-group t])
-     ["Fetch group FAQ" gnus-summary-fetch-faq t]
-     ["Filter articles" gnus-summary-execute-command t]
-     ["Toggle line truncation" gnus-summary-toggle-truncation t]
-     ["Expire expirable articles" gnus-summary-expire-articles t]
-     ["Describe group" gnus-summary-describe-group t]
-     ["Edit local kill file" gnus-summary-edit-local-kill t]
-     ))
-
-  (easy-menu-define
-   gnus-summary-post-menu
-   gnus-summary-mode-map
-   ""
-   '("Post"
-     ["Post an article" gnus-summary-post-news t]
-     ["Followup" gnus-summary-followup t]
-     ["Followup and yank" gnus-summary-followup-with-original t]
-     ["Supersede article" gnus-summary-supersede-article t]
-     ["Cancel article" gnus-summary-cancel-article t]
-     ["Reply" gnus-summary-reply t]
-     ["Reply and yank" gnus-summary-reply-with-original t]
-     ["Mail forward" gnus-summary-mail-forward t]
-     ["Post forward" gnus-summary-post-forward t]
-     ["Digest and mail" gnus-uu-digest-mail-forward t]
-     ["Digest and post" gnus-uu-digest-post-forward t]
-     ["Send a mail" gnus-summary-mail-other-window t]
-     ["Reply & followup" gnus-summary-followup-and-reply t]
-     ["Reply & followup and yank" gnus-summary-followup-and-reply-with-original t]
-     ["Uuencode and post" gnus-uu-post-news t]
-     ))
-
-  (easy-menu-define
-   gnus-summary-kill-menu
-   gnus-summary-mode-map
-   ""
-   (cons
-    "Score"
-    (nconc
-     (list
-      ["Enter score" gnus-summary-score-entry t])
-     (gnus-visual-score-map 'increase)
-     (gnus-visual-score-map 'lower)
-     '(["Current score" gnus-summary-current-score t]
-       ["Set score" gnus-summary-set-score t]
-       ("Score file"
+  (and 
+   (not (boundp 'gnus-summary-mark-menu)) ;JMP
+   (easy-menu-define
+    gnus-summary-mark-menu
+    gnus-summary-mode-map
+    ""
+    '("Mark"
+      ("Read"
+       ["Mark as read" gnus-summary-mark-as-read-forward t]
+       ["Mark same subject and select" gnus-summary-kill-same-subject-and-select t]
+       ["Mark same subject" gnus-summary-kill-same-subject t]
+       ["Catchup" gnus-summary-catchup t]
+       ["Catchup all" gnus-summary-catchup-all t]
+       ["Catchup to here" gnus-summary-catchup-to-here t]
+       ["Catchup region" gnus-summary-mark-region-as-read t])
+      ("Various"
+       ["Tick" gnus-summary-tick-article-forward t]
+       ["Mark as dormant" gnus-summary-mark-as-dormant t]
+       ["Remove marks" gnus-summary-clear-mark-forward t]
+       ["Set expirable mark" gnus-summary-mark-as-expirable t]
+       ["Set bookmark" gnus-summary-set-bookmark t]
+       ["Remove bookmark" gnus-summary-remove-bookmark t])
+      ("Display"
+       ["Remove lines marked as read" gnus-summary-remove-lines-marked-as-read t]
+       ["Remove lines marked with..." gnus-summary-remove-lines-marked-with t]
+       ["Show dormant articles" gnus-summary-show-all-dormant t]
+       ["Hide dormant articles" gnus-summary-hide-all-dormant t]
+       ["Show expunged articles" gnus-summary-show-all-expunged t])
+      ("Process mark"
+       ["Set mark" gnus-summary-mark-as-processable t]
+       ["Remove mark" gnus-summary-unmark-as-processable t]
+       ["Remove all marks" gnus-summary-unmark-all-processable t]
+       ["Mark series" gnus-uu-mark-series t]
+       ["Mark region" gnus-uu-mark-region t]
+       ["Mark by regexp" gnus-uu-mark-by-regexp t]
+       ["Mark all" gnus-uu-mark-all t]
+       ["Mark sparse" gnus-uu-mark-sparse t]
+       ["Mark thread" gnus-uu-mark-thread t]
+       )
+      ))
+
+   (easy-menu-define
+    gnus-summary-move-menu
+    gnus-summary-mode-map
+    ""
+    '("Move"
+      ["Scroll article forwards" gnus-summary-next-page t]
+      ["Next unread article" gnus-summary-next-unread-article t]
+      ["Previous unread article" gnus-summary-prev-unread-article t]
+      ["Next article" gnus-summary-next-article t]
+      ["Previous article" gnus-summary-prev-article t]
+      ["Next article same subject" gnus-summary-next-same-subject t]
+      ["Previous article same subject" gnus-summary-prev-same-subject t]
+      ["First unread article" gnus-summary-first-unread-article t]
+      ["Go to subject number..." gnus-summary-goto-subject t]
+      ["Go to the last article" gnus-summary-goto-last-article t]
+      ["Pop article off history" gnus-summary-pop-article t]
+      ))
+
+   (easy-menu-define
+    gnus-summary-article-menu
+    gnus-summary-mode-map
+    ""
+    '("Article"
+      ("Hide"
+       ("Date"
+       ["Local" gnus-article-date-local t]
+       ["UT" gnus-article-date-local t]
+       ["Lapsed" gnus-article-date-local t])
+       ["Headers" gnus-article-hide-headers t]
+       ["Signature" gnus-article-hide-signature t]
+       ["Citation" gnus-article-hide-citation t]
+       ["Overstrike" gnus-article-treat-overstrike t]
+       ["Word wrap" gnus-article-word-wrap t]
+       ["CR" gnus-article-remove-cr t]
+       ["Show X-Face" gnus-article-display-x-face t]
+       ["Quoted-Printable" gnus-article-de-quoted-unreadable t])
+      ("Extract"
+       ["Uudecode" gnus-uu-decode-uu t]
+       ["Uudecode and save" gnus-uu-decode-uu-and-save t]
+       ["Unshar" gnus-uu-decode-unshar t]
+       ["Unshar and save" gnus-uu-decode-unshar-and-save t]
+       ["Save" gnus-uu-decode-save t]
+       ["Binhex" gnus-uu-decode-binhex t])
+      ["Enter digest buffer" gnus-summary-enter-digest-group t]
+      ["Isearch article" gnus-summary-isearch-article t]
+      ["Search all articles" gnus-summary-search-article-forward t]
+      ["Beginning of the article" gnus-summary-beginning-of-article t]
+      ["End of the article" gnus-summary-end-of-article t]
+      ["Fetch parent of article" gnus-summary-refer-parent-article t]
+      ["Fetch article with id..." gnus-summary-refer-article t]
+      ["Stop page breaking" gnus-summary-stop-page-breaking t]
+      ["Rot 13" gnus-summary-caesar-message t]
+      ["Redisplay" gnus-summary-show-article t]
+      ["Toggle header" gnus-summary-toggle-header t]
+      ["Toggle MIME" gnus-summary-toggle-mime t]
+      ["Save" gnus-summary-save-article t]
+      ["Save in mail format" gnus-summary-save-article-mail t]
+      ["Pipe through a filter" gnus-summary-pipe-output t]
+      ("Mail articles"
+       ["Respool article" gnus-summary-respool-article t]
+       ["Move article" gnus-summary-move-article t]
+       ["Copy article" gnus-summary-copy-article t]
+       ["Import file" gnus-summary-import-article t]
+       ["Edit article" gnus-summary-edit-article t]
+       ["Delete article" gnus-summary-delete-article t])
+      ))
+
+   (easy-menu-define
+    gnus-summary-thread-menu
+    gnus-summary-mode-map
+    ""
+    '("Threads"
+      ["Toggle threading" gnus-summary-toggle-threads t]
+      ["Display hidden thread" gnus-summary-show-thread t]
+      ["Hide thread" gnus-summary-hide-thread t]
+      ["Go to next thread" gnus-summary-next-thread t]
+      ["Go to previous thread" gnus-summary-prev-thread t]
+      ["Go down thread" gnus-summary-down-thread t]
+      ["Go up thread" gnus-summary-up-thread t]
+      ["Mark thread as read" gnus-summary-kill-thread t]
+      ["Lower thread score" gnus-summary-lower-thread t]
+      ["Raise thread score" gnus-summary-raise-thread t]
+      ))
+
+   (easy-menu-define
+    gnus-summary-misc-menu
+    gnus-summary-mode-map
+    ""
+    '("Misc"
+      ("Sort"
+       ["Sort by number" gnus-summary-sort-by-number t]
+       ["Sort by author" gnus-summary-sort-by-author t]
+       ["Sort by subject" gnus-summary-sort-by-subject t]
+       ["Sort by date" gnus-summary-sort-by-date t]
+       ["Sort by score" gnus-summary-sort-by-score t])
+      ("Exit"
+       ["Catchup and exit" gnus-summary-catchup-and-exit t]
+       ["Catchup and goto next" gnus-summary-catchup-and-goto-next-group t]
+       ["Exit group" gnus-summary-exit t]
+       ["Exit group without updating" gnus-summary-exit-no-update t]
+       ["Reselect group" gnus-summary-reselect-current-group t]
+       ["Rescan group" gnus-summary-rescan-group t])
+      ["Fetch group FAQ" gnus-summary-fetch-faq t]
+      ["Filter articles" gnus-summary-execute-command t]
+      ["Toggle line truncation" gnus-summary-toggle-truncation t]
+      ["Expire expirable articles" gnus-summary-expire-articles t]
+      ["Describe group" gnus-summary-describe-group t]
+      ["Edit local kill file" gnus-summary-edit-local-kill t]
+      ))
+
+   (easy-menu-define
+    gnus-summary-post-menu
+    gnus-summary-mode-map
+    ""
+    '("Post"
+      ["Post an article" gnus-summary-post-news t]
+      ["Followup" gnus-summary-followup t]
+      ["Followup and yank" gnus-summary-followup-with-original t]
+      ["Supersede article" gnus-summary-supersede-article t]
+      ["Cancel article" gnus-summary-cancel-article t]
+      ["Reply" gnus-summary-reply t]
+      ["Reply and yank" gnus-summary-reply-with-original t]
+      ["Mail forward" gnus-summary-mail-forward t]
+      ["Post forward" gnus-summary-post-forward t]
+      ["Digest and mail" gnus-uu-digest-mail-forward t]
+      ["Digest and post" gnus-uu-digest-post-forward t]
+      ["Send a mail" gnus-summary-mail-other-window t]
+      ["Reply & followup" gnus-summary-followup-and-reply t]
+      ["Reply & followup and yank" gnus-summary-followup-and-reply-with-original t]
+      ["Uuencode and post" gnus-uu-post-news t]
+      ))
+
+   (easy-menu-define
+    gnus-summary-kill-menu
+    gnus-summary-mode-map
+    ""
+    (cons
+     "Score"
+     (nconc
+      (list
+       ["Enter score" gnus-summary-score-entry t])
+      (gnus-visual-score-map 'increase)
+      (gnus-visual-score-map 'lower)
+      '(["Current score" gnus-summary-current-score t]
+       ["Set score" gnus-summary-set-score t]
+       ("Score file"
         ["Customize score file" gnus-score-customize t]
         ["Switch current score file" gnus-score-change-score-file t]
         ["Set mark below" gnus-score-set-mark-below t]
         ["Customize score file" gnus-score-customize t]
         ["Switch current score file" gnus-score-change-score-file t]
         ["Set mark below" gnus-score-set-mark-below t]
@@ -544,8 +547,8 @@ highlight-headers-follow-url-netscape:
         ["Edit current score file" gnus-score-edit-alist t]
         ["Edit score file" gnus-score-edit-file t]
         ["Trace score" gnus-score-find-trace t])
         ["Edit current score file" gnus-score-edit-alist t]
         ["Edit score file" gnus-score-edit-file t]
         ["Trace score" gnus-score-find-trace t])
-       ))))
-
+       ))))
+   )                                   ; not done already - JMP
   )
 
 (defun gnus-visual-score-map (type)
   )
 
 (defun gnus-visual-score-map (type)
@@ -627,34 +630,35 @@ highlight-headers-follow-url-netscape:
 ;; Article buffer
 (defun gnus-article-make-menu-bar ()
   (gnus-visual-turn-off-edit-menu 'summary)
 ;; Article buffer
 (defun gnus-article-make-menu-bar ()
   (gnus-visual-turn-off-edit-menu 'summary)
-
- (easy-menu-define
-   gnus-article-article-menu
-   gnus-article-mode-map
-   ""
-   '("Article"
-     ["Scroll forwards" gnus-article-next-page t]
-     ["Scroll backwards" gnus-article-prev-page t]
-     ["Show summary" gnus-article-show-summary t]
-     ["Fetch Message-ID at point" gnus-article-refer-article t]
-     ["Mail to address at point" gnus-article-mail t]
-     ["Mail to address at point and include original"
-      gnus-article-mail-with-original t]
-     ))
-
- (easy-menu-define
-   gnus-article-treatment-menu
-   gnus-article-mode-map
-   ""
-   '("Treatment"
-     ["Hide headers" gnus-article-hide-headers t]
-     ["Hide signature" gnus-article-hide-signature t]
-     ["Hide citation" gnus-article-hide-citation t]
-     ["Treat overstrike" gnus-article-treat-overstrike t]
-     ["Remove carriage return" gnus-article-remove-cr t]
-     ["Remove quoted-unreadable" gnus-article-de-quoted-unreadable t]
-     ))
- )
+  (and 
+   (not (boundp 'gnus-article-article-menu)) ;JMP
+   (easy-menu-define
+    gnus-article-article-menu
+    gnus-article-mode-map
+    ""
+    '("Article"
+      ["Scroll forwards" gnus-article-next-page t]
+      ["Scroll backwards" gnus-article-prev-page t]
+      ["Show summary" gnus-article-show-summary t]
+      ["Fetch Message-ID at point" gnus-article-refer-article t]
+      ["Mail to address at point" gnus-article-mail t]
+      ["Mail to address at point and include original"
+       gnus-article-mail-with-original t]
+      ))
+
+   (easy-menu-define
+    gnus-article-treatment-menu
+    gnus-article-mode-map
+    ""
+    '("Treatment"
+      ["Hide headers" gnus-article-hide-headers t]
+      ["Hide signature" gnus-article-hide-signature t]
+      ["Hide citation" gnus-article-hide-citation t]
+      ["Treat overstrike" gnus-article-treat-overstrike t]
+      ["Remove carriage return" gnus-article-remove-cr t]
+      ["Remove quoted-unreadable" gnus-article-de-quoted-unreadable t]
+      ))
+   ))
 
 ;;;
 ;;; summary highlights
 
 ;;;
 ;;; summary highlights
@@ -1066,18 +1070,33 @@ External references are things like message-ids and URLs, as specified by
                (gnus-article-add-button start end 'gnus-button-push
                                         (set-marker (make-marker)
                                                     from)))))))))
                (gnus-article-add-button start end 'gnus-button-push
                                         (set-marker (make-marker)
                                                     from)))))))))
+(defun gnus-netscape-open-url (url)
+  "Open URL in netscape, or start new scape with URL."
+  (let ((process (start-process (concat "netscape " url)
+                               nil
+                               "netscape"
+                               "-remote" 
+                               (concat "openUrl(" url ")'"))))
+    (set-process-sentinel process 
+                         `(lambda (process change)
+                            (or (eq (process-exit-status process) 0)
+                                (gnus-netscape-start-url ,url))))))
+
+(defun gnus-netscape-start-url (url)
+  "Start netscape with URL."
+  (shell-command (concat "netscape " url "&")))
 
 ;;; External functions:
 
 (defun gnus-article-add-button (from to fun &optional data)
   "Create a button between FROM and TO with callback FUN and data DATA."
 
 ;;; External functions:
 
 (defun gnus-article-add-button (from to fun &optional data)
   "Create a button between FROM and TO with callback FUN and data DATA."
+  (and gnus-article-button-face
+       (overlay-put (make-overlay from to) 'face gnus-article-button-face))
   (add-text-properties from to
   (add-text-properties from to
-                      (append (if gnus-article-button-face
-                                  (list 'face gnus-article-button-face))
-                              (if gnus-article-mouse-face
-                                  (list 'mouse-face gnus-article-mouse-face))
+                      (append (and gnus-article-mouse-face
+                                   (list 'mouse-face gnus-article-mouse-face))
                               (list 'gnus-callback fun)
                               (list 'gnus-callback fun)
-                              (if data (list 'gnus-data data)))))
+                              (and data (list 'gnus-data data)))))
 
 ;;; Internal functions:
 
 
 ;;; Internal functions:
 
index 3b28172..66a10d2 100644 (file)
@@ -118,7 +118,8 @@ save those articles instead."
        (if gnus-use-full-window
            (pop-to-buffer gnus-article-buffer)
          (switch-to-buffer gnus-article-buffer)))
        (if gnus-use-full-window
            (pop-to-buffer gnus-article-buffer)
          (switch-to-buffer gnus-article-buffer)))
-    (set-buffer gnus-article-buffer)
+    (gnus-copy-article-buffer)
+    (set-buffer gnus-article-copy)
     (save-excursion
       (save-restriction
        (widen)
     (save-excursion
       (save-restriction
        (widen)
@@ -147,11 +148,12 @@ save those articles instead."
 Optional argument YANK means yank original article.
 The command \\[vm-yank-message] yank the original message into current buffer."
   (let ((gnus-buffer (current-buffer)))
 Optional argument YANK means yank original article.
 The command \\[vm-yank-message] yank the original message into current buffer."
   (let ((gnus-buffer (current-buffer)))
-    (set-buffer gnus-article-buffer)
+    (gnus-copy-article-buffer)
+    (set-buffer gnus-article-copy)
     (save-excursion
       (save-restriction
        (widen)
     (save-excursion
       (save-restriction
        (widen)
-       (let ((vm-folder (gnus-vm-make-folder gnus-article-buffer)))
+       (let ((vm-folder (gnus-vm-make-folder gnus-article-copy)))
          (vm-reply 1)
          (gnus-vm-init-reply-buffer gnus-buffer)
          (setq gnus-buffer (current-buffer))
          (vm-reply 1)
          (gnus-vm-init-reply-buffer gnus-buffer)
          (setq gnus-buffer (current-buffer))
index 31fdcab..cdeece3 100644 (file)
@@ -1340,7 +1340,7 @@ variable (string, integer, character, etc).")
 (defconst gnus-maintainer "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)"
   "The mail address of the Gnus maintainers.")
 
 (defconst gnus-maintainer "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)"
   "The mail address of the Gnus maintainers.")
 
-(defconst gnus-version "(ding) Gnus v0.95"
+(defconst gnus-version "(ding) Gnus v0.96"
   "Version number for this version of Gnus.")
 
 (defvar gnus-info-nodes
   "Version number for this version of Gnus.")
 
 (defvar gnus-info-nodes
@@ -1507,6 +1507,8 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
 (defvar rmail-default-file (expand-file-name "~/XMBOX"))
 (defvar rmail-default-rmail-file (expand-file-name "~/XNEWS"))
 
 (defvar rmail-default-file (expand-file-name "~/XMBOX"))
 (defvar rmail-default-rmail-file (expand-file-name "~/XNEWS"))
 
+(defvar gnus-cache-removeable-articles nil)
+
 (defconst gnus-summary-local-variables 
   '(gnus-newsgroup-name 
     gnus-newsgroup-begin gnus-newsgroup-end 
 (defconst gnus-summary-local-variables 
   '(gnus-newsgroup-name 
     gnus-newsgroup-begin gnus-newsgroup-end 
@@ -1526,7 +1528,8 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
     gnus-score-alist gnus-current-score-file gnus-summary-expunge-below 
     gnus-summary-mark-below gnus-newsgroup-active gnus-scores-exclude-files
     gnus-newsgroup-history gnus-newsgroup-ancient
     gnus-score-alist gnus-current-score-file gnus-summary-expunge-below 
     gnus-summary-mark-below gnus-newsgroup-active gnus-scores-exclude-files
     gnus-newsgroup-history gnus-newsgroup-ancient
-    (gnus-newsgroup-adaptive . gnus-use-adaptive-scoring))
+    (gnus-newsgroup-adaptive . gnus-use-adaptive-scoring)
+    gnus-cache-removeable-articles)
   "Variables that are buffer-local to the summary buffers.")
 
 (defconst gnus-bug-message
   "Variables that are buffer-local to the summary buffers.")
 
 (defconst gnus-bug-message
@@ -3496,6 +3499,7 @@ moves the point to the colon."
         (process-marked (if (member qualified-group gnus-group-marked)
                             gnus-process-mark ? ))
         (buffer-read-only nil)
         (process-marked (if (member qualified-group gnus-group-marked)
                             gnus-process-mark ? ))
         (buffer-read-only nil)
+        header ; passed as parameter to user-funcs.
         b)
     (beginning-of-line)
     (setq b (point))
         b)
     (beginning-of-line)
     (setq b (point))
@@ -3598,9 +3602,9 @@ If LEVEL is non-nil, find group with level LEVEL, or higher if no such
 group exists.
 If FIRST-TOO, the current line is also eligible as a target."
   (let ((way (if backward -1 1))
 group exists.
 If FIRST-TOO, the current line is also eligible as a target."
   (let ((way (if backward -1 1))
-       (low 10)
+       (low gnus-level-killed)
        (beg (point))
        (beg (point))
-       pos found)
+       pos found lev)
     (if (and backward (progn (beginning-of-line)) (bobp))
        nil
       (or first-too (forward-line way))
     (if (and backward (progn (beginning-of-line)) (bobp))
        nil
       (or first-too (forward-line way))
@@ -3613,27 +3617,24 @@ If FIRST-TOO, the current line is also eligible as a target."
                              (let ((unread 
                                     (get-text-property (point) 'gnus-unread)))
                                (or (eq unread t) (and unread (> unread 0))))
                              (let ((unread 
                                     (get-text-property (point) 'gnus-unread)))
                                (or (eq unread t) (and unread (> unread 0))))
-                             (let ((lev (get-text-property
-                                         (point) 'gnus-level)))
-                               (and lev (<= (get-text-property 
-                                             (point) 'gnus-level)
-                                            gnus-level-subscribed)))))
+                             (setq lev (get-text-property (point)
+                                                          'gnus-level))
+                             (<= lev gnus-level-subscribed)))
                         (or (not level)
                         (or (not level)
-                            (let ((lev (get-text-property (point)
-                                                          'gnus-level)))
-                              (if (and lev (= lev level))
-                                  t
-                                (if (and (< lev low)
-                                         (< level low))
-                                    (progn
-                                      (setq low lev)
-                                      (setq pos (point))))
-                                nil))))))
+                            (and (setq lev (get-text-property (point)
+                                                              'gnus-level))
+                                 (or (= lev level)
+                                     (and (< lev low)
+                                          (< level lev)
+                                          (progn
+                                            (setq low lev)
+                                            (setq pos (point))
+                                            nil))))))))
              (zerop (forward-line way)))))
     (if found 
        (progn (gnus-group-position-cursor) t)
              (zerop (forward-line way)))))
     (if found 
        (progn (gnus-group-position-cursor) t)
-      (if pos (goto-char pos) (goto-char beg))
-      nil)))
+      (goto-char (or pos beg))
+      (and pos t))))
 
 ;;; Gnus group mode commands
 
 
 ;;; Gnus group mode commands
 
@@ -4474,23 +4475,22 @@ If ARG is non-nil, it should be a number between one and nine to
 specify which levels you are interested in re-scanning."
   (interactive "P")
   (run-hooks 'gnus-get-new-news-hook)
 specify which levels you are interested in re-scanning."
   (interactive "P")
   (run-hooks 'gnus-get-new-news-hook)
-  (let ((level arg))
-    (if gnus-group-use-permanent-levels
-       (if level
-           (setq gnus-group-default-list-level level)
-         (setq level (or gnus-group-default-list-level 
-                         gnus-level-subscribed))))
-    (if (and gnus-read-active-file (not level))
-       (progn
-         (gnus-read-active-file)
-         (gnus-get-unread-articles (or level (1+ gnus-level-subscribed))))
-      (let ((gnus-read-active-file nil)
-           (gnus-have-read-active-file (not arg)))
-       (gnus-get-unread-articles (or level (1+ gnus-level-subscribed)))))
-    (gnus-group-list-groups (or (and gnus-group-use-permanent-levels level)
-                               gnus-group-default-list-level
-                               gnus-level-subscribed)
-                           gnus-have-all-newsgroups)))
+  (if gnus-group-use-permanent-levels
+      (setq arg
+           (setq gnus-group-default-list-level 
+                 (or arg gnus-group-default-list-level
+                     gnus-level-subscribed))))
+  (if (and gnus-read-active-file (not arg))
+      (progn
+       (gnus-read-active-file)
+       (gnus-get-unread-articles (or arg (1+ gnus-level-subscribed))))
+    (let ((gnus-read-active-file nil)
+         (gnus-have-read-active-file (not arg)))
+      (gnus-get-unread-articles (or arg (1+ gnus-level-subscribed)))))
+  (gnus-group-list-groups (or (and gnus-group-use-permanent-levels arg)
+                             gnus-group-default-list-level
+                             gnus-level-subscribed)
+                         gnus-have-all-newsgroups))
 
 (defun gnus-group-get-new-news-this-group (n)
   "Check for newly arrived news in the current group (and the N-1 next groups).
 
 (defun gnus-group-get-new-news-this-group (n)
   "Check for newly arrived news in the current group (and the N-1 next groups).
@@ -8035,8 +8035,7 @@ NOTE: This command only works with newsgroups that use real or simulated NNTP."
                  (let ((buffer-read-only nil))
                    (and tmp-point
                         (set-window-start (get-buffer-window (current-buffer))
                  (let ((buffer-read-only nil))
                    (and tmp-point
                         (set-window-start (get-buffer-window (current-buffer))
-                                          tmp-point))))
-               (kill-buffer tmp-buf))))))))
+                                          tmp-point)))))))))))
 
 (defun gnus-summary-enter-digest-group ()
   "Enter a digest group based on the current article."
 
 (defun gnus-summary-enter-digest-group ()
   "Enter a digest group based on the current article."
@@ -8541,6 +8540,7 @@ functions. (Ie. mail newsgroups at present.)"
           (gnus-check-backend-function 
            'request-expire-articles gnus-newsgroup-name))
       (let ((expirable gnus-newsgroup-expirable))
           (gnus-check-backend-function 
            'request-expire-articles gnus-newsgroup-name))
       (let ((expirable gnus-newsgroup-expirable))
+       (gnus-message 6 "Expiring articles...")
        ;; The list of articles that weren't expired is returned.
        (setq gnus-newsgroup-expirable 
              (gnus-request-expire-articles gnus-newsgroup-expirable
        ;; The list of articles that weren't expired is returned.
        (setq gnus-newsgroup-expirable 
              (gnus-request-expire-articles gnus-newsgroup-expirable
@@ -8550,7 +8550,9 @@ functions. (Ie. mail newsgroups at present.)"
        (while expirable
          (or (memq (car expirable) gnus-newsgroup-expirable)
              (gnus-summary-mark-as-read (car expirable) gnus-canceled-mark))
        (while expirable
          (or (memq (car expirable) gnus-newsgroup-expirable)
              (gnus-summary-mark-as-read (car expirable) gnus-canceled-mark))
-         (setq expirable (cdr expirable))))))
+         (setq expirable (cdr expirable)))
+       (gnus-message 6 "Expiring articles...done"))))
+
 
 (defun gnus-summary-expire-articles-now ()
   "Expunge all expirable articles in the current group.
 
 (defun gnus-summary-expire-articles-now ()
   "Expunge all expirable articles in the current group.
@@ -10031,7 +10033,7 @@ is initialized from the SAVEDIR environment variable."
   ;; Duplicate almost all summary keystrokes in the article mode map.
   (let ((commands 
         (list 
   ;; Duplicate almost all summary keystrokes in the article mode map.
   (let ((commands 
         (list 
-         " " "\177" "n" "p" "N" "P" "\M-\C-n" "\M-\C-p"
+         " " "\177" "p" "N" "P" "\M-\C-n" "\M-\C-p"
          "\M-n" "\M-p" "." "," "\M-s" "\M-r" "<" ">" "j" "^" "\M-^"
          "u" "!" "U" "d" "D" "E" "\M-u" "\M-U" "k" "\C-k" "\M-\C-k"
          "\M-\C-l" "e" "#" "\M-#" "\M-\C-t" "\M-\C-s" "\M-\C-h"
          "\M-n" "\M-p" "." "," "\M-s" "\M-r" "<" ">" "j" "^" "\M-^"
          "u" "!" "U" "d" "D" "E" "\M-u" "\M-U" "k" "\C-k" "\M-\C-k"
          "\M-\C-l" "e" "#" "\M-#" "\M-\C-t" "\M-\C-s" "\M-\C-h"
@@ -10062,7 +10064,7 @@ is initialized from the SAVEDIR environment variable."
 
   (let ((commands (list "q" "Q"  "c" "r" "R" "\C-c\C-f" "m"  "a" "f" "F"
 ;;                     "Zc" "ZC" "ZE" "ZQ" "ZZ" "Zn" "ZR" "ZG" "ZN" "ZP" 
 
   (let ((commands (list "q" "Q"  "c" "r" "R" "\C-c\C-f" "m"  "a" "f" "F"
 ;;                     "Zc" "ZC" "ZE" "ZQ" "ZZ" "Zn" "ZR" "ZG" "ZN" "ZP" 
-                        "=")))
+                        "=" "n")))
     (while commands
       (define-key gnus-article-mode-map (car commands) 
        'gnus-article-summary-command-nosave)
     (while commands
       (define-key gnus-article-mode-map (car commands) 
        'gnus-article-summary-command-nosave)
@@ -10836,7 +10838,7 @@ Argument LINES specifies lines to be scrolled down."
   "Execute the last keystroke in the summary buffer."
   (interactive)
   (let (func)
   "Execute the last keystroke in the summary buffer."
   (interactive)
   (let (func)
-    (switch-to-buffer gnus-summary-buffer 'norecord)
+    (pop-to-buffer gnus-summary-buffer 'norecord)
     (setq func (lookup-key (current-local-map) (this-command-keys)))
     (call-interactively func)))
 
     (setq func (lookup-key (current-local-map) (this-command-keys)))
     (call-interactively func)))
 
@@ -12783,8 +12785,7 @@ If FORCE is non-nil, the .newsrc file is read."
       (kill-buffer (current-buffer)))))
 
 (defun gnus-read-all-descriptions-files ()
       (kill-buffer (current-buffer)))))
 
 (defun gnus-read-all-descriptions-files ()
-  (let ((methods (nconc (list gnus-select-method) 
-                       gnus-secondary-select-methods)))
+  (let ((methods (cons gnus-select-method gnus-secondary-select-methods)))
     (while methods
       (gnus-read-descriptions-file (car methods))
       (setq methods (cdr methods)))
     (while methods
       (gnus-read-descriptions-file (car methods))
       (setq methods (cdr methods)))
index abee4ff..8908945 100644 (file)
                             days)))
                (progn
                  (and gnus-verbose-backends
                             days)))
                (progn
                  (and gnus-verbose-backends
-                      (message "Deleting: %s" (car articles)))
+                      (message "Deleting article %s..." (car articles)))
                  (nnbabyl-delete-mail))
              (setq rest (cons (car articles) rest))))
        (setq articles (cdr articles)))
                  (nnbabyl-delete-mail))
              (setq rest (cons (car articles) rest))))
        (setq articles (cdr articles)))
index 0942128..6db355c 100644 (file)
@@ -66,7 +66,7 @@ such things as moving mail.  All buffers always get killed upon server close.")
   "Mail newsgroups description file.")
 
 (defvar nnfolder-get-new-mail t
   "Mail newsgroups description file.")
 
 (defvar nnfolder-get-new-mail t
-  "If non-nil, nnml will check the incoming mail file and split the mail.")
+  "If non-nil, nnfolder will check the incoming mail file and split the mail.")
 
 (defvar nnfolder-prepare-save-mail-hook nil
   "Hook run narrowed to an article before saving.")
 
 (defvar nnfolder-prepare-save-mail-hook nil
   "Hook run narrowed to an article before saving.")
@@ -84,6 +84,7 @@ such things as moving mail.  All buffers always get killed upon server close.")
 (defvar nnfolder-status-string "")
 (defvar nnfolder-group-alist nil)
 (defvar nnfolder-buffer-alist nil)
 (defvar nnfolder-status-string "")
 (defvar nnfolder-group-alist nil)
 (defvar nnfolder-buffer-alist nil)
+(defvar nnfolder-active-timestamp nil)
 
 (defmacro nnfolder-article-string (article)
   (` (concat "\n" nnfolder-article-marker (int-to-string (, article)) " ")))
 
 (defmacro nnfolder-article-string (article)
   (` (concat "\n" nnfolder-article-marker (int-to-string (, article)) " ")))
@@ -102,7 +103,8 @@ such things as moving mail.  All buffers always get killed upon server close.")
    '(nnfolder-current-buffer nil)
    '(nnfolder-status-string "")
    '(nnfolder-group-alist nil)
    '(nnfolder-current-buffer nil)
    '(nnfolder-status-string "")
    '(nnfolder-group-alist nil)
-   '(nnfolder-buffer-alist nil)))
+   '(nnfolder-buffer-alist nil)
+   '(nnfolder-active-timestamp nil)))
 
 \f
 
 
 \f
 
@@ -220,19 +222,30 @@ such things as moving mail.  All buffers always get killed upon server close.")
           (if dont-check
               t
             (nnfolder-get-new-mail group))
           (if dont-check
               t
             (nnfolder-get-new-mail group))
-          (let* ((active (assoc group nnfolder-group-alist))
-                 (group (car active))
-                 (range (car (cdr active)))
-                 (minactive (car range))
-                 (maxactive (cdr range)))
-            ;; I've been getting stray 211 lines in my nnfolder active
-            ;; file.  So, let's make sure that doesn't happen. -SLB
-            (set-buffer nntp-server-buffer)
-            (erase-buffer)
-            (insert (format "211 %d %d %d %s\n" 
-                            (1+ (- maxactive minactive))
-                            minactive maxactive group))
-            t)))))
+          (let ((timestamp (nth 5 (file-attributes nnfolder-active-file))))
+            ;; Make sure we get the latest active file
+            (if (or (not nnfolder-active-timestamp)
+                    (> (nth 0 timestamp) (nth 0 nnfolder-active-timestamp))
+                    (> (nth 1 timestamp) (nth 1 nnfolder-active-timestamp)))
+                (progn
+                  (setq nnfolder-active-timestamp timestamp)
+                  (nnfolder-request-list)
+                  (setq nnfolder-group-alist (nnmail-get-active))))
+            (let* ((active (assoc group nnfolder-group-alist))
+                  (group (car active))
+                  (range (car (cdr active)))
+                  (minactive (car range))
+                  (maxactive (cdr range)))
+              ;; I've been getting stray 211 lines in my nnfolder active
+              ;; file.  So, let's make sure that doesn't happen. -SLB
+              (set-buffer nntp-server-buffer)
+              (erase-buffer)
+              (if (not active)
+                  ()
+                (insert (format "211 %d %d %d %s\n" 
+                                (1+ (- maxactive minactive))
+                                minactive maxactive group))
+                t)))))))
 
 ;; Don't close the buffer if we're not shutting down the server.  This way,
 ;; we can keep the buffer in the group buffer cache, and not have to grovel
 
 ;; Don't close the buffer if we're not shutting down the server.  This way,
 ;; we can keep the buffer in the group buffer cache, and not have to grovel
@@ -267,21 +280,25 @@ such things as moving mail.  All buffers always get killed upon server close.")
   (nnfolder-request-list)
   (setq nnfolder-group-alist (nnmail-get-active))
   (or (assoc group nnfolder-group-alist)
   (nnfolder-request-list)
   (setq nnfolder-group-alist (nnmail-get-active))
   (or (assoc group nnfolder-group-alist)
-      (progn
+      (let (active)
        (setq nnfolder-group-alist 
        (setq nnfolder-group-alist 
-             (cons (list group (cons 0 0)) nnfolder-group-alist))
+             (cons (list group (setq active (cons 0 0))) nnfolder-group-alist))
+       (nnfolder-possibly-change-group group)
        (nnmail-save-active nnfolder-group-alist nnfolder-active-file)))
   t)
 
 (defun nnfolder-request-list (&optional server)
   (if server (nnfolder-get-new-mail))
   (save-excursion
        (nnmail-save-active nnfolder-group-alist nnfolder-active-file)))
   t)
 
 (defun nnfolder-request-list (&optional server)
   (if server (nnfolder-get-new-mail))
   (save-excursion
-    (or nnfolder-group-alist
-       (nnmail-find-file nnfolder-active-file)
-       (progn
-         (setq nnfolder-group-alist (nnmail-get-active))
-         (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
-         (nnmail-find-file nnfolder-active-file)))))
+    (nnmail-find-file nnfolder-active-file)
+    (setq nnfolder-group-alist (nnmail-get-active))))
+
+;;    (or nnfolder-group-alist
+;;     (nnmail-find-file nnfolder-active-file)
+;;     (progn
+;;       (setq nnfolder-group-alist (nnmail-get-active))
+;;       (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
+;;       (nnmail-find-file nnfolder-active-file)))))
 
 (defun nnfolder-request-newgroups (date &optional server)
   (nnfolder-request-list server))
 
 (defun nnfolder-request-newgroups (date &optional server)
   (nnfolder-request-list server))
@@ -304,7 +321,7 @@ such things as moving mail.  All buffers always get killed upon server close.")
         (is-old t)
         rest)
     (nnfolder-request-list)
         (is-old t)
         rest)
     (nnfolder-request-list)
-    (setq nnfolder-group-alist (nnmail-get-active))
+    ;;(setq nnfolder-group-alist (nnmail-get-active))
 
     (save-excursion 
       (set-buffer nnfolder-current-buffer)
 
     (save-excursion 
       (set-buffer nnfolder-current-buffer)
@@ -320,7 +337,7 @@ such things as moving mail.  All buffers always get killed upon server close.")
                             days)))
                (progn
                  (and gnus-verbose-backends
                             days)))
                (progn
                  (and gnus-verbose-backends
-                      (message "Deleting: %s" (car articles)))
+                      (message "Deleting article %s..." (car articles)))
                  (nnfolder-delete-mail))
              (setq rest (cons (car articles) rest))))
        (setq articles (cdr articles)))
                  (nnfolder-delete-mail))
              (setq rest (cons (car articles) rest))))
        (setq articles (cdr articles)))
@@ -374,7 +391,7 @@ such things as moving mail.  All buffers always get killed upon server close.")
     result))
 
 (defun nnfolder-request-accept-article (group &optional last)
     result))
 
 (defun nnfolder-request-accept-article (group &optional last)
-  (nnfolder-possibly-change-group group)
+  (and (stringp group) (nnfolder-possibly-change-group group))
   (let ((buf (current-buffer))
        result)
     (goto-char (point-min))
   (let ((buf (current-buffer))
        result)
     (goto-char (point-min))
index ed30874..5e383b4 100644 (file)
                             days)))
                (progn
                  (and gnus-verbose-backends
                             days)))
                (progn
                  (and gnus-verbose-backends
-                      (message "Deleting: %s" (car articles)))
+                      (message "Deleting article %s..." (car articles)))
                  (nnmbox-delete-mail))
              (setq rest (cons (car articles) rest))))
        (setq articles (cdr articles)))
                  (nnmbox-delete-mail))
              (setq rest (cons (car articles) rest))))
        (setq articles (cdr articles)))
index 3200733..cf3265a 100644 (file)
                                 (current-time-string mod-time))
                                days))))
              (progn
                                 (current-time-string mod-time))
                                days))))
              (progn
-               (and gnus-verbose-backends (message "Deleting %s..." article))
+               (and gnus-verbose-backends 
+                    (message "Deleting article %s..." article))
                (condition-case ()
                    (delete-file article)
                  (file-error
                (condition-case ()
                    (delete-file article)
                  (file-error
index a9de45c..5c308c5 100644 (file)
@@ -289,7 +289,8 @@ all. This may very well take some time.")
                                 (current-time-string mod-time))
                                days))))
              (progn
                                 (current-time-string mod-time))
                                days))))
              (progn
-               (and gnus-verbose-backends (message "Deleting %s..." article))
+               (and gnus-verbose-backends 
+                    (message "Deleting article %s..." article))
                (condition-case ()
                    (delete-file article)
                  (file-error
                (condition-case ()
                    (delete-file article)
                  (file-error
index 50e4d9d..5d113ae 100644 (file)
@@ -5663,6 +5663,11 @@ this file name is detailed by the @code{gnus-kill-file-name} variable.
 The "global" kill file (not in the score file sense of "global", of
 course) is called just @file{KILL}.
 
 The "global" kill file (not in the score file sense of "global", of
 course) is called just @file{KILL}.
 
+@vindex gnus-kill-save-kill-file
+If @code{gnus-kill-save-kill-file} is non-@code{nil}, Gnus will save the
+kill file after processing, which is necessary if you use expiring
+kills. 
+
 
 @node Mail Group Commands
 @section Mail Group Commands
 
 @node Mail Group Commands
 @section Mail Group Commands