Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

*** empty log message ***

  • Loading branch information...
commit 057c31251c1c71d749473e71ca3558571f2d59ab 1 parent d0f6858
@larsmagne larsmagne authored
View
294 etc/gnus-tut.txt
@@ -0,0 +1,294 @@
+From lars Thu Feb 23 23:20:38 1995
+From: larsi@ifi.uio.no (ding)
+Date: Fri Feb 24 13:40:45 1995
+Subject: So you want to use the new Gnus
+Message-ID: <lars-doc1@eyesore.no>
+
+Actually, since you are reading this, chances are you are already
+using the new Gnus. Congratulations.
+
+This entire newsgroup you are reading is, in fact, no real newsgroup
+at all, in the traditional sense. It is an example of one of the
+"foreign" select methods that Gnus may use.
+
+The text you are now reading is stored in the "etc" directory with the
+rest of the Emacs sources. You are using the "nndoc" backend for
+accessing it. Scary, isn't it?
+
+This isn't the real documentation. `M-x info', `m gnus <RET>' to read
+that. This "newsgroup" is intended as a kinder, gentler way of getting
+people started.
+
+Gnus is a rewrite of GNUS 4.1, written by Masanobu Umeda. The rewrite
+was done by moi, yours truly, your humble servant, Lars Magne
+Ingebrigtsen. If you have a WWW browser, you can investigate to your
+heart's delight at <URL:http://www.ifi.uio.no/~larsi/larsi.html>.
+
+;; Copyright (C) 1995 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+;; Keywords: news
+
+;; 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 2, 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, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+From lars Thu Feb 23 23:20:38 1995
+From: larsi@ifi.uio.no (ding)
+Date: Fri Feb 24 13:40:45 1995
+Subject: Starting up
+Message-ID: <lars-doc2@eyesore.no>
+
+If you are having problems with Gnus not finding your server, you have
+to set `gnus-select-method'. A "method" is a way of specifying *how*
+the news is to be found, and from *where*.
+
+Say you want to read news from you local, friendly nntp server
+"news.my.local.server".
+
+(setq gnus-select-method '(nntp "news.my.local.server"))
+
+Quite easy, huh?
+
+From the news spool:
+
+(setq gnus-select-method '(nnspool ""))
+
+From your mh-e spool:
+
+(setq gnus-select-method '(nnmh ""))
+
+There's a whole bunch of other methods for reading mail and news, see
+the "Foreign groups" article for that.
+
+
+From lars Thu Feb 23 23:20:38 1995
+From: larsi@ifi.uio.no (ding)
+Date: Fri Feb 24 13:40:45 1995
+Subject: Where are all the groups, then?
+Message-ID: <lars-doc3@eyesore.no>
+
+If this is the first time you have used a newsreader, you won't have a
+.newsrc file. This means that Gnus will think that all the newsgroups
+on the server are "new", and kill them all.
+
+If you have a .newsrc file, the new groups will be processed with the
+function in the `gnus-subscribe-newsgroup-method' variable, which is
+`gnus-subscribe-zombies' by default.
+
+This means that all the groups have been made into "zombies" - not
+quite dead, but not exactly alive, either.
+
+Jump back to the *Group* buffer, and type `A z' to list all the zombie
+groups. Look though the list, and subscribe to the groups you want to
+read by pressing `u' on the one you think look interesting.
+
+If all the groups have been killed, type `A k' to list all the killed
+groups. Subscribe to them the same way.
+
+When you are satisfied, press `S z' to kill all the zombie groups.
+
+Now you should have a nice list of all groups you are interested in.
+
+(If you later want to subscribe to more groups, press `A k' to
+list all the kill groups, and repeat. You can also type `U' and be
+prompted for groups to subscribe to.)
+
+
+From lars Thu Feb 23 23:20:38 1995
+From: larsi@ifi.uio.no (ding)
+Date: Fri Feb 24 13:40:45 1995
+Subject: I want to read my mail!
+Message-ID: <lars-doc4@eyesore.no>
+
+Yes, Virginia, you can read mail with Gnus.
+
+First you have to decide which mail backend you want to use. You have
+nnml, which is a one-file-one-mail backend, which is quite nice, but
+apt to make your systems administrator go crazy and come after you
+with a shotgun.
+
+nnmbox uses a Unix mail box to store mail. Nice, but slow.
+
+nnmh uses mh-e folders, which is also a one-file-one-mail thingie, but
+slower than nnml. (It doesn't support NOV files.)
+
+So if you want to go with nnmbox, you can simply say:
+
+(setq gnus-secondary-select-methods '((nnmbox "")))
+
+(The same for the other methods, kind of.)
+
+You should also set `nnmail-split-methods' to something sensible:
+
+(setq nnmail-split-methods
+ '(("mail.junk" "From:.*Lars")
+ ("mail.misc "")))
+
+This will put all mail from me in you junk mail group, and the rest in
+"mail.misc".
+
+These groups will be subscribe the same way as the normal groups, so
+you will probably find them among the zombie groups after you set
+these variables and re-start Gnus.
+
+
+From lars Thu Feb 23 23:20:38 1995
+From: larsi@ifi.uio.no (ding)
+Date: Fri Feb 24 13:40:45 1995
+Subject: Foreign newsgroups
+Message-ID: <lars-doc5@eyesore.no>
+
+These are groups that do not come from `gnus-select-method'.
+
+Say you want to read "alt.furniture.couches" from "news.funet.fi". You
+can then either type `B news.funet.fi <RET>' to browse that server and
+subscribe to that group, or you can type
+`G m alt.furniture.couches<RET>nntp<RET>news.funet.fi<RET>', if you
+like to type a lot.
+
+If you want to read a directory as a newsgroup, you can create an
+nndir group, much the same way. There's a shorthand for that,
+though. If, for instance, you want to read the (ding) list archives,
+you could type `G d /ftp <RET>'.
+
+There's lots more to know about foreign groups, but you have to read
+the info pages to find out more.
+
+
+From lars Thu Feb 23 23:20:38 1995
+From: larsi@ifi.uio.no (ding)
+Date: Fri Feb 24 13:40:45 1995
+Subject: Low level changes in GNUS, or, Wrong type argument: stringp, nil
+Message-ID: <lars-doc6@eyesore.no>
+
+Gnus really isn't GNUS, even though it looks like it. If you scrape
+the surface, you'll find that most things have changed.
+
+This means that old code that relies on GNUS internals will fail.
+
+In particular, `gnus-newsrc-hashtb', `gnus-newsrc-assoc',
+`gnus-killed-list', the `nntp-header-' macros and the display formats
+have all changed. If you have some code lying around that depend on
+these, or change these, you'll have to re-write your code.
+
+Old hilit19 code does not work at all. In fact, you should probably
+remove all hilit code from all the Gnus hooks
+(`gnus-group-prepare-hook', `gnus-summary-prepare-hook' and
+`gnus-summary-article-hook'). (Well, at the very least the first
+two.) Gnus provides various integrated functions for highlighting,
+which are both faster and more accurated.
+
+There is absolutely no chance, whatsoever, of getting Gnus to work
+with Emacs 18. It won't even work on Emacsen older than Emacs
+19.30/XEmacs 19.13. Upgrade your Emacs or die.
+
+
+From lars Thu Feb 23 23:20:38 1995
+From: larsi@ifi.uio.no (ding)
+Date: Fri Feb 24 13:40:45 1995
+Subject: How do I re-scan my mail groups?
+Message-ID: <lars-doc8@eyesore.no>
+
+Reading the active file from the nntp server is a drag.
+
+Just press `M-g' on the mail groups, and they will be re-scanned.
+
+You can also re-scan all the mail groups by putting them on level 1
+(`S l 1'), and saying `1 g' to re-scan all level 1 groups.
+
+
+From lars Thu Feb 23 23:20:38 1995
+From: larsi@ifi.uio.no (ding)
+Date: Fri Feb 24 13:40:45 1995
+Subject: How do I set up virtual newsgroups?
+Message-ID: <lars-doc9@eyesore.no>
+
+Virtual newsgroups are collections of other newsgroups. Why people
+want this is beyond me, but here goes:
+
+Create the group by saying
+
+`M-a my.virtual.newsgroup<RET>nnvirtual<RET>^rec\.aquaria\.*<RET>'
+
+This will create the group "nnvirtual:my.virtual.newsgroup", which
+will collect all articles from all the groups in the "rec.aquaria"
+hierarchy.
+
+If you want to edit the regular expression, just type `M-e' on the
+group line.
+
+Note that all the groups that are part of the virtual group have to be
+alive. This means that the cannot, absolutely not, be zombie or
+killed. They can be unsubscribed; that's no problem.
+
+You can combine groups from different servers in the same virtual
+newsgroup, something that may actually be useful. Say you have the
+group "comp.headers" on the server "news.server.no" and the same group
+on "news.server.edu". If people have posted articles with Distribution
+headers that stop propagation of their articles, combining these two
+newsgroups into one virtual newsgroup should give you a better view of
+what's going on.
+
+One caveat, though: The virtual group article numbers from the first
+source group (group A) will always be lower than the article numbers
+from the second (group B). This means that Gnus will believe that
+articles from group A are older than articles from group B. Threading
+will lessen these problems, but it might be a good idea to sort the
+threads over the date of the articles to get a correct feel for the
+flow of the groups:
+
+(setq gnus-thread-sort-functions '(gnus-thread-sort-by-date))
+
+If you only want this in virtual groups, you could say something along
+the lines of:
+
+(setq gnus-select-group-hook
+ (lambda ()
+ (if (eq 'nnvirtual (car (gnus-find-method-for-group
+ gnus-newsgroup-name)))
+ (progn
+ (make-local-variable 'gnus-thread-sort-functions)
+ (setq gnus-thread-sort-functions '(gnus-thread-sort-by-date))))))
+
+
+From lars Thu Feb 23 23:20:38 1995
+From: larsi@ifi.uio.no (ding)
+Date: Fri Feb 24 13:40:45 1995
+Subject: Bugs & stuff
+Message-ID: <lars-doc7@eyesore.no>
+
+If you want to report a bug, please type `M-x gnus-bug'. This will
+give me a precise overview of your Gnus and Emacs version numbers,
+along with a look at all Gnus variables you have changed.
+
+Du not expect a reply back, but your bug should be fixed in the next
+version. If the bug persists, please re-submit your bug report.
+
+When a bug occurs, I need a recipe for how to trigger the bug. You
+have to tell me exactly what you do to uncover the bug, and you should
+(setq debug-on-error t) and send me the backtrace along with the bug
+report.
+
+If I am not able to reproduce the bug, I won't be able to fix it.
+
+I would, of course, prefer that you locate the bug, fix it, and mail
+me the patches, but one can't have everything.
+
+If you have any questions on usage, the "ding@ifi.uio.no" mailing list
+is where to post the questions.
+
+
View
193 gnus-mdrtn.el
@@ -0,0 +1,193 @@
+;;; gnus-mdrtn.el --- a group moderation package for Gnus
+;; Copyright (C) 1996 Lars Magne Ingebrigtsen
+
+;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+;; Keywords: news, moderation
+
+;; This file is not 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 2, 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, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; This package is designed for enabling moderators to do various
+;; spiffy things while moderating groups. Some of these things are
+;; rather evil if done by non-moderators -- canceling other people's
+;; articles, including Approved headers and so on. So while this file
+;; is GPL'd and there therefore is no distribution restriction --
+;; please do not put this file at any public sites. All people who
+;; want a copy can get one, but let's try to keep this potentially
+;; dangerous package out of the hands of Evil People, ok? Pretty
+;; please?
+
+;; The moderation package is implemented as a minor mode for
+;; summary buffers. Put
+;;
+;; (add-hook 'gnus-summary-mode-hook 'gnus-moderate)
+;;
+;; in your .gnus.el file.
+
+;; If you are the moderation of rec.zoofle, this is how it's supposed
+;; to work:
+;;
+;; 1) You split your incoming mail by matching on
+;; "Newsgroups:.*rec.zoofle", which will put all the to-be-posted
+;; articles in some mail group -- "nnml:rec.zoofle", for instance.
+;;
+;; 2) You enter that group once in a while and post articles
+;; using the `e' (edit-and-post) or `s' (just send unedited)
+;; commands.
+;;
+;; 3) If, while reading the rec.zoofle group, you happen upon
+;; some articles that weren't approved by you, you can cancel
+;; them with the `c' command.
+;;
+;; To use moderation mode in these two groups, say
+;;
+;; (setq gnus-moderated-groups "nnml:rec.zoofle\\|rec.zoofle")
+
+;;; Code:
+
+(require 'gnus-load)
+
+(defvar gnus-moderated-groups nil
+ "Regexp that match groups you moderate.")
+
+(defvar gnus-moderation-ignored-headers "^\\(Received\\|To\\|Cc\\|X-From-Line\\|Return-Path\\|Xref\\):"
+ "Headers to be removed before posting an approved article.")
+
+(defvar gnus-moderation-mode nil
+ "Minor mode for providing a moderation interface in Gnus summary buffers.")
+
+(defvar gnus-moderation-mode-hook nil
+ "Hook run in summary moderation mode buffers.")
+
+;;; Internal variables.
+
+(defvar gnus-moderation-mode-map nil)
+
+(unless gnus-moderation-mode-map
+ (setq gnus-moderation-mode-map (make-sparse-keymap))
+ (gnus-define-keys gnus-moderation-mode-map
+ "c" gnus-moderation-cancel-article
+ "s" gnus-moderation-send-article
+ "e" gnus-moderation-edit-article))
+
+(defun gnus-moderation-make-menu-bar ()
+ (unless (boundp 'gnus-moderation-menu)
+ (easy-menu-define
+ gnus-moderation-menu gnus-moderation-mode-map ""
+ '("Moderation"
+ ("Moderation"
+ "Cancel" gnus-moderation-cancel-article
+ "Send" gnus-moderation-send-article
+ "Edit" gnus-moderation-edit-article)))))
+
+(defun gnus-moderation-mode (&optional arg)
+ "Minor mode for providing a moderation interface in Gnus summary buffers.
+
+\\{gnus-moderation-mode-map}"
+ (interactive "P")
+ (when (eq major-mode 'gnus-summary-mode)
+ (set (make-local-variable 'gnus-moderation-mode)
+ (if (null arg) (not gnus-moderation-mode)
+ (> (prefix-numeric-value arg) 0)))
+ (when gnus-moderation-mode
+ ;; Set up the menu.
+ (when (and menu-bar-mode
+ (gnus-visual-p 'moderation-menu 'menu))
+ (gnus-moderation-make-menu-bar))
+ (unless (assq 'gnus-moderation-mode minor-mode-alist)
+ (push '(gnus-moderation-mode " Moderation") minor-mode-alist))
+ (unless (assq 'gnus-moderation-mode minor-mode-map-alist)
+ (push (cons 'gnus-moderation-mode gnus-moderation-mode-map)
+ minor-mode-map-alist))
+ (run-hooks 'gnus-moderation-mode-hook))))
+
+(defun gnus-moderate ()
+ "Turn on moderation mode in some buffers."
+ (when (and gnus-moderated-groups
+ (string-match gnus-moderated-groups gnus-newsgroup-name))
+ (gnus-moderation-mode 1)))
+
+;;; Commands
+
+(defun gnus-moderation-cancel-article (n)
+ "Cancel the current article, even if it isn't yours."
+ (interactive "P")
+ (gnus-set-global-variables)
+ (let ((articles (gnus-summary-work-articles n))
+ (message-post-method
+ `(lambda (arg)
+ (gnus-post-method nil ,gnus-newsgroup-name)))
+ article)
+ (while (setq article (pop articles))
+ (when (gnus-summary-select-article t nil nil article)
+ (when (gnus-eval-in-buffer-window gnus-original-article-buffer
+ (let ((user-mail-address
+ (nth 1 (mail-extract-address-components
+ (mail-fetch-field "from"))))
+ (message-cancel-message
+ (format
+ "Moderator %s canceling a message in a group I moderate.\n"
+ (message-make-from))))
+ (message-cancel-news)))
+ (gnus-summary-mark-as-read article gnus-canceled-mark)
+ (gnus-cache-remove-article 1))
+ (gnus-article-hide-headers-if-wanted))
+ (gnus-summary-remove-process-mark article))))
+
+(defun gnus-moderation-edit-article ()
+ "Edit an article before sending it."
+ (interactive)
+ (save-excursion
+ (set-buffer gnus-summary-buffer)
+ (gnus-set-global-variables)
+ ;; Select article if needed.
+ (gnus-summary-show-article t)
+ (gnus-article-edit-article
+ `(lambda ()
+ (gnus-moderation-send-buffer)))))
+
+(defun gnus-moderation-send-article ()
+ "Post the current article after inserting an Approved header."
+ (interactive)
+ (gnus-summary-select-article)
+ (gnus-eval-in-buffer-window gnus-original-article-buffer
+ (gnus-moderation-send-buffer)))
+
+(defun gnus-moderation-send-buffer ()
+ "Send the current buffer as a message after inserting an Approved header."
+ (let ((buf (current-buffer)))
+ (nnheader-temp-write nil
+ (insert-buffer-substring buf)
+ (message-narrow-to-head)
+ (message-remove-header gnus-moderation-ignored-headers t)
+ (goto-char (point-max))
+ (widen)
+ (insert "Approved: " (message-make-from) "\n")
+ (let ((method (if (message-functionp message-post-method)
+ (funcall message-post-method)
+ message-post-method)))
+ (require (car method))
+ (funcall (intern (format "%s-open-server" (car method)))
+ (cadr method) (cddr method))
+ (unless (funcall (intern (format "%s-request-post" (car method))))
+ (error "Couldn't post: %s" (nnheader-get-report 'nntp)))))))
+
+(provide 'gnus-mdrtn)
+
+;;; gnus-mdrtn ends here
View
57 lisp/ChangeLog
@@ -1,3 +1,60 @@
+Thu Mar 6 08:41:16 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Gnus v5.4.19 is released.
+
+Thu Mar 6 08:00:31 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * message.el (message-newgroups-header-regexp): Include Gcc
+ header.
+
+ * gnus-sum.el (gnus-summary-delete-article): Message errors.
+
+ * gnus-group.el (gnus-group-unsubscribe-group): Work on ranked
+ groups.
+
+Thu Mar 6 07:46:56 1997 Katsumi Yamaoka <yamaoka@ga.sony.co.jp>
+
+ * nnmail.el (nnmail-move-inbox): Protect against nil results.
+
+Thu Mar 6 04:23:11 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * message.el (message-kill-buffer): Ask before killing.
+
+ * nnfolder.el (nnfolder-possibly-activate-groups): Removed.
+ (nnfolder-request-group): Changed servers too late.
+ (nnfolder-active-timestamp): New variable.
+
+ * gnus-sum.el (gnus-summary-respool-query): Narrow to head instead
+ of body.
+
+ * nntp.el (nntp-accept-process-output): Inhibit logging.
+
+ * gnus-group.el (gnus-group-sort-groups): Doc fix.
+
+ * nnfolder.el (nnfolder-request-accept-article): Insert Message-ID
+ into cache.
+ * nnmh.el (nnmh-request-accept-article): Ditto.
+ * nnml.el (nnml-request-accept-article): Ditto.
+ * nnbabyl.el (nnbabyl-request-accept-article): Ditto.
+ * nnmbox.el (nnmbox-request-accept-article): Ditto.
+
+ * nnmail.el (nnmail-cache-close): Kill buffer.
+ (nnmail-cache-insert): Make sure the cache is open.
+ (nnmail-fetch-field): New function.
+
+Thu Mar 6 02:19:31 1997 James LewisMoss <dres@scsn.net>
+
+ * smiley.el (smiley-deformed-regexp-alist): Fix FaceIronic.
+
+Wed Mar 5 09:15:04 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * nnmail.el (nnmail-check-duplication): Ditto.
+
+Wed Mar 5 09:14:12 1997 Carsten Leonhardt <leo@arioch.oche.de>
+
+ * nnmail.el (nnmail-check-duplication): Use a different
+ Message-ID.
+
Sun Mar 2 16:58:16 1997 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
* gnus.el: Gnus v5.4.18 is released.
View
17 lisp/cus-edit.el
@@ -4,7 +4,7 @@
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, faces
-;; Version: 1.48
+;; Version: 1.55
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
@@ -13,7 +13,7 @@
;;; Code:
-(require 'custom)
+(require 'cus-face)
(require 'wid-edit)
(require 'easymenu)
@@ -300,7 +300,8 @@ IF REGEXP is not a string, return it unchanged."
(unless custom-mode-map
(setq custom-mode-map (make-sparse-keymap))
- (set-keymap-parent custom-mode-map widget-keymap))
+ (set-keymap-parent custom-mode-map widget-keymap)
+ (define-key custom-mode-map "q" 'bury-buffer))
(easy-menu-define custom-mode-menu
custom-mode-map
@@ -1278,7 +1279,7 @@ Optional EVENT is the location for the menu."
:sample-face 'custom-face-tag-face
:help-echo "Push me to set or reset this face."
:documentation-property '(lambda (face)
- (get-face-documentation face))
+ (face-doc-string face))
:value-create 'custom-face-value-create
:action 'custom-face-action
:custom-set 'custom-face-set
@@ -1367,6 +1368,8 @@ Optional EVENT is the location for the menu."
(child (car (widget-get widget :children)))
(value (widget-value child)))
(put symbol 'customized-face value)
+ (when (fboundp 'copy-face)
+ (copy-face 'custom-face-empty symbol))
(custom-face-display-set symbol value)
(custom-face-state-set widget)
(custom-redraw-magic widget)))
@@ -1376,6 +1379,8 @@ Optional EVENT is the location for the menu."
(let* ((symbol (widget-value widget))
(child (car (widget-get widget :children)))
(value (widget-value child)))
+ (when (fboundp 'copy-face)
+ (copy-face 'custom-face-empty symbol))
(custom-face-display-set symbol value)
(put symbol 'saved-face value)
(put symbol 'customized-face nil)
@@ -1390,6 +1395,8 @@ Optional EVENT is the location for the menu."
(unless value
(error "No saved value for this face"))
(put symbol 'customized-face nil)
+ (when (fboundp 'copy-face)
+ (copy-face 'custom-face-empty symbol))
(custom-face-display-set symbol value)
(widget-value-set child value)
(custom-face-state-set widget)
@@ -1406,6 +1413,8 @@ Optional EVENT is the location for the menu."
(when (get symbol 'saved-face)
(put symbol 'saved-face nil)
(custom-save-all))
+ (when (fboundp 'copy-face)
+ (copy-face 'custom-face-empty symbol))
(custom-face-display-set symbol value)
(widget-value-set child value)
(custom-face-state-set widget)
View
210 lisp/cus-face.el
@@ -4,7 +4,7 @@
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, faces
-;; Version: 1.48
+;; Version: 1.55
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
@@ -24,6 +24,18 @@
(or (cdr (assq property (frame-parameters frame)))
default)))
+(unless (fboundp 'face-doc-string)
+ ;; XEmacs function missing in Emacs.
+ (defun face-doc-string (face)
+ "Get the documentation string for FACE."
+ (get face 'face-doc-string)))
+
+(unless (fboundp 'set-face-doc-string)
+ ;; XEmacs function missing in Emacs.
+ (defun set-face-doc-string (face string)
+ "Set the documentation string for FACE to STRING."
+ (put face 'face-doc-string string)))
+
(unless (fboundp 'x-color-values)
;; Emacs function missing in XEmacs 19.14.
(defun x-color-values (color &optional frame)
@@ -45,42 +57,105 @@ If FRAME is omitted or nil, use the selected frame."
(t
(defalias 'custom-facep 'facep)))
-;; Overwrite Emacs definition.
+(unless (fboundp 'make-empty-face)
+ ;; This should be moved to `faces.el'.
+ (if (string-match "XEmacs" emacs-version)
+ ;; Give up for old XEmacs pre 19.15/20.1.
+ (defalias 'make-empty-face 'make-face)
+ ;; Define for Emacs pre 19.35.
+ (defun make-empty-face (name)
+ "Define a new FACE on all frames, ignoring X resources."
+ (interactive "SMake face: ")
+ (or (internal-find-face name)
+ (let ((face (make-vector 8 nil)))
+ (aset face 0 'face)
+ (aset face 1 name)
+ (let* ((frames (frame-list))
+ (inhibit-quit t)
+ (id (internal-next-face-id)))
+ (make-face-internal id)
+ (aset face 2 id)
+ (while frames
+ (set-frame-face-alist (car frames)
+ (cons (cons name (copy-sequence face))
+ (frame-face-alist (car frames))))
+ (setq frames (cdr frames)))
+ (setq global-face-data (cons (cons name face) global-face-data)))
+ ;; add to menu
+ (if (fboundp 'facemenu-add-new-face)
+ (facemenu-add-new-face name))
+ face))
+ name)))
+
+(defcustom initialize-face-resources t
+ "If non nil, allow X resources to initialize face properties.
+This only affects faces declared with `defface', and only NT or X11 frames."
+ :group 'customize
+ :type 'boolean)
+
+(cond ((fboundp 'initialize-face-resources)
+ ;; Already bound, do nothing.
+ )
+ ((fboundp 'make-face-x-resource-internal)
+ ;; Emacs or new XEmacs.
+ (defun initialize-face-resources (face &optional frame)
+ "Initialize face according to the X11 resources.
+This might overwrite existing face properties.
+Does nothing when the variable initialize-face-resources is nil."
+ (when initialize-face-resources
+ (make-face-x-resource-internal face frame t))))
+ (t
+ ;; Too hard to do right on XEmacs.
+ (defalias 'initialize-face-resources 'ignore)))
+
+(unless (fboundp 'reverse-face)
+ ;; This should be moved to `faces.el'.
+ (if (string-match "XEmacs" emacs-version)
+ ;; Xemacs.
+ (defun reverse-face (face &optional frame)
+ "Swap the foreground and background colors of face FACE.
+If the colors are not specified in the face, use the default colors."
+ (interactive (list (read-face-name "Reverse face: ")))
+ (let ((fg (color-name (face-foreground face frame) frame))
+ (bg (color-name (face-background face frame) frame)))
+ (set-face-foreground face bg frame)
+ (set-face-background face fg frame)))
+ ;; Emacs.
+ (defun reverse-face (face &optional frame)
+ "Swap the foreground and background colors of face FACE.
+If the colors are not specified in the face, use the default colors."
+ (interactive (list (read-face-name "Reverse face: ")))
+ (let ((fg (or (face-foreground face frame)
+ (face-foreground 'default frame)
+ (frame-property (or frame (selected-frame))
+ 'foreground-color)
+ "black"))
+ (bg (or (face-background face frame)
+ (face-background 'default frame)
+ (frame-property (or frame (selected-frame))
+ 'background-color)
+ "white")))
+ (set-face-foreground face bg frame)
+ (set-face-background face fg frame)))))
+
(if (string-match "XEmacs" emacs-version)
- (progn
- (defun custom-extract-frame-properties (frame)
- "Return a plist with the frame properties of FRAME used by custom."
- (list 'type (device-type (frame-device frame))
- 'class (device-class (frame-device frame))
- 'background (or custom-background-mode
- (frame-property frame
- 'background-mode)
- (custom-background-mode frame))))
-
- (defun get-face-documentation (face)
- "Get the documentation string for FACE."
- (face-property face 'doc-string))
-
- (defun set-face-documentation (face string)
- "Set the documentation string for FACE to STRING."
- (set-face-property face 'doc-string string)))
-
+ ;; XEmacs.
+ (defun custom-extract-frame-properties (frame)
+ "Return a plist with the frame properties of FRAME used by custom."
+ (list 'type (device-type (frame-device frame))
+ 'class (device-class (frame-device frame))
+ 'background (or custom-background-mode
+ (frame-property frame
+ 'background-mode)
+ (custom-background-mode frame))))
+ ;; Emacs.
(defun custom-extract-frame-properties (frame)
"Return a plist with the frame properties of FRAME used by custom."
(list 'type window-system
'class (frame-property frame 'display-type)
'background (or custom-background-mode
- (frame-property frame
- 'background-mode)
- (custom-background-mode frame))))
-
- (defun get-face-documentation (face)
- "Get the documentation string for FACE."
- (get face 'face-documentation))
-
- (defun set-face-documentation (face string)
- "Set the documentation string for FACE to STRING."
- (put face 'face-documentation string)))
+ (frame-property frame 'background-mode)
+ (custom-background-mode frame)))))
;;; Declaring a face.
@@ -100,14 +175,16 @@ If FRAME is omitted or nil, use the selected frame."
(frames (custom-relevant-frames))
frame)
;; Create global face.
+ (make-empty-face face)
(custom-face-display-set face value)
;; Create frame local faces
(while frames
(setq frame (car frames)
frames (cdr frames))
- (custom-face-display-set face value frame)))))
- (when (and doc (null (get-face-documentation face)))
- (set-face-documentation face doc))
+ (custom-face-display-set face value frame))
+ (initialize-face-resources face))))
+ (when (and doc (null (face-doc-string face)))
+ (set-face-doc-string face doc))
(custom-handle-all-keywords face args 'custom-face)
(run-hooks 'custom-define-hook))
face)
@@ -135,6 +212,10 @@ If FRAME is nil, set the default face."
(toggle :format "Underline: %[%v%]\n") set-face-underline-p)
(:foreground (color :tag "Foreground") set-face-foreground)
(:background (color :tag "Background") set-face-background)
+ (:reverse (const :format "Reverse Video\n" t)
+ (lambda (face value &optional frame)
+ ;; We don't use VALUE.
+ (reverse-face face frame)))
(:stipple (editable-field :format "Stipple: %v") set-face-stipple))
"Alist of face attributes.
@@ -184,22 +265,15 @@ be changed.")
'((:family (editable-field :format "Family: %v")
custom-set-face-font-family)
(:size (editable-field :format "Size: %v")
- custom-set-face-font-size)))
-
- ;; Disable frame local faces.
- (setq custom-relevant-frames nil)
- (remove-hook 'after-make-frame-hook 'custom-initialize-frame))
+ custom-set-face-font-size))))
;;; Frames.
-(and (fboundp 'make-face)
- (make-face 'custom-face-empty))
-
(defun custom-face-display-set (face spec &optional frame)
"Set FACE to the attributes to the first matching entry in SPEC.
Iff optional FRAME is non-nil, set it for that frame only.
See `defface' for information about SPEC."
- (when (fboundp 'copy-face)
+ (when (fboundp 'make-face)
(while spec
(let* ((entry (car spec))
(display (nth 0 entry))
@@ -208,7 +282,6 @@ See `defface' for information about SPEC."
(when (custom-display-match-frame display frame)
;; Avoid creating frame local duplicates of the global face.
(unless (and frame (eq display (get face 'custom-face-display)))
- (copy-face 'custom-face-empty face frame)
(apply 'custom-face-attribites-set face frame atts))
(unless frame
(put face 'custom-face-display display))
@@ -241,6 +314,8 @@ examine the brightness for you."
(specifier-instance
(face-background 'default))))
(error nil)))
+ (or (string-match "XEmacs" emacs-version)
+ window-system)
(< (apply '+ (x-color-values color))
(/ (apply '+ (x-color-values "white"))
3)))
@@ -302,31 +377,29 @@ If FRAME is nil, the current FRAME is used."
req options)))))
match)))
-(defvar custom-relevant-frames t
- "List of frames whose custom properties differ from the default.")
-
(defun custom-relevant-frames ()
"List of frames whose custom properties differ from the default."
- (when (eq custom-relevant-frames t)
- (setq custom-relevant-frames nil)
- (let ((default (custom-get-frame-properties))
- (frames (frame-list))
- frame)
- (while frames
- (setq frame (car frames)
- frames (cdr frames))
- (unless (equal default (custom-get-frame-properties frame))
- (push frame custom-relevant-frames)))))
- custom-relevant-frames)
+ (let ((relevant nil)
+ (default (custom-get-frame-properties))
+ (frames (frame-list))
+ frame)
+ (while frames
+ (setq frame (car frames)
+ frames (cdr frames))
+ (unless (equal default (custom-get-frame-properties frame))
+ (push frame relevant)))
+ relevant))
(defun custom-initialize-faces (&optional frame)
"Initialize all custom faces for FRAME.
If FRAME is nil or omitted, initialize them for all frames."
- (mapatoms (lambda (symbol)
- (let ((spec (or (get symbol 'saved-face)
- (get symbol 'factory-face))))
- (when spec
- (custom-face-display-set symbol spec frame))))))
+ (mapcar (lambda (symbol)
+ (let ((spec (or (get symbol 'saved-face)
+ (get symbol 'factory-face))))
+ (when spec
+ (custom-face-display-set symbol spec frame)
+ (initialize-face-resources symbol frame))))
+ (face-list)))
(defun custom-initialize-frame (&optional frame)
"Initialize local faces for FRAME if necessary.
@@ -335,14 +408,17 @@ If FRAME is missing or nil, the first member (frame-list) is used."
(setq frame (car (frame-list))))
(unless (equal (custom-get-frame-properties)
(custom-get-frame-properties frame))
- (custom-initialize-faces frame)
- (push frame custom-relevant-frames)))
+ (custom-initialize-faces frame)))
;; Enable. This should go away when bundled with Emacs.
-(add-hook 'after-make-frame-hook 'custom-initialize-frame)
+(unless (string-match "XEmacs" emacs-version)
+ (add-hook 'after-make-frame-hook 'custom-initialize-frame))
;;; Initializing.
+(and (fboundp 'make-face)
+ (make-face 'custom-face-empty))
+
;;;###autoload
(defun custom-set-faces (&rest args)
"Initialize faces according to user preferences.
@@ -363,6 +439,8 @@ See `defface' for the format of SPEC."
(put face 'saved-face spec)
(when now
(put face 'force-face t)
+ (when (fboundp 'copy-face)
+ (copy-face 'custom-face-empty face))
(custom-face-display-set face spec))
(setq args (cdr args)))
;; Old format, a plist of FACE SPEC pairs.
View
2  lisp/custom.el
@@ -4,7 +4,7 @@
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, faces
-;; Version: 1.48
+;; Version: 1.55
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
View
6 lisp/gnus-group.el
@@ -2168,7 +2168,9 @@ score file entries for articles to include in the group."
(defun gnus-group-sort-groups (func &optional reverse)
"Sort the group buffer according to FUNC.
-If REVERSE, reverse the sorting order."
+When used interactively, the sorting function used will be
+determined by the `gnus-group-sort-function' variable.
+If REVERSE (the prefix), reverse the sorting order."
(interactive (list gnus-group-sort-function current-prefix-arg))
(funcall gnus-group-sort-alist-function
(gnus-make-sort-function func) reverse)
@@ -2579,7 +2581,7 @@ group line."
(newsrc
;; Toggle subscription flag.
(gnus-group-change-level
- newsrc (if level level (if (<= (nth 1 (nth 2 newsrc))
+ newsrc (if level level (if (<= (gnus-info-level (nth 2 newsrc))
gnus-level-subscribed)
(1+ gnus-level-subscribed)
gnus-level-default-subscribed)))
View
8 lisp/gnus-sum.el
@@ -6889,7 +6889,9 @@ delete these instead."
;; after all.
(unless (memq (car articles) not-deleted)
(gnus-summary-mark-article (car articles) gnus-canceled-mark))
- (setq articles (cdr articles))))
+ (setq articles (cdr articles)))
+ (when not-deleted
+ (gnus-message 4 "Couldn't delete articles %s" not-deleted)))
(gnus-summary-position-point)
(gnus-set-mode-line 'summary)
not-deleted))
@@ -6991,9 +6993,9 @@ groups."
(let (gnus-mark-article-hook)
(gnus-summary-select-article)
(save-excursion
- (set-buffer gnus-article-buffer)
+ (set-buffer gnus-original-article-buffer)
(save-restriction
- (gnus-narrow-to-body)
+ (message-narrow-to-head)
(message "This message would go to %s"
(mapconcat 'car (nnmail-article-group 'identity) ", "))))))
View
2  lisp/gnus.el
@@ -225,7 +225,7 @@ is restarted, and sometimes reloaded."
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
-(defconst gnus-version-number "5.4.18"
+(defconst gnus-version-number "5.4.19"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Gnus v%s" gnus-version-number)
View
9 lisp/message.el
@@ -1515,9 +1515,10 @@ The text will also be indented the normal way."
(defun message-kill-buffer ()
"Kill the current buffer."
(interactive)
- (let ((actions message-kill-actions))
- (kill-buffer (current-buffer))
- (message-do-actions actions)))
+ (when (yes-or-no-p "Kill the buffer? ")
+ (let ((actions message-kill-actions))
+ (kill-buffer (current-buffer))
+ (message-do-actions actions))))
(defun message-bury (buffer)
"Bury this mail buffer."
@@ -3343,7 +3344,7 @@ which specify the range to operate on."
;;; Group name completion.
(defvar message-newgroups-header-regexp
- "^\\(Newsgroups\\|Followup-To\\|Posted-To\\):"
+ "^\\(Newsgroups\\|Followup-To\\|Posted-To\\|Gcc\\):"
"Regexp that match headers that lists groups.")
(defun message-tab ()
View
2  lisp/nnbabyl.el
@@ -333,6 +333,7 @@
(save-excursion
(while (re-search-backward "^X-Gnus-Newsgroup: " beg t)
(delete-region (point) (progn (forward-line 1) (point)))))
+ (nnmail-cache-insert (nnmail-fetch-field "message-id"))
(setq result (car (nnbabyl-save-mail
(if (stringp group)
(list (cons group (nnbabyl-active-number group)))
@@ -343,6 +344,7 @@
(goto-char (match-end 0))
(insert-buffer-substring buf)
(when last
+ (nnmail-cache-insert (nnmail-fetch-field "message-id"))
(save-buffer)
(nnmail-save-active nnbabyl-group-alist nnbabyl-active-file))
result))))
View
217 lisp/nnfolder.el
@@ -89,6 +89,7 @@ time saver for large mailboxes.")
(defvoo nnfolder-group-alist nil)
(defvoo nnfolder-buffer-alist nil)
(defvoo nnfolder-scantime-alist nil)
+(defvoo nnfolder-active-timestamp nil)
@@ -134,8 +135,8 @@ time saver for large mailboxes.")
(deffoo nnfolder-open-server (server &optional defs)
(nnoo-change-server 'nnfolder server defs)
- (when (not (file-exists-p nnfolder-directory))
- (gnus-make-directory nnfolder-directory))
+ (nnmail-activate 'nnfolder t)
+ (gnus-make-directory nnfolder-directory)
(cond
((not (file-exists-p nnfolder-directory))
(nnfolder-close-server)
@@ -145,6 +146,7 @@ time saver for large mailboxes.")
(nnfolder-close-server)
(nnheader-report 'nnfolder "Not a directory: %s" nnfolder-directory))
(t
+ (nnmail-activate 'nnfolder)
(nnheader-report 'nnfolder "Opened server %s using directory %s"
server nnfolder-directory)
t)))
@@ -191,11 +193,11 @@ time saver for large mailboxes.")
(point) (progn (end-of-line) (point)))))))))))
(deffoo nnfolder-request-group (group &optional server dont-check)
+ (nnfolder-possibly-change-group group server)
(save-excursion
(nnmail-activate 'nnfolder)
(if (not (assoc group nnfolder-group-alist))
(nnheader-report 'nnfolder "No such group: %s" group)
- (nnfolder-possibly-change-group group server)
(if dont-check
(progn
(nnheader-report 'nnfolder "Selected group %s" group)
@@ -380,14 +382,17 @@ time saver for large mailboxes.")
(forward-line -1)
(while (re-search-backward (concat "^" nnfolder-article-marker) nil t)
(delete-region (point) (progn (forward-line 1) (point))))
+ (nnmail-cache-insert (nnmail-fetch-field "message-id"))
(setq result
(car (nnfolder-save-mail
(if (stringp group)
(list (cons group (nnfolder-active-number group)))
(nnmail-article-group 'nnfolder-active-number))))))
- (save-excursion
- (set-buffer nnfolder-current-buffer)
- (and last (nnfolder-save-buffer))))
+ (when last
+ (save-excursion
+ (nnfolder-possibly-change-folder group)
+ (nnfolder-save-buffer)
+ (nnmail-cache-close))))
(nnmail-save-active nnfolder-group-alist nnfolder-active-file)
(unless result
(nnheader-report 'nnfolder "Couldn't store article"))
@@ -467,65 +472,51 @@ time saver for large mailboxes.")
(point))
(point-max))))))
-;; When scanning, we're not looking t immediately switch into the group - if
-;; we know our information is up to date, don't even bother reading the file.
(defun nnfolder-possibly-change-group (group &optional server scanning)
+ ;; Change servers.
(when (and server
(not (nnfolder-server-opened server)))
(nnfolder-open-server server))
- (when (and group (or nnfolder-current-buffer
- (not (equal group nnfolder-current-group))))
- (gnus-make-directory (directory-file-name nnfolder-directory))
- (nnfolder-possibly-activate-groups nil)
- (or (assoc group nnfolder-group-alist)
- (not (file-exists-p
- (nnfolder-group-pathname group)))
- (progn
- (push (list group (cons 1 0)) nnfolder-group-alist)
- (nnmail-save-active nnfolder-group-alist nnfolder-active-file)))
+ ;; Change group.
+ (when (and group
+ (not (equal group nnfolder-current-group)))
+ (nnmail-activate 'nnfolder)
+ (when (and (not (assoc group nnfolder-group-alist))
+ (not (file-exists-p
+ (nnfolder-group-pathname group))))
+ ;; The group doesn't exist, so we create a new entry for it.
+ (push (list group (cons 1 0)) nnfolder-group-alist)
+ (nnmail-save-active nnfolder-group-alist nnfolder-active-file))
+
(let (inf file)
- (if (and (equal group nnfolder-current-group)
- nnfolder-current-buffer
- (buffer-name nnfolder-current-buffer))
- ()
- (setq nnfolder-current-group group)
-
- ;; If we have to change groups, see if we don't already have the mbox
- ;; in memory. If we do, verify the modtime and destroy the mbox if
- ;; needed so we can rescan it.
- (when (setq inf (assoc group nnfolder-buffer-alist))
- (setq nnfolder-current-buffer (nth 1 inf)))
-
- ;; If the buffer is not live, make sure it isn't in the alist. If it
- ;; is live, verify that nobody else has touched the file since last
- ;; time.
- (when (or (not (and nnfolder-current-buffer
- (buffer-name nnfolder-current-buffer)))
- (not (and (bufferp nnfolder-current-buffer)
- (verify-visited-file-modtime
- nnfolder-current-buffer))))
- (when (and nnfolder-current-buffer
- (buffer-name nnfolder-current-buffer)
- (bufferp nnfolder-current-buffer))
- (kill-buffer nnfolder-current-buffer))
- (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist))
- (setq inf nil))
-
- (unless inf
- (save-excursion
- (setq file (nnfolder-group-pathname group))
- (unless (file-directory-p (file-truename file))
- (unless (file-exists-p file)
- (gnus-make-directory (file-name-directory file))
- (nnmail-write-region 1 1 file t 'nomesg))
- (setq nnfolder-current-group group)
- (setq nnfolder-current-buffer
- (nnfolder-read-folder file scanning))
- (when nnfolder-current-buffer
- (set-buffer nnfolder-current-buffer)
- (push (list group nnfolder-current-buffer)
- nnfolder-buffer-alist)))))))
- (setq nnfolder-current-group group)))
+ ;; If we have to change groups, see if we don't already have the
+ ;; folder in memory. If we do, verify the modtime and destroy
+ ;; the folder if needed so we can rescan it.
+ (when (setq inf (assoc group nnfolder-buffer-alist))
+ (setq nnfolder-current-buffer (nth 1 inf)))
+
+ ;; If the buffer is not live, make sure it isn't in the alist. If it
+ ;; is live, verify that nobody else has touched the file since last
+ ;; time.
+ (when (and nnfolder-current-buffer
+ (not (gnus-buffer-live-p nnfolder-current-buffer)))
+ (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist)
+ nnfolder-current-buffer nil))
+
+ (setq nnfolder-current-group group)
+
+ (when (or (not nnfolder-current-buffer)
+ (not (verify-visited-file-modtime nnfolder-current-buffer)))
+ (save-excursion
+ (setq file (nnfolder-group-pathname group))
+ ;; See whether we need to create the new file.
+ (unless (file-exists-p file)
+ (gnus-make-directory (file-name-directory file))
+ (nnmail-write-region 1 1 file t 'nomesg))
+ (when (setq nnfolder-current-buffer (nnfolder-read-folder group))
+ (set-buffer nnfolder-current-buffer)
+ (push (list group nnfolder-current-buffer)
+ nnfolder-buffer-alist)))))))
(defun nnfolder-save-mail (group-art-list)
"Called narrowed to an article."
@@ -550,35 +541,28 @@ time saver for large mailboxes.")
(run-hooks 'nnfolder-prepare-save-mail-hook)
;; Insert the mail into each of the destination groups.
- (while group-art-list
- (setq group-art (car group-art-list)
- group-art-list (cdr group-art-list))
-
- ;; Kill the previous newsgroup markers.
+ (while (setq group-art (pop group-art-list))
+ ;; Kill any previous newsgroup markers.
(goto-char (point-min))
(search-forward "\n\n" nil t)
(forward-line -1)
(while (search-backward (concat "\n" nnfolder-article-marker) nil t)
(delete-region (1+ (point)) (progn (forward-line 2) (point))))
- (nnfolder-possibly-change-group (car group-art))
;; Insert the new newsgroup marker.
(nnfolder-insert-newsgroup-line group-art)
- (unless nnfolder-current-buffer
- (nnfolder-close-group (car group-art))
- (nnfolder-request-create-group (car group-art))
- (nnfolder-possibly-change-group (car group-art)))
- (let ((beg (point-min))
- (end (point-max))
- (obuf (current-buffer)))
- (set-buffer nnfolder-current-buffer)
- (goto-char (point-max))
- (unless (eolp)
- (insert "\n"))
- (unless (bobp)
- (insert "\n"))
- (insert-buffer-substring obuf beg end)
- (set-buffer obuf)))
+
+ (save-excursion
+ (let ((beg (point-min))
+ (end (point-max))
+ (obuf (current-buffer)))
+ (nnfolder-possibly-change-folder (car group-art))
+ (goto-char (point-max))
+ (unless (eolp)
+ (insert "\n"))
+ (unless (bobp)
+ (insert "\n"))
+ (insert-buffer-substring obuf beg end))))
;; Did we save it anywhere?
save-list))
@@ -591,15 +575,6 @@ time saver for large mailboxes.")
(insert (format (concat nnfolder-article-marker "%d %s\n")
(cdr group-art) (current-time-string))))))
-(defun nnfolder-possibly-activate-groups (&optional group)
- (save-excursion
- ;; If we're looking for the activation of a specific group, find out
- ;; its real name and switch to it.
- (when group
- (nnfolder-possibly-change-group group))
- ;; If the group alist isn't active, activate it now.
- (nnmail-activate 'nnfolder)))
-
(defun nnfolder-active-number (group)
;; Find the next article number in GROUP.
(let ((active (cadr (assoc group nnfolder-group-alist))))
@@ -612,6 +587,17 @@ time saver for large mailboxes.")
nnfolder-group-alist))
(cdr active)))
+(defun nnfolder-possibly-change-folder (group)
+ (let ((inf (assoc group nnfolder-buffer-alist)))
+ (if (and inf
+ (gnus-buffer-live-p (cadr inf)))
+ (set-buffer (cadr inf))
+ (when inf
+ (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist)))
+ (when nnfolder-group-alist
+ (nnmail-save-active nnfolder-group-alist nnfolder-active-file))
+ (push (list group (nnfolder-read-folder group))
+ nnfolder-buffer-alist))))
;; This method has a problem if you've accidentally let the active list get
;; out of sync with the files. This could happen, say, if you've
@@ -628,36 +614,27 @@ time saver for large mailboxes.")
;; shouldn't cost us much extra time at all, but will be a lot less
;; vulnerable to glitches between the mbox and the active file.
-(defun nnfolder-read-folder (file &optional scanning)
- ;; This is an attempt at a serious shortcut - don't even read in the file
- ;; if we know we've seen it since the last time it was touched.
- (let ((scantime (cadr (assoc nnfolder-current-group
- nnfolder-scantime-alist)))
- (modtime (nth 5 (file-attributes file))))
- (if (and scanning scantime
- (eq (car scantime) (car modtime))
- (eq (cdr scantime) (cadr modtime)))
- nil
+(defun nnfolder-read-folder (group)
+ (let* ((file (nnfolder-group-pathname group))
+ (buffer (set-buffer (nnheader-find-file-noselect file))))
+ (if (equal (cadr (assoc group nnfolder-scantime-alist))
+ (nth 5 (file-attributes file)))
+ ;; This looks up-to-date, so we don't do any scanning.
+ buffer
+ ;; Parse the damn thing.
(save-excursion
- (nnfolder-possibly-activate-groups nil)
+ (nnmail-activate 'nnfolder)
;; Read in the file.
- (set-buffer (setq nnfolder-current-buffer
- (nnheader-find-file-noselect file)))
- (buffer-disable-undo (current-buffer))
- (setq buffer-read-only nil)
- ;; If the file hasn't been touched since the last time we scanned it,
- ;; don't bother doing anything with it.
(let ((delim (concat "^" message-unix-mail-delimiter))
(marker (concat "\n" nnfolder-article-marker))
(number "[0-9]+")
- (active (or (cadr (assoc nnfolder-current-group
- nnfolder-group-alist))
- (cons 1 0)))
- (scantime (assoc nnfolder-current-group nnfolder-scantime-alist))
+ (active (cadr (assoc group nnfolder-group-alist)))
+ (scantime (assoc group nnfolder-scantime-alist))
(minid (lsh -1 -1))
- maxid start end newscantime)
-
- (setq maxid (or (cdr active) 0))
+ maxid start end newscantime
+ buffer-read-only)
+ (buffer-disable-undo (current-buffer))
+ (setq maxid (cdr active))
(goto-char (point-min))
;; Anytime the active number is 1 or 0, it is suspect. In that
@@ -692,10 +669,9 @@ time saver for large mailboxes.")
;; Keep track of the active number on our own, and insert it back
;; into the active list when we're done. Also, prime the pump to
;; cut down on the number of searches we do.
+ (unless (nnmail-search-unix-mail-delim)
+ (goto-char (point-max)))
(setq end (point-marker))
- (set-marker end (or (and (nnmail-search-unix-mail-delim)
- (point))
- (point-max)))
(while (not (= end (point-max)))
(setq start (marker-position end))
(goto-char end)
@@ -703,9 +679,9 @@ time saver for large mailboxes.")
;; them.
(while (looking-at delim)
(forward-line 1))
- (set-marker end (or (and (nnmail-search-unix-mail-delim)
- (point))
- (point-max)))
+ (set-marker end (if (nnmail-search-unix-mail-delim)
+ (point)
+ (point-max)))
(goto-char start)
(when (not (search-forward marker end t))
(narrow-to-region start end)
@@ -714,6 +690,7 @@ time saver for large mailboxes.")
(cons nil (nnfolder-active-number nnfolder-current-group)))
(widen)))
+ (set-marker end nil)
;; Make absolutely sure that the active list reflects reality!
(nnmail-save-active nnfolder-group-alist nnfolder-active-file)
;; Set the scantime for this group.
View
41 lisp/nnmail.el
@@ -347,7 +347,7 @@ GROUP: Mail will be stored in GROUP (a string).
FIELD must match a complete field name. VALUE must match a complete
word according to the `nnmail-split-fancy-syntax-table' syntax table.
-You can use .* in the regexps to match partial field names or words.
+You can use \".*\" in the regexps to match partial field names or words.
FIELD and VALUE can also be lisp symbols, in that case they are expanded
as specified in `nnmail-split-abbrev-alist'.
@@ -581,7 +581,15 @@ parameter. It should return nil, `warn' or `delete'."
(buffer-disable-undo errors)
(let ((default-directory "/"))
(if (nnheader-functionp nnmail-movemail-program)
- (funcall nnmail-movemail-program inbox tofile)
+ (condition-case err
+ (progn
+ (funcall nnmail-movemail-program inbox tofile)
+ (setq result 0))
+ (error
+ (save-excursion
+ (set-buffer errors)
+ (insert (prin1-to-string err))
+ (setq result 255))))
(setq result
(apply
'call-process
@@ -1342,19 +1350,8 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
(save-excursion
(or (eq timestamp 'none)
(set (intern (format "%s-active-timestamp" backend))
-;;; dmoore@ucsd.edu 25.10.96
-;;; it's not always the case that current-time
-;;; does correspond to changes in the file's time. So just compare
-;;; the file's new time against its own previous time.
-;;; (current-time)
- file-time
- ))
- (funcall (intern (format "%s-request-list" backend)))
-;;; dmoore@ucsd.edu 25.10.96
-;;; BACKEND-request-list already does this itself!
-;;; (set (intern (format "%s-group-alist" backend))
-;;; (nnmail-get-active))
- ))
+ file-time))
+ (funcall (intern (format "%s-request-list" backend)))))
t))
(defun nnmail-message-id ()
@@ -1402,11 +1399,12 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
nnmail-message-id-cache-file nil 'silent)
(set-buffer-modified-p nil)
(setq nnmail-cache-buffer nil)
- ;;(kill-buffer (current-buffer))
- )))
+ (kill-buffer (current-buffer)))))
(defun nnmail-cache-insert (id)
(when nnmail-treat-duplicates
+ (unless (gnus-buffer-live-p nnmail-cache-buffer)
+ (nnmail-cache-open))
(save-excursion
(set-buffer nnmail-cache-buffer)
(goto-char (point-max))
@@ -1419,6 +1417,12 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
(goto-char (point-max))
(search-backward id nil t))))
+(defun nnmail-fetch-field (header)
+ (save-excursion
+ (save-restriction
+ (message-narrow-to-head)
+ (message-fetch-field header))))
+
(defun nnmail-check-duplication (message-id func artnum-func)
(run-hooks 'nnmail-prepare-incoming-message-hook)
;; If this is a duplicate message, then we do not save it.
@@ -1444,7 +1448,8 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
((eq action 'warn)
;; We insert a warning.
(let ((case-fold-search t)
- (newid (nnmail-message-id)))
+ (newid (concat "<" (message-unique-id)
+ "@duplicate-message-id>")))
(goto-char (point-min))
(when (re-search-forward "^message-id[ \t]*:" nil t)
(beginning-of-line)
View
8 lisp/nnmbox.el
@@ -304,6 +304,7 @@
(forward-line -1)
(while (re-search-backward "^X-Gnus-Newsgroup: " nil t)
(delete-region (point) (progn (forward-line 1) (point))))
+ (nnmail-cache-insert (nnmail-fetch-field "message-id"))
(setq result (nnmbox-save-mail
(if (stringp group)
(list (cons group (nnmbox-active-number group)))
@@ -312,9 +313,10 @@
(set-buffer nnmbox-mbox-buffer)
(goto-char (point-max))
(insert-buffer-substring buf)
- (and last (save-buffer))
- result)
- (nnmail-save-active nnmbox-group-alist nnmbox-active-file))
+ (when last
+ (nnmail-cache-close)
+ (nnmail-save-active nnmbox-group-alist nnmbox-active-file)
+ (save-buffer))))
(car result)))
(deffoo nnmbox-request-replace-article (article group buffer)
View
5 lisp/nnmh.el
@@ -290,6 +290,7 @@
(deffoo nnmh-request-accept-article (group &optional server last noinsert)
(nnmh-possibly-change-directory group server)
(nnmail-check-syntax)
+ (nnmail-save-active nnml-group-alist nnml-active-file)
(if (stringp group)
(and
(nnmail-activate 'nnmh)
@@ -299,7 +300,9 @@
(and
(nnmail-activate 'nnmh)
(car (nnmh-save-mail (nnmail-article-group 'nnmh-active-number)
- noinsert)))))
+ noinsert))))
+ (when last
+ (nnmail-cache-close)))
(deffoo nnmh-request-replace-article (article group buffer)
(nnmh-possibly-change-directory group)
View
6 lisp/nnml.el
@@ -313,6 +313,7 @@ all. This may very well take some time.")
(nnml-possibly-change-directory group server)
(nnmail-check-syntax)
(let (result)
+ (nnmail-cache-insert (nnmail-fetch-field "message-id"))
(if (stringp group)
(and
(nnmail-activate 'nnml)
@@ -325,9 +326,10 @@ all. This may very well take some time.")
(nnmail-activate 'nnml)
(setq result (car (nnml-save-mail
(nnmail-article-group 'nnml-active-number))))
- (progn
+ (when last
(nnmail-save-active nnml-group-alist nnml-active-file)
- (and last (nnml-save-nov)))))
+ (nnmail-cache-close)
+ (nnml-save-nov))))
result))
(deffoo nnml-request-replace-article (article group buffer)
View
3  lisp/nntp.el
@@ -820,7 +820,8 @@ This function is supposed to be called from `nntp-server-opened-hook'."
(save-excursion
(set-buffer (or (nntp-find-connection-buffer nntp-server-buffer)
nntp-server-buffer))
- (let ((len (/ (point-max) 1024)))
+ (let ((len (/ (point-max) 1024))
+ message-log-max)
(unless (< len 10)
(setq nntp-have-messaged t)
(nnheader-message 7 "nntp read: %dk" len)))
View
15 lisp/smiley.el
@@ -49,14 +49,15 @@
:type 'directory
:group 'smiley)
-;; Notice the subtle differences in the regular expressions in the two alists below
+;; Notice the subtle differences in the regular expressions in the
+;; two alists below.
(defcustom smiley-deformed-regexp-alist
'(("\\(:-*[<«]+\\)\\W" 1 "FaceAngry.xpm")
("\\(:-+\\]+\\)\\W" 1 "FaceGoofy.xpm")
("\\(:-*D\\)\\W" 1 "FaceGrinning.xpm")
- ("\\(:-*[)>}»]+\\)\\W" 1 "FaceHappy.xpm")
- ("\\(:-*[/\\\"]\\)[^/]" 1 "FaceIronic.xpm")
+ ("\\(:-*[)>}»]+\\)\\W" 1 "FaceHappy.xpm")
+ ("\\(:-*[/\\\"]\\)[^/]\\W" 1 "FaceIronic.xpm")
("\\([8|]-*[|Oo%]\\)\\W" 1 "FaceKOed.xpm")
("\\([:|]-*#+\\)\\W" 1 "FaceNyah.xpm")
("\\(:-*[({]+\\)\\W" 1 "FaceSad.xpm")
@@ -99,9 +100,9 @@
(defcustom smiley-regexp-alist smiley-deformed-regexp-alist
"A list of regexps to map smilies to real images.
-Defaults to the content of smiley-deformed-regexp-alist.
-An alternative smiley-nosey-regexp-alist that
-matches less aggressively is available.
+Defaults to the contents of `smiley-deformed-regexp-alist'.
+An alternative is `smiley-nosey-regexp-alist' that matches less
+aggressively.
If this is a symbol, take its value."
:type '(radio (variable-item smiley-deformed-regexp-alist)
(variable-item smiley-nosey-regexp-alist)
@@ -144,7 +145,7 @@ above them."
(defvar smiley-running-xemacs (string-match "XEmacs" emacs-version))
(defvar smiley-map (make-sparse-keymap "smiley-keys")
- "keymap to toggle smiley states")
+ "Keymap to toggle smiley states.")
(define-key smiley-map [(button2)] 'smiley-toggle-extent)
View
2  lisp/wid-browse.el
@@ -4,7 +4,7 @@
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: extensions
-;; Version: 1.48
+;; Version: 1.55
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
View
58 lisp/wid-edit.el
@@ -4,7 +4,7 @@
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: extensions
-;; Version: 1.48
+;; Version: 1.55
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
@@ -188,9 +188,13 @@ minibuffer."
(car (event-object val))))
(cdr (assoc val items))))
(t
- (cdr (assoc (completing-read (concat title ": ")
- items nil t)
- items)))))
+ (let ((val (completing-read (concat title ": ") items nil t)))
+ (if (stringp val)
+ (let ((try (try-completion val items)))
+ (when (stringp try)
+ (setq val try))
+ (cdr (assoc val items)))
+ nil)))))
(defun widget-get-sibling (widget)
"Get the item WIDGET is assumed to toggle.
@@ -422,24 +426,34 @@ automatically. This does not work yet."
(defun widget-glyph-insert (widget tag image)
"In WIDGET, insert the text TAG or, if supported, IMAGE.
-IMAGE should be a name sans extension of an xpm or xbm file located in
-`widget-glyph-directory'"
- (if (and (string-match "XEmacs" emacs-version)
- widget-glyph-enable
- (fboundp 'make-glyph)
- image)
- (let ((file (concat widget-glyph-directory
- (if (string-match "/\\'" widget-glyph-directory)
- ""
- "/")
- image
- (if (featurep 'xpm) ".xpm" ".xbm"))))
- (if (file-readable-p file)
- (widget-glyph-insert-glyph widget tag (make-glyph file))
- ;; File not readable, give up.
- (insert tag)))
- ;; We don't want or can't use glyphs.
- (insert tag)))
+IMAGE should either be a glyph, or a name sans extension of an xpm or
+xbm file located in `widget-glyph-directory'.
+
+WARNING: If you call this with a glyph, and you want theuser to be
+able to activate the glyph, make sure it is unique. If you use the
+same glyph for multiple widgets, "
+ (cond ((not (and (string-match "XEmacs" emacs-version)
+ widget-glyph-enable
+ (fboundp 'make-glyph)
+ image))
+ ;; We don't want or can't use glyphs.
+ (insert tag))
+ ((and (fboundp 'glyphp)
+ (glyphp image))
+ ;; Already a glyph. Insert it.
+ (widget-glyph-insert-glyph widget tag image))
+ (t
+ ;; A string. Look it up in.
+ (let ((file (concat widget-glyph-directory
+ (if (string-match "/\\'" widget-glyph-directory)
+ ""
+ "/")
+ image
+ (if (featurep 'xpm) ".xpm" ".xbm"))))
+ (if (file-readable-p file)
+ (widget-glyph-insert-glyph widget tag (make-glyph file))
+ ;; File not readable, give up.
+ (insert tag))))))
(defun widget-glyph-insert-glyph (widget tag glyph)
"In WIDGET, with alternative text TAG, insert GLYPH."
View
2  lisp/widget.el
@@ -4,7 +4,7 @@
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, extensions, faces, hypermedia
-;; Version: 1.48
+;; Version: 1.55
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
View
4 texi/ChangeLog
@@ -1,3 +1,7 @@
+Thu Mar 6 08:01:37 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+
+ * gnus.texi (Mail and Procmail): Fix.
+
Sun Mar 2 02:08:40 1997 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
* gnus.texi (Startup Files): Addition.
View
10 texi/custom.texi
@@ -13,7 +13,7 @@
@comment node-name, next, previous, up
@top The Customization Library
-Version: 1.48
+Version: 1.55
@menu
* Introduction::
@@ -546,21 +546,21 @@ defined:@refill
@table @code
@item type
-(the value of (window-system))@br
+(the value of (window-system))@*
Should be one of @code{x} or @code{tty}.
@item class
-(the frame's color support)@br
+(the frame's color support)@*
Should be one of @code{color}, @code{grayscale}, or @code{mono}.
@item background
-(what color is used for the background text)@br
+(what color is used for the background text)@*
Should be one of @code{light} or @code{dark}.
@end table
Internally, custom uses the symbol property @code{factory-face} for the
program specified default face properties, @code{saved-face} for
-properties saved by the user, and @code{face-documentation} for the
+properties saved by the user, and @code{face-doc-string} for the
documentation string.@refill
@end defun
View
9 texi/gnus.texi
@@ -9002,8 +9002,8 @@ Gnus to split the mail the normal way, you could set
If you use @code{procmail} to split things directory into an @code{nnmh}
directory (which you shouldn't do), you should set
@code{nnmail-keep-last-article} to non-@code{nil} to prevent Gnus from
-ever expiring the final article in a mail newsgroup. This is quite,
-quite important.
+ever expiring the final article (i. e., the article with the highest
+article number) in a mail newsgroup. This is quite, quite important.
Here's an example setup: The incoming spools are located in
@file{~/incoming/} and have @samp{""} as suffixes (i. e., the incoming
@@ -13831,6 +13831,7 @@ Jack Vinson.
Also thanks to the following for patches and stuff:
+Adrian Aichner,
Peter Arius,
Marc Auslander,
Chris Bone,
@@ -13841,6 +13842,7 @@ Martin Buchholz,
Kevin Buhr,
Alastair Burt,
Joao Cachopo,
+Zlatko Calusic,
Massimo Campostrini,
Michael R. Cook,
Glenn Coombs,
@@ -13868,17 +13870,20 @@ Rajappa Iyer,
Randell Jesup,
Fred Johansen,
Greg Klanderman,
+Karl Kleinpaste,
Peter Skov Knudsen,
Shuhei Kobayashi, @c Kobayashi
Thor Kristoffersen,
Jens Lautenbacher,
Carsten Leonhardt,
+James LewisMoss,
Christian Limpach,
Markus Linnala,
Dave Love,
Tonny Madsen,
Shlomo Mahlab,
Nat Makarevitch,
+David Martin,
Timo Metzemakers,
Richard Mlynarik,
Lantz Moore,
View
8 texi/widget.texi
@@ -1,6 +1,6 @@
\input texinfo.tex
-@c $Id: widget.texi,v 3.60 1997/03/05 06:00:44 larsi Exp $
+@c $Id: widget.texi,v 1.83 1997/03/05 16:43:09 abraham Exp $
@c %**start of header
@setfilename widget
@@ -15,7 +15,7 @@
@comment node-name, next, previous, up
@top The Emacs Widget Library
-Version: 1.48
+Version: 1.55
@menu
* Introduction::
@@ -401,7 +401,7 @@ The inserted text will be read only.
There is a standard widget keymap which you might find useful.
@defvr Const widget-keymap
-A keymap with the global keymap as its parent.@br
+A keymap with the global keymap as its parent.@*
@key{TAB} and @kbd{C-@key{TAB}} are bound to @code{widget-forward} and
@code{widget-backward}, respectively. @kbd{@key{RET}} and @kbd{mouse-2}
are bound to @code{widget-button-press} and
@@ -635,7 +635,7 @@ The following extra properties are recognized.
@table @code
@item :size
-The width of the editable field.@br
+The width of the editable field.@*
By default the field will reach to the end of the line.
@item :value-face
View
598 todo
@@ -0,0 +1,598 @@
+I would like the zombie-page to contain an URL to the source of the
+latest version of gnus or some explanation on where to find it.
+
+A way to continue editing the latest Message composition.
+http://www.sonicnet.com/feature/ari3/
+facep is not declared.
+Implement new "From " search.
+Install mh-e.
+No link to red gnus from ding page.
+Include a section in the manual on why the number of articles
+isn't the same in the group buffer and on the SPC prompt.
+Interacting with rmail fcc isn't easy.
+
+Hypermail:
+<URL:http://www.falch.no/people/pepper/DSSSL-Lite/archives/>
+<URL:http://www.eit.com/software/hypermail/hypermail.html>
+<URL:http://homer.ncm.com/>
+<URL:http://www.yahoo.com/Computers_and_Internet/Internet/World_Wide_Web/HTML_Converters/>
+http://www.uwsg.indiana.edu/hypermail/linux/kernel/9610/index.html
+<URL:http://union.ncsa.uiuc.edu/HyperNews/get/www/html/converters.html>
+http://www.miranova.com/gnus-list/
+
+
+{^-- } is made into - in LaTeX.
+filladapt in Message buffers: > > recognition.
+gnus-kill is much slower than it was in GNUS 4.1.3.
+
+Bugs:
+
+* when expunging articles on low score, the sparse nodes keep hanging on?
+* starting the first time seems to hang Gnus on some systems. Does
+NEWGROUPS answer too fast?
+* nndir doesn't read gzipped files.
+* FAQ doesn't have an up node?
+* when moving mail from a procmail spool to the crash-box,
+the crash-box is only appropriate to one specific group.
+* `t' `t' makes X-Faces disappear.
+* nnmh-be-safe means that crossposted articles will
+be marked as unread.
+* Orphan score entries dont show on "V t" score trace
+* when clearing out data, the cache data should also be reset.
+* rewrite gnus-summary-limit-children to be non-recursive
+to avoid exceeding lisp nesting on huge groups.
+* expinged articles are counted when computing scores.
+* implement gnus-batch-brew-soup
+* ticked articles aren't easy to read in pick mode -- `n' and
+stuff just skips past them. Read articles are the same.
+* topics that contain just groups with ticked
+articles aren't displayed.
+* nndoc should always allocate unique Message-IDs.
+* implement gnus-score-thread
+* If there are mail groups the first time you use Gnus, Gnus'll
+make the mail groups killed.
+* no "no news is good news" when using topics.
+* when doing crosspost marking, the cache has to be consulted
+and articles have to be removed.
+* nnweb should fetch complete articles when they are split into several
+parts.
+* scoring on head immediate doesn't work.
+* finding short score file names takes forever.
+* canceling articles in foreign groups.
+* nntp-open-rlogin no longer works.
+* C-u C-x C-s (Summary) switches to the group buffer.
+* move nnmail-split-history out to the backends.
+* nnweb doesn't work properly.
+* using a virtual server name as `gnus-select-method' doesn't work?
+* when killing/yanking a group from one topic to another in a slave, the
+master will yank it first to one topic and then add it to another.
+Perhaps.
+
+New features:
+
+* warn user about `=' redirection of a group in the active file?
+* really unbinhex binhex files.
+* take over the XEmacs menubar and offer a toggle between the XEmacs
+bar and the Gnus bar.
+* push active file and NOV file parsing down into C code.
+`(canonize-message-id id)'
+`(mail-parent-message-id references n)'
+`(parse-news-nov-line &optional dependency-hashtb)'
+`(parse-news-nov-region beg end &optional dependency-hashtb fullp)'
+`(parse-news-active-region beg end hashtb)'
+* nnml .overview directory with splits.
+* asynchronous cache
+* postponed commands.
+* the selected article show have its Subject displayed in its summary line.
+* when entering groups, get the real number of unread articles from
+the server?
+* sort after gathering threads -- make false roots have the
+headers of the oldest orhpan with a 0 article number?
+* nndoc groups should inherit the score files of their parents? Also
+inherit copy prompts and save files.
+* command to start up Gnus (if not running) and enter a mail mode buffer.
+* allow editing the group description from the group buffer
+for backends that support that.
+* gnus-{hide,show}-all-topics
+* groups and sub-topics should be allowed to mingle inside each topic,
+and not just list all subtopics at the end.
+* a command to remove all read articles that are not needed to connect
+threads -- `gnus-summary-limit-to-sparse-unread'?
+* a variable to turn off limiting/cutting of threads in the tree buffer.
+* a variable to limit how many files are uudecoded.
+* add zombie groups to a special "New Groups" topic.
+* server mode command: close/open all connections
+* put a file date in gnus-score-alist and check whether the file
+has been changed before using it.
+* on exit from a digest group, go to the next article in the parent group.
+* hide (sub)threads with low score.
+* when expiring, remove all marks from expired articles.
+* gnus-summary-limit-to-body
+* a regexp alist that says what level groups are to be subscribed
+on. Eg. -- `(("nnml:" . 1))'.
+* easier interface to nnkiboze to create ephemeral groups that
+contaion groups that match a regexp.
+* allow newlines in <URL:> urls, but remove them before using
+the URL.
+* If there is no From line, the mail backends should fudge one from the
+"From " line.
+* fuzzy simplifying should strip all non-alpha-numerical info
+from subject lines.
+* gnus-soup-brew-soup-with-high-scores.
+* nntp-ping-before-connect
+* command to check whether NOV is evil. "list overview.fmt".
+* when entering a group, Gnus should look through the score
+files very early for `local' atoms and set those local variables.
+* message annotations.
+* topics are always yanked before groups, and that's not good.
+* (set-extent-property extent 'help-echo "String to display in minibuf")
+to display help in the minibuffer on buttons under XEmacs.
+* allow group line format spec to say how many articles there
+are in the cache.
+* AUTHINFO GENERIC
+* support qmail maildir spools
+* `run-with-idle-timer' in gnus-demon.
+* stop using invisible text properties and start using overlays instead
+* C-c C-f C-e to add an Expires header.
+* go from one group to the next; everything is expunged; go to the
+next group instead of going to the group buffer.
+* gnus-renumber-cache -- to renumber the cache using "low" numbers.
+* record topic changes in the dribble buffer.
+* `nnfolder-generate-active-file' should look at the folders it
+finds and generate proper active ranges.
+* nneething-look-in-files-for-article-heads variable to control
+whether nneething should sniff all files in the directories.
+* gnus-fetch-article -- start Gnus, enter group, display article
+* gnus-dont-move-articles-to-same-group variable when respooling.
+* when messages are crossposted between several auto-expirable groups,
+articles aren't properly marked as expirable.
+* nneething should allow deletion/moving.
+* TAB on the last button should go to the first button.
+* if the car of an element in `mail-split-methods' is a function,
+and the function returns non-nil, use that as the name of the group(s) to
+save mail in.
+* command for listing all score files that have been applied.
+* a command in the article buffer to return to `summary' config.
+* `gnus-always-post-using-current-server' -- variable to override
+`C-c C-c' when posting.
+* nnmail-group-spool-alist -- says where each group should use
+as a spool file.
+* when an article is crossposted to an auto-expirable group, the article
+should be marker as expirable.
+* article mode command/menu for "send region as URL to browser".
+* on errors, jump to info nodes that explain the error. For instance,
+on invalid From headers, or on error messages from the nntp server.
+* when gathering threads, make the article that has no "Re: " the parent.
+Also consult Date headers.
+* a token in splits to call shrink-window-if-larger-than-buffer
+* `1 0 A M' to do matches on the active hashtb.
+* duplicates -- command to remove Gnus-Warning header, use the read
+Message-ID, delete the "original".
+* when replying to several messages at once, put the "other" message-ids
+into a See-Also header.
+* support setext: URL:http://www.bsdi.com/setext/
+* support ProleText: <URL:http://proletext.clari.net/prole/proletext.html>
+* when browsing a foreign server, the groups that are already subscribed
+should be listed as such and not as "K".
+* generate font names dynamically.
+* score file mode auto-alist.
+* allow nndoc to change/add/delete things from documents. Implement
+methods for each format for adding an article to the document.
+* `gnus-fetch-old-headers' `all' value to incorporate
+absolutely all headers there is.
+* function like `|', but concatenate all marked articles
+and pipe them to the process.
+* cache the list of killed (or active) groups in a separate file. Update
+the file whenever we read the active file or the list
+of killed groups in the .eld file reaches a certain length.
+* function for starting to edit a file to put into
+the current mail group.
+* score-find-trace should display the total score of the article.
+* "ghettozie" -- score on Xref header and nix it out after using it
+to avoid marking as read in other groups it has been crossposted to.
+* look at procmail splitting. The backends should create
+the groups automatically if a spool file exists for that group.
+* function for backends to register themselves with Gnus.
+* when replying to several process-marked articles,
+have all the From end up in Cc headers? Variable to toggle.
+* command to delete a crossposted mail article from all
+groups it has been mailed to.
+* `B c' and `B m' should be crosspost aware.
+* hide-pgp should also hide PGP public key blocks.
+* Command in the group buffer to respoll process-marked groups.
+* `gnus-summary-find-matching' should accept
+pseudo-"headers" like "body", "head" and "all"
+* When buttifying <URL: > things, all white space (including
+newlines) should be ignored.
+* Process-marking all groups in a topic should process-mark
+groups in subtopics as well.
+* Add non-native groups to the list of killed groups when killing them.
+* nntp-suggest-kewl-config to probe the nntp server and suggest
+variable settings.
+* add edit and forward secondary marks.
+* nnml shouldn't visit its .overview files.
+* allow customizing sorting within gathered threads.
+* `B q' shouldn't select the current article.
+* nnmbox should support a newsgroups file for descriptions.
+* allow fetching mail from several pop servers.
+* Be able to specify whether the saving commands save the original
+or the formatted article.
+* a command to reparent with the child process-marked (cf. `T ^'.).
+* I think the possibility to send a password with nntp-open-rlogin
+should be a feature in Red Gnus.
+* The `Z n' command should be possible to execute from a mouse click.
+* more limiting functions -- date, etc.
+* be able to limit on a random header; on body; using reverse matches.
+* a group parameter (`absofucking-total-expiry') that will make Gnus expire
+even unread articles.
+* a command to print the article buffer as postscript.
+* variable to disable password fetching when opening by nntp-open-telnet.
+* manual: more example servers -- nntp with rlogin, telnet
+* checking for bogus groups should clean topic alists as well.
+* cancelling articles in foreign groups.
+* article number in folded topics isn't properly updated by
+Xref handling.
+* Movement in the group buffer to the next unread group should go to the
+next closed topic with unread messages if no group can be found.
+* Extensive info pages generated on the fly with help everywhere --
+in the "*Gnus edit*" buffers, for instance.
+* Topic movement commands -- like thread movement. Up, down, forward, next.
+* a way to tick/mark as read Gcc'd articles.
+* a way to say that all groups within a specific topic comes
+from a particular server? Hm.
+* `gnus-article-fill-if-long-lines' -- a function to fill
+the article buffer if there are any looong lines there.
+* `T h' should jump to the parent topic and fold it.
+* a command to create an ephemeral nndoc group out of a file,
+and then splitting it/moving it to some other group/backend.
+* a group parameter for nnkiboze groups that says that
+all kibozed articles should be entered into the cache.
+* It should also probably be possible to delimit what
+`gnus-jog-cache' does -- for instance, work on just some groups, or on
+some levels, and entering just articles that have a score higher than
+a certain number.
+* function to request all articles in a thread.
+* nnfolder should append to the folder instead of re-writing
+the entire folder to disk when accepting new messages.
+* allow all backends to do the proper thing with .gz files.
+* a backend for reading collections of babyl files nnbabylfolder?
+* a command for making the native groups into foreign groups.
+* server mode command for clearing read marks from all groups
+from a server.
+* when following up mulitple articles, include all To, Cc, etc headers
+from all articles.
+* a command for deciding what the total score of the current
+thread is. Also a way to highlight based on this.
+* command to show and edit group scores
+* a gnus-tree-minimize-horizontal to minimize tree buffers
+horizontally.
+* variable to fetch-old-headers but not display any in the summary buffer
+so that the tree code can show entire threads. Also not limit in
+the tree buffer.
+* command to generate nnml overview file for one group.
+* `C-u C-u a' -- prompt for many crossposted groups.
+* keep track of which mail groups have received new articles (in this session).
+Be able to generate a report and perhaps do some marking in the group
+buffer.
+* gnus-build-sparse-threads to a number -- build only sparse threads
+that are of that length.
+* have nnmh respect mh's unseen sequence in .mh_profile.
+* cache the newsgroups descriptions locally.
+* asynchronous posting under nntp.
+* be able to control word adaptive scoring from the score files.
+* a variable to make `C-c C-c' post using the "current" select method.
+* `limit-exclude-low-scored-articles'.
+* if `gnus-summary-show-thread' is a number, hide threads that have
+a score lower than this number.
+* split newsgroup subscription variable up into "order" and "method".
+* buttonize ange-ftp file names.
+* a command to make a duplicate copy of the current article
+so that each copy can be edited separately.
+* nnweb should allow fetching from the local nntp server.
+* record the sorting done in the summary buffer so that
+it can be repeated when limiting/regenerating the buffer.
+* nnml-generate-nov-databses should generate for
+all nnml servers.
+* when the user does commands in the group buffer, check
+the modification time of the .newsrc.eld file and use
+ask-user-about-supersession-threat. Also warn when trying
+to save .newsrc.eld and it has changed.
+* M-g on a topic will display all groups with 0 articles in
+the topic.
+* command to remove all topic stuff.
+* allow exploding incoming digests when reading incoming mail
+and splitting the resulting digests.
+* nnsoup shouldn't set the `message-' variables.
+* command to nix out all nnoo state information.
+* nnmail-process-alist that calls functions if group names
+matches an alist -- before saving.
+* use buffer-invisibility-spec everywhere for hiding text.
+* variable to activate each group before entering them
+to get the (new) number of articles. `gnus-activate-before-entering'.
+* command to fetch a Message-ID from any buffer, even
+starting Gnus first if necessary.
+* when posting and checking whether a group exists or not, just
+ask the nntp server instead of relying on the active hashtb.
+* buttonize the output of `C-c C-a' in an apropos-like way.
+* `G p' should understand process/prefix, and allow editing
+of several groups at once.
+* command to create an ephemeral nnvirtual group that
+matches some regexp(s).
+* nndoc should understand "Content-Type: message/rfc822" forwarded messages.
+* it should be possible to score "thread" on the From header.
+* hitting RET on a "gnus-uu-archive" pseudo article should unpack it.
+* `B i' should display the article at once in the summary buffer.
+* remove the "*" mark at once when unticking an article.
+* `M-s' should highlight the matching text.
+* when checking for duplicated mails, use Resent-Message-ID if present.
+* killing and yanking groups in topics should be better. If killing one copy
+of a group that exists in multiple topics, only that copy should
+be removed. Yanking should insert the copy, and yanking topics
+should be possible to be interspersed with the other yankings.
+* command for enter a group just to read the cached articles. A way to say
+"ignore the nntp connection; just read from the cache."
+* `X u' should decode base64 articles.
+* a way to hide all "inner" cited text, leaving just the most
+recently cited text.
+* nnvirtual should be asynchronous.
+* after editing an article, gnus-original-article-buffer should
+be invalidated.
+* there should probably be a way to make Gnus not connect to the
+server and just read the articles in the server
+* allow a `set-default' (or something) to change the default
+value of nnoo variables.
+* a command to import group infos from a .newsrc.eld file.
+* groups from secondary servers have the entire select method
+listed in each group info.
+* a command for just switching from the summary buffer to the group
+buffer.
+* a way to specify that some incoming mail washing functions
+should only be applied to some groups.
+* Message `C-f C-t' should ask the user whether to heed
+mail-copies-to: never.
+* new group parameter -- `post-to-server' that says to post
+using the current server. Also a variable to do the same.
+* the slave dribble files should autosave to the slave file names.
+* a group parameter that says what articles to display on group entry, based
+on article marks.
+* a way to visually distinguish slave Gnusae from masters. (Whip instead
+of normal logo?)
+* Use DJ Bernstein "From " quoting/dequoting, where appliccable.
+* Why is hide-citation-maybe and hide-citation different? Also
+clear up info.
+* group user-defined meta-parameters.
+
+
+
+From: John Griffith <griffith@sfs.nphil.uni-tuebingen.de>
+* I like the option for trying to retrieve the FAQ for a group and I was
+thinking it would be great if for those newsgroups that had archives
+you could also try to read the archive for that group. Part of the
+problem is that archives are spread all over the net, unlike FAQs.
+What would be best I suppose is to find the one closest to your site.
+
+In any case, there is a list of general news group archives at
+ftp://ftp.neosoft.com/pub/users/claird/news.lists/newsgroup_archives.html
+
+
+
+
+*From: Jason L Tibbitts III <tibbs@hpc.uh.edu>
+(add-hook 'gnus-select-group-hook
+ (lambda ()
+ (gnus-group-add-parameter group
+ (cons 'gnus-group-date-last-entered (list (current-time-string))))))
+
+(defun gnus-user-format-function-d (headers)
+ "Return the date the group was last read."
+ (cond ((car (gnus-group-get-parameter gnus-tmp-group 'gnus-group-date-last-entered)))
+ (t "")))
+
+ - J<
+
+* tanken var at n�r du bruker `gnus-startup-file' som prefix (FOO) til � lete
+opp en fil FOO-SERVER, FOO-SERVER.el, FOO-SERVER.eld, kan du la den v�re en
+liste hvor du bruker hvert element i listen som FOO, istedet. da kunne man
+hatt forskjellige serveres startup-filer forskjellige steder.
+
+
+*LMI> Well, nnbabyl could alter the group info to heed labels like
+LMI> answered and read, I guess.
+
+It could also keep them updated (the same for the Status: header of
+unix mbox files).
+
+They could be used like this:
+
+`M l <name> RET' add label <name> to current message.
+`M u <name> RET' remove label <name> from current message.
+`/ l <expr> RET' limit summary buffer according to <expr>.
+
+<expr> would be a boolean expression on the labels, e.g.
+
+ `/ l bug & !fixed RET'
+
+would show all the messages which are labeled `bug' but not labeled
+`fixed'.
+
+One could also immagine the labels being used for highliting, or
+affect the summary line format.
+
+
+*Sender: abraham@dina.kvl.dk
+
+I'd like a gnus-find-file which work like find file, except that it
+would recognize things that looks like messages or folders:
+
+- If it is a directory containing numbered files, create an nndir
+summary buffer.
+
+- For other directories, create a nneething summaru buffer.
+
+- For files matching "\\`From ", create a nndoc/mbox summary.
+
+- For files matching "\\`BABYL OPTIONS:", create a nndoc/baby summary.
+
+- For files matching "\\`[^ \t\n]+:", create an *Article* buffer.
+
+- For other files, just find them normally.
+
+I'd like `nneething' to use this function, so it would work on a
+directory potentially containing mboxes or babyl files.
+
+*Please send a mail to bwarsaw@cnri.reston.va.us (Barry A. Warsaw) and
+tell him what you are doing.
+
+*Currently, I get prompted:
+
+decend into sci?
+- type y
+decend into sci.something ?
+- type n
+decend into ucd?
+
+The problem above is that since there is really only one subsection of
+science, shouldn't it prompt you for only decending sci.something? If
+there was a sci.somethingelse group or section, then it should prompt
+for sci? first the sci.something? then sci.somethingelse?...
+
+*Ja, det burde v�re en m�te � si slikt. Kanskje en ny variabel?
+`gnus-use-few-score-files'? S� kunne score-regler legges til den
+"mest" lokale score-fila. F. eks. ville no-gruppene betjenes av
+"no.all.SCORE", osv.
+
+*What i want is for Gnus to treat any sequence or combination of the following
+as a single spoiler warning and hide it all, replacing it with a "Next Page"
+button:
+
+
+ ^L's
+
+ more than n blank lines
+
+ more than m identical lines
+ (which should be replaced with button to show them)
+
+ any whitespace surrounding any of the above
+
+
+*Well, we could allow a new value to `gnus-thread-ignore-subject' --
+`spaces', or something. (We could even default to that.) And then
+subjects that differ in white space only could be considered the
+"same" subject for threading purposes.
+