*** 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
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)))
       
+(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
index 7124fd6..38999e4 100644 (file)
@@ -38,7 +38,6 @@
 \f
 
 (defvar gnus-cache-buffer nil)
-(defvar gnus-cache-removeable-articles nil)
 
 \f
 
@@ -68,8 +67,7 @@
           (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.
   (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))
          ;; 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 
-  (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)
-       (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"))
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 ())))))
 
-    (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) 
@@ -392,6 +389,16 @@ NOTE: This command only works with newsgroups that use real or simulated NNTP."
              (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-save-kill-file nil
+  "*If non-nil, will save kill files after processing them.")
+
 (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)))))
-    (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 ()
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))
-  (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)
index d64fbe1..d8d8be6 100644 (file)
@@ -170,7 +170,8 @@ of the last successful match.")
     (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
@@ -207,7 +208,8 @@ of the last successful match.")
 
       (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)))
@@ -239,7 +241,8 @@ of the last successful match.")
 
        (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)
@@ -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)
+       (all-scores scores)
        ;; 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))
-                        (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)))
@@ -1155,7 +1160,7 @@ SCORE is the score to add."
              (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.
@@ -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)))
 
-(defun gnus-score-add-followups (header score)
+(defun gnus-score-add-followups (header score scores)
   (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.
-      (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
-              (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)))))
index 840c5a6..02f5601 100644 (file)
               (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)))
-              (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))
-              (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))
-              (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))
-              (custom-face-lookup "blue" nil nil nil t nil))
+                    (custom-face-lookup "SkyBlue" nil nil nil t nil))
               (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))
-              (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))
-              (custom-face-lookup "green" nil nil nil t nil))
+                    (custom-face-lookup "green" nil nil nil t nil))
               (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 '(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)))
-              (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))
-              (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))
-              (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))
-              (custom-face-lookup "RoyalBlue" nil nil nil t nil))
+                    (custom-face-lookup "RoyalBlue" nil nil nil t nil))
               (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))
-              (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))
-              (custom-face-lookup "DarkGreen" nil nil nil t nil))
+                    (custom-face-lookup "DarkGreen" nil nil nil t nil))
               (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))))
-       "*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.  
 
@@ -123,24 +123,24 @@ The latter can be used like this:
         '(("" 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 
-                      (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,
@@ -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.")
 
-(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.
-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
 
@@ -220,323 +218,328 @@ highlight-headers-follow-url-netscape:
 
 (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)
-
-  (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)
-
-  (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)
 
-  (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]
@@ -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])
-       ))))
-
+       ))))
+   )                                   ; not done already - JMP
   )
 
 (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)
-
- (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
@@ -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)))))))))
+(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."
+  (and gnus-article-button-face
+       (overlay-put (make-overlay from to) 'face gnus-article-button-face))
   (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)
-                              (if data (list 'gnus-data data)))))
+                              (and data (list 'gnus-data data)))))
 
 ;;; 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)))
-    (set-buffer gnus-article-buffer)
+    (gnus-copy-article-buffer)
+    (set-buffer gnus-article-copy)
     (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)))
-    (set-buffer gnus-article-buffer)
+    (gnus-copy-article-buffer)
+    (set-buffer gnus-article-copy)
     (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))
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-version "(ding) Gnus v0.95"
+(defconst gnus-version "(ding) Gnus v0.96"
   "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 gnus-cache-removeable-articles nil)
+
 (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-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
@@ -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)
+        header ; passed as parameter to user-funcs.
         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))
-       (low 10)
+       (low gnus-level-killed)
        (beg (point))
-       pos found)
+       pos found lev)
     (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 ((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)
-                            (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)
-      (if pos (goto-char pos) (goto-char beg))
-      nil)))
+      (goto-char (or pos beg))
+      (and pos t))))
 
 ;;; 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)
-  (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).
@@ -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))
-                                          tmp-point))))
-               (kill-buffer tmp-buf))))))))
+                                          tmp-point)))))))))))
 
 (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-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
@@ -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))
-         (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.
@@ -10031,7 +10033,7 @@ is initialized from the SAVEDIR environment variable."
   ;; 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"
@@ -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" 
-                        "=")))
+                        "=" "n")))
     (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)
-    (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)))
 
@@ -12783,8 +12785,7 @@ If FORCE is non-nil, the .newsrc file is read."
       (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)))
index abee4ff..8908945 100644 (file)
                             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)))
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
-  "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.")
@@ -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-active-timestamp nil)
 
 (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-buffer-alist nil)))
+   '(nnfolder-buffer-alist nil)
+   '(nnfolder-active-timestamp nil)))
 
 \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))
-          (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
@@ -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)
-      (progn
+      (let (active)
        (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
-    (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))
@@ -304,7 +321,7 @@ such things as moving mail.  All buffers always get killed upon server close.")
         (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)
@@ -320,7 +337,7 @@ such things as moving mail.  All buffers always get killed upon server close.")
                             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)))
@@ -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)
-  (nnfolder-possibly-change-group group)
+  (and (stringp group) (nnfolder-possibly-change-group group))
   (let ((buf (current-buffer))
        result)
     (goto-char (point-min))
index ed30874..5e383b4 100644 (file)
                             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)))
index 3200733..cf3265a 100644 (file)
                                 (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
index a9de45c..5c308c5 100644 (file)
@@ -289,7 +289,8 @@ all. This may very well take some time.")
                                 (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
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}.
 
+@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