+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
--- /dev/null
+;;; 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
(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
\f
(defvar gnus-cache-buffer nil)
-(defvar gnus-cache-removeable-articles nil)
\f
(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"))
(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)
(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))))
)
(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
(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 ()
(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)
(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
(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)))
(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)
;; 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)
(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 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.
;; 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)))))
(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.
'(("" 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,
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
(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]
["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)
;; 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
(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:
(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)
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))
(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
(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
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
(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))
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))
(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
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).
(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."
(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
(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.
;; 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"
(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)
"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)))
(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)))
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)))
"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-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)) " ")))
'(nnfolder-current-buffer nil)
'(nnfolder-status-string "")
'(nnfolder-group-alist nil)
- '(nnfolder-buffer-alist nil)))
+ '(nnfolder-buffer-alist nil)
+ '(nnfolder-active-timestamp nil)))
\f
(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
(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))
(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)
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)))
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))
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)))
(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
(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
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