From 83d6770a1205b9dbfe3929dcc4e6331b79795d76 Mon Sep 17 00:00:00 2001 From: yamaoka Date: Sun, 4 Jan 2004 06:06:53 +0000 Subject: [PATCH] Import Gnus v5.10.5. --- ChangeLog | 9 + GNUS-NEWS | 12 +- etc/gnus-tut.txt | 1597 +------------------------------------------------- lisp/ChangeLog | 48 ++ lisp/gnus-agent.el | 2 + lisp/gnus-art.el | 13 +- lisp/gnus-dired.el | 2 +- lisp/gnus-fun.el | 4 +- lisp/gnus-msg.el | 20 +- lisp/gnus-nocem.el | 2 +- lisp/gnus-sum.el | 14 +- lisp/gnus.el | 22 +- lisp/mail-source.el | 3 +- lisp/message.el | 20 +- lisp/mm-decode.el | 50 +- lisp/spam-report.el | 20 +- lisp/spam.el | 377 ++++++------ texi/ChangeLog | 20 + texi/emacs-mime.texi | 16 + texi/gnus-faq.texi | 26 +- texi/gnus.texi | 65 +- texi/message.texi | 11 +- 22 files changed, 493 insertions(+), 1860 deletions(-) diff --git a/ChangeLog b/ChangeLog index 59104b9..1f1ce0c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2004-01-03 Reiner Steib + + * GNUS-NEWS: Update copyright. + + * etc/gnus-tut.txt (Gnus FAQ): Remove text version. Refer to info + documentation and online version instead. + + * GNUS-NEWS: Changed "Dired integration" + 2004-01-02 Reiner Steib * GNUS-NEWS: Add `gnus-group-read-ephemeral-group'. diff --git a/GNUS-NEWS b/GNUS-NEWS index eb74175..b891063 100644 --- a/GNUS-NEWS +++ b/GNUS-NEWS @@ -1,5 +1,5 @@ GNUS NEWS -- history of user-visible changes. -Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. See the end for copying conditions. Please send Gnus bug reports to bugs@gnus.org. @@ -34,12 +34,12 @@ variables `gnus-button-*-level' can be used to control the appearance of all article buttons, see the info node "Article Button Levels". ** Dired integration -`gnus-dired-minor-mode' installs key bindings in dired buffers to send -a file as an attachment (`C-c C-a'), open a file using the approriate -mailcap entry (`C-c C-l'), and print a file using the mailcap entry -(`C-c P'). It is enabled with - (add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode) +`gnus-dired-minor-mode' installs key bindings in dired buffers to send a file +as an attachment (`C-c C-m C-a'), open a file using the approriate mailcap +entry (`C-c C-m C-l'), and print a file using the mailcap entry (`C-c C-m +C-p'). See the info node "Other modes". + ** Gnus can display RSS newsfeeds as a newsgroup. To get started do `B nnrss RET RET' in the Group buffer. diff --git a/etc/gnus-tut.txt b/etc/gnus-tut.txt index 7eecfcd..f377589 100644 --- a/etc/gnus-tut.txt +++ b/etc/gnus-tut.txt @@ -296,1594 +296,23 @@ is where to post the questions. From fschmitt Sat Mar 22 18:13:00 2003 From: faq@my.gnus.org (Gnus FAQ team) Date: Sat Mar 22 18:13:00 2003 -Subject: Gnus FAQ -Message-ID: - -This is the text version of the Gnus FAQ, see http://my.gnus.org for -the up to date version of this document, there you can also find a -html version and various other formats. There's also a texinfo version -of the FAQ distributed with Gnus. - -Table of Contents - -Introduction -Frequently Asked Questions with Answers -Glossary - -Abstract - -This is the new Gnus Frequently Asked Questions list. If you have a -Web browser, the official hypertext version is at http:// -my.gnus.org/FAQ/ [http://my.gnus.org/FAQ/], the Docbook source is -available from http://sourceforge.net [http://sourceforge.net/ -projects/gnus/]. - -Please submit features and suggestions to the FAQ discussion list -[mailto:faq-discuss@my.gnus.org]. The list is protected against -junk mail with qconfirm [http://smarden.org/qconfirm/index.html]. -As a subscriber, your submissions will automatically pass. You can -also subscribe to the list by sending a blank email to -faq-discuss-subscribe@my.gnus.org -[mailto:faq-discuss-subscribe@my.gnus.org] and browse the archive. - -Introduction - -This is the Gnus Frequently Asked Questions list. - -Gnus is a Usenet Newsreader and Electronic Mail User Agent -implemented as a part of Emacs. It's been around in some form for -almost a decade now, and has been distributed as a standard part of -Emacs for much of that time. Gnus 5 is the latest (and greatest) -incarnation. The original version was called GNUS, and was written -by Masanobu UMEDA. When autumn crept up in '94, Lars Magne -Ingebrigtsen grew bored and decided to rewrite Gnus. - -Its biggest strength is the fact that it is extremely customizable. -It is somewhat intimidating at first glance, but most of the -complexity can be ignored until you're ready to take advantage of -it. If you receive a reasonable volume of e-mail (you're on various -mailing lists), or you would like to read high-volume mailing lists -but cannot keep up with them, or read high volume newsgroups or are -just bored, then Gnus is what you want. - -This FAQ was maintained by Justin Sheehy until March 2002. He would -like to thank Steve Baur and Per Abrahamsen for doing a wonderful -job with this FAQ before him. We would like to do the same - -thanks, Justin! - -If you have a Web browser, the official hypertext version is at: -http://my.gnus.org/FAQ/ [http://my.gnus.org/FAQ/]. This version is -much nicer than the unofficial hypertext versions that are archived -at Utrecht, Oxford, Smart Pages, Ohio State, and other FAQ -archives. See the resources question below if you want information -on obtaining it in another format. - -The information contained here was compiled with the assistance of -the Gnus development mailing list, and any errors or misprints are -the my.gnus.org team's fault, sorry. - -Frequently Asked Questions with Answers - -1. Installation FAQ - - 1.1. What is the latest version of Gnus? - 1.2. What's new in 5.10.0? - 1.3. Where and how to get Gnus? - 1.4. What to do with the tarball now? - 1.5. Which version of Emacs do I need? - 1.6. How do I run Gnus on both Emacs and XEmacs? - -2. Startup / Group buffer - - 2.1. Every time I start Gnus I get a message "Gnus auto-save - file exists. Do you want to read it?", what does this mean - and how to prevent it? - 2.2. Gnus doesn't remember which groups I'm subscribed to, - what's this? - 2.3. How to change the format of the lines in Group buffer? - 2.4. My group buffer becomes a bit crowded, is there a way to - sort my groups into categories so I can easier browse - through them? - 2.5. How to manually sort the groups in Group buffer? How to - sort the groups in a topic? - -3. Getting Messages - - 3.1. I just installed Gnus, started it via M-x gnus but it only - says "nntp (news) open error", what to do? - 3.2. I'm working under Windows and have no idea what ~/.gnus - means. - 3.3. My news server requires authentication, how to store user - name and password on disk? - 3.4. Gnus seems to start up OK, but I can't find out how to - subscribe to a group. - 3.5. Gnus doesn't show all groups / Gnus says I'm not allowed - to post on this server as well as I am, what's that? - 3.6. I want Gnus to fetch news from several servers, is this - possible? - 3.7. And how about local spool files? - 3.8. OK, reading news works now, but I want to be able to read - my mail with Gnus, too. How to do it? - 3.9. And what about IMAP? - 3.10. At the office we use one of those MS Exchange servers, - can I use Gnus to read my mail from it? - 3.11. Can I tell Gnus not to delete the mails on the server it - retrieves via POP3? - -4. Reading messages - - 4.1. When I enter a group, all read messages are gone. How to - view them again? - 4.2. How to tell Gnus to show an important message every time I - enter a group, even when it's read? - 4.3. How to view the headers of a message? - 4.4. How to view the raw unformatted message? - 4.5. How can I change the headers Gnus displays by default at - the top of the article buffer? - 4.6. I'd like Gnus NOT to render HTML-mails but show me the - text part if it's available. How to do it? - 4.7. Can I use some other browser than w3 to render my - HTML-mails? - 4.8. Is there anything I can do to make poorly formatted mails - more readable? - 4.9. Is there a way to automatically ignore posts by specific - authors or with specific words in the subject? And can I - highlight more interesting ones in some way? - 4.10. How can I disable threading in some (e.g. mail-) groups, - or set other variables specific for some groups? - 4.11. Can I highlight messages written by me and follow-ups to - those? - 4.12. The number of total messages in a group which Gnus - displays in group buffer is by far to high, especially in - mail groups. Is this a bug? - 4.13. I don't like the layout of summary and article buffer, - how to change it? Perhaps even a three pane display? - 4.14. I don't like the way the Summary buffer looks, how to - tweak it? - 4.15. How to split incoming mails in several groups? - -5. Composing messages - - 5.1. What are the basic commands I need to know for sending - mail and postings? - 5.2. How to enable automatic word-wrap when composing messages? - 5.3. How to set stuff like From, Organization, Reply-To, - signature...? - 5.4. Can I set things like From, Signature etc group based on - the group I post too? - 5.5. Is there a spell-checker? Perhaps even on-the-fly - spell-checking? - 5.6. Can I set the dictionary based on the group I'm posting - to? - 5.7. Is there some kind of address-book, so I needn't remember - all those email addresses? - 5.8. Sometimes I see little images at the top of article - buffer. What's that and how can I send one with my - postings, too? - 5.9. Sometimes I accidentally hit r instead of f in newsgroups. - Can Gnus warn me, when I'm replying by mail in newsgroups? - 5.10. How to tell Gnus not to generate a sender header? - 5.11. I want gnus to locally store copies of my send mail and - news, how to do it? - 5.12. People tell me my Message-IDs are not correct, why aren't - they and how to fix it? - -6. Old messages - - 6.1. How to import my old mail into Gnus? - 6.2. How to archive interesting messages? - 6.3. How to search for a specific message? - 6.4. How to get rid of old unwanted mail? - 6.5. I want that all read messages are expired (at least in - some groups). How to do it? - 6.6. I don't want expiration to delete my mails but to move - them to another group. - -7. Gnus in a dial-up environment - - 7.1. I don't have a permanent connection to the net, how can I - minimize the time I've got to be connected? - 7.2. So what was this thing about the Agent? - 7.3. I want to store article bodies on disk, too. How to do it? - 7.4. How to tell Gnus not to try to send mails / postings while - I'm offline? - -8. Getting help - - 8.1. How to find information and help inside Emacs? - 8.2. I can't find anything in the Gnus manual about X (e.g. - attachments, PGP, MIME...), is it not documented? - 8.3. Which websites should I know? - 8.4. Which mailing lists and newsgroups are there? - 8.5. Where to report bugs? - 8.6. I need real-time help, where to find it? - -9. Tuning Gnus - - 9.1. Starting Gnus is really slow, how to speed it up? - 9.2. How to speed up the process of entering a group? - 9.3. Sending mail becomes slower and slower, what's up? - -1. Installation FAQ - -1.1. What is the latest version of Gnus? - - Jingle please: Gnus 5.10.0 is released, get it while it's hot! As - well as the step in version number is rather small, Gnus 5.10 has - tons of new features which you shouldn't miss, however if you are - cautious, you might prefer to stay with 5.8.8 respectively 5.9 - (they are basically the same) until some bugfix releases are out. - -1.2. What's new in 5.10.0? - - First of all, you should have a look into the file GNUS-NEWS in the - toplevel directory of the Gnus tarball, there the most important - changes are listed. Here's a short list of the changes I find - especially important/interesting: - - * Major rewrite of the Gnus agent, Gnus agent is now active by - default. - - Many new article washing functions for dealing with ugly - formatted articles. - - Anti Spam features. - - message-utils now included in Gnus. - - New format specifiers for summary lines, e.g. %B for a complex - trn-style thread tree. - -1.3. Where and how to get Gnus? - - The latest released version of Gnus isn't included in Emacs 21 and - until now it also isn't available through the package system of - XEmacs 21.4, therefor you should get the Gnus tarball from http:// - www.gnus.org/dist/gnus.tar.gz [http://www.gnus.org/dist/ - gnus.tar.gz] or via anonymous FTP from ftp://ftp.gnus.org/pub/gnus/ - gnus.tar.gz [ftp://ftp.gnus.org/pub/gnus/gnus.tar.gz]. - -1.4. What to do with the tarball now? - - Untar it via tar xvzf gnus.tar.gz and do the common ./configure; - make; make install circle. (under MS-Windows either get the Cygwin - environment from http://www.cygwin.com [http://www.cygwin.com] - which allows you to do what's described above or unpack the tarball - with some packer (e.g. Winace from http://www.winace.com [http:// - www.winace.com]) and use the batch-file make.bat included in the - tarball to install Gnus. If you don't want to (or aren't allowed - to) install Gnus system-wide, you can install it in your home - directory and add the following lines to your ~/.xemacs/init.el or - ~/.emacs: - - (add-to-list 'load-path "/path/to/gnus/lisp") - (if (featurep 'xemacs) - (add-to-list 'Info-directory-list "/path/to/gnus/texi/") - (add-to-list 'Info-default-directory-list "/path/to/gnus/texi/")) - - - Make sure that you don't have any gnus related stuff before this - line, on MS Windows use something like "C:/path/to/lisp" (yes, "/ - "). - -1.5. Which version of Emacs do I need? - - Gnus 5.10.0 requires an Emacs version that is greater than or equal - to Emacs 20.7 or XEmacs 21.1. - -1.6. How do I run Gnus on both Emacs and XEmacs? - - You can't use the same copy of Gnus in both as the Lisp files are - byte-compiled to a format which is different depending on which - Emacs did the compilation. Get one copy of Gnus for Emacs and one - for XEmacs. - -2. Startup / Group buffer - -2.1. Every time I start Gnus I get a message "Gnus auto-save file - exists. Do you want to read it?", what does this mean and how to - prevent it? - - This message means that the last time you used Gnus, it wasn't - properly exited and therefor couldn't write its informations to - disk (e.g. which messages you read), you are now asked if you want - to restore those informations from the auto-save file. - - To prevent this message make sure you exit Gnus via q in group - buffer instead of just killing Emacs. - -2.2. Gnus doesn't remember which groups I'm subscribed to, what's this? - - You get the message described in the q/a pair above while starting - Gnus, right? It's an other symptom for the same problem, so read - the answer above. - -2.3. How to change the format of the lines in Group buffer? - - You've got to tweak the value of the variable - gnus-group-line-format. See the manual node "Group Line - Specification" for information on how to do this. An example for - this (guess from whose .gnus :-)): - - (setq gnus-group-line-format "%P%M%S[%5t]%5y : %(%g%)\n") - - -2.4. My group buffer becomes a bit crowded, is there a way to sort my - groups into categories so I can easier browse through them? - - Gnus offers the topic mode, it allows you to sort your groups in, - well, topics, e.g. all groups dealing with Linux under the topic - linux, all dealing with music under the topic music and all dealing - with scottish music under the topic scottish which is a subtopic of - music. - - To enter topic mode, just hit t while in Group buffer. Now you can - use T n to create a topic at point and T m to move a group to a - specific topic. For more commands see the manual or the menu. You - might want to include the %P specifier at the beginning of your - gnus-group-line-format variable to have the groups nicely indented. - -2.5. How to manually sort the groups in Group buffer? How to sort the - groups in a topic? - - Move point over the group you want to move and hit C-k, now move - point to the place where you want the group to be and hit C-y. - -3. Getting Messages - -3.1. I just installed Gnus, started it via M-x gnus but it only says - "nntp (news) open error", what to do? - - You've got to tell Gnus where to fetch the news from. Read the - documentation for information on how to do this. As a first start, - put those lines in ~/.gnus: - - (setq gnus-select-method '(nntp "news.yourprovider.net")) - (setq user-mail-address "you@yourprovider.net") - (setq user-full-name "Your Name") - - -3.2. I'm working under Windows and have no idea what ~/.gnus means. - - The ~/ means the home directory where Gnus and Emacs look for the - configuration files. However, you don't really need to know what - this means, it suffices that Emacs knows what it means :-) You can - type C-x C-f ~/.gnus RET (yes, with the forward slash, even on - Windows), and Emacs will open the right file for you. (It will most - likely be new, and thus empty.) However, I'd discourage you from - doing so, since the directory Emacs chooses will most certainly not - be what you want, so let's do it the correct way. The first thing - you've got to do is to create a suitable directory (no blanks in - directory name please) e.g. c:\myhome. Then you must set the - environment variable HOME to this directory. To do this under Win9x - or Me include the line - - SET HOME=C:\myhome - - - in your autoexec.bat and reboot. Under NT, 2000 and XP, hit - Winkey+Pause/Break to enter system options (if it doesn't work, go - to Control Panel -> System). There you'll find the possibility to - set environment variables, create a new one with name HOME and - value C:\myhome, a reboot is not necessary. - - Now to create ~/.gnus, say C-x C-f ~/.gnus RET C-x C-s. in Emacs. - -3.3. My news server requires authentication, how to store user name and - password on disk? - - Create a file ~/.authinfo which includes for each server a line - like this - - machine news.yourprovider.net login YourUserName password YourPassword - - . Make sure that the file isn't readable to others if you work on a - OS which is capable of doing so. (Under Unix say - - chmod 600 ~/.authinfo - - in a shell.) - -3.4. Gnus seems to start up OK, but I can't find out how to subscribe to - a group. - - If you know the name of the group say U name.of.group RET in group - buffer (use the tab-completion Luke). Otherwise hit ^ in group - buffer, this brings you to the server buffer. Now place point (the - cursor) over the server which carries the group you want, hit RET, - move point to the group you want to subscribe to and say u to - subscribe to it. - -3.5. Gnus doesn't show all groups / Gnus says I'm not allowed to post on - this server as well as I am, what's that? - - Some providers allow restricted anonymous access and full access - only after authorization. To make Gnus send authinfo to those - servers append - - force yes - - to the line for those servers in ~/.authinfo. - -3.6. I want Gnus to fetch news from several servers, is this possible? - - Of course. You can specify more sources for articles in the - variable gnus-secondary-select-methods. Add something like this in - ~/.gnus: - - (add-to-list 'gnus-secondary-select-methods '(nntp "news.yourSecondProvider.net")) - (add-to-list 'gnus-secondary-select-methods '(nntp "news.yourThirdProvider.net")) - - -3.7. And how about local spool files? - - No problem, this is just one more select method called nnspool, so - you want this: - - (add-to-list 'gnus-secondary-select-methods '(nnspool "")) - - - Or this if you don't want an NNTP Server as primary news source: - - (setq gnus-select-method '(nnspool "")) - - - Gnus will look for the spool file in /usr/spool/news, if you want - something different, change the line above to something like this: - - (add-to-list 'gnus-secondary-select-methods - '(nnspool "" (nnspool-directory "/usr/local/myspoolddir"))) - - - This sets the spool directory for this server only. You might have - to specify more stuff like the program used to post articles, see - the Gnus manual on how to do this. - -3.8. OK, reading news works now, but I want to be able to read my mail - with Gnus, too. How to do it? - - That's a bit harder since there are many possible sources for mail, - many possible ways for storing mail and many different ways for - sending mail. The most common cases are these: 1: You want to read - your mail from a pop3 server and send them directly to a SMTP - Server 2: Some program like fetchmail retrieves your mail and - stores it on disk from where Gnus shall read it. Outgoing mail is - sent by Sendmail, Postfix or some other MTA. Sometimes, you even - need a combination of the above cases. - - However, the first thing to do is to tell Gnus in which way it - should store the mail, in Gnus terminology which back end to use. - Gnus supports many different back ends, the most commonly used one - is nnml. It stores every mail in one file and is therefor quite - fast. However you might prefer a one file per group approach if - your file system has problems with many small files, the nnfolder - back end is then probably the choice for you. To use nnml add the - following to ~/.gnus: - - (add-to-list 'gnus-secondary-select-methods '(nnml "")) - - - As you might have guessed, if you want nnfolder, it's - - (add-to-list 'gnus-secondary-select-methods '(nnfolder "")) - - - Now we need to tell Gnus, where to get it's mail from. If it's a - POP3 server, then you need something like this: - - (eval-after-load "mail-source" - '(add-to-list 'mail-sources '(pop :server "pop.YourProvider.net" - :user "yourUserName" - :password "yourPassword")) - - - Make sure ~/.gnus isn't readable to others if you store your - password there. If you want to read your mail from a traditional - spool file on your local machine, it's - - (eval-after-load "mail-source" - '(add-to-list 'mail-sources '(file :path "/path/to/spool/file")) - - - If it's a Maildir, with one file per message as used by postfix, - Qmail and (optionally) fetchmail it's - - (eval-after-load "mail-source" - '(add-to-list 'mail-sources '(maildir :path "/path/to/Maildir/" - :subdirs ("cur" "new"))) - - - And finally if you want to read your mail from several files in one - directory, for example because procmail already split your mail, - it's - - (eval-after-load "mail-source" - '(add-to-list 'mail-sources '(directory :path "/path/to/procmail-dir/" - :suffix ".prcml")) - - - Where :suffix ".prcml" tells Gnus only to use files with the suffix - .prcml. - - OK, now you only need to tell Gnus how to send mail. If you want to - send mail via sendmail (or whichever MTA is playing the role of - sendmail on your system), you don't need to do anything. However, - if you want to send your mail to an SMTP Server you need the - following in your ~/.gnus - - (setq send-mail-function 'smtpmail-send-it) - (setq message-send-mail-function 'smtpmail-send-it) - (setq smtpmail-default-smtp-server "smtp.yourProvider.net") - - -3.9. And what about IMAP? - - There are two ways of using IMAP with Gnus. The first one is to use - IMAP like POP3, that means Gnus fetches the mail from the IMAP - server and stores it on disk. If you want to do this (you don't - really want to do this) add the following to ~/.gnus - - (add-to-list 'mail-sources '(imap :server "mail.mycorp.com" - :user "username" - :pass "password" - :stream network - :authentication login - :mailbox "INBOX" - :fetchflag "\\Seen")) - - - You might have to tweak the values for stream and/or - authentification, see the Gnus manual node "Mail Source Specifiers" - for possible values. - - If you want to use IMAP the way it's intended, you've got to follow - a different approach. You've got to add the nnimap back end to your - select method and give the information about the server there. - - (add-to-list 'gnus-secondary-select-methods - '(nnimap "Give the baby a name" - (nnimap-address "imap.yourProvider.net") - (nnimap-port 143) - (nnimap-list-pattern "archive.*"))) - - - Again, you might have to specify how to authenticate to the server - if Gnus can't guess the correct way, see the Manual Node "IMAP" for - detailed information. - -3.10. At the office we use one of those MS Exchange servers, can I use - Gnus to read my mail from it? - - Offer your administrator a pair of new running shoes for activating - IMAP on the server and follow the instructions above. - -3.11. Can I tell Gnus not to delete the mails on the server it retrieves - via POP3? - - First of all, that's not the way POP3 is intended to work, if you - have the possibility, you should use the IMAP Protocol if you want - your messages to stay on the server. Nevertheless there might be - situations where you need the feature, but sadly Gnus itself has no - predefined functionality to do so. - - However this is Gnus county so there are possibilities to achieve - what you want. The easiest way is to get an external program which - retrieves copies of the mail and stores them on disk, so Gnus can - read it from there. On Unix systems you could use e.g. fetchmail - for this, on MS Windows you can use Hamster, an excellent local - news and mail server. - - The other solution would be, to replace the method Gnus uses to get - mail from POP3 servers by one which is capable of leaving the mail - on the server. If you use XEmacs, get the package mail-lib, it - includes an enhanced pop3.el, look in the file, there's - documentation on how to tell Gnus to use it and not to delete the - retrieved mail. For GNU Emacs look for the file epop3.el which can - do the same (If you know the home of this file, please send me an - e-mail). You can also tell Gnus to use an external program (e.g. - fetchmail) to fetch your mail, see the info node "Mail Source - Specifiers" in the Gnus manual on how to do it. - -4. Reading messages - -4.1. When I enter a group, all read messages are gone. How to view them - again? - - If you enter the group by saying RET in summary buffer with point - over the group, only unread and ticked messages are loaded. Say C-u - RET instead to load all available messages. If you want only the - e.g. 300 newest say C-u 300 RET - - Loading only unread messages can be annoying if you have threaded - view enabled, say - - (setq gnus-fetch-old-headers 'some) - - - in ~/.gnus to load enough old articles to prevent teared threads, - replace 'some with t to load all articles (Warning: Both settings - enlarge the amount of data which is fetched when you enter a group - and slow down the process of entering a group). - - If you already use Gnus 5.10.0, you can say /o N In summary buffer - to load the last N messages, this feature is not available in 5.8.8 - - If you don't want all old messages, but the parent of the message - you're just reading, you can say ^, if you want to retrieve the - whole thread the message you're just reading belongs to, A T is - your friend. - -4.2. How to tell Gnus to show an important message every time I enter a - group, even when it's read? - - You can tick important messages. To do this hit u while point is in - summary buffer over the message. When you want to remove the mark, - hit either d (this deletes the tick mark and set's unread mark) or - M c (which deletes all marks for the message). - -4.3. How to view the headers of a message? - - Say t to show all headers, one more t hides them again. - -4.4. How to view the raw unformatted message? - - Say C-u g to show the raw message g returns to normal view. - -4.5. How can I change the headers Gnus displays by default at the top of - the article buffer? - - The variable gnus-visible-headers controls which headers are shown, - its value is a regular expression, header lines which match it are - shown. So if you want author, subject, date, and if the header - exists, Followup-To and MUA / NUA say this in ~/.gnus: - - (setq gnus-visible-headers - "^\\(From:\\|Subject:\\|Date:\\|Followup-To:\\|X-Newsreader:\\|User-Agent:\\|X-Mailer:\\)") - - -4.6. I'd like Gnus NOT to render HTML-mails but show me the text part if - it's available. How to do it? - - Say - - (eval-after-load "mm-decode" - '(progn - (add-to-list 'mm-discouraged-alternatives "text/html") - (add-to-list 'mm-discouraged-alternatives "text/richtext"))) - - - in ~/.gnus. If you don't want HTML rendered, even if there's no - text alternative add - - (setq mm-automatic-display (remove "text/html" mm-automatic-display)) - - - too. - -4.7. Can I use some other browser than w3 to render my HTML-mails? - - Only if you use Gnus 5.10.0 or younger. In this case you've got the - choice between w3, w3m, links, lynx and html2text, which one is - used can be specified in the variable mm-text-html-renderer, so if - you want links to render your mail say - - (setq mm-text-html-renderer 'links) - - -4.8. Is there anything I can do to make poorly formatted mails more - readable? - - Gnus offers you several functions to "wash" incoming mail, you can - find them if you browse through the menu, item Article->Washing. - The most interesting ones are probably "Wrap long lines" ( W w ), - "Decode ROT13" ( W r ) and "Outlook Deuglify" which repairs the - dumb quoting used by many users of Microsoft products ( W Y f gives - you full deuglify. See W Y C-h or have a look at the menus for - other deuglifications). Outlook deuglify is only available since - Gnus 5.10.0. - -4.9. Is there a way to automatically ignore posts by specific authors or - with specific words in the subject? And can I highlight more - interesting ones in some way? - - You want Scoring. Scoring means, that you define rules which assign - each message an integer value. Depending on the value the message - is highlighted in summary buffer (if it's high, say +2000) or - automatically marked read (if the value is low, say -800) or some - other action happens. - - There are basically three ways of setting up rules which assign the - scoring-value to messages. The first and easiest way is to set up - rules based on the article you are just reading. Say you're reading - a message by a guy who always writes nonsense and you want to - ignore his messages in the future. Hit L, to set up a rule which - lowers the score. Now Gnus asks you which the criteria for lowering - the Score shall be. Hit ? twice to see all possibilities, we want a - which means the author (the from header). Now Gnus wants to know - which kind of matching we want. Hit either e for an exact match or - s for substring-match and delete afterwards everything but the name - to score down all authors with the given name no matter which email - address is used. Now you need to tell Gnus when to apply the rule - and how long it should last, hit e.g. p to apply the rule now and - let it last forever. If you want to raise the score instead of - lowering it say I instead of L. - - You can also set up rules by hand. To do this say V f in summary - buffer. Then you are asked for the name of the score file, it's - name.of.group.SCORE for rules valid in only one group or all.Score - for rules valid in all groups. See the Gnus manual for the exact - syntax, basically it's one big list whose elements are lists again. - the first element of those lists is the header to score on, then - one more list with what to match, which score to assign, when to - expire the rule and how to do the matching. If you find me very - interesting, you could e.g. add the following to your all.Score: - - (("references" ("hschmi22.userfqdn.rz-online.de" 500 nil s)) - ("message-id" ("hschmi22.userfqdn.rz-online.de" 999 nil s))) - - - This would add 999 to the score of messages written by me and 500 - to the score of messages which are a (possibly indirect) answer to - a message written by me. Of course nobody with a sane mind would do - this :-) - - The third alternative is adaptive scoring. This means Gnus watches - you and tries to find out what you find interesting and what - annoying and sets up rules which reflect this. Adaptive scoring can - be a huge help when reading high traffic groups. If you want to - activate adaptive scoring say - - (setq gnus-use-adaptive-scoring t) - - - in ~/.gnus. - -4.10. How can I disable threading in some (e.g. mail-) groups, or set - other variables specific for some groups? - - While in group buffer move point over the group and hit G c, this - opens a buffer where you can set options for the group. At the - bottom of the buffer you'll find an item that allows you to set - variables locally for the group. To disable threading enter - gnus-show-threads as name of variable and nil as value. Hit button - done at the top of the buffer when you're ready. - -4.11. Can I highlight messages written by me and follow-ups to those? - - Stop those "Can I ..." questions, the answer is always yes in Gnus - Country :-). It's a three step process: First we make faces - (specifications of how summary-line shall look like) for those - postings, then we'll give them some special score and finally we'll - tell Gnus to use the new faces. You can find detailed instructions - on how to do it on my.gnus.org [http://my.gnus.org/Members/dzimmerm - /HowTo%2C2002-07-25%2C1027619165012198456/view] - -4.12. The number of total messages in a group which Gnus displays in - group buffer is by far to high, especially in mail groups. Is this - a bug? - - No, that's a matter of design of Gnus, fixing this would mean - reimplementation of major parts of Gnus' back ends. Gnus thinks - "highest-article-number - lowest-article-number = - total-number-of-articles". This works OK for Usenet groups, but if - you delete and move many messages in mail groups, this fails. To - cure the symptom, enter the group via C-u RET (this makes Gnus get - all messages), then hit M P b to mark all messages and then say B m - name.of.group to move all messages to the group they have been in - before, they get new message numbers in this process and the count - is right again (until you delete and move your mail to other groups - again). - -4.13. I don't like the layout of summary and article buffer, how to - change it? Perhaps even a three pane display? - - You can control the windows configuration by calling the function - gnus-add-configuration. The syntax is a bit complicated but - explained very well in the manual node "Window Layout". Some - popular examples: - - Instead 25% summary 75% article buffer 35% summary and 65% article - (the 1.0 for article means "take the remaining space"): - - (gnus-add-configuration '(article (vertical 1.0 (summary .35 point) (article 1.0)))) - - - A three pane layout, Group buffer on the left, summary buffer - top-right, article buffer bottom-right: - - (gnus-add-configuration - '(article - (horizontal 1.0 - (vertical 25 - (group 1.0)) - (vertical 1.0 - (summary 0.25 point) - (article 1.0))))) - (gnus-add-configuration - '(summary - (horizontal 1.0 - (vertical 25 - (group 1.0)) - (vertical 1.0 - (summary 1.0 point))))) - - -4.14. I don't like the way the Summary buffer looks, how to tweak it? - - You've got to play around with the variable - gnus-summary-line-format. It's value is a string of symbols which - stand for things like author, date, subject etc. A list of the - available specifiers can be found in the manual node "Summary - Buffer Lines" and the often forgotten node "Formatting Variables" - and it's sub-nodes. There you'll find useful things like - positioning the cursor and tabulators which allow you a summary in - table form, but sadly hard tabulators are broken in 5.8.8. - - Since 5.10.0, Gnus offers you some very nice new specifiers, e.g. - %B which draws a thread-tree and %&user-date which gives you a date - where the details are dependent of the articles age. Here's an - example which uses both: - - (setq gnus-summary-line-format ":%U%R %B %s %-60=|%4L |%-20,20f |%&user-date; \n") - - - resulting in: - - :O Re: [Richard Stallman] rfc2047.el | 13 |Lars Magne Ingebrigt |Sat 23:06 - :O Re: Revival of the ding-patches list | 13 |Lars Magne Ingebrigt |Sat 23:12 - :R > Re: Find correct list of articles for a gro| 25 |Lars Magne Ingebrigt |Sat 23:16 - :O \-> ... | 21 |Kai Grossjohann | 0:01 - :R > Re: Cry for help: deuglify.el - moving stuf| 28 |Lars Magne Ingebrigt |Sat 23:34 - :O \-> ... | 115 |Raymond Scholz | 1:24 - :O \-> ... | 19 |Lars Magne Ingebrigt |15:33 - :O Slow mailing list | 13 |Lars Magne Ingebrigt |Sat 23:49 - :O Re: `@' mark not documented | 13 |Lars Magne Ingebrigt |Sat 23:50 - :R > Re: Gnus still doesn't count messages prope| 23 |Lars Magne Ingebrigt |Sat 23:57 - :O \-> ... | 18 |Kai Grossjohann | 0:35 - :O \-> ... | 13 |Lars Magne Ingebrigt | 0:56 - - -4.15. How to split incoming mails in several groups? - - Gnus offers two possibilities for splitting mail, the easy - nnmail-split-methods and the more powerful Fancy Mail Splitting. - I'll only talk about the first one, refer to the manual, node - "Fancy Mail Splitting" for the latter. - - The value of nnmail-split-methods is a list, each element is a list - which stands for a splitting rule. Each rule has the form "group - where matching articles should go to", "regular expression which - has to be matched", the first rule which matches wins. The last - rule must always be a general rule (regular expression .*) which - denotes where articles should go which don't match any other rule. - If the folder doesn't exist yet, it will be created as soon as an - article lands there. By default the mail will be send to all groups - whose rules match. If you don't want that (you probably don't - want), say - - (setq nnmail-crosspost nil) - - - in ~/.gnus. - - An example might be better than thousand words, so here's my - nnmail-split-methods. Note that I send duplicates in a special - group and that the default group is spam, since I filter all mails - out which are from some list I'm subscribed to or which are - addressed directly to me before. Those rules kill about 80% of the - Spam which reaches me (Email addresses are changed to prevent - spammers from using them): - - (setq nnmail-split-methods - '(("duplicates" "^Gnus-Warning:.*duplicate") - ("XEmacs-NT" "^\\(To:\\|CC:\\).*localpart@xemacs.bla.*") - ("Gnus-Tut" "^\\(To:\\|CC:\\).*localpart@socha.bla.*") - ("tcsh" "^\\(To:\\|CC:\\).*localpart@mx.gw.bla.*") - ("BAfH" "^\\(To:\\|CC:\\).*localpart@.*uni-muenchen.bla.*") - ("Hamster-src" "^\\(CC:\\|To:\\).*hamster-sourcen@yahoogroups.\\(de\\|com\\).*") - ("Tagesschau" "^From: tagesschau $") - ("Replies" "^\\(CC:\\|To:\\).*localpart@Frank-Schmitt.bla.*") - ("EK" "^From:.*\\(localpart@privateprovider.bla\\|localpart@workplace.bla\\).*") - ("Spam" "^Content-Type:.*\\(ks_c_5601-1987\\|EUC-KR\\|big5\\|iso-2022-jp\\).*") - ("Spam" "^Subject:.*\\(This really work\\|XINGA\\|ADV:\\|XXX\\|adult\\|sex\\).*") - ("Spam" "^Subject:.*\\(\=\?ks_c_5601-1987\?\\|\=\?euc-kr\?\\|\=\?big5\?\\).*") - ("Spam" "^X-Mailer:\\(.*BulkMailer.*\\|.*MIME::Lite.*\\|\\)") - ("Spam" "^X-Mailer:\\(.*CyberCreek Avalanche\\|.*http\:\/\/GetResponse\.com\\)") - ("Spam" "^From:.*\\(verizon\.net\\|prontomail\.com\\|money\\|ConsumerDirect\\).*") - ("Spam" "^Delivered-To: GMX delivery to spamtrap@gmx.bla$") - ("Spam" "^Received: from link2buy.com") - ("Spam" "^CC: .*azzrael@t-online.bla") - ("Spam" "^X-Mailer-Version: 1.50 BETA") - ("Uni" "^\\(CC:\\|To:\\).*localpart@uni-koblenz.bla.*") - ("Inbox" "^\\(CC:\\|To:\\).*\\(my\ name\\|address@one.bla\\|adress@two.bla\\)") - ("Spam" ""))) - - -5. Composing messages - -5.1. What are the basic commands I need to know for sending mail and - postings? - - To start composing a new mail hit m either in Group or Summary - buffer, for a posting, it's either a in Group buffer and filling - the Newsgroups header manually or a in the Summary buffer of the - group where the posting shall be send to. Replying by mail is r if - you don't want to cite the author, or import the cited text - manually and R to cite the text of the original message. For a - follow up to a newsgroup, it's f and F (analog to r and R. - - Enter new headers above the line saying "--text follows this - line--", enter the text below the line. When ready hit C-c C-c, to - send the message, if you want to finish it later hit C-c C-d to - save it in the drafts group, where you can start editing it again - by saying D e. - -5.2. How to enable automatic word-wrap when composing messages? - - Say - - (add-hook 'message-mode-hook - (lambda () - (setq fill-column 72) - (turn-on-auto-fill))) - - - in ~/.gnus. You can reformat a paragraph by hitting M-q (as usual) - -5.3. How to set stuff like From, Organization, Reply-To, signature...? - - There are other ways, but you should use posting styles for this. - (See below why). This example should make the syntax clear: - - (setq gnus-posting-styles - '((".*" - (name "Frank Schmitt") - (address "me@there.bla") - (organization "Hamme net, kren mer och nimmi") - (signature-file "~/.signature") - ("X-SampleHeader" "foobar") - (eval (setq some-variable "Foo bar"))))) - - - The ".*" means that this settings are the default ones (see below), - valid values for the first element of the following lists are - signature, signature-file, organization, address, name or body. The - attribute name can also be a string. In that case, this will be - used as a header name, and the value will be inserted in the - headers of the article; if the value is `nil', the header name will - be removed. You can also say (eval (foo bar)), then the function - foo will be evaluated with argument bar and the result will be - thrown away. - -5.4. Can I set things like From, Signature etc group based on the group - I post too? - - That's the strength of posting styles. Before, we used ".*" to set - the default for all groups. You can use a regexp like "^gmane" and - the following settings are only applied to postings you send to the - gmane hierarchy, use ".*binaries" instead and they will be applied - to postings send to groups containing the string binaries in their - name etc. - - You can instead of specifying a regexp specify a function which is - evaluated, only if it returns true, the corresponding settings take - effect. Two interesting candidates for this are message-news-p - which returns t if the current Group is a newsgroup and the - corresponding message-mail-p. - - Note that all forms that match are applied, that means in the - example below, when I post to gmane.mail.spam.spamassassin.general, - the settings under ".*" are applied and the settings under - message-news-p and those under "^gmane" and those under "^gmane\ - \.mail\\.spam\\.spamassassin\\.general$". Because of this put - general settings at the top and specific ones at the bottom. - - (setq gnus-posting-styles - '((".*" ;;default - (name "Frank Schmitt") - (organization "Hamme net, kren mer och nimmi") - (signature-file "~/.signature") ) - ((message-news-p) ;;Usenet news? - (address "mySpamTrap@Frank-Schmitt.bla") - ("Reply-To" "hereRealRepliesOnlyPlease@Frank-Schmitt.bla") ) - ((message-mail-p) ;;mail? - (address "usedForMails@Frank-Schmitt.bla") ) - ("^gmane" ;;this is mail, too in fact - (address "usedForMails@Frank-Schmitt.net") - ("Reply-To" nil) ) - ("^gmane.mail.spam.spamassassin.general$" - (eval (setq mail-envelope-from "Azzrael@rz-online.de")) - (address "Azzrael@rz-online.de")) )) - - -5.5. Is there a spell-checker? Perhaps even on-the-fly spell-checking? - - You can use ispell.el to spell-check stuff in Emacs. So the first - thing to do is to make sure that you've got either ispell [http:// - fmg-www.cs.ucla.edu/fmg-members/geoff/ispell.html] or aspell [http: - //aspell.sourceforge.net/] installed and in your Path. Then you - need ispell.el [http://www.kdstevens.com/~stevens/ispell-page.html] - and for on-the-fly spell-checking flyspell.el [http:// - www-sop.inria.fr/mimosa/personnel/Manuel.Serrano/flyspell/ - flyspell.html]. Ispell.el is shipped with Gnus Emacs and available - through the Emacs package system, flyspell.el is shipped with Emacs - and part of XEmacs text-modes package which is available through - the package system, so there should be no need to install them - manually. - - Ispell.el assumes you use ispell, if you choose aspell say - - (setq ispell-program-name "aspell") - - in your Emacs configuration file. - - If you want your outgoing messages to be spell-checked, say - - (add-hook 'message-send-hook 'ispell-message) - - In your ~/.gnus, if you prefer on-the-fly spell-checking say - - (add-hook 'message-mode-hook (lambda () (flyspell-mode 1))) - -5.6. Can I set the dictionary based on the group I'm posting to? - - Yes, say something like - - (add-hook 'gnus-select-group-hook - (lambda () - (cond - ((string-match - "^de\\." (gnus-group-real-name gnus-newsgroup-name)) - (ispell-change-dictionary "deutsch8")) - (t - (ispell-change-dictionary "english"))))) - - - in ~/.gnus. Change "^de\\." and "deutsch8" to something that suits - your needs. - -5.7. Is there some kind of address-book, so I needn't remember all those - email addresses? - - There's an very basic solution for this, mail aliases. You can - store your mail addresses in a ~/.mailrc file using a simple alias - syntax: - - alias al "Al " - - - Then typing your alias (followed by a space or punctuation - character) on a To: or Cc: line in the message buffer will cause - gnus to insert the full address for you. See the node "Mail - Aliases" in Message (not Gnus) manual for details. - - However, what you really want is the Insidious Big Brother Database - bbdb. Get it through the XEmacs package system or from bbdb's - homepage [http://bbdb.sourceforge.net/]. Now place the following in - ~/.gnus, to activate bbdb for Gnus: - - (require 'bbdb) - (bbdb-initialize 'gnus 'message) - - - Now you probably want some general bbdb configuration, place them - in ~/.emacs: - - (require 'bbdb) - ;;If you don't live in Northern America, you should disable the - ;;syntax check for telephone numbers by saying - (setq bbdb-north-american-phone-numbers-p nil) - ;;Tell bbdb about your email address: - (setq bbdb-user-mail-names - (regexp-opt '("Your.Email@here.bla" - "Your.other@mail.there.bla"))) - ;;cycling while completing email addresses - (setq bbdb-complete-name-allow-cycling t) - ;;No popup-buffers - (setq bbdb-use-pop-up nil) - - - Now you should be ready to go. Say M-x bbdb RET RET to open a bbdb - buffer showing all entries. Say c to create a new entry, b to - search your BBDB and C-o to add a new field to an entry. If you - want to add a sender to the BBDB you can also just hit `:' on the - posting in the summary buffer and you are done. When you now - compose a new mail, hit TAB to cycle through know recipients. - -5.8. Sometimes I see little images at the top of article buffer. What's - that and how can I send one with my postings, too? - - Those images are called X-Faces. They are 48*48 pixel b/w pictures, - encoded in a header line. If you want to include one in your posts, - you've got to convert some image to a X-Face. So fire up some image - manipulation program (say Gimp), open the image you want to - include, cut out the relevant part, reduce color depth to 1 bit, - resize to 48*48 and save as bitmap. Now you should get the compface - package from this site [ftp://ftp.cs.indiana.edu:/pub/faces/]. and - create the actual X-face by saying - - cat file.xbm | xbm2ikon |compface > file.face - cat ./file.face | sed 's/\\/\\\\/g' | sed 's/\"/\\\"/g' > ./file.face.quoted - - - if you can't use compface, there's an online X-face converter at - http://www.dairiki.org/xface/ [http://www.dairiki.org/xface/]. If - you use MS Windows, you could also use the WinFace program from - http://www.xs4all.nl/~walterln/winface/ [http://www.xs4all.nl/ - ~walterln/winface/]. Now you only have to tell Gnus to include the - X-face in your postings by saying - - (setq message-default-headers - (with-temp-buffer - (insert "X-Face: ") - (insert-file-contents "~/.xemacs/xface") - (buffer-string))) - - - in ~/.gnus. - -5.9. Sometimes I accidentally hit r instead of f in newsgroups. Can Gnus - warn me, when I'm replying by mail in newsgroups? - - Put this in ~/.gnus: - - (setq gnus-confirm-mail-reply-to-news t) - - - if you already use Gnus 5.10.0, if you still use 5.8.8 or 5.9 try - this instead: - - (defadvice gnus-summary-reply (around reply-in-news activate) - (interactive) - (when (or (not (gnus-news-group-p gnus-newsgroup-name)) - (y-or-n-p "Really reply? ")) - ad-do-it)) - - -5.10. How to tell Gnus not to generate a sender header? - - Since 5.10.0 Gnus doesn't generate a sender header by default. For - older Gnus' try this in ~/.gnus: - - (eval-after-load "message" - '(add-to-list 'message-syntax-checks '(sender . disabled))) - - -5.11. I want gnus to locally store copies of my send mail and news, how - to do it? - - You must set the variable gnus-message-archive-group to do this. - You can set it to a string giving the name of the group where the - copies shall go or like in the example below use a function which - is evaluated and which returns the group to use. - - (setq gnus-message-archive-group - '((if (message-news-p) - "nnml:Send-News" - "nnml:Send-Mail"))) - - -5.12. People tell me my Message-IDs are not correct, why aren't they and - how to fix it? - - The message-ID is an unique identifier for messages you send. To - make it unique, Gnus need to know which machine name to put after - the "@". If the name of the machine where Gnus is running isn't - suitable (it probably isn't at most private machines) you can tell - Gnus what to use by saying: - - (defun message-make-message-id() - (concat "<"(message-unique-id)"@yourmachine.yourdomain.tld>")) - - - in ~/.gnus. If you have no idea what to insert for - "yourmachine.yourdomain.tld", you've got several choices. You can - either ask your provider if he allows you to use something like - yourUserName.userfqdn.provider.net, or you can use - somethingUnique.yourdomain.tld if you own the domain - yourdomain.tld, or you can register at a service which gives - private users a FQDN for free, e.g. http://www.stura.tu-freiberg.de - /~dlx/addfqdn.html [http://www.stura.tu-freiberg.de/~dlx/ - addfqdn.html]. (Sorry but this website is in German, if you know of - an English one offering the same, drop me a note). - - Finally you can tell Gnus not to generate a Message-ID for News at - all (and letting the server do the job) by saying - - (setq message-required-news-headers - (remove' Message-ID message-required-news-headers)) - - - you can also tell Gnus not to generate Message-IDs for mail by - saying - - (setq message-required-mail-headers - (remove' Message-ID message-required-mail-headers)) - - - , however some mail servers don't generate proper Message-IDs, too, - so test if your Mail Server behaves correctly by sending yourself a - Mail and looking at the Message-ID. - -6. Old messages - -6.1. How to import my old mail into Gnus? - - The easiest way is to tell your old mail program to export the - messages in mbox format. Most Unix mailers are able to do this, if - you come from the MS Windows world, you may find tools at http:// - mbx2mbox.sourceforge.net/ [http://mbx2mbox.sourceforge.net/]. - - Now you've got to import this mbox file into Gnus. To do this, - create a nndoc group based on the mbox file by saying G f /path/ - file.mbox RET in Group buffer. You now have read-only access to - your mail. If you want to import the messages to your normal Gnus - mail groups hierarchy, enter the nndoc group you've just created by - saying C-u RET (thus making sure all messages are retrieved), mark - all messages by saying M P b and either copy them to the desired - group by saying B c name.of.group RET or send them through - nnmail-split-methods (respool them) by saying B r. - -6.2. How to archive interesting messages? - - If you stumble across an interesting message, say in gnu.emacs.gnus - and want to archive it there are several solutions. The first and - easiest is to save it to a file by saying O f. However, wouldn't it - be much more convenient to have more direct access to the archived - message from Gnus? If you say yes, put this snippet by Frank Haun - in ~/.gnus: - - (defun my-archive-article (&optional n) - "Copies one or more article(s) to a corresponding `nnml:' group, e.g. - `gnus.ding' goes to `nnml:1.gnus.ding'. And `nnml:List-gnus.ding' goes - to `nnml:1.List-gnus-ding'. - - Use process marks or mark a region in the summary buffer to archive - more then one article." - (interactive "P") - (let ((archive-name - (format - "nnml:1.%s" - (if (featurep 'xemacs) - (replace-in-string gnus-newsgroup-name "^.*:" "") - (replace-regexp-in-string "^.*:" "" gnus-newsgroup-name))))) - (gnus-summary-copy-article n archive-name))) - - - You can now say M-x my-archive-article in summary buffer to archive - the article under the cursor in a nnml group. (Change nnml to your - preferred back end) - - Of course you can also make sure the cache is enabled by saying - - (setq gnus-use-cache t) - - - then you only have to set either the tick or the dormant mark for - articles you want to keep, setting the read mark will remove them - from cache. - -6.3. How to search for a specific message? - - There are several ways for this, too. For a posting from a Usenet - group the easiest solution is probably to ask groups.google.com - [http://groups.google.com], if you found the posting there, tell - Google to display the raw message, look for the message-id, and say - M-^ the@message.id RET in a summary buffer. Since Gnus 5.10.0 - there's also a Gnus interface for groups.google.com which you can - call with G W) in group buffer. - - Another idea which works for both mail and news groups is to enter - the group where the message you are searching is and use the - standard Emacs search C-s, it's smart enough to look at articles in - collapsed threads, too. If you want to search bodies, too try M-s - instead. Further on there are the gnus-summary-limit-to-foo - functions, which can help you, too. - - Of course you can also use grep to search through your local mail, - but this is both slow for big archives and inconvenient since you - are not displaying the found mail in Gnus. Here comes nnir into - action. Nnir is a front end to search engines like swish-e or - swish++ and others. You index your mail with one of those search - engines and with the help of nnir you can search trough the indexed - mail and generate a temporary group with all messages which met - your search criteria. If this sound cool to you get nnir.el from - ftp://ls6-ftp.cs.uni-dortmund.de/pub/src/emacs/ [ftp:// - ls6-ftp.cs.uni-dortmund.de/pub/src/emacs/] or ftp:// - ftp.is.informatik.uni-duisburg.de/pub/src/emacs/ [ftp:// - ftp.is.informatik.uni-duisburg.de/pub/src/emacs/]. Instructions on - how to use it are at the top of the file. - -6.4. How to get rid of old unwanted mail? - - You can of course just mark the mail you don't need anymore by - saying # with point over the mail and then say B DEL to get rid of - them forever. You could also instead of actually deleting them, - send them to a junk-group by saying B m nnml:trash-bin which you - clear from time to time, but both are not the intended way in Gnus. - - In Gnus, we let mail expire like news expires on a news server. - That means you tell Gnus the message is expirable (you tell Gnus "I - don't need this mail anymore") by saying E with point over the mail - in summary buffer. Now when you leave the group, Gnus looks at all - messages which you marked as expirable before and if they are old - enough (default is older than a week) they are deleted. - -6.5. I want that all read messages are expired (at least in some - groups). How to do it? - - If you want all read messages to be expired (e.g. in mailing lists - where there's an online archive), you've got two choices: - auto-expire and total-expire. Auto-expire means, that every article - which has no marks set and is selected for reading is marked as - expirable, Gnus hits E for you every time you read a message. - Total-expire follows a slightly different approach, here all - article where the read mark is set are expirable. - - To activate auto-expire, include auto-expire in the Group - parameters for the group. (Hit G c in summary buffer with point - over the group to change group parameters). For total-expire add - total-expire to the group-parameters. - - Which method you choose is merely a matter of taste: Auto-expire is - faster, but it doesn't play together with Adaptive Scoring, so if - you want to use this feature, you should use total-expire. - - If you want a message to be excluded from expiration in a group - where total or auto expire is active, set either tick (hit u) or - dormant mark (hit u), when you use auto-expire, you can also set - the read mark (hit d). - -6.6. I don't want expiration to delete my mails but to move them to - another group. - - Say something like this in ~/.gnus: - - (setq nnmail-expiry-target "nnml:expired") - - - (If you want to change the value of nnmail-expiry-target on a per - group basis see the question "How can I disable threading in some - (e.g. mail-) groups, or set other variables specific for some - groups?") - -7. Gnus in a dial-up environment - -7.1. I don't have a permanent connection to the net, how can I minimize - the time I've got to be connected? - - You've got basically two options: Either you use the Gnus Agent - (see below) for this, or you can install programs which fetch your - news and mail to your local disk and Gnus reads the stuff from your - local machine. - - If you want to follow the second approach, you need a program which - fetches news and offers them to Gnus, a program which does the same - for mail and a program which receives the mail you write from Gnus - and sends them when you're online. - - Let's talk about Unix systems first: For the news part, the easiest - solution is a small nntp server like Leafnode [http:// - www.leafnode.org/] or sn [http://infa.abo.fi/~patrik/sn/], of - course you can also install a full featured news server like inn - [http://www.isc.org/products/INN/]. Then you want to fetch your - Mail, popular choices are fetchmail [http://www.catb.org/~esr/ - fetchmail/] and getmail [http://www.qcc.ca/~charlesc/software/ - getmail-3.0/]. You should tell those to write the mail to your disk - and Gnus to read it from there. Last but not least the mail sending - part: This can be done with every MTA like sendmail [http:// - www.sendmail.org/], postfix [http://www.qmail.org/], exim [http:// - www.exim.org/] or qmail [http://www.qmail.org/]. - - On windows boxes I'd vote for Hamster [http://www.tglsoft.de/], - it's a small freeware, open-source program which fetches your mail - and news from remote servers and offers them to Gnus (or any other - mail and/or news reader) via nntp respectively POP3 or IMAP. It - also includes a smtp server for receiving mails from Gnus. - -7.2. So what was this thing about the Agent? - - The Gnus agent is part of Gnus, it allows you to fetch mail and - news and store them on disk for reading them later when you're - offline. It kind of mimics offline newsreaders like e.g. Forte - Agent. If you want to use the Agent place the following in ~/.gnus - if you are still using 5.8.8 or 5.9 (it's the default since - 5.10.0): - - (setq gnus-agent t) - - - Now you've got to select the servers whose groups can be stored - locally. To do this, open the server buffer (that is press ^ while - in the group buffer). Now select a server by moving point to the - line naming that server. Finally, agentize the server by typing J a - . If you make a mistake, or change your mind, you can undo this - action by typing J r. When you're done, type 'q' to return to the - group buffer. Now the next time you enter a group on a agentized - server, the headers will be stored on disk and read from there the - next time you enter the group. - -7.3. I want to store article bodies on disk, too. How to do it? - - You can tell the agent to automatically fetch the bodies of - articles which fulfill certain predicates, this is done in a - special buffer which can be reached by saying J c in group buffer. - Please refer to the documentation for information which predicates - are possible and how exactly to do it. - - Further on you can tell the agent manually which articles to store - on disk. There are two ways to do this: Number one: In the summary - buffer, process mark a set of articles that shall be stored in the - agent by saying # with point over the article and then type J s. - The other possibility is to set, again in the summary buffer, - downloadable (%) marks for the articles you want by typing @ with - point over the article and then typing J u. What's the difference? - Well, process marks are erased as soon as you exit the summary - buffer while downloadable marks are permanent. You can actually set - downloadable marks in several groups then use fetch session ('J s' - in the GROUP buffer) to fetch all of those articles. The only - downside is that fetch session also fetches all of the headers for - every selected group on an agentized server. Depending on the - volume of headers, the initial fetch session could take hours. - -7.4. How to tell Gnus not to try to send mails / postings while I'm - offline? - - All you've got to do is to tell Gnus when you are online (plugged) - and when you are offline (unplugged), the rest works automatically. - You can toggle plugged/unplugged state by saying J j in group - buffer. To start Gnus unplugged say M-x gnus-unplugged instead of - M-x gnus. Note that for this to work, the agent must be active. - -8. Getting help - -8.1. How to find information and help inside Emacs? - - The first stop should be the Gnus manual (Say C-h i d m Gnus RET to - start the Gnus manual, then walk through the menus or do a - full-text search with s). Then there are the general Emacs help - commands starting with C-h, type C-h ? ? to get a list of all - available help commands and their meaning. Finally M-x - apropos-command lets you search through all available functions and - M-x apropos searches the bound variables. - -8.2. I can't find anything in the Gnus manual about X (e.g. attachments, - PGP, MIME...), is it not documented? - - There's not only the Gnus manual but also the manuals for message, - emacs-mime, sieve and pgg. Those packages are distributed with Gnus - and used by Gnus but aren't really part of core Gnus, so they are - documented in different info files, you should have a look in those - manuals, too. - -8.3. Which websites should I know? - - The two most important ones are the official Gnus website [http:// - www.gnus.org]. and it's sister site my.gnus.org (MGO) [http:// - my.gnus.org], hosting an archive of lisp snippets, howtos, a (not - really finished) tutorial and this FAQ. - - Tell me about other sites which are interesting. - -8.4. Which mailing lists and newsgroups are there? - - There's the newsgroup gnu.emacs.gnus (pull it from e.g. - news.gnus.org) which deals with general questions and the ding - mailing list (ding@gnus.org) dealing with development of Gnus. You - can read the ding list via NNTP, too under the name gnus.ding from - news.gnus.org. - - If you want to stay in the big8, news.software.newssreaders is also - read by some Gnus users (but chances for qualified help are much - better in the above groups) and if you speak German, there's - de.comm.software.gnus. - -8.5. Where to report bugs? - - Say M-x gnus-bug, this will start a message to the gnus bug mailing - list [mailto:bugs@gnus.org] including information about your - environment which make it easier to help you. - -8.6. I need real-time help, where to find it? - - Point your IRC client to irc.my.gnus.org channel #mygnus. Don't be - afraid if people there speak German, they are willing and capable - of switching to English when people from outside Germany enter. - -9. Tuning Gnus - -9.1. Starting Gnus is really slow, how to speed it up? - - The reason for this could be the way Gnus reads it's active file, - see the node "The Active File" in the Gnus manual for things you - might try to speed the process up. An other idea would be to byte - compile your ~/.gnus (say M-x byte-compile-file RET ~/.gnus RET to - do it). Finally, if you have require statements in your .gnus, you - could replace them with eval-after-load, which loads the stuff not - at startup time, but when it's needed. Say you've got this in your - ~/.gnus: - - (require 'message) - (add-to-list 'message-syntax-checks '(sender . disabled)) - - - then as soon as you start Gnus, message.el is loaded. If you - replace it with - - (eval-after-load "message" - '(add-to-list 'message-syntax-checks '(sender . disabled))) - - - it's loaded when it's needed. - -9.2. How to speed up the process of entering a group? - - A speed killer is setting the variable gnus-fetch-old-headers to - anything different from nil, so don't do this if speed is an issue. - To speed up building of summary say - - (gnus-compile) - - - at the bottom of your ~/.gnus, this will make gnus byte-compile - things like gnus-summary-line-format. then you could increase the - value of gc-cons-threshold by saying something like - - (setq gc-cons-threshold 3500000) - - - in ~/.emacs. If you don't care about width of CJK characters or use - Gnus 5.10.0 or younger together with a recent GNU Emacs, you should - say - - (setq gnus-use-correct-string-widths nil) - - - in ~/.gnus (thanks to Jesper harder for the last two suggestions). - Finally if you are still using 5.8.8 or 5.9 and experience speed - problems with summary buffer generation, you definitely should - update to 5.10.0 since there quite some work on improving it has - been done. - -9.3. Sending mail becomes slower and slower, what's up? - - The reason could be that you told Gnus to archive the messages you - wrote by setting gnus-message-archive-group. Try to use a nnml - group instead of an archive group, this should bring you back to - normal speed. - -Glossary - -~/.gnus - - When the term ~/.gnus is used it just means your Gnus - configuration file. You might as well call it ~/.gnus.el or - specify another name. - -Back End - - In Gnus terminology a back end is a virtual server, a layer - between core Gnus and the real NNTP-, POP3-, IMAP- or - whatever-server which offers Gnus a standardized interface to - functions like "get message", "get Headers" etc. - -Emacs +Subject: Gnus FAQ (Frequently Asked Questions) +Message-ID: - When the term Emacs is used in this FAQ, it means either GNU - Emacs or XEmacs. +The Gnus FAQ is distributed within the Gnus manual. The home page of +the Gnus FAQ is , where you can find the +most recent version in HTML various other formats. -Message +To browse the FAQ now, put the cursor at the end of the following line +and press `C-x C-e': - In this FAQ message means a either a mail or a posting to a - Usenet Newsgroup or to some other fancy back end, no matter of - which kind it is. + (info "(gnus)Frequently Asked Questions") -MUA +On older XEmacs version, use: - MUA is an acronym for Mail User Agent, it's the program you use - to read and write e-mails. + (Info-goto-node "(gnus)Frequently Asked Questions") + +Or simply use RET or the middle mouse button, if the above is displayed +as a clickable button. -NUA - NUA is an acronym for News User Agent, it's the program you use - to read and write Usenet news. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 8c3c124..3965be6 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,51 @@ +2004-01-04 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.10.5 is released. + +2004-01-03 Lars Magne Ingebrigtsen + + * gnus-fun.el (gnus-face-from-file): Message 9. + +2004-01-03 Romain FRANCOISE + + * gnus-fun.el (gnus-face-from-file): Use gnus-message. + +2004-01-03 Reiner Steib + + * gnus-art.el (gnus-button-mid-or-mail-heuristic): Treat Gmane + addresses specially. Fix returned value and messages. + + * mm-decode.el (mm-enable-external): New variable. + (mm-display-part): Use it. + (mm-display-external): Fix message in case of nil handle. + + * Update copyright for several files. + + * spam-report.el (spam-report-gmane): Adjust verbosity. + Delete trailing whitespace. Update copyright. + + * spam.el: Fix many (but not all) checkdoc complaints. + Delete trailing whitespace. + + * message.el (message-header-synonyms): Defcustom. + (message-get-reply-headers): Catch `Original-To'. + (message-carefully-insert-headers): Added comment. + + * gnus-sum.el (gnus-summary-make-menu-bar): Improved "Washing" menu. + +2004-01-03 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-select-newsgroup): Use cat. + + * gnus-agent.el (gnus-agent-cat-enable-undownloaded-faces): New + cat. + + * gnus.el (gnus-user-agent): Moved here. + + * gnus-msg.el (gnus-user-agent): Moved from here. + + * gnus.el (gnus-version-number): Bump. + 2004-01-03 Lars Magne Ingebrigtsen * gnus.el: Gnus v5.10.4 is released. diff --git a/lisp/gnus-agent.el b/lisp/gnus-agent.el index 04b3342..38440a3 100644 --- a/lisp/gnus-agent.el +++ b/lisp/gnus-agent.el @@ -344,6 +344,8 @@ manipulated as follows: gnus-agent-cat-score-file agent-score-file) (gnus-agent-cat-defaccessor gnus-agent-cat-disable-undownloaded-faces agent-disable-undownloaded-faces) +(gnus-agent-cat-defaccessor + gnus-agent-cat-enable-undownloaded-faces agent-enable-undownloaded-faces) (eval-when-compile (defsetf gnus-agent-cat-groups (category) (groups) diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index c89d2c5..f1e647f 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -5838,13 +5838,14 @@ address, `ask' if unsure and `invalid' if the string is invalid." ;; Certain special cases... (when (string-match (concat - "^0[0-9]+-[0-9][0-9][0-9][0-9]@t-online\\.de$" "\\|" - "^[0-9]+\.[0-9]+\@compuserve") + "^0[0-9]+-[0-9][0-9][0-9][0-9]@t-online\\.de$\\|" + "^[0-9]+\\.[0-9]+@compuserve\\|" + "@public\\.gmane\\.org") mid-or-mail) - (gnus-message 8 "`%s' is a known mail address.") + (gnus-message 8 "`%s' is a known mail address." mid-or-mail) (setq result 'mail)) (when (string-match "@.*@\\| " mid-or-mail) - (gnus-message 8 "`%s' is invalid.") + (gnus-message 8 "`%s' is invalid." mid-or-mail) (setq result 'invalid)) ;; Nothing more to do, if result is not a number here... (when (numberp result) @@ -5886,8 +5887,10 @@ address, `ask' if unsure and `invalid' if the string is invalid." (gnus-message 9 "`%s', rate `%s', result `%s'." mid-or-mail 5.0 result))))) (gnus-message 8 "`%s': Final rate is `%s'." mid-or-mail result) + ;; Maybe we should make this a customizable alist: (condition . 'result) (cond - ;; Maybe we should make this a customizable alist: (condition . 'result) + ((symbolp result) result) + ;; Now convert number into proper results: ((< result -10.0) 'mid) ((> result 10.0) 'mail) (t 'ask)))) diff --git a/lisp/gnus-dired.el b/lisp/gnus-dired.el index 2cf8af2..1fa657f 100644 --- a/lisp/gnus-dired.el +++ b/lisp/gnus-dired.el @@ -1,6 +1,6 @@ ;;; gnus-dired.el --- utility functions where gnus and dired meet -;; Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003 +;; Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004 ;; Free Software Foundation, Inc. ;; Authors: Benjamin Rutt , diff --git a/lisp/gnus-fun.el b/lisp/gnus-fun.el index ca5cdea..b293d4e 100644 --- a/lisp/gnus-fun.el +++ b/lisp/gnus-fun.el @@ -119,8 +119,8 @@ Output to the current buffer, replace text, and don't mingle error." (if (> (length attempt) 726) (progn (setq quant (- quant 2)) - (message "Length %d; trying quant %d" - (length attempt) quant)) + (gnus-message 9 "Length %d; trying quant %d" + (length attempt) quant)) (setq done t))) (if done (mm-with-unibyte-buffer diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el index a14d340..3539b58 100644 --- a/lisp/gnus-msg.el +++ b/lisp/gnus-msg.el @@ -1,5 +1,5 @@ ;;; gnus-msg.el --- mail and post interface for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 ;; Free Software Foundation, Inc. ;; Author: Masanobu UMEDA @@ -282,24 +282,6 @@ If nil, the address field will always be empty after invoking :group 'gnus-message :type 'boolean) -(defcustom gnus-user-agent 'emacs-gnus-type - "Which information should be exposed in the User-Agent header. - -It can be one of the symbols `gnus' \(show only Gnus version\), `emacs-gnus' -\(show only Emacs and Gnus versions\), `emacs-gnus-config' \(same as -`emacs-gnus' plus system configuration\), `emacs-gnus-type' \(same as -`emacs-gnus' plus system type\) or a custom string. If you set it to a -string, be sure to use a valid format, see RFC 2616." - :group 'gnus-message - :type '(choice - (item :tag "Show Gnus and Emacs versions and system type" - emacs-gnus-type) - (item :tag "Show Gnus and Emacs versions and system configuration" - emacs-gnus-config) - (item :tag "Show Gnus and Emacs versions" emacs-gnus) - (item :tag "Show only Gnus version" gnus) - (string :tag "Other"))) - ;;; Internal variables. (defvar gnus-inhibit-posting-styles nil diff --git a/lisp/gnus-nocem.el b/lisp/gnus-nocem.el index 20f3e38..e36c25d 100644 --- a/lisp/gnus-nocem.el +++ b/lisp/gnus-nocem.el @@ -1,6 +1,6 @@ ;;; gnus-nocem.el --- NoCeM pseudo-cancellation treatment -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002 +;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2004 ;; Free Software Foundation, Inc. diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index 12cc4d8..90565cf 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -1,5 +1,5 @@ ;;; gnus-sum.el --- summary mode commands for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 ;; Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen @@ -2174,7 +2174,7 @@ gnus-summary-show-article-from-menu-as-charset-%s" cs)))) ["Word wrap" gnus-article-fill-cited-article t] ["Fill long lines" gnus-article-fill-long-lines t] ["Capitalize sentences" gnus-article-capitalize-sentences t] - ["CR" gnus-article-remove-cr t] + ["Remove CR" gnus-article-remove-cr t] ["Quoted-Printable" gnus-article-de-quoted-unreadable t] ["Base64" gnus-article-de-base64-unreadable t] ["Rot 13" gnus-summary-caesar-message @@ -2190,9 +2190,9 @@ gnus-summary-show-article-from-menu-as-charset-%s" cs)))) ["Unfold headers" gnus-article-treat-unfold-headers t] ["Fold newsgroups" gnus-article-treat-fold-newsgroups t] ["Html" gnus-article-wash-html t] - ["URLs" gnus-article-unsplit-urls t] + ["Unsplit URLs" gnus-article-unsplit-urls t] ["Verify X-PGP-Sig" gnus-article-verify-x-pgp-sig t] - ["HZ" gnus-article-decode-HZ t] + ["Decode HZ" gnus-article-decode-HZ t] ("(Outlook) Deuglify" ["Unwrap lines" gnus-article-outlook-unwrap-lines t] ["Repair attribution" gnus-article-outlook-repair-attribution t] @@ -5043,9 +5043,9 @@ If SELECT-ARTICLES, only select those articles from GROUP." (gnus-set-active group (cons (caar alist) (cdr active))))) (setq gnus-summary-use-undownloaded-faces - (not (gnus-agent-find-parameter - group - 'agent-disable-undownloaded-faces)))) + (gnus-agent-find-parameter + group + 'agent-enable-undownloaded-faces))) (setq gnus-newsgroup-name group gnus-newsgroup-unselected nil diff --git a/lisp/gnus.el b/lisp/gnus.el index 1be4614..cd5a931 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -1,7 +1,7 @@ ;;; gnus.el --- a newsreader for GNU Emacs ;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, 1997, -;; 1998, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +;; 1998, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ;; Author: Masanobu UMEDA ;; Lars Magne Ingebrigtsen @@ -282,7 +282,7 @@ is restarted, and sometimes reloaded." :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) -(defconst gnus-version-number "5.10.4" +(defconst gnus-version-number "5.10.5" "Version number for this version of Gnus.") (defconst gnus-version (format "Gnus v%s" gnus-version-number) @@ -2331,6 +2331,24 @@ This should be an alist for Emacs, or a plist for XEmacs." (symbol :tag "Parameter") (sexp :tag "Value"))))) +(defcustom gnus-user-agent 'emacs-gnus-type + "Which information should be exposed in the User-Agent header. + +It can be one of the symbols `gnus' \(show only Gnus version\), `emacs-gnus' +\(show only Emacs and Gnus versions\), `emacs-gnus-config' \(same as +`emacs-gnus' plus system configuration\), `emacs-gnus-type' \(same as +`emacs-gnus' plus system type\) or a custom string. If you set it to a +string, be sure to use a valid format, see RFC 2616." + :group 'gnus-message + :type '(choice + (item :tag "Show Gnus and Emacs versions and system type" + emacs-gnus-type) + (item :tag "Show Gnus and Emacs versions and system configuration" + emacs-gnus-config) + (item :tag "Show Gnus and Emacs versions" emacs-gnus) + (item :tag "Show only Gnus version" gnus) + (string :tag "Other"))) + ;;; Internal variables diff --git a/lisp/mail-source.el b/lisp/mail-source.el index d75db56..ea396f1 100644 --- a/lisp/mail-source.el +++ b/lisp/mail-source.el @@ -1,5 +1,6 @@ ;;; mail-source.el --- functions for fetching mail -;; Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 +;; Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen ;; Keywords: news, mail diff --git a/lisp/message.el b/lisp/message.el index 3bf6a6c..4697efa 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -1,5 +1,5 @@ ;;; message.el --- composing mail and news messages -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 ;; Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen @@ -2673,17 +2673,23 @@ prefix FORCE is given." (message-get-reply-headers t)))) (message-carefully-insert-headers headers))) -(defvar message-header-synonyms +(defcustom message-header-synonyms '((To Cc Bcc)) "List of lists of header synonyms. E.g., if this list contains a member list with elements `Cc' and `To', then `message-carefully-insert-headers' will not insert a `To' header -when the message is already `Cc'ed to the recipient.") +when the message is already `Cc'ed to the recipient." + :group 'message-headers + :link '(custom-manual "(message)Message Headers") + :type '(repeat sexp)) (defun message-carefully-insert-headers (headers) "Insert the HEADERS, an alist, into the message buffer. Does not insert the headers when they are already present there or in the synonym headers, defined by `message-header-synonyms'." + ;; FIXME: Should compare only the address and not the full name. Comparison + ;; should be done case-folded (and with `string=' rather than + ;; `string-match'). (dolist (header headers) (let* ((header-name (symbol-name (car header))) (new-header (cdr header)) @@ -5584,7 +5590,13 @@ OTHER-HEADERS is an alist of header/value pairs." ;; Find all relevant headers we need. (save-restriction (message-narrow-to-headers-or-head) - (setq to (message-fetch-field "to") + ;; Gmane renames "To". Look at "Original-To", too, if it is present in + ;; message-header-synonyms. + (setq to (or (message-fetch-field "to") + (and (loop for synonym in message-header-synonyms + when (memq 'Original-To synonym) + return t) + (message-fetch-field "original-to"))) cc (message-fetch-field "cc") mct (message-fetch-field "mail-copies-to") author (or (message-fetch-field "mail-reply-to") diff --git a/lisp/mm-decode.el b/lisp/mm-decode.el index 80a2d96..5d7f013 100644 --- a/lisp/mm-decode.el +++ b/lisp/mm-decode.el @@ -1,6 +1,6 @@ ;;; mm-decode.el --- Functions for decoding MIME things -;; Copyright (C) 1998, 1999, 2000, 2001, 2002, -;; 2003 Free Software Foundation, Inc. +;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 +;; Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen ;; MORIOKA Tomohiko @@ -157,6 +157,18 @@ set this variable to nil if you consider all urls to be safe." :type 'boolean :group 'mime-display) +(defcustom mm-enable-external t + "Indicate whether external MIME handlers should be used. + +If t, all defined external MIME handlers are used. If nil, files are saved by +`mailcap-save-binary-file'. If it is the symbol `ask', you are prompted +before the external MIME handler is invoked." + :version "21.4" + :type '(choice (const :tag "Always" t) + (const :tag "Never" nil) + (const :tag "Ask" ask)) + :group 'mime-display) + (defcustom mm-inline-media-tests '(("image/p?jpeg" mm-inline-image @@ -633,7 +645,13 @@ external if displayed external." (if (mm-handle-displayed-p handle) (mm-remove-part handle) (let* ((type (mm-handle-media-type handle)) - (method (mailcap-mime-info type))) + (method (mailcap-mime-info type)) + (filename (or (mail-content-type-get + (mm-handle-disposition handle) 'filename) + (mail-content-type-get + (mm-handle-type handle) 'name) + "")) + (external mm-enable-external)) (if (and (mm-inlinable-p handle) (mm-inlined-p handle)) (progn @@ -648,8 +666,27 @@ external if displayed external." (forward-line 1) (mm-insert-inline handle (mm-get-part handle)) 'inline) - (mm-display-external - handle (or method 'mailcap-save-binary-file))))))))) + (if (and method ;; If nil, we always use "save". + (stringp method) ;; 'mailcap-save-binary-file + (or (eq mm-enable-external t) + (and (eq mm-enable-external 'ask) + (y-or-n-p + (concat + "Display part (" type + ") using external program" + ;; Can non-string method ever happen? + (if (stringp method) + (concat + " \"" (format method filename) "\"") + "") + "? "))))) + (setq external t) + (setq external nil)) + (if external + (mm-display-external + handle (or method 'mailcap-save-binary-file)) + (mm-display-external + handle 'mailcap-save-binary-file))))))))) (defun mm-display-external (handle method) "Display HANDLE using METHOD." @@ -670,7 +707,8 @@ external if displayed external." (mm-set-buffer-file-coding-system mm-binary-coding-system) (insert-buffer-substring cur) (goto-char (point-min)) - (message "Viewing with %s" method) + (when method + (message "Viewing with %s" method)) (let ((mm (current-buffer)) (non-viewer (assq 'non-viewer (mailcap-mime-info diff --git a/lisp/spam-report.el b/lisp/spam-report.el index e10639b..efd6778 100644 --- a/lisp/spam-report.el +++ b/lisp/spam-report.el @@ -1,5 +1,5 @@ ;;; spam-report.el --- Reporting spam -;; Copyright (C) 2002, 2003 Free Software Foundation, Inc. +;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. ;; Author: Teodor Zlatanov ;; Keywords: network @@ -39,14 +39,14 @@ (defcustom spam-report-gmane-regex nil "Regexp matching Gmane newsgroups, e.g. \"^nntp\\+.*:gmane\\.\" -If you are using spam.el, consider setting gnus-spam-process-newsgroups -or the gnus-group-spam-exit-processor-report-gmane group/topic parameter +If you are using spam.el, consider setting gnus-spam-process-newsgroups +or the gnus-group-spam-exit-processor-report-gmane group/topic parameter instead." :type '(radio (const nil) (regexp :format "%t: %v\n" :size 0 :value "^nntp\+.*:gmane\.")) :group 'spam-report) -(defcustom spam-report-gmane-spam-header +(defcustom spam-report-gmane-spam-header "^X-Report-Spam: http://\\([^/]+\\)\\(.*\\)$" "String matching Gmane spam-reporting header. Two match groups are needed." :type 'regexp @@ -61,9 +61,9 @@ instead." 'spam-report-url-ping-plain "Function to use for url ping spam reporting." :type '(choice - (const :tag "Connect directly" + (const :tag "Connect directly" spam-report-url-ping-plain) - (const :tag "Use the external program specified in `mm-url-program'" + (const :tag "Use the external program specified in `mm-url-program'" spam-report-url-ping-mm-url)) :group 'spam-report) @@ -75,7 +75,7 @@ instead." (string-match spam-report-gmane-regex gnus-newsgroup-name))) (gnus-message 6 "Reporting spam article %d to spam.gmane.org..." article) (if spam-report-gmane-use-article-number - (spam-report-url-ping "spam.gmane.org" + (spam-report-url-ping "spam.gmane.org" (format "/%s:%d" (gnus-group-real-name gnus-newsgroup-name) article)) @@ -86,9 +86,9 @@ instead." (let* ((host (match-string 1)) (report (match-string 2)) (url (format "http://%s%s" host report))) - (gnus-message 10 "Reporting spam through URL %s..." url) + (gnus-message 7 "Reporting spam through URL %s..." url) (spam-report-url-ping host report)) - (gnus-message 10 "Could not find X-Report-Spam in article %d..." + (gnus-message 3 "Could not find X-Report-Spam in article %d..." article))))))) (defun spam-report-url-ping (host report) @@ -101,7 +101,7 @@ the function specified by `spam-report-url-ping-function'." (let ((tcp-connection)) (with-temp-buffer (or (setq tcp-connection - (open-network-stream + (open-network-stream "URL ping" (buffer-name) host diff --git a/lisp/spam.el b/lisp/spam.el index 4d30052..130fcd8 100644 --- a/lisp/spam.el +++ b/lisp/spam.el @@ -1,7 +1,5 @@ -;; TODO: spam scores, detection of spam in newsgroups, cross-server splitting, remote processing, training through files - ;;; spam.el --- Identifying spam -;; Copyright (C) 2002, 2003 Free Software Foundation, Inc. +;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen ;; Keywords: network @@ -34,6 +32,9 @@ ;;; Several TODO items are marked as such +;; TODO: spam scores, detection of spam in newsgroups, cross-server splitting, +;; remote processing, training through files + ;;; Code: (eval-when-compile (require 'cl)) @@ -42,7 +43,7 @@ (require 'gnus-uu) ; because of key prefix issues ;;; for the definitions of group content classification and spam processors -(require 'gnus) +(require 'gnus) (require 'message) ;for the message-fetch-field functions ;; for nnimap-split-download-body-default @@ -101,13 +102,13 @@ spam groups." :group 'spam) (defcustom spam-split-symbolic-return nil - "Whether spam-split should work with symbols or group names." + "Whether `spam-split' should work with symbols or group names." :type 'boolean :group 'spam) (defcustom spam-split-symbolic-return-positive nil - "Whether spam-split should ALWAYS work with symbols or group - names. Do not set this if you use spam-split in a fancy split + "Whether `spam-split' should ALWAYS work with symbols or group names. +Do not set this if you use `spam-split' in a fancy split method." :type 'boolean :group 'spam) @@ -118,27 +119,26 @@ spam groups." :group 'spam) (defcustom spam-mark-only-unseen-as-spam t - "Whether only unseen articles should be marked as spam in spam -groups. When nil, all unread articles in a spam group are marked as + "Whether only unseen articles should be marked as spam in spam groups. +When nil, all unread articles in a spam group are marked as spam. Set this if you want to leave an article unread in a spam group without losing it to the automatic spam-marking process." :type 'boolean :group 'spam) (defcustom spam-mark-ham-unread-before-move-from-spam-group nil - "Whether ham should be marked unread before it's moved out of a spam -group according to ham-process-destination. This variable is an -official entry in the international Longest Variable Name + "Whether ham should be marked unread before it's moved. +The article is moved out of a spam group according to ham-process-destination. +This variable is an official entry in the international Longest Variable Name Competition." :type 'boolean :group 'spam) (defcustom spam-disable-spam-split-during-ham-respool nil - "Whether spam-split should be ignored while resplitting ham in -a process destination. This is useful to prevent ham from ending -up in the same spam group after the resplit. Don't set this to t -if you have spam-split as the last rule in your split -configuration." + "Whether `spam-split' should be ignored while resplitting ham in a process +destination. This is useful to prevent ham from ending up in the same spam +group after the resplit. Don't set this to t if you have spam-split as the +last rule in your split configuration." :type 'boolean :group 'spam) @@ -163,12 +163,12 @@ The regular expression is matched against the address." :group 'spam) (defcustom spam-use-dig t - "Whether query-dig should be used instead of query-dns." + "Whether `query-dig' should be used instead of `query-dns'." :type 'boolean :group 'spam) (defcustom spam-use-blacklist nil - "Whether the blacklist should be used by spam-split." + "Whether the blacklist should be used by `spam-split'." :type 'boolean :group 'spam) @@ -178,148 +178,148 @@ The regular expression is matched against the address." :group 'spam) (defcustom spam-use-whitelist nil - "Whether the whitelist should be used by spam-split." + "Whether the whitelist should be used by `spam-split'." :type 'boolean :group 'spam) (defcustom spam-use-whitelist-exclusive nil - "Whether whitelist-exclusive should be used by spam-split. + "Whether whitelist-exclusive should be used by `spam-split'. Exclusive whitelisting means that all messages from senders not in the whitelist are considered spam." :type 'boolean :group 'spam) (defcustom spam-use-blackholes nil - "Whether blackholes should be used by spam-split." + "Whether blackholes should be used by `spam-split'." :type 'boolean :group 'spam) (defcustom spam-use-hashcash nil - "Whether hashcash payments should be detected by spam-split." + "Whether hashcash payments should be detected by `spam-split'." :type 'boolean :group 'spam) (defcustom spam-use-regex-headers nil - "Whether a header regular expression match should be used by spam-split. + "Whether a header regular expression match should be used by `spam-split'. Also see the variables `spam-regex-headers-spam' and `spam-regex-headers-ham'." :type 'boolean :group 'spam) (defcustom spam-use-regex-body nil - "Whether a body regular expression match should be used by spam-split. + "Whether a body regular expression match should be used by `spam-split'. Also see the variables `spam-regex-body-spam' and `spam-regex-body-ham'." :type 'boolean :group 'spam) (defcustom spam-use-bogofilter-headers nil - "Whether bogofilter headers should be used by spam-split. + "Whether bogofilter headers should be used by `spam-split'. Enable this if you pre-process messages with Bogofilter BEFORE Gnus sees them." :type 'boolean :group 'spam) (defcustom spam-use-bogofilter nil - "Whether bogofilter should be invoked by spam-split. + "Whether bogofilter should be invoked by `spam-split'. Enable this if you want Gnus to invoke Bogofilter on new messages." :type 'boolean :group 'spam) (defcustom spam-use-BBDB nil - "Whether BBDB should be used by spam-split." + "Whether BBDB should be used by `spam-split'." :type 'boolean :group 'spam) (defcustom spam-use-BBDB-exclusive nil - "Whether BBDB-exclusive should be used by spam-split. -Exclusive BBDB means that all messages from senders not in the BBDB are + "Whether BBDB-exclusive should be used by `spam-split'. +Exclusive BBDB means that all messages from senders not in the BBDB are considered spam." :type 'boolean :group 'spam) (defcustom spam-use-ifile nil - "Whether ifile should be used by spam-split." + "Whether ifile should be used by `spam-split'." :type 'boolean :group 'spam) (defcustom spam-use-stat nil - "Whether spam-stat should be used by spam-split." + "Whether `spam-stat' should be used by `spam-split'." :type 'boolean :group 'spam) (defcustom spam-use-spamoracle nil - "Whether spamoracle should be used by spam-split." + "Whether spamoracle should be used by `spam-split'." :type 'boolean :group 'spam) (defcustom spam-install-hooks (or spam-use-dig spam-use-blacklist - spam-use-whitelist - spam-use-whitelist-exclusive - spam-use-blackholes - spam-use-hashcash - spam-use-regex-headers - spam-use-regex-body - spam-use-bogofilter-headers - spam-use-bogofilter - spam-use-BBDB - spam-use-BBDB-exclusive - spam-use-ifile + spam-use-whitelist + spam-use-whitelist-exclusive + spam-use-blackholes + spam-use-hashcash + spam-use-regex-headers + spam-use-regex-body + spam-use-bogofilter-headers + spam-use-bogofilter + spam-use-BBDB + spam-use-BBDB-exclusive + spam-use-ifile spam-use-stat spam-use-spamoracle) - "Whether the spam hooks should be installed, default to t if one of -the spam-use-* variables is set." + "Whether the spam hooks should be installed. +Default to t if one of the spam-use-* variables is set." :group 'spam :type 'boolean) (defcustom spam-split-group "spam" - "Group name where incoming spam should be put by spam-split." + "Group name where incoming spam should be put by `spam-split'." :type 'string :group 'spam) ;;; TODO: deprecate this variable, it's confusing since it's a list of strings, ;;; not regular expressions -(defcustom spam-junk-mailgroups (cons - spam-split-group +(defcustom spam-junk-mailgroups (cons + spam-split-group '("mail.junk" "poste.pourriel")) "Mailgroups with spam contents. All unmarked article in such group receive the spam mark on group entry." :type '(repeat (string :tag "Group")) :group 'spam) -(defcustom spam-blackhole-servers '("bl.spamcop.net" "relays.ordb.org" +(defcustom spam-blackhole-servers '("bl.spamcop.net" "relays.ordb.org" "dev.null.dk" "relays.visi.com") "List of blackhole servers." :type '(repeat (string :tag "Server")) :group 'spam) (defcustom spam-blackhole-good-server-regex nil - "String matching IP addresses that should not be checked in the blackholes" + "String matching IP addresses that should not be checked in the blackholes." :type '(radio (const nil) (regexp :format "%t: %v\n" :size 0)) :group 'spam) (defcustom spam-face 'gnus-splash-face - "Face for spam-marked articles" + "Face for spam-marked articles." :type 'face :group 'spam) (defcustom spam-regex-headers-spam '("^X-Spam-Flag: YES") - "Regular expression for positive header spam matches" + "Regular expression for positive header spam matches." :type '(repeat (regexp :tag "Regular expression to match spam header")) :group 'spam) (defcustom spam-regex-headers-ham '("^X-Spam-Flag: NO") - "Regular expression for positive header ham matches" + "Regular expression for positive header ham matches." :type '(repeat (regexp :tag "Regular expression to match ham header")) :group 'spam) (defcustom spam-regex-body-spam '() - "Regular expression for positive body spam matches" + "Regular expression for positive body spam matches." :type '(repeat (regexp :tag "Regular expression to match spam body")) :group 'spam) (defcustom spam-regex-body-ham '() - "Regular expression for positive body ham matches" + "Regular expression for positive body ham matches." :type '(repeat (regexp :tag "Regular expression to match ham body")) :group 'spam) @@ -340,20 +340,20 @@ All unmarked article in such group receive the spam mark on group entry." :group 'spam-ifile) (defcustom spam-ifile-spam-category "spam" - "Name of the spam ifile category." + "Name of the spam ifile category." :type 'string :group 'spam-ifile) (defcustom spam-ifile-ham-category nil - "Name of the ham ifile category. If nil, the current group name will -be used." + "Name of the ham ifile category. +If nil, the current group name will be used." :type '(choice (string :tag "Use a fixed category") (const :tag "Use the current group name")) :group 'spam-ifile) (defcustom spam-ifile-all-categories nil "Whether the ifile check will return all categories, or just spam. -Set this to t if you want to use the spam-split invocation of ifile as +Set this to t if you want to use the `spam-split' invocation of ifile as your main source of newsgroup names." :type 'boolean :group 'spam-ifile) @@ -400,7 +400,7 @@ your main source of newsgroup names." (defcustom spam-bogofilter-database-directory nil "Directory path of the Bogofilter databases." - :type '(choice (directory + :type '(choice (directory :tag "Location of the Bogofilter database directory") (const :tag "Use the default")) :group 'spam-bogofilter) @@ -409,7 +409,7 @@ your main source of newsgroup names." "Spam spamoracle configuration." :group 'spam) -(defcustom spam-spamoracle-database nil +(defcustom spam-spamoracle-database nil "Location of spamoracle database file. When nil, use the default spamoracle database." :type '(choice (directory :tag "Location of spamoracle database file.") @@ -438,21 +438,22 @@ spamoracle database." "List of old spam articles, generated when a group is entered.") (defvar spam-split-disabled nil - "If non-nil, spam-split is disabled, and always returns nil.") + "If non-nil, `spam-split' is disabled, and always returns nil.") (defvar spam-split-last-successful-check nil - "spam-split will set this to nil or a spam-use-XYZ check if it + "`spam-split' will set this to nil or a spam-use-XYZ check if it finds ham or spam.") ;; convenience functions -(defun spam-xor (a b) ; logical exclusive or +(defun spam-xor (a b) + "Logical exclusive `or'." (and (or a b) (not (and a b)))) (defun spam-group-ham-mark-p (group mark &optional spam) (when (stringp group) (let* ((marks (spam-group-ham-marks group spam)) - (marks (if (symbolp mark) - marks + (marks (if (symbolp mark) + marks (mapcar 'symbol-value marks)))) (memq mark marks)))) @@ -474,13 +475,13 @@ spamoracle database." (defun spam-group-spam-contents-p (group) (if (stringp group) (or (member group spam-junk-mailgroups) - (memq 'gnus-group-spam-classification-spam + (memq 'gnus-group-spam-classification-spam (gnus-parameter-spam-contents group))) nil)) - + (defun spam-group-ham-contents-p (group) (if (stringp group) - (memq 'gnus-group-spam-classification-ham + (memq 'gnus-group-spam-classification-ham (gnus-parameter-spam-contents group)) nil)) @@ -506,8 +507,8 @@ spam-use-* variable.") (if (and (stringp group) (symbolp processor)) (or (member processor (nth 0 (gnus-parameter-spam-process group))) - (spam-group-processor-multiple-p - group + (spam-group-processor-multiple-p + group (cdr-safe (assoc processor spam-list-of-processors)))) nil)) @@ -566,9 +567,9 @@ spam-use-* variable.") ;;; Summary entry and exit processing. (defun spam-summary-prepare () - (setq spam-old-ham-articles + (setq spam-old-ham-articles (spam-list-articles gnus-newsgroup-articles 'ham)) - (setq spam-old-spam-articles + (setq spam-old-spam-articles (spam-list-articles gnus-newsgroup-articles 'spam)) (spam-mark-junk-as-spam-routine)) @@ -581,10 +582,10 @@ spam-use-* variable.") ;; we have to iterate over the processors, or else we'll be too slow (dolist (classification '(spam ham)) (let* ((old-articles (if (eq classification 'spam) - spam-old-spam-articles + spam-old-spam-articles spam-old-ham-articles)) - (new-articles (spam-list-articles - gnus-newsgroup-articles + (new-articles (spam-list-articles + gnus-newsgroup-articles classification)) (changed-articles (gnus-set-difference old-articles new-articles))) ;; now that we have the changed articles, we go through the processors @@ -595,14 +596,14 @@ spam-use-* variable.") unregister-list) (dolist (article changed-articles) (let ((id (spam-fetch-field-message-id-fast article))) - (when (spam-log-unregistration-needed-p + (when (spam-log-unregistration-needed-p id 'process classification check) (push article unregister-list)))) ;; call spam-register-routine with specific articles to unregister, ;; when there are articles to unregister and the check is enabled (when (and unregister-list (symbol-value check)) (spam-register-routine classification check t unregister-list)))))) - + ;; find all the spam processors applicable to this group (dolist (processor-param spam-list-of-processors) (let ((processor (nth 0 processor-param)) @@ -612,13 +613,13 @@ spam-use-* variable.") (spam-group-processor-p gnus-newsgroup-name processor)) (spam-register-routine classification check)))) - (if spam-move-spam-nonspam-groups-only + (if spam-move-spam-nonspam-groups-only (when (not (spam-group-spam-contents-p gnus-newsgroup-name)) (spam-mark-spam-as-expired-and-move-routine (gnus-parameter-spam-process-destination gnus-newsgroup-name))) - (gnus-message 5 "Marking spam as expired and moving it to %s" + (gnus-message 5 "Marking spam as expired and moving it to %s" gnus-newsgroup-name) - (spam-mark-spam-as-expired-and-move-routine + (spam-mark-spam-as-expired-and-move-routine (gnus-parameter-spam-process-destination gnus-newsgroup-name))) ;; now we redo spam-mark-spam-as-expired-and-move-routine to only @@ -658,10 +659,10 @@ spam-use-* variable.") ;; group parameters (when (spam-group-spam-contents-p gnus-newsgroup-name) (gnus-message 5 "Marking %s articles as spam" - (if spam-mark-only-unseen-as-spam + (if spam-mark-only-unseen-as-spam "unseen" "unread")) - (let ((articles (if spam-mark-only-unseen-as-spam + (let ((articles (if spam-mark-only-unseen-as-spam gnus-newsgroup-unseen gnus-newsgroup-unreads))) (dolist (article articles) @@ -680,7 +681,7 @@ spam-use-* variable.") (when (eq (gnus-summary-article-mark article) gnus-spam-mark) (gnus-summary-mark-article article gnus-expirable-mark) (push article tomove))) - + ;; now do the actual copies (dolist (group groups) (when (and tomove @@ -690,11 +691,11 @@ spam-use-* variable.") (when tomove (if (or (not backend-supports-deletions) (> (length groups) 1)) - (progn + (progn (gnus-summary-copy-article nil group) (setq deletep t)) (gnus-summary-move-article nil group))))) - + ;; now delete the articles, if there was a copy done, and the ;; backend allows it (when (and deletep backend-supports-deletions) @@ -703,9 +704,9 @@ spam-use-* variable.") (when tomove (let ((gnus-novice-user nil)) ; don't ask me if I'm sure (gnus-summary-delete-article nil)))) - + (gnus-summary-yank-process-mark)))) - + (defun spam-ham-copy-or-move-routine (copy groups) (gnus-summary-kill-process-mark) (let ((todo (spam-list-articles gnus-newsgroup-articles 'ham)) @@ -738,7 +739,7 @@ spam-use-* variable.") (gnus-summary-copy-article nil group) (setq deletep t)) (gnus-summary-move-article nil group))))) ; else move articles - + ;; now delete the articles, unless a) copy is t, and there was a copy done ;; b) a move was done to a single group ;; c) backend-supports-deletions is nil @@ -749,19 +750,19 @@ spam-use-* variable.") (when todo (let ((gnus-novice-user nil)) ; don't ask me if I'm sure (gnus-summary-delete-article nil)))))) - + (gnus-summary-yank-process-mark)) - + (defun spam-ham-copy-routine (&rest groups) (if (and (car-safe groups) (listp (car-safe groups))) (apply 'spam-ham-copy-routine (car groups)) (spam-ham-copy-or-move-routine t groups))) - + (defun spam-ham-move-routine (&rest groups) (if (and (car-safe groups) (listp (car-safe groups))) (apply 'spam-ham-move-routine (car groups)) (spam-ham-copy-or-move-routine nil groups))) - + (eval-and-compile (defalias 'spam-point-at-eol (if (fboundp 'point-at-eol) 'point-at-eol @@ -789,9 +790,9 @@ spam-use-* variable.") ;; (defun spam-get-article-as-filename (article) ;; (let ((article-filename)) ;; (when (numberp article) -;; (nnml-possibly-change-directory +;; (nnml-possibly-change-directory ;; (gnus-group-real-name gnus-newsgroup-name)) -;; (setq article-filename (expand-file-name +;; (setq article-filename (expand-file-name ;; (int-to-string article) nnml-current-directory))) ;; (if (file-exists-p article-filename) ;; article-filename @@ -801,7 +802,7 @@ spam-use-* variable.") "Fetch the `from' field quickly, using the internal gnus-data-list function" (if (and (numberp article) (assoc article (gnus-data-list nil))) - (mail-header-from + (mail-header-from (gnus-data-header (assoc article (gnus-data-list nil)))) nil)) @@ -810,7 +811,7 @@ spam-use-* variable.") gnus-data-list function" (if (and (numberp article) (assoc article (gnus-data-list nil))) - (mail-header-subject + (mail-header-subject (gnus-data-header (assoc article (gnus-data-list nil)))) nil)) @@ -819,7 +820,7 @@ spam-use-* variable.") gnus-data-list function" (if (and (numberp article) (assoc article (gnus-data-list nil))) - (mail-header-message-id + (mail-header-message-id (gnus-data-header (assoc article (gnus-data-list nil)))) nil)) @@ -853,10 +854,10 @@ and further checks are also inhibited. The usual mailgroup name is the value of `spam-split-group', meaning that the message is definitely a spam.") -(defvar spam-list-of-statistical-checks +(defvar spam-list-of-statistical-checks '(spam-use-ifile - spam-use-regex-body - spam-use-stat + spam-use-regex-body + spam-use-stat spam-use-bogofilter spam-use-spamoracle) "The spam-list-of-statistical-checks list contains all the mail @@ -865,7 +866,7 @@ splitters that need to have the full message body available.") ;;;TODO: modify to invoke self with each check if invoked without specifics (defun spam-split (&rest specific-checks) "Split this message into the `spam' group if it is spam. -This function can be used as an entry in `nnmail-split-fancy', +This function can be used as an entry in the variable `nnmail-split-fancy', for example like this: (: spam-split). It can take checks as parameters. A string as a parameter will set the spam-split-group to that string. @@ -879,7 +880,7 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (when (stringp check) (setq spam-split-group-choice check) (setq specific-checks (delq check specific-checks)))) - + (let ((spam-split-group spam-split-group-choice)) (save-excursion (save-restriction @@ -897,7 +898,7 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (when (and (symbol-value (car pair)) (or (null specific-checks) (memq (car pair) specific-checks))) - (gnus-message 5 "spam-split: calling the %s function" + (gnus-message 5 "spam-split: calling the %s function" (symbol-name (cdr pair))) (setq decision (funcall (cdr pair))) ;; if we got a decision at all, save the current check @@ -908,7 +909,7 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (if spam-split-symbolic-return (setq decision spam-split-group) (gnus-error - 5 + 5 (format "spam-split got %s but %s is nil" (symbol-name decision) (symbol-name spam-split-symbolic-return)))))))) @@ -917,14 +918,14 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." decision)))))))) (defun spam-find-spam () - "This function will detect spam in the current newsgroup using spam-split" + "This function will detect spam in the current newsgroup using spam-split." (interactive) - + (let* ((group gnus-newsgroup-name) (autodetect (gnus-parameter-spam-autodetect group)) (methods (gnus-parameter-spam-autodetect-methods group)) (first-method (nth 0 methods))) - (when (and autodetect + (when (and autodetect (not (equal first-method 'none))) (mapcar (lambda (article) @@ -937,8 +938,8 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (spam-split-symbolic-return-positive t) (split-return (with-temp-buffer - (gnus-request-article-this-buffer - article + (gnus-request-article-this-buffer + article group) (if (or (null first-method) (equal first-method 'default)) @@ -952,7 +953,7 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (gnus-registry-add-group id group subject sender)) - (spam-log-processing-to-registry + (spam-log-processing-to-registry id 'incoming split-return @@ -965,7 +966,7 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (defvar spam-registration-functions ;; first the ham register, second the spam register function ;; third the ham unregister, fourth the spam unregister function - '((spam-use-blacklist nil + '((spam-use-blacklist nil spam-blacklist-register-routine nil spam-blacklist-unregister-routine) @@ -973,31 +974,31 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." nil spam-whitelist-unregister-routine nil) - (spam-use-BBDB spam-BBDB-register-routine + (spam-use-BBDB spam-BBDB-register-routine nil - spam-BBDB-unregister-routine + spam-BBDB-unregister-routine nil) - (spam-use-ifile spam-ifile-register-ham-routine + (spam-use-ifile spam-ifile-register-ham-routine spam-ifile-register-spam-routine - spam-ifile-unregister-ham-routine + spam-ifile-unregister-ham-routine spam-ifile-unregister-spam-routine) - (spam-use-spamoracle spam-spamoracle-learn-ham + (spam-use-spamoracle spam-spamoracle-learn-ham spam-spamoracle-learn-spam - spam-spamoracle-unlearn-ham + spam-spamoracle-unlearn-ham spam-spamoracle-unlearn-spam) - (spam-use-stat spam-stat-register-ham-routine + (spam-use-stat spam-stat-register-ham-routine spam-stat-register-spam-routine - spam-stat-unregister-ham-routine + spam-stat-unregister-ham-routine spam-stat-unregister-spam-routine) ;; note that spam-use-gmane is not a legitimate check - (spam-use-gmane nil + (spam-use-gmane nil spam-report-gmane-register-routine ;; does Gmane support unregistration? nil nil) - (spam-use-bogofilter spam-bogofilter-register-ham-routine + (spam-use-bogofilter spam-bogofilter-register-ham-routine spam-bogofilter-register-spam-routine - spam-bogofilter-unregister-ham-routine + spam-bogofilter-unregister-ham-routine spam-bogofilter-unregister-spam-routine)) "The spam-registration-functions list contains pairs associating a parameter variable with the ham and spam @@ -1031,8 +1032,8 @@ functions") (nth 2 flist)))) (defun spam-list-articles (articles classification) - (let ((mark-check (if (eq classification 'spam) - 'spam-group-spam-mark-p + (let ((mark-check (if (eq classification 'spam) + 'spam-group-spam-mark-p 'spam-group-ham-mark-p)) list mark-cache-yes mark-cache-no) (dolist (article articles) @@ -1042,7 +1043,7 @@ functions") (push article list) ;; else, we have to actually check the mark (if (funcall mark-check - gnus-newsgroup-name + gnus-newsgroup-name mark) (progn (push article list) @@ -1050,9 +1051,9 @@ functions") (push mark mark-cache-no)))))) list)) -(defun spam-register-routine (classification - check - &optional unregister +(defun spam-register-routine (classification + check + &optional unregister specific-articles) (when (and (spam-classification-valid-p classification) (spam-registration-check-valid-p check)) @@ -1060,8 +1061,8 @@ functions") (spam-registration-function classification check)) (unregister-function (spam-unregistration-function classification check)) - (run-function (if unregister - unregister-function + (run-function (if unregister + unregister-function register-function)) (log-function (if unregister 'spam-log-undo-registration @@ -1071,8 +1072,8 @@ functions") (when run-function ;; make list of articles, using specific-articles if given (setq articles (or specific-articles - (spam-list-articles - gnus-newsgroup-articles + (spam-list-articles + gnus-newsgroup-articles classification))) ;; process them (gnus-message 5 "%s %d %s articles with classification %s, check %s" @@ -1116,7 +1117,7 @@ functions") (if (and (stringp id) (spam-process-type-valid-p type)) (cdr-safe (gnus-registry-fetch-extra id type)) - (progn + (progn (gnus-message 5 (format "%s called with bad ID, type, classification, or check" "spam-log-registered-p")) nil)))) @@ -1136,7 +1137,7 @@ functions") (eq check (nth 1 cell))) (setq found t)))) found) - (progn + (progn (gnus-message 5 (format "%s called with bad ID, type, classification, or check" "spam-log-unregistration-needed-p")) nil)))) @@ -1160,12 +1161,12 @@ functions") id type new-cell-list)) - (progn + (progn (gnus-message 5 (format "%s called with bad ID, type, check, or group" "spam-log-undo-registration")) nil)))) -;;; set up IMAP widening if it's necessary +;;; set up IMAP widening if it's necessary (defun spam-setup-widening () (dolist (check spam-list-of-statistical-checks) (when (symbol-value check) @@ -1185,7 +1186,7 @@ functions") (defun spam-check-regex-headers (&optional body) (let ((type (if body "body" "header")) (spam-split-group (if spam-split-symbolic-return - 'spam + 'spam spam-split-group)) ret found) (dolist (h-regex spam-regex-headers-ham) @@ -1216,7 +1217,7 @@ functions") "Check the Received headers for blackholed relays." (let ((headers (nnmail-fetch-field "received")) (spam-split-group (if spam-split-symbolic-return - 'spam + 'spam spam-split-group)) ips matches) (when headers @@ -1233,7 +1234,7 @@ functions") (dolist (ip ips) (unless (and spam-blackhole-good-server-regex ;; match the good-server-regex against the reversed (again) IP string - (string-match + (string-match spam-blackhole-good-server-regex (spam-reverse-ip-string ip))) (unless matches @@ -1241,7 +1242,7 @@ functions") (if spam-use-dig (let ((query-result (query-dig query-string))) (when query-result - (gnus-message 5 "(DIG): positive blackhole check '%s'" + (gnus-message 5 "(DIG): positive blackhole check '%s'" query-result) (push (list ip server query-result) matches))) @@ -1258,7 +1259,7 @@ functions") (condition-case nil (progn (require 'hashcash) - + (defun spam-check-hashcash () "Check the headers for hashcash payments." (mail-check-payment))) ;mail-check-payment returns a boolean @@ -1267,7 +1268,7 @@ functions") (defalias 'mail-check-payment 'ignore) (defalias 'spam-check-hashcash 'ignore)))) -;;;; BBDB +;;;; BBDB ;;; original idea for spam-check-BBDB from Alexander Kotelnikov ;;; @@ -1278,29 +1279,29 @@ functions") (progn (require 'bbdb) (require 'bbdb-com) - + (defun spam-enter-ham-BBDB (addresses &optional remove) "Enter an address into the BBDB; implies ham (non-spam) sender" (dolist (from addresses) (when (stringp from) (let* ((parsed-address (gnus-extract-address-components from)) (name (or (nth 0 parsed-address) "Ham Sender")) - (remove-function (if remove + (remove-function (if remove 'bbdb-delete-record-internal 'ignore)) (net-address (nth 1 parsed-address)) - (record (and net-address + (record (and net-address (bbdb-search-simple nil net-address)))) (when net-address - (gnus-message 5 "%s address %s %s BBDB" - (if remove "Deleting" "Adding") + (gnus-message 5 "%s address %s %s BBDB" + (if remove "Deleting" "Adding") from (if remove "from" "to")) (if record (funcall remove-function record) - (bbdb-create-internal name nil net-address nil nil + (bbdb-create-internal name nil net-address nil nil "ham sender added by spam.el"))))))) - + (defun spam-BBDB-register-routine (articles &optional unregister) (let (addresses) (dolist (article articles) @@ -1316,12 +1317,12 @@ functions") "Mail from people in the BBDB is classified as ham or non-spam" (let ((who (nnmail-fetch-field "from")) (spam-split-group (if spam-split-symbolic-return - 'spam + 'spam spam-split-group))) (when who (setq who (nth 1 (gnus-extract-address-components who))) (if (bbdb-search-simple nil who) - t + t (if spam-use-BBDB-exclusive spam-split-group nil)))))) @@ -1347,12 +1348,12 @@ functions") (if spam-ifile-database-path (format "--db-file=%s" spam-ifile-database-path) nil)) - + (defun spam-check-ifile () - "Check the ifile backend for the classification of this message" - (let ((article-buffer-name (buffer-name)) + "Check the ifile backend for the classification of this message." + (let ((article-buffer-name (buffer-name)) (spam-split-group (if spam-split-symbolic-return - 'spam + 'spam spam-split-group)) category return) (with-temp-buffer @@ -1390,7 +1391,7 @@ Uses `gnus-newsgroup-name' if category is nil (for ham registration)." (insert article-string)))) (apply 'call-process-region (point-min) (point-max) spam-ifile-path - nil nil nil + nil nil nil add-or-delete-option category (if db `(,db "-h") `("-h")))))) @@ -1413,11 +1414,11 @@ Uses `gnus-newsgroup-name' if category is nil (for ham registration)." (progn (let ((spam-stat-install-hooks nil)) (require 'spam-stat)) - + (defun spam-check-stat () "Check the spam-stat backend for the classification of this message" (let ((spam-split-group (if spam-split-symbolic-return - 'spam + 'spam spam-split-group)) (spam-stat-split-fancy-spam-group spam-split-group) ; override (spam-stat-buffer (buffer-name)) ; stat the current buffer @@ -1450,7 +1451,7 @@ Uses `gnus-newsgroup-name' if category is nil (for ham registration)." (defun spam-maybe-spam-stat-load () (when spam-use-stat (spam-stat-load))) - + (defun spam-maybe-spam-stat-save () (when spam-use-stat (spam-stat-save)))) @@ -1484,16 +1485,16 @@ Uses `gnus-newsgroup-name' if category is nil (for ham registration)." ;;; address can be a list, too (defun spam-enter-whitelist (address &optional remove) - "Enter ADDRESS (list or single) into the whitelist. With a - non-nil REMOVE, remove them." + "Enter ADDRESS (list or single) into the whitelist. +With a non-nil REMOVE, remove them." (interactive "sAddress: ") (spam-enter-list address spam-whitelist remove) (setq spam-whitelist-cache nil)) ;;; address can be a list, too (defun spam-enter-blacklist (address &optional remove) - "Enter ADDRESS (list or single) into the blacklist. With a - non-nil REMOVE, remove them." + "Enter ADDRESS (list or single) into the blacklist. +With a non-nil REMOVE, remove them." (interactive "sAddress: ") (spam-enter-list address spam-blacklist remove) (setq spam-blacklist-cache nil)) @@ -1530,11 +1531,11 @@ REMOVE not nil, remove the ADDRESSES." (defun spam-check-whitelist () ;; FIXME! Should it detect when file timestamps change? (let ((spam-split-group (if spam-split-symbolic-return - 'spam + 'spam spam-split-group))) (unless spam-whitelist-cache (setq spam-whitelist-cache (spam-parse-list spam-whitelist))) - (if (spam-from-listed-p spam-whitelist-cache) + (if (spam-from-listed-p spam-whitelist-cache) t (if spam-use-whitelist-exclusive spam-split-group @@ -1543,7 +1544,7 @@ REMOVE not nil, remove the ADDRESSES." (defun spam-check-blacklist () ;; FIXME! Should it detect when file timestamps change? (let ((spam-split-group (if spam-split-symbolic-return - 'spam + 'spam spam-split-group))) (unless spam-blacklist-cache (setq spam-blacklist-cache (spam-parse-list spam-blacklist))) @@ -1581,7 +1582,7 @@ REMOVE not nil, remove the ADDRESSES." (defun spam-filelist-register-routine (articles blacklist &optional unregister) (let ((de-symbol (if blacklist 'spam-use-whitelist 'spam-use-blacklist)) (declassification (if blacklist 'ham 'spam)) - (enter-function + (enter-function (if blacklist 'spam-enter-blacklist 'spam-enter-whitelist)) (remove-function (if blacklist 'spam-enter-whitelist 'spam-enter-blacklist)) @@ -1598,7 +1599,7 @@ REMOVE not nil, remove the ADDRESSES." (setq sender-ignored t))) ;; remember the messages we need to unregister, unless remove is set (when (and - (null unregister) + (null unregister) (spam-log-unregistration-needed-p id 'process declassification de-symbol)) (push from unregister-list)) @@ -1640,7 +1641,7 @@ REMOVE not nil, remove the ADDRESSES." (defun spam-check-bogofilter-headers (&optional score) (let ((header (nnmail-fetch-field spam-bogofilter-header)) (spam-split-group (if spam-split-symbolic-return - 'spam + 'spam spam-split-group))) (when header ; return nil when no header (if score ; scoring mode @@ -1675,37 +1676,37 @@ REMOVE not nil, remove the ADDRESSES." (save-excursion (set-buffer article-buffer-name) (apply 'call-process-region - (point-min) (point-max) + (point-min) (point-max) spam-bogofilter-path nil temp-buffer-name nil (if db `("-d" ,db "-v") `("-v")))) (setq return (spam-check-bogofilter-headers score)))) return)) -(defun spam-bogofilter-register-with-bogofilter (articles - spam +(defun spam-bogofilter-register-with-bogofilter (articles + spam &optional unregister) "Register an article, given as a string, as spam or non-spam." (dolist (article articles) (let ((article-string (spam-get-article-as-string article)) (db spam-bogofilter-database-directory) (switch (if unregister - (if spam + (if spam spam-bogofilter-spam-strong-switch spam-bogofilter-ham-strong-switch) - (if spam - spam-bogofilter-spam-switch + (if spam + spam-bogofilter-spam-switch spam-bogofilter-ham-switch)))) (when (stringp article-string) (with-temp-buffer (insert article-string) (apply 'call-process-region - (point-min) (point-max) + (point-min) (point-max) spam-bogofilter-path nil nil nil switch (if db `("-d" ,db "-v") `("-v")))))))) - + (defun spam-bogofilter-register-spam-routine (articles &optional unregister) (spam-bogofilter-register-with-bogofilter articles t unregister)) @@ -1725,16 +1726,16 @@ REMOVE not nil, remove the ADDRESSES." "Run spamoracle on an article to determine whether it's spam." (let ((article-buffer-name (buffer-name)) (spam-split-group (if spam-split-symbolic-return - 'spam + 'spam spam-split-group))) (with-temp-buffer (let ((temp-buffer-name (buffer-name))) (save-excursion (set-buffer article-buffer-name) - (let ((status - (apply 'call-process-region + (let ((status + (apply 'call-process-region (point-min) (point-max) - spam-spamoracle-binary + spam-spamoracle-binary nil temp-buffer-name nil (if spam-spamoracle-database `("-f" ,spam-spamoracle-database "mark") @@ -1756,15 +1757,15 @@ REMOVE not nil, remove the ADDRESSES." (dolist (article articles) (insert (spam-get-article-as-string article))) (let* ((arg (if (spam-xor unregister article-is-spam-p) - "-spam" + "-spam" "-good")) - (status + (status (apply 'call-process-region (point-min) (point-max) spam-spamoracle-binary nil temp-buffer-name nil (if spam-spamoracle-database - `("-f" ,spam-spamoracle-database + `("-f" ,spam-spamoracle-database "add" ,arg) `("add" ,arg))))) (when (not (eq 0 status)) @@ -1819,3 +1820,7 @@ REMOVE not nil, remove the ADDRESSES." (provide 'spam) ;;; spam.el ends here. + +(provide 'spam) + +;;; spam.el ends here diff --git a/texi/ChangeLog b/texi/ChangeLog index 82845ac..37230bc 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,23 @@ +2004-01-03 Reiner Steib + + * emacs-mime.texi (Display Customization): Add mm-enable-external. + +2004-01-03 Lars Magne Ingebrigtsen + + * gnus.texi (Category Syntax): + gnus-agent-cat-enable-undownloaded-faces. + +2004-01-03 Reiner Steib + + * message.texi, gnus.texi, gnus-faq.texi: Update copyright. + + * gnus-faq.texi ([5.12]): Fix code example for FQDN in Message-Ids. + + * message.texi (Message Headers): Add message-header-synonyms. + + * gnus.texi (Other modes): New node. + (Oort Gnus): Refer to the above in "Dired integration". + 2004-01-02 Teodor Zlatanov * gnus.texi (Top): updated menu with new manual nodes diff --git a/texi/emacs-mime.texi b/texi/emacs-mime.texi index 7b5cce0..8c51bde 100644 --- a/texi/emacs-mime.texi +++ b/texi/emacs-mime.texi @@ -407,6 +407,22 @@ setting this option to non-@code{nil}. The default value is @code{t}. @vindex mm-external-terminal-program The program used to start an external terminal. +@item mm-enable-external +@vindex mm-enable-external +Indicate whether external MIME handlers should be used. + +If @code{t}, all defined external MIME handlers are used. If +@code{nil}, files are saved to disk (@code{mailcap-save-binary-file}). +If it is the symbol @code{ask}, you are prompted before the external +@acronym{MIME} handler is invoked. + +When you launch an attachment through mailcap (@pxref{mailcap}) an +attempt is made to use a safe viewer with the safest options--this isn't +the case if you save it to disk and launch it in a different way +(command line or double-clicking). Anyhow, if you want to be sure not +to launch any external programs, set this variable to @code{nil} or +@code{ask}. + @end table @node Files and Directories diff --git a/texi/gnus-faq.texi b/texi/gnus-faq.texi index 8611ff2..f6e4cf8 100644 --- a/texi/gnus-faq.texi +++ b/texi/gnus-faq.texi @@ -1,6 +1,6 @@ @c Insert "\input texinfo" at 1st line before texing this file alone. @c -*-texinfo-*- -@c Copyright (C) 1995, 2001, 2003 Free Software Foundation, Inc. +@c Copyright (C) 1995, 2001, 2003, 2004 Free Software Foundation, Inc. @setfilename gnus-faq.info @c Frequently Asked Questions, FAQ - Introduction, Emacs for Heathens, Top @@ -1845,17 +1845,25 @@ Answer: name to put after the "@@". If the name of the machine where Gnus is running isn't suitable (it probably isn't at most private machines) you can tell Gnus what to use - by saying: - - + by saying @example -(defun message-make-message-id() - (concat "<"(message-unique-id)"@@yourmachine.yourdomain.tld>")) +(setq message-user-fqdn "yourmachine.yourdomain.tld") @end example - - @noindent - in ~/.gnus. If you have no idea what to insert for + in ~/.gnus. If you use Gnus 5.9 or ealier, you can use this +instead: +@example +(eval-after-load "message" + '(let (myfqdn "yourmachine.yourdomain.tld");; <-- Edit this! + (if (boundp 'message-user-fqdn) + (setq message-user-fqdn fqdn) + (gnus-message 1 "Redefining `message-make-fqdn'.") + (defun message-make-fqdn () + "Return user's fully qualified domain name." + fqdn)))) +@end example + + If you have no idea what to insert for "yourmachine.yourdomain.tld", you've got several choices. You can either ask your provider if he allows you to use something like diff --git a/texi/gnus.texi b/texi/gnus.texi index 30dd97f..2d84c81 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -33,7 +33,7 @@ \makeindex \begin{document} -\newcommand{\gnusversionname}{Gnus v5.10.4} +\newcommand{\gnusversionname}{Gnus v5.10.5} \newcommand{\gnuschaptername}{} \newcommand{\gnussectionname}{} @@ -301,7 +301,7 @@ \thispagestyle{empty} Copyright \copyright{} 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003 +2002, 2003, 2004 Free Software Foundation, Inc. @@ -397,7 +397,7 @@ can be gotten by any nefarious means you can think of---@acronym{NNTP}, local spool or your mbox file. All at the same time, if you want to push your luck. -This manual corresponds to Gnus v5.10.4. +This manual corresponds to Gnus v5.10.5. @end ifinfo @@ -839,6 +839,7 @@ Various * Image Enhancements:: Modern versions of Emacs/XEmacs can display images. * Fuzzy Matching:: What's the big fuzz? * Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email. +* Other modes:: Interaction with other modes. * Various Various:: Things that are really various. Formatting Variables @@ -17628,11 +17629,17 @@ an integer that overrides the value of @item gnus-agent-cat-length-when-long an integer that overrides the value of @code{gnus-agent-long-article}. -@item gnus-agent-cat-disable-undownloaded-faces -a symbol indicating whether the summary buffer should @emph{not} display +@c @item gnus-agent-cat-disable-undownloaded-faces +@c a symbol indicating whether the summary buffer should @emph{not} display +@c undownloaded articles using the gnus-summary-*-undownloaded-face +@c faces. The symbol nil will enable the use of undownloaded faces while +@c all other symbols disable them. + +@item gnus-agent-cat-enable-undownloaded-faces +a symbol indicating whether the summary buffer should display undownloaded articles using the gnus-summary-*-undownloaded-face -faces. The symbol nil will enable the use of undownloaded faces while -all other symbols disable them. +faces. The symbol nil will disable the use of undownloaded faces while +all other symbols enable them. @end table The name of a category can not be changed once the category has been @@ -20494,6 +20501,7 @@ four days, Gnus will decay the scores four times, for instance. * Image Enhancements:: Modern versions of Emacs/XEmacs can display images. * Fuzzy Matching:: What's the big fuzz? * Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email. +* Other modes:: Interaction with other modes. * Various Various:: Things that are really various. @end menu @@ -23876,6 +23884,36 @@ Reduce table size: (spam-stat-reduce-size) Save table: (spam-stat-save) @end smallexample +@node Other modes +@section Interaction with other modes + +@subsection Dired +@cindex dired + +@code{gnus-dired-minor-mode} provided some useful functions for dired +buffers. It is enabled with +@lisp +(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode) +@end lisp + +@table @kbd +@item C-c C-m C-a +@findex gnus-dired-attach +Send dired's marked files as an attachment (@code{gnus-dired-attach}). +You will be prompted for a message buffer. + +@item C-c C-m C-l +@findex gnus-dired-find-file-mailcap +Visit a file according to the appropriate mailcap entry +(@code{gnus-dired-find-file-mailcap}). With prefix, open file in a new +buffer. + +@item C-c C-m C-p +@findex gnus-dired-print +Print file according to the mailcap entry (@code{gnus-dired-print}). If +there is no print command, print in a PostScript image. +@end table + @node Various Various @section Various Various @cindex mode lines @@ -25479,13 +25517,10 @@ appearance of all article buttons. @xref{Article Button Levels}. @item Dired integration -@code{gnus-dired-minor-mode} installs key bindings in dired buffers to send -a file as an attachment (@kbd{C-c C-a}), open a file using the appropriate -mailcap entry (@kbd{C-c C-l}), and print a file using the mailcap entry -(@kbd{C-c P}). It is enabled with -@lisp -(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode) -@end lisp +@code{gnus-dired-minor-mode} (see @ref{Other modes}) installs key +bindings in dired buffers to send a file as an attachment, open a file +using the appropriate mailcap entry, and print a file using the mailcap +entry. @item Gnus can display RSS newsfeeds as a newsgroup. @xref{RSS}. @@ -26464,7 +26499,7 @@ Gnus will work. @item Try doing an @kbd{M-x gnus-version}. If you get something that looks -like @samp{Gnus v5.10.4} you have the right files loaded. Otherwise +like @samp{Gnus v5.10.5} you have the right files loaded. Otherwise you have some old @file{.el} files lying around. Delete these. @item diff --git a/texi/message.texi b/texi/message.texi index 516d5f8..a12ba48 100644 --- a/texi/message.texi +++ b/texi/message.texi @@ -18,7 +18,7 @@ This file documents Message, the Emacs message composition mode. -Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document @@ -88,7 +88,7 @@ Message mode buffers. * Key Index:: List of Message mode keys. @end menu -This manual corresponds to Message v5.10.4. Message is distributed +This manual corresponds to Message v5.10.5. Message is distributed with the Gnus distribution bearing the same version number as this manual. @@ -1416,6 +1416,13 @@ hidden when composing a message. '(not "From" "Subject" "To" "Cc" "Newsgroups")) @end lisp +@item message-header-synonyms +@vindex message-header-synonyms +A list of lists of header synonyms. E.g., if this list contains a +member list with elements @code{Cc} and @code{To}, then +@code{message-carefully-insert-headers} will not insert a @code{To} +header when the message is already @code{Cc}ed to the recipient. + @end table -- 1.7.10.4