*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Thu, 6 Mar 1997 07:44:26 +0000 (07:44 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Thu, 6 Mar 1997 07:44:26 +0000 (07:44 +0000)
26 files changed:
etc/gnus-tut.txt [new file with mode: 0644]
gnus-mdrtn.el [new file with mode: 0644]
lisp/ChangeLog
lisp/cus-edit.el
lisp/cus-face.el
lisp/custom.el
lisp/gnus-group.el
lisp/gnus-sum.el
lisp/gnus.el
lisp/message.el
lisp/nnbabyl.el
lisp/nnfolder.el
lisp/nnmail.el
lisp/nnmbox.el
lisp/nnmh.el
lisp/nnml.el
lisp/nntp.el
lisp/smiley.el
lisp/wid-browse.el
lisp/wid-edit.el
lisp/widget.el
texi/ChangeLog
texi/custom.texi
texi/gnus.texi
texi/widget.texi
todo [new file with mode: 0644]

diff --git a/etc/gnus-tut.txt b/etc/gnus-tut.txt
new file mode 100644 (file)
index 0000000..112c4bf
--- /dev/null
@@ -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.
+
+
diff --git a/gnus-mdrtn.el b/gnus-mdrtn.el
new file mode 100644 (file)
index 0000000..a7209f1
--- /dev/null
@@ -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
index 428bbb3..58c3942 100644 (file)
@@ -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.
index 3c0a556..609a998 100644 (file)
@@ -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)
index e93d8b6..a4580a9 100644 (file)
@@ -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:
     (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.
index e294fa0..cedc3b7 100644 (file)
@@ -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:
index ff574d8..89def1b 100644 (file)
@@ -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)))
index 96f3f27..6145e4d 100644 (file)
@@ -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) ", "))))))
 
index 4861626..cb7bff0 100644 (file)
@@ -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)
index 6076b21..8d706ac 100644 (file)
@@ -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 ()
index 0905699..55937fa 100644 (file)
        (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)))
        (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))))
index 8523e43..6cc8b7a 100644 (file)
@@ -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)
 
 \f
 
@@ -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.
index 29675e4..5079765 100644 (file)
@@ -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)
index e9457a2..4bfb0b2 100644 (file)
        (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)))
        (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)
index dda5cab..71bbbbf 100644 (file)
 (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)
     (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)
index 1e88d0f..1c92ed3 100644 (file)
@@ -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)
index 7d7f256..36023f6 100644 (file)
@@ -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)))
index db37f60..537aa6c 100644 (file)
   :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")
 
 (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)
 
index d076ace..ab21c62 100644 (file)
@@ -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:
index d7145d0..3cf5d40 100644 (file)
@@ -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."
index ca796f7..4be2908 100644 (file)
@@ -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:
index 51e290d..fe0ecca 100644 (file)
@@ -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.
index dd81a1d..f7deb8c 100644 (file)
@@ -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
index c629e82..a029d60 100644 (file)
@@ -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,
index 4726707..133729e 100644 (file)
@@ -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
diff --git a/todo b/todo
new file mode 100644 (file)
index 0000000..de2e2c9
--- /dev/null
+++ b/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. 
+
+*Modes to preprocess the contents (e.g. jka-compr) use the second form
+"(REGEXP FUNCTION NON-NIL)" while ordinary modes (e.g. tex) use the first
+form "(REGEXP . FUNCTION)", so you could use it to distinguish between
+those two types of modes. (auto-modes-alist, insert-file-contents-literally.)
+
+* Under XEmacs -- do funny article marks:
+tick - thumb tack
+killed - skull
+soup - bowl of soup
+score below - dim light bulb
+score over - bright light bulb
+
+*Yes. I think the algorithm is as follows:
+
+Group-mode
+       show-list-of-articles-in-group
+       if (key-pressed == SPACE) {
+               if (no-more-articles-in-group-to-select) {
+                       if (articles-selected)
+                               start-reading-selected-articles;
+                       junk-unread-articles;
+                       next-group;
+               } else {
+                       show-next-page;
+               }
+       } else if (key-pressed = '.') {
+               if (consolidated-menus)         # same as hide-thread in Gnus
+                       select-thread-under-cursor;
+               else
+                       select-article-under-cursor;
+       }
+
+Article-mode
+       if (key-pressed == SPACE) {
+               if (more-pages-in-article)
+                       next-page;
+               else if (more-selected-articles-to-read)
+                       next-article;
+               else 
+                       next-group;
+       }
+
+*My precise need here would have been to limit files to Incoming*.
+One could think of some `nneething-only-files' variable, but I guess
+it would have been unacceptable if one was using many unrelated such
+nneething groups.
+
+A more useful approach would be to, in response to the `G D' prompt, be
+allowed to say something like: `~/.mail/Incoming*', somewhat limiting
+the top-level directory only (in case directories would be matched by
+the wildcard expression).
+
+*It would be nice if it also handled 
+
+       <URL:news://sunsite.auc.dk/>
+
+which should correspond to `B nntp RET sunsite.auc.dk' in *Group*.
+
+
+*
+  Take a look at w3-menu.el in the Emacs-W3 distribution - this works out
+really well.  Each menu is 'named' by a symbol that would be on a
+gnus-*-menus (where * would be whatever, but at least group, summary, and
+article versions) variable.
+
+  So for gnus-summary-menus, I would set to '(sort mark dispose ...)
+
+  A value of '1' would just put _all_ the menus in a single 'GNUS' menu in
+the main menubar.  This approach works really well for Emacs-W3 and VM.
+
+
+* nndoc should take care to create unique Message-IDs for all its
+articles.
+* gnus-score-followup-article only works when you have a summary buffer
+active.  Make it work when posting from the group buffer as well.
+(message-sent-hook).
+* rewrite gnus-demon to use run-with-idle-timers.
+
+* * Enhancements to Gnus:
+
+  Add two commands:
+
+  * gnus-servers (gnus-start-server-buffer?)--enters Gnus and goes
+    straight to the server buffer, without opening any connections to
+    servers first.
+
+  * gnus-server-read-server-newsrc--produces a buffer very similar to
+    the group buffer, but with only groups from that server listed;
+    quitting this buffer returns to the server buffer.
+
+* add a command to check the integrity of an nnfolder folder --
+go through the article numbers and see that there are no duplicates,
+and stuff.
+
+* `unsmileyfy-buffer' to undo smileification.
+
+* a command to give all relevant info on an article, including all
+secondary marks.
+
+* when doing `-request-accept-article', the backends should do
+the nnmail duplicate checking.
+
+* allow `message-signature-file' to be a function to return the
+value of the signature file.
+
+* In addition, I would love it if I could configure message-tab so that it
+could call `bbdb-complete-name' in other headers.  So, some sort of
+interface like
+
+(setq message-tab-alist
+      '((message-header-regexp message-expand-group)
+        ("^\\(To\\|[cC]c\\|[bB]cc\\)"  bbdb-complete-name)))
+
+then you could run the relevant function to complete the information in
+the header