From 057c31251c1c71d749473e71ca3558571f2d59ab Mon Sep 17 00:00:00 2001 From: Lars Magne Ingebrigtsen Date: Thu, 6 Mar 1997 07:44:26 +0000 Subject: [PATCH] *** empty log message *** --- etc/gnus-tut.txt | 294 ++++++++++++++++++++++ gnus-mdrtn.el | 193 +++++++++++++++ lisp/ChangeLog | 57 +++++ lisp/cus-edit.el | 17 +- lisp/cus-face.el | 210 +++++++++++----- lisp/custom.el | 2 +- lisp/gnus-group.el | 6 +- lisp/gnus-sum.el | 8 +- lisp/gnus.el | 2 +- lisp/message.el | 9 +- lisp/nnbabyl.el | 2 + lisp/nnfolder.el | 217 ++++++++-------- lisp/nnmail.el | 41 ++-- lisp/nnmbox.el | 8 +- lisp/nnmh.el | 5 +- lisp/nnml.el | 6 +- lisp/nntp.el | 3 +- lisp/smiley.el | 15 +- lisp/wid-browse.el | 2 +- lisp/wid-edit.el | 58 +++-- lisp/widget.el | 2 +- texi/ChangeLog | 4 + texi/custom.texi | 10 +- texi/gnus.texi | 9 +- texi/widget.texi | 8 +- todo | 598 +++++++++++++++++++++++++++++++++++++++++++++ 26 files changed, 1518 insertions(+), 268 deletions(-) create mode 100644 etc/gnus-tut.txt create mode 100644 gnus-mdrtn.el create mode 100644 todo diff --git a/etc/gnus-tut.txt b/etc/gnus-tut.txt new file mode 100644 index 000000000..112c4bffe --- /dev/null +++ b/etc/gnus-tut.txt @@ -0,0 +1,294 @@ +From lars Thu Feb 23 23:20:38 1995 +From: larsi@ifi.uio.no (ding) +Date: Fri Feb 24 13:40:45 1995 +Subject: So you want to use the new Gnus +Message-ID: + +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 ' 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 . + +;; Copyright (C) 1995 Free Software Foundation, Inc. + +;; Author: Lars Magne Ingebrigtsen +;; 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: + +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: + +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: + +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: + +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 ' to browse that server and +subscribe to that group, or you can type +`G m alt.furniture.couchesnntpnews.funet.fi', 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 '. + +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: + +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: + +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: + +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.newsgroupnnvirtual^rec\.aquaria\.*' + +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: + +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 index 000000000..a7209f12e --- /dev/null +++ b/gnus-mdrtn.el @@ -0,0 +1,193 @@ +;;; gnus-mdrtn.el --- a group moderation package for Gnus +;; Copyright (C) 1996 Lars Magne Ingebrigtsen + +;; Author: Lars Magne Ingebrigtsen +;; 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 diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 428bbb3e3..58c39420b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,60 @@ +Thu Mar 6 08:41:16 1997 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.4.19 is released. + +Thu Mar 6 08:00:31 1997 Lars Magne Ingebrigtsen + + * 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 + + * nnmail.el (nnmail-move-inbox): Protect against nil results. + +Thu Mar 6 04:23:11 1997 Lars Magne Ingebrigtsen + + * 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 + + * smiley.el (smiley-deformed-regexp-alist): Fix FaceIronic. + +Wed Mar 5 09:15:04 1997 Lars Magne Ingebrigtsen + + * nnmail.el (nnmail-check-duplication): Ditto. + +Wed Mar 5 09:14:12 1997 Carsten Leonhardt + + * nnmail.el (nnmail-check-duplication): Use a different + Message-ID. + Sun Mar 2 16:58:16 1997 Lars Magne Ingebrigtsen * gnus.el: Gnus v5.4.18 is released. diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el index 3c0a556fb..609a99885 100644 --- a/lisp/cus-edit.el +++ b/lisp/cus-edit.el @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen ;; 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) diff --git a/lisp/cus-face.el b/lisp/cus-face.el index e93d8b6cf..a4580a93f 100644 --- a/lisp/cus-face.el +++ b/lisp/cus-face.el @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen ;; Keywords: help, faces -;; Version: 1.48 +;; Version: 1.55 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: @@ -24,6 +24,18 @@ (or (cdr (assq property (frame-parameters frame))) default))) +(unless (fboundp 'face-doc-string) + ;; XEmacs function missing in Emacs. + (defun face-doc-string (face) + "Get the documentation string for FACE." + (get face 'face-doc-string))) + +(unless (fboundp 'set-face-doc-string) + ;; XEmacs function missing in Emacs. + (defun set-face-doc-string (face string) + "Set the documentation string for FACE to STRING." + (put face 'face-doc-string string))) + (unless (fboundp 'x-color-values) ;; Emacs function missing in XEmacs 19.14. (defun x-color-values (color &optional frame) @@ -45,42 +57,105 @@ If FRAME is omitted or nil, use the selected frame." (t (defalias 'custom-facep 'facep))) -;; Overwrite Emacs definition. +(unless (fboundp 'make-empty-face) + ;; This should be moved to `faces.el'. + (if (string-match "XEmacs" emacs-version) + ;; Give up for old XEmacs pre 19.15/20.1. + (defalias 'make-empty-face 'make-face) + ;; Define for Emacs pre 19.35. + (defun make-empty-face (name) + "Define a new FACE on all frames, ignoring X resources." + (interactive "SMake face: ") + (or (internal-find-face name) + (let ((face (make-vector 8 nil))) + (aset face 0 'face) + (aset face 1 name) + (let* ((frames (frame-list)) + (inhibit-quit t) + (id (internal-next-face-id))) + (make-face-internal id) + (aset face 2 id) + (while frames + (set-frame-face-alist (car frames) + (cons (cons name (copy-sequence face)) + (frame-face-alist (car frames)))) + (setq frames (cdr frames))) + (setq global-face-data (cons (cons name face) global-face-data))) + ;; add to menu + (if (fboundp 'facemenu-add-new-face) + (facemenu-add-new-face name)) + face)) + name))) + +(defcustom initialize-face-resources t + "If non nil, allow X resources to initialize face properties. +This only affects faces declared with `defface', and only NT or X11 frames." + :group 'customize + :type 'boolean) + +(cond ((fboundp 'initialize-face-resources) + ;; Already bound, do nothing. + ) + ((fboundp 'make-face-x-resource-internal) + ;; Emacs or new XEmacs. + (defun initialize-face-resources (face &optional frame) + "Initialize face according to the X11 resources. +This might overwrite existing face properties. +Does nothing when the variable initialize-face-resources is nil." + (when initialize-face-resources + (make-face-x-resource-internal face frame t)))) + (t + ;; Too hard to do right on XEmacs. + (defalias 'initialize-face-resources 'ignore))) + +(unless (fboundp 'reverse-face) + ;; This should be moved to `faces.el'. + (if (string-match "XEmacs" emacs-version) + ;; Xemacs. + (defun reverse-face (face &optional frame) + "Swap the foreground and background colors of face FACE. +If the colors are not specified in the face, use the default colors." + (interactive (list (read-face-name "Reverse face: "))) + (let ((fg (color-name (face-foreground face frame) frame)) + (bg (color-name (face-background face frame) frame))) + (set-face-foreground face bg frame) + (set-face-background face fg frame))) + ;; Emacs. + (defun reverse-face (face &optional frame) + "Swap the foreground and background colors of face FACE. +If the colors are not specified in the face, use the default colors." + (interactive (list (read-face-name "Reverse face: "))) + (let ((fg (or (face-foreground face frame) + (face-foreground 'default frame) + (frame-property (or frame (selected-frame)) + 'foreground-color) + "black")) + (bg (or (face-background face frame) + (face-background 'default frame) + (frame-property (or frame (selected-frame)) + 'background-color) + "white"))) + (set-face-foreground face bg frame) + (set-face-background face fg frame))))) + (if (string-match "XEmacs" emacs-version) - (progn - (defun custom-extract-frame-properties (frame) - "Return a plist with the frame properties of FRAME used by custom." - (list 'type (device-type (frame-device frame)) - 'class (device-class (frame-device frame)) - 'background (or custom-background-mode - (frame-property frame - 'background-mode) - (custom-background-mode frame)))) - - (defun get-face-documentation (face) - "Get the documentation string for FACE." - (face-property face 'doc-string)) - - (defun set-face-documentation (face string) - "Set the documentation string for FACE to STRING." - (set-face-property face 'doc-string string))) - + ;; XEmacs. + (defun custom-extract-frame-properties (frame) + "Return a plist with the frame properties of FRAME used by custom." + (list 'type (device-type (frame-device frame)) + 'class (device-class (frame-device frame)) + 'background (or custom-background-mode + (frame-property frame + 'background-mode) + (custom-background-mode frame)))) + ;; Emacs. (defun custom-extract-frame-properties (frame) "Return a plist with the frame properties of FRAME used by custom." (list 'type window-system 'class (frame-property frame 'display-type) 'background (or custom-background-mode - (frame-property frame - 'background-mode) - (custom-background-mode frame)))) - - (defun get-face-documentation (face) - "Get the documentation string for FACE." - (get face 'face-documentation)) - - (defun set-face-documentation (face string) - "Set the documentation string for FACE to STRING." - (put face 'face-documentation string))) + (frame-property frame 'background-mode) + (custom-background-mode frame))))) ;;; Declaring a face. @@ -100,14 +175,16 @@ If FRAME is omitted or nil, use the selected frame." (frames (custom-relevant-frames)) frame) ;; Create global face. + (make-empty-face face) (custom-face-display-set face value) ;; Create frame local faces (while frames (setq frame (car frames) frames (cdr frames)) - (custom-face-display-set face value frame))))) - (when (and doc (null (get-face-documentation face))) - (set-face-documentation face doc)) + (custom-face-display-set face value frame)) + (initialize-face-resources face)))) + (when (and doc (null (face-doc-string face))) + (set-face-doc-string face doc)) (custom-handle-all-keywords face args 'custom-face) (run-hooks 'custom-define-hook)) face) @@ -135,6 +212,10 @@ If FRAME is nil, set the default face." (toggle :format "Underline: %[%v%]\n") set-face-underline-p) (:foreground (color :tag "Foreground") set-face-foreground) (:background (color :tag "Background") set-face-background) + (:reverse (const :format "Reverse Video\n" t) + (lambda (face value &optional frame) + ;; We don't use VALUE. + (reverse-face face frame))) (:stipple (editable-field :format "Stipple: %v") set-face-stipple)) "Alist of face attributes. @@ -184,22 +265,15 @@ be changed.") '((:family (editable-field :format "Family: %v") custom-set-face-font-family) (:size (editable-field :format "Size: %v") - custom-set-face-font-size))) - - ;; Disable frame local faces. - (setq custom-relevant-frames nil) - (remove-hook 'after-make-frame-hook 'custom-initialize-frame)) + custom-set-face-font-size)))) ;;; Frames. -(and (fboundp 'make-face) - (make-face 'custom-face-empty)) - (defun custom-face-display-set (face spec &optional frame) "Set FACE to the attributes to the first matching entry in SPEC. Iff optional FRAME is non-nil, set it for that frame only. See `defface' for information about SPEC." - (when (fboundp 'copy-face) + (when (fboundp 'make-face) (while spec (let* ((entry (car spec)) (display (nth 0 entry)) @@ -208,7 +282,6 @@ See `defface' for information about SPEC." (when (custom-display-match-frame display frame) ;; Avoid creating frame local duplicates of the global face. (unless (and frame (eq display (get face 'custom-face-display))) - (copy-face 'custom-face-empty face frame) (apply 'custom-face-attribites-set face frame atts)) (unless frame (put face 'custom-face-display display)) @@ -241,6 +314,8 @@ examine the brightness for you." (specifier-instance (face-background 'default)))) (error nil))) + (or (string-match "XEmacs" emacs-version) + window-system) (< (apply '+ (x-color-values color)) (/ (apply '+ (x-color-values "white")) 3))) @@ -302,31 +377,29 @@ If FRAME is nil, the current FRAME is used." req options))))) match))) -(defvar custom-relevant-frames t - "List of frames whose custom properties differ from the default.") - (defun custom-relevant-frames () "List of frames whose custom properties differ from the default." - (when (eq custom-relevant-frames t) - (setq custom-relevant-frames nil) - (let ((default (custom-get-frame-properties)) - (frames (frame-list)) - frame) - (while frames - (setq frame (car frames) - frames (cdr frames)) - (unless (equal default (custom-get-frame-properties frame)) - (push frame custom-relevant-frames))))) - custom-relevant-frames) + (let ((relevant nil) + (default (custom-get-frame-properties)) + (frames (frame-list)) + frame) + (while frames + (setq frame (car frames) + frames (cdr frames)) + (unless (equal default (custom-get-frame-properties frame)) + (push frame relevant))) + relevant)) (defun custom-initialize-faces (&optional frame) "Initialize all custom faces for FRAME. If FRAME is nil or omitted, initialize them for all frames." - (mapatoms (lambda (symbol) - (let ((spec (or (get symbol 'saved-face) - (get symbol 'factory-face)))) - (when spec - (custom-face-display-set symbol spec frame)))))) + (mapcar (lambda (symbol) + (let ((spec (or (get symbol 'saved-face) + (get symbol 'factory-face)))) + (when spec + (custom-face-display-set symbol spec frame) + (initialize-face-resources symbol frame)))) + (face-list))) (defun custom-initialize-frame (&optional frame) "Initialize local faces for FRAME if necessary. @@ -335,14 +408,17 @@ If FRAME is missing or nil, the first member (frame-list) is used." (setq frame (car (frame-list)))) (unless (equal (custom-get-frame-properties) (custom-get-frame-properties frame)) - (custom-initialize-faces frame) - (push frame custom-relevant-frames))) + (custom-initialize-faces frame))) ;; Enable. This should go away when bundled with Emacs. -(add-hook 'after-make-frame-hook 'custom-initialize-frame) +(unless (string-match "XEmacs" emacs-version) + (add-hook 'after-make-frame-hook 'custom-initialize-frame)) ;;; Initializing. +(and (fboundp 'make-face) + (make-face 'custom-face-empty)) + ;;;###autoload (defun custom-set-faces (&rest args) "Initialize faces according to user preferences. @@ -363,6 +439,8 @@ See `defface' for the format of SPEC." (put face 'saved-face spec) (when now (put face 'force-face t) + (when (fboundp 'copy-face) + (copy-face 'custom-face-empty face)) (custom-face-display-set face spec)) (setq args (cdr args))) ;; Old format, a plist of FACE SPEC pairs. diff --git a/lisp/custom.el b/lisp/custom.el index e294fa082..cedc3b784 100644 --- a/lisp/custom.el +++ b/lisp/custom.el @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen ;; Keywords: help, faces -;; Version: 1.48 +;; Version: 1.55 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: diff --git a/lisp/gnus-group.el b/lisp/gnus-group.el index ff574d8aa..89def1b45 100644 --- a/lisp/gnus-group.el +++ b/lisp/gnus-group.el @@ -2168,7 +2168,9 @@ score file entries for articles to include in the group." (defun gnus-group-sort-groups (func &optional reverse) "Sort the group buffer according to FUNC. -If REVERSE, reverse the sorting order." +When used interactively, the sorting function used will be +determined by the `gnus-group-sort-function' variable. +If REVERSE (the prefix), reverse the sorting order." (interactive (list gnus-group-sort-function current-prefix-arg)) (funcall gnus-group-sort-alist-function (gnus-make-sort-function func) reverse) @@ -2579,7 +2581,7 @@ group line." (newsrc ;; Toggle subscription flag. (gnus-group-change-level - newsrc (if level level (if (<= (nth 1 (nth 2 newsrc)) + newsrc (if level level (if (<= (gnus-info-level (nth 2 newsrc)) gnus-level-subscribed) (1+ gnus-level-subscribed) gnus-level-default-subscribed))) diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index 96f3f275b..6145e4d20 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -6889,7 +6889,9 @@ delete these instead." ;; after all. (unless (memq (car articles) not-deleted) (gnus-summary-mark-article (car articles) gnus-canceled-mark)) - (setq articles (cdr articles)))) + (setq articles (cdr articles))) + (when not-deleted + (gnus-message 4 "Couldn't delete articles %s" not-deleted))) (gnus-summary-position-point) (gnus-set-mode-line 'summary) not-deleted)) @@ -6991,9 +6993,9 @@ groups." (let (gnus-mark-article-hook) (gnus-summary-select-article) (save-excursion - (set-buffer gnus-article-buffer) + (set-buffer gnus-original-article-buffer) (save-restriction - (gnus-narrow-to-body) + (message-narrow-to-head) (message "This message would go to %s" (mapconcat 'car (nnmail-article-group 'identity) ", ")))))) diff --git a/lisp/gnus.el b/lisp/gnus.el index 48616265e..cb7bff047 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -225,7 +225,7 @@ is restarted, and sometimes reloaded." :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) -(defconst gnus-version-number "5.4.18" +(defconst gnus-version-number "5.4.19" "Version number for this version of Gnus.") (defconst gnus-version (format "Gnus v%s" gnus-version-number) diff --git a/lisp/message.el b/lisp/message.el index 6076b214a..8d706ace1 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -1515,9 +1515,10 @@ The text will also be indented the normal way." (defun message-kill-buffer () "Kill the current buffer." (interactive) - (let ((actions message-kill-actions)) - (kill-buffer (current-buffer)) - (message-do-actions actions))) + (when (yes-or-no-p "Kill the buffer? ") + (let ((actions message-kill-actions)) + (kill-buffer (current-buffer)) + (message-do-actions actions)))) (defun message-bury (buffer) "Bury this mail buffer." @@ -3343,7 +3344,7 @@ which specify the range to operate on." ;;; Group name completion. (defvar message-newgroups-header-regexp - "^\\(Newsgroups\\|Followup-To\\|Posted-To\\):" + "^\\(Newsgroups\\|Followup-To\\|Posted-To\\|Gcc\\):" "Regexp that match headers that lists groups.") (defun message-tab () diff --git a/lisp/nnbabyl.el b/lisp/nnbabyl.el index 09056994d..55937fa75 100644 --- a/lisp/nnbabyl.el +++ b/lisp/nnbabyl.el @@ -333,6 +333,7 @@ (save-excursion (while (re-search-backward "^X-Gnus-Newsgroup: " beg t) (delete-region (point) (progn (forward-line 1) (point))))) + (nnmail-cache-insert (nnmail-fetch-field "message-id")) (setq result (car (nnbabyl-save-mail (if (stringp group) (list (cons group (nnbabyl-active-number group))) @@ -343,6 +344,7 @@ (goto-char (match-end 0)) (insert-buffer-substring buf) (when last + (nnmail-cache-insert (nnmail-fetch-field "message-id")) (save-buffer) (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file)) result)))) diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index 8523e43c3..6cc8b7a05 100644 --- a/lisp/nnfolder.el +++ b/lisp/nnfolder.el @@ -89,6 +89,7 @@ time saver for large mailboxes.") (defvoo nnfolder-group-alist nil) (defvoo nnfolder-buffer-alist nil) (defvoo nnfolder-scantime-alist nil) +(defvoo nnfolder-active-timestamp nil) @@ -134,8 +135,8 @@ time saver for large mailboxes.") (deffoo nnfolder-open-server (server &optional defs) (nnoo-change-server 'nnfolder server defs) - (when (not (file-exists-p nnfolder-directory)) - (gnus-make-directory nnfolder-directory)) + (nnmail-activate 'nnfolder t) + (gnus-make-directory nnfolder-directory) (cond ((not (file-exists-p nnfolder-directory)) (nnfolder-close-server) @@ -145,6 +146,7 @@ time saver for large mailboxes.") (nnfolder-close-server) (nnheader-report 'nnfolder "Not a directory: %s" nnfolder-directory)) (t + (nnmail-activate 'nnfolder) (nnheader-report 'nnfolder "Opened server %s using directory %s" server nnfolder-directory) t))) @@ -191,11 +193,11 @@ time saver for large mailboxes.") (point) (progn (end-of-line) (point))))))))))) (deffoo nnfolder-request-group (group &optional server dont-check) + (nnfolder-possibly-change-group group server) (save-excursion (nnmail-activate 'nnfolder) (if (not (assoc group nnfolder-group-alist)) (nnheader-report 'nnfolder "No such group: %s" group) - (nnfolder-possibly-change-group group server) (if dont-check (progn (nnheader-report 'nnfolder "Selected group %s" group) @@ -380,14 +382,17 @@ time saver for large mailboxes.") (forward-line -1) (while (re-search-backward (concat "^" nnfolder-article-marker) nil t) (delete-region (point) (progn (forward-line 1) (point)))) + (nnmail-cache-insert (nnmail-fetch-field "message-id")) (setq result (car (nnfolder-save-mail (if (stringp group) (list (cons group (nnfolder-active-number group))) (nnmail-article-group 'nnfolder-active-number)))))) - (save-excursion - (set-buffer nnfolder-current-buffer) - (and last (nnfolder-save-buffer)))) + (when last + (save-excursion + (nnfolder-possibly-change-folder group) + (nnfolder-save-buffer) + (nnmail-cache-close)))) (nnmail-save-active nnfolder-group-alist nnfolder-active-file) (unless result (nnheader-report 'nnfolder "Couldn't store article")) @@ -467,65 +472,51 @@ time saver for large mailboxes.") (point)) (point-max)))))) -;; When scanning, we're not looking t immediately switch into the group - if -;; we know our information is up to date, don't even bother reading the file. (defun nnfolder-possibly-change-group (group &optional server scanning) + ;; Change servers. (when (and server (not (nnfolder-server-opened server))) (nnfolder-open-server server)) - (when (and group (or nnfolder-current-buffer - (not (equal group nnfolder-current-group)))) - (gnus-make-directory (directory-file-name nnfolder-directory)) - (nnfolder-possibly-activate-groups nil) - (or (assoc group nnfolder-group-alist) - (not (file-exists-p - (nnfolder-group-pathname group))) - (progn - (push (list group (cons 1 0)) nnfolder-group-alist) - (nnmail-save-active nnfolder-group-alist nnfolder-active-file))) + ;; Change group. + (when (and group + (not (equal group nnfolder-current-group))) + (nnmail-activate 'nnfolder) + (when (and (not (assoc group nnfolder-group-alist)) + (not (file-exists-p + (nnfolder-group-pathname group)))) + ;; The group doesn't exist, so we create a new entry for it. + (push (list group (cons 1 0)) nnfolder-group-alist) + (nnmail-save-active nnfolder-group-alist nnfolder-active-file)) + (let (inf file) - (if (and (equal group nnfolder-current-group) - nnfolder-current-buffer - (buffer-name nnfolder-current-buffer)) - () - (setq nnfolder-current-group group) - - ;; If we have to change groups, see if we don't already have the mbox - ;; in memory. If we do, verify the modtime and destroy the mbox if - ;; needed so we can rescan it. - (when (setq inf (assoc group nnfolder-buffer-alist)) - (setq nnfolder-current-buffer (nth 1 inf))) - - ;; If the buffer is not live, make sure it isn't in the alist. If it - ;; is live, verify that nobody else has touched the file since last - ;; time. - (when (or (not (and nnfolder-current-buffer - (buffer-name nnfolder-current-buffer))) - (not (and (bufferp nnfolder-current-buffer) - (verify-visited-file-modtime - nnfolder-current-buffer)))) - (when (and nnfolder-current-buffer - (buffer-name nnfolder-current-buffer) - (bufferp nnfolder-current-buffer)) - (kill-buffer nnfolder-current-buffer)) - (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist)) - (setq inf nil)) - - (unless inf - (save-excursion - (setq file (nnfolder-group-pathname group)) - (unless (file-directory-p (file-truename file)) - (unless (file-exists-p file) - (gnus-make-directory (file-name-directory file)) - (nnmail-write-region 1 1 file t 'nomesg)) - (setq nnfolder-current-group group) - (setq nnfolder-current-buffer - (nnfolder-read-folder file scanning)) - (when nnfolder-current-buffer - (set-buffer nnfolder-current-buffer) - (push (list group nnfolder-current-buffer) - nnfolder-buffer-alist))))))) - (setq nnfolder-current-group group))) + ;; If we have to change groups, see if we don't already have the + ;; folder in memory. If we do, verify the modtime and destroy + ;; the folder if needed so we can rescan it. + (when (setq inf (assoc group nnfolder-buffer-alist)) + (setq nnfolder-current-buffer (nth 1 inf))) + + ;; If the buffer is not live, make sure it isn't in the alist. If it + ;; is live, verify that nobody else has touched the file since last + ;; time. + (when (and nnfolder-current-buffer + (not (gnus-buffer-live-p nnfolder-current-buffer))) + (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist) + nnfolder-current-buffer nil)) + + (setq nnfolder-current-group group) + + (when (or (not nnfolder-current-buffer) + (not (verify-visited-file-modtime nnfolder-current-buffer))) + (save-excursion + (setq file (nnfolder-group-pathname group)) + ;; See whether we need to create the new file. + (unless (file-exists-p file) + (gnus-make-directory (file-name-directory file)) + (nnmail-write-region 1 1 file t 'nomesg)) + (when (setq nnfolder-current-buffer (nnfolder-read-folder group)) + (set-buffer nnfolder-current-buffer) + (push (list group nnfolder-current-buffer) + nnfolder-buffer-alist))))))) (defun nnfolder-save-mail (group-art-list) "Called narrowed to an article." @@ -550,35 +541,28 @@ time saver for large mailboxes.") (run-hooks 'nnfolder-prepare-save-mail-hook) ;; Insert the mail into each of the destination groups. - (while group-art-list - (setq group-art (car group-art-list) - group-art-list (cdr group-art-list)) - - ;; Kill the previous newsgroup markers. + (while (setq group-art (pop group-art-list)) + ;; Kill any previous newsgroup markers. (goto-char (point-min)) (search-forward "\n\n" nil t) (forward-line -1) (while (search-backward (concat "\n" nnfolder-article-marker) nil t) (delete-region (1+ (point)) (progn (forward-line 2) (point)))) - (nnfolder-possibly-change-group (car group-art)) ;; Insert the new newsgroup marker. (nnfolder-insert-newsgroup-line group-art) - (unless nnfolder-current-buffer - (nnfolder-close-group (car group-art)) - (nnfolder-request-create-group (car group-art)) - (nnfolder-possibly-change-group (car group-art))) - (let ((beg (point-min)) - (end (point-max)) - (obuf (current-buffer))) - (set-buffer nnfolder-current-buffer) - (goto-char (point-max)) - (unless (eolp) - (insert "\n")) - (unless (bobp) - (insert "\n")) - (insert-buffer-substring obuf beg end) - (set-buffer obuf))) + + (save-excursion + (let ((beg (point-min)) + (end (point-max)) + (obuf (current-buffer))) + (nnfolder-possibly-change-folder (car group-art)) + (goto-char (point-max)) + (unless (eolp) + (insert "\n")) + (unless (bobp) + (insert "\n")) + (insert-buffer-substring obuf beg end)))) ;; Did we save it anywhere? save-list)) @@ -591,15 +575,6 @@ time saver for large mailboxes.") (insert (format (concat nnfolder-article-marker "%d %s\n") (cdr group-art) (current-time-string)))))) -(defun nnfolder-possibly-activate-groups (&optional group) - (save-excursion - ;; If we're looking for the activation of a specific group, find out - ;; its real name and switch to it. - (when group - (nnfolder-possibly-change-group group)) - ;; If the group alist isn't active, activate it now. - (nnmail-activate 'nnfolder))) - (defun nnfolder-active-number (group) ;; Find the next article number in GROUP. (let ((active (cadr (assoc group nnfolder-group-alist)))) @@ -612,6 +587,17 @@ time saver for large mailboxes.") nnfolder-group-alist)) (cdr active))) +(defun nnfolder-possibly-change-folder (group) + (let ((inf (assoc group nnfolder-buffer-alist))) + (if (and inf + (gnus-buffer-live-p (cadr inf))) + (set-buffer (cadr inf)) + (when inf + (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist))) + (when nnfolder-group-alist + (nnmail-save-active nnfolder-group-alist nnfolder-active-file)) + (push (list group (nnfolder-read-folder group)) + nnfolder-buffer-alist)))) ;; This method has a problem if you've accidentally let the active list get ;; out of sync with the files. This could happen, say, if you've @@ -628,36 +614,27 @@ time saver for large mailboxes.") ;; shouldn't cost us much extra time at all, but will be a lot less ;; vulnerable to glitches between the mbox and the active file. -(defun nnfolder-read-folder (file &optional scanning) - ;; This is an attempt at a serious shortcut - don't even read in the file - ;; if we know we've seen it since the last time it was touched. - (let ((scantime (cadr (assoc nnfolder-current-group - nnfolder-scantime-alist))) - (modtime (nth 5 (file-attributes file)))) - (if (and scanning scantime - (eq (car scantime) (car modtime)) - (eq (cdr scantime) (cadr modtime))) - nil +(defun nnfolder-read-folder (group) + (let* ((file (nnfolder-group-pathname group)) + (buffer (set-buffer (nnheader-find-file-noselect file)))) + (if (equal (cadr (assoc group nnfolder-scantime-alist)) + (nth 5 (file-attributes file))) + ;; This looks up-to-date, so we don't do any scanning. + buffer + ;; Parse the damn thing. (save-excursion - (nnfolder-possibly-activate-groups nil) + (nnmail-activate 'nnfolder) ;; Read in the file. - (set-buffer (setq nnfolder-current-buffer - (nnheader-find-file-noselect file))) - (buffer-disable-undo (current-buffer)) - (setq buffer-read-only nil) - ;; If the file hasn't been touched since the last time we scanned it, - ;; don't bother doing anything with it. (let ((delim (concat "^" message-unix-mail-delimiter)) (marker (concat "\n" nnfolder-article-marker)) (number "[0-9]+") - (active (or (cadr (assoc nnfolder-current-group - nnfolder-group-alist)) - (cons 1 0))) - (scantime (assoc nnfolder-current-group nnfolder-scantime-alist)) + (active (cadr (assoc group nnfolder-group-alist))) + (scantime (assoc group nnfolder-scantime-alist)) (minid (lsh -1 -1)) - maxid start end newscantime) - - (setq maxid (or (cdr active) 0)) + maxid start end newscantime + buffer-read-only) + (buffer-disable-undo (current-buffer)) + (setq maxid (cdr active)) (goto-char (point-min)) ;; Anytime the active number is 1 or 0, it is suspect. In that @@ -692,10 +669,9 @@ time saver for large mailboxes.") ;; Keep track of the active number on our own, and insert it back ;; into the active list when we're done. Also, prime the pump to ;; cut down on the number of searches we do. + (unless (nnmail-search-unix-mail-delim) + (goto-char (point-max))) (setq end (point-marker)) - (set-marker end (or (and (nnmail-search-unix-mail-delim) - (point)) - (point-max))) (while (not (= end (point-max))) (setq start (marker-position end)) (goto-char end) @@ -703,9 +679,9 @@ time saver for large mailboxes.") ;; them. (while (looking-at delim) (forward-line 1)) - (set-marker end (or (and (nnmail-search-unix-mail-delim) - (point)) - (point-max))) + (set-marker end (if (nnmail-search-unix-mail-delim) + (point) + (point-max))) (goto-char start) (when (not (search-forward marker end t)) (narrow-to-region start end) @@ -714,6 +690,7 @@ time saver for large mailboxes.") (cons nil (nnfolder-active-number nnfolder-current-group))) (widen))) + (set-marker end nil) ;; Make absolutely sure that the active list reflects reality! (nnmail-save-active nnfolder-group-alist nnfolder-active-file) ;; Set the scantime for this group. diff --git a/lisp/nnmail.el b/lisp/nnmail.el index 29675e4db..5079765d3 100644 --- a/lisp/nnmail.el +++ b/lisp/nnmail.el @@ -347,7 +347,7 @@ GROUP: Mail will be stored in GROUP (a string). FIELD must match a complete field name. VALUE must match a complete word according to the `nnmail-split-fancy-syntax-table' syntax table. -You can use .* in the regexps to match partial field names or words. +You can use \".*\" in the regexps to match partial field names or words. FIELD and VALUE can also be lisp symbols, in that case they are expanded as specified in `nnmail-split-abbrev-alist'. @@ -581,7 +581,15 @@ parameter. It should return nil, `warn' or `delete'." (buffer-disable-undo errors) (let ((default-directory "/")) (if (nnheader-functionp nnmail-movemail-program) - (funcall nnmail-movemail-program inbox tofile) + (condition-case err + (progn + (funcall nnmail-movemail-program inbox tofile) + (setq result 0)) + (error + (save-excursion + (set-buffer errors) + (insert (prin1-to-string err)) + (setq result 255)))) (setq result (apply 'call-process @@ -1342,19 +1350,8 @@ See the documentation for the variable `nnmail-split-fancy' for documentation." (save-excursion (or (eq timestamp 'none) (set (intern (format "%s-active-timestamp" backend)) -;;; dmoore@ucsd.edu 25.10.96 -;;; it's not always the case that current-time -;;; does correspond to changes in the file's time. So just compare -;;; the file's new time against its own previous time. -;;; (current-time) - file-time - )) - (funcall (intern (format "%s-request-list" backend))) -;;; dmoore@ucsd.edu 25.10.96 -;;; BACKEND-request-list already does this itself! -;;; (set (intern (format "%s-group-alist" backend)) -;;; (nnmail-get-active)) - )) + file-time)) + (funcall (intern (format "%s-request-list" backend))))) t)) (defun nnmail-message-id () @@ -1402,11 +1399,12 @@ See the documentation for the variable `nnmail-split-fancy' for documentation." nnmail-message-id-cache-file nil 'silent) (set-buffer-modified-p nil) (setq nnmail-cache-buffer nil) - ;;(kill-buffer (current-buffer)) - ))) + (kill-buffer (current-buffer))))) (defun nnmail-cache-insert (id) (when nnmail-treat-duplicates + (unless (gnus-buffer-live-p nnmail-cache-buffer) + (nnmail-cache-open)) (save-excursion (set-buffer nnmail-cache-buffer) (goto-char (point-max)) @@ -1419,6 +1417,12 @@ See the documentation for the variable `nnmail-split-fancy' for documentation." (goto-char (point-max)) (search-backward id nil t)))) +(defun nnmail-fetch-field (header) + (save-excursion + (save-restriction + (message-narrow-to-head) + (message-fetch-field header)))) + (defun nnmail-check-duplication (message-id func artnum-func) (run-hooks 'nnmail-prepare-incoming-message-hook) ;; If this is a duplicate message, then we do not save it. @@ -1444,7 +1448,8 @@ See the documentation for the variable `nnmail-split-fancy' for documentation." ((eq action 'warn) ;; We insert a warning. (let ((case-fold-search t) - (newid (nnmail-message-id))) + (newid (concat "<" (message-unique-id) + "@duplicate-message-id>"))) (goto-char (point-min)) (when (re-search-forward "^message-id[ \t]*:" nil t) (beginning-of-line) diff --git a/lisp/nnmbox.el b/lisp/nnmbox.el index e9457a276..4bfb0b27a 100644 --- a/lisp/nnmbox.el +++ b/lisp/nnmbox.el @@ -304,6 +304,7 @@ (forward-line -1) (while (re-search-backward "^X-Gnus-Newsgroup: " nil t) (delete-region (point) (progn (forward-line 1) (point)))) + (nnmail-cache-insert (nnmail-fetch-field "message-id")) (setq result (nnmbox-save-mail (if (stringp group) (list (cons group (nnmbox-active-number group))) @@ -312,9 +313,10 @@ (set-buffer nnmbox-mbox-buffer) (goto-char (point-max)) (insert-buffer-substring buf) - (and last (save-buffer)) - result) - (nnmail-save-active nnmbox-group-alist nnmbox-active-file)) + (when last + (nnmail-cache-close) + (nnmail-save-active nnmbox-group-alist nnmbox-active-file) + (save-buffer)))) (car result))) (deffoo nnmbox-request-replace-article (article group buffer) diff --git a/lisp/nnmh.el b/lisp/nnmh.el index dda5cabc0..71bbbbf0d 100644 --- a/lisp/nnmh.el +++ b/lisp/nnmh.el @@ -290,6 +290,7 @@ (deffoo nnmh-request-accept-article (group &optional server last noinsert) (nnmh-possibly-change-directory group server) (nnmail-check-syntax) + (nnmail-save-active nnml-group-alist nnml-active-file) (if (stringp group) (and (nnmail-activate 'nnmh) @@ -299,7 +300,9 @@ (and (nnmail-activate 'nnmh) (car (nnmh-save-mail (nnmail-article-group 'nnmh-active-number) - noinsert))))) + noinsert)))) + (when last + (nnmail-cache-close))) (deffoo nnmh-request-replace-article (article group buffer) (nnmh-possibly-change-directory group) diff --git a/lisp/nnml.el b/lisp/nnml.el index 1e88d0fa5..1c92ed35d 100644 --- a/lisp/nnml.el +++ b/lisp/nnml.el @@ -313,6 +313,7 @@ all. This may very well take some time.") (nnml-possibly-change-directory group server) (nnmail-check-syntax) (let (result) + (nnmail-cache-insert (nnmail-fetch-field "message-id")) (if (stringp group) (and (nnmail-activate 'nnml) @@ -325,9 +326,10 @@ all. This may very well take some time.") (nnmail-activate 'nnml) (setq result (car (nnml-save-mail (nnmail-article-group 'nnml-active-number)))) - (progn + (when last (nnmail-save-active nnml-group-alist nnml-active-file) - (and last (nnml-save-nov))))) + (nnmail-cache-close) + (nnml-save-nov)))) result)) (deffoo nnml-request-replace-article (article group buffer) diff --git a/lisp/nntp.el b/lisp/nntp.el index 7d7f25693..36023f632 100644 --- a/lisp/nntp.el +++ b/lisp/nntp.el @@ -820,7 +820,8 @@ This function is supposed to be called from `nntp-server-opened-hook'." (save-excursion (set-buffer (or (nntp-find-connection-buffer nntp-server-buffer) nntp-server-buffer)) - (let ((len (/ (point-max) 1024))) + (let ((len (/ (point-max) 1024)) + message-log-max) (unless (< len 10) (setq nntp-have-messaged t) (nnheader-message 7 "nntp read: %dk" len))) diff --git a/lisp/smiley.el b/lisp/smiley.el index db37f6079..537aa6c18 100644 --- a/lisp/smiley.el +++ b/lisp/smiley.el @@ -49,14 +49,15 @@ :type 'directory :group 'smiley) -;; Notice the subtle differences in the regular expressions in the two alists below +;; Notice the subtle differences in the regular expressions in the +;; two alists below. (defcustom smiley-deformed-regexp-alist '(("\\(:-*[<«]+\\)\\W" 1 "FaceAngry.xpm") ("\\(:-+\\]+\\)\\W" 1 "FaceGoofy.xpm") ("\\(:-*D\\)\\W" 1 "FaceGrinning.xpm") - ("\\(:-*[)>}»]+\\)\\W" 1 "FaceHappy.xpm") - ("\\(:-*[/\\\"]\\)[^/]" 1 "FaceIronic.xpm") + ("\\(:-*[)>}»]+\\)\\W" 1 "FaceHappy.xpm") + ("\\(:-*[/\\\"]\\)[^/]\\W" 1 "FaceIronic.xpm") ("\\([8|]-*[|Oo%]\\)\\W" 1 "FaceKOed.xpm") ("\\([:|]-*#+\\)\\W" 1 "FaceNyah.xpm") ("\\(:-*[({]+\\)\\W" 1 "FaceSad.xpm") @@ -99,9 +100,9 @@ (defcustom smiley-regexp-alist smiley-deformed-regexp-alist "A list of regexps to map smilies to real images. -Defaults to the content of smiley-deformed-regexp-alist. -An alternative smiley-nosey-regexp-alist that -matches less aggressively is available. +Defaults to the contents of `smiley-deformed-regexp-alist'. +An alternative is `smiley-nosey-regexp-alist' that matches less +aggressively. If this is a symbol, take its value." :type '(radio (variable-item smiley-deformed-regexp-alist) (variable-item smiley-nosey-regexp-alist) @@ -144,7 +145,7 @@ above them." (defvar smiley-running-xemacs (string-match "XEmacs" emacs-version)) (defvar smiley-map (make-sparse-keymap "smiley-keys") - "keymap to toggle smiley states") + "Keymap to toggle smiley states.") (define-key smiley-map [(button2)] 'smiley-toggle-extent) diff --git a/lisp/wid-browse.el b/lisp/wid-browse.el index d076acee7..ab21c6254 100644 --- a/lisp/wid-browse.el +++ b/lisp/wid-browse.el @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen ;; Keywords: extensions -;; Version: 1.48 +;; Version: 1.55 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el index d7145d0c7..3cf5d40ae 100644 --- a/lisp/wid-edit.el +++ b/lisp/wid-edit.el @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen ;; 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." diff --git a/lisp/widget.el b/lisp/widget.el index ca796f7ec..4be290848 100644 --- a/lisp/widget.el +++ b/lisp/widget.el @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen ;; Keywords: help, extensions, faces, hypermedia -;; Version: 1.48 +;; Version: 1.55 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: diff --git a/texi/ChangeLog b/texi/ChangeLog index 51e290d56..fe0eccaf1 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,7 @@ +Thu Mar 6 08:01:37 1997 Lars Magne Ingebrigtsen + + * gnus.texi (Mail and Procmail): Fix. + Sun Mar 2 02:08:40 1997 Lars Magne Ingebrigtsen * gnus.texi (Startup Files): Addition. diff --git a/texi/custom.texi b/texi/custom.texi index dd81a1da6..f7deb8cfa 100644 --- a/texi/custom.texi +++ b/texi/custom.texi @@ -13,7 +13,7 @@ @comment node-name, next, previous, up @top The Customization Library -Version: 1.48 +Version: 1.55 @menu * Introduction:: @@ -546,21 +546,21 @@ defined:@refill @table @code @item type -(the value of (window-system))@br +(the value of (window-system))@* Should be one of @code{x} or @code{tty}. @item class -(the frame's color support)@br +(the frame's color support)@* Should be one of @code{color}, @code{grayscale}, or @code{mono}. @item background -(what color is used for the background text)@br +(what color is used for the background text)@* Should be one of @code{light} or @code{dark}. @end table Internally, custom uses the symbol property @code{factory-face} for the program specified default face properties, @code{saved-face} for -properties saved by the user, and @code{face-documentation} for the +properties saved by the user, and @code{face-doc-string} for the documentation string.@refill @end defun diff --git a/texi/gnus.texi b/texi/gnus.texi index c629e827b..a029d6081 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -9002,8 +9002,8 @@ Gnus to split the mail the normal way, you could set If you use @code{procmail} to split things directory into an @code{nnmh} directory (which you shouldn't do), you should set @code{nnmail-keep-last-article} to non-@code{nil} to prevent Gnus from -ever expiring the final article in a mail newsgroup. This is quite, -quite important. +ever expiring the final article (i. e., the article with the highest +article number) in a mail newsgroup. This is quite, quite important. Here's an example setup: The incoming spools are located in @file{~/incoming/} and have @samp{""} as suffixes (i. e., the incoming @@ -13831,6 +13831,7 @@ Jack Vinson. Also thanks to the following for patches and stuff: +Adrian Aichner, Peter Arius, Marc Auslander, Chris Bone, @@ -13841,6 +13842,7 @@ Martin Buchholz, Kevin Buhr, Alastair Burt, Joao Cachopo, +Zlatko Calusic, Massimo Campostrini, Michael R. Cook, Glenn Coombs, @@ -13868,17 +13870,20 @@ Rajappa Iyer, Randell Jesup, Fred Johansen, Greg Klanderman, +Karl Kleinpaste, Peter Skov Knudsen, Shuhei Kobayashi, @c Kobayashi Thor Kristoffersen, Jens Lautenbacher, Carsten Leonhardt, +James LewisMoss, Christian Limpach, Markus Linnala, Dave Love, Tonny Madsen, Shlomo Mahlab, Nat Makarevitch, +David Martin, Timo Metzemakers, Richard Mlynarik, Lantz Moore, diff --git a/texi/widget.texi b/texi/widget.texi index 4726707fc..133729eab 100644 --- a/texi/widget.texi +++ b/texi/widget.texi @@ -1,6 +1,6 @@ \input texinfo.tex -@c $Id: widget.texi,v 3.60 1997/03/05 06:00:44 larsi Exp $ +@c $Id: widget.texi,v 1.83 1997/03/05 16:43:09 abraham Exp $ @c %**start of header @setfilename widget @@ -15,7 +15,7 @@ @comment node-name, next, previous, up @top The Emacs Widget Library -Version: 1.48 +Version: 1.55 @menu * Introduction:: @@ -401,7 +401,7 @@ The inserted text will be read only. There is a standard widget keymap which you might find useful. @defvr Const widget-keymap -A keymap with the global keymap as its parent.@br +A keymap with the global keymap as its parent.@* @key{TAB} and @kbd{C-@key{TAB}} are bound to @code{widget-forward} and @code{widget-backward}, respectively. @kbd{@key{RET}} and @kbd{mouse-2} are bound to @code{widget-button-press} and @@ -635,7 +635,7 @@ The following extra properties are recognized. @table @code @item :size -The width of the editable field.@br +The width of the editable field.@* By default the field will reach to the end of the line. @item :value-face diff --git a/todo b/todo new file mode 100644 index 000000000..de2e2c958 --- /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: + + + + +http://www.uwsg.indiana.edu/hypermail/linux/kernel/9610/index.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 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: +* 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 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 +* 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 +(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 RET' add label to current message. +`M u RET' remove label from current message. +`/ l RET' limit summary buffer according to . + + 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 + + + +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 -- 2.25.1