hide-ifdef-mode documented; mark some entries as not needed doc updates.
[bpt/emacs.git] / doc / misc / gnus.texi
CommitLineData
4009494e
GM
1\input texinfo
2
db78a8cb 3@setfilename ../../info/gnus
4009494e
GM
4@settitle Gnus Manual
5@syncodeindex fn cp
6@syncodeindex vr cp
7@syncodeindex pg cp
8
01c52d31
MB
9@documentencoding ISO-8859-1
10
4009494e
GM
11@copying
12Copyright @copyright{} 1995, 1996, 1997, 1998, 1999, 2000, 2001,
d82cf70b 132002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
4009494e
GM
14
15@quotation
16Permission is granted to copy, distribute and/or modify this document
6a2c4aec 17under the terms of the GNU Free Documentation License, Version 1.3 or
4009494e 18any later version published by the Free Software Foundation; with no
debf4439
GM
19Invariant Sections, with the Front-Cover texts being ``A GNU Manual'',
20and with the Back-Cover Texts as in (a) below. A copy of the license
21is included in the section entitled ``GNU Free Documentation License''.
4009494e 22
6f093307
GM
23(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
24modify this GNU manual. Buying copies from the FSF supports it in
25developing GNU and promoting software freedom.''
4009494e
GM
26@end quotation
27@end copying
28
29@iftex
30@iflatex
31\documentclass[twoside,a4paper,openright,11pt]{book}
32\usepackage[latin1]{inputenc}
33\usepackage{pagestyle}
34\usepackage{epsfig}
35\usepackage{pixidx}
36\input{gnusconfig.tex}
37
38\ifx\pdfoutput\undefined
39\else
40\usepackage[pdftex,bookmarks,colorlinks=true]{hyperref}
41\usepackage{thumbpdf}
42\pdfcompresslevel=9
43\fi
44
45\makeindex
46\begin{document}
47
48% Adjust ../Makefile.in if you change the following line:
c7ff939a 49\newcommand{\gnusversionname}{Gnus v5.13}
4009494e
GM
50\newcommand{\gnuschaptername}{}
51\newcommand{\gnussectionname}{}
52
53\newcommand{\gnusbackslash}{/}
54
55\newcommand{\gnusref}[1]{``#1'' on page \pageref{#1}}
56\ifx\pdfoutput\undefined
57\newcommand{\gnusuref}[1]{\gnustt{#1}}
58\else
59\newcommand{\gnusuref}[1]{\href{#1}{\gnustt{#1}}}
60\fi
61\newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}}
62\newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}}
63
64\newcommand{\gnuskindex}[1]{\index{#1}}
65\newcommand{\gnusindex}[1]{\index{#1}}
66
67\newcommand{\gnustt}[1]{{\gnusselectttfont{}#1}}
68\newcommand{\gnuscode}[1]{\gnustt{#1}}
69\newcommand{\gnusasis}[1]{\gnustt{#1}}
70\newcommand{\gnusurl}[1]{\gnustt{#1}}
71\newcommand{\gnuscommand}[1]{\gnustt{#1}}
72\newcommand{\gnusenv}[1]{\gnustt{#1}}
73\newcommand{\gnussamp}[1]{``{\fontencoding{OT1}\gnusselectttfont{}#1}''}
74\newcommand{\gnuslisp}[1]{\gnustt{#1}}
75\newcommand{\gnuskbd}[1]{`\gnustt{#1}'}
76\newcommand{\gnuskey}[1]{`\gnustt{#1}'}
77\newcommand{\gnusfile}[1]{`\gnustt{#1}'}
78\newcommand{\gnusdfn}[1]{\textit{#1}}
79\newcommand{\gnusi}[1]{\textit{#1}}
80\newcommand{\gnusr}[1]{\textrm{#1}}
81\newcommand{\gnusstrong}[1]{\textbf{#1}}
82\newcommand{\gnusemph}[1]{\textit{#1}}
83\newcommand{\gnusvar}[1]{{\fontsize{10pt}{10}\selectfont\textsl{\textsf{#1}}}}
84\newcommand{\gnussc}[1]{\textsc{#1}}
85\newcommand{\gnustitle}[1]{{\huge\textbf{#1}}}
86\newcommand{\gnusversion}[1]{{\small\textit{#1}}}
87\newcommand{\gnusauthor}[1]{{\large\textbf{#1}}}
88\newcommand{\gnusresult}[1]{\gnustt{=> #1}}
89\newcommand{\gnusacronym}[1]{\textsc{#1}}
90\newcommand{\gnusemail}[1]{\textit{#1}}
91
92\newcommand{\gnusbullet}{{${\bullet}$}}
93\newcommand{\gnusdollar}{\$}
94\newcommand{\gnusampersand}{\&}
95\newcommand{\gnuspercent}{\%}
96\newcommand{\gnushash}{\#}
97\newcommand{\gnushat}{\symbol{"5E}}
98\newcommand{\gnusunderline}{\symbol{"5F}}
99\newcommand{\gnusnot}{$\neg$}
100\newcommand{\gnustilde}{\symbol{"7E}}
101\newcommand{\gnusless}{{$<$}}
102\newcommand{\gnusgreater}{{$>$}}
103\newcommand{\gnusbraceleft}{{$>$}}
104\newcommand{\gnusbraceright}{{$>$}}
105
106\newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head,height=1cm}}}
107\newcommand{\gnusinteresting}{
108\marginpar[\mbox{}\hfill\gnushead]{\gnushead}
109}
110
111\newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
112
113\newcommand{\gnuspagechapter}[1]{
114{\mbox{}}
115}
116
117\newdimen{\gnusdimen}
118\gnusdimen 0pt
119
120\newcommand{\gnuschapter}[2]{
121\gnuscleardoublepage
122\ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi
123\chapter{#2}
124\renewcommand{\gnussectionname}{}
125\renewcommand{\gnuschaptername}{#2}
126\thispagestyle{empty}
127\hspace*{-2cm}
128\begin{picture}(500,500)(0,0)
129\put(480,350){\makebox(0,0)[tr]{#1}}
130\put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}}
131\end{picture}
132\clearpage
133}
134
135\newcommand{\gnusfigure}[3]{
136\begin{figure}
137\mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2)
138#3
139\end{picture}
140\caption{#1}
141\end{figure}
142}
143
144\newcommand{\gnusicon}[1]{
145\marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=ps/#1-up,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=ps/#1-up,height=1cm}}}
146}
147
148\newcommand{\gnuspicon}[1]{
149\margindex{\epsfig{figure=#1,width=2cm}}
150}
151
152\newcommand{\gnusxface}[2]{
153\margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}}
154}
155
156\newcommand{\gnussmiley}[2]{
157\margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}}
158}
159
160\newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1}
161
162\newcommand{\gnussection}[1]{
163\renewcommand{\gnussectionname}{#1}
164\section{#1}
165}
166
167\newenvironment{codelist}%
168{\begin{list}{}{
169}
170}{\end{list}}
171
172\newenvironment{asislist}%
173{\begin{list}{}{
174}
175}{\end{list}}
176
177\newenvironment{kbdlist}%
178{\begin{list}{}{
179\labelwidth=0cm
180}
181}{\end{list}}
182
183\newenvironment{dfnlist}%
184{\begin{list}{}{
185}
186}{\end{list}}
187
188\newenvironment{stronglist}%
189{\begin{list}{}{
190}
191}{\end{list}}
192
193\newenvironment{samplist}%
194{\begin{list}{}{
195}
196}{\end{list}}
197
198\newenvironment{varlist}%
199{\begin{list}{}{
200}
201}{\end{list}}
202
203\newenvironment{emphlist}%
204{\begin{list}{}{
205}
206}{\end{list}}
207
208\newlength\gnusheadtextwidth
209\setlength{\gnusheadtextwidth}{\headtextwidth}
210\addtolength{\gnusheadtextwidth}{1cm}
211
212\newpagestyle{gnuspreamble}%
213{
214{
215\ifodd\count0
216{
217\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}}
218}
219\else
220{
221\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}}
222}
223}
224\fi
225}
226}
227{
228\ifodd\count0
229\mbox{} \hfill
230\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
231\else
232\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
233\hfill \mbox{}
234\fi
235}
236
237\newpagestyle{gnusindex}%
238{
239{
240\ifodd\count0
241{
242\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}}
243}
244\else
245{
246\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}
247}
248\fi
249}
250}
251{
252\ifodd\count0
253\mbox{} \hfill
254\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
255\else
256\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
257\hfill \mbox{}
258\fi
259}
260
261\newpagestyle{gnus}%
262{
263{
264\ifodd\count0
265{
266\makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}}
267}
268\else
269{
270\makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}}
271}
272\fi
273}
274}
275{
276\ifodd\count0
277\mbox{} \hfill
278\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
279\else
280\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
281\hfill \mbox{}
282\fi
283}
284
285\pagenumbering{roman}
286\pagestyle{gnuspreamble}
287
288@end iflatex
289@end iftex
290
291@iftex
292@iflatex
293
294\begin{titlepage}
295{
296
297%\addtolength{\oddsidemargin}{-5cm}
298%\addtolength{\evensidemargin}{-5cm}
299\parindent=0cm
300\addtolength{\textheight}{2cm}
301
302\gnustitle{\gnustitlename}\hfill\gnusversion{\gnusversionname}\\
303\rule{15cm}{1mm}\\
304\vfill
305\hspace*{0cm}\epsfig{figure=ps/gnus-big-logo,height=15cm}
306\vfill
307\rule{15cm}{1mm}\\
308\gnusauthor{by Lars Magne Ingebrigtsen}
309\newpage
310}
311
312\mbox{}
313\vfill
314
315\thispagestyle{empty}
316
317@c @insertcopying
318\newpage
319\end{titlepage}
320@end iflatex
321@end iftex
322
323@ifnottex
324@insertcopying
325@end ifnottex
326
327@dircategory Emacs
328@direntry
329* Gnus: (gnus). The newsreader Gnus.
330@end direntry
331@iftex
332@finalout
333@end iftex
334@setchapternewpage odd
335
336
337
338@titlepage
339@title Gnus Manual
340
341@author by Lars Magne Ingebrigtsen
342@page
343@vskip 0pt plus 1filll
344@insertcopying
345@end titlepage
346
347
348@node Top
349@top The Gnus Newsreader
350
351@ifinfo
352
353You can read news (and mail) from within Emacs by using Gnus. The news
354can be gotten by any nefarious means you can think of---@acronym{NNTP}, local
355spool or your mbox file. All at the same time, if you want to push your
356luck.
357
358@c Adjust ../Makefile.in if you change the following line:
c7ff939a 359This manual corresponds to Gnus v5.13
4009494e
GM
360
361@end ifinfo
362
363@iftex
364
365@iflatex
366\tableofcontents
367\gnuscleardoublepage
368@end iflatex
369
370Gnus is the advanced, self-documenting, customizable, extensible
371unreal-time newsreader for GNU Emacs.
372
373Oops. That sounds oddly familiar, so let's start over again to avoid
374being accused of plagiarism:
375
376Gnus is a message-reading laboratory. It will let you look at just
377about anything as if it were a newsgroup. You can read mail with it,
378you can browse directories with it, you can @code{ftp} with it---you
379can even read news with it!
380
381Gnus tries to empower people who read news the same way Emacs empowers
382people who edit text. Gnus sets no limits to what the user should be
383allowed to do. Users are encouraged to extend Gnus to make it behave
384like they want it to behave. A program should not control people;
385people should be empowered to do what they want by using (or abusing)
386the program.
387
9b3ebcb6 388@c Adjust ../Makefile.in if you change the following line:
2e4089ab 389This manual corresponds to Gnus v5.13
9b3ebcb6
MB
390
391@heading Other related manuals
392@itemize
393@item Message manual: Composing messages
394@item Emacs-MIME: Composing messages; @acronym{MIME}-specific parts.
395@item Sieve: Managing Sieve scripts in Emacs.
396@item PGG: @acronym{PGP/MIME} with Gnus.
2e4089ab 397@item SASL: @acronym{SASL} authentication in Emacs.
9b3ebcb6
MB
398@end itemize
399
4009494e
GM
400@end iftex
401
402@menu
403* Starting Up:: Finding news can be a pain.
404* Group Buffer:: Selecting, subscribing and killing groups.
405* Summary Buffer:: Reading, saving and posting articles.
406* Article Buffer:: Displaying and handling articles.
407* Composing Messages:: Information on sending mail and news.
408* Select Methods:: Gnus reads all messages from various select methods.
409* Scoring:: Assigning values to articles.
410* Various:: General purpose settings.
411* The End:: Farewell and goodbye.
412* Appendices:: Terminology, Emacs intro, @acronym{FAQ}, History, Internals.
413* GNU Free Documentation License:: The license for this documentation.
414* Index:: Variable, function and concept index.
415* Key Index:: Key Index.
416
417Other related manuals
418
419* Message:(message). Composing messages.
420* Emacs-MIME:(emacs-mime). Composing messages; @acronym{MIME}-specific parts.
421* Sieve:(sieve). Managing Sieve scripts in Emacs.
422* PGG:(pgg). @acronym{PGP/MIME} with Gnus.
01c52d31 423* SASL:(sasl). @acronym{SASL} authentication in Emacs.
4009494e
GM
424
425@detailmenu
426 --- The Detailed Node Listing ---
427
428Starting Gnus
429
430* Finding the News:: Choosing a method for getting news.
431* The First Time:: What does Gnus do the first time you start it?
432* The Server is Down:: How can I read my mail then?
433* Slave Gnusae:: You can have more than one Gnus active at a time.
434* Fetching a Group:: Starting Gnus just to read a group.
435* New Groups:: What is Gnus supposed to do with new groups?
436* Changing Servers:: You may want to move from one server to another.
437* Startup Files:: Those pesky startup files---@file{.newsrc}.
438* Auto Save:: Recovering from a crash.
439* The Active File:: Reading the active file over a slow line Takes Time.
440* Startup Variables:: Other variables you might change.
441
442New Groups
443
444* Checking New Groups:: Determining what groups are new.
445* Subscription Methods:: What Gnus should do with new groups.
446* Filtering New Groups:: Making Gnus ignore certain new groups.
447
448Group Buffer
449
450* Group Buffer Format:: Information listed and how you can change it.
451* Group Maneuvering:: Commands for moving in the group buffer.
452* Selecting a Group:: Actually reading news.
453* Subscription Commands:: Unsubscribing, killing, subscribing.
454* Group Data:: Changing the info for a group.
455* Group Levels:: Levels? What are those, then?
456* Group Score:: A mechanism for finding out what groups you like.
457* Marking Groups:: You can mark groups for later processing.
458* Foreign Groups:: Creating and editing groups.
459* Group Parameters:: Each group may have different parameters set.
460* Listing Groups:: Gnus can list various subsets of the groups.
461* Sorting Groups:: Re-arrange the group order.
462* Group Maintenance:: Maintaining a tidy @file{.newsrc} file.
463* Browse Foreign Server:: You can browse a server. See what it has to offer.
464* Exiting Gnus:: Stop reading news and get some work done.
465* Group Topics:: A folding group mode divided into topics.
01c52d31 466* Non-ASCII Group Names:: Accessing groups of non-English names.
4009494e
GM
467* Misc Group Stuff:: Other stuff that you can to do.
468
469Group Buffer Format
470
471* Group Line Specification:: Deciding how the group buffer is to look.
472* Group Mode Line Specification:: The group buffer mode line.
473* Group Highlighting:: Having nice colors in the group buffer.
474
475Group Topics
476
477* Topic Commands:: Interactive E-Z commands.
478* Topic Variables:: How to customize the topics the Lisp Way.
479* Topic Sorting:: Sorting each topic individually.
480* Topic Topology:: A map of the world.
481* Topic Parameters:: Parameters that apply to all groups in a topic.
482
483Misc Group Stuff
484
485* Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
486* Group Information:: Information and help on groups and Gnus.
487* Group Timestamp:: Making Gnus keep track of when you last read a group.
488* File Commands:: Reading and writing the Gnus files.
489* Sieve Commands:: Managing Sieve scripts.
490
491Summary Buffer
492
493* Summary Buffer Format:: Deciding how the summary buffer is to look.
494* Summary Maneuvering:: Moving around the summary buffer.
495* Choosing Articles:: Reading articles.
496* Paging the Article:: Scrolling the current article.
497* Reply Followup and Post:: Posting articles.
498* Delayed Articles:: Send articles at a later time.
499* Marking Articles:: Marking articles as read, expirable, etc.
500* Limiting:: You can limit the summary buffer.
501* Threading:: How threads are made.
502* Sorting the Summary Buffer:: How articles and threads are sorted.
503* Asynchronous Fetching:: Gnus might be able to pre-fetch articles.
504* Article Caching:: You may store articles in a cache.
505* Persistent Articles:: Making articles expiry-resistant.
01c52d31 506* Sticky Articles:: Article buffers that are not reused.
4009494e
GM
507* Article Backlog:: Having already read articles hang around.
508* Saving Articles:: Ways of customizing article saving.
509* Decoding Articles:: Gnus can treat series of (uu)encoded articles.
510* Article Treatment:: The article buffer can be mangled at will.
511* MIME Commands:: Doing MIMEy things with the articles.
512* Charsets:: Character set issues.
513* Article Commands:: Doing various things with the article buffer.
514* Summary Sorting:: Sorting the summary buffer in various ways.
515* Finding the Parent:: No child support? Get the parent.
516* Alternative Approaches:: Reading using non-default summaries.
517* Tree Display:: A more visual display of threads.
518* Mail Group Commands:: Some commands can only be used in mail groups.
519* Various Summary Stuff:: What didn't fit anywhere else.
520* Exiting the Summary Buffer:: Returning to the Group buffer,
521 or reselecting the current group.
522* Crosspost Handling:: How crossposted articles are dealt with.
523* Duplicate Suppression:: An alternative when crosspost handling fails.
524* Security:: Decrypt and Verify.
525* Mailing List:: Mailing list minor mode.
526
527Summary Buffer Format
528
529* Summary Buffer Lines:: You can specify how summary lines should look.
530* To From Newsgroups:: How to not display your own name.
531* Summary Buffer Mode Line:: You can say how the mode line should look.
532* Summary Highlighting:: Making the summary buffer all pretty and nice.
533
534Choosing Articles
535
536* Choosing Commands:: Commands for choosing articles.
537* Choosing Variables:: Variables that influence these commands.
538
539Reply, Followup and Post
540
541* Summary Mail Commands:: Sending mail.
542* Summary Post Commands:: Sending news.
543* Summary Message Commands:: Other Message-related commands.
544* Canceling and Superseding::
545
546Marking Articles
547
548* Unread Articles:: Marks for unread articles.
549* Read Articles:: Marks for read articles.
550* Other Marks:: Marks that do not affect readedness.
551* Setting Marks:: How to set and remove marks.
552* Generic Marking Commands:: How to customize the marking.
553* Setting Process Marks:: How to mark articles for later processing.
554
555Threading
556
557* Customizing Threading:: Variables you can change to affect the threading.
558* Thread Commands:: Thread based commands in the summary buffer.
559
560Customizing Threading
561
562* Loose Threads:: How Gnus gathers loose threads into bigger threads.
563* Filling In Threads:: Making the threads displayed look fuller.
564* More Threading:: Even more variables for fiddling with threads.
565* Low-Level Threading:: You thought it was over@dots{} but you were wrong!
566
567Decoding Articles
568
569* Uuencoded Articles:: Uudecode articles.
570* Shell Archives:: Unshar articles.
571* PostScript Files:: Split PostScript.
572* Other Files:: Plain save and binhex.
573* Decoding Variables:: Variables for a happy decoding.
574* Viewing Files:: You want to look at the result of the decoding?
575
576Decoding Variables
577
578* Rule Variables:: Variables that say how a file is to be viewed.
579* Other Decode Variables:: Other decode variables.
580* Uuencoding and Posting:: Variables for customizing uuencoding.
581
582Article Treatment
583
584* Article Highlighting:: You want to make the article look like fruit salad.
585* Article Fontisizing:: Making emphasized text look nice.
586* Article Hiding:: You also want to make certain info go away.
587* Article Washing:: Lots of way-neat functions to make life better.
588* Article Header:: Doing various header transformations.
589* Article Buttons:: Click on URLs, Message-IDs, addresses and the like.
590* Article Button Levels:: Controlling appearance of buttons.
591* Article Date:: Grumble, UT!
592* Article Display:: Display various stuff---X-Face, Picons, Smileys
593* Article Signature:: What is a signature?
594* Article Miscellanea:: Various other stuff.
595
596Alternative Approaches
597
598* Pick and Read:: First mark articles and then read them.
599* Binary Groups:: Auto-decode all articles.
600
601Various Summary Stuff
602
603* Summary Group Information:: Information oriented commands.
604* Searching for Articles:: Multiple article commands.
605* Summary Generation Commands::
606* Really Various Summary Commands:: Those pesky non-conformant commands.
607
608Article Buffer
609
610* Hiding Headers:: Deciding what headers should be displayed.
611* Using MIME:: Pushing articles through @acronym{MIME} before reading them.
612* Customizing Articles:: Tailoring the look of the articles.
613* Article Keymap:: Keystrokes available in the article buffer.
614* Misc Article:: Other stuff.
615
616Composing Messages
617
618* Mail:: Mailing and replying.
619* Posting Server:: What server should you post and mail via?
620* POP before SMTP:: You cannot send a mail unless you read a mail.
621* Mail and Post:: Mailing and posting at the same time.
622* Archived Messages:: Where Gnus stores the messages you've sent.
623* Posting Styles:: An easier way to specify who you are.
624* Drafts:: Postponing messages and rejected messages.
625* Rejected Articles:: What happens if the server doesn't like your article?
626* Signing and encrypting:: How to compose secure messages.
627
628Select Methods
629
630* Server Buffer:: Making and editing virtual servers.
631* Getting News:: Reading USENET news with Gnus.
632* Getting Mail:: Reading your personal mail with Gnus.
633* Browsing the Web:: Getting messages from a plethora of Web sources.
634* IMAP:: Using Gnus as a @acronym{IMAP} client.
635* Other Sources:: Reading directories, files, SOUP packets.
636* Combined Groups:: Combining groups into one group.
637* Email Based Diary:: Using mails to manage diary events in Gnus.
638* Gnus Unplugged:: Reading news and mail offline.
639
640Server Buffer
641
642* Server Buffer Format:: You can customize the look of this buffer.
643* Server Commands:: Commands to manipulate servers.
644* Example Methods:: Examples server specifications.
645* Creating a Virtual Server:: An example session.
646* Server Variables:: Which variables to set.
647* Servers and Methods:: You can use server names as select methods.
648* Unavailable Servers:: Some servers you try to contact may be down.
649
650Getting News
651
652* NNTP:: Reading news from an @acronym{NNTP} server.
653* News Spool:: Reading news from the local spool.
654
655@acronym{NNTP}
656
657* Direct Functions:: Connecting directly to the server.
658* Indirect Functions:: Connecting indirectly to the server.
659* Common Variables:: Understood by several connection functions.
01c52d31 660* NNTP marks:: Storing marks for @acronym{NNTP} servers.
4009494e
GM
661
662Getting Mail
663
664* Mail in a Newsreader:: Important introductory notes.
665* Getting Started Reading Mail:: A simple cookbook example.
666* Splitting Mail:: How to create mail groups.
667* Mail Sources:: How to tell Gnus where to get mail from.
668* Mail Back End Variables:: Variables for customizing mail handling.
669* Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.
670* Group Mail Splitting:: Use group customize to drive mail splitting.
671* Incorporating Old Mail:: What about the old mail you have?
672* Expiring Mail:: Getting rid of unwanted mail.
673* Washing Mail:: Removing cruft from the mail you get.
674* Duplicates:: Dealing with duplicated mail.
675* Not Reading Mail:: Using mail back ends for reading other files.
676* Choosing a Mail Back End:: Gnus can read a variety of mail formats.
677
678Mail Sources
679
680* Mail Source Specifiers:: How to specify what a mail source is.
681* Mail Source Customization:: Some variables that influence things.
682* Fetching Mail:: Using the mail source specifiers.
683
684Choosing a Mail Back End
685
686* Unix Mail Box:: Using the (quite) standard Un*x mbox.
687* Rmail Babyl:: Emacs programs use the Rmail Babyl format.
688* Mail Spool:: Store your mail in a private spool?
689* MH Spool:: An mhspool-like back end.
690* Maildir:: Another one-file-per-message format.
691* Mail Folders:: Having one file for each group.
692* Comparing Mail Back Ends:: An in-depth looks at pros and cons.
693
694Browsing the Web
695
696* Archiving Mail::
697* Web Searches:: Creating groups from articles that match a string.
698* Slashdot:: Reading the Slashdot comments.
699* Ultimate:: The Ultimate Bulletin Board systems.
700* Web Archive:: Reading mailing list archived on web.
701* RSS:: Reading RDF site summary.
702* Customizing W3:: Doing stuff to Emacs/W3 from Gnus.
703
704@acronym{IMAP}
705
706* Splitting in IMAP:: Splitting mail with nnimap.
707* Expiring in IMAP:: Expiring mail with nnimap.
708* Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox.
709* Expunging mailboxes:: Equivalent of a ``compress mailbox'' button.
710* A note on namespaces:: How to (not) use @acronym{IMAP} namespace in Gnus.
711* Debugging IMAP:: What to do when things don't work.
712
713Other Sources
714
715* Directory Groups:: You can read a directory as if it was a newsgroup.
716* Anything Groups:: Dired? Who needs dired?
717* Document Groups:: Single files can be the basis of a group.
718* SOUP:: Reading @sc{soup} packets ``offline''.
719* Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
720
721Document Groups
722
723* Document Server Internals:: How to add your own document types.
724
725SOUP
726
727* SOUP Commands:: Commands for creating and sending @sc{soup} packets
728* SOUP Groups:: A back end for reading @sc{soup} packets.
729* SOUP Replies:: How to enable @code{nnsoup} to take over mail and news.
730
731Combined Groups
732
733* Virtual Groups:: Combining articles from many groups.
734* Kibozed Groups:: Looking through parts of the newsfeed for articles.
735
736Email Based Diary
737
738* The NNDiary Back End:: Basic setup and usage.
739* The Gnus Diary Library:: Utility toolkit on top of nndiary.
740* Sending or Not Sending:: A final note on sending diary messages.
741
742The NNDiary Back End
743
744* Diary Messages:: What makes a message valid for nndiary.
745* Running NNDiary:: NNDiary has two modes of operation.
746* Customizing NNDiary:: Bells and whistles.
747
748The Gnus Diary Library
749
750* Diary Summary Line Format:: A nicer summary buffer line format.
751* Diary Articles Sorting:: A nicer way to sort messages.
752* Diary Headers Generation:: Not doing it manually.
753* Diary Group Parameters:: Not handling them manually.
754
755Gnus Unplugged
756
757* Agent Basics:: How it all is supposed to work.
758* Agent Categories:: How to tell the Gnus Agent what to download.
759* Agent Commands:: New commands for all the buffers.
760* Agent Visuals:: Ways that the agent may effect your summary buffer.
761* Agent as Cache:: The Agent is a big cache too.
762* Agent Expiry:: How to make old articles go away.
763* Agent Regeneration:: How to recover from lost connections and other accidents.
01c52d31 764* Agent and flags:: How the Agent maintains flags.
4009494e
GM
765* Agent and IMAP:: How to use the Agent with @acronym{IMAP}.
766* Outgoing Messages:: What happens when you post/mail something?
767* Agent Variables:: Customizing is fun.
768* Example Setup:: An example @file{~/.gnus.el} file for offline people.
769* Batching Agents:: How to fetch news from a @code{cron} job.
770* Agent Caveats:: What you think it'll do and what it does.
771
772Agent Categories
773
774* Category Syntax:: What a category looks like.
775* Category Buffer:: A buffer for maintaining categories.
776* Category Variables:: Customize'r'Us.
777
778Agent Commands
779
780* Group Agent Commands:: Configure groups and fetch their contents.
781* Summary Agent Commands:: Manually select then fetch specific articles.
782* Server Agent Commands:: Select the servers that are supported by the agent.
783
784Scoring
785
786* Summary Score Commands:: Adding score entries for the current group.
787* Group Score Commands:: General score commands.
788* Score Variables:: Customize your scoring. (My, what terminology).
789* Score File Format:: What a score file may contain.
790* Score File Editing:: You can edit score files by hand as well.
791* Adaptive Scoring:: Big Sister Gnus knows what you read.
792* Home Score File:: How to say where new score entries are to go.
793* Followups To Yourself:: Having Gnus notice when people answer you.
794* Scoring On Other Headers:: Scoring on non-standard headers.
795* Scoring Tips:: How to score effectively.
796* Reverse Scoring:: That problem child of old is not problem.
797* Global Score Files:: Earth-spanning, ear-splitting score files.
798* Kill Files:: They are still here, but they can be ignored.
799* Converting Kill Files:: Translating kill files to score files.
4009494e
GM
800* Advanced Scoring:: Using logical expressions to build score rules.
801* Score Decays:: It can be useful to let scores wither away.
802
4009494e
GM
803Advanced Scoring
804
805* Advanced Scoring Syntax:: A definition.
806* Advanced Scoring Examples:: What they look like.
807* Advanced Scoring Tips:: Getting the most out of it.
808
809Various
810
811* Process/Prefix:: A convention used by many treatment commands.
812* Interactive:: Making Gnus ask you many questions.
813* Symbolic Prefixes:: How to supply some Gnus functions with options.
814* Formatting Variables:: You can specify what buffers should look like.
815* Window Layout:: Configuring the Gnus buffer windows.
816* Faces and Fonts:: How to change how faces look.
817* Compilation:: How to speed Gnus up.
818* Mode Lines:: Displaying information in the mode lines.
819* Highlighting and Menus:: Making buffers look all nice and cozy.
820* Buttons:: Get tendinitis in ten easy steps!
821* Daemons:: Gnus can do things behind your back.
822* NoCeM:: How to avoid spam and other fatty foods.
823* Undo:: Some actions can be undone.
824* Predicate Specifiers:: Specifying predicates.
825* Moderation:: What to do if you're a moderator.
826* Image Enhancements:: Modern versions of Emacs/XEmacs can display images.
827* Fuzzy Matching:: What's the big fuzz?
828* Thwarting Email Spam:: Simple ways to avoid unsolicited commercial email.
829* Spam Package:: A package for filtering and processing spam.
64763fe3 830* The Gnus Registry:: A package for tracking messages by Message-ID.
4009494e
GM
831* Other modes:: Interaction with other modes.
832* Various Various:: Things that are really various.
833
834Formatting Variables
835
836* Formatting Basics:: A formatting variable is basically a format string.
837* Mode Line Formatting:: Some rules about mode line formatting variables.
838* Advanced Formatting:: Modifying output in various ways.
839* User-Defined Specs:: Having Gnus call your own functions.
840* Formatting Fonts:: Making the formatting look colorful and nice.
841* Positioning Point:: Moving point to a position after an operation.
842* Tabulation:: Tabulating your output.
843* Wide Characters:: Dealing with wide characters.
844
845Image Enhancements
846
847* X-Face:: Display a funky, teensy black-and-white image.
848* Face:: Display a funkier, teensier colored image.
849* Smileys:: Show all those happy faces the way they were
850 meant to be shown.
851* Picons:: How to display pictures of what you're reading.
852* XVarious:: Other XEmacsy Gnusey variables.
853
854Thwarting Email Spam
855
856* The problem of spam:: Some background, and some solutions
857* Anti-Spam Basics:: Simple steps to reduce the amount of spam.
858* SpamAssassin:: How to use external anti-spam tools.
859* Hashcash:: Reduce spam by burning CPU time.
860
861Spam Package
862
863* Spam Package Introduction::
864* Filtering Incoming Mail::
865* Detecting Spam in Groups::
866* Spam and Ham Processors::
867* Spam Package Configuration Examples::
868* Spam Back Ends::
869* Extending the Spam package::
870* Spam Statistics Package::
871
872Spam Statistics Package
873
874* Creating a spam-stat dictionary::
875* Splitting mail using spam-stat::
876* Low-level interface to the spam-stat dictionary::
877
878Appendices
879
880* XEmacs:: Requirements for installing under XEmacs.
881* History:: How Gnus got where it is today.
882* On Writing Manuals:: Why this is not a beginner's guide.
883* Terminology:: We use really difficult, like, words here.
884* Customization:: Tailoring Gnus to your needs.
885* Troubleshooting:: What you might try if things do not work.
886* Gnus Reference Guide:: Rilly, rilly technical stuff.
887* Emacs for Heathens:: A short introduction to Emacsian terms.
888* Frequently Asked Questions:: The Gnus FAQ
889
890History
891
892* Gnus Versions:: What Gnus versions have been released.
893* Other Gnus Versions:: Other Gnus versions that also have been released.
894* Why?:: What's the point of Gnus?
895* Compatibility:: Just how compatible is Gnus with @sc{gnus}?
896* Conformity:: Gnus tries to conform to all standards.
897* Emacsen:: Gnus can be run on a few modern Emacsen.
898* Gnus Development:: How Gnus is developed.
899* Contributors:: Oodles of people.
900* New Features:: Pointers to some of the new stuff in Gnus.
901
902New Features
903
904* ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus.
905* September Gnus:: The Thing Formally Known As Gnus 5.2/5.3.
906* Red Gnus:: Third time best---Gnus 5.4/5.5.
907* Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7.
908* Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9.
909* Oort Gnus:: It's big. It's far out. Gnus 5.10/5.11.
01c52d31 910* No Gnus:: Very punny.
4009494e
GM
911
912Customization
913
914* Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.
915* Slow Terminal Connection:: You run a remote Emacs.
916* Little Disk Space:: You feel that having large setup files is icky.
917* Slow Machine:: You feel like buying a faster machine.
918
919Gnus Reference Guide
920
921* Gnus Utility Functions:: Common functions and variable to use.
922* Back End Interface:: How Gnus communicates with the servers.
923* Score File Syntax:: A BNF definition of the score file standard.
924* Headers:: How Gnus stores headers internally.
925* Ranges:: A handy format for storing mucho numbers.
926* Group Info:: The group info format.
927* Extended Interactive:: Symbolic prefixes and stuff.
928* Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen.
929* Various File Formats:: Formats of files that Gnus use.
930
931Back End Interface
932
933* Required Back End Functions:: Functions that must be implemented.
934* Optional Back End Functions:: Functions that need not be implemented.
935* Error Messaging:: How to get messages and report errors.
936* Writing New Back Ends:: Extending old back ends.
937* Hooking New Back Ends Into Gnus:: What has to be done on the Gnus end.
938* Mail-like Back Ends:: Some tips on mail back ends.
939
940Various File Formats
941
942* Active File Format:: Information on articles and groups available.
943* Newsgroups File Format:: Group descriptions.
944
945Emacs for Heathens
946
947* Keystrokes:: Entering text and executing commands.
948* Emacs Lisp:: The built-in Emacs programming language.
949
950@end detailmenu
951@end menu
952
953@node Starting Up
954@chapter Starting Gnus
955@cindex starting up
956
957If you haven't used Emacs much before using Gnus, read @ref{Emacs for
958Heathens} first.
959
960@kindex M-x gnus
961@findex gnus
962If your system administrator has set things up properly, starting Gnus
963and reading news is extremely easy---you just type @kbd{M-x gnus} in
964your Emacs. If not, you should customize the variable
965@code{gnus-select-method} as described in @ref{Finding the News}. For a
966minimal setup for posting should also customize the variables
967@code{user-full-name} and @code{user-mail-address}.
968
969@findex gnus-other-frame
970@kindex M-x gnus-other-frame
971If you want to start Gnus in a different frame, you can use the command
972@kbd{M-x gnus-other-frame} instead.
973
974If things do not go smoothly at startup, you have to twiddle some
975variables in your @file{~/.gnus.el} file. This file is similar to
976@file{~/.emacs}, but is read when Gnus starts.
977
978If you puzzle at any terms used in this manual, please refer to the
979terminology section (@pxref{Terminology}).
980
981@menu
982* Finding the News:: Choosing a method for getting news.
983* The First Time:: What does Gnus do the first time you start it?
984* The Server is Down:: How can I read my mail then?
985* Slave Gnusae:: You can have more than one Gnus active at a time.
986* New Groups:: What is Gnus supposed to do with new groups?
987* Changing Servers:: You may want to move from one server to another.
988* Startup Files:: Those pesky startup files---@file{.newsrc}.
989* Auto Save:: Recovering from a crash.
990* The Active File:: Reading the active file over a slow line Takes Time.
991* Startup Variables:: Other variables you might change.
992@end menu
993
994
995@node Finding the News
996@section Finding the News
997@cindex finding news
998
999@vindex gnus-select-method
1000@c @head
1001The @code{gnus-select-method} variable says where Gnus should look for
1002news. This variable should be a list where the first element says
1003@dfn{how} and the second element says @dfn{where}. This method is your
1004native method. All groups not fetched with this method are
1005foreign groups.
1006
1007For instance, if the @samp{news.somewhere.edu} @acronym{NNTP} server is where
1008you want to get your daily dosage of news from, you'd say:
1009
1010@lisp
1011(setq gnus-select-method '(nntp "news.somewhere.edu"))
1012@end lisp
1013
1014If you want to read directly from the local spool, say:
1015
1016@lisp
1017(setq gnus-select-method '(nnspool ""))
1018@end lisp
1019
1020If you can use a local spool, you probably should, as it will almost
1021certainly be much faster. But do not use the local spool if your
1022server is running Leafnode (which is a simple, standalone private news
1023server); in this case, use @code{(nntp "localhost")}.
1024
1025@vindex gnus-nntpserver-file
1026@cindex NNTPSERVER
1027@cindex @acronym{NNTP} server
1028If this variable is not set, Gnus will take a look at the
1029@env{NNTPSERVER} environment variable. If that variable isn't set,
1030Gnus will see whether @code{gnus-nntpserver-file}
1031(@file{/etc/nntpserver} by default) has any opinions on the matter.
1032If that fails as well, Gnus will try to use the machine running Emacs
1033as an @acronym{NNTP} server. That's a long shot, though.
1034
1035@vindex gnus-nntp-server
1036If @code{gnus-nntp-server} is set, this variable will override
1037@code{gnus-select-method}. You should therefore set
1038@code{gnus-nntp-server} to @code{nil}, which is what it is by default.
1039
1040@vindex gnus-secondary-servers
1041@vindex gnus-nntp-server
1042You can also make Gnus prompt you interactively for the name of an
1043@acronym{NNTP} server. If you give a non-numerical prefix to @code{gnus}
1044(i.e., @kbd{C-u M-x gnus}), Gnus will let you choose between the servers
1045in the @code{gnus-secondary-servers} list (if any). You can also just
1046type in the name of any server you feel like visiting. (Note that this
1047will set @code{gnus-nntp-server}, which means that if you then @kbd{M-x
1048gnus} later in the same Emacs session, Gnus will contact the same
1049server.)
1050
1051@findex gnus-group-browse-foreign-server
1052@kindex B (Group)
1053However, if you use one @acronym{NNTP} server regularly and are just
1054interested in a couple of groups from a different server, you would be
1055better served by using the @kbd{B} command in the group buffer. It will
1056let you have a look at what groups are available, and you can subscribe
1057to any of the groups you want to. This also makes @file{.newsrc}
1058maintenance much tidier. @xref{Foreign Groups}.
1059
1060@vindex gnus-secondary-select-methods
1061@c @head
1062A slightly different approach to foreign groups is to set the
1063@code{gnus-secondary-select-methods} variable. The select methods
1064listed in this variable are in many ways just as native as the
1065@code{gnus-select-method} server. They will also be queried for active
1066files during startup (if that's required), and new newsgroups that
1067appear on these servers will be subscribed (or not) just as native
1068groups are.
1069
1070For instance, if you use the @code{nnmbox} back end to read your mail,
1071you would typically set this variable to
1072
1073@lisp
1074(setq gnus-secondary-select-methods '((nnmbox "")))
1075@end lisp
1076
01c52d31
MB
1077Note: the @acronym{NNTP} back end stores marks in marks files
1078(@pxref{NNTP marks}). This feature makes it easy to share marks between
1079several Gnus installations, but may slow down things a bit when fetching
1080new articles. @xref{NNTP marks}, for more information.
1081
4009494e
GM
1082
1083@node The First Time
1084@section The First Time
1085@cindex first time usage
1086
1087If no startup files exist (@pxref{Startup Files}), Gnus will try to
1088determine what groups should be subscribed by default.
1089
1090@vindex gnus-default-subscribed-newsgroups
1091If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus
1092will subscribe you to just those groups in that list, leaving the rest
1093killed. Your system administrator should have set this variable to
1094something useful.
1095
1096Since she hasn't, Gnus will just subscribe you to a few arbitrarily
1097picked groups (i.e., @samp{*.newusers}). (@dfn{Arbitrary} is defined
1098here as @dfn{whatever Lars thinks you should read}.)
1099
1100You'll also be subscribed to the Gnus documentation group, which should
1101help you with most common problems.
1102
1103If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will just
1104use the normal functions for handling new groups, and not do anything
1105special.
1106
1107
1108@node The Server is Down
1109@section The Server is Down
1110@cindex server errors
1111
1112If the default server is down, Gnus will understandably have some
1113problems starting. However, if you have some mail groups in addition to
1114the news groups, you may want to start Gnus anyway.
1115
1116Gnus, being the trusting sort of program, will ask whether to proceed
1117without a native select method if that server can't be contacted. This
1118will happen whether the server doesn't actually exist (i.e., you have
1119given the wrong address) or the server has just momentarily taken ill
1120for some reason or other. If you decide to continue and have no foreign
1121groups, you'll find it difficult to actually do anything in the group
1122buffer. But, hey, that's your problem. Blllrph!
1123
1124@findex gnus-no-server
1125@kindex M-x gnus-no-server
1126@c @head
1127If you know that the server is definitely down, or you just want to read
1128your mail without bothering with the server at all, you can use the
1129@code{gnus-no-server} command to start Gnus. That might come in handy
1130if you're in a hurry as well. This command will not attempt to contact
1131your primary server---instead, it will just activate all groups on level
11321 and 2. (You should preferably keep no native groups on those two
1133levels.) Also @pxref{Group Levels}.
1134
1135
1136@node Slave Gnusae
1137@section Slave Gnusae
1138@cindex slave
1139
1140You might want to run more than one Emacs with more than one Gnus at the
1141same time. If you are using different @file{.newsrc} files (e.g., if you
1142are using the two different Gnusae to read from two different servers),
1143that is no problem whatsoever. You just do it.
1144
1145The problem appears when you want to run two Gnusae that use the same
1146@file{.newsrc} file.
1147
1148To work around that problem some, we here at the Think-Tank at the Gnus
1149Towers have come up with a new concept: @dfn{Masters} and
1150@dfn{slaves}. (We have applied for a patent on this concept, and have
1151taken out a copyright on those words. If you wish to use those words in
1152conjunction with each other, you have to send $1 per usage instance to
1153me. Usage of the patent (@dfn{Master/Slave Relationships In Computer
1154Applications}) will be much more expensive, of course.)
1155
1156@findex gnus-slave
1157Anyway, you start one Gnus up the normal way with @kbd{M-x gnus} (or
1158however you do it). Each subsequent slave Gnusae should be started with
1159@kbd{M-x gnus-slave}. These slaves won't save normal @file{.newsrc}
1160files, but instead save @dfn{slave files} that contain information only
1161on what groups have been read in the slave session. When a master Gnus
1162starts, it will read (and delete) these slave files, incorporating all
1163information from them. (The slave files will be read in the sequence
1164they were created, so the latest changes will have precedence.)
1165
1166Information from the slave files has, of course, precedence over the
1167information in the normal (i.e., master) @file{.newsrc} file.
1168
1169If the @file{.newsrc*} files have not been saved in the master when the
1170slave starts, you may be prompted as to whether to read an auto-save
1171file. If you answer ``yes'', the unsaved changes to the master will be
1172incorporated into the slave. If you answer ``no'', the slave may see some
1173messages as unread that have been read in the master.
1174
1175
1176
1177@node New Groups
1178@section New Groups
1179@cindex new groups
1180@cindex subscription
1181
1182@vindex gnus-check-new-newsgroups
1183If you are satisfied that you really never want to see any new groups,
1184you can set @code{gnus-check-new-newsgroups} to @code{nil}. This will
1185also save you some time at startup. Even if this variable is
1186@code{nil}, you can always subscribe to the new groups just by pressing
1187@kbd{U} in the group buffer (@pxref{Group Maintenance}). This variable
1188is @code{ask-server} by default. If you set this variable to
1189@code{always}, then Gnus will query the back ends for new groups even
1190when you do the @kbd{g} command (@pxref{Scanning New Messages}).
1191
1192@menu
1193* Checking New Groups:: Determining what groups are new.
1194* Subscription Methods:: What Gnus should do with new groups.
1195* Filtering New Groups:: Making Gnus ignore certain new groups.
1196@end menu
1197
1198
1199@node Checking New Groups
1200@subsection Checking New Groups
1201
1202Gnus normally determines whether a group is new or not by comparing the
1203list of groups from the active file(s) with the lists of subscribed and
1204dead groups. This isn't a particularly fast method. If
1205@code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask the
1206server for new groups since the last time. This is both faster and
1207cheaper. This also means that you can get rid of the list of killed
1208groups altogether, so you may set @code{gnus-save-killed-list} to
1209@code{nil}, which will save time both at startup, at exit, and all over.
1210Saves disk space, too. Why isn't this the default, then?
1211Unfortunately, not all servers support this command.
1212
1213I bet I know what you're thinking now: How do I find out whether my
1214server supports @code{ask-server}? No? Good, because I don't have a
1215fail-safe answer. I would suggest just setting this variable to
1216@code{ask-server} and see whether any new groups appear within the next
1217few days. If any do, then it works. If none do, then it doesn't
1218work. I could write a function to make Gnus guess whether the server
1219supports @code{ask-server}, but it would just be a guess. So I won't.
1220You could @code{telnet} to the server and say @code{HELP} and see
1221whether it lists @samp{NEWGROUPS} among the commands it understands. If
1222it does, then it might work. (But there are servers that lists
1223@samp{NEWGROUPS} without supporting the function properly.)
1224
1225This variable can also be a list of select methods. If so, Gnus will
1226issue an @code{ask-server} command to each of the select methods, and
1227subscribe them (or not) using the normal methods. This might be handy
1228if you are monitoring a few servers for new groups. A side effect is
1229that startup will take much longer, so you can meditate while waiting.
1230Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss.
1231
1232
1233@node Subscription Methods
1234@subsection Subscription Methods
1235
1236@vindex gnus-subscribe-newsgroup-method
1237What Gnus does when it encounters a new group is determined by the
1238@code{gnus-subscribe-newsgroup-method} variable.
1239
1240This variable should contain a function. This function will be called
1241with the name of the new group as the only parameter.
1242
1243Some handy pre-fab functions are:
1244
1245@table @code
1246
1247@item gnus-subscribe-zombies
1248@vindex gnus-subscribe-zombies
1249Make all new groups zombies. This is the default. You can browse the
1250zombies later (with @kbd{A z}) and either kill them all off properly
1251(with @kbd{S z}), or subscribe to them (with @kbd{u}).
1252
1253@item gnus-subscribe-randomly
1254@vindex gnus-subscribe-randomly
1255Subscribe all new groups in arbitrary order. This really means that all
1256new groups will be added at ``the top'' of the group buffer.
1257
1258@item gnus-subscribe-alphabetically
1259@vindex gnus-subscribe-alphabetically
1260Subscribe all new groups in alphabetical order.
1261
1262@item gnus-subscribe-hierarchically
1263@vindex gnus-subscribe-hierarchically
1264Subscribe all new groups hierarchically. The difference between this
1265function and @code{gnus-subscribe-alphabetically} is slight.
1266@code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly
1267alphabetical fashion, while this function will enter groups into its
1268hierarchy. So if you want to have the @samp{rec} hierarchy before the
1269@samp{comp} hierarchy, this function will not mess that configuration
1270up. Or something like that.
1271
1272@item gnus-subscribe-interactively
1273@vindex gnus-subscribe-interactively
1274Subscribe new groups interactively. This means that Gnus will ask
1275you about @strong{all} new groups. The groups you choose to subscribe
1276to will be subscribed hierarchically.
1277
1278@item gnus-subscribe-killed
1279@vindex gnus-subscribe-killed
1280Kill all new groups.
1281
1282@item gnus-subscribe-topics
1283@vindex gnus-subscribe-topics
1284Put the groups into the topic that has a matching @code{subscribe} topic
1285parameter (@pxref{Topic Parameters}). For instance, a @code{subscribe}
1286topic parameter that looks like
1287
1288@example
1289"nnslashdot"
1290@end example
1291
1292will mean that all groups that match that regex will be subscribed under
1293that topic.
1294
1295If no topics match the groups, the groups will be subscribed in the
1296top-level topic.
1297
1298@end table
1299
1300@vindex gnus-subscribe-hierarchical-interactive
1301A closely related variable is
1302@code{gnus-subscribe-hierarchical-interactive}. (That's quite a
1303mouthful.) If this variable is non-@code{nil}, Gnus will ask you in a
1304hierarchical fashion whether to subscribe to new groups or not. Gnus
1305will ask you for each sub-hierarchy whether you want to descend the
1306hierarchy or not.
1307
1308One common mistake is to set the variable a few paragraphs above
1309(@code{gnus-subscribe-newsgroup-method}) to
1310@code{gnus-subscribe-hierarchical-interactive}. This is an error. This
1311will not work. This is ga-ga. So don't do it.
1312
1313
1314@node Filtering New Groups
1315@subsection Filtering New Groups
1316
1317A nice and portable way to control which new newsgroups should be
1318subscribed (or ignored) is to put an @dfn{options} line at the start of
1319the @file{.newsrc} file. Here's an example:
1320
1321@example
1322options -n !alt.all !rec.all sci.all
1323@end example
1324
1325@vindex gnus-subscribe-options-newsgroup-method
1326This line obviously belongs to a serious-minded intellectual scientific
1327person (or she may just be plain old boring), because it says that all
1328groups that have names beginning with @samp{alt} and @samp{rec} should
1329be ignored, and all groups with names beginning with @samp{sci} should
1330be subscribed. Gnus will not use the normal subscription method for
1331subscribing these groups.
1332@code{gnus-subscribe-options-newsgroup-method} is used instead. This
1333variable defaults to @code{gnus-subscribe-alphabetically}.
1334
1335@vindex gnus-options-not-subscribe
1336@vindex gnus-options-subscribe
1337If you don't want to mess with your @file{.newsrc} file, you can just
1338set the two variables @code{gnus-options-subscribe} and
1339@code{gnus-options-not-subscribe}. These two variables do exactly the
1340same as the @file{.newsrc} @samp{options -n} trick. Both are regexps,
1341and if the new group matches the former, it will be unconditionally
1342subscribed, and if it matches the latter, it will be ignored.
1343
1344@vindex gnus-auto-subscribed-groups
1345Yet another variable that meddles here is
1346@code{gnus-auto-subscribed-groups}. It works exactly like
1347@code{gnus-options-subscribe}, and is therefore really superfluous,
1348but I thought it would be nice to have two of these. This variable is
1349more meant for setting some ground rules, while the other variable is
1350used more for user fiddling. By default this variable makes all new
1351groups that come from mail back ends (@code{nnml}, @code{nnbabyl},
1352@code{nnfolder}, @code{nnmbox}, @code{nnmh}, and @code{nnmaildir})
1353subscribed. If you don't like that, just set this variable to
1354@code{nil}.
1355
1356New groups that match this regexp are subscribed using
1357@code{gnus-subscribe-options-newsgroup-method}.
1358
1359
1360@node Changing Servers
1361@section Changing Servers
1362@cindex changing servers
1363
1364Sometimes it is necessary to move from one @acronym{NNTP} server to another.
1365This happens very rarely, but perhaps you change jobs, or one server is
1366very flaky and you want to use another.
1367
1368Changing the server is pretty easy, right? You just change
1369@code{gnus-select-method} to point to the new server?
1370
1371@emph{Wrong!}
1372
1373Article numbers are not (in any way) kept synchronized between different
1374@acronym{NNTP} servers, and the only way Gnus keeps track of what articles
1375you have read is by keeping track of article numbers. So when you
1376change @code{gnus-select-method}, your @file{.newsrc} file becomes
1377worthless.
1378
1379Gnus provides a few functions to attempt to translate a @file{.newsrc}
1380file from one server to another. They all have one thing in
1381common---they take a looong time to run. You don't want to use these
1382functions more than absolutely necessary.
1383
1384@kindex M-x gnus-change-server
1385@findex gnus-change-server
1386If you have access to both servers, Gnus can request the headers for all
1387the articles you have read and compare @code{Message-ID}s and map the
1388article numbers of the read articles and article marks. The @kbd{M-x
1389gnus-change-server} command will do this for all your native groups. It
1390will prompt for the method you want to move to.
1391
1392@kindex M-x gnus-group-move-group-to-server
1393@findex gnus-group-move-group-to-server
1394You can also move individual groups with the @kbd{M-x
1395gnus-group-move-group-to-server} command. This is useful if you want to
1396move a (foreign) group from one server to another.
1397
1398@kindex M-x gnus-group-clear-data-on-native-groups
1399@findex gnus-group-clear-data-on-native-groups
1400If you don't have access to both the old and new server, all your marks
1401and read ranges have become worthless. You can use the @kbd{M-x
1402gnus-group-clear-data-on-native-groups} command to clear out all data
1403that you have on your native groups. Use with caution.
1404
1405@kindex M-x gnus-group-clear-data
1406@findex gnus-group-clear-data
1407Clear the data from the current group only---nix out marks and the
1408list of read articles (@code{gnus-group-clear-data}).
1409
1410After changing servers, you @strong{must} move the cache hierarchy away,
1411since the cached articles will have wrong article numbers, which will
1412affect which articles Gnus thinks are read.
1413@code{gnus-group-clear-data-on-native-groups} will ask you if you want
1414to have it done automatically; for @code{gnus-group-clear-data}, you
1415can use @kbd{M-x gnus-cache-move-cache} (but beware, it will move the
1416cache for all groups).
1417
1418
1419@node Startup Files
1420@section Startup Files
1421@cindex startup files
1422@cindex .newsrc
1423@cindex .newsrc.el
1424@cindex .newsrc.eld
1425
1426Most common Unix news readers use a shared startup file called
1427@file{.newsrc}. This file contains all the information about what
1428groups are subscribed, and which articles in these groups have been
1429read.
1430
1431Things got a bit more complicated with @sc{gnus}. In addition to
1432keeping the @file{.newsrc} file updated, it also used a file called
1433@file{.newsrc.el} for storing all the information that didn't fit into
1434the @file{.newsrc} file. (Actually, it also duplicated everything in
1435the @file{.newsrc} file.) @sc{gnus} would read whichever one of these
1436files was the most recently saved, which enabled people to swap between
1437@sc{gnus} and other newsreaders.
1438
1439That was kinda silly, so Gnus went one better: In addition to the
1440@file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called
1441@file{.newsrc.eld}. It will read whichever of these files that are most
1442recent, but it will never write a @file{.newsrc.el} file. You should
1443never delete the @file{.newsrc.eld} file---it contains much information
1444not stored in the @file{.newsrc} file.
1445
1446@vindex gnus-save-newsrc-file
1447@vindex gnus-read-newsrc-file
1448You can turn off writing the @file{.newsrc} file by setting
1449@code{gnus-save-newsrc-file} to @code{nil}, which means you can delete
1450the file and save some space, as well as exiting from Gnus faster.
1451However, this will make it impossible to use other newsreaders than
1452Gnus. But hey, who would want to, right? Similarly, setting
1453@code{gnus-read-newsrc-file} to @code{nil} makes Gnus ignore the
1454@file{.newsrc} file and any @file{.newsrc-SERVER} files, which can be
1455convenient if you use a different news reader occasionally, and you
1456want to read a different subset of the available groups with that
1457news reader.
1458
1459@vindex gnus-save-killed-list
1460If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus
1461will not save the list of killed groups to the startup file. This will
1462save both time (when starting and quitting) and space (on disk). It
1463will also mean that Gnus has no record of what groups are new or old,
1464so the automatic new groups subscription methods become meaningless.
1465You should always set @code{gnus-check-new-newsgroups} to @code{nil} or
1466@code{ask-server} if you set this variable to @code{nil} (@pxref{New
1467Groups}). This variable can also be a regular expression. If that's
1468the case, remove all groups that do not match this regexp before
1469saving. This can be useful in certain obscure situations that involve
1470several servers where not all servers support @code{ask-server}.
1471
1472@vindex gnus-startup-file
1473@vindex gnus-backup-startup-file
1474@vindex version-control
1475The @code{gnus-startup-file} variable says where the startup files are.
1476The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup
1477file being whatever that one is, with a @samp{.eld} appended.
1478If you want version control for this file, set
1479@code{gnus-backup-startup-file}. It respects the same values as the
1480@code{version-control} variable.
1481
1482@vindex gnus-save-newsrc-hook
1483@vindex gnus-save-quick-newsrc-hook
1484@vindex gnus-save-standard-newsrc-hook
1485@code{gnus-save-newsrc-hook} is called before saving any of the newsrc
1486files, while @code{gnus-save-quick-newsrc-hook} is called just before
1487saving the @file{.newsrc.eld} file, and
1488@code{gnus-save-standard-newsrc-hook} is called just before saving the
1489@file{.newsrc} file. The latter two are commonly used to turn version
1490control on or off. Version control is on by default when saving the
1491startup files. If you want to turn backup creation off, say something like:
1492
1493@lisp
1494(defun turn-off-backup ()
1495 (set (make-local-variable 'backup-inhibited) t))
1496
1497(add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup)
1498(add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup)
1499@end lisp
1500
1501@vindex gnus-init-file
1502@vindex gnus-site-init-file
1503When Gnus starts, it will read the @code{gnus-site-init-file}
1504(@file{.../site-lisp/gnus-init} by default) and @code{gnus-init-file}
1505(@file{~/.gnus} by default) files. These are normal Emacs Lisp files
1506and can be used to avoid cluttering your @file{~/.emacs} and
1507@file{site-init} files with Gnus stuff. Gnus will also check for files
1508with the same names as these, but with @file{.elc} and @file{.el}
1509suffixes. In other words, if you have set @code{gnus-init-file} to
1510@file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el},
1511and finally @file{~/.gnus} (in this order). If Emacs was invoked with
1512the @option{-q} or @option{--no-init-file} options (@pxref{Initial
1513Options, ,Initial Options, emacs, The Emacs Manual}), Gnus doesn't read
1514@code{gnus-init-file}.
1515
1516
1517@node Auto Save
1518@section Auto Save
1519@cindex dribble file
1520@cindex auto-save
1521
1522Whenever you do something that changes the Gnus data (reading articles,
1523catching up, killing/subscribing groups), the change is added to a
1524special @dfn{dribble buffer}. This buffer is auto-saved the normal
1525Emacs way. If your Emacs should crash before you have saved the
1526@file{.newsrc} files, all changes you have made can be recovered from
1527this file.
1528
1529If Gnus detects this file at startup, it will ask the user whether to
1530read it. The auto save file is deleted whenever the real startup file is
1531saved.
1532
1533@vindex gnus-use-dribble-file
1534If @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create and
1535maintain a dribble buffer. The default is @code{t}.
1536
1537@vindex gnus-dribble-directory
1538Gnus will put the dribble file(s) in @code{gnus-dribble-directory}. If
1539this variable is @code{nil}, which it is by default, Gnus will dribble
1540into the directory where the @file{.newsrc} file is located. (This is
1541normally the user's home directory.) The dribble file will get the same
1542file permissions as the @file{.newsrc} file.
1543
1544@vindex gnus-always-read-dribble-file
1545If @code{gnus-always-read-dribble-file} is non-@code{nil}, Gnus will
1546read the dribble file on startup without querying the user.
1547
1548
1549@node The Active File
1550@section The Active File
1551@cindex active file
1552@cindex ignored groups
1553
1554When Gnus starts, or indeed whenever it tries to determine whether new
1555articles have arrived, it reads the active file. This is a very large
1556file that lists all the active groups and articles on the server.
1557
1558@vindex gnus-ignored-newsgroups
1559Before examining the active file, Gnus deletes all lines that match the
1560regexp @code{gnus-ignored-newsgroups}. This is done primarily to reject
1561any groups with bogus names, but you can use this variable to make Gnus
1562ignore hierarchies you aren't ever interested in. However, this is not
1563recommended. In fact, it's highly discouraged. Instead, @pxref{New
1564Groups} for an overview of other variables that can be used instead.
1565
1566@c This variable is
1567@c @code{nil} by default, and will slow down active file handling somewhat
1568@c if you set it to anything else.
1569
1570@vindex gnus-read-active-file
1571@c @head
1572The active file can be rather Huge, so if you have a slow network, you
1573can set @code{gnus-read-active-file} to @code{nil} to prevent Gnus from
1574reading the active file. This variable is @code{some} by default.
1575
1576Gnus will try to make do by getting information just on the groups that
1577you actually subscribe to.
1578
1579Note that if you subscribe to lots and lots of groups, setting this
1580variable to @code{nil} will probably make Gnus slower, not faster. At
1581present, having this variable @code{nil} will slow Gnus down
1582considerably, unless you read news over a 2400 baud modem.
1583
1584This variable can also have the value @code{some}. Gnus will then
1585attempt to read active info only on the subscribed groups. On some
1586servers this is quite fast (on sparkling, brand new INN servers that
1587support the @code{LIST ACTIVE group} command), on others this isn't fast
1588at all. In any case, @code{some} should be faster than @code{nil}, and
1589is certainly faster than @code{t} over slow lines.
1590
1591Some news servers (old versions of Leafnode and old versions of INN, for
1592instance) do not support the @code{LIST ACTIVE group}. For these
1593servers, @code{nil} is probably the most efficient value for this
1594variable.
1595
1596If this variable is @code{nil}, Gnus will ask for group info in total
1597lock-step, which isn't very fast. If it is @code{some} and you use an
1598@acronym{NNTP} server, Gnus will pump out commands as fast as it can, and
1599read all the replies in one swoop. This will normally result in better
1600performance, but if the server does not support the aforementioned
1601@code{LIST ACTIVE group} command, this isn't very nice to the server.
1602
1603If you think that starting up Gnus takes too long, try all the three
1604different values for this variable and see what works best for you.
1605
1606In any case, if you use @code{some} or @code{nil}, you should definitely
1607kill all groups that you aren't interested in to speed things up.
1608
1609Note that this variable also affects active file retrieval from
1610secondary select methods.
1611
1612
1613@node Startup Variables
1614@section Startup Variables
1615
1616@table @code
1617
1618@item gnus-load-hook
1619@vindex gnus-load-hook
1620A hook run while Gnus is being loaded. Note that this hook will
1621normally be run just once in each Emacs session, no matter how many
1622times you start Gnus.
1623
1624@item gnus-before-startup-hook
1625@vindex gnus-before-startup-hook
1626A hook run after starting up Gnus successfully.
1627
1628@item gnus-startup-hook
1629@vindex gnus-startup-hook
1630A hook run as the very last thing after starting up Gnus
1631
1632@item gnus-started-hook
1633@vindex gnus-started-hook
1634A hook that is run as the very last thing after starting up Gnus
1635successfully.
1636
1637@item gnus-setup-news-hook
1638@vindex gnus-setup-news-hook
1639A hook that is run after reading the @file{.newsrc} file(s), but before
1640generating the group buffer.
1641
1642@item gnus-check-bogus-newsgroups
1643@vindex gnus-check-bogus-newsgroups
1644If non-@code{nil}, Gnus will check for and delete all bogus groups at
1645startup. A @dfn{bogus group} is a group that you have in your
1646@file{.newsrc} file, but doesn't exist on the news server. Checking for
1647bogus groups can take quite a while, so to save time and resources it's
1648best to leave this option off, and do the checking for bogus groups once
1649in a while from the group buffer instead (@pxref{Group Maintenance}).
1650
1651@item gnus-inhibit-startup-message
1652@vindex gnus-inhibit-startup-message
1653If non-@code{nil}, the startup message won't be displayed. That way,
1654your boss might not notice as easily that you are reading news instead
1655of doing your job. Note that this variable is used before
1656@file{~/.gnus.el} is loaded, so it should be set in @file{.emacs} instead.
1657
1658@item gnus-no-groups-message
1659@vindex gnus-no-groups-message
1660Message displayed by Gnus when no groups are available.
1661
1662@item gnus-play-startup-jingle
1663@vindex gnus-play-startup-jingle
1664If non-@code{nil}, play the Gnus jingle at startup.
1665
1666@item gnus-startup-jingle
1667@vindex gnus-startup-jingle
1668Jingle to be played if the above variable is non-@code{nil}. The
1669default is @samp{Tuxedomoon.Jingle4.au}.
1670
1671@end table
1672
1673
1674@node Group Buffer
1675@chapter Group Buffer
1676@cindex group buffer
1677
1678@c Alex Schroeder suggests to rearrange this as follows:
1679@c
1680@c <kensanata> ok, just save it for reference. I'll go to bed in a minute.
1681@c 1. Selecting a Group, 2. (new) Finding a Group, 3. Group Levels,
1682@c 4. Subscription Commands, 5. Group Maneuvering, 6. Group Data,
1683@c 7. Group Score, 8. Group Buffer Format
1684@c <kensanata> Group Levels should have more information on levels 5 to 9. I
1685@c suggest to split the 4th paragraph ("Gnus considers groups...") as follows:
1686@c <kensanata> First, "Gnus considers groups... (default 9)."
1687@c <kensanata> New, a table summarizing what levels 1 to 9 mean.
1688@c <kensanata> Third, "Gnus treats subscribed ... reasons of efficiency"
1689@c <kensanata> Then expand the next paragraph or add some more to it.
1690@c This short one sentence explains levels 1 and 2, therefore I understand
1691@c that I should keep important news at 3 and boring news at 4.
1692@c Say so! Then go on to explain why I should bother with levels 6 to 9.
1693@c Maybe keep those that you don't want to read temporarily at 6,
1694@c those that you never want to read at 8, those that offend your
1695@c human rights at 9...
1696
1697
1698The @dfn{group buffer} lists all (or parts) of the available groups. It
1699is the first buffer shown when Gnus starts, and will never be killed as
1700long as Gnus is active.
1701
1702@iftex
1703@iflatex
1704\gnusfigure{The Group Buffer}{320}{
1705\put(75,50){\epsfig{figure=ps/group,height=9cm}}
1706\put(120,37){\makebox(0,0)[t]{Buffer name}}
1707\put(120,38){\vector(1,2){10}}
1708\put(40,60){\makebox(0,0)[r]{Mode line}}
1709\put(40,58){\vector(1,0){30}}
1710\put(200,28){\makebox(0,0)[t]{Native select method}}
1711\put(200,26){\vector(-1,2){15}}
1712}
1713@end iflatex
1714@end iftex
1715
1716@menu
1717* Group Buffer Format:: Information listed and how you can change it.
1718* Group Maneuvering:: Commands for moving in the group buffer.
1719* Selecting a Group:: Actually reading news.
1720* Subscription Commands:: Unsubscribing, killing, subscribing.
1721* Group Data:: Changing the info for a group.
1722* Group Levels:: Levels? What are those, then?
1723* Group Score:: A mechanism for finding out what groups you like.
1724* Marking Groups:: You can mark groups for later processing.
1725* Foreign Groups:: Creating and editing groups.
1726* Group Parameters:: Each group may have different parameters set.
1727* Listing Groups:: Gnus can list various subsets of the groups.
1728* Sorting Groups:: Re-arrange the group order.
1729* Group Maintenance:: Maintaining a tidy @file{.newsrc} file.
1730* Browse Foreign Server:: You can browse a server. See what it has to offer.
1731* Exiting Gnus:: Stop reading news and get some work done.
1732* Group Topics:: A folding group mode divided into topics.
01c52d31 1733* Non-ASCII Group Names:: Accessing groups of non-English names.
e6d2d263 1734* Searching:: Mail search engines.
4009494e
GM
1735* Misc Group Stuff:: Other stuff that you can to do.
1736@end menu
1737
1738
1739@node Group Buffer Format
1740@section Group Buffer Format
1741
1742@menu
1743* Group Line Specification:: Deciding how the group buffer is to look.
1744* Group Mode Line Specification:: The group buffer mode line.
1745* Group Highlighting:: Having nice colors in the group buffer.
1746@end menu
1747
1748You can customize the Group Mode tool bar, see @kbd{M-x
1749customize-apropos RET gnus-group-tool-bar}. This feature is only
1750available in Emacs.
1751
1752The tool bar icons are now (de)activated correctly depending on the
1753cursor position. Therefore, moving around in the Group Buffer is
1754slower. You can disable this via the variable
1755@code{gnus-group-update-tool-bar}. Its default value depends on your
1756Emacs version.
1757
1758@node Group Line Specification
1759@subsection Group Line Specification
1760@cindex group buffer format
1761
1762The default format of the group buffer is nice and dull, but you can
1763make it as exciting and ugly as you feel like.
1764
1765Here's a couple of example group lines:
1766
1767@example
1768 25: news.announce.newusers
1769 * 0: alt.fan.andrea-dworkin
1770@end example
1771
1772Quite simple, huh?
1773
1774You can see that there are 25 unread articles in
1775@samp{news.announce.newusers}. There are no unread articles, but some
1776ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little
1777asterisk at the beginning of the line?).
1778
1779@vindex gnus-group-line-format
1780You can change that format to whatever you want by fiddling with the
1781@code{gnus-group-line-format} variable. This variable works along the
1782lines of a @code{format} specification, which is pretty much the same as
1783a @code{printf} specifications, for those of you who use (feh!) C.
1784@xref{Formatting Variables}.
1785
1786@samp{%M%S%5y:%B%(%g%)\n} is the value that produced those lines above.
1787
1788There should always be a colon on the line; the cursor always moves to
1789the colon after performing an operation. @xref{Positioning
1790Point}. Nothing else is required---not even the group name. All
1791displayed text is just window dressing, and is never examined by Gnus.
1792Gnus stores all real information it needs using text properties.
1793
1794(Note that if you make a really strange, wonderful, spreadsheet-like
1795layout, everybody will believe you are hard at work with the accounting
1796instead of wasting time reading news.)
1797
1798Here's a list of all available format characters:
1799
1800@table @samp
1801
1802@item M
1803An asterisk if the group only has marked articles.
1804
1805@item S
1806Whether the group is subscribed.
1807
1808@item L
1809Level of subscribedness.
1810
1811@item N
1812Number of unread articles.
1813
1814@item I
1815Number of dormant articles.
1816
1817@item T
1818Number of ticked articles.
1819
1820@item R
1821Number of read articles.
1822
1823@item U
1824Number of unseen articles.
1825
1826@item t
1827Estimated total number of articles. (This is really @var{max-number}
1828minus @var{min-number} plus 1.)
1829
1830Gnus uses this estimation because the @acronym{NNTP} protocol provides
1831efficient access to @var{max-number} and @var{min-number} but getting
1832the true unread message count is not possible efficiently. For
1833hysterical raisins, even the mail back ends, where the true number of
1834unread messages might be available efficiently, use the same limited
1835interface. To remove this restriction from Gnus means that the back
01c52d31
MB
1836end interface has to be changed, which is not an easy job.
1837
1838The nnml backend (@pxref{Mail Spool}) has a feature called ``group
1839compaction'' which circumvents this deficiency: the idea is to
1840renumber all articles from 1, removing all gaps between numbers, hence
1841getting a correct total count. Other backends may support this in the
1842future. In order to keep your total article count relatively up to
1843date, you might want to compact your groups (or even directly your
1844server) from time to time. @xref{Misc Group Stuff}, @xref{Server Commands}.
4009494e
GM
1845
1846@item y
1847Number of unread, unticked, non-dormant articles.
1848
1849@item i
1850Number of ticked and dormant articles.
1851
1852@item g
1853Full group name.
1854
1855@item G
1856Group name.
1857
1858@item C
1859Group comment (@pxref{Group Parameters}) or group name if there is no
1860comment element in the group parameters.
1861
1862@item D
1863Newsgroup description. You need to read the group descriptions
1864before these will appear, and to do that, you either have to set
1865@code{gnus-read-active-file} or use the group buffer @kbd{M-d}
1866command.
1867
1868@item o
1869@samp{m} if moderated.
1870
1871@item O
1872@samp{(m)} if moderated.
1873
1874@item s
1875Select method.
1876
1877@item B
1878If the summary buffer for the group is open or not.
1879
1880@item n
1881Select from where.
1882
1883@item z
1884A string that looks like @samp{<%s:%n>} if a foreign select method is
1885used.
1886
1887@item P
1888Indentation based on the level of the topic (@pxref{Group Topics}).
1889
1890@item c
1891@vindex gnus-group-uncollapsed-levels
1892Short (collapsed) group name. The @code{gnus-group-uncollapsed-levels}
1893variable says how many levels to leave at the end of the group name.
1894The default is 1---this will mean that group names like
1895@samp{gnu.emacs.gnus} will be shortened to @samp{g.e.gnus}.
1896
1897@item m
1898@vindex gnus-new-mail-mark
1899@cindex %
1900@samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail to
1901the group lately.
1902
1903@item p
1904@samp{#} (@code{gnus-process-mark}) if the group is process marked.
1905
1906@item d
1907A string that says when you last read the group (@pxref{Group
1908Timestamp}).
1909
01c52d31
MB
1910@item F
1911The disk space used by the articles fetched by both the cache and
1912agent. The value is automatically scaled to bytes(B), kilobytes(K),
1913megabytes(M), or gigabytes(G) to minimize the column width. A format
1914of %7F is sufficient for a fixed-width column.
1915
4009494e
GM
1916@item u
1917User defined specifier. The next character in the format string should
1918be a letter. Gnus will call the function
1919@code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
1920following @samp{%u}. The function will be passed a single dummy
1921parameter as argument. The function should return a string, which will
1922be inserted into the buffer just like information from any other
1923specifier.
1924@end table
1925
1926@cindex *
1927All the ``number-of'' specs will be filled with an asterisk (@samp{*})
1928if no info is available---for instance, if it is a non-activated foreign
1929group, or a bogus native group.
1930
1931
1932@node Group Mode Line Specification
1933@subsection Group Mode Line Specification
1934@cindex group mode line
1935
1936@vindex gnus-group-mode-line-format
1937The mode line can be changed by setting
1938@code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}). It
1939doesn't understand that many format specifiers:
1940
1941@table @samp
1942@item S
1943The native news server.
1944@item M
1945The native select method.
1946@end table
1947
1948
1949@node Group Highlighting
1950@subsection Group Highlighting
1951@cindex highlighting
1952@cindex group highlighting
1953
1954@vindex gnus-group-highlight
1955Highlighting in the group buffer is controlled by the
1956@code{gnus-group-highlight} variable. This is an alist with elements
1957that look like @code{(@var{form} . @var{face})}. If @var{form} evaluates to
1958something non-@code{nil}, the @var{face} will be used on the line.
1959
1960Here's an example value for this variable that might look nice if the
1961background is dark:
1962
1963@lisp
1964(cond (window-system
1965 (setq custom-background-mode 'light)
1966 (defface my-group-face-1
1967 '((t (:foreground "Red" :bold t))) "First group face")
1968 (defface my-group-face-2
1969 '((t (:foreground "DarkSeaGreen4" :bold t)))
1970 "Second group face")
1971 (defface my-group-face-3
1972 '((t (:foreground "Green4" :bold t))) "Third group face")
1973 (defface my-group-face-4
1974 '((t (:foreground "SteelBlue" :bold t))) "Fourth group face")
1975 (defface my-group-face-5
1976 '((t (:foreground "Blue" :bold t))) "Fifth group face")))
1977
1978(setq gnus-group-highlight
1979 '(((> unread 200) . my-group-face-1)
1980 ((and (< level 3) (zerop unread)) . my-group-face-2)
1981 ((< level 3) . my-group-face-3)
1982 ((zerop unread) . my-group-face-4)
1983 (t . my-group-face-5)))
1984@end lisp
1985
1986Also @pxref{Faces and Fonts}.
1987
1988Variables that are dynamically bound when the forms are evaluated
1989include:
1990
1991@table @code
1992@item group
1993The group name.
1994@item unread
1995The number of unread articles in the group.
1996@item method
1997The select method.
1998@item mailp
1999Whether the group is a mail group.
2000@item level
2001The level of the group.
2002@item score
2003The score of the group.
2004@item ticked
2005The number of ticked articles in the group.
2006@item total
2007The total number of articles in the group. Or rather,
2008@var{max-number} minus @var{min-number} plus one.
2009@item topic
2010When using the topic minor mode, this variable is bound to the current
2011topic being inserted.
2012@end table
2013
2014When the forms are @code{eval}ed, point is at the beginning of the line
2015of the group in question, so you can use many of the normal Gnus
2016functions for snarfing info on the group.
2017
2018@vindex gnus-group-update-hook
2019@findex gnus-group-highlight-line
2020@code{gnus-group-update-hook} is called when a group line is changed.
2021It will not be called when @code{gnus-visual} is @code{nil}. This hook
2022calls @code{gnus-group-highlight-line} by default.
2023
2024
2025@node Group Maneuvering
2026@section Group Maneuvering
2027@cindex group movement
2028
2029All movement commands understand the numeric prefix and will behave as
2030expected, hopefully.
2031
2032@table @kbd
2033
2034@item n
2035@kindex n (Group)
2036@findex gnus-group-next-unread-group
2037Go to the next group that has unread articles
2038(@code{gnus-group-next-unread-group}).
2039
2040@item p
2041@itemx DEL
2042@kindex DEL (Group)
2043@kindex p (Group)
2044@findex gnus-group-prev-unread-group
2045Go to the previous group that has unread articles
2046(@code{gnus-group-prev-unread-group}).
2047
2048@item N
2049@kindex N (Group)
2050@findex gnus-group-next-group
2051Go to the next group (@code{gnus-group-next-group}).
2052
2053@item P
2054@kindex P (Group)
2055@findex gnus-group-prev-group
2056Go to the previous group (@code{gnus-group-prev-group}).
2057
2058@item M-n
2059@kindex M-n (Group)
2060@findex gnus-group-next-unread-group-same-level
2061Go to the next unread group on the same (or lower) level
2062(@code{gnus-group-next-unread-group-same-level}).
2063
2064@item M-p
2065@kindex M-p (Group)
2066@findex gnus-group-prev-unread-group-same-level
2067Go to the previous unread group on the same (or lower) level
2068(@code{gnus-group-prev-unread-group-same-level}).
2069@end table
2070
2071Three commands for jumping to groups:
2072
2073@table @kbd
2074
2075@item j
2076@kindex j (Group)
2077@findex gnus-group-jump-to-group
2078Jump to a group (and make it visible if it isn't already)
2079(@code{gnus-group-jump-to-group}). Killed groups can be jumped to, just
2080like living groups.
2081
2082@item ,
2083@kindex , (Group)
2084@findex gnus-group-best-unread-group
2085Jump to the unread group with the lowest level
2086(@code{gnus-group-best-unread-group}).
2087
2088@item .
2089@kindex . (Group)
2090@findex gnus-group-first-unread-group
2091Jump to the first group with unread articles
2092(@code{gnus-group-first-unread-group}).
2093@end table
2094
2095@vindex gnus-group-goto-unread
2096If @code{gnus-group-goto-unread} is @code{nil}, all the movement
2097commands will move to the next group, not the next unread group. Even
2098the commands that say they move to the next unread group. The default
2099is @code{t}.
2100
01c52d31
MB
2101@vindex gnus-summary-next-group-on-exit
2102If @code{gnus-summary-next-group-on-exit} is @code{t}, when a summary is
2103exited, the point in the group buffer is moved to the next unread group.
2104Otherwise, the point is set to the group just exited. The default is
2105@code{t}.
4009494e
GM
2106
2107@node Selecting a Group
2108@section Selecting a Group
2109@cindex group selection
2110
2111@table @kbd
2112
2113@item SPACE
2114@kindex SPACE (Group)
2115@findex gnus-group-read-group
2116Select the current group, switch to the summary buffer and display the
2117first unread article (@code{gnus-group-read-group}). If there are no
2118unread articles in the group, or if you give a non-numerical prefix to
2119this command, Gnus will offer to fetch all the old articles in this
2120group from the server. If you give a numerical prefix @var{n}, @var{n}
2121determines the number of articles Gnus will fetch. If @var{n} is
2122positive, Gnus fetches the @var{n} newest articles, if @var{n} is
2123negative, Gnus fetches the @code{abs(@var{n})} oldest articles.
2124
2125Thus, @kbd{SPC} enters the group normally, @kbd{C-u SPC} offers old
2126articles, @kbd{C-u 4 2 SPC} fetches the 42 newest articles, and @kbd{C-u
2127- 4 2 SPC} fetches the 42 oldest ones.
2128
2129When you are in the group (in the Summary buffer), you can type
2130@kbd{M-g} to fetch new articles, or @kbd{C-u M-g} to also show the old
2131ones.
2132
2133@item RET
2134@kindex RET (Group)
2135@findex gnus-group-select-group
2136Select the current group and switch to the summary buffer
2137(@code{gnus-group-select-group}). Takes the same arguments as
2138@code{gnus-group-read-group}---the only difference is that this command
2139does not display the first unread article automatically upon group
2140entry.
2141
2142@item M-RET
2143@kindex M-RET (Group)
2144@findex gnus-group-quick-select-group
2145This does the same as the command above, but tries to do it with the
2146minimum amount of fuzz (@code{gnus-group-quick-select-group}). No
2147scoring/killing will be performed, there will be no highlights and no
2148expunging. This might be useful if you're in a real hurry and have to
2149enter some humongous group. If you give a 0 prefix to this command
2150(i.e., @kbd{0 M-RET}), Gnus won't even generate the summary buffer,
2151which is useful if you want to toggle threading before generating the
2152summary buffer (@pxref{Summary Generation Commands}).
2153
2154@item M-SPACE
2155@kindex M-SPACE (Group)
2156@findex gnus-group-visible-select-group
2157This is yet one more command that does the same as the @kbd{RET}
2158command, but this one does it without expunging and hiding dormants
2159(@code{gnus-group-visible-select-group}).
2160
2161@item C-M-RET
2162@kindex C-M-RET (Group)
2163@findex gnus-group-select-group-ephemerally
2164Finally, this command selects the current group ephemerally without
2165doing any processing of its contents
2166(@code{gnus-group-select-group-ephemerally}). Even threading has been
2167turned off. Everything you do in the group after selecting it in this
2168manner will have no permanent effects.
2169
2170@end table
2171
2172@vindex gnus-large-newsgroup
2173The @code{gnus-large-newsgroup} variable says what Gnus should
2174consider to be a big group. If it is @code{nil}, no groups are
2175considered big. The default value is 200. If the group has more
2176(unread and/or ticked) articles than this, Gnus will query the user
2177before entering the group. The user can then specify how many
2178articles should be fetched from the server. If the user specifies a
2179negative number (@var{-n}), the @var{n} oldest articles will be
2180fetched. If it is positive, the @var{n} articles that have arrived
2181most recently will be fetched.
2182
2183@vindex gnus-large-ephemeral-newsgroup
2184@code{gnus-large-ephemeral-newsgroup} is the same as
2185@code{gnus-large-newsgroup}, but is only used for ephemeral
2186newsgroups.
2187
4b70e299 2188@vindex gnus-newsgroup-maximum-articles
4009494e
GM
2189In groups in some news servers, there might be a big gap between a few
2190very old articles that will never be expired and the recent ones. In
2191such a case, the server will return the data like @code{(1 . 30000000)}
2192for the @code{LIST ACTIVE group} command, for example. Even if there
2193are actually only the articles 1-10 and 29999900-30000000, Gnus doesn't
2194know it at first and prepares for getting 30000000 articles. However,
2195it will consume hundreds megabytes of memories and might make Emacs get
2196stuck as the case may be. If you use such news servers, set the
4b70e299
MB
2197variable @code{gnus-newsgroup-maximum-articles} to a positive number.
2198The value means that Gnus ignores articles other than this number of the
2199latest ones in every group. For instance, the value 10000 makes Gnus
2200get only the articles 29990001-30000000 (if the latest article number is
220130000000 in a group). Note that setting this variable to a number might
2202prevent you from reading very old articles. The default value of the
2203variable @code{gnus-newsgroup-maximum-articles} is @code{nil}, which
2204means Gnus never ignores old articles.
4009494e
GM
2205
2206@vindex gnus-select-group-hook
2207@vindex gnus-auto-select-first
2208@vindex gnus-auto-select-subject
2209If @code{gnus-auto-select-first} is non-@code{nil}, select an article
2210automatically when entering a group with the @kbd{SPACE} command.
2211Which article this is is controlled by the
2212@code{gnus-auto-select-subject} variable. Valid values for this
2213variable are:
2214
2215@table @code
2216
2217@item unread
2218Place point on the subject line of the first unread article.
2219
2220@item first
2221Place point on the subject line of the first article.
2222
2223@item unseen
2224Place point on the subject line of the first unseen article.
2225
2226@item unseen-or-unread
2227Place point on the subject line of the first unseen article, and if
2228there is no such article, place point on the subject line of the first
2229unread article.
2230
2231@item best
2232Place point on the subject line of the highest-scored unread article.
2233
2234@end table
2235
2236This variable can also be a function. In that case, that function
2237will be called to place point on a subject line.
2238
2239If you want to prevent automatic selection in some group (say, in a
2240binary group with Huge articles) you can set the
2241@code{gnus-auto-select-first} variable to @code{nil} in
2242@code{gnus-select-group-hook}, which is called when a group is
2243selected.
2244
2245
2246@node Subscription Commands
2247@section Subscription Commands
2248@cindex subscription
2249
2250@table @kbd
2251
2252@item S t
2253@itemx u
2254@kindex S t (Group)
2255@kindex u (Group)
2256@findex gnus-group-unsubscribe-current-group
2257@c @icon{gnus-group-unsubscribe}
2258Toggle subscription to the current group
2259(@code{gnus-group-unsubscribe-current-group}).
2260
2261@item S s
2262@itemx U
2263@kindex S s (Group)
2264@kindex U (Group)
2265@findex gnus-group-unsubscribe-group
2266Prompt for a group to subscribe, and then subscribe it. If it was
2267subscribed already, unsubscribe it instead
2268(@code{gnus-group-unsubscribe-group}).
2269
2270@item S k
2271@itemx C-k
2272@kindex S k (Group)
2273@kindex C-k (Group)
2274@findex gnus-group-kill-group
2275@c @icon{gnus-group-kill-group}
2276Kill the current group (@code{gnus-group-kill-group}).
2277
2278@item S y
2279@itemx C-y
2280@kindex S y (Group)
2281@kindex C-y (Group)
2282@findex gnus-group-yank-group
2283Yank the last killed group (@code{gnus-group-yank-group}).
2284
2285@item C-x C-t
2286@kindex C-x C-t (Group)
2287@findex gnus-group-transpose-groups
2288Transpose two groups (@code{gnus-group-transpose-groups}). This isn't
2289really a subscription command, but you can use it instead of a
2290kill-and-yank sequence sometimes.
2291
2292@item S w
2293@itemx C-w
2294@kindex S w (Group)
2295@kindex C-w (Group)
2296@findex gnus-group-kill-region
2297Kill all groups in the region (@code{gnus-group-kill-region}).
2298
2299@item S z
2300@kindex S z (Group)
2301@findex gnus-group-kill-all-zombies
2302Kill all zombie groups (@code{gnus-group-kill-all-zombies}).
2303
2304@item S C-k
2305@kindex S C-k (Group)
2306@findex gnus-group-kill-level
2307Kill all groups on a certain level (@code{gnus-group-kill-level}).
2308These groups can't be yanked back after killing, so this command should
2309be used with some caution. The only time where this command comes in
2310really handy is when you have a @file{.newsrc} with lots of unsubscribed
2311groups that you want to get rid off. @kbd{S C-k} on level 7 will
2312kill off all unsubscribed groups that do not have message numbers in the
2313@file{.newsrc} file.
2314
2315@end table
2316
2317Also @pxref{Group Levels}.
2318
2319
2320@node Group Data
2321@section Group Data
2322
2323@table @kbd
2324
2325@item c
2326@kindex c (Group)
2327@findex gnus-group-catchup-current
2328@vindex gnus-group-catchup-group-hook
2329@c @icon{gnus-group-catchup-current}
2330Mark all unticked articles in this group as read
2331(@code{gnus-group-catchup-current}).
2332@code{gnus-group-catchup-group-hook} is called when catching up a group from
2333the group buffer.
2334
2335@item C
2336@kindex C (Group)
2337@findex gnus-group-catchup-current-all
2338Mark all articles in this group, even the ticked ones, as read
2339(@code{gnus-group-catchup-current-all}).
2340
2341@item M-c
2342@kindex M-c (Group)
2343@findex gnus-group-clear-data
2344Clear the data from the current group---nix out marks and the list of
2345read articles (@code{gnus-group-clear-data}).
2346
2347@item M-x gnus-group-clear-data-on-native-groups
2348@kindex M-x gnus-group-clear-data-on-native-groups
2349@findex gnus-group-clear-data-on-native-groups
2350If you have switched from one @acronym{NNTP} server to another, all your marks
2351and read ranges have become worthless. You can use this command to
2352clear out all data that you have on your native groups. Use with
2353caution.
2354
2355@end table
2356
2357
2358@node Group Levels
2359@section Group Levels
2360@cindex group level
2361@cindex level
2362
2363All groups have a level of @dfn{subscribedness}. For instance, if a
2364group is on level 2, it is more subscribed than a group on level 5. You
2365can ask Gnus to just list groups on a given level or lower
2366(@pxref{Listing Groups}), or to just check for new articles in groups on
2367a given level or lower (@pxref{Scanning New Messages}).
2368
2369Remember: The higher the level of the group, the less important it is.
2370
2371@table @kbd
2372
2373@item S l
2374@kindex S l (Group)
2375@findex gnus-group-set-current-level
2376Set the level of the current group. If a numeric prefix is given, the
2377next @var{n} groups will have their levels set. The user will be
2378prompted for a level.
2379@end table
2380
2381@vindex gnus-level-killed
2382@vindex gnus-level-zombie
2383@vindex gnus-level-unsubscribed
2384@vindex gnus-level-subscribed
2385Gnus considers groups from levels 1 to
2386@code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed,
2387@code{gnus-level-subscribed} (exclusive) and
2388@code{gnus-level-unsubscribed} (inclusive) (default 7) to be
2389unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead)
2390(default 8) and @code{gnus-level-killed} to be killed (completely dead)
2391(default 9). Gnus treats subscribed and unsubscribed groups exactly the
2392same, but zombie and killed groups have no information on what articles
2393you have read, etc, stored. This distinction between dead and living
2394groups isn't done because it is nice or clever, it is done purely for
2395reasons of efficiency.
2396
2397It is recommended that you keep all your mail groups (if any) on quite
2398low levels (e.g. 1 or 2).
2399
2400Maybe the following description of the default behavior of Gnus helps to
2401understand what these levels are all about. By default, Gnus shows you
2402subscribed nonempty groups, but by hitting @kbd{L} you can have it show
2403empty subscribed groups and unsubscribed groups, too. Type @kbd{l} to
2404go back to showing nonempty subscribed groups again. Thus, unsubscribed
2405groups are hidden, in a way.
2406
2407Zombie and killed groups are similar to unsubscribed groups in that they
2408are hidden by default. But they are different from subscribed and
2409unsubscribed groups in that Gnus doesn't ask the news server for
2410information (number of messages, number of unread messages) on zombie
2411and killed groups. Normally, you use @kbd{C-k} to kill the groups you
2412aren't interested in. If most groups are killed, Gnus is faster.
2413
2414Why does Gnus distinguish between zombie and killed groups? Well, when
2415a new group arrives on the server, Gnus by default makes it a zombie
2416group. This means that you are normally not bothered with new groups,
2417but you can type @kbd{A z} to get a list of all new groups. Subscribe
2418the ones you like and kill the ones you don't want. (@kbd{A k} shows a
2419list of killed groups.)
2420
2421If you want to play with the level variables, you should show some care.
2422Set them once, and don't touch them ever again. Better yet, don't touch
2423them at all unless you know exactly what you're doing.
2424
2425@vindex gnus-level-default-unsubscribed
2426@vindex gnus-level-default-subscribed
2427Two closely related variables are @code{gnus-level-default-subscribed}
2428(default 3) and @code{gnus-level-default-unsubscribed} (default 6),
2429which are the levels that new groups will be put on if they are
2430(un)subscribed. These two variables should, of course, be inside the
2431relevant valid ranges.
2432
2433@vindex gnus-keep-same-level
2434If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands
2435will only move to groups of the same level (or lower). In
2436particular, going from the last article in one group to the next group
2437will go to the next group of the same level (or lower). This might be
2438handy if you want to read the most important groups before you read the
2439rest.
2440
2441If this variable is @code{best}, Gnus will make the next newsgroup the
2442one with the best level.
2443
2444@vindex gnus-group-default-list-level
2445All groups with a level less than or equal to
2446@code{gnus-group-default-list-level} will be listed in the group buffer
2447by default.
2448
2449@vindex gnus-group-list-inactive-groups
2450If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active
2451groups will be listed along with the unread groups. This variable is
2452@code{t} by default. If it is @code{nil}, inactive groups won't be
2453listed.
2454
2455@vindex gnus-group-use-permanent-levels
2456If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you
2457give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
2458use this level as the ``work'' level.
2459
2460@vindex gnus-activate-level
2461Gnus will normally just activate (i. e., query the server about) groups
2462on level @code{gnus-activate-level} or less. If you don't want to
2463activate unsubscribed groups, for instance, you might set this variable
2464to 5. The default is 6.
2465
2466
2467@node Group Score
2468@section Group Score
2469@cindex group score
2470@cindex group rank
2471@cindex rank
2472
2473You would normally keep important groups on high levels, but that scheme
2474is somewhat restrictive. Don't you wish you could have Gnus sort the
2475group buffer according to how often you read groups, perhaps? Within
2476reason?
2477
2478This is what @dfn{group score} is for. You can have Gnus assign a score
2479to each group through the mechanism described below. You can then sort
2480the group buffer based on this score. Alternatively, you can sort on
2481score and then level. (Taken together, the level and the score is
2482called the @dfn{rank} of the group. A group that is on level 4 and has
2483a score of 1 has a higher rank than a group on level 5 that has a score
2484of 300. (The level is the most significant part and the score is the
2485least significant part.))
2486
2487@findex gnus-summary-bubble-group
2488If you want groups you read often to get higher scores than groups you
2489read seldom you can add the @code{gnus-summary-bubble-group} function to
2490the @code{gnus-summary-exit-hook} hook. This will result (after
2491sorting) in a bubbling sort of action. If you want to see that in
2492action after each summary exit, you can add
2493@code{gnus-group-sort-groups-by-rank} or
2494@code{gnus-group-sort-groups-by-score} to the same hook, but that will
2495slow things down somewhat.
2496
2497
2498@node Marking Groups
2499@section Marking Groups
2500@cindex marking groups
2501
2502If you want to perform some command on several groups, and they appear
2503subsequently in the group buffer, you would normally just give a
2504numerical prefix to the command. Most group commands will then do your
2505bidding on those groups.
2506
2507However, if the groups are not in sequential order, you can still
2508perform a command on several groups. You simply mark the groups first
2509with the process mark and then execute the command.
2510
2511@table @kbd
2512
2513@item #
2514@kindex # (Group)
2515@itemx M m
2516@kindex M m (Group)
2517@findex gnus-group-mark-group
2518Set the mark on the current group (@code{gnus-group-mark-group}).
2519
2520@item M-#
2521@kindex M-# (Group)
2522@itemx M u
2523@kindex M u (Group)
2524@findex gnus-group-unmark-group
2525Remove the mark from the current group
2526(@code{gnus-group-unmark-group}).
2527
2528@item M U
2529@kindex M U (Group)
2530@findex gnus-group-unmark-all-groups
2531Remove the mark from all groups (@code{gnus-group-unmark-all-groups}).
2532
2533@item M w
2534@kindex M w (Group)
2535@findex gnus-group-mark-region
2536Mark all groups between point and mark (@code{gnus-group-mark-region}).
2537
2538@item M b
2539@kindex M b (Group)
2540@findex gnus-group-mark-buffer
2541Mark all groups in the buffer (@code{gnus-group-mark-buffer}).
2542
2543@item M r
2544@kindex M r (Group)
2545@findex gnus-group-mark-regexp
2546Mark all groups that match some regular expression
2547(@code{gnus-group-mark-regexp}).
2548@end table
2549
2550Also @pxref{Process/Prefix}.
2551
2552@findex gnus-group-universal-argument
2553If you want to execute some command on all groups that have been marked
2554with the process mark, you can use the @kbd{M-&}
2555(@code{gnus-group-universal-argument}) command. It will prompt you for
2556the command to be executed.
2557
2558
2559@node Foreign Groups
2560@section Foreign Groups
2561@cindex foreign groups
2562
2563Below are some group mode commands for making and editing general foreign
2564groups, as well as commands to ease the creation of a few
2565special-purpose groups. All these commands insert the newly created
2566groups under point---@code{gnus-subscribe-newsgroup-method} is not
2567consulted.
2568
2569Changes from the group editing commands are stored in
2570@file{~/.newsrc.eld} (@code{gnus-startup-file}). An alternative is the
2571variable @code{gnus-parameters}, @xref{Group Parameters}.
2572
2573@table @kbd
2574
2575@item G m
2576@kindex G m (Group)
2577@findex gnus-group-make-group
2578@cindex making groups
2579Make a new group (@code{gnus-group-make-group}). Gnus will prompt you
2580for a name, a method and possibly an @dfn{address}. For an easier way
2581to subscribe to @acronym{NNTP} groups (@pxref{Browse Foreign Server}).
2582
2583@item G M
2584@kindex G M (Group)
2585@findex gnus-group-read-ephemeral-group
2586Make an ephemeral group (@code{gnus-group-read-ephemeral-group}). Gnus
2587will prompt you for a name, a method and an @dfn{address}.
2588
2589@item G r
2590@kindex G r (Group)
2591@findex gnus-group-rename-group
2592@cindex renaming groups
2593Rename the current group to something else
2594(@code{gnus-group-rename-group}). This is valid only on some
2595groups---mail groups mostly. This command might very well be quite slow
2596on some back ends.
2597
2598@item G c
2599@kindex G c (Group)
2600@cindex customizing
2601@findex gnus-group-customize
2602Customize the group parameters (@code{gnus-group-customize}).
2603
2604@item G e
2605@kindex G e (Group)
2606@findex gnus-group-edit-group-method
2607@cindex renaming groups
2608Enter a buffer where you can edit the select method of the current
2609group (@code{gnus-group-edit-group-method}).
2610
2611@item G p
2612@kindex G p (Group)
2613@findex gnus-group-edit-group-parameters
2614Enter a buffer where you can edit the group parameters
2615(@code{gnus-group-edit-group-parameters}).
2616
2617@item G E
2618@kindex G E (Group)
2619@findex gnus-group-edit-group
2620Enter a buffer where you can edit the group info
2621(@code{gnus-group-edit-group}).
2622
2623@item G d
2624@kindex G d (Group)
2625@findex gnus-group-make-directory-group
2626@cindex nndir
2627Make a directory group (@pxref{Directory Groups}). You will be prompted
2628for a directory name (@code{gnus-group-make-directory-group}).
2629
2630@item G h
2631@kindex G h (Group)
2632@cindex help group
2633@findex gnus-group-make-help-group
2634Make the Gnus help group (@code{gnus-group-make-help-group}).
2635
2636@item G a
2637@kindex G a (Group)
2638@cindex (ding) archive
2639@cindex archive group
2640@findex gnus-group-make-archive-group
2641@vindex gnus-group-archive-directory
2642@vindex gnus-group-recent-archive-directory
2643Make a Gnus archive group (@code{gnus-group-make-archive-group}). By
2644default a group pointing to the most recent articles will be created
2645(@code{gnus-group-recent-archive-directory}), but given a prefix, a full
2646group will be created from @code{gnus-group-archive-directory}.
2647
2648@item G k
2649@kindex G k (Group)
2650@findex gnus-group-make-kiboze-group
2651@cindex nnkiboze
2652Make a kiboze group. You will be prompted for a name, for a regexp to
2653match groups to be ``included'' in the kiboze group, and a series of
2654strings to match on headers (@code{gnus-group-make-kiboze-group}).
2655@xref{Kibozed Groups}.
2656
2657@item G D
2658@kindex G D (Group)
2659@findex gnus-group-enter-directory
2660@cindex nneething
2661Read an arbitrary directory as if it were a newsgroup with the
2662@code{nneething} back end (@code{gnus-group-enter-directory}).
2663@xref{Anything Groups}.
2664
2665@item G f
2666@kindex G f (Group)
2667@findex gnus-group-make-doc-group
2668@cindex ClariNet Briefs
2669@cindex nndoc
2670Make a group based on some file or other
2671(@code{gnus-group-make-doc-group}). If you give a prefix to this
2672command, you will be prompted for a file name and a file type.
2673Currently supported types are @code{mbox}, @code{babyl},
2674@code{digest}, @code{news}, @code{rnews}, @code{mmdf}, @code{forward},
2675@code{rfc934}, @code{rfc822-forward}, @code{mime-parts},
2676@code{standard-digest}, @code{slack-digest}, @code{clari-briefs},
2677@code{nsmail}, @code{outlook}, @code{oe-dbx}, and @code{mailman}. If
2678you run this command without a prefix, Gnus will guess at the file
2679type. @xref{Document Groups}.
2680
2681@item G u
2682@kindex G u (Group)
2683@vindex gnus-useful-groups
2684@findex gnus-group-make-useful-group
2685Create one of the groups mentioned in @code{gnus-useful-groups}
2686(@code{gnus-group-make-useful-group}).
2687
2688@item G w
2689@kindex G w (Group)
2690@findex gnus-group-make-web-group
2691@cindex Google
2692@cindex nnweb
2693@cindex gmane
2694Make an ephemeral group based on a web search
2695(@code{gnus-group-make-web-group}). If you give a prefix to this
2696command, make a solid group instead. You will be prompted for the
2697search engine type and the search string. Valid search engine types
2698include @code{google}, @code{dejanews}, and @code{gmane}.
2699@xref{Web Searches}.
2700
2701If you use the @code{google} search engine, you can limit the search
2702to a particular group by using a match string like
2703@samp{shaving group:alt.sysadmin.recovery}.
2704
2705@item G R
2706@kindex G R (Group)
2707@findex gnus-group-make-rss-group
2708Make a group based on an @acronym{RSS} feed
2709(@code{gnus-group-make-rss-group}). You will be prompted for an URL.
2710@xref{RSS}.
2711
2712@item G DEL
2713@kindex G DEL (Group)
2714@findex gnus-group-delete-group
2715This function will delete the current group
2716(@code{gnus-group-delete-group}). If given a prefix, this function will
2717actually delete all the articles in the group, and forcibly remove the
2718group itself from the face of the Earth. Use a prefix only if you are
2719absolutely sure of what you are doing. This command can't be used on
2720read-only groups (like @code{nntp} groups), though.
2721
2722@item G V
2723@kindex G V (Group)
2724@findex gnus-group-make-empty-virtual
2725Make a new, fresh, empty @code{nnvirtual} group
2726(@code{gnus-group-make-empty-virtual}). @xref{Virtual Groups}.
2727
2728@item G v
2729@kindex G v (Group)
2730@findex gnus-group-add-to-virtual
2731Add the current group to an @code{nnvirtual} group
2732(@code{gnus-group-add-to-virtual}). Uses the process/prefix convention.
2733@end table
2734
2735@xref{Select Methods}, for more information on the various select
2736methods.
2737
2738@vindex gnus-activate-foreign-newsgroups
2739If @code{gnus-activate-foreign-newsgroups} is a positive number,
2740Gnus will check all foreign groups with this level or lower at startup.
2741This might take quite a while, especially if you subscribe to lots of
2742groups from different @acronym{NNTP} servers. Also @pxref{Group Levels};
2743@code{gnus-activate-level} also affects activation of foreign
2744newsgroups.
2745
2746
9b3ebcb6
MB
2747The following commands create ephemeral groups. They can be called not
2748only from the Group buffer, but in any Gnus buffer.
2749
2750@table @code
2751@item gnus-read-ephemeral-gmane-group
2752@findex gnus-read-ephemeral-gmane-group
2753@vindex gnus-gmane-group-download-format
2754Read an ephemeral group on Gmane.org. The articles are downloaded via
2755HTTP using the URL specified by @code{gnus-gmane-group-download-format}.
2756Gnus will prompt you for a group name, the start article number and an
2757the article range.
2758
2759@item gnus-read-ephemeral-gmane-group-url
2760@findex gnus-read-ephemeral-gmane-group-url
2761This command is similar to @code{gnus-read-ephemeral-gmane-group}, but
2762the group name and the article number and range are constructed from a
2763given @acronym{URL}. Supported @acronym{URL} formats include e.g.
2764@url{http://thread.gmane.org/gmane.foo.bar/12300/focus=12399},
2765@url{http://thread.gmane.org/gmane.foo.bar/12345/},
2766@url{http://article.gmane.org/gmane.foo.bar/12345/},
2767@url{http://permalink.gmane.org/gmane.foo.bar/12345/}, and
2768@url{http://news.gmane.org/group/gmane.foo.bar/thread=12345}.
2769
2770@item gnus-read-ephemeral-emacs-bug-group
2771@findex gnus-read-ephemeral-emacs-bug-group
2772Read an Emacs bug report in an ephemeral group. Gnus will prompt for a
2773bug number. The default is the number at point. The @acronym{URL} is
2774specified in @code{gnus-bug-group-download-format-alist}.
2775
2776@item gnus-read-ephemeral-debian-bug-group
2777@findex gnus-read-ephemeral-debian-bug-group
2778Read a Debian bug report in an ephemeral group. Analog to
2779@code{gnus-read-ephemeral-emacs-bug-group}.
2780@end table
2781
2782Some of these command are also useful for article buttons, @xref{Article
2783Buttons}.
2784
2785Here is an example:
2786@lisp
2787(require 'gnus-art)
2788(add-to-list
2789 'gnus-button-alist
2790 '("#\\([0-9]+\\)\\>" 1
2791 (string-match "\\<emacs\\>" (or gnus-newsgroup-name ""))
2792 gnus-read-ephemeral-emacs-bug-group 1))
2793@end lisp
2794
2795
4009494e
GM
2796@node Group Parameters
2797@section Group Parameters
2798@cindex group parameters
2799
2800The group parameters store information local to a particular group.
87035689
MB
2801
2802Use the @kbd{G p} or the @kbd{G c} command to edit group parameters of a
2803group. (@kbd{G p} presents you with a Lisp-based interface, @kbd{G c}
2804presents you with a Customize-like interface. The latter helps avoid
2805silly Lisp errors.) You might also be interested in reading about topic
2806parameters (@pxref{Topic Parameters}).
2807Additionally, you can set group parameters via the
2808@code{gnus-parameters} variable, see below.
2809
4009494e
GM
2810Here's an example group parameter list:
2811
2812@example
2813((to-address . "ding@@gnus.org")
2814 (auto-expire . t))
2815@end example
2816
2817We see that each element consists of a ``dotted pair''---the thing before
2818the dot is the key, while the thing after the dot is the value. All the
2819parameters have this form @emph{except} local variable specs, which are
2820not dotted pairs, but proper lists.
2821
2822Some parameters have correspondent customizable variables, each of which
2823is an alist of regexps and values.
2824
2825The following group parameters can be used:
2826
2827@table @code
2828@item to-address
2829@cindex to-address
2830Address used by when doing followups and new posts.
2831
2832@example
2833(to-address . "some@@where.com")
2834@end example
2835
2836This is primarily useful in mail groups that represent closed mailing
2837lists---mailing lists where it's expected that everybody that writes to
2838the mailing list is subscribed to it. Since using this parameter
2839ensures that the mail only goes to the mailing list itself, it means
2840that members won't receive two copies of your followups.
2841
2842Using @code{to-address} will actually work whether the group is foreign
2843or not. Let's say there's a group on the server that is called
2844@samp{fa.4ad-l}. This is a real newsgroup, but the server has gotten
2845the articles from a mail-to-news gateway. Posting directly to this
2846group is therefore impossible---you have to send mail to the mailing
2847list address instead.
2848
2849See also @code{gnus-parameter-to-address-alist}.
2850
2851@item to-list
2852@cindex to-list
2853Address used when doing @kbd{a} in that group.
2854
2855@example
2856(to-list . "some@@where.com")
2857@end example
2858
2859It is totally ignored
2860when doing a followup---except that if it is present in a news group,
2861you'll get mail group semantics when doing @kbd{f}.
2862
2863If you do an @kbd{a} command in a mail group and you have neither a
2864@code{to-list} group parameter nor a @code{to-address} group parameter,
2865then a @code{to-list} group parameter will be added automatically upon
2866sending the message if @code{gnus-add-to-list} is set to @code{t}.
2867@vindex gnus-add-to-list
2868
2869@findex gnus-mailing-list-mode
2870@cindex mail list groups
2871If this variable is set, @code{gnus-mailing-list-mode} is turned on when
2872entering summary buffer.
2873
2874See also @code{gnus-parameter-to-list-alist}.
2875
2876@anchor{subscribed}
2877@item subscribed
2878@cindex subscribed
2879@cindex Mail-Followup-To
2880@findex gnus-find-subscribed-addresses
2881If this parameter is set to @code{t}, Gnus will consider the
2882to-address and to-list parameters for this group as addresses of
2883mailing lists you are subscribed to. Giving Gnus this information is
2884(only) a first step in getting it to generate correct Mail-Followup-To
2885headers for your posts to these lists. The second step is to put the
2886following in your @file{.gnus.el}
2887
2888@lisp
2889(setq message-subscribed-address-functions
2890 '(gnus-find-subscribed-addresses))
2891@end lisp
2892
2893@xref{Mailing Lists, ,Mailing Lists, message, The Message Manual}, for
2894a complete treatment of available MFT support.
2895
2896@item visible
2897@cindex visible
2898If the group parameter list has the element @code{(visible . t)},
2899that group will always be visible in the Group buffer, regardless
2900of whether it has any unread articles.
2901
2902This parameter cannot be set via @code{gnus-parameters}. See
2903@code{gnus-permanently-visible-groups} as an alternative.
2904
2905@item broken-reply-to
2906@cindex broken-reply-to
2907Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
2908headers in this group are to be ignored, and for the header to be hidden
2909if @code{reply-to} is part of @code{gnus-boring-article-headers}. This
2910can be useful if you're reading a mailing list group where the listserv
2911has inserted @code{Reply-To} headers that point back to the listserv
2912itself. That is broken behavior. So there!
2913
2914@item to-group
2915@cindex to-group
2916Elements like @code{(to-group . "some.group.name")} means that all
2917posts in that group will be sent to @code{some.group.name}.
2918
2919@item newsgroup
2920@cindex newsgroup
2921If you have @code{(newsgroup . t)} in the group parameter list, Gnus
2922will treat all responses as if they were responses to news articles.
2923This can be useful if you have a mail group that's really a mirror of a
2924news group.
2925
2926@item gcc-self
2927@cindex gcc-self
2928If @code{(gcc-self . t)} is present in the group parameter list, newly
2929composed messages will be @code{Gcc}'d to the current group. If
2930@code{(gcc-self . none)} is present, no @code{Gcc:} header will be
2931generated, if @code{(gcc-self . "string")} is present, this string will
2932be inserted literally as a @code{gcc} header. This parameter takes
2933precedence over any default @code{Gcc} rules as described later
2934(@pxref{Archived Messages}).
2935
2936@strong{Caveat}: Adding @code{(gcc-self . t)} to the parameter list of
2937@code{nntp} groups (or the like) isn't valid. An @code{nntp} server
2938doesn't accept articles.
2939
2940@item auto-expire
2941@cindex auto-expire
2942@cindex expiring mail
2943If the group parameter has an element that looks like @code{(auto-expire
2944. t)}, all articles read will be marked as expirable. For an
2945alternative approach, @pxref{Expiring Mail}.
2946
2947See also @code{gnus-auto-expirable-newsgroups}.
2948
2949@item total-expire
2950@cindex total-expire
2951@cindex expiring mail
2952If the group parameter has an element that looks like
2953@code{(total-expire . t)}, all read articles will be put through the
2954expiry process, even if they are not marked as expirable. Use with
2955caution. Unread, ticked and dormant articles are not eligible for
2956expiry.
2957
2958See also @code{gnus-total-expirable-newsgroups}.
2959
2960@item expiry-wait
2961@cindex expiry-wait
2962@vindex nnmail-expiry-wait-function
2963If the group parameter has an element that looks like
2964@code{(expiry-wait . 10)}, this value will override any
2965@code{nnmail-expiry-wait} and @code{nnmail-expiry-wait-function}
2966(@pxref{Expiring Mail}) when expiring expirable messages. The value
2967can either be a number of days (not necessarily an integer) or the
2968symbols @code{never} or @code{immediate}.
2969
2970@item expiry-target
2971@cindex expiry-target
2972Where expired messages end up. This parameter overrides
2973@code{nnmail-expiry-target}.
2974
2975@item score-file
2976@cindex score file group parameter
2977Elements that look like @code{(score-file . "file")} will make
2978@file{file} into the current score file for the group in question. All
2979interactive score entries will be put into this file.
2980
2981@item adapt-file
2982@cindex adapt file group parameter
2983Elements that look like @code{(adapt-file . "file")} will make
2984@file{file} into the current adaptive file for the group in question.
2985All adaptive score entries will be put into this file.
2986
2987@item admin-address
2988@cindex admin-address
2989When unsubscribing from a mailing list you should never send the
2990unsubscription notice to the mailing list itself. Instead, you'd send
2991messages to the administrative address. This parameter allows you to
2992put the admin address somewhere convenient.
2993
2994@item display
2995@cindex display
2996Elements that look like @code{(display . MODE)} say which articles to
2997display on entering the group. Valid values are:
2998
2999@table @code
3000@item all
3001Display all articles, both read and unread.
3002
3003@item an integer
3004Display the last @var{integer} articles in the group. This is the same as
3005entering the group with @kbd{C-u @var{integer}}.
3006
3007@item default
3008Display the default visible articles, which normally includes unread and
3009ticked articles.
3010
3011@item an array
3012Display articles that satisfy a predicate.
3013
3014Here are some examples:
3015
3016@table @code
3017@item [unread]
3018Display only unread articles.
3019
3020@item [not expire]
3021Display everything except expirable articles.
3022
3023@item [and (not reply) (not expire)]
3024Display everything except expirable and articles you've already
3025responded to.
3026@end table
3027
3028The available operators are @code{not}, @code{and} and @code{or}.
3029Predicates include @code{tick}, @code{unsend}, @code{undownload},
3030@code{unread}, @code{dormant}, @code{expire}, @code{reply},
3031@code{killed}, @code{bookmark}, @code{score}, @code{save},
3032@code{cache}, @code{forward}, @code{unseen} and @code{recent}.
3033
3034@end table
3035
3036The @code{display} parameter works by limiting the summary buffer to
3037the subset specified. You can pop the limit by using the @kbd{/ w}
3038command (@pxref{Limiting}).
3039
3040@item comment
3041@cindex comment
3042Elements that look like @code{(comment . "This is a comment")} are
3043arbitrary comments on the group. You can display comments in the
3044group line (@pxref{Group Line Specification}).
3045
3046@item charset
3047@cindex charset
3048Elements that look like @code{(charset . iso-8859-1)} will make
3049@code{iso-8859-1} the default charset; that is, the charset that will be
3050used for all articles that do not specify a charset.
3051
3052See also @code{gnus-group-charset-alist}.
3053
3054@item ignored-charsets
3055@cindex ignored-charset
3056Elements that look like @code{(ignored-charsets x-unknown iso-8859-1)}
3057will make @code{iso-8859-1} and @code{x-unknown} ignored; that is, the
3058default charset will be used for decoding articles.
3059
3060See also @code{gnus-group-ignored-charsets-alist}.
3061
3062@item posting-style
3063@cindex posting-style
3064You can store additional posting style information for this group
3065here (@pxref{Posting Styles}). The format is that of an entry in the
3066@code{gnus-posting-styles} alist, except that there's no regexp matching
3067the group name (of course). Style elements in this group parameter will
3068take precedence over the ones found in @code{gnus-posting-styles}.
3069
3070For instance, if you want a funky name and signature in this group only,
3071instead of hacking @code{gnus-posting-styles}, you could put something
3072like this in the group parameters:
3073
3074@example
3075(posting-style
3076 (name "Funky Name")
3077 ("X-My-Header" "Funky Value")
3078 (signature "Funky Signature"))
3079@end example
3080
01c52d31
MB
3081If you're using topics to organize your group buffer
3082(@pxref{Group Topics}), note that posting styles can also be set in
3083the topics parameters. Posting styles in topic parameters apply to all
3084groups in this topic. More precisely, the posting-style settings for a
3085group result from the hierarchical merging of all posting-style
3086entries in the parameters of this group and all the topics it belongs
3087to.
3088
3089
4009494e
GM
3090@item post-method
3091@cindex post-method
3092If it is set, the value is used as the method for posting message
3093instead of @code{gnus-post-method}.
3094
a1da1e37
MB
3095@item mail-source
3096@cindex mail-source
3097If it is set, and the setting of @code{mail-sources} includes a
3098@code{group} mail source (@pxref{Mail Sources}), the value is a
3099mail source for this group.
3100
4009494e
GM
3101@item banner
3102@cindex banner
3103An item like @code{(banner . @var{regexp})} causes any part of an article
3104that matches the regular expression @var{regexp} to be stripped. Instead of
3105@var{regexp}, you can also use the symbol @code{signature} which strips the
3106last signature or any of the elements of the alist
3107@code{gnus-article-banner-alist}.
3108
3109@item sieve
3110@cindex sieve
3111This parameter contains a Sieve test that should match incoming mail
3112that should be placed in this group. From this group parameter, a
3113Sieve @samp{IF} control structure is generated, having the test as the
3114condition and @samp{fileinto "group.name";} as the body.
3115
3116For example, if the @samp{INBOX.list.sieve} group has the @code{(sieve
3117address "sender" "sieve-admin@@extundo.com")} group parameter, when
3118translating the group parameter into a Sieve script (@pxref{Sieve
3119Commands}) the following Sieve code is generated:
3120
3121@example
01c52d31
MB
3122if address "sender" "sieve-admin@@extundo.com" @{
3123 fileinto "INBOX.list.sieve";
3124@}
3125@end example
3126
3127To generate tests for multiple email-addresses use a group parameter
3128like @code{(sieve address "sender" ("name@@one.org" else@@two.org"))}.
3129When generating a sieve script (@pxref{Sieve Commands}) Sieve code
3130like the following is generated:
3131
3132@example
3133if address "sender" ["name@@one.org", "else@@two.org"] @{
3134 fileinto "INBOX.list.sieve";
4009494e
GM
3135@}
3136@end example
3137
01c52d31
MB
3138See @pxref{Sieve Commands} for commands and variables that might be of
3139interest in relation to the sieve parameter.
3140
4009494e
GM
3141The Sieve language is described in RFC 3028. @xref{Top, Emacs Sieve,
3142Top, sieve, Emacs Sieve}.
3143
3144@item (agent parameters)
3145If the agent has been enabled, you can set any of the its parameters
3146to control the behavior of the agent in individual groups. See Agent
3147Parameters in @ref{Category Syntax}. Most users will choose to set
3148agent parameters in either an agent category or group topic to
3149minimize the configuration effort.
3150
3151@item (@var{variable} @var{form})
3152You can use the group parameters to set variables local to the group you
3153are entering. If you want to turn threading off in @samp{news.answers},
3154you could put @code{(gnus-show-threads nil)} in the group parameters of
3155that group. @code{gnus-show-threads} will be made into a local variable
3156in the summary buffer you enter, and the form @code{nil} will be
3157@code{eval}ed there.
3158
3159Note that this feature sets the variable locally to the summary buffer.
3160But some variables are evaluated in the article buffer, or in the
3161message buffer (of a reply or followup or otherwise newly created
3162message). As a workaround, it might help to add the variable in
3163question to @code{gnus-newsgroup-variables}. @xref{Various Summary
3164Stuff}. So if you want to set @code{message-from-style} via the group
3165parameters, then you may need the following statement elsewhere in your
e6d2d263 3166@file{~/.gnus.el} file:
4009494e
GM
3167
3168@lisp
3169(add-to-list 'gnus-newsgroup-variables 'message-from-style)
3170@end lisp
3171
3172@vindex gnus-list-identifiers
3173A use for this feature is to remove a mailing list identifier tag in
3174the subject fields of articles. E.g. if the news group
3175
3176@example
3177nntp+news.gnus.org:gmane.text.docbook.apps
3178@end example
3179
3180has the tag @samp{DOC-BOOK-APPS:} in the subject of all articles, this
3181tag can be removed from the article subjects in the summary buffer for
3182the group by putting @code{(gnus-list-identifiers "DOCBOOK-APPS:")}
3183into the group parameters for the group.
3184
3185This can also be used as a group-specific hook function. If you want to
3186hear a beep when you enter a group, you could put something like
3187@code{(dummy-variable (ding))} in the parameters of that group.
3188@code{dummy-variable} will be set to the (meaningless) result of the
3189@code{(ding)} form.
3190
3191Alternatively, since the VARIABLE becomes local to the group, this
3192pattern can be used to temporarily change a hook. For example, if the
3193following is added to a group parameter
3194
3195@lisp
3196(gnus-summary-prepared-hook
3197 '(lambda nil (local-set-key "d" (local-key-binding "n"))))
3198@end lisp
3199
3200when the group is entered, the 'd' key will not mark the article as
3201expired.
3202
3203@end table
3204
4009494e
GM
3205@vindex gnus-parameters
3206Group parameters can be set via the @code{gnus-parameters} variable too.
3207But some variables, such as @code{visible}, have no effect (For this
3208case see @code{gnus-permanently-visible-groups} as an alternative.).
3209For example:
3210
3211@lisp
3212(setq gnus-parameters
3213 '(("mail\\..*"
3214 (gnus-show-threads nil)
3215 (gnus-use-scoring nil)
3216 (gnus-summary-line-format
3217 "%U%R%z%I%(%[%d:%ub%-23,23f%]%) %s\n")
3218 (gcc-self . t)
3219 (display . all))
3220
3221 ("^nnimap:\\(foo.bar\\)$"
3222 (to-group . "\\1"))
3223
3224 ("mail\\.me"
3225 (gnus-use-scoring t))
3226
3227 ("list\\..*"
3228 (total-expire . t)
3229 (broken-reply-to . t))))
3230@end lisp
3231
3232String value of parameters will be subjected to regexp substitution, as
3233the @code{to-group} example shows.
3234
3235@vindex gnus-parameters-case-fold-search
3236By default, whether comparing the group name and one of those regexps
3237specified in @code{gnus-parameters} is done in a case-sensitive manner
3238or a case-insensitive manner depends on the value of
3239@code{case-fold-search} at the time when the comparison is done. The
3240value of @code{case-fold-search} is typically @code{t}; it means, for
3241example, the element @code{("INBOX\\.FOO" (total-expire . t))} might be
3242applied to both the @samp{INBOX.FOO} group and the @samp{INBOX.foo}
3243group. If you want to make those regexps always case-sensitive, set the
3244value of the @code{gnus-parameters-case-fold-search} variable to
3245@code{nil}. Otherwise, set it to @code{t} if you want to compare them
3246always in a case-insensitive manner.
3247
01c52d31
MB
3248You can define different sorting to different groups via
3249@code{gnus-parameters}. Here is an example to sort an @acronym{NNTP}
3250group by reverse date to see the latest news at the top and an
3251@acronym{RSS} group by subject. In this example, the first group is the
3252Debian daily news group @code{gmane.linux.debian.user.news} from
3253news.gmane.org. The @acronym{RSS} group corresponds to the Debian
3254weekly news RSS feed
3255@url{http://packages.debian.org/unstable/newpkg_main.en.rdf},
3256@xref{RSS}.
3257
3258@lisp
3259(setq
3260 gnus-parameters
3261 '(("nntp.*gmane\\.debian\\.user\\.news"
3262 (gnus-show-threads nil)
3263 (gnus-article-sort-functions '((not gnus-article-sort-by-date)))
3264 (gnus-use-adaptive-scoring nil)
3265 (gnus-use-scoring nil))
3266 ("nnrss.*debian"
3267 (gnus-show-threads nil)
3268 (gnus-article-sort-functions 'gnus-article-sort-by-subject)
3269 (gnus-use-adaptive-scoring nil)
3270 (gnus-use-scoring t)
3271 (gnus-score-find-score-files-function 'gnus-score-find-single)
3272 (gnus-summary-line-format "%U%R%z%d %I%(%[ %s %]%)\n"))))
3273@end lisp
3274
4009494e
GM
3275
3276@node Listing Groups
3277@section Listing Groups
3278@cindex group listing
3279
3280These commands all list various slices of the groups available.
3281
3282@table @kbd
3283
3284@item l
3285@itemx A s
3286@kindex A s (Group)
3287@kindex l (Group)
3288@findex gnus-group-list-groups
3289List all groups that have unread articles
3290(@code{gnus-group-list-groups}). If the numeric prefix is used, this
3291command will list only groups of level ARG and lower. By default, it
3292only lists groups of level five (i.e.,
3293@code{gnus-group-default-list-level}) or lower (i.e., just subscribed
3294groups).
3295
3296@item L
3297@itemx A u
3298@kindex A u (Group)
3299@kindex L (Group)
3300@findex gnus-group-list-all-groups
3301List all groups, whether they have unread articles or not
3302(@code{gnus-group-list-all-groups}). If the numeric prefix is used,
3303this command will list only groups of level ARG and lower. By default,
3304it lists groups of level seven or lower (i.e., just subscribed and
3305unsubscribed groups).
3306
3307@item A l
3308@kindex A l (Group)
3309@findex gnus-group-list-level
3310List all unread groups on a specific level
3311(@code{gnus-group-list-level}). If given a prefix, also list the groups
3312with no unread articles.
3313
3314@item A k
3315@kindex A k (Group)
3316@findex gnus-group-list-killed
3317List all killed groups (@code{gnus-group-list-killed}). If given a
3318prefix argument, really list all groups that are available, but aren't
3319currently (un)subscribed. This could entail reading the active file
3320from the server.
3321
3322@item A z
3323@kindex A z (Group)
3324@findex gnus-group-list-zombies
3325List all zombie groups (@code{gnus-group-list-zombies}).
3326
3327@item A m
3328@kindex A m (Group)
3329@findex gnus-group-list-matching
3330List all unread, subscribed groups with names that match a regexp
3331(@code{gnus-group-list-matching}).
3332
3333@item A M
3334@kindex A M (Group)
3335@findex gnus-group-list-all-matching
3336List groups that match a regexp (@code{gnus-group-list-all-matching}).
3337
3338@item A A
3339@kindex A A (Group)
3340@findex gnus-group-list-active
3341List absolutely all groups in the active file(s) of the
3342server(s) you are connected to (@code{gnus-group-list-active}). This
3343might very well take quite a while. It might actually be a better idea
3344to do a @kbd{A M} to list all matching, and just give @samp{.} as the
3345thing to match on. Also note that this command may list groups that
3346don't exist (yet)---these will be listed as if they were killed groups.
3347Take the output with some grains of salt.
3348
3349@item A a
3350@kindex A a (Group)
3351@findex gnus-group-apropos
3352List all groups that have names that match a regexp
3353(@code{gnus-group-apropos}).
3354
3355@item A d
3356@kindex A d (Group)
3357@findex gnus-group-description-apropos
3358List all groups that have names or descriptions that match a regexp
3359(@code{gnus-group-description-apropos}).
3360
3361@item A c
3362@kindex A c (Group)
3363@findex gnus-group-list-cached
3364List all groups with cached articles (@code{gnus-group-list-cached}).
3365
3366@item A ?
3367@kindex A ? (Group)
3368@findex gnus-group-list-dormant
3369List all groups with dormant articles (@code{gnus-group-list-dormant}).
3370
3371@item A /
3372@kindex A / (Group)
3373@findex gnus-group-list-limit
3374List groups limited within the current selection
3375(@code{gnus-group-list-limit}).
3376
3377@item A f
3378@kindex A f (Group)
3379@findex gnus-group-list-flush
3380Flush groups from the current selection (@code{gnus-group-list-flush}).
3381
3382@item A p
3383@kindex A p (Group)
3384@findex gnus-group-list-plus
3385List groups plus the current selection (@code{gnus-group-list-plus}).
3386
3387@end table
3388
3389@vindex gnus-permanently-visible-groups
3390@cindex visible group parameter
3391Groups that match the @code{gnus-permanently-visible-groups} regexp will
3392always be shown, whether they have unread articles or not. You can also
3393add the @code{visible} element to the group parameters in question to
3394get the same effect.
3395
3396@vindex gnus-list-groups-with-ticked-articles
3397Groups that have just ticked articles in it are normally listed in the
3398group buffer. If @code{gnus-list-groups-with-ticked-articles} is
3399@code{nil}, these groups will be treated just like totally empty
3400groups. It is @code{t} by default.
3401
3402
3403@node Sorting Groups
3404@section Sorting Groups
3405@cindex sorting groups
3406
3407@kindex C-c C-s (Group)
3408@findex gnus-group-sort-groups
3409@vindex gnus-group-sort-function
3410The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the
3411group buffer according to the function(s) given by the
3412@code{gnus-group-sort-function} variable. Available sorting functions
3413include:
3414
3415@table @code
3416
3417@item gnus-group-sort-by-alphabet
3418@findex gnus-group-sort-by-alphabet
3419Sort the group names alphabetically. This is the default.
3420
3421@item gnus-group-sort-by-real-name
3422@findex gnus-group-sort-by-real-name
3423Sort the group alphabetically on the real (unprefixed) group names.
3424
3425@item gnus-group-sort-by-level
3426@findex gnus-group-sort-by-level
3427Sort by group level.
3428
3429@item gnus-group-sort-by-score
3430@findex gnus-group-sort-by-score
3431Sort by group score. @xref{Group Score}.
3432
3433@item gnus-group-sort-by-rank
3434@findex gnus-group-sort-by-rank
3435Sort by group score and then the group level. The level and the score
3436are, when taken together, the group's @dfn{rank}. @xref{Group Score}.
3437
3438@item gnus-group-sort-by-unread
3439@findex gnus-group-sort-by-unread
3440Sort by number of unread articles.
3441
3442@item gnus-group-sort-by-method
3443@findex gnus-group-sort-by-method
3444Sort alphabetically on the select method.
3445
3446@item gnus-group-sort-by-server
3447@findex gnus-group-sort-by-server
3448Sort alphabetically on the Gnus server name.
3449
3450
3451@end table
3452
3453@code{gnus-group-sort-function} can also be a list of sorting
3454functions. In that case, the most significant sort key function must be
3455the last one.
3456
3457
3458There are also a number of commands for sorting directly according to
3459some sorting criteria:
3460
3461@table @kbd
3462@item G S a
3463@kindex G S a (Group)
3464@findex gnus-group-sort-groups-by-alphabet
3465Sort the group buffer alphabetically by group name
3466(@code{gnus-group-sort-groups-by-alphabet}).
3467
3468@item G S u
3469@kindex G S u (Group)
3470@findex gnus-group-sort-groups-by-unread
3471Sort the group buffer by the number of unread articles
3472(@code{gnus-group-sort-groups-by-unread}).
3473
3474@item G S l
3475@kindex G S l (Group)
3476@findex gnus-group-sort-groups-by-level
3477Sort the group buffer by group level
3478(@code{gnus-group-sort-groups-by-level}).
3479
3480@item G S v
3481@kindex G S v (Group)
3482@findex gnus-group-sort-groups-by-score
3483Sort the group buffer by group score
3484(@code{gnus-group-sort-groups-by-score}). @xref{Group Score}.
3485
3486@item G S r
3487@kindex G S r (Group)
3488@findex gnus-group-sort-groups-by-rank
3489Sort the group buffer by group rank
3490(@code{gnus-group-sort-groups-by-rank}). @xref{Group Score}.
3491
3492@item G S m
3493@kindex G S m (Group)
3494@findex gnus-group-sort-groups-by-method
3495Sort the group buffer alphabetically by back end name@*
3496(@code{gnus-group-sort-groups-by-method}).
3497
3498@item G S n
3499@kindex G S n (Group)
3500@findex gnus-group-sort-groups-by-real-name
3501Sort the group buffer alphabetically by real (unprefixed) group name
3502(@code{gnus-group-sort-groups-by-real-name}).
3503
3504@end table
3505
3506All the commands below obey the process/prefix convention
3507(@pxref{Process/Prefix}).
3508
3509When given a symbolic prefix (@pxref{Symbolic Prefixes}), all these
3510commands will sort in reverse order.
3511
3512You can also sort a subset of the groups:
3513
3514@table @kbd
3515@item G P a
3516@kindex G P a (Group)
3517@findex gnus-group-sort-selected-groups-by-alphabet
3518Sort the groups alphabetically by group name
3519(@code{gnus-group-sort-selected-groups-by-alphabet}).
3520
3521@item G P u
3522@kindex G P u (Group)
3523@findex gnus-group-sort-selected-groups-by-unread
3524Sort the groups by the number of unread articles
3525(@code{gnus-group-sort-selected-groups-by-unread}).
3526
3527@item G P l
3528@kindex G P l (Group)
3529@findex gnus-group-sort-selected-groups-by-level
3530Sort the groups by group level
3531(@code{gnus-group-sort-selected-groups-by-level}).
3532
3533@item G P v
3534@kindex G P v (Group)
3535@findex gnus-group-sort-selected-groups-by-score
3536Sort the groups by group score
3537(@code{gnus-group-sort-selected-groups-by-score}). @xref{Group Score}.
3538
3539@item G P r
3540@kindex G P r (Group)
3541@findex gnus-group-sort-selected-groups-by-rank
3542Sort the groups by group rank
3543(@code{gnus-group-sort-selected-groups-by-rank}). @xref{Group Score}.
3544
3545@item G P m
3546@kindex G P m (Group)
3547@findex gnus-group-sort-selected-groups-by-method
3548Sort the groups alphabetically by back end name@*
3549(@code{gnus-group-sort-selected-groups-by-method}).
3550
3551@item G P n
3552@kindex G P n (Group)
3553@findex gnus-group-sort-selected-groups-by-real-name
3554Sort the groups alphabetically by real (unprefixed) group name
3555(@code{gnus-group-sort-selected-groups-by-real-name}).
3556
3557@item G P s
3558@kindex G P s (Group)
3559@findex gnus-group-sort-selected-groups
3560Sort the groups according to @code{gnus-group-sort-function}.
3561
3562@end table
3563
3564And finally, note that you can use @kbd{C-k} and @kbd{C-y} to manually
3565move groups around.
3566
3567
3568@node Group Maintenance
3569@section Group Maintenance
3570@cindex bogus groups
3571
3572@table @kbd
3573@item b
3574@kindex b (Group)
3575@findex gnus-group-check-bogus-groups
3576Find bogus groups and delete them
3577(@code{gnus-group-check-bogus-groups}).
3578
3579@item F
3580@kindex F (Group)
3581@findex gnus-group-find-new-groups
3582Find new groups and process them (@code{gnus-group-find-new-groups}).
3583With 1 @kbd{C-u}, use the @code{ask-server} method to query the server
3584for new groups. With 2 @kbd{C-u}'s, use most complete method possible
3585to query the server for new groups, and subscribe the new groups as
3586zombies.
3587
3588@item C-c C-x
3589@kindex C-c C-x (Group)
3590@findex gnus-group-expire-articles
3591@cindex expiring mail
3592Run all expirable articles in the current group through the expiry
3593process (if any) (@code{gnus-group-expire-articles}). That is, delete
3594all expirable articles in the group that have been around for a while.
3595(@pxref{Expiring Mail}).
3596
3597@item C-c C-M-x
3598@kindex C-c C-M-x (Group)
3599@findex gnus-group-expire-all-groups
3600@cindex expiring mail
3601Run all expirable articles in all groups through the expiry process
3602(@code{gnus-group-expire-all-groups}).
3603
3604@end table
3605
3606
3607@node Browse Foreign Server
3608@section Browse Foreign Server
3609@cindex foreign servers
3610@cindex browsing servers
3611
3612@table @kbd
3613@item B
3614@kindex B (Group)
3615@findex gnus-group-browse-foreign-server
3616You will be queried for a select method and a server name. Gnus will
3617then attempt to contact this server and let you browse the groups there
3618(@code{gnus-group-browse-foreign-server}).
3619@end table
3620
3621@findex gnus-browse-mode
3622A new buffer with a list of available groups will appear. This buffer
3623will use the @code{gnus-browse-mode}. This buffer looks a bit (well,
3624a lot) like a normal group buffer.
3625
3626Here's a list of keystrokes available in the browse mode:
3627
3628@table @kbd
3629@item n
3630@kindex n (Browse)
3631@findex gnus-group-next-group
3632Go to the next group (@code{gnus-group-next-group}).
3633
3634@item p
3635@kindex p (Browse)
3636@findex gnus-group-prev-group
3637Go to the previous group (@code{gnus-group-prev-group}).
3638
3639@item SPACE
3640@kindex SPACE (Browse)
3641@findex gnus-browse-read-group
3642Enter the current group and display the first article
3643(@code{gnus-browse-read-group}).
3644
3645@item RET
3646@kindex RET (Browse)
3647@findex gnus-browse-select-group
3648Enter the current group (@code{gnus-browse-select-group}).
3649
3650@item u
3651@kindex u (Browse)
3652@findex gnus-browse-unsubscribe-current-group
3653Unsubscribe to the current group, or, as will be the case here,
3654subscribe to it (@code{gnus-browse-unsubscribe-current-group}).
3655
3656@item l
3657@itemx q
3658@kindex q (Browse)
3659@kindex l (Browse)
3660@findex gnus-browse-exit
3661Exit browse mode (@code{gnus-browse-exit}).
3662
3663@item d
3664@kindex d (Browse)
3665@findex gnus-browse-describe-group
3666Describe the current group (@code{gnus-browse-describe-group}).
3667
3668@item ?
3669@kindex ? (Browse)
3670@findex gnus-browse-describe-briefly
3671Describe browse mode briefly (well, there's not much to describe, is
3672there) (@code{gnus-browse-describe-briefly}).
3673@end table
3674
3675
3676@node Exiting Gnus
3677@section Exiting Gnus
3678@cindex exiting Gnus
3679
3680Yes, Gnus is ex(c)iting.
3681
3682@table @kbd
3683@item z
3684@kindex z (Group)
3685@findex gnus-group-suspend
3686Suspend Gnus (@code{gnus-group-suspend}). This doesn't really exit Gnus,
3687but it kills all buffers except the Group buffer. I'm not sure why this
3688is a gain, but then who am I to judge?
3689
3690@item q
3691@kindex q (Group)
3692@findex gnus-group-exit
3693@c @icon{gnus-group-exit}
3694Quit Gnus (@code{gnus-group-exit}).
3695
3696@item Q
3697@kindex Q (Group)
3698@findex gnus-group-quit
3699Quit Gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}).
3700The dribble file will be saved, though (@pxref{Auto Save}).
3701@end table
3702
3703@vindex gnus-exit-gnus-hook
3704@vindex gnus-suspend-gnus-hook
3705@vindex gnus-after-exiting-gnus-hook
3706@code{gnus-suspend-gnus-hook} is called when you suspend Gnus and
3707@code{gnus-exit-gnus-hook} is called when you quit Gnus, while
3708@code{gnus-after-exiting-gnus-hook} is called as the final item when
3709exiting Gnus.
3710
3711Note:
3712
3713@quotation
3714Miss Lisa Cannifax, while sitting in English class, felt her feet go
3715numbly heavy and herself fall into a hazy trance as the boy sitting
3716behind her drew repeated lines with his pencil across the back of her
3717plastic chair.
3718@end quotation
3719
3720
3721@node Group Topics
3722@section Group Topics
3723@cindex topics
3724
3725If you read lots and lots of groups, it might be convenient to group
3726them hierarchically according to topics. You put your Emacs groups over
3727here, your sex groups over there, and the rest (what, two groups or so?)
3728you put in some misc section that you never bother with anyway. You can
3729even group the Emacs sex groups as a sub-topic to either the Emacs
3730groups or the sex groups---or both! Go wild!
3731
3732@iftex
3733@iflatex
3734\gnusfigure{Group Topics}{400}{
3735\put(75,50){\epsfig{figure=ps/group-topic,height=9cm}}
3736}
3737@end iflatex
3738@end iftex
3739
3740Here's an example:
3741
3742@example
3743Gnus
3744 Emacs -- I wuw it!
3745 3: comp.emacs
3746 2: alt.religion.emacs
3747 Naughty Emacs
3748 452: alt.sex.emacs
3749 0: comp.talk.emacs.recovery
3750 Misc
3751 8: comp.binaries.fractals
3752 13: comp.sources.unix
3753@end example
3754
3755@findex gnus-topic-mode
3756@kindex t (Group)
3757To get this @emph{fab} functionality you simply turn on (ooh!) the
3758@code{gnus-topic} minor mode---type @kbd{t} in the group buffer. (This
3759is a toggling command.)
3760
3761Go ahead, just try it. I'll still be here when you get back. La de
3762dum@dots{} Nice tune, that@dots{} la la la@dots{} What, you're back?
3763Yes, and now press @kbd{l}. There. All your groups are now listed
3764under @samp{misc}. Doesn't that make you feel all warm and fuzzy?
3765Hot and bothered?
3766
3767If you want this permanently enabled, you should add that minor mode to
3768the hook for the group mode. Put the following line in your
3769@file{~/.gnus.el} file:
3770
3771@lisp
3772(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
3773@end lisp
3774
3775@menu
3776* Topic Commands:: Interactive E-Z commands.
3777* Topic Variables:: How to customize the topics the Lisp Way.
3778* Topic Sorting:: Sorting each topic individually.
3779* Topic Topology:: A map of the world.
3780* Topic Parameters:: Parameters that apply to all groups in a topic.
3781@end menu
3782
3783
3784@node Topic Commands
3785@subsection Topic Commands
3786@cindex topic commands
3787
3788When the topic minor mode is turned on, a new @kbd{T} submap will be
3789available. In addition, a few of the standard keys change their
3790definitions slightly.
3791
3792In general, the following kinds of operations are possible on topics.
3793First of all, you want to create topics. Secondly, you want to put
3794groups in topics and to move them around until you have an order you
3795like. The third kind of operation is to show/hide parts of the whole
3796shebang. You might want to hide a topic including its subtopics and
3797groups, to get a better overview of the other groups.
3798
3799Here is a list of the basic keys that you might need to set up topics
3800the way you like.
3801
3802@table @kbd
3803
3804@item T n
3805@kindex T n (Topic)
3806@findex gnus-topic-create-topic
3807Prompt for a new topic name and create it
3808(@code{gnus-topic-create-topic}).
3809
3810@item T TAB
3811@itemx TAB
3812@kindex T TAB (Topic)
3813@kindex TAB (Topic)
3814@findex gnus-topic-indent
3815``Indent'' the current topic so that it becomes a sub-topic of the
3816previous topic (@code{gnus-topic-indent}). If given a prefix,
3817``un-indent'' the topic instead.
3818
3819@item M-TAB
3820@kindex M-TAB (Topic)
3821@findex gnus-topic-unindent
3822``Un-indent'' the current topic so that it becomes a sub-topic of the
3823parent of its current parent (@code{gnus-topic-unindent}).
3824
3825@end table
3826
3827The following two keys can be used to move groups and topics around.
3828They work like the well-known cut and paste. @kbd{C-k} is like cut and
3829@kbd{C-y} is like paste. Of course, this being Emacs, we use the terms
3830kill and yank rather than cut and paste.
3831
3832@table @kbd
3833
3834@item C-k
3835@kindex C-k (Topic)
3836@findex gnus-topic-kill-group
3837Kill a group or topic (@code{gnus-topic-kill-group}). All groups in the
3838topic will be removed along with the topic.
3839
3840@item C-y
3841@kindex C-y (Topic)
3842@findex gnus-topic-yank-group
3843Yank the previously killed group or topic
3844(@code{gnus-topic-yank-group}). Note that all topics will be yanked
3845before all groups.
3846
3847So, to move a topic to the beginning of the list of topics, just hit
3848@kbd{C-k} on it. This is like the ``cut'' part of cut and paste. Then,
3849move the cursor to the beginning of the buffer (just below the ``Gnus''
3850topic) and hit @kbd{C-y}. This is like the ``paste'' part of cut and
3851paste. Like I said -- E-Z.
3852
3853You can use @kbd{C-k} and @kbd{C-y} on groups as well as on topics. So
3854you can move topics around as well as groups.
3855
3856@end table
3857
3858After setting up the topics the way you like them, you might wish to
3859hide a topic, or to show it again. That's why we have the following
3860key.
3861
3862@table @kbd
3863
3864@item RET
3865@kindex RET (Topic)
3866@findex gnus-topic-select-group
3867@itemx SPACE
3868Either select a group or fold a topic (@code{gnus-topic-select-group}).
3869When you perform this command on a group, you'll enter the group, as
3870usual. When done on a topic line, the topic will be folded (if it was
3871visible) or unfolded (if it was folded already). So it's basically a
3872toggling command on topics. In addition, if you give a numerical
3873prefix, group on that level (and lower) will be displayed.
3874
3875@end table
3876
3877Now for a list of other commands, in no particular order.
3878
3879@table @kbd
3880
3881@item T m
3882@kindex T m (Topic)
3883@findex gnus-topic-move-group
3884Move the current group to some other topic
3885(@code{gnus-topic-move-group}). This command uses the process/prefix
3886convention (@pxref{Process/Prefix}).
3887
3888@item T j
3889@kindex T j (Topic)
3890@findex gnus-topic-jump-to-topic
3891Go to a topic (@code{gnus-topic-jump-to-topic}).
3892
3893@item T c
3894@kindex T c (Topic)
3895@findex gnus-topic-copy-group
3896Copy the current group to some other topic
3897(@code{gnus-topic-copy-group}). This command uses the process/prefix
3898convention (@pxref{Process/Prefix}).
3899
3900@item T h
3901@kindex T h (Topic)
3902@findex gnus-topic-hide-topic
3903Hide the current topic (@code{gnus-topic-hide-topic}). If given
3904a prefix, hide the topic permanently.
3905
3906@item T s
3907@kindex T s (Topic)
3908@findex gnus-topic-show-topic
3909Show the current topic (@code{gnus-topic-show-topic}). If given
3910a prefix, show the topic permanently.
3911
3912@item T D
3913@kindex T D (Topic)
3914@findex gnus-topic-remove-group
3915Remove a group from the current topic (@code{gnus-topic-remove-group}).
3916This command is mainly useful if you have the same group in several
3917topics and wish to remove it from one of the topics. You may also
3918remove a group from all topics, but in that case, Gnus will add it to
3919the root topic the next time you start Gnus. In fact, all new groups
3920(which, naturally, don't belong to any topic) will show up in the root
3921topic.
3922
3923This command uses the process/prefix convention
3924(@pxref{Process/Prefix}).
3925
3926@item T M
3927@kindex T M (Topic)
3928@findex gnus-topic-move-matching
3929Move all groups that match some regular expression to a topic
3930(@code{gnus-topic-move-matching}).
3931
3932@item T C
3933@kindex T C (Topic)
3934@findex gnus-topic-copy-matching
3935Copy all groups that match some regular expression to a topic
3936(@code{gnus-topic-copy-matching}).
3937
3938@item T H
3939@kindex T H (Topic)
3940@findex gnus-topic-toggle-display-empty-topics
3941Toggle hiding empty topics
3942(@code{gnus-topic-toggle-display-empty-topics}).
3943
3944@item T #
3945@kindex T # (Topic)
3946@findex gnus-topic-mark-topic
3947Mark all groups in the current topic with the process mark
3948(@code{gnus-topic-mark-topic}). This command works recursively on
3949sub-topics unless given a prefix.
3950
3951@item T M-#
3952@kindex T M-# (Topic)
3953@findex gnus-topic-unmark-topic
3954Remove the process mark from all groups in the current topic
3955(@code{gnus-topic-unmark-topic}). This command works recursively on
3956sub-topics unless given a prefix.
3957
3958@item C-c C-x
3959@kindex C-c C-x (Topic)
3960@findex gnus-topic-expire-articles
3961@cindex expiring mail
3962Run all expirable articles in the current group or topic through the
3963expiry process (if any)
3964(@code{gnus-topic-expire-articles}). (@pxref{Expiring Mail}).
3965
3966@item T r
3967@kindex T r (Topic)
3968@findex gnus-topic-rename
3969Rename a topic (@code{gnus-topic-rename}).
3970
3971@item T DEL
3972@kindex T DEL (Topic)
3973@findex gnus-topic-delete
3974Delete an empty topic (@code{gnus-topic-delete}).
3975
3976@item A T
3977@kindex A T (Topic)
3978@findex gnus-topic-list-active
3979List all groups that Gnus knows about in a topics-ified way
3980(@code{gnus-topic-list-active}).
3981
3982@item T M-n
3983@kindex T M-n (Topic)
3984@findex gnus-topic-goto-next-topic
3985Go to the next topic (@code{gnus-topic-goto-next-topic}).
3986
3987@item T M-p
3988@kindex T M-p (Topic)
3989@findex gnus-topic-goto-previous-topic
01c52d31 3990Go to the previous topic (@code{gnus-topic-goto-previous-topic}).
4009494e
GM
3991
3992@item G p
3993@kindex G p (Topic)
3994@findex gnus-topic-edit-parameters
3995@cindex group parameters
3996@cindex topic parameters
3997@cindex parameters
3998Edit the topic parameters (@code{gnus-topic-edit-parameters}).
3999@xref{Topic Parameters}.
4000
4001@end table
4002
4003
4004@node Topic Variables
4005@subsection Topic Variables
4006@cindex topic variables
4007
4008The previous section told you how to tell Gnus which topics to display.
4009This section explains how to tell Gnus what to display about each topic.
4010
4011@vindex gnus-topic-line-format
4012The topic lines themselves are created according to the
4013@code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
4014Valid elements are:
4015
4016@table @samp
4017@item i
4018Indentation.
4019@item n
4020Topic name.
4021@item v
4022Visibility.
4023@item l
4024Level.
4025@item g
4026Number of groups in the topic.
4027@item a
4028Number of unread articles in the topic.
4029@item A
4030Number of unread articles in the topic and all its subtopics.
4031@end table
4032
4033@vindex gnus-topic-indent-level
4034Each sub-topic (and the groups in the sub-topics) will be indented with
4035@code{gnus-topic-indent-level} times the topic level number of spaces.
4036The default is 2.
4037
4038@vindex gnus-topic-mode-hook
4039@code{gnus-topic-mode-hook} is called in topic minor mode buffers.
4040
4041@vindex gnus-topic-display-empty-topics
4042The @code{gnus-topic-display-empty-topics} says whether to display even
4043topics that have no unread articles in them. The default is @code{t}.
4044
4045
4046@node Topic Sorting
4047@subsection Topic Sorting
4048@cindex topic sorting
4049
4050You can sort the groups in each topic individually with the following
4051commands:
4052
4053
4054@table @kbd
4055@item T S a
4056@kindex T S a (Topic)
4057@findex gnus-topic-sort-groups-by-alphabet
4058Sort the current topic alphabetically by group name
4059(@code{gnus-topic-sort-groups-by-alphabet}).
4060
4061@item T S u
4062@kindex T S u (Topic)
4063@findex gnus-topic-sort-groups-by-unread
4064Sort the current topic by the number of unread articles
4065(@code{gnus-topic-sort-groups-by-unread}).
4066
4067@item T S l
4068@kindex T S l (Topic)
4069@findex gnus-topic-sort-groups-by-level
4070Sort the current topic by group level
4071(@code{gnus-topic-sort-groups-by-level}).
4072
4073@item T S v
4074@kindex T S v (Topic)
4075@findex gnus-topic-sort-groups-by-score
4076Sort the current topic by group score
4077(@code{gnus-topic-sort-groups-by-score}). @xref{Group Score}.
4078
4079@item T S r
4080@kindex T S r (Topic)
4081@findex gnus-topic-sort-groups-by-rank
4082Sort the current topic by group rank
4083(@code{gnus-topic-sort-groups-by-rank}). @xref{Group Score}.
4084
4085@item T S m
4086@kindex T S m (Topic)
4087@findex gnus-topic-sort-groups-by-method
4088Sort the current topic alphabetically by back end name
4089(@code{gnus-topic-sort-groups-by-method}).
4090
4091@item T S e
4092@kindex T S e (Topic)
4093@findex gnus-topic-sort-groups-by-server
4094Sort the current topic alphabetically by server name
4095(@code{gnus-topic-sort-groups-by-server}).
4096
4097@item T S s
4098@kindex T S s (Topic)
4099@findex gnus-topic-sort-groups
4100Sort the current topic according to the function(s) given by the
4101@code{gnus-group-sort-function} variable
4102(@code{gnus-topic-sort-groups}).
4103
4104@end table
4105
4106When given a prefix argument, all these commands will sort in reverse
4107order. @xref{Sorting Groups}, for more information about group
4108sorting.
4109
4110
4111@node Topic Topology
4112@subsection Topic Topology
4113@cindex topic topology
4114@cindex topology
4115
4116So, let's have a look at an example group buffer:
4117
4118@example
4119@group
4120Gnus
4121 Emacs -- I wuw it!
4122 3: comp.emacs
4123 2: alt.religion.emacs
4124 Naughty Emacs
4125 452: alt.sex.emacs
4126 0: comp.talk.emacs.recovery
4127 Misc
4128 8: comp.binaries.fractals
4129 13: comp.sources.unix
4130@end group
4131@end example
4132
4133So, here we have one top-level topic (@samp{Gnus}), two topics under
4134that, and one sub-topic under one of the sub-topics. (There is always
4135just one (1) top-level topic). This topology can be expressed as
4136follows:
4137
4138@lisp
4139(("Gnus" visible)
4140 (("Emacs -- I wuw it!" visible)
4141 (("Naughty Emacs" visible)))
4142 (("Misc" visible)))
4143@end lisp
4144
4145@vindex gnus-topic-topology
4146This is in fact how the variable @code{gnus-topic-topology} would look
4147for the display above. That variable is saved in the @file{.newsrc.eld}
4148file, and shouldn't be messed with manually---unless you really want
4149to. Since this variable is read from the @file{.newsrc.eld} file,
4150setting it in any other startup files will have no effect.
4151
4152This topology shows what topics are sub-topics of what topics (right),
4153and which topics are visible. Two settings are currently
4154allowed---@code{visible} and @code{invisible}.
4155
4156
4157@node Topic Parameters
4158@subsection Topic Parameters
4159@cindex topic parameters
4160
4161All groups in a topic will inherit group parameters from the parent
4162(and ancestor) topic parameters. All valid group parameters are valid
4163topic parameters (@pxref{Group Parameters}). When the agent is
4164enabled, all agent parameters (See Agent Parameters in @ref{Category
4165Syntax}) are also valid topic parameters.
4166
4167In addition, the following parameters are only valid as topic
4168parameters:
4169
4170@table @code
4171@item subscribe
4172When subscribing new groups by topic (@pxref{Subscription Methods}), the
4173@code{subscribe} topic parameter says what groups go in what topic. Its
4174value should be a regexp to match the groups that should go in that
4175topic.
4176
4177@item subscribe-level
4178When subscribing new groups by topic (see the @code{subscribe} parameter),
4179the group will be subscribed with the level specified in the
4180@code{subscribe-level} instead of @code{gnus-level-default-subscribed}.
4181
4182@end table
4183
4184Group parameters (of course) override topic parameters, and topic
4185parameters in sub-topics override topic parameters in super-topics. You
4186know. Normal inheritance rules. (@dfn{Rules} is here a noun, not a
4187verb, although you may feel free to disagree with me here.)
4188
4189@example
4190@group
4191Gnus
4192 Emacs
4193 3: comp.emacs
4194 2: alt.religion.emacs
4195 452: alt.sex.emacs
4196 Relief
4197 452: alt.sex.emacs
4198 0: comp.talk.emacs.recovery
4199 Misc
4200 8: comp.binaries.fractals
4201 13: comp.sources.unix
4202 452: alt.sex.emacs
4203@end group
4204@end example
4205
4206The @samp{Emacs} topic has the topic parameter @code{(score-file
4207. "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter
4208@code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has the
4209topic parameter @code{(score-file . "emacs.SCORE")}. In addition,
4210@* @samp{alt.religion.emacs} has the group parameter @code{(score-file
4211. "religion.SCORE")}.
4212
4213Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you
4214will get the @file{relief.SCORE} home score file. If you enter the same
4215group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home
4216score file. If you enter the group @samp{alt.religion.emacs}, you'll
4217get the @file{religion.SCORE} home score file.
4218
4219This seems rather simple and self-evident, doesn't it? Well, yes. But
4220there are some problems, especially with the @code{total-expiry}
4221parameter. Say you have a mail group in two topics; one with
4222@code{total-expiry} and one without. What happens when you do @kbd{M-x
4223gnus-expire-all-expirable-groups}? Gnus has no way of telling which one
4224of these topics you mean to expire articles from, so anything may
4225happen. In fact, I hereby declare that it is @dfn{undefined} what
4226happens. You just have to be careful if you do stuff like that.
4227
4228
01c52d31
MB
4229@node Non-ASCII Group Names
4230@section Accessing groups of non-English names
4231@cindex non-ascii group names
4232
4233There are some news servers that provide groups of which the names are
4234expressed with their native languages in the world. For instance, in a
4235certain news server there are some newsgroups of which the names are
4236spelled in Chinese, where people are talking in Chinese. You can, of
4237course, subscribe to such news groups using Gnus. Currently Gnus
4238supports non-@acronym{ASCII} group names not only with the @code{nntp}
4239back end but also with the @code{nnml} back end and the @code{nnrss}
4240back end.
4241
4242Every such group name is encoded by a certain charset in the server
4243side (in an @acronym{NNTP} server its administrator determines the
4244charset, but for groups in the other back ends it is determined by you).
4245Gnus has to display the decoded ones for you in the group buffer and the
4246article buffer, and needs to use the encoded ones when communicating
4247with servers. However, Gnus doesn't know what charset is used for each
4248non-@acronym{ASCII} group name. The following two variables are just
4249the ones for telling Gnus what charset should be used for each group:
4250
4251@table @code
4252@item gnus-group-name-charset-method-alist
4253@vindex gnus-group-name-charset-method-alist
4254An alist of select methods and charsets. The default value is
4255@code{nil}. The names of groups in the server specified by that select
4256method are all supposed to use the corresponding charset. For example:
4257
4258@lisp
4259(setq gnus-group-name-charset-method-alist
4260 '(((nntp "news.com.cn") . cn-gb-2312)))
4261@end lisp
4262
4263Charsets specified for groups with this variable are preferred to the
4264ones specified for the same groups with the
4265@code{gnus-group-name-charset-group-alist} variable (see below).
4266
4267A select method can be very long, like:
4268
4269@lisp
4270(nntp "gmane"
4271 (nntp-address "news.gmane.org")
4272 (nntp-end-of-line "\n")
4273 (nntp-open-connection-function
4274 nntp-open-via-rlogin-and-telnet)
4275 (nntp-via-rlogin-command "ssh")
4276 (nntp-via-rlogin-command-switches
4277 ("-C" "-t" "-e" "none"))
4278 (nntp-via-address @dots{}))
4279@end lisp
4280
4281In that case, you can truncate it into @code{(nntp "gmane")} in this
4282variable. That is, it is enough to contain only the back end name and
4283the server name.
4284
4285@item gnus-group-name-charset-group-alist
4286@cindex UTF-8 group names
4287@vindex gnus-group-name-charset-group-alist
4288An alist of regexp of group name and the charset for group names.
4289@code{((".*" . utf-8))} is the default value if UTF-8 is supported,
4290otherwise the default is @code{nil}. For example:
4291
4292@lisp
4293(setq gnus-group-name-charset-group-alist
4294 '(("\\.com\\.cn:" . cn-gb-2312)
4295 (".*" . utf-8)))
4296@end lisp
4297
4298Note that this variable is ignored if the match is made with
4299@code{gnus-group-name-charset-method-alist}.
4300@end table
4301
4302Those two variables are used also to determine the charset for encoding
4303and decoding non-@acronym{ASCII} group names that are in the back ends
4304other than @code{nntp}. It means that it is you who determine it. If
4305you do nothing, the charset used for group names in those back ends will
4306all be @code{utf-8} because of the last element of
4307@code{gnus-group-name-charset-group-alist}.
4308
4309There is one more important variable for non-@acronym{ASCII} group
4310names. @emph{XEmacs users must set this}. Emacs users necessarily need
4311not do:
4312
4313@table @code
4314@item nnmail-pathname-coding-system
4315The value of this variable should be a coding system or @code{nil}
4316(which is the default). The @code{nnml} back end, the @code{nnrss} back
4317end, the @acronym{NNTP} marks feature (@pxref{NNTP marks}), the agent,
4318and the cache use non-@acronym{ASCII} group names in those files and
4319directories. This variable overrides the value of
4320@code{file-name-coding-system} which specifies the coding system used
4321when encoding and decoding those file names and directory names.
4322
4323In XEmacs (with the @code{mule} feature), @code{file-name-coding-system}
4324is the only means to specify the coding system used to encode and decode
4325file names. Therefore, @emph{you, XEmacs users, have to set it} to the
4326coding system that is suitable to encode and decode non-@acronym{ASCII}
4327group names. On the other hand, Emacs uses the value of
4328@code{default-file-name-coding-system} if @code{file-name-coding-system}
4329is @code{nil}. Normally the value of
4330@code{default-file-name-coding-system} is initialized according to the
4331locale, so you will need to do nothing if the value is suitable to
4332encode and decode non-@acronym{ASCII} group names.
4333
4334The value of this variable (or @code{default-file-name-coding-system})
4335does not necessarily need to be the same value that is determined by
4336@code{gnus-group-name-charset-method-alist} and
4337@code{gnus-group-name-charset-group-alist}.
4338
4339If you want to subscribe to the groups spelled in Chinese but
4340@code{default-file-name-coding-system} is initialized by default to
4341@code{iso-latin-1} for example, that is the most typical case where you
4342have to set @code{nnmail-pathname-coding-system} even if you are an
4343Emacs user. The @code{utf-8} coding system is a good candidate for it.
4344Otherwise, you may change the locale in your system so that
4345@code{default-file-name-coding-system} may be initialized to an
4346appropriate value, instead of specifying this variable.
4347@end table
4348
4349Note that when you copy or move articles from a non-@acronym{ASCII}
4350group to another group, the charset used to encode and decode group
4351names should be the same in both groups. Otherwise the Newsgroups
4352header will be displayed incorrectly in the article buffer.
4353
4354
e6d2d263
MB
4355@node Searching
4356@section Searching
4357
4358@menu
4359* nnir:: Searching on IMAP, with swish, namazu, etc.
4360* nnmairix:: Searching maildir, MH or mbox with Mairix.
4361@end menu
4362
4363@cindex Searching
4364
4365FIXME: This node is a stub.
4366
4367FIXME: Add a brief overview of Gnus search capabilities. A brief
4368comparison of nnir, nnmairix, contrib/gnus-namazu would be nice
4369as well.
4370
4371FIXME: Explain difference to @ref{Searching for Articles}, add reference
4372and back-reference.
4373
4374@node nnir
4375@subsection nnir
4376
4377FIXME: As a first step, convert the commentary of @file{nnir} to texi.
4378@cindex nnir
4379
4380@node nnmairix
4381@subsection nnmairix
4382
4383@cindex mairix
4384@cindex nnmairix
4385This paragraph describes how to set up mairix and the back end
4386@code{nnmairix} for indexing and searching your mail from within
4387Gnus. Additionally, you can create permanent ``smart'' groups which are
4388bound to mairix searches and are automatically updated.
4389
4390@menu
4391* About mairix:: About the mairix mail search engine
4392* nnmairix requirements:: What you will need for using nnmairix
4393* What nnmairix does:: What does nnmairix actually do?
4394* Setting up mairix:: Set up your mairix installation
4395* Configuring nnmairix:: Set up the nnmairix back end
4396* nnmairix keyboard shortcuts:: List of available keyboard shortcuts
4397* Propagating marks:: How to propagate marks from nnmairix groups
4398* nnmairix tips and tricks:: Some tips, tricks and examples
4399* nnmairix caveats:: Some more stuff you might want to know
4400@end menu
4401
2b968687
MB
4402@c FIXME: The markup in this section might need improvement.
4403@c E.g. adding @samp, @var, @file, @command, etc.
4404@c Cf. (info "(texinfo)Indicating")
e6d2d263
MB
4405
4406@node About mairix
4407@subsubsection About mairix
4408
4409Mairix is a tool for indexing and searching words in locally stored
4410mail. It was written by Richard Curnow and is licensed under the
4411GPL. Mairix comes with most popular GNU/Linux distributions, but it also
4412runs under Windows (with cygwin), Mac OS X and Solaris. The homepage can
4413be found at
4414@uref{http://www.rpcurnow.force9.co.uk/mairix/index.html}
4415
4416Though mairix might not be as flexible as other search tools like
4417swish++ or namazu, which you can use via the @code{nnir} back end, it
4418has the prime advantage of being incredibly fast. On current systems, it
4419can easily search through headers and message bodies of thousands and
4420thousands of mails in well under a second. Building the database
4421necessary for searching might take a minute or two, but only has to be
4422done once fully. Afterwards, the updates are done incrementally and
4423therefore are really fast, too. Additionally, mairix is very easy to set
4424up.
4425
4426For maximum speed though, mairix should be used with mails stored in
4427@code{Maildir} or @code{MH} format (this includes the @code{nnml} back
4428end), although it also works with mbox. Mairix presents the search
4429results by populating a @emph{virtual} maildir/MH folder with symlinks
4430which point to the ``real'' message files (if mbox is used, copies are
4431made). Since mairix already presents search results in such a virtual
4432mail folder, it is very well suited for using it as an external program
4433for creating @emph{smart} mail folders, which represent certain mail
4434searches. This is similar to a Kiboze group (@pxref{Kibozed Groups}),
4435but much faster.
4436
4437@node nnmairix requirements
4438@subsubsection nnmairix requirements
4439
2b968687 4440Mairix searches local mail---that means, mairix absolutely must have
e6d2d263
MB
4441direct access to your mail folders. If your mail resides on another
4442server (e.g. an @acronym{IMAP} server) and you happen to have shell
4443access, @code{nnmairix} supports running mairix remotely, e.g. via ssh.
4444
4445Additionally, @code{nnmairix} only supports the following Gnus back
2b968687
MB
4446ends: @code{nnml}, @code{nnmaildir}, and @code{nnimap}. You must use
4447one of these back ends for using @code{nnmairix}. Other back ends, like
4448@code{nnmbox}, @code{nnfolder} or @code{nnmh}, won't work.
e6d2d263
MB
4449
4450If you absolutely must use mbox and still want to use @code{nnmairix},
4451you can set up a local @acronym{IMAP} server, which you then access via
4452@code{nnimap}. This is a rather massive setup for accessing some mbox
4453files, so just change to MH or Maildir already...
4454
4455@node What nnmairix does
4456@subsubsection What nnmairix does
4457
4458The back end @code{nnmairix} enables you to call mairix from within Gnus,
4459either to query mairix with a search term or to update the
4460database. While visiting a message in the summary buffer, you can use
4461several pre-defined shortcuts for calling mairix, e.g. to quickly
4462search for all mails from the sender of the current message or to
4463display the whole thread associated with the message, even if the
4464mails are in different folders.
4465
4466Additionally, you can create permanent @code{nnmairix} groups which are bound
4467to certain mairix searches. This way, you can easily create a group
4468containing mails from a certain sender, with a certain subject line or
4469even for one specific thread based on the Message-ID. If you check for
4470new mail in these folders (e.g. by pressing @kbd{g} or @kbd{M-g}), they
4471automatically update themselves by calling mairix.
4472
4473You might ask why you need @code{nnmairix} at all, since mairix already
4474creates the group, populates it with links to the mails so that you can
4475then access it with Gnus, right? Well, this @emph{might} work, but often
2b968687 4476does not---at least not without problems. Most probably you will get
e6d2d263
MB
4477strange article counts, and sometimes you might see mails which Gnus
4478claims have already been canceled and are inaccessible. This is due to
4479the fact that Gnus isn't really amused when things are happening behind
4480its back. Another problem can be the mail back end itself, e.g. if you
4481use mairix with an @acronym{IMAP} server (I had Dovecot complaining
4482about corrupt index files when mairix changed the contents of the search
4483group). Using @code{nnmairix} should circumvent these problems.
4484
2b968687 4485@code{nnmairix} is not really a mail back end---it's actually more like a
e6d2d263
MB
4486wrapper, sitting between a ``real'' mail back end where mairix stores the
4487searches and the Gnus front end. You can choose between three different
4488mail back ends for the mairix folders: @code{nnml}, @code{nnmaildir} or
4489@code{nnimap}. @code{nnmairix} will call the mairix binary so that the
4490search results are stored in folders named
4491@code{zz_mairix-<NAME>-<NUMBER>} on this mail back end, but it will
4492present these folders in the Gnus front end only with @code{<NAME>}. You
4493can use an existing mail back end where you already store your mail, but
4494if you're uncomfortable with @code{nnmairix} creating new mail groups
4495alongside your other mail, you can also create e.g. a new
4496@code{nnmaildir} server exclusively for mairix. However, a special case
4497exists if you want to use mairix remotely on an IMAP server with
2b968687 4498@code{nnimap}---here the mairix folders and your other mail must be on
e6d2d263
MB
4499the same @code{nnimap} back end.
4500
4501@node Setting up mairix
4502@subsubsection Setting up mairix
4503
4504First: create a backup of your mail folders (@pxref{nnmairix caveats}).
4505
4506Setting up mairix is easy: simply create a @file{.mairixrc} file with
4507(at least) the following entries:
4508
4509@example
4510# Your Maildir/MH base folder
4511base=~/Maildir
4512@end example
4513
2b968687
MB
4514This is the base folder for your mails. All the following directories
4515are relative to this base folder. If you want to use @code{nnmairix}
4516with @code{nnimap}, this base directory has to point to the mail
4517directory where the @acronym{IMAP} server stores the mail folders!
e6d2d263 4518
e6d2d263
MB
4519@example
4520maildir= ... your maildir folders which should be indexed ...
4521mh= ... your nnml/mh folders which should be indexed ...
4522mbox = ... your mbox files which should be indexed ...
4523@end example
4524
9e601b8d
MB
4525This specifies all your mail folders and mbox files (relative to the
4526base directory!) you want to index with mairix. Note that the
4527@code{nnml} back end saves mails in MH format, so you have to put those
4528directories in the @code{mh} line. See the example at the end of this
4529section and mairixrc's man-page for further details.
e6d2d263
MB
4530
4531@example
4532omit=zz_mairix-*
4533@end example
4534
4535@vindex nnmairix-group-prefix
4536This should make sure that you don't accidentally index the mairix
4537search results. You can change the prefix of these folders with the
4538variable @code{nnmairix-group-prefix}.
4539
e6d2d263
MB
4540@example
4541mformat= ... 'maildir' or 'mh' ...
4542database= ... location of database file ...
4543@end example
4544
4545The @code{format} setting specifies the output format for the mairix
4546search folder. Set this to @code{mh} if you want to access search results
4547with @code{nnml}. Otherwise choose @code{maildir}.
4548
2b968687
MB
4549To summarize, here is my shortened @file{.mairixrc} file as an example:
4550
4551@example
4552base=~/Maildir
4553maildir=.personal:.work:.logcheck:.sent
4554mh=../Mail/nnml/*...
4555mbox=../mboxmail/mailarchive_year*
4556mformat=maildir
4557omit=zz_mairix-*
4558database=~/.mairixdatabase
4559@end example
4560
4561In this case, the base directory is @file{~/Maildir}, where all my Maildir
4562folders are stored. As you can see, the folders are separated by
4563colons. If you wonder why every folder begins with a dot: this is
4564because I use Dovecot as @acronym{IMAP} server, which again uses
4565@code{Maildir++} folders. For testing nnmairix, I also have some
4566@code{nnml} mail, which is saved in @file{~/Mail/nnml}. Since this has
4567to be specified relative to the @code{base} directory, the @code{../Mail}
4568notation is needed. Note that the line ends in @code{*...}, which means
4569to recursively scan all files under this directory. Without the three
4570dots, the wildcard @code{*} will not work recursively. I also have some
4571old mbox files with archived mail lying around in @file{~/mboxmail}.
4572The other lines should be obvious.
4573
4574See the man page for @code{mairixrc} for details and further options,
4575especially regarding wildcard usage, which may be a little different
4576than you are used to.
4577
4578Now simply call @code{mairix} to create the index for the first time.
4579Note that this may take a few minutes, but every following index will do
4580the updates incrementally and hence is very fast.
e6d2d263
MB
4581
4582@node Configuring nnmairix
4583@subsubsection Configuring nnmairix
4584
4585In group mode, type @kbd{G b c}
4586(@code{nnmairix-create-server-and-default-group}). This will ask you for all
4587necessary information and create a @code{nnmairix} server as a foreign
4588server. You will have to specify the following:
4589
4590@itemize @bullet
4591
4592@item
2b968687 4593The @strong{name} of the @code{nnmairix} server---choose whatever you
e6d2d263
MB
4594want.
4595
4596@item
9e601b8d
MB
4597The name of the @strong{back end server} where mairix should store its
4598searches. This must be a full server name, like @code{nnml:mymail}.
4599Just hit @kbd{TAB} to see the available servers. Currently, servers
4600which are accessed through @code{nnmaildir}, @code{nnimap} and
4601@code{nnml} are supported. As explained above, for locally stored
4602mails, this can be an existing server where you store your mails.
4603However, you can also create e.g. a new @code{nnmaildir} server
4604exclusively for @code{nnmairix} in your secondary select methods
4605(@pxref{Finding the News}). If you want to use mairix remotely on an
4606@acronym{IMAP} server, you have to choose the corresponding
4607@code{nnimap} server here.
e6d2d263
MB
4608
4609@item
4610@vindex nnmairix-mairix-search-options
4611The @strong{command} to call the mairix binary. This will usually just
4612be @code{mairix}, but you can also choose something like @code{ssh
4613SERVER mairix} if you want to call mairix remotely, e.g. on your
4614@acronym{IMAP} server. If you want to add some default options to
4615mairix, you could do this here, but better use the variable
4616@code{nnmairix-mairix-search-options} instead.
4617
4618@item
4619The name of the @strong{default search group}. This will be the group
4620where all temporary mairix searches are stored, i.e. all searches which
4621are not bound to permanent @code{nnmairix} groups. Choose whatever you
4622like.
4623
4624@item
4625If the mail back end is @code{nnimap} or @code{nnmaildir}, you will be
4626asked if you work with @strong{Maildir++}, i.e. with hidden maildir
4627folders (=beginning with a dot). For example, you have to answer
4628@samp{yes} here if you work with the Dovecot @acronym{IMAP}
4629server. Otherwise, you should answer @samp{no} here.
4630
4631@end itemize
4632
4633@node nnmairix keyboard shortcuts
4634@subsubsection nnmairix keyboard shortcuts
4635
4636In group mode:
4637
4638@table @kbd
4639
4640@item G b c
4641@kindex G b c (Group)
4642@findex nnmairix-create-server-and-default-group
4643Creates @code{nnmairix} server and default search group for this server
4644(@code{nnmairix-create-server-and-default-group}). You should have done
4645this by now (@pxref{Configuring nnmairix}).
4646
4647@item G b s
4648@kindex G b s (Group)
4649@findex nnmairix-search
4650Prompts for query which is then sent to the mairix binary. Search
4651results are put into the default search group which is automatically
4652displayed (@code{nnmairix-search}).
4653
4654@item G b m
4655@kindex G b m (Group)
4656@findex nnmairix-widget-search
4657Allows you to create a mairix search or a permanent group more
4658comfortably using graphical widgets, similar to a customization
4659group. Just try it to see how it works (@code{nnmairix-widget-search}).
4660
4661@item G b i
4662@kindex G b i (Group)
4663@findex nnmairix-search-interactive
4664Another command for creating a mairix query more comfortably, but uses
4665only the minibuffer (@code{nnmairix-search-interactive}).
4666
4667@item G b g
4668@kindex G b g (Group)
4669@findex nnmairix-create-search-group
4670Creates a permanent group which is associated with a search query
4671(@code{nnmairix-create-search-group}). The @code{nnmairix} back end
4672automatically calls mairix when you update this group with @kbd{g} or
4673@kbd{M-g}.
4674
4675@item G b q
4676@kindex G b q (Group)
4677@findex nnmairix-group-change-query-this-group
4678Changes the search query for the @code{nnmairix} group under cursor
4679(@code{nnmairix-group-change-query-this-group}).
4680
4681@item G b t
4682@kindex G b t (Group)
4683@findex nnmairix-group-toggle-threads-this-group
4684Toggles the 'threads' parameter for the @code{nnmairix} group under cursor,
4685i.e. if you want see the whole threads of the found messages
4686(@code{nnmairix-group-toggle-threads-this-group}).
4687
4688@item G b u
4689@kindex G b u (Group)
4690@findex nnmairix-update-database
4691@vindex nnmairix-mairix-update-options
4692Calls mairix binary for updating the database
4693(@code{nnmairix-update-database}). The default parameters are @code{-F}
4694and @code{-Q} for making this as fast as possible (see variable
4695@code{nnmairix-mairix-update-options} for defining these default
4696options).
4697
4698@item G b r
4699@kindex G b r (Group)
4700@findex nnmairix-group-toggle-readmarks-this-group
4701Keep articles in this @code{nnmairix} group always read or unread, or leave the
4702marks unchanged (@code{nnmairix-group-toggle-readmarks-this-group}).
4703
4704@item G b d
4705@kindex G b d (Group)
4706@findex nnmairix-group-delete-recreate-this-group
4707Recreate @code{nnmairix} group on the ``real'' mail back end
4708(@code{nnmairix-group-delete-recreate-this-group}). You can do this if
4709you always get wrong article counts with a @code{nnmairix} group.
4710
4711@item G b a
4712@kindex G b a (Group)
4713@findex nnmairix-group-toggle-allowfast-this-group
4714Toggles the @code{allow-fast} parameters for group under cursor
4715(@code{nnmairix-group-toggle-allowfast-this-group}). The default
4716behavior of @code{nnmairix} is to do a mairix search every time you
4717update or enter the group. With the @code{allow-fast} parameter set,
4718mairix will only be called when you explicitly update the group, but not
4719upon entering. This makes entering the group faster, but it may also
4720lead to dangling symlinks if something changed between updating and
4721entering the group which is not yet in the mairix database.
4722
4723@item G b p
4724@kindex G b p (Group)
4725@findex nnmairix-group-toggle-propmarks-this-group
4726Toggle marks propagation for this group
4727(@code{nnmairix-group-toggle-propmarks-this-group}). (@pxref{Propagating
4728marks}).
4729
4730@item G b o
4731@kindex G b o (Group)
4732@findex nnmairix-propagate-marks
4733Manually propagate marks (@code{nnmairix-propagate-marks}); needed only when
4734@code{nnmairix-propagate-marks-upon-close} is set to @code{nil}.
4735
4736@end table
4737
4738In summary mode:
4739
4740@table @kbd
4741
4742@item $ m
4743@kindex $ m (Summary)
4744@findex nnmairix-widget-search-from-this-article
4745Allows you to create a mairix query or group based on the current
4746message using graphical widgets (same as @code{nnmairix-widget-search})
4747(@code{nnmairix-widget-search-from-this-article}).
4748
4749@item $ g
4750@kindex $ g (Summary)
4751@findex nnmairix-create-search-group-from-message
4752Interactively creates a new search group with query based on the current
4753message, but uses the minibuffer instead of graphical widgets
4754(@code{nnmairix-create-search-group-from-message}).
4755
4756@item $ t
4757@kindex $ t (Summary)
4758@findex nnmairix-search-thread-this-article
4759Searches thread for the current article
4760(@code{nnmairix-search-thread-this-article}). This is effectively a
4761shortcut for calling @code{nnmairix-search} with @samp{m:msgid} of the
4762current article and enabled threads.
4763
4764@item $ f
4765@kindex $ f (Summary)
4766@findex nnmairix-search-from-this-article
4767Searches all messages from sender of the current article
4768(@code{nnmairix-search-from-this-article}). This is a shortcut for
4769calling @code{nnmairix-search} with @samp{f:From}.
4770
4771@item $ o
4772@kindex $ o (Summary)
4773@findex nnmairix-goto-original-article
4774(Only in @code{nnmairix} groups!) Tries determine the group this article
4775originally came from and displays the article in this group, so that
4776e.g. replying to this article the correct posting styles/group
4777parameters are applied (@code{nnmairix-goto-original-article}). This
4778function will use the registry if available, but can also parse the
2b968687 4779article file name as a fallback method.
e6d2d263
MB
4780
4781@item $ u
4782@kindex $ u (Summary)
4783@findex nnmairix-remove-tick-mark-original-article
4784Remove possibly existing tick mark from original article
4785(@code{nnmairix-remove-tick-mark-original-article}). (@pxref{nnmairix
4786tips and tricks}).
4787
4788@end table
4789
4790@node Propagating marks
4791@subsubsection Propagating marks
4792
4793First of: you really need a patched mairix binary for using the marks
4794propagation feature efficiently. Otherwise, you would have to update
4795the mairix database all the time. You can get the patch at
4796
4797@uref{http://m61s02.vlinux.de/mairix-maildir-patch.tar}
4798
4799You need the mairix v0.21 source code for this patch; everything else
4800is explained in the accompanied readme file. If you don't want to use
4801marks propagation, you don't have to apply these patches, but they also
4802fix some annoyances regarding changing maildir flags, so it might still
4803be useful to you.
4804
4805With the patched mairix binary, you can use @code{nnmairix} as an
4806alternative to mail splitting (@pxref{Fancy Mail Splitting}). For
4807example, instead of splitting all mails from @samp{david@@foobar.com}
4808into a group, you can simply create a search group with the query
4809@samp{f:david@@foobar.com}. This is actually what ``smart folders'' are
4810all about: simply put everything in one mail folder and dynamically
4811create searches instead of splitting. This is more flexible, since you
4812can dynamically change your folders any time you want to. This also
4813implies that you will usually read your mails in the @code{nnmairix}
4814groups instead of your ``real'' mail groups.
4815
4816There is one problem, though: say you got a new mail from
2b968687 4817@samp{david@@foobar.com}; it will now show up in two groups, the
e6d2d263
MB
4818``real'' group (your INBOX, for example) and in the @code{nnmairix}
4819search group (provided you have updated the mairix database). Now you
4820enter the @code{nnmairix} group and read the mail. The mail will be
2b968687 4821marked as read, but only in the @code{nnmairix} group---in the ``real''
e6d2d263
MB
4822mail group it will be still shown as unread.
4823
4824You could now catch up the mail group (@pxref{Group Data}), but this is
4825tedious and error prone, since you may overlook mails you don't have
4826created @code{nnmairix} groups for. Of course, you could first use
4827@code{nnmairix-goto-original-article} (@pxref{nnmairix keyboard
4828shortcuts}) and then read the mail in the original group, but that's
4829even more cumbersome.
4830
4831Clearly, the easiest way would be if marks could somehow be
4832automatically set for the original article. This is exactly what
4833@emph{marks propagation} is about.
4834
4835Marks propagation is deactivated by default. You can activate it for a
4836certain @code{nnmairix} group with
4837@code{nnmairix-group-toggle-propmarks-this-group} (bound to @kbd{G b
4838p}). This function will warn you if you try to use it with your default
4839search group; the reason is that the default search group is used for
4840temporary searches, and it's easy to accidentally propagate marks from
4841this group. However, you can ignore this warning if you really want to.
4842
4843With marks propagation enabled, all the marks you set in a @code{nnmairix}
4844group should now be propagated to the original article. For example,
4845you can now tick an article (by default with @kbd{!}) and this mark should
4846magically be set for the original article, too.
4847
4848A few more remarks which you may or may not want to know:
4849
4850@vindex nnmairix-propagate-marks-upon-close
4851Marks will not be set immediately, but only upon closing a group. This
4852not only makes marks propagation faster, it also avoids problems with
4853dangling symlinks when dealing with maildir files (since changing flags
4854will change the file name). You can also control when to propagate marks
4855via @code{nnmairix-propagate-marks-upon-close} (see the doc-string for
4856details).
4857
4858Obviously, @code{nnmairix} will have to look up the original group for every
4859article you want to set marks for. If available, @code{nnmairix} will first use
4860the registry for determining the original group. The registry is very
4861fast, hence you should really, really enable the registry when using
4862marks propagation. If you don't have to worry about RAM and disc space,
4863set @code{gnus-registry-max-entries} to a large enough value; to be on
4864the safe side, choose roughly the amount of mails you index with mairix.
4865
4866@vindex nnmairix-only-use-registry
4867If you don't want to use the registry or the registry hasn't seen the
2b968687
MB
4868original article yet, @code{nnmairix} will use an additional mairix
4869search for determining the file name of the article. This, of course, is
4870way slower than the registry---if you set hundreds or even thousands of
4871marks this way, it might take some time. You can avoid this situation by
4872setting @code{nnmairix-only-use-registry} to t.
e6d2d263
MB
4873
4874Maybe you also want to propagate marks the other way round, i.e. if you
4875tick an article in a "real" mail group, you'd like to have the same
4876article in a @code{nnmairix} group ticked, too. For several good
4877reasons, this can only be done efficiently if you use maildir. To
4878immediately contradict myself, let me mention that it WON'T work with
4879@code{nnmaildir}, since @code{nnmaildir} stores the marks externally and
4880not in the file name. Therefore, propagating marks to @code{nnmairix}
4881groups will usually only work if you use an IMAP server which uses
4882maildir as its file format.
4883
4884@vindex nnmairix-propagate-marks-to-nnmairix-groups
4885If you work with this setup, just set
4886@code{nnmairix-propagate-marks-to-nnmairix-groups} to @code{t} and see what
4887happens. If you don't like what you see, just set it to @code{nil} again. One
4888problem might be that you get a wrong number of unread articles; this
4889usually happens when you delete or expire articles in the original
4890groups. When this happens, you can recreate the @code{nnmairix} group on the
4891back end using @kbd{G b d}.
4892
4893@node nnmairix tips and tricks
4894@subsubsection nnmairix tips and tricks
4895
4896@itemize
4897@item
4898Checking Mail
4899
4900@findex nnmairix-update-groups
4901I put all my important mail groups at group level 1. The mairix groups
4902have group level 5, so they do not get checked at start up (@pxref{Group
4903Levels}).
4904
4905I use the following to check for mails:
4906
4907@lisp
4908(defun my-check-mail-mairix-update (level)
4909 (interactive "P")
4910 ;; if no prefix given, set level=1
4911 (gnus-group-get-new-news (or level 1))
4912 (nnmairix-update-groups "mairixsearch" t t)
4913 (gnus-group-list-groups))
4914
4915(define-key gnus-group-mode-map "g" 'my-check-mail-mairix-update)
4916@end lisp
4917
4918Instead of @samp{"mairixsearch"} use the name of your @code{nnmairix}
4919server. See the doc string for @code{nnmairix-update-groups} for
4920details.
4921
4922@item
4923Example: search group for ticked articles
4924
4925For example, you can create a group for all ticked articles, where the
4926articles always stay unread:
4927
4928Hit @kbd{G b g}, enter group name (e.g. @samp{important}), use
4929@samp{F:f} as query and do not include threads.
4930
4931Now activate marks propagation for this group by using @kbd{G b p}. Then
4932activate the always-unread feature by using @kbd{G b r} twice.
4933
2b968687 4934So far so good---but how do you remove the tick marks in the @code{nnmairix}
e6d2d263
MB
4935group? There are two options: You may simply use
4936@code{nnmairix-remove-tick-mark-original-article} (bound to @kbd{$ u}) to remove
4937tick marks from the original article. The other possibility is to set
4938@code{nnmairix-propagate-marks-to-nnmairix-groups} to @code{t}, but see the above
4939comments about this option. If it works for you, the tick marks should
4940also exist in the @code{nnmairix} group and you can remove them as usual,
4941e.g. by marking an article as read.
4942
4943When you have removed a tick mark from the original article, this
4944article should vanish from the @code{nnmairix} group after you have updated the
4945mairix database and updated the group. Fortunately, there is a function
4946for doing exactly that: @code{nnmairix-update-groups}. See the previous code
4947snippet and the doc string for details.
4948
4949@item
4950Dealing with auto-subscription of mail groups
4951
4952As described before, all @code{nnmairix} groups are in fact stored on
4953the mail back end in the form @samp{zz_mairix-<NAME>-<NUMBER>}. You can
4954see them when you enter the back end server in the server buffer. You
4955should not subscribe these groups! Unfortunately, these groups will
2b968687 4956usually get @emph{auto-subscribed} when you use @code{nnmaildir} or
e6d2d263
MB
4957@code{nnml}, i.e. you will suddenly see groups of the form
4958@samp{zz_mairix*} pop up in your group buffer. If this happens to you,
4959simply kill these groups with C-k. For avoiding this, turn off
4960auto-subscription completely by setting the variable
4961@code{gnus-auto-subscribed-groups} to @code{nil} (@pxref{Filtering New
4962Groups}), or if you like to keep this feature use the following kludge
4963for turning it off for all groups beginning with @samp{zz_}:
4964
4965@lisp
4966(setq gnus-auto-subscribed-groups
4967 "^\\(nnml\\|nnfolder\\|nnmbox\\|nnmh\\|nnbabyl\\|nnmaildir\\).*:\\([^z]\\|z$\\|\\z[^z]\\|zz$\\|zz[^_]\\|zz_$\\).*")
4968@end lisp
4969
4970@end itemize
4971
4972@node nnmairix caveats
4973@subsubsection nnmairix caveats
4974
4975@itemize
4976@item
4977If you use the Gnus agent (@pxref{Gnus Unplugged}): don't agentize
4978@code{nnmairix} groups (though I have no idea what happens if you do).
4979
4980@item
4981If you use the Gnus registry: don't use the registry with
4982@code{nnmairix} groups (put them in
2b968687
MB
4983@code{gnus-registry-unfollowed-groups}). Be @emph{extra careful} if
4984you use @code{gnus-registry-split-fancy-with-parent}; mails which are
e6d2d263
MB
4985split into @code{nnmairix} groups are usually gone for good as soon as
4986you check the group for new mail (yes, it has happened to me...).
4987
4988@item
2b968687 4989Therefore: @emph{Never ever} put ``real'' mails into @code{nnmairix}
e6d2d263
MB
4990groups (you shouldn't be able to, anyway).
4991
4992@item
4993mairix does only support us-ascii characters.
4994
4995@item
4996@code{nnmairix} uses a rather brute force method to force Gnus to
4997completely reread the group on the mail back end after mairix was
2b968687 4998called---it simply deletes and re-creates the group on the mail
e6d2d263
MB
4999back end. So far, this has worked for me without any problems, and I
5000don't see how @code{nnmairix} could delete other mail groups than its
5001own, but anyway: you really should have a backup of your mail
5002folders.
5003
5004@item
5005All necessary information is stored in the group parameters
5006(@pxref{Group Parameters}). This has the advantage that no active file
5007is needed, but also implies that when you kill a @code{nnmairix} group,
5008it is gone for good.
5009
5010@item
5011@findex nnmairix-purge-old-groups
5012If you create and kill a lot of @code{nnmairix} groups, the
5013``zz_mairix-*'' groups will accumulate on the mail back end server. To
5014delete old groups which are no longer needed, call
5015@code{nnmairix-purge-old-groups}. Note that this assumes that you don't
5016save any ``real'' mail in folders of the form
5017@code{zz_mairix-<NAME>-<NUMBER>}. You can change the prefix of
5018@code{nnmairix} groups by changing the variable
5019@code{nnmairix-group-prefix}.
5020
5021@item
2b968687 5022The following only applies if you @emph{don't} use the mentioned patch
e6d2d263
MB
5023for mairix (@pxref{Propagating marks}):
5024
5025A problem can occur when using @code{nnmairix} with maildir folders and
5026comes with the fact that maildir stores mail flags like @samp{Seen} or
5027@samp{Replied} by appending chars @samp{S} and @samp{R} to the message
5028file name, respectively. This implies that currently you would have to
5029update the mairix database not only when new mail arrives, but also when
5030mail flags are changing. The same applies to new mails which are indexed
5031while they are still in the @samp{new} folder but then get moved to
5032@samp{cur} when Gnus has seen the mail. If you don't update the database
5033after this has happened, a mairix query can lead to symlinks pointing to
5034non-existing files. In Gnus, these messages will usually appear with
5035``(none)'' entries in the header and can't be accessed. If this happens
5036to you, using @kbd{G b u} and updating the group will usually fix this.
5037
5038@end itemize
5039
4009494e
GM
5040@node Misc Group Stuff
5041@section Misc Group Stuff
5042
5043@menu
5044* Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
5045* Group Information:: Information and help on groups and Gnus.
5046* Group Timestamp:: Making Gnus keep track of when you last read a group.
5047* File Commands:: Reading and writing the Gnus files.
5048* Sieve Commands:: Managing Sieve scripts.
5049@end menu
5050
5051@table @kbd
5052
5053@item v
5054@kindex v (Group)
5055@cindex keys, reserved for users (Group)
5056The key @kbd{v} is reserved for users. You can bind it to some
5057command or better use it as a prefix key. For example:
5058
5059@lisp
5060(define-key gnus-group-mode-map (kbd "v j d")
5061 (lambda ()
5062 (interactive)
5063 (gnus-group-jump-to-group "nndraft:drafts")))
5064@end lisp
5065
5066On keys reserved for users in Emacs and on keybindings in general
5067@xref{Keymaps, Keymaps, , emacs, The Emacs Editor}.
5068
5069@item ^
5070@kindex ^ (Group)
5071@findex gnus-group-enter-server-mode
5072Enter the server buffer (@code{gnus-group-enter-server-mode}).
5073@xref{Server Buffer}.
5074
5075@item a
5076@kindex a (Group)
5077@findex gnus-group-post-news
5078Start composing a message (a news by default)
5079(@code{gnus-group-post-news}). If given a prefix, post to the group
5080under the point. If the prefix is 1, prompt for a group to post to.
5081Contrary to what the name of this function suggests, the prepared
5082article might be a mail instead of a news, if a mail group is specified
5083with the prefix argument. @xref{Composing Messages}.
5084
5085@item m
5086@kindex m (Group)
5087@findex gnus-group-mail
5088Mail a message somewhere (@code{gnus-group-mail}). If given a prefix,
5089use the posting style of the group under the point. If the prefix is 1,
5090prompt for a group name to find the posting style.
5091@xref{Composing Messages}.
5092
5093@item i
5094@kindex i (Group)
5095@findex gnus-group-news
5096Start composing a news (@code{gnus-group-news}). If given a prefix,
5097post to the group under the point. If the prefix is 1, prompt
5098for group to post to. @xref{Composing Messages}.
5099
5100This function actually prepares a news even when using mail groups.
5101This is useful for ``posting'' messages to mail groups without actually
5102sending them over the network: they're just saved directly to the group
5103in question. The corresponding back end must have a request-post method
5104for this to work though.
5105
01c52d31
MB
5106@item G z
5107@kindex G z (Group)
5108@findex gnus-group-compact-group
5109
5110Compact the group under point (@code{gnus-group-compact-group}).
5111Currently implemented only in nnml (@pxref{Mail Spool}). This removes
5112gaps between article numbers, hence getting a correct total article
5113count.
5114
4009494e
GM
5115@end table
5116
5117Variables for the group buffer:
5118
5119@table @code
5120
5121@item gnus-group-mode-hook
5122@vindex gnus-group-mode-hook
5123is called after the group buffer has been
5124created.
5125
5126@item gnus-group-prepare-hook
5127@vindex gnus-group-prepare-hook
5128is called after the group buffer is
5129generated. It may be used to modify the buffer in some strange,
5130unnatural way.
5131
5132@item gnus-group-prepared-hook
5133@vindex gnus-group-prepare-hook
5134is called as the very last thing after the group buffer has been
5135generated. It may be used to move point around, for instance.
5136
5137@item gnus-permanently-visible-groups
5138@vindex gnus-permanently-visible-groups
5139Groups matching this regexp will always be listed in the group buffer,
5140whether they are empty or not.
5141
4009494e
GM
5142@end table
5143
5144@node Scanning New Messages
5145@subsection Scanning New Messages
5146@cindex new messages
5147@cindex scanning new news
5148
5149@table @kbd
5150
5151@item g
5152@kindex g (Group)
5153@findex gnus-group-get-new-news
5154@c @icon{gnus-group-get-new-news}
5155Check the server(s) for new articles. If the numerical prefix is used,
5156this command will check only groups of level @var{arg} and lower
5157(@code{gnus-group-get-new-news}). If given a non-numerical prefix, this
5158command will force a total re-reading of the active file(s) from the
5159back end(s).
5160
5161@item M-g
5162@kindex M-g (Group)
5163@findex gnus-group-get-new-news-this-group
5164@vindex gnus-goto-next-group-when-activating
5165@c @icon{gnus-group-get-new-news-this-group}
5166Check whether new articles have arrived in the current group
5167(@code{gnus-group-get-new-news-this-group}).
5168@code{gnus-goto-next-group-when-activating} says whether this command is
5169to move point to the next group or not. It is @code{t} by default.
5170
5171@findex gnus-activate-all-groups
5172@cindex activating groups
5173@item C-c M-g
5174@kindex C-c M-g (Group)
5175Activate absolutely all groups (@code{gnus-activate-all-groups}).
5176
5177@item R
5178@kindex R (Group)
5179@cindex restarting
5180@findex gnus-group-restart
5181Restart Gnus (@code{gnus-group-restart}). This saves the @file{.newsrc}
5182file(s), closes the connection to all servers, clears up all run-time
5183Gnus variables, and then starts Gnus all over again.
5184
5185@end table
5186
5187@vindex gnus-get-new-news-hook
5188@code{gnus-get-new-news-hook} is run just before checking for new news.
5189
5190@vindex gnus-after-getting-new-news-hook
5191@code{gnus-after-getting-new-news-hook} is run after checking for new
5192news.
5193
5194
5195@node Group Information
5196@subsection Group Information
5197@cindex group information
5198@cindex information on groups
5199
5200@table @kbd
5201
5202
5203@item H f
5204@kindex H f (Group)
5205@findex gnus-group-fetch-faq
5206@vindex gnus-group-faq-directory
5207@cindex FAQ
5208@cindex ange-ftp
5209Try to fetch the @acronym{FAQ} for the current group
5210(@code{gnus-group-fetch-faq}). Gnus will try to get the @acronym{FAQ}
5211from @code{gnus-group-faq-directory}, which is usually a directory on
5212a remote machine. This variable can also be a list of directories.
5213In that case, giving a prefix to this command will allow you to choose
5214between the various sites. @code{ange-ftp} (or @code{efs}) will be
5215used for fetching the file.
5216
5217If fetching from the first site is unsuccessful, Gnus will attempt to go
5218through @code{gnus-group-faq-directory} and try to open them one by one.
5219
5220@item H c
5221@kindex H c (Group)
5222@findex gnus-group-fetch-charter
5223@vindex gnus-group-charter-alist
5224@cindex charter
5225Try to open the charter for the current group in a web browser
5226(@code{gnus-group-fetch-charter}). Query for a group if given a
5227prefix argument.
5228
5229Gnus will use @code{gnus-group-charter-alist} to find the location of
5230the charter. If no location is known, Gnus will fetch the control
5231messages for the group, which in some cases includes the charter.
5232
5233@item H C
5234@kindex H C (Group)
5235@findex gnus-group-fetch-control
5236@vindex gnus-group-fetch-control-use-browse-url
5237@cindex control message
5238Fetch the control messages for the group from the archive at
5239@code{ftp.isc.org} (@code{gnus-group-fetch-control}). Query for a
5240group if given a prefix argument.
5241
5242If @code{gnus-group-fetch-control-use-browse-url} is non-@code{nil},
5243Gnus will open the control messages in a browser using
5244@code{browse-url}. Otherwise they are fetched using @code{ange-ftp}
5245and displayed in an ephemeral group.
5246
5247Note that the control messages are compressed. To use this command
5248you need to turn on @code{auto-compression-mode} (@pxref{Compressed
5249Files, ,Compressed Files, emacs, The Emacs Manual}).
5250
5251@item H d
5252@itemx C-c C-d
5253@c @icon{gnus-group-describe-group}
5254@kindex H d (Group)
5255@kindex C-c C-d (Group)
5256@cindex describing groups
5257@cindex group description
5258@findex gnus-group-describe-group
5259Describe the current group (@code{gnus-group-describe-group}). If given
5260a prefix, force Gnus to re-read the description from the server.
5261
5262@item M-d
5263@kindex M-d (Group)
5264@findex gnus-group-describe-all-groups
5265Describe all groups (@code{gnus-group-describe-all-groups}). If given a
5266prefix, force Gnus to re-read the description file from the server.
5267
5268@item H v
5269@itemx V
5270@kindex V (Group)
5271@kindex H v (Group)
5272@cindex version
5273@findex gnus-version
5274Display current Gnus version numbers (@code{gnus-version}).
5275
5276@item ?
5277@kindex ? (Group)
5278@findex gnus-group-describe-briefly
5279Give a very short help message (@code{gnus-group-describe-briefly}).
5280
5281@item C-c C-i
5282@kindex C-c C-i (Group)
5283@cindex info
5284@cindex manual
5285@findex gnus-info-find-node
5286Go to the Gnus info node (@code{gnus-info-find-node}).
5287@end table
5288
5289
5290@node Group Timestamp
5291@subsection Group Timestamp
5292@cindex timestamps
5293@cindex group timestamps
5294
5295It can be convenient to let Gnus keep track of when you last read a
5296group. To set the ball rolling, you should add
5297@code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}:
5298
5299@lisp
5300(add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
5301@end lisp
5302
5303After doing this, each time you enter a group, it'll be recorded.
5304
5305This information can be displayed in various ways---the easiest is to
5306use the @samp{%d} spec in the group line format:
5307
5308@lisp
5309(setq gnus-group-line-format
5310 "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n")
5311@end lisp
5312
5313This will result in lines looking like:
5314
5315@example
5316* 0: mail.ding 19961002T012943
5317 0: custom 19961002T012713
5318@end example
5319
5320As you can see, the date is displayed in compact ISO 8601 format. This
5321may be a bit too much, so to just display the date, you could say
5322something like:
5323
5324@lisp
5325(setq gnus-group-line-format
5326 "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n")
5327@end lisp
5328
5329If you would like greater control of the time format, you can use a
5330user-defined format spec. Something like the following should do the
5331trick:
5332
5333@lisp
5334(setq gnus-group-line-format
5335 "%M\%S\%p\%P\%5y: %(%-40,40g%) %ud\n")
5336(defun gnus-user-format-function-d (headers)
5337 (let ((time (gnus-group-timestamp gnus-tmp-group)))
5338 (if time
5339 (format-time-string "%b %d %H:%M" time)
5340 "")))
5341@end lisp
5342
5343
5344@node File Commands
5345@subsection File Commands
5346@cindex file commands
5347
5348@table @kbd
5349
5350@item r
5351@kindex r (Group)
5352@findex gnus-group-read-init-file
5353@vindex gnus-init-file
5354@cindex reading init file
5355Re-read the init file (@code{gnus-init-file}, which defaults to
5356@file{~/.gnus.el}) (@code{gnus-group-read-init-file}).
5357
5358@item s
5359@kindex s (Group)
5360@findex gnus-group-save-newsrc
5361@cindex saving .newsrc
5362Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted)
5363(@code{gnus-group-save-newsrc}). If given a prefix, force saving the
5364file(s) whether Gnus thinks it is necessary or not.
5365
5366@c @item Z
5367@c @kindex Z (Group)
5368@c @findex gnus-group-clear-dribble
5369@c Clear the dribble buffer (@code{gnus-group-clear-dribble}).
5370
5371@end table
5372
5373
5374@node Sieve Commands
5375@subsection Sieve Commands
5376@cindex group sieve commands
5377
5378Sieve is a server-side mail filtering language. In Gnus you can use
5379the @code{sieve} group parameter (@pxref{Group Parameters}) to specify
5380sieve rules that should apply to each group. Gnus provides two
5381commands to translate all these group parameters into a proper Sieve
5382script that can be transfered to the server somehow.
5383
5384@vindex gnus-sieve-file
5385@vindex gnus-sieve-region-start
5386@vindex gnus-sieve-region-end
5387The generated Sieve script is placed in @code{gnus-sieve-file} (by
5388default @file{~/.sieve}). The Sieve code that Gnus generate is placed
5389between two delimiters, @code{gnus-sieve-region-start} and
5390@code{gnus-sieve-region-end}, so you may write additional Sieve code
5391outside these delimiters that will not be removed the next time you
5392regenerate the Sieve script.
5393
5394@vindex gnus-sieve-crosspost
5395The variable @code{gnus-sieve-crosspost} controls how the Sieve script
5396is generated. If it is non-@code{nil} (the default) articles is
5397placed in all groups that have matching rules, otherwise the article
5398is only placed in the group with the first matching rule. For
5399example, the group parameter @samp{(sieve address "sender"
5400"owner-ding@@hpc.uh.edu")} will generate the following piece of Sieve
5401code if @code{gnus-sieve-crosspost} is @code{nil}. (When
5402@code{gnus-sieve-crosspost} is non-@code{nil}, it looks the same
5403except that the line containing the call to @code{stop} is removed.)
5404
5405@example
5406if address "sender" "owner-ding@@hpc.uh.edu" @{
5407 fileinto "INBOX.ding";
5408 stop;
5409@}
5410@end example
5411
5412@xref{Top, Emacs Sieve, Top, sieve, Emacs Sieve}.
5413
5414@table @kbd
5415
5416@item D g
5417@kindex D g (Group)
5418@findex gnus-sieve-generate
5419@vindex gnus-sieve-file
5420@cindex generating sieve script
5421Regenerate a Sieve script from the @code{sieve} group parameters and
5422put you into the @code{gnus-sieve-file} without saving it.
5423
5424@item D u
5425@kindex D u (Group)
5426@findex gnus-sieve-update
5427@vindex gnus-sieve-file
5428@cindex updating sieve script
5429Regenerates the Gnus managed part of @code{gnus-sieve-file} using the
5430@code{sieve} group parameters, save the file and upload it to the
5431server using the @code{sieveshell} program.
5432
5433@end table
5434
5435
5436@node Summary Buffer
5437@chapter Summary Buffer
5438@cindex summary buffer
5439
5440A line for each article is displayed in the summary buffer. You can
5441move around, read articles, post articles and reply to articles.
5442
5443The most common way to a summary buffer is to select a group from the
5444group buffer (@pxref{Selecting a Group}).
5445
5446You can have as many summary buffers open as you wish.
5447
5448You can customize the Summary Mode tool bar, see @kbd{M-x
5449customize-apropos RET gnus-summary-tool-bar}. This feature is only
5450available in Emacs.
5451
5452@kindex v (Summary)
5453@cindex keys, reserved for users (Summary)
5454The key @kbd{v} is reserved for users. You can bind it to some
5455command or better use it as a prefix key. For example:
5456@lisp
5457(define-key gnus-summary-mode-map (kbd "v -") "LrS") ;; lower subthread
5458@end lisp
5459
5460@menu
5461* Summary Buffer Format:: Deciding how the summary buffer is to look.
5462* Summary Maneuvering:: Moving around the summary buffer.
5463* Choosing Articles:: Reading articles.
5464* Paging the Article:: Scrolling the current article.
5465* Reply Followup and Post:: Posting articles.
5466* Delayed Articles:: Send articles at a later time.
5467* Marking Articles:: Marking articles as read, expirable, etc.
5468* Limiting:: You can limit the summary buffer.
5469* Threading:: How threads are made.
5470* Sorting the Summary Buffer:: How articles and threads are sorted.
5471* Asynchronous Fetching:: Gnus might be able to pre-fetch articles.
5472* Article Caching:: You may store articles in a cache.
5473* Persistent Articles:: Making articles expiry-resistant.
01c52d31 5474* Sticky Articles:: Article buffers that are not reused.
4009494e
GM
5475* Article Backlog:: Having already read articles hang around.
5476* Saving Articles:: Ways of customizing article saving.
5477* Decoding Articles:: Gnus can treat series of (uu)encoded articles.
5478* Article Treatment:: The article buffer can be mangled at will.
5479* MIME Commands:: Doing MIMEy things with the articles.
5480* Charsets:: Character set issues.
5481* Article Commands:: Doing various things with the article buffer.
5482* Summary Sorting:: Sorting the summary buffer in various ways.
5483* Finding the Parent:: No child support? Get the parent.
5484* Alternative Approaches:: Reading using non-default summaries.
5485* Tree Display:: A more visual display of threads.
5486* Mail Group Commands:: Some commands can only be used in mail groups.
5487* Various Summary Stuff:: What didn't fit anywhere else.
5488* Exiting the Summary Buffer:: Returning to the Group buffer,
5489 or reselecting the current group.
5490* Crosspost Handling:: How crossposted articles are dealt with.
5491* Duplicate Suppression:: An alternative when crosspost handling fails.
5492* Security:: Decrypt and Verify.
5493* Mailing List:: Mailing list minor mode.
5494@end menu
5495
5496
5497@node Summary Buffer Format
5498@section Summary Buffer Format
5499@cindex summary buffer format
5500
5501@iftex
5502@iflatex
5503\gnusfigure{The Summary Buffer}{180}{
5504\put(0,0){\epsfig{figure=ps/summary,width=7.5cm}}
5505\put(445,0){\makebox(0,0)[br]{\epsfig{figure=ps/summary-article,width=7.5cm}}}
5506}
5507@end iflatex
5508@end iftex
5509
5510@menu
5511* Summary Buffer Lines:: You can specify how summary lines should look.
5512* To From Newsgroups:: How to not display your own name.
5513* Summary Buffer Mode Line:: You can say how the mode line should look.
5514* Summary Highlighting:: Making the summary buffer all pretty and nice.
5515@end menu
5516
5517@findex mail-extract-address-components
5518@findex gnus-extract-address-components
5519@vindex gnus-extract-address-components
5520Gnus will use the value of the @code{gnus-extract-address-components}
5521variable as a function for getting the name and address parts of a
5522@code{From} header. Two pre-defined functions exist:
5523@code{gnus-extract-address-components}, which is the default, quite
5524fast, and too simplistic solution; and
5525@code{mail-extract-address-components}, which works very nicely, but is
5526slower. The default function will return the wrong answer in 5% of the
5527cases. If this is unacceptable to you, use the other function instead:
5528
5529@lisp
5530(setq gnus-extract-address-components
5531 'mail-extract-address-components)
5532@end lisp
5533
5534@vindex gnus-summary-same-subject
5535@code{gnus-summary-same-subject} is a string indicating that the current
5536article has the same subject as the previous. This string will be used
5537with those specs that require it. The default is @code{""}.
5538
5539
5540@node Summary Buffer Lines
5541@subsection Summary Buffer Lines
5542
5543@vindex gnus-summary-line-format
5544You can change the format of the lines in the summary buffer by changing
5545the @code{gnus-summary-line-format} variable. It works along the same
5546lines as a normal @code{format} string, with some extensions
5547(@pxref{Formatting Variables}).
5548
5549There should always be a colon or a point position marker on the line;
5550the cursor always moves to the point position marker or the colon after
5551performing an operation. (Of course, Gnus wouldn't be Gnus if it wasn't
5552possible to change this. Just write a new function
5553@code{gnus-goto-colon} which does whatever you like with the cursor.)
5554@xref{Positioning Point}.
5555
5556The default string is @samp{%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n}.
5557
5558The following format specification characters and extended format
5559specification(s) are understood:
5560
5561@table @samp
5562@item N
5563Article number.
5564@item S
5565Subject string. List identifiers stripped,
5566@code{gnus-list-identifiers}. @xref{Article Hiding}.
5567@item s
5568Subject if the article is the root of the thread or the previous article
5569had a different subject, @code{gnus-summary-same-subject} otherwise.
5570(@code{gnus-summary-same-subject} defaults to @code{""}.)
5571@item F
5572Full @code{From} header.
5573@item n
5574The name (from the @code{From} header).
5575@item f
5576The name, @code{To} header or the @code{Newsgroups} header (@pxref{To
5577From Newsgroups}).
5578@item a
5579The name (from the @code{From} header). This differs from the @code{n}
5580spec in that it uses the function designated by the
5581@code{gnus-extract-address-components} variable, which is slower, but
5582may be more thorough.
5583@item A
5584The address (from the @code{From} header). This works the same way as
5585the @code{a} spec.
5586@item L
5587Number of lines in the article.
5588@item c
5589Number of characters in the article. This specifier is not supported
5590in some methods (like nnfolder).
5591@item k
5592Pretty-printed version of the number of characters in the article;
5593for example, @samp{1.2k} or @samp{0.4M}.
5594@item I
5595Indentation based on thread level (@pxref{Customizing Threading}).
5596@item B
5597A complex trn-style thread tree, showing response-connecting trace
5598lines. A thread could be drawn like this:
5599
5600@example
5601>
5602+->
5603| +->
5604| | \->
5605| | \->
5606| \->
5607+->
5608\->
5609@end example
5610
5611You can customize the appearance with the following options. Note
5612that it is possible to make the thread display look really neat by
5613replacing the default @acronym{ASCII} characters with graphic
5614line-drawing glyphs.
5615@table @code
5616@item gnus-sum-thread-tree-root
5617@vindex gnus-sum-thread-tree-root
5618Used for the root of a thread. If @code{nil}, use subject
5619instead. The default is @samp{> }.
5620
5621@item gnus-sum-thread-tree-false-root
5622@vindex gnus-sum-thread-tree-false-root
5623Used for the false root of a thread (@pxref{Loose Threads}). If
5624@code{nil}, use subject instead. The default is @samp{> }.
5625
5626@item gnus-sum-thread-tree-single-indent
5627@vindex gnus-sum-thread-tree-single-indent
5628Used for a thread with just one message. If @code{nil}, use subject
5629instead. The default is @samp{}.
5630
5631@item gnus-sum-thread-tree-vertical
5632@vindex gnus-sum-thread-tree-vertical
5633Used for drawing a vertical line. The default is @samp{| }.
5634
5635@item gnus-sum-thread-tree-indent
5636@vindex gnus-sum-thread-tree-indent
5637Used for indenting. The default is @samp{ }.
5638
5639@item gnus-sum-thread-tree-leaf-with-other
5640@vindex gnus-sum-thread-tree-leaf-with-other
5641Used for a leaf with brothers. The default is @samp{+-> }.
5642
5643@item gnus-sum-thread-tree-single-leaf
5644@vindex gnus-sum-thread-tree-single-leaf
5645Used for a leaf without brothers. The default is @samp{\-> }
5646
5647@end table
5648
5649@item T
5650Nothing if the article is a root and lots of spaces if it isn't (it
5651pushes everything after it off the screen).
5652@item [
5653Opening bracket, which is normally @samp{[}, but can also be @samp{<}
5654for adopted articles (@pxref{Customizing Threading}).
5655@item ]
5656Closing bracket, which is normally @samp{]}, but can also be @samp{>}
5657for adopted articles.
5658@item >
5659One space for each thread level.
5660@item <
5661Twenty minus thread level spaces.
5662@item U
5663Unread. @xref{Read Articles}.
5664
5665@item R
5666This misleadingly named specifier is the @dfn{secondary mark}. This
5667mark will say whether the article has been replied to, has been cached,
5668or has been saved. @xref{Other Marks}.
5669
5670@item i
5671Score as a number (@pxref{Scoring}).
5672@item z
5673@vindex gnus-summary-zcore-fuzz
5674Zcore, @samp{+} if above the default level and @samp{-} if below the
5675default level. If the difference between
5676@code{gnus-summary-default-score} and the score is less than
5677@code{gnus-summary-zcore-fuzz}, this spec will not be used.
5678@item V
5679Total thread score.
5680@item x
5681@code{Xref}.
5682@item D
5683@code{Date}.
5684@item d
5685The @code{Date} in @code{DD-MMM} format.
5686@item o
5687The @code{Date} in @var{YYYYMMDD}@code{T}@var{HHMMSS} format.
5688@item M
5689@code{Message-ID}.
5690@item r
5691@code{References}.
5692@item t
5693Number of articles in the current sub-thread. Using this spec will slow
5694down summary buffer generation somewhat.
5695@item e
5696An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the
5697article has any children.
5698@item P
5699The line number.
5700@item O
5701Download mark.
5702@item *
5703Desired cursor position (instead of after first colon).
5704@item &user-date;
5705Age sensitive date format. Various date format is defined in
5706@code{gnus-user-date-format-alist}.
5707@item u
5708User defined specifier. The next character in the format string should
5709be a letter. Gnus will call the function
5710@code{gnus-user-format-function-@var{x}}, where @var{x} is the letter
5711following @samp{%u}. The function will be passed the current header as
5712argument. The function should return a string, which will be inserted
5713into the summary just like information from any other summary specifier.
5714@end table
5715
5716Text between @samp{%(} and @samp{%)} will be highlighted with
5717@code{gnus-mouse-face} when the mouse point is placed inside the area.
5718There can only be one such area.
5719
5720The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs
5721have to be handled with care. For reasons of efficiency, Gnus will
5722compute what column these characters will end up in, and ``hard-code''
5723that. This means that it is invalid to have these specs after a
5724variable-length spec. Well, you might not be arrested, but your summary
5725buffer will look strange, which is bad enough.
5726
5727The smart choice is to have these specs as far to the left as possible.
5728(Isn't that the case with everything, though? But I digress.)
5729
5730This restriction may disappear in later versions of Gnus.
5731
5732
5733@node To From Newsgroups
5734@subsection To From Newsgroups
5735@cindex To
5736@cindex Newsgroups
5737
5738In some groups (particularly in archive groups), the @code{From} header
5739isn't very interesting, since all the articles there are written by
5740you. To display the information in the @code{To} or @code{Newsgroups}
5741headers instead, you need to decide three things: What information to
5742gather; where to display it; and when to display it.
5743
5744@enumerate
5745@item
5746@vindex gnus-extra-headers
5747The reading of extra header information is controlled by the
5748@code{gnus-extra-headers}. This is a list of header symbols. For
5749instance:
5750
5751@lisp
5752(setq gnus-extra-headers
5753 '(To Newsgroups X-Newsreader))
5754@end lisp
5755
5756This will result in Gnus trying to obtain these three headers, and
5757storing it in header structures for later easy retrieval.
5758
5759@item
5760@findex gnus-extra-header
5761The value of these extra headers can be accessed via the
5762@code{gnus-extra-header} function. Here's a format line spec that will
5763access the @code{X-Newsreader} header:
5764
5765@example
5766"%~(form (gnus-extra-header 'X-Newsreader))@@"
5767@end example
5768
5769@item
5770@vindex gnus-ignored-from-addresses
5771The @code{gnus-ignored-from-addresses} variable says when the @samp{%f}
5772summary line spec returns the @code{To}, @code{Newsreader} or
5773@code{From} header. If this regexp matches the contents of the
5774@code{From} header, the value of the @code{To} or @code{Newsreader}
5775headers are used instead.
5776
01c52d31
MB
5777To distinguish regular articles from those where the @code{From} field
5778has been swapped, a string is prefixed to the @code{To} or
5779@code{Newsgroups} header in the summary line. By default the string is
5780@samp{-> } for @code{To} and @samp{=> } for @code{Newsgroups}, you can
5781customize these strings with @code{gnus-summary-to-prefix} and
5782@code{gnus-summary-newsgroup-prefix}.
5783
4009494e
GM
5784@end enumerate
5785
5786@vindex nnmail-extra-headers
5787A related variable is @code{nnmail-extra-headers}, which controls when
5788to include extra headers when generating overview (@acronym{NOV}) files.
5789If you have old overview files, you should regenerate them after
5790changing this variable, by entering the server buffer using @kbd{^},
5791and then @kbd{g} on the appropriate mail server (e.g. nnml) to cause
5792regeneration.
5793
5794@vindex gnus-summary-line-format
5795You also have to instruct Gnus to display the data by changing the
5796@code{%n} spec to the @code{%f} spec in the
5797@code{gnus-summary-line-format} variable.
5798
5799In summary, you'd typically put something like the following in
5800@file{~/.gnus.el}:
5801
5802@lisp
5803(setq gnus-extra-headers
5804 '(To Newsgroups))
5805(setq nnmail-extra-headers gnus-extra-headers)
5806(setq gnus-summary-line-format
5807 "%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n")
5808(setq gnus-ignored-from-addresses
5809 "Your Name Here")
5810@end lisp
5811
5812(The values listed above are the default values in Gnus. Alter them
5813to fit your needs.)
5814
5815A note for news server administrators, or for users who wish to try to
5816convince their news server administrator to provide some additional
5817support:
5818
5819The above is mostly useful for mail groups, where you have control over
5820the @acronym{NOV} files that are created. However, if you can persuade your
5821nntp admin to add (in the usual implementation, notably INN):
5822
5823@example
5824Newsgroups:full
5825@end example
5826
5827to the end of her @file{overview.fmt} file, then you can use that just
5828as you would the extra headers from the mail groups.
5829
5830
5831@node Summary Buffer Mode Line
5832@subsection Summary Buffer Mode Line
5833
5834@vindex gnus-summary-mode-line-format
5835You can also change the format of the summary mode bar (@pxref{Mode Line
5836Formatting}). Set @code{gnus-summary-mode-line-format} to whatever you
5837like. The default is @samp{Gnus: %%b [%A] %Z}.
5838
5839Here are the elements you can play with:
5840
5841@table @samp
5842@item G
5843Group name.
5844@item p
5845Unprefixed group name.
5846@item A
5847Current article number.
5848@item z
5849Current article score.
5850@item V
5851Gnus version.
5852@item U
5853Number of unread articles in this group.
5854@item e
5855Number of unread articles in this group that aren't displayed in the
5856summary buffer.
5857@item Z
5858A string with the number of unread and unselected articles represented
5859either as @samp{<%U(+%e) more>} if there are both unread and unselected
5860articles, and just as @samp{<%U more>} if there are just unread articles
5861and no unselected ones.
5862@item g
5863Shortish group name. For instance, @samp{rec.arts.anime} will be
5864shortened to @samp{r.a.anime}.
5865@item S
5866Subject of the current article.
5867@item u
5868User-defined spec (@pxref{User-Defined Specs}).
5869@item s
5870Name of the current score file (@pxref{Scoring}).
5871@item d
5872Number of dormant articles (@pxref{Unread Articles}).
5873@item t
5874Number of ticked articles (@pxref{Unread Articles}).
5875@item r
5876Number of articles that have been marked as read in this session.
5877@item E
5878Number of articles expunged by the score files.
5879@end table
5880
5881
5882@node Summary Highlighting
5883@subsection Summary Highlighting
5884
5885@table @code
5886
5887@item gnus-visual-mark-article-hook
5888@vindex gnus-visual-mark-article-hook
5889This hook is run after selecting an article. It is meant to be used for
5890highlighting the article in some way. It is not run if
5891@code{gnus-visual} is @code{nil}.
5892
5893@item gnus-summary-update-hook
5894@vindex gnus-summary-update-hook
5895This hook is called when a summary line is changed. It is not run if
5896@code{gnus-visual} is @code{nil}.
5897
5898@item gnus-summary-selected-face
5899@vindex gnus-summary-selected-face
5900This is the face (or @dfn{font} as some people call it) used to
5901highlight the current article in the summary buffer.
5902
5903@item gnus-summary-highlight
5904@vindex gnus-summary-highlight
5905Summary lines are highlighted according to this variable, which is a
5906list where the elements are of the format @code{(@var{form}
5907. @var{face})}. If you would, for instance, like ticked articles to be
5908italic and high-scored articles to be bold, you could set this variable
5909to something like
5910@lisp
5911(((eq mark gnus-ticked-mark) . italic)
5912 ((> score default) . bold))
5913@end lisp
5914As you may have guessed, if @var{form} returns a non-@code{nil} value,
5915@var{face} will be applied to the line.
5916@end table
5917
5918
5919@node Summary Maneuvering
5920@section Summary Maneuvering
5921@cindex summary movement
5922
5923All the straight movement commands understand the numeric prefix and
5924behave pretty much as you'd expect.
5925
5926None of these commands select articles.
5927
5928@table @kbd
5929@item G M-n
5930@itemx M-n
5931@kindex M-n (Summary)
5932@kindex G M-n (Summary)
5933@findex gnus-summary-next-unread-subject
5934Go to the next summary line of an unread article
5935(@code{gnus-summary-next-unread-subject}).
5936
5937@item G M-p
5938@itemx M-p
5939@kindex M-p (Summary)
5940@kindex G M-p (Summary)
5941@findex gnus-summary-prev-unread-subject
5942Go to the previous summary line of an unread article
5943(@code{gnus-summary-prev-unread-subject}).
5944
5945@item G g
5946@kindex G g (Summary)
5947@findex gnus-summary-goto-subject
5948Ask for an article number and then go to the summary line of that article
5949without displaying the article (@code{gnus-summary-goto-subject}).
5950@end table
5951
5952If Gnus asks you to press a key to confirm going to the next group, you
5953can use the @kbd{C-n} and @kbd{C-p} keys to move around the group
5954buffer, searching for the next group to read without actually returning
5955to the group buffer.
5956
5957Variables related to summary movement:
5958
5959@table @code
5960
5961@vindex gnus-auto-select-next
5962@item gnus-auto-select-next
5963If you issue one of the movement commands (like @kbd{n}) and there are
5964no more unread articles after the current one, Gnus will offer to go to
5965the next group. If this variable is @code{t} and the next group is
5966empty, Gnus will exit summary mode and return to the group buffer. If
5967this variable is neither @code{t} nor @code{nil}, Gnus will select the
5968next group with unread articles. As a special case, if this variable
5969is @code{quietly}, Gnus will select the next group without asking for
5970confirmation. If this variable is @code{almost-quietly}, the same
5971will happen only if you are located on the last article in the group.
5972Finally, if this variable is @code{slightly-quietly}, the @kbd{Z n}
5973command will go to the next group without confirmation. Also
5974@pxref{Group Levels}.
5975
5976@item gnus-auto-select-same
5977@vindex gnus-auto-select-same
5978If non-@code{nil}, all the movement commands will try to go to the next
5979article with the same subject as the current. (@dfn{Same} here might
5980mean @dfn{roughly equal}. See @code{gnus-summary-gather-subject-limit}
5981for details (@pxref{Customizing Threading}).) If there are no more
5982articles with the same subject, go to the first unread article.
5983
5984This variable is not particularly useful if you use a threaded display.
5985
5986@item gnus-summary-check-current
5987@vindex gnus-summary-check-current
5988If non-@code{nil}, all the ``unread'' movement commands will not proceed
5989to the next (or previous) article if the current article is unread.
5990Instead, they will choose the current article.
5991
5992@item gnus-auto-center-summary
5993@vindex gnus-auto-center-summary
5994If non-@code{nil}, Gnus will keep the point in the summary buffer
5995centered at all times. This makes things quite tidy, but if you have a
5996slow network connection, or simply do not like this un-Emacsism, you can
5997set this variable to @code{nil} to get the normal Emacs scrolling
5998action. This will also inhibit horizontal re-centering of the summary
5999buffer, which might make it more inconvenient to read extremely long
6000threads.
6001
6002This variable can also be a number. In that case, center the window at
6003the given number of lines from the top.
6004
6005@end table
6006
6007
6008@node Choosing Articles
6009@section Choosing Articles
6010@cindex selecting articles
6011
6012@menu
6013* Choosing Commands:: Commands for choosing articles.
6014* Choosing Variables:: Variables that influence these commands.
6015@end menu
6016
6017
6018@node Choosing Commands
6019@subsection Choosing Commands
6020
6021None of the following movement commands understand the numeric prefix,
6022and they all select and display an article.
6023
6024If you want to fetch new articles or redisplay the group, see
6025@ref{Exiting the Summary Buffer}.
6026
6027@table @kbd
6028@item SPACE
6029@kindex SPACE (Summary)
6030@findex gnus-summary-next-page
6031Select the current article, or, if that one's read already, the next
6032unread article (@code{gnus-summary-next-page}).
6033
6034If you have an article window open already and you press @kbd{SPACE}
6035again, the article will be scrolled. This lets you conveniently
6036@kbd{SPACE} through an entire newsgroup. @xref{Paging the Article}.
6037
6038@item G n
6039@itemx n
6040@kindex n (Summary)
6041@kindex G n (Summary)
6042@findex gnus-summary-next-unread-article
6043@c @icon{gnus-summary-next-unread}
6044Go to next unread article (@code{gnus-summary-next-unread-article}).
6045
6046@item G p
6047@itemx p
6048@kindex p (Summary)
6049@findex gnus-summary-prev-unread-article
6050@c @icon{gnus-summary-prev-unread}
6051Go to previous unread article (@code{gnus-summary-prev-unread-article}).
6052
6053@item G N
6054@itemx N
6055@kindex N (Summary)
6056@kindex G N (Summary)
6057@findex gnus-summary-next-article
6058Go to the next article (@code{gnus-summary-next-article}).
6059
6060@item G P
6061@itemx P
6062@kindex P (Summary)
6063@kindex G P (Summary)
6064@findex gnus-summary-prev-article
6065Go to the previous article (@code{gnus-summary-prev-article}).
6066
6067@item G C-n
6068@kindex G C-n (Summary)
6069@findex gnus-summary-next-same-subject
6070Go to the next article with the same subject
6071(@code{gnus-summary-next-same-subject}).
6072
6073@item G C-p
6074@kindex G C-p (Summary)
6075@findex gnus-summary-prev-same-subject
6076Go to the previous article with the same subject
6077(@code{gnus-summary-prev-same-subject}).
6078
6079@item G f
6080@itemx .
6081@kindex G f (Summary)
6082@kindex . (Summary)
6083@findex gnus-summary-first-unread-article
6084Go to the first unread article
6085(@code{gnus-summary-first-unread-article}).
6086
6087@item G b
6088@itemx ,
6089@kindex G b (Summary)
6090@kindex , (Summary)
6091@findex gnus-summary-best-unread-article
6092Go to the unread article with the highest score
6093(@code{gnus-summary-best-unread-article}). If given a prefix argument,
6094go to the first unread article that has a score over the default score.
6095
6096@item G l
6097@itemx l
6098@kindex l (Summary)
6099@kindex G l (Summary)
6100@findex gnus-summary-goto-last-article
6101Go to the previous article read (@code{gnus-summary-goto-last-article}).
6102
6103@item G o
6104@kindex G o (Summary)
6105@findex gnus-summary-pop-article
6106@cindex history
6107@cindex article history
6108Pop an article off the summary history and go to this article
6109(@code{gnus-summary-pop-article}). This command differs from the
6110command above in that you can pop as many previous articles off the
6111history as you like, while @kbd{l} toggles the two last read articles.
6112For a somewhat related issue (if you use these commands a lot),
6113@pxref{Article Backlog}.
6114
6115@item G j
6116@itemx j
6117@kindex j (Summary)
6118@kindex G j (Summary)
6119@findex gnus-summary-goto-article
6120Ask for an article number or @code{Message-ID}, and then go to that
6121article (@code{gnus-summary-goto-article}).
6122
6123@end table
6124
6125
6126@node Choosing Variables
6127@subsection Choosing Variables
6128
6129Some variables relevant for moving and selecting articles:
6130
6131@table @code
6132@item gnus-auto-extend-newsgroup
6133@vindex gnus-auto-extend-newsgroup
6134All the movement commands will try to go to the previous (or next)
6135article, even if that article isn't displayed in the Summary buffer if
6136this variable is non-@code{nil}. Gnus will then fetch the article from
6137the server and display it in the article buffer.
6138
6139@item gnus-select-article-hook
6140@vindex gnus-select-article-hook
6141This hook is called whenever an article is selected. The default is
6142@code{nil}. If you would like each article to be saved in the Agent as
6143you read it, putting @code{gnus-agent-fetch-selected-article} on this
6144hook will do so.
6145
6146@item gnus-mark-article-hook
6147@vindex gnus-mark-article-hook
6148@findex gnus-summary-mark-unread-as-read
6149@findex gnus-summary-mark-read-and-unread-as-read
6150@findex gnus-unread-mark
6151This hook is called whenever an article is selected. It is intended to
6152be used for marking articles as read. The default value is
6153@code{gnus-summary-mark-read-and-unread-as-read}, and will change the
6154mark of almost any article you read to @code{gnus-read-mark}. The only
6155articles not affected by this function are ticked, dormant, and
6156expirable articles. If you'd instead like to just have unread articles
6157marked as read, you can use @code{gnus-summary-mark-unread-as-read}
6158instead. It will leave marks like @code{gnus-low-score-mark},
6159@code{gnus-del-mark} (and so on) alone.
6160
6161@end table
6162
6163
6164@node Paging the Article
6165@section Scrolling the Article
6166@cindex article scrolling
6167
6168@table @kbd
6169
6170@item SPACE
6171@kindex SPACE (Summary)
6172@findex gnus-summary-next-page
6173Pressing @kbd{SPACE} will scroll the current article forward one page,
6174or, if you have come to the end of the current article, will choose the
6175next article (@code{gnus-summary-next-page}).
6176
6177@vindex gnus-article-boring-faces
6178@vindex gnus-article-skip-boring
6179If @code{gnus-article-skip-boring} is non-@code{nil} and the rest of
6180the article consists only of citations and signature, then it will be
6181skipped; the next article will be shown instead. You can customize
6182what is considered uninteresting with
6183@code{gnus-article-boring-faces}. You can manually view the article's
6184pages, no matter how boring, using @kbd{C-M-v}.
6185
6186@item DEL
6187@kindex DEL (Summary)
6188@findex gnus-summary-prev-page
6189Scroll the current article back one page (@code{gnus-summary-prev-page}).
6190
6191@item RET
6192@kindex RET (Summary)
6193@findex gnus-summary-scroll-up
6194Scroll the current article one line forward
6195(@code{gnus-summary-scroll-up}).
6196
6197@item M-RET
6198@kindex M-RET (Summary)
6199@findex gnus-summary-scroll-down
6200Scroll the current article one line backward
6201(@code{gnus-summary-scroll-down}).
6202
6203@item A g
6204@itemx g
6205@kindex A g (Summary)
6206@kindex g (Summary)
6207@findex gnus-summary-show-article
6208@vindex gnus-summary-show-article-charset-alist
6209(Re)fetch the current article (@code{gnus-summary-show-article}). If
6210given a prefix, fetch the current article, but don't run any of the
6211article treatment functions. This will give you a ``raw'' article, just
6212the way it came from the server.
6213
6214If given a numerical prefix, you can do semi-manual charset stuff.
6215@kbd{C-u 0 g cn-gb-2312 RET} will decode the message as if it were
6216encoded in the @code{cn-gb-2312} charset. If you have
6217
6218@lisp
6219(setq gnus-summary-show-article-charset-alist
6220 '((1 . cn-gb-2312)
6221 (2 . big5)))
6222@end lisp
6223
6224then you can say @kbd{C-u 1 g} to get the same effect.
6225
6226@item A <
6227@itemx <
6228@kindex < (Summary)
6229@kindex A < (Summary)
6230@findex gnus-summary-beginning-of-article
6231Scroll to the beginning of the article
6232(@code{gnus-summary-beginning-of-article}).
6233
6234@item A >
6235@itemx >
6236@kindex > (Summary)
6237@kindex A > (Summary)
6238@findex gnus-summary-end-of-article
6239Scroll to the end of the article (@code{gnus-summary-end-of-article}).
6240
6241@item A s
6242@itemx s
6243@kindex A s (Summary)
6244@kindex s (Summary)
6245@findex gnus-summary-isearch-article
6246Perform an isearch in the article buffer
6247(@code{gnus-summary-isearch-article}).
6248
6249@item h
6250@kindex h (Summary)
6251@findex gnus-summary-select-article-buffer
6252Select the article buffer (@code{gnus-summary-select-article-buffer}).
6253
6254@end table
6255
6256
6257@node Reply Followup and Post
6258@section Reply, Followup and Post
6259
6260@menu
6261* Summary Mail Commands:: Sending mail.
6262* Summary Post Commands:: Sending news.
6263* Summary Message Commands:: Other Message-related commands.
6264* Canceling and Superseding::
6265@end menu
6266
6267
6268@node Summary Mail Commands
6269@subsection Summary Mail Commands
6270@cindex mail
6271@cindex composing mail
6272
6273Commands for composing a mail message:
6274
6275@table @kbd
6276
6277@item S r
6278@itemx r
6279@kindex S r (Summary)
6280@kindex r (Summary)
6281@findex gnus-summary-reply
6282@c @icon{gnus-summary-mail-reply}
6283@c @icon{gnus-summary-reply}
6284Mail a reply to the author of the current article
6285(@code{gnus-summary-reply}).
6286
6287@item S R
6288@itemx R
6289@kindex R (Summary)
6290@kindex S R (Summary)
6291@findex gnus-summary-reply-with-original
6292@c @icon{gnus-summary-reply-with-original}
6293Mail a reply to the author of the current article and include the
6294original message (@code{gnus-summary-reply-with-original}). This
6295command uses the process/prefix convention.
6296
6297@item S w
6298@kindex S w (Summary)
6299@findex gnus-summary-wide-reply
6300Mail a wide reply to the author of the current article
6301(@code{gnus-summary-wide-reply}). A @dfn{wide reply} is a reply that
6302goes out to all people listed in the @code{To}, @code{From} (or
6303@code{Reply-to}) and @code{Cc} headers. If @code{Mail-Followup-To} is
6304present, that's used instead.
6305
6306@item S W
6307@kindex S W (Summary)
6308@findex gnus-summary-wide-reply-with-original
6309Mail a wide reply to the current article and include the original
6310message (@code{gnus-summary-wide-reply-with-original}). This command uses
6311the process/prefix convention.
6312
6313@item S v
6314@kindex S v (Summary)
6315@findex gnus-summary-very-wide-reply
6316Mail a very wide reply to the author of the current article
6317(@code{gnus-summary-wide-reply}). A @dfn{very wide reply} is a reply
6318that goes out to all people listed in the @code{To}, @code{From} (or
6319@code{Reply-to}) and @code{Cc} headers in all the process/prefixed
6320articles. This command uses the process/prefix convention.
6321
6322@item S V
6323@kindex S V (Summary)
6324@findex gnus-summary-very-wide-reply-with-original
6325Mail a very wide reply to the author of the current article and include the
6326original message (@code{gnus-summary-very-wide-reply-with-original}). This
6327command uses the process/prefix convention.
6328
6329@item S B r
6330@kindex S B r (Summary)
6331@findex gnus-summary-reply-broken-reply-to
6332Mail a reply to the author of the current article but ignore the
6333@code{Reply-To} field (@code{gnus-summary-reply-broken-reply-to}).
6334If you need this because a mailing list incorrectly sets a
6335@code{Reply-To} header pointing to the list, you probably want to set
6336the @code{broken-reply-to} group parameter instead, so things will work
6337correctly. @xref{Group Parameters}.
6338
6339@item S B R
6340@kindex S B R (Summary)
6341@findex gnus-summary-reply-broken-reply-to-with-original
6342Mail a reply to the author of the current article and include the
6343original message but ignore the @code{Reply-To} field
6344(@code{gnus-summary-reply-broken-reply-to-with-original}).
6345
6346@item S o m
6347@itemx C-c C-f
6348@kindex S o m (Summary)
6349@kindex C-c C-f (Summary)
6350@findex gnus-summary-mail-forward
6351@c @icon{gnus-summary-mail-forward}
6352Forward the current article to some other person
6353(@code{gnus-summary-mail-forward}). If no prefix is given, the message
6354is forwarded according to the value of (@code{message-forward-as-mime})
6355and (@code{message-forward-show-mml}); if the prefix is 1, decode the
6356message and forward directly inline; if the prefix is 2, forward message
6357as an rfc822 @acronym{MIME} section; if the prefix is 3, decode message and
6358forward as an rfc822 @acronym{MIME} section; if the prefix is 4, forward message
6359directly inline; otherwise, the message is forwarded as no prefix given
6360but use the flipped value of (@code{message-forward-as-mime}). By
6361default, the message is decoded and forwarded as an rfc822 @acronym{MIME}
6362section.
6363
6364@item S m
6365@itemx m
6366@kindex m (Summary)
6367@kindex S m (Summary)
6368@findex gnus-summary-mail-other-window
6369@c @icon{gnus-summary-mail-originate}
6370Prepare a mail (@code{gnus-summary-mail-other-window}). By default, use
6371the posting style of the current group. If given a prefix, disable that.
6372If the prefix is 1, prompt for a group name to find the posting style.
6373
6374@item S i
6375@itemx i
6376@kindex i (Summary)
6377@kindex S i (Summary)
6378@findex gnus-summary-news-other-window
6379Prepare a news (@code{gnus-summary-news-other-window}). By default,
6380post to the current group. If given a prefix, disable that. If the
6381prefix is 1, prompt for a group to post to.
6382
6383This function actually prepares a news even when using mail groups.
6384This is useful for ``posting'' messages to mail groups without actually
6385sending them over the network: they're just saved directly to the group
6386in question. The corresponding back end must have a request-post method
6387for this to work though.
6388
6389@item S D b
6390@kindex S D b (Summary)
6391@findex gnus-summary-resend-bounced-mail
6392@cindex bouncing mail
6393If you have sent a mail, but the mail was bounced back to you for some
6394reason (wrong address, transient failure), you can use this command to
6395resend that bounced mail (@code{gnus-summary-resend-bounced-mail}). You
6396will be popped into a mail buffer where you can edit the headers before
6397sending the mail off again. If you give a prefix to this command, and
6398the bounced mail is a reply to some other mail, Gnus will try to fetch
6399that mail and display it for easy perusal of its headers. This might
6400very well fail, though.
6401
6402@item S D r
6403@kindex S D r (Summary)
6404@findex gnus-summary-resend-message
6405Not to be confused with the previous command,
6406@code{gnus-summary-resend-message} will prompt you for an address to
6407send the current message off to, and then send it to that place. The
6408headers of the message won't be altered---but lots of headers that say
6409@code{Resent-To}, @code{Resent-From} and so on will be added. This
6410means that you actually send a mail to someone that has a @code{To}
6411header that (probably) points to yourself. This will confuse people.
6412So, natcherly you'll only do that if you're really eVIl.
6413
6414This command is mainly used if you have several accounts and want to
6415ship a mail to a different account of yours. (If you're both
6416@code{root} and @code{postmaster} and get a mail for @code{postmaster}
6417to the @code{root} account, you may want to resend it to
6418@code{postmaster}. Ordnung muss sein!
6419
6420This command understands the process/prefix convention
6421(@pxref{Process/Prefix}).
6422
6423@item S D e
6424@kindex S D e (Summary)
6425@findex gnus-summary-resend-message-edit
6426
6427Like the previous command, but will allow you to edit the message as
6428if it were a new message before resending.
6429
6430@item S O m
6431@kindex S O m (Summary)
6432@findex gnus-uu-digest-mail-forward
6433Digest the current series (@pxref{Decoding Articles}) and forward the
6434result using mail (@code{gnus-uu-digest-mail-forward}). This command
6435uses the process/prefix convention (@pxref{Process/Prefix}).
6436
6437@item S M-c
6438@kindex S M-c (Summary)
6439@findex gnus-summary-mail-crosspost-complaint
6440@cindex crossposting
6441@cindex excessive crossposting
6442Send a complaint about excessive crossposting to the author of the
6443current article (@code{gnus-summary-mail-crosspost-complaint}).
6444
6445@findex gnus-crosspost-complaint
6446This command is provided as a way to fight back against the current
6447crossposting pandemic that's sweeping Usenet. It will compose a reply
6448using the @code{gnus-crosspost-complaint} variable as a preamble. This
6449command understands the process/prefix convention
6450(@pxref{Process/Prefix}) and will prompt you before sending each mail.
6451
6452@end table
6453
6454Also @xref{Header Commands, ,Header Commands, message, The Message
6455Manual}, for more information.
6456
6457
6458@node Summary Post Commands
6459@subsection Summary Post Commands
6460@cindex post
6461@cindex composing news
6462
6463Commands for posting a news article:
6464
6465@table @kbd
6466@item S p
6467@itemx a
6468@kindex a (Summary)
6469@kindex S p (Summary)
6470@findex gnus-summary-post-news
6471@c @icon{gnus-summary-post-news}
6472Prepare for posting an article (@code{gnus-summary-post-news}). By
6473default, post to the current group. If given a prefix, disable that.
6474If the prefix is 1, prompt for another group instead.
6475
6476@item S f
6477@itemx f
6478@kindex f (Summary)
6479@kindex S f (Summary)
6480@findex gnus-summary-followup
6481@c @icon{gnus-summary-followup}
6482Post a followup to the current article (@code{gnus-summary-followup}).
6483
6484@item S F
6485@itemx F
6486@kindex S F (Summary)
6487@kindex F (Summary)
6488@c @icon{gnus-summary-followup-with-original}
6489@findex gnus-summary-followup-with-original
6490Post a followup to the current article and include the original message
6491(@code{gnus-summary-followup-with-original}). This command uses the
6492process/prefix convention.
6493
6494@item S n
6495@kindex S n (Summary)
6496@findex gnus-summary-followup-to-mail
6497Post a followup to the current article via news, even if you got the
6498message through mail (@code{gnus-summary-followup-to-mail}).
6499
6500@item S N
6501@kindex S N (Summary)
6502@findex gnus-summary-followup-to-mail-with-original
6503Post a followup to the current article via news, even if you got the
6504message through mail and include the original message
6505(@code{gnus-summary-followup-to-mail-with-original}). This command uses
6506the process/prefix convention.
6507
6508@item S o p
6509@kindex S o p (Summary)
6510@findex gnus-summary-post-forward
6511Forward the current article to a newsgroup
6512(@code{gnus-summary-post-forward}).
6513 If no prefix is given, the message is forwarded according to the value
6514of (@code{message-forward-as-mime}) and
6515(@code{message-forward-show-mml}); if the prefix is 1, decode the
6516message and forward directly inline; if the prefix is 2, forward message
6517as an rfc822 @acronym{MIME} section; if the prefix is 3, decode message and
6518forward as an rfc822 @acronym{MIME} section; if the prefix is 4, forward message
6519directly inline; otherwise, the message is forwarded as no prefix given
6520but use the flipped value of (@code{message-forward-as-mime}). By
6521default, the message is decoded and forwarded as an rfc822 @acronym{MIME} section.
6522
6523@item S O p
6524@kindex S O p (Summary)
6525@findex gnus-uu-digest-post-forward
6526@cindex digests
6527@cindex making digests
6528Digest the current series and forward the result to a newsgroup
6529(@code{gnus-uu-digest-post-forward}). This command uses the
6530process/prefix convention.
6531
6532@item S u
6533@kindex S u (Summary)
6534@findex gnus-uu-post-news
6535@c @icon{gnus-uu-post-news}
6536Uuencode a file, split it into parts, and post it as a series
6537(@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}).
6538@end table
6539
6540Also @xref{Header Commands, ,Header Commands, message, The Message
6541Manual}, for more information.
6542
6543
6544@node Summary Message Commands
6545@subsection Summary Message Commands
6546
6547@table @kbd
6548@item S y
6549@kindex S y (Summary)
6550@findex gnus-summary-yank-message
6551Yank the current article into an already existing Message composition
6552buffer (@code{gnus-summary-yank-message}). This command prompts for
6553what message buffer you want to yank into, and understands the
6554process/prefix convention (@pxref{Process/Prefix}).
6555
6556@end table
6557
6558
6559@node Canceling and Superseding
6560@subsection Canceling Articles
6561@cindex canceling articles
6562@cindex superseding articles
6563
6564Have you ever written something, and then decided that you really,
6565really, really wish you hadn't posted that?
6566
6567Well, you can't cancel mail, but you can cancel posts.
6568
6569@findex gnus-summary-cancel-article
6570@kindex C (Summary)
6571@c @icon{gnus-summary-cancel-article}
6572Find the article you wish to cancel (you can only cancel your own
6573articles, so don't try any funny stuff). Then press @kbd{C} or @kbd{S
6574c} (@code{gnus-summary-cancel-article}). Your article will be
6575canceled---machines all over the world will be deleting your article.
6576This command uses the process/prefix convention (@pxref{Process/Prefix}).
6577
6578Be aware, however, that not all sites honor cancels, so your article may
6579live on here and there, while most sites will delete the article in
6580question.
6581
6582Gnus will use the ``current'' select method when canceling. If you
6583want to use the standard posting method, use the @samp{a} symbolic
6584prefix (@pxref{Symbolic Prefixes}).
6585
6586Gnus ensures that only you can cancel your own messages using a
6587@code{Cancel-Lock} header (@pxref{Canceling News, Canceling News, ,
6588message, Message Manual}).
6589
6590If you discover that you have made some mistakes and want to do some
6591corrections, you can post a @dfn{superseding} article that will replace
6592your original article.
6593
6594@findex gnus-summary-supersede-article
6595@kindex S (Summary)
6596Go to the original article and press @kbd{S s}
6597(@code{gnus-summary-supersede-article}). You will be put in a buffer
6598where you can edit the article all you want before sending it off the
6599usual way.
6600
6601The same goes for superseding as for canceling, only more so: Some
6602sites do not honor superseding. On those sites, it will appear that you
6603have posted almost the same article twice.
6604
6605If you have just posted the article, and change your mind right away,
6606there is a trick you can use to cancel/supersede the article without
6607waiting for the article to appear on your site first. You simply return
6608to the post buffer (which is called @code{*sent ...*}). There you will
6609find the article you just posted, with all the headers intact. Change
6610the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes}
6611header by substituting one of those words for the word
6612@code{Message-ID}. Then just press @kbd{C-c C-c} to send the article as
6613you would do normally. The previous article will be
6614canceled/superseded.
6615
6616Just remember, kids: There is no 'c' in 'supersede'.
6617
6618@node Delayed Articles
6619@section Delayed Articles
6620@cindex delayed sending
6621@cindex send delayed
6622
6623Sometimes, you might wish to delay the sending of a message. For
6624example, you might wish to arrange for a message to turn up just in time
6625to remind your about the birthday of your Significant Other. For this,
6626there is the @code{gnus-delay} package. Setup is simple:
6627
6628@lisp
6629(gnus-delay-initialize)
6630@end lisp
6631
6632@findex gnus-delay-article
6633Normally, to send a message you use the @kbd{C-c C-c} command from
6634Message mode. To delay a message, use @kbd{C-c C-j}
6635(@code{gnus-delay-article}) instead. This will ask you for how long the
6636message should be delayed. Possible answers are:
6637
6638@itemize @bullet
6639@item
6640A time span. Consists of an integer and a letter. For example,
6641@code{42d} means to delay for 42 days. Available letters are @code{m}
6642(minutes), @code{h} (hours), @code{d} (days), @code{w} (weeks), @code{M}
6643(months) and @code{Y} (years).
6644
6645@item
6646A specific date. Looks like @code{YYYY-MM-DD}. The message will be
6647delayed until that day, at a specific time (eight o'clock by default).
6648See also @code{gnus-delay-default-hour}.
6649
6650@item
6651A specific time of day. Given in @code{hh:mm} format, 24h, no am/pm
6652stuff. The deadline will be at that time today, except if that time has
6653already passed, then it's at the given time tomorrow. So if it's ten
6654o'clock in the morning and you specify @code{11:15}, then the deadline
6655is one hour and fifteen minutes hence. But if you specify @code{9:20},
6656that means a time tomorrow.
6657@end itemize
6658
6659The action of the @code{gnus-delay-article} command is influenced by a
6660couple of variables:
6661
6662@table @code
6663@item gnus-delay-default-hour
6664@vindex gnus-delay-default-hour
6665When you specify a specific date, the message will be due on that hour
6666on the given date. Possible values are integers 0 through 23.
6667
6668@item gnus-delay-default-delay
6669@vindex gnus-delay-default-delay
6670This is a string and gives the default delay. It can be of any of the
6671formats described above.
6672
6673@item gnus-delay-group
6674@vindex gnus-delay-group
6675Delayed articles will be kept in this group on the drafts server until
6676they are due. You probably don't need to change this. The default
6677value is @code{"delayed"}.
6678
6679@item gnus-delay-header
6680@vindex gnus-delay-header
6681The deadline for each article will be stored in a header. This variable
6682is a string and gives the header name. You probably don't need to
6683change this. The default value is @code{"X-Gnus-Delayed"}.
6684@end table
6685
6686The way delaying works is like this: when you use the
6687@code{gnus-delay-article} command, you give a certain delay. Gnus
6688calculates the deadline of the message and stores it in the
6689@code{X-Gnus-Delayed} header and puts the message in the
6690@code{nndraft:delayed} group.
6691
6692@findex gnus-delay-send-queue
6693And whenever you get new news, Gnus looks through the group for articles
6694which are due and sends them. It uses the @code{gnus-delay-send-queue}
6695function for this. By default, this function is added to the hook
6696@code{gnus-get-new-news-hook}. But of course, you can change this.
6697Maybe you want to use the demon to send drafts? Just tell the demon to
6698execute the @code{gnus-delay-send-queue} function.
6699
6700@table @code
6701@item gnus-delay-initialize
6702@findex gnus-delay-initialize
6703By default, this function installs @code{gnus-delay-send-queue} in
6704@code{gnus-get-new-news-hook}. But it accepts the optional second
6705argument @code{no-check}. If it is non-@code{nil},
6706@code{gnus-get-new-news-hook} is not changed. The optional first
6707argument is ignored.
6708
6709For example, @code{(gnus-delay-initialize nil t)} means to do nothing.
6710Presumably, you want to use the demon for sending due delayed articles.
6711Just don't forget to set that up :-)
6712@end table
6713
6714
6715@node Marking Articles
6716@section Marking Articles
6717@cindex article marking
6718@cindex article ticking
6719@cindex marks
6720
6721There are several marks you can set on an article.
6722
6723You have marks that decide the @dfn{readedness} (whoo, neato-keano
6724neologism ohoy!) of the article. Alphabetic marks generally mean
6725@dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.
6726
6727In addition, you also have marks that do not affect readedness.
6728
6729@ifinfo
6730There's a plethora of commands for manipulating these marks.
6731@end ifinfo
6732
6733@menu
6734* Unread Articles:: Marks for unread articles.
6735* Read Articles:: Marks for read articles.
6736* Other Marks:: Marks that do not affect readedness.
6737* Setting Marks:: How to set and remove marks.
6738* Generic Marking Commands:: How to customize the marking.
6739* Setting Process Marks:: How to mark articles for later processing.
6740@end menu
6741
6742
6743@node Unread Articles
6744@subsection Unread Articles
6745
6746The following marks mark articles as (kinda) unread, in one form or
6747other.
6748
6749@table @samp
6750@item !
6751@vindex gnus-ticked-mark
6752Marked as ticked (@code{gnus-ticked-mark}).
6753
6754@dfn{Ticked articles} are articles that will remain visible always. If
6755you see an article that you find interesting, or you want to put off
6756reading it, or replying to it, until sometime later, you'd typically
6757tick it. However, articles can be expired (from news servers by the
6758news server software, Gnus itself never expires ticked messages), so if
6759you want to keep an article forever, you'll have to make it persistent
6760(@pxref{Persistent Articles}).
6761
6762@item ?
6763@vindex gnus-dormant-mark
6764Marked as dormant (@code{gnus-dormant-mark}).
6765
6766@dfn{Dormant articles} will only appear in the summary buffer if there
6767are followups to it. If you want to see them even if they don't have
6768followups, you can use the @kbd{/ D} command (@pxref{Limiting}).
6769Otherwise (except for the visibility issue), they are just like ticked
6770messages.
6771
6772@item SPACE
6773@vindex gnus-unread-mark
6774Marked as unread (@code{gnus-unread-mark}).
6775
6776@dfn{Unread articles} are articles that haven't been read at all yet.
6777@end table
6778
6779
6780@node Read Articles
6781@subsection Read Articles
6782@cindex expirable mark
6783
6784All the following marks mark articles as read.
6785
6786@table @samp
6787
6788@item r
6789@vindex gnus-del-mark
6790These are articles that the user has marked as read with the @kbd{d}
6791command manually, more or less (@code{gnus-del-mark}).
6792
6793@item R
6794@vindex gnus-read-mark
6795Articles that have actually been read (@code{gnus-read-mark}).
6796
6797@item O
6798@vindex gnus-ancient-mark
6799Articles that were marked as read in previous sessions and are now
6800@dfn{old} (@code{gnus-ancient-mark}).
6801
6802@item K
6803@vindex gnus-killed-mark
6804Marked as killed (@code{gnus-killed-mark}).
6805
6806@item X
6807@vindex gnus-kill-file-mark
6808Marked as killed by kill files (@code{gnus-kill-file-mark}).
6809
6810@item Y
6811@vindex gnus-low-score-mark
6812Marked as read by having too low a score (@code{gnus-low-score-mark}).
6813
6814@item C
6815@vindex gnus-catchup-mark
6816Marked as read by a catchup (@code{gnus-catchup-mark}).
6817
6818@item G
6819@vindex gnus-canceled-mark
6820Canceled article (@code{gnus-canceled-mark})
6821
6822@item F
6823@vindex gnus-souped-mark
6824@sc{soup}ed article (@code{gnus-souped-mark}). @xref{SOUP}.
6825
6826@item Q
6827@vindex gnus-sparse-mark
6828Sparsely reffed article (@code{gnus-sparse-mark}). @xref{Customizing
6829Threading}.
6830
6831@item M
6832@vindex gnus-duplicate-mark
6833Article marked as read by duplicate suppression
6834(@code{gnus-duplicate-mark}). @xref{Duplicate Suppression}.
6835
6836@end table
6837
6838All these marks just mean that the article is marked as read, really.
6839They are interpreted differently when doing adaptive scoring, though.
6840
6841One more special mark, though:
6842
6843@table @samp
6844@item E
6845@vindex gnus-expirable-mark
6846Marked as expirable (@code{gnus-expirable-mark}).
6847
6848Marking articles as @dfn{expirable} (or have them marked as such
6849automatically) doesn't make much sense in normal groups---a user doesn't
6850control expiring of news articles, but in mail groups, for instance,
6851articles marked as @dfn{expirable} can be deleted by Gnus at
6852any time.
6853@end table
6854
6855
6856@node Other Marks
6857@subsection Other Marks
6858@cindex process mark
6859@cindex bookmarks
6860
6861There are some marks that have nothing to do with whether the article is
6862read or not.
6863
6864@itemize @bullet
6865
6866@item
6867You can set a bookmark in the current article. Say you are reading a
6868long thesis on cats' urinary tracts, and have to go home for dinner
6869before you've finished reading the thesis. You can then set a bookmark
6870in the article, and Gnus will jump to this bookmark the next time it
6871encounters the article. @xref{Setting Marks}.
6872
6873@item
6874@vindex gnus-replied-mark
6875All articles that you have replied to or made a followup to (i.e., have
6876answered) will be marked with an @samp{A} in the second column
6877(@code{gnus-replied-mark}).
6878
6879@item
6880@vindex gnus-forwarded-mark
6881All articles that you have forwarded will be marked with an @samp{F} in
6882the second column (@code{gnus-forwarded-mark}).
6883
6884@item
6885@vindex gnus-cached-mark
6886Articles stored in the article cache will be marked with an @samp{*} in
6887the second column (@code{gnus-cached-mark}). @xref{Article Caching}.
6888
6889@item
6890@vindex gnus-saved-mark
6891Articles ``saved'' (in some manner or other; not necessarily
6892religiously) are marked with an @samp{S} in the second column
6893(@code{gnus-saved-mark}).
6894
6895@item
6896@vindex gnus-recent-mark
6897Articles that according to the server haven't been shown to the user
6898before are marked with a @samp{N} in the second column
6899(@code{gnus-recent-mark}). Note that not all servers support this
6900mark, in which case it simply never appears. Compare with
6901@code{gnus-unseen-mark}.
6902
6903@item
6904@vindex gnus-unseen-mark
6905Articles that haven't been seen before in Gnus by the user are marked
6906with a @samp{.} in the second column (@code{gnus-unseen-mark}).
6907Compare with @code{gnus-recent-mark}.
6908
6909@item
6910@vindex gnus-downloaded-mark
6911When using the Gnus agent (@pxref{Agent Basics}), articles may be
6912downloaded for unplugged (offline) viewing. If you are using the
6913@samp{%O} spec, these articles get the @samp{+} mark in that spec.
6914(The variable @code{gnus-downloaded-mark} controls which character to
6915use.)
6916
6917@item
6918@vindex gnus-undownloaded-mark
6919When using the Gnus agent (@pxref{Agent Basics}), some articles might
6920not have been downloaded. Such articles cannot be viewed while you
6921are unplugged (offline). If you are using the @samp{%O} spec, these
6922articles get the @samp{-} mark in that spec. (The variable
6923@code{gnus-undownloaded-mark} controls which character to use.)
6924
6925@item
6926@vindex gnus-downloadable-mark
6927The Gnus agent (@pxref{Agent Basics}) downloads some articles
6928automatically, but it is also possible to explicitly mark articles for
6929download, even if they would not be downloaded automatically. Such
6930explicitly-marked articles get the @samp{%} mark in the first column.
6931(The variable @code{gnus-downloadable-mark} controls which character to
6932use.)
6933
6934@item
6935@vindex gnus-not-empty-thread-mark
6936@vindex gnus-empty-thread-mark
6937If the @samp{%e} spec is used, the presence of threads or not will be
6938marked with @code{gnus-not-empty-thread-mark} and
6939@code{gnus-empty-thread-mark} in the third column, respectively.
6940
6941@item
6942@vindex gnus-process-mark
6943Finally we have the @dfn{process mark} (@code{gnus-process-mark}). A
6944variety of commands react to the presence of the process mark. For
6945instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view
6946all articles that have been marked with the process mark. Articles
6947marked with the process mark have a @samp{#} in the second column.
6948
6949@end itemize
6950
6951You might have noticed that most of these ``non-readedness'' marks
6952appear in the second column by default. So if you have a cached, saved,
6953replied article that you have process-marked, what will that look like?
6954
6955Nothing much. The precedence rules go as follows: process -> cache ->
6956replied -> saved. So if the article is in the cache and is replied,
6957you'll only see the cache mark and not the replied mark.
6958
6959
6960@node Setting Marks
6961@subsection Setting Marks
6962@cindex setting marks
6963
6964All the marking commands understand the numeric prefix.
6965
6966@table @kbd
6967@item M c
6968@itemx M-u
6969@kindex M c (Summary)
6970@kindex M-u (Summary)
6971@findex gnus-summary-clear-mark-forward
6972@cindex mark as unread
6973Clear all readedness-marks from the current article
6974(@code{gnus-summary-clear-mark-forward}). In other words, mark the
6975article as unread.
6976
6977@item M t
6978@itemx !
6979@kindex ! (Summary)
6980@kindex M t (Summary)
6981@findex gnus-summary-tick-article-forward
6982Tick the current article (@code{gnus-summary-tick-article-forward}).
6983@xref{Article Caching}.
6984
6985@item M ?
6986@itemx ?
6987@kindex ? (Summary)
6988@kindex M ? (Summary)
6989@findex gnus-summary-mark-as-dormant
6990Mark the current article as dormant
6991(@code{gnus-summary-mark-as-dormant}). @xref{Article Caching}.
6992
6993@item M d
6994@itemx d
6995@kindex M d (Summary)
6996@kindex d (Summary)
6997@findex gnus-summary-mark-as-read-forward
6998Mark the current article as read
6999(@code{gnus-summary-mark-as-read-forward}).
7000
7001@item D
7002@kindex D (Summary)
7003@findex gnus-summary-mark-as-read-backward
7004Mark the current article as read and move point to the previous line
7005(@code{gnus-summary-mark-as-read-backward}).
7006
7007@item M k
7008@itemx k
7009@kindex k (Summary)
7010@kindex M k (Summary)
7011@findex gnus-summary-kill-same-subject-and-select
7012Mark all articles that have the same subject as the current one as read,
7013and then select the next unread article
7014(@code{gnus-summary-kill-same-subject-and-select}).
7015
7016@item M K
7017@itemx C-k
7018@kindex M K (Summary)
7019@kindex C-k (Summary)
7020@findex gnus-summary-kill-same-subject
7021Mark all articles that have the same subject as the current one as read
7022(@code{gnus-summary-kill-same-subject}).
7023
7024@item M C
7025@kindex M C (Summary)
7026@findex gnus-summary-catchup
7027@c @icon{gnus-summary-catchup}
7028Mark all unread articles as read (@code{gnus-summary-catchup}).
7029
7030@item M C-c
7031@kindex M C-c (Summary)
7032@findex gnus-summary-catchup-all
7033Mark all articles in the group as read---even the ticked and dormant
7034articles (@code{gnus-summary-catchup-all}).
7035
7036@item M H
7037@kindex M H (Summary)
7038@findex gnus-summary-catchup-to-here
7039Catchup the current group to point (before the point)
7040(@code{gnus-summary-catchup-to-here}).
7041
7042@item M h
7043@kindex M h (Summary)
7044@findex gnus-summary-catchup-from-here
7045Catchup the current group from point (after the point)
7046(@code{gnus-summary-catchup-from-here}).
7047
7048@item C-w
7049@kindex C-w (Summary)
7050@findex gnus-summary-mark-region-as-read
7051Mark all articles between point and mark as read
7052(@code{gnus-summary-mark-region-as-read}).
7053
7054@item M V k
7055@kindex M V k (Summary)
7056@findex gnus-summary-kill-below
7057Kill all articles with scores below the default score (or below the
7058numeric prefix) (@code{gnus-summary-kill-below}).
7059
7060@item M e
7061@itemx E
7062@kindex M e (Summary)
7063@kindex E (Summary)
7064@findex gnus-summary-mark-as-expirable
7065Mark the current article as expirable
7066(@code{gnus-summary-mark-as-expirable}).
7067
7068@item M b
7069@kindex M b (Summary)
7070@findex gnus-summary-set-bookmark
7071Set a bookmark in the current article
7072(@code{gnus-summary-set-bookmark}).
7073
7074@item M B
7075@kindex M B (Summary)
7076@findex gnus-summary-remove-bookmark
7077Remove the bookmark from the current article
7078(@code{gnus-summary-remove-bookmark}).
7079
7080@item M V c
7081@kindex M V c (Summary)
7082@findex gnus-summary-clear-above
7083Clear all marks from articles with scores over the default score (or
7084over the numeric prefix) (@code{gnus-summary-clear-above}).
7085
7086@item M V u
7087@kindex M V u (Summary)
7088@findex gnus-summary-tick-above
7089Tick all articles with scores over the default score (or over the
7090numeric prefix) (@code{gnus-summary-tick-above}).
7091
7092@item M V m
7093@kindex M V m (Summary)
7094@findex gnus-summary-mark-above
7095Prompt for a mark, and mark all articles with scores over the default
7096score (or over the numeric prefix) with this mark
7097(@code{gnus-summary-clear-above}).
7098@end table
7099
7100@vindex gnus-summary-goto-unread
7101The @code{gnus-summary-goto-unread} variable controls what action should
7102be taken after setting a mark. If non-@code{nil}, point will move to
7103the next/previous unread article. If @code{nil}, point will just move
7104one line up or down. As a special case, if this variable is
7105@code{never}, all the marking commands as well as other commands (like
7106@kbd{SPACE}) will move to the next article, whether it is unread or not.
7107The default is @code{t}.
7108
7109
7110@node Generic Marking Commands
7111@subsection Generic Marking Commands
7112
7113Some people would like the command that ticks an article (@kbd{!}) go to
7114the next article. Others would like it to go to the next unread
7115article. Yet others would like it to stay on the current article. And
7116even though I haven't heard of anybody wanting it to go to the
7117previous (unread) article, I'm sure there are people that want that as
7118well.
7119
7120Multiply these five behaviors with five different marking commands, and
7121you get a potentially complex set of variable to control what each
7122command should do.
7123
7124To sidestep that mess, Gnus provides commands that do all these
7125different things. They can be found on the @kbd{M M} map in the summary
7126buffer. Type @kbd{M M C-h} to see them all---there are too many of them
7127to list in this manual.
7128
7129While you can use these commands directly, most users would prefer
7130altering the summary mode keymap. For instance, if you would like the
7131@kbd{!} command to go to the next article instead of the next unread
7132article, you could say something like:
7133
7134@lisp
7135@group
7136(add-hook 'gnus-summary-mode-hook 'my-alter-summary-map)
7137(defun my-alter-summary-map ()
7138 (local-set-key "!" 'gnus-summary-put-mark-as-ticked-next))
7139@end group
7140@end lisp
7141
7142@noindent
7143or
7144
7145@lisp
7146(defun my-alter-summary-map ()
7147 (local-set-key "!" "MM!n"))
7148@end lisp
7149
7150
7151@node Setting Process Marks
7152@subsection Setting Process Marks
7153@cindex setting process marks
7154
7155Process marks are displayed as @code{#} in the summary buffer, and are
7156used for marking articles in such a way that other commands will
7157process these articles. For instance, if you process mark four
7158articles and then use the @kbd{*} command, Gnus will enter these four
7159articles into the cache. For more information,
7160@pxref{Process/Prefix}.
7161
7162@table @kbd
7163
7164@item M P p
7165@itemx #
7166@kindex # (Summary)
7167@kindex M P p (Summary)
7168@findex gnus-summary-mark-as-processable
7169Mark the current article with the process mark
7170(@code{gnus-summary-mark-as-processable}).
7171@findex gnus-summary-unmark-as-processable
7172
7173@item M P u
7174@itemx M-#
7175@kindex M P u (Summary)
7176@kindex M-# (Summary)
7177Remove the process mark, if any, from the current article
7178(@code{gnus-summary-unmark-as-processable}).
7179
7180@item M P U
7181@kindex M P U (Summary)
7182@findex gnus-summary-unmark-all-processable
7183Remove the process mark from all articles
7184(@code{gnus-summary-unmark-all-processable}).
7185
7186@item M P i
7187@kindex M P i (Summary)
7188@findex gnus-uu-invert-processable
7189Invert the list of process marked articles
7190(@code{gnus-uu-invert-processable}).
7191
7192@item M P R
7193@kindex M P R (Summary)
7194@findex gnus-uu-mark-by-regexp
7195Mark articles that have a @code{Subject} header that matches a regular
7196expression (@code{gnus-uu-mark-by-regexp}).
7197
7198@item M P G
7199@kindex M P G (Summary)
7200@findex gnus-uu-unmark-by-regexp
7201Unmark articles that have a @code{Subject} header that matches a regular
7202expression (@code{gnus-uu-unmark-by-regexp}).
7203
7204@item M P r
7205@kindex M P r (Summary)
7206@findex gnus-uu-mark-region
7207Mark articles in region (@code{gnus-uu-mark-region}).
7208
7209@item M P g
7210@kindex M P g (Summary)
7211@findex gnus-uu-unmark-region
7212Unmark articles in region (@code{gnus-uu-unmark-region}).
7213
7214@item M P t
7215@kindex M P t (Summary)
7216@findex gnus-uu-mark-thread
7217Mark all articles in the current (sub)thread
7218(@code{gnus-uu-mark-thread}).
7219
7220@item M P T
7221@kindex M P T (Summary)
7222@findex gnus-uu-unmark-thread
7223Unmark all articles in the current (sub)thread
7224(@code{gnus-uu-unmark-thread}).
7225
7226@item M P v
7227@kindex M P v (Summary)
7228@findex gnus-uu-mark-over
7229Mark all articles that have a score above the prefix argument
7230(@code{gnus-uu-mark-over}).
7231
7232@item M P s
7233@kindex M P s (Summary)
7234@findex gnus-uu-mark-series
7235Mark all articles in the current series (@code{gnus-uu-mark-series}).
7236
7237@item M P S
7238@kindex M P S (Summary)
7239@findex gnus-uu-mark-sparse
7240Mark all series that have already had some articles marked
7241(@code{gnus-uu-mark-sparse}).
7242
7243@item M P a
7244@kindex M P a (Summary)
7245@findex gnus-uu-mark-all
7246Mark all articles in series order (@code{gnus-uu-mark-all}).
7247
7248@item M P b
7249@kindex M P b (Summary)
7250@findex gnus-uu-mark-buffer
7251Mark all articles in the buffer in the order they appear
7252(@code{gnus-uu-mark-buffer}).
7253
7254@item M P k
7255@kindex M P k (Summary)
7256@findex gnus-summary-kill-process-mark
7257Push the current process mark set onto the stack and unmark all articles
7258(@code{gnus-summary-kill-process-mark}).
7259
7260@item M P y
7261@kindex M P y (Summary)
7262@findex gnus-summary-yank-process-mark
7263Pop the previous process mark set from the stack and restore it
7264(@code{gnus-summary-yank-process-mark}).
7265
7266@item M P w
7267@kindex M P w (Summary)
7268@findex gnus-summary-save-process-mark
7269Push the current process mark set onto the stack
7270(@code{gnus-summary-save-process-mark}).
7271
7272@end table
7273
7274Also see the @kbd{&} command in @ref{Searching for Articles}, for how to
7275set process marks based on article body contents.
7276
7277
7278@node Limiting
7279@section Limiting
7280@cindex limiting
7281
7282It can be convenient to limit the summary buffer to just show some
7283subset of the articles currently in the group. The effect most limit
7284commands have is to remove a few (or many) articles from the summary
7285buffer.
7286
7287All limiting commands work on subsets of the articles already fetched
7288from the servers. None of these commands query the server for
7289additional articles.
7290
7291@table @kbd
7292
7293@item / /
7294@itemx / s
7295@kindex / / (Summary)
7296@findex gnus-summary-limit-to-subject
7297Limit the summary buffer to articles that match some subject
7298(@code{gnus-summary-limit-to-subject}). If given a prefix, exclude
7299matching articles.
7300
7301@item / a
7302@kindex / a (Summary)
7303@findex gnus-summary-limit-to-author
7304Limit the summary buffer to articles that match some author
7305(@code{gnus-summary-limit-to-author}). If given a prefix, exclude
7306matching articles.
7307
01c52d31
MB
7308@item / R
7309@kindex / R (Summary)
7310@findex gnus-summary-limit-to-recipient
7311Limit the summary buffer to articles that match some recipient
7312(@code{gnus-summary-limit-to-recipient}). If given a prefix, exclude
7313matching articles.
7314
7315@item / A
7316@kindex / A (Summary)
7317@findex gnus-summary-limit-to-address
7318Limit the summary buffer to articles in which contents of From, To or Cc
7319header match a given address (@code{gnus-summary-limit-to-address}). If
7320given a prefix, exclude matching articles.
7321
7322@item / S
7323@kindex / S (Summary)
7324@findex gnus-summary-limit-to-singletons
7325Limit the summary buffer to articles that aren't part of any displayed
7326threads (@code{gnus-summary-limit-to-singletons}). If given a prefix,
7327limit to articles that are part of displayed threads.
7328
4009494e
GM
7329@item / x
7330@kindex / x (Summary)
7331@findex gnus-summary-limit-to-extra
7332Limit the summary buffer to articles that match one of the ``extra''
7333headers (@pxref{To From Newsgroups})
7334(@code{gnus-summary-limit-to-extra}). If given a prefix, exclude
7335matching articles.
7336
7337@item / u
7338@itemx x
7339@kindex / u (Summary)
7340@kindex x (Summary)
7341@findex gnus-summary-limit-to-unread
7342Limit the summary buffer to articles not marked as read
7343(@code{gnus-summary-limit-to-unread}). If given a prefix, limit the
7344buffer to articles strictly unread. This means that ticked and
7345dormant articles will also be excluded.
7346
7347@item / m
7348@kindex / m (Summary)
7349@findex gnus-summary-limit-to-marks
7350Ask for a mark and then limit to all articles that have been marked
7351with that mark (@code{gnus-summary-limit-to-marks}).
7352
7353@item / t
7354@kindex / t (Summary)
7355@findex gnus-summary-limit-to-age
7356Ask for a number and then limit the summary buffer to articles older than (or equal to) that number of days
7357(@code{gnus-summary-limit-to-age}). If given a prefix, limit to
7358articles younger than that number of days.
7359
7360@item / n
7361@kindex / n (Summary)
7362@findex gnus-summary-limit-to-articles
7363With prefix @samp{n}, limit the summary buffer to the next @samp{n}
7364articles. If not given a prefix, use the process marked articles
7365instead. (@code{gnus-summary-limit-to-articles}).
7366
7367@item / w
7368@kindex / w (Summary)
7369@findex gnus-summary-pop-limit
7370Pop the previous limit off the stack and restore it
7371(@code{gnus-summary-pop-limit}). If given a prefix, pop all limits off
7372the stack.
7373
7374@item / .
7375@kindex / . (Summary)
7376@findex gnus-summary-limit-to-unseen
7377Limit the summary buffer to the unseen articles
7378(@code{gnus-summary-limit-to-unseen}).
7379
7380@item / v
7381@kindex / v (Summary)
7382@findex gnus-summary-limit-to-score
7383Limit the summary buffer to articles that have a score at or above some
7384score (@code{gnus-summary-limit-to-score}).
7385
7386@item / p
7387@kindex / p (Summary)
7388@findex gnus-summary-limit-to-display-predicate
7389Limit the summary buffer to articles that satisfy the @code{display}
7390group parameter predicate
7391(@code{gnus-summary-limit-to-display-predicate}). @xref{Group
7392Parameters}, for more on this predicate.
7393
01c52d31
MB
7394@item / r
7395@kindex / r (Summary)
7396@findex gnus-summary-limit-to-replied
7397Limit the summary buffer to replied articles
7398(@code{gnus-summary-limit-to-replied}). If given a prefix, exclude
7399replied articles.
7400
4009494e
GM
7401@item / E
7402@itemx M S
7403@kindex M S (Summary)
7404@kindex / E (Summary)
7405@findex gnus-summary-limit-include-expunged
7406Include all expunged articles in the limit
7407(@code{gnus-summary-limit-include-expunged}).
7408
7409@item / D
7410@kindex / D (Summary)
7411@findex gnus-summary-limit-include-dormant
7412Include all dormant articles in the limit
7413(@code{gnus-summary-limit-include-dormant}).
7414
7415@item / *
7416@kindex / * (Summary)
7417@findex gnus-summary-limit-include-cached
7418Include all cached articles in the limit
7419(@code{gnus-summary-limit-include-cached}).
7420
7421@item / d
7422@kindex / d (Summary)
7423@findex gnus-summary-limit-exclude-dormant
7424Exclude all dormant articles from the limit
7425(@code{gnus-summary-limit-exclude-dormant}).
7426
7427@item / M
7428@kindex / M (Summary)
7429@findex gnus-summary-limit-exclude-marks
7430Exclude all marked articles (@code{gnus-summary-limit-exclude-marks}).
7431
7432@item / T
7433@kindex / T (Summary)
7434@findex gnus-summary-limit-include-thread
7435Include all the articles in the current thread in the limit.
7436
7437@item / c
7438@kindex / c (Summary)
7439@findex gnus-summary-limit-exclude-childless-dormant
7440Exclude all dormant articles that have no children from the limit@*
7441(@code{gnus-summary-limit-exclude-childless-dormant}).
7442
7443@item / C
7444@kindex / C (Summary)
7445@findex gnus-summary-limit-mark-excluded-as-read
7446Mark all excluded unread articles as read
7447(@code{gnus-summary-limit-mark-excluded-as-read}). If given a prefix,
7448also mark excluded ticked and dormant articles as read.
7449
7450@item / N
7451@kindex / N (Summary)
7452@findex gnus-summary-insert-new-articles
7453Insert all new articles in the summary buffer. It scans for new emails
7454if @var{back-end}@code{-get-new-mail} is non-@code{nil}.
7455
7456@item / o
7457@kindex / o (Summary)
7458@findex gnus-summary-insert-old-articles
7459Insert all old articles in the summary buffer. If given a numbered
7460prefix, fetch this number of articles.
7461
01c52d31
MB
7462@item / b
7463@kindex / b (Summary)
7464@findex gnus-summary-limit-to-bodies
7465Limit the summary buffer to articles that have bodies that match a
7466certain regexp (@code{gnus-summary-limit-to-bodies}). If given a
7467prefix, reverse the limit. This command is quite slow since it
7468requires selecting each article to find the matches.
7469
7470@item / h
7471@kindex / h (Summary)
7472@findex gnus-summary-limit-to-headers
7473Like the previous command, only limit to headers instead
7474(@code{gnus-summary-limit-to-headers}).
7475
4009494e
GM
7476@end table
7477
7478
7479@node Threading
7480@section Threading
7481@cindex threading
7482@cindex article threading
7483
7484Gnus threads articles by default. @dfn{To thread} is to put responses
7485to articles directly after the articles they respond to---in a
7486hierarchical fashion.
7487
7488Threading is done by looking at the @code{References} headers of the
7489articles. In a perfect world, this would be enough to build pretty
7490trees, but unfortunately, the @code{References} header is often broken
7491or simply missing. Weird news propagation exacerbates the problem,
7492so one has to employ other heuristics to get pleasing results. A
7493plethora of approaches exists, as detailed in horrible detail in
7494@ref{Customizing Threading}.
7495
7496First, a quick overview of the concepts:
7497
7498@table @dfn
7499@item root
7500The top-most article in a thread; the first article in the thread.
7501
7502@item thread
7503A tree-like article structure.
7504
7505@item sub-thread
7506A small(er) section of this tree-like structure.
7507
7508@item loose threads
7509Threads often lose their roots due to article expiry, or due to the root
7510already having been read in a previous session, and not displayed in the
7511summary buffer. We then typically have many sub-threads that really
7512belong to one thread, but are without connecting roots. These are
7513called loose threads.
7514
7515@item thread gathering
7516An attempt to gather loose threads into bigger threads.
7517
7518@item sparse threads
7519A thread where the missing articles have been ``guessed'' at, and are
7520displayed as empty lines in the summary buffer.
7521
7522@end table
7523
7524
7525@menu
7526* Customizing Threading:: Variables you can change to affect the threading.
7527* Thread Commands:: Thread based commands in the summary buffer.
7528@end menu
7529
7530
7531@node Customizing Threading
7532@subsection Customizing Threading
7533@cindex customizing threading
7534
7535@menu
7536* Loose Threads:: How Gnus gathers loose threads into bigger threads.
7537* Filling In Threads:: Making the threads displayed look fuller.
7538* More Threading:: Even more variables for fiddling with threads.
7539* Low-Level Threading:: You thought it was over@dots{} but you were wrong!
7540@end menu
7541
7542
7543@node Loose Threads
7544@subsubsection Loose Threads
7545@cindex <
7546@cindex >
7547@cindex loose threads
7548
7549@table @code
7550@item gnus-summary-make-false-root
7551@vindex gnus-summary-make-false-root
7552If non-@code{nil}, Gnus will gather all loose subtrees into one big tree
7553and create a dummy root at the top. (Wait a minute. Root at the top?
7554Yup.) Loose subtrees occur when the real root has expired, or you've
7555read or killed the root in a previous session.
7556
7557When there is no real root of a thread, Gnus will have to fudge
7558something. This variable says what fudging method Gnus should use.
7559There are four possible values:
7560
7561@iftex
7562@iflatex
7563\gnusfigure{The Summary Buffer}{390}{
7564\put(0,0){\epsfig{figure=ps/summary-adopt,width=7.5cm}}
7565\put(445,0){\makebox(0,0)[br]{\epsfig{figure=ps/summary-empty,width=7.5cm}}}
7566\put(0,400){\makebox(0,0)[tl]{\epsfig{figure=ps/summary-none,width=7.5cm}}}
7567\put(445,400){\makebox(0,0)[tr]{\epsfig{figure=ps/summary-dummy,width=7.5cm}}}
7568}
7569@end iflatex
7570@end iftex
7571
7572@cindex adopting articles
7573
7574@table @code
7575
7576@item adopt
7577Gnus will make the first of the orphaned articles the parent. This
7578parent will adopt all the other articles. The adopted articles will be
7579marked as such by pointy brackets (@samp{<>}) instead of the standard
7580square brackets (@samp{[]}). This is the default method.
7581
7582@item dummy
7583@vindex gnus-summary-dummy-line-format
7584@vindex gnus-summary-make-false-root-always
7585Gnus will create a dummy summary line that will pretend to be the
7586parent. This dummy line does not correspond to any real article, so
7587selecting it will just select the first real article after the dummy
7588article. @code{gnus-summary-dummy-line-format} is used to specify the
7589format of the dummy roots. It accepts only one format spec: @samp{S},
7590which is the subject of the article. @xref{Formatting Variables}.
7591If you want all threads to have a dummy root, even the non-gathered
7592ones, set @code{gnus-summary-make-false-root-always} to @code{t}.
7593
7594@item empty
7595Gnus won't actually make any article the parent, but simply leave the
7596subject field of all orphans except the first empty. (Actually, it will
7597use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
7598Buffer Format}).)
7599
7600@item none
7601Don't make any article parent at all. Just gather the threads and
7602display them after one another.
7603
7604@item nil
7605Don't gather loose threads.
7606@end table
7607
7608@item gnus-summary-gather-subject-limit
7609@vindex gnus-summary-gather-subject-limit
7610Loose threads are gathered by comparing subjects of articles. If this
7611variable is @code{nil}, Gnus requires an exact match between the
7612subjects of the loose threads before gathering them into one big
7613super-thread. This might be too strict a requirement, what with the
7614presence of stupid newsreaders that chop off long subject lines. If
7615you think so, set this variable to, say, 20 to require that only the
7616first 20 characters of the subjects have to match. If you set this
7617variable to a really low number, you'll find that Gnus will gather
7618everything in sight into one thread, which isn't very helpful.
7619
7620@cindex fuzzy article gathering
7621If you set this variable to the special value @code{fuzzy}, Gnus will
7622use a fuzzy string comparison algorithm on the subjects (@pxref{Fuzzy
7623Matching}).
7624
7625@item gnus-simplify-subject-fuzzy-regexp
7626@vindex gnus-simplify-subject-fuzzy-regexp
7627This can either be a regular expression or list of regular expressions
7628that match strings that will be removed from subjects if fuzzy subject
7629simplification is used.
7630
7631@item gnus-simplify-ignored-prefixes
7632@vindex gnus-simplify-ignored-prefixes
7633If you set @code{gnus-summary-gather-subject-limit} to something as low
7634as 10, you might consider setting this variable to something sensible:
7635
7636@c Written by Michael Ernst <mernst@cs.rice.edu>
7637@lisp
7638(setq gnus-simplify-ignored-prefixes
7639 (concat
7640 "\\`\\[?\\("
7641 (mapconcat
7642 'identity
7643 '("looking"
7644 "wanted" "followup" "summary\\( of\\)?"
7645 "help" "query" "problem" "question"
7646 "answer" "reference" "announce"
7647 "How can I" "How to" "Comparison of"
7648 ;; ...
7649 )
7650 "\\|")
7651 "\\)\\s *\\("
7652 (mapconcat 'identity
7653 '("for" "for reference" "with" "about")
7654 "\\|")
7655 "\\)?\\]?:?[ \t]*"))
7656@end lisp
7657
7658All words that match this regexp will be removed before comparing two
7659subjects.
7660
7661@item gnus-simplify-subject-functions
7662@vindex gnus-simplify-subject-functions
7663If non-@code{nil}, this variable overrides
7664@code{gnus-summary-gather-subject-limit}. This variable should be a
7665list of functions to apply to the @code{Subject} string iteratively to
7666arrive at the simplified version of the string.
7667
7668Useful functions to put in this list include:
7669
7670@table @code
7671@item gnus-simplify-subject-re
7672@findex gnus-simplify-subject-re
7673Strip the leading @samp{Re:}.
7674
7675@item gnus-simplify-subject-fuzzy
7676@findex gnus-simplify-subject-fuzzy
7677Simplify fuzzily.
7678
7679@item gnus-simplify-whitespace
7680@findex gnus-simplify-whitespace
7681Remove excessive whitespace.
7682
7683@item gnus-simplify-all-whitespace
7684@findex gnus-simplify-all-whitespace
7685Remove all whitespace.
7686@end table
7687
7688You may also write your own functions, of course.
7689
7690
7691@item gnus-summary-gather-exclude-subject
7692@vindex gnus-summary-gather-exclude-subject
7693Since loose thread gathering is done on subjects only, that might lead
7694to many false hits, especially with certain common subjects like
7695@samp{} and @samp{(none)}. To make the situation slightly better,
7696you can use the regexp @code{gnus-summary-gather-exclude-subject} to say
7697what subjects should be excluded from the gathering process.@*
7698The default is @samp{^ *$\\|^(none)$}.
7699
7700@item gnus-summary-thread-gathering-function
7701@vindex gnus-summary-thread-gathering-function
7702Gnus gathers threads by looking at @code{Subject} headers. This means
7703that totally unrelated articles may end up in the same ``thread'', which
7704is confusing. An alternate approach is to look at all the
7705@code{Message-ID}s in all the @code{References} headers to find matches.
7706This will ensure that no gathered threads ever include unrelated
7707articles, but it also means that people who have posted with broken
7708newsreaders won't be gathered properly. The choice is yours---plague or
7709cholera:
7710
7711@table @code
7712@item gnus-gather-threads-by-subject
7713@findex gnus-gather-threads-by-subject
7714This function is the default gathering function and looks at
7715@code{Subject}s exclusively.
7716
7717@item gnus-gather-threads-by-references
7718@findex gnus-gather-threads-by-references
7719This function looks at @code{References} headers exclusively.
7720@end table
7721
7722If you want to test gathering by @code{References}, you could say
7723something like:
7724
7725@lisp
7726(setq gnus-summary-thread-gathering-function
7727 'gnus-gather-threads-by-references)
7728@end lisp
7729
7730@end table
7731
7732
7733@node Filling In Threads
7734@subsubsection Filling In Threads
7735
7736@table @code
7737@item gnus-fetch-old-headers
7738@vindex gnus-fetch-old-headers
7739If non-@code{nil}, Gnus will attempt to build old threads by fetching
7740more old headers---headers to articles marked as read. If you would
7741like to display as few summary lines as possible, but still connect as
7742many loose threads as possible, you should set this variable to
7743@code{some} or a number. If you set it to a number, no more than that
7744number of extra old headers will be fetched. In either case, fetching
7745old headers only works if the back end you are using carries overview
7746files---this would normally be @code{nntp}, @code{nnspool},
7747@code{nnml}, and @code{nnmaildir}. Also remember that if the root of
7748the thread has been expired by the server, there's not much Gnus can
7749do about that.
7750
7751This variable can also be set to @code{invisible}. This won't have any
7752visible effects, but is useful if you use the @kbd{A T} command a lot
7753(@pxref{Finding the Parent}).
7754
f394fa25
MB
7755The server has to support @acronym{NOV} for any of this to work.
7756
7757@cindex Gmane, gnus-fetch-old-headers
7758This feature can seriously impact performance it ignores all locally
7759cached header entries. Setting it to @code{t} for groups for a server
7760that doesn't expire articles (such as news.gmane.org), leads to very
7761slow summary generation.
7762
4009494e
GM
7763@item gnus-fetch-old-ephemeral-headers
7764@vindex gnus-fetch-old-ephemeral-headers
7765Same as @code{gnus-fetch-old-headers}, but only used for ephemeral
7766newsgroups.
7767
7768@item gnus-build-sparse-threads
7769@vindex gnus-build-sparse-threads
7770Fetching old headers can be slow. A low-rent similar effect can be
7771gotten by setting this variable to @code{some}. Gnus will then look at
7772the complete @code{References} headers of all articles and try to string
7773together articles that belong in the same thread. This will leave
7774@dfn{gaps} in the threading display where Gnus guesses that an article
7775is missing from the thread. (These gaps appear like normal summary
7776lines. If you select a gap, Gnus will try to fetch the article in
7777question.) If this variable is @code{t}, Gnus will display all these
7778``gaps'' without regard for whether they are useful for completing the
7779thread or not. Finally, if this variable is @code{more}, Gnus won't cut
7780off sparse leaf nodes that don't lead anywhere. This variable is
7781@code{nil} by default.
7782
7783@item gnus-read-all-available-headers
7784@vindex gnus-read-all-available-headers
7785This is a rather obscure variable that few will find useful. It's
7786intended for those non-news newsgroups where the back end has to fetch
7787quite a lot to present the summary buffer, and where it's impossible to
7788go back to parents of articles. This is mostly the case in the
7789web-based groups, like the @code{nnultimate} groups.
7790
7791If you don't use those, then it's safe to leave this as the default
7792@code{nil}. If you want to use this variable, it should be a regexp
7793that matches the group name, or @code{t} for all groups.
7794
7795@end table
7796
7797
7798@node More Threading
7799@subsubsection More Threading
7800
7801@table @code
7802@item gnus-show-threads
7803@vindex gnus-show-threads
7804If this variable is @code{nil}, no threading will be done, and all of
7805the rest of the variables here will have no effect. Turning threading
7806off will speed group selection up a bit, but it is sure to make reading
7807slower and more awkward.
7808
7809@item gnus-thread-hide-subtree
7810@vindex gnus-thread-hide-subtree
7811If non-@code{nil}, all threads will be hidden when the summary buffer is
7812generated.
7813
7814This can also be a predicate specifier (@pxref{Predicate Specifiers}).
7815Available predicates are @code{gnus-article-unread-p} and
7816@code{gnus-article-unseen-p}.
7817
7818Here's an example:
7819
7820@lisp
7821(setq gnus-thread-hide-subtree
7822 '(or gnus-article-unread-p
7823 gnus-article-unseen-p))
7824@end lisp
7825
7826(It's a pretty nonsensical example, since all unseen articles are also
7827unread, but you get my drift.)
7828
7829
7830@item gnus-thread-expunge-below
7831@vindex gnus-thread-expunge-below
7832All threads that have a total score (as defined by
7833@code{gnus-thread-score-function}) less than this number will be
7834expunged. This variable is @code{nil} by default, which means that no
7835threads are expunged.
7836
7837@item gnus-thread-hide-killed
7838@vindex gnus-thread-hide-killed
7839if you kill a thread and this variable is non-@code{nil}, the subtree
7840will be hidden.
7841
7842@item gnus-thread-ignore-subject
7843@vindex gnus-thread-ignore-subject
7844Sometimes somebody changes the subject in the middle of a thread. If
7845this variable is non-@code{nil}, which is the default, the subject
7846change is ignored. If it is @code{nil}, a change in the subject will
7847result in a new thread.
7848
7849@item gnus-thread-indent-level
7850@vindex gnus-thread-indent-level
7851This is a number that says how much each sub-thread should be indented.
7852The default is 4.
7853
7854@item gnus-sort-gathered-threads-function
7855@vindex gnus-sort-gathered-threads-function
7856Sometimes, particularly with mailing lists, the order in which mails
7857arrive locally is not necessarily the same as the order in which they
7858arrived on the mailing list. Consequently, when sorting sub-threads
7859using the default @code{gnus-thread-sort-by-number}, responses can end
7860up appearing before the article to which they are responding to.
7861Setting this variable to an alternate value
7862(e.g. @code{gnus-thread-sort-by-date}), in a group's parameters or in an
7863appropriate hook (e.g. @code{gnus-summary-generate-hook}) can produce a
7864more logical sub-thread ordering in such instances.
7865
7866@end table
7867
7868
7869@node Low-Level Threading
7870@subsubsection Low-Level Threading
7871
7872@table @code
7873
7874@item gnus-parse-headers-hook
7875@vindex gnus-parse-headers-hook
7876Hook run before parsing any headers.
7877
7878@item gnus-alter-header-function
7879@vindex gnus-alter-header-function
7880If non-@code{nil}, this function will be called to allow alteration of
7881article header structures. The function is called with one parameter,
7882the article header vector, which it may alter in any way. For instance,
7883if you have a mail-to-news gateway which alters the @code{Message-ID}s
7884in systematic ways (by adding prefixes and such), you can use this
7885variable to un-scramble the @code{Message-ID}s so that they are more
7886meaningful. Here's one example:
7887
7888@lisp
7889(setq gnus-alter-header-function 'my-alter-message-id)
7890
7891(defun my-alter-message-id (header)
7892 (let ((id (mail-header-id header)))
7893 (when (string-match
7894 "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id)
7895 (mail-header-set-id
7896 (concat (match-string 1 id) "@@" (match-string 2 id))
7897 header))))
7898@end lisp
7899
7900@end table
7901
7902
7903@node Thread Commands
7904@subsection Thread Commands
7905@cindex thread commands
7906
7907@table @kbd
7908
7909@item T k
7910@itemx C-M-k
7911@kindex T k (Summary)
7912@kindex C-M-k (Summary)
7913@findex gnus-summary-kill-thread
7914Mark all articles in the current (sub-)thread as read
7915(@code{gnus-summary-kill-thread}). If the prefix argument is positive,
7916remove all marks instead. If the prefix argument is negative, tick
7917articles instead.
7918
7919@item T l
7920@itemx C-M-l
7921@kindex T l (Summary)
7922@kindex C-M-l (Summary)
7923@findex gnus-summary-lower-thread
7924Lower the score of the current (sub-)thread
7925(@code{gnus-summary-lower-thread}).
7926
7927@item T i
7928@kindex T i (Summary)
7929@findex gnus-summary-raise-thread
7930Increase the score of the current (sub-)thread
7931(@code{gnus-summary-raise-thread}).
7932
7933@item T #
7934@kindex T # (Summary)
7935@findex gnus-uu-mark-thread
7936Set the process mark on the current (sub-)thread
7937(@code{gnus-uu-mark-thread}).
7938
7939@item T M-#
7940@kindex T M-# (Summary)
7941@findex gnus-uu-unmark-thread
7942Remove the process mark from the current (sub-)thread
7943(@code{gnus-uu-unmark-thread}).
7944
7945@item T T
7946@kindex T T (Summary)
7947@findex gnus-summary-toggle-threads
7948Toggle threading (@code{gnus-summary-toggle-threads}).
7949
7950@item T s
7951@kindex T s (Summary)
7952@findex gnus-summary-show-thread
7953Expose the (sub-)thread hidden under the current article, if any@*
7954(@code{gnus-summary-show-thread}).
7955
7956@item T h
7957@kindex T h (Summary)
7958@findex gnus-summary-hide-thread
7959Hide the current (sub-)thread (@code{gnus-summary-hide-thread}).
7960
7961@item T S
7962@kindex T S (Summary)
7963@findex gnus-summary-show-all-threads
7964Expose all hidden threads (@code{gnus-summary-show-all-threads}).
7965
7966@item T H
7967@kindex T H (Summary)
7968@findex gnus-summary-hide-all-threads
7969Hide all threads (@code{gnus-summary-hide-all-threads}).
7970
7971@item T t
7972@kindex T t (Summary)
7973@findex gnus-summary-rethread-current
7974Re-thread the current article's thread
7975(@code{gnus-summary-rethread-current}). This works even when the
7976summary buffer is otherwise unthreaded.
7977
7978@item T ^
7979@kindex T ^ (Summary)
7980@findex gnus-summary-reparent-thread
7981Make the current article the child of the marked (or previous) article
7982(@code{gnus-summary-reparent-thread}).
7983
01c52d31
MB
7984@item T M-^
7985@kindex T M-^ (Summary)
7986@findex gnus-summary-reparent-children
7987Make the current article the parent of the marked articles
7988(@code{gnus-summary-reparent-children}).
7989
4009494e
GM
7990@end table
7991
7992The following commands are thread movement commands. They all
7993understand the numeric prefix.
7994
7995@table @kbd
7996
7997@item T n
7998@kindex T n (Summary)
7999@itemx C-M-f
8000@kindex C-M-n (Summary)
8001@itemx M-down
8002@kindex M-down (Summary)
8003@findex gnus-summary-next-thread
8004Go to the next thread (@code{gnus-summary-next-thread}).
8005
8006@item T p
8007@kindex T p (Summary)
8008@itemx C-M-b
8009@kindex C-M-p (Summary)
8010@itemx M-up
8011@kindex M-up (Summary)
8012@findex gnus-summary-prev-thread
8013Go to the previous thread (@code{gnus-summary-prev-thread}).
8014
8015@item T d
8016@kindex T d (Summary)
8017@findex gnus-summary-down-thread
8018Descend the thread (@code{gnus-summary-down-thread}).
8019
8020@item T u
8021@kindex T u (Summary)
8022@findex gnus-summary-up-thread
8023Ascend the thread (@code{gnus-summary-up-thread}).
8024
8025@item T o
8026@kindex T o (Summary)
8027@findex gnus-summary-top-thread
8028Go to the top of the thread (@code{gnus-summary-top-thread}).
8029@end table
8030
8031@vindex gnus-thread-operation-ignore-subject
8032If you ignore subject while threading, you'll naturally end up with
8033threads that have several different subjects in them. If you then issue
8034a command like @kbd{T k} (@code{gnus-summary-kill-thread}) you might not
8035wish to kill the entire thread, but just those parts of the thread that
8036have the same subject as the current article. If you like this idea,
8037you can fiddle with @code{gnus-thread-operation-ignore-subject}. If it
8038is non-@code{nil} (which it is by default), subjects will be ignored
8039when doing thread commands. If this variable is @code{nil}, articles in
8040the same thread with different subjects will not be included in the
8041operation in question. If this variable is @code{fuzzy}, only articles
8042that have subjects fuzzily equal will be included (@pxref{Fuzzy
8043Matching}).
8044
8045
8046@node Sorting the Summary Buffer
8047@section Sorting the Summary Buffer
8048
8049@findex gnus-thread-sort-by-total-score
8050@findex gnus-thread-sort-by-date
8051@findex gnus-thread-sort-by-score
8052@findex gnus-thread-sort-by-subject
8053@findex gnus-thread-sort-by-author
01c52d31 8054@findex gnus-thread-sort-by-recipient
4009494e
GM
8055@findex gnus-thread-sort-by-number
8056@findex gnus-thread-sort-by-random
8057@vindex gnus-thread-sort-functions
8058@findex gnus-thread-sort-by-most-recent-number
8059@findex gnus-thread-sort-by-most-recent-date
8060If you are using a threaded summary display, you can sort the threads by
8061setting @code{gnus-thread-sort-functions}, which can be either a single
8062function, a list of functions, or a list containing functions and
8063@code{(not some-function)} elements.
8064
8065By default, sorting is done on article numbers. Ready-made sorting
8066predicate functions include @code{gnus-thread-sort-by-number},
01c52d31
MB
8067@code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-recipient},
8068@code{gnus-thread-sort-by-subject},
8069@code{gnus-thread-sort-by-date},
8070@code{gnus-thread-sort-by-score},
4009494e
GM
8071@code{gnus-thread-sort-by-most-recent-number},
8072@code{gnus-thread-sort-by-most-recent-date},
8073@code{gnus-thread-sort-by-random} and
8074@code{gnus-thread-sort-by-total-score}.
8075
8076Each function takes two threads and returns non-@code{nil} if the first
8077thread should be sorted before the other. Note that sorting really is
8078normally done by looking only at the roots of each thread.
8079
8080If you use more than one function, the primary sort key should be the
8081last function in the list. You should probably always include
8082@code{gnus-thread-sort-by-number} in the list of sorting
8083functions---preferably first. This will ensure that threads that are
8084equal with respect to the other sort criteria will be displayed in
8085ascending article order.
8086
8087If you would like to sort by reverse score, then by subject, and finally
8088by number, you could do something like:
8089
8090@lisp
8091(setq gnus-thread-sort-functions
8092 '(gnus-thread-sort-by-number
8093 gnus-thread-sort-by-subject
8094 (not gnus-thread-sort-by-total-score)))
8095@end lisp
8096
8097The threads that have highest score will be displayed first in the
8098summary buffer. When threads have the same score, they will be sorted
8099alphabetically. The threads that have the same score and the same
8100subject will be sorted by number, which is (normally) the sequence in
8101which the articles arrived.
8102
8103If you want to sort by score and then reverse arrival order, you could
8104say something like:
8105
8106@lisp
8107(setq gnus-thread-sort-functions
01c52d31 8108 '((not gnus-thread-sort-by-number)
4009494e
GM
8109 gnus-thread-sort-by-score))
8110@end lisp
8111
8112@vindex gnus-thread-score-function
8113The function in the @code{gnus-thread-score-function} variable (default
8114@code{+}) is used for calculating the total score of a thread. Useful
8115functions might be @code{max}, @code{min}, or squared means, or whatever
8116tickles your fancy.
8117
8118@findex gnus-article-sort-functions
8119@findex gnus-article-sort-by-date
6ecfe5c2 8120@findex gnus-article-sort-by-most-recent-date
4009494e
GM
8121@findex gnus-article-sort-by-score
8122@findex gnus-article-sort-by-subject
8123@findex gnus-article-sort-by-author
8124@findex gnus-article-sort-by-random
8125@findex gnus-article-sort-by-number
6ecfe5c2 8126@findex gnus-article-sort-by-most-recent-number
4009494e
GM
8127If you are using an unthreaded display for some strange reason or
8128other, you have to fiddle with the @code{gnus-article-sort-functions}
8129variable. It is very similar to the
8130@code{gnus-thread-sort-functions}, except that it uses slightly
8131different functions for article comparison. Available sorting
8132predicate functions are @code{gnus-article-sort-by-number},
8133@code{gnus-article-sort-by-author},
8134@code{gnus-article-sort-by-subject}, @code{gnus-article-sort-by-date},
8135@code{gnus-article-sort-by-random}, and
8136@code{gnus-article-sort-by-score}.
8137
8138If you want to sort an unthreaded summary display by subject, you could
8139say something like:
8140
8141@lisp
8142(setq gnus-article-sort-functions
8143 '(gnus-article-sort-by-number
8144 gnus-article-sort-by-subject))
8145@end lisp
8146
01c52d31
MB
8147You can define group specific sorting via @code{gnus-parameters},
8148@xref{Group Parameters}.
4009494e
GM
8149
8150
8151@node Asynchronous Fetching
8152@section Asynchronous Article Fetching
8153@cindex asynchronous article fetching
8154@cindex article pre-fetch
8155@cindex pre-fetch
8156
8157If you read your news from an @acronym{NNTP} server that's far away, the
8158network latencies may make reading articles a chore. You have to wait
8159for a while after pressing @kbd{n} to go to the next article before the
8160article appears. Why can't Gnus just go ahead and fetch the article
8161while you are reading the previous one? Why not, indeed.
8162
8163First, some caveats. There are some pitfalls to using asynchronous
8164article fetching, especially the way Gnus does it.
8165
8166Let's say you are reading article 1, which is short, and article 2 is
8167quite long, and you are not interested in reading that. Gnus does not
8168know this, so it goes ahead and fetches article 2. You decide to read
8169article 3, but since Gnus is in the process of fetching article 2, the
8170connection is blocked.
8171
8172To avoid these situations, Gnus will open two (count 'em two)
8173connections to the server. Some people may think this isn't a very nice
8174thing to do, but I don't see any real alternatives. Setting up that
8175extra connection takes some time, so Gnus startup will be slower.
8176
8177Gnus will fetch more articles than you will read. This will mean that
8178the link between your machine and the @acronym{NNTP} server will become more
8179loaded than if you didn't use article pre-fetch. The server itself will
8180also become more loaded---both with the extra article requests, and the
8181extra connection.
8182
8183Ok, so now you know that you shouldn't really use this thing@dots{} unless
8184you really want to.
8185
8186@vindex gnus-asynchronous
8187Here's how: Set @code{gnus-asynchronous} to @code{t}. The rest should
8188happen automatically.
8189
8190@vindex gnus-use-article-prefetch
8191You can control how many articles are to be pre-fetched by setting
8192@code{gnus-use-article-prefetch}. This is 30 by default, which means
8193that when you read an article in the group, the back end will pre-fetch
8194the next 30 articles. If this variable is @code{t}, the back end will
8195pre-fetch all the articles it can without bound. If it is
8196@code{nil}, no pre-fetching will be done.
8197
8198@vindex gnus-async-prefetch-article-p
8199@findex gnus-async-unread-p
8200There are probably some articles that you don't want to pre-fetch---read
8201articles, for instance. The @code{gnus-async-prefetch-article-p}
8202variable controls whether an article is to be pre-fetched. This
8203function should return non-@code{nil} when the article in question is
8204to be pre-fetched. The default is @code{gnus-async-unread-p}, which
8205returns @code{nil} on read articles. The function is called with an
8206article data structure as the only parameter.
8207
8208If, for instance, you wish to pre-fetch only unread articles shorter
8209than 100 lines, you could say something like:
8210
8211@lisp
8212(defun my-async-short-unread-p (data)
8213 "Return non-nil for short, unread articles."
8214 (and (gnus-data-unread-p data)
8215 (< (mail-header-lines (gnus-data-header data))
8216 100)))
8217
8218(setq gnus-async-prefetch-article-p 'my-async-short-unread-p)
8219@end lisp
8220
8221These functions will be called many, many times, so they should
8222preferably be short and sweet to avoid slowing down Gnus too much.
8223It's probably a good idea to byte-compile things like this.
8224
8225@vindex gnus-prefetched-article-deletion-strategy
8226Articles have to be removed from the asynch buffer sooner or later. The
8227@code{gnus-prefetched-article-deletion-strategy} says when to remove
8228articles. This is a list that may contain the following elements:
8229
8230@table @code
8231@item read
8232Remove articles when they are read.
8233
8234@item exit
8235Remove articles when exiting the group.
8236@end table
8237
8238The default value is @code{(read exit)}.
8239
8240@c @vindex gnus-use-header-prefetch
8241@c If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles
8242@c from the next group.
8243
8244
8245@node Article Caching
8246@section Article Caching
8247@cindex article caching
8248@cindex caching
8249
8250If you have an @emph{extremely} slow @acronym{NNTP} connection, you may
8251consider turning article caching on. Each article will then be stored
8252locally under your home directory. As you may surmise, this could
8253potentially use @emph{huge} amounts of disk space, as well as eat up all
8254your inodes so fast it will make your head swim. In vodka.
8255
8256Used carefully, though, it could be just an easier way to save articles.
8257
8258@vindex gnus-use-long-file-name
8259@vindex gnus-cache-directory
8260@vindex gnus-use-cache
8261To turn caching on, set @code{gnus-use-cache} to @code{t}. By default,
8262all articles ticked or marked as dormant will then be copied
8263over to your local cache (@code{gnus-cache-directory}). Whether this
8264cache is flat or hierarchical is controlled by the
8265@code{gnus-use-long-file-name} variable, as usual.
8266
8267When re-selecting a ticked or dormant article, it will be fetched from the
8268cache instead of from the server. As articles in your cache will never
8269expire, this might serve as a method of saving articles while still
8270keeping them where they belong. Just mark all articles you want to save
8271as dormant, and don't worry.
8272
8273When an article is marked as read, is it removed from the cache.
8274
8275@vindex gnus-cache-remove-articles
8276@vindex gnus-cache-enter-articles
8277The entering/removal of articles from the cache is controlled by the
8278@code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}
8279variables. Both are lists of symbols. The first is @code{(ticked
8280dormant)} by default, meaning that ticked and dormant articles will be
8281put in the cache. The latter is @code{(read)} by default, meaning that
8282articles marked as read are removed from the cache. Possibly
8283symbols in these two lists are @code{ticked}, @code{dormant},
8284@code{unread} and @code{read}.
8285
8286@findex gnus-jog-cache
8287So where does the massive article-fetching and storing come into the
8288picture? The @code{gnus-jog-cache} command will go through all
8289subscribed newsgroups, request all unread articles, score them, and
8290store them in the cache. You should only ever, ever ever ever, use this
8291command if 1) your connection to the @acronym{NNTP} server is really, really,
8292really slow and 2) you have a really, really, really huge disk.
8293Seriously. One way to cut down on the number of articles downloaded is
8294to score unwanted articles down and have them marked as read. They will
8295not then be downloaded by this command.
8296
8297@vindex gnus-uncacheable-groups
8298@vindex gnus-cacheable-groups
8299It is likely that you do not want caching on all groups. For instance,
8300if your @code{nnml} mail is located under your home directory, it makes no
8301sense to cache it somewhere else under your home directory. Unless you
8302feel that it's neat to use twice as much space.
8303
8304To limit the caching, you could set @code{gnus-cacheable-groups} to a
8305regexp of groups to cache, @samp{^nntp} for instance, or set the
8306@code{gnus-uncacheable-groups} regexp to @samp{^nnml}, for instance.
8307Both variables are @code{nil} by default. If a group matches both
8308variables, the group is not cached.
8309
8310@findex gnus-cache-generate-nov-databases
8311@findex gnus-cache-generate-active
8312@vindex gnus-cache-active-file
8313The cache stores information on what articles it contains in its active
8314file (@code{gnus-cache-active-file}). If this file (or any other parts
8315of the cache) becomes all messed up for some reason or other, Gnus
8316offers two functions that will try to set things right. @kbd{M-x
8317gnus-cache-generate-nov-databases} will (re)build all the @acronym{NOV}
8318files, and @kbd{gnus-cache-generate-active} will (re)generate the active
8319file.
8320
8321@findex gnus-cache-move-cache
8322@code{gnus-cache-move-cache} will move your whole
8323@code{gnus-cache-directory} to some other location. You get asked to
8324where, isn't that cool?
8325
8326@node Persistent Articles
8327@section Persistent Articles
8328@cindex persistent articles
8329
8330Closely related to article caching, we have @dfn{persistent articles}.
8331In fact, it's just a different way of looking at caching, and much more
8332useful in my opinion.
8333
8334Say you're reading a newsgroup, and you happen on to some valuable gem
8335that you want to keep and treasure forever. You'd normally just save it
8336(using one of the many saving commands) in some file. The problem with
8337that is that it's just, well, yucky. Ideally you'd prefer just having
8338the article remain in the group where you found it forever; untouched by
8339the expiry going on at the news server.
8340
8341This is what a @dfn{persistent article} is---an article that just won't
8342be deleted. It's implemented using the normal cache functions, but
8343you use two explicit commands for managing persistent articles:
8344
8345@table @kbd
8346
8347@item *
8348@kindex * (Summary)
8349@findex gnus-cache-enter-article
8350Make the current article persistent (@code{gnus-cache-enter-article}).
8351
8352@item M-*
8353@kindex M-* (Summary)
8354@findex gnus-cache-remove-article
8355Remove the current article from the persistent articles
8356(@code{gnus-cache-remove-article}). This will normally delete the
8357article.
8358@end table
8359
8360Both these commands understand the process/prefix convention.
8361
8362To avoid having all ticked articles (and stuff) entered into the cache,
8363you should set @code{gnus-use-cache} to @code{passive} if you're just
8364interested in persistent articles:
8365
8366@lisp
8367(setq gnus-use-cache 'passive)
8368@end lisp
8369
01c52d31
MB
8370@node Sticky Articles
8371@section Sticky Articles
8372@cindex sticky articles
8373
8374When you select an article the current article buffer will be reused
8375according to the value of the variable
8376@code{gnus-single-article-buffer}. If its value is non-@code{nil} (the
8377default) all articles reuse the same article buffer. Else each group
8378has its own article buffer.
8379
8380This implies that it's not possible to have more than one article buffer
8381in a group at a time. But sometimes you might want to display all the
8382latest emails from your mother, your father, your aunt, your uncle and
8383your 17 cousins to coordinate the next christmas party.
8384
8385That's where sticky articles come in handy. A sticky article buffer
8386basically is a normal article buffer, but it won't be reused when you
8387select another article. You can make an article sticky with:
8388
8389@table @kbd
8390@item A S
8391@kindex A S (Summary)
8392@findex gnus-sticky-article
8393Make the current article sticky. If a prefix arg is given, ask for a
8394name for this sticky article buffer.
8395@end table
8396
8397To close a sticky article buffer you can use these commands:
8398
8399@table @kbd
8400@item q
8401@kindex q (Article)
8402@findex bury-buffer
8403Puts this sticky article buffer at the end of the list of all buffers.
8404
8405@item k
8406@kindex k (Article)
8407@findex gnus-kill-sticky-article-buffer
8408Kills this sticky article buffer.
8409@end table
8410
8411To kill all sticky article buffers you can use:
8412
8413@defun gnus-kill-sticky-article-buffers ARG
8414Kill all sticky article buffers.
8415If a prefix ARG is given, ask for confirmation.
8416@end defun
4009494e
GM
8417
8418@node Article Backlog
8419@section Article Backlog
8420@cindex backlog
8421@cindex article backlog
8422
8423If you have a slow connection, but the idea of using caching seems
8424unappealing to you (and it is, really), you can help the situation some
8425by switching on the @dfn{backlog}. This is where Gnus will buffer
8426already read articles so that it doesn't have to re-fetch articles
8427you've already read. This only helps if you are in the habit of
8428re-selecting articles you've recently read, of course. If you never do
8429that, turning the backlog on will slow Gnus down a little bit, and
8430increase memory usage some.
8431
8432@vindex gnus-keep-backlog
8433If you set @code{gnus-keep-backlog} to a number @var{n}, Gnus will store
8434at most @var{n} old articles in a buffer for later re-fetching. If this
8435variable is non-@code{nil} and is not a number, Gnus will store
8436@emph{all} read articles, which means that your Emacs will grow without
8437bound before exploding and taking your machine down with you. I put
8438that in there just to keep y'all on your toes.
8439
8440The default value is 20.
8441
8442
8443@node Saving Articles
8444@section Saving Articles
8445@cindex saving articles
8446
8447Gnus can save articles in a number of ways. Below is the documentation
8448for saving articles in a fairly straight-forward fashion (i.e., little
8449processing of the article is done before it is saved). For a different
8450approach (uudecoding, unsharing) you should use @code{gnus-uu}
8451(@pxref{Decoding Articles}).
8452
8453For the commands listed here, the target is a file. If you want to
8454save to a group, see the @kbd{B c} (@code{gnus-summary-copy-article})
8455command (@pxref{Mail Group Commands}).
8456
8457@vindex gnus-save-all-headers
8458If @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not delete
8459unwanted headers before saving the article.
8460
8461@vindex gnus-saved-headers
8462If the preceding variable is @code{nil}, all headers that match the
8463@code{gnus-saved-headers} regexp will be kept, while the rest will be
8464deleted before saving.
8465
8466@table @kbd
8467
8468@item O o
8469@itemx o
8470@kindex O o (Summary)
8471@kindex o (Summary)
8472@findex gnus-summary-save-article
8473@c @icon{gnus-summary-save-article}
8474Save the current article using the default article saver
8475(@code{gnus-summary-save-article}).
8476
8477@item O m
8478@kindex O m (Summary)
8479@findex gnus-summary-save-article-mail
8480Save the current article in a Unix mail box (mbox) file
8481(@code{gnus-summary-save-article-mail}).
8482
8483@item O r
8484@kindex O r (Summary)
8485@findex gnus-summary-save-article-rmail
8486Save the current article in Rmail format
8487(@code{gnus-summary-save-article-rmail}).
8488
8489@item O f
8490@kindex O f (Summary)
8491@findex gnus-summary-save-article-file
8492@c @icon{gnus-summary-save-article-file}
8493Save the current article in plain file format
8494(@code{gnus-summary-save-article-file}).
8495
8496@item O F
8497@kindex O F (Summary)
8498@findex gnus-summary-write-article-file
8499Write the current article in plain file format, overwriting any previous
8500file contents (@code{gnus-summary-write-article-file}).
8501
8502@item O b
8503@kindex O b (Summary)
8504@findex gnus-summary-save-article-body-file
8505Save the current article body in plain file format
8506(@code{gnus-summary-save-article-body-file}).
8507
8508@item O h
8509@kindex O h (Summary)
8510@findex gnus-summary-save-article-folder
8511Save the current article in mh folder format
8512(@code{gnus-summary-save-article-folder}).
8513
8514@item O v
8515@kindex O v (Summary)
8516@findex gnus-summary-save-article-vm
8517Save the current article in a VM folder
8518(@code{gnus-summary-save-article-vm}).
8519
8520@item O p
8521@itemx |
8522@kindex O p (Summary)
8523@kindex | (Summary)
8524@findex gnus-summary-pipe-output
89167438 8525@vindex gnus-summary-pipe-output-default-command
4009494e
GM
8526Save the current article in a pipe. Uhm, like, what I mean is---Pipe
8527the current article to a process (@code{gnus-summary-pipe-output}).
8528If given a symbolic prefix (@pxref{Symbolic Prefixes}), include the
6ecfe5c2
MB
8529complete headers in the piped output. The symbolic prefix @code{r} is
8530special; it lets this command pipe a raw article including all headers.
8531The @code{gnus-summary-pipe-output-default-command} variable can be set
8532to a string containing the default command and options (default
8533@code{nil}).
4009494e
GM
8534
8535@item O P
8536@kindex O P (Summary)
8537@findex gnus-summary-muttprint
8538@vindex gnus-summary-muttprint-program
8539Save the current article into muttprint. That is, print it using the
8540external program @uref{http://muttprint.sourceforge.net/,
8541Muttprint}. The program name and options to use is controlled by the
8542variable @code{gnus-summary-muttprint-program}.
8543(@code{gnus-summary-muttprint}).
8544
8545@end table
8546
8547@vindex gnus-prompt-before-saving
8548All these commands use the process/prefix convention
8549(@pxref{Process/Prefix}). If you save bunches of articles using these
8550functions, you might get tired of being prompted for files to save each
8551and every article in. The prompting action is controlled by
8552the @code{gnus-prompt-before-saving} variable, which is @code{always} by
8553default, giving you that excessive prompting action you know and
8554loathe. If you set this variable to @code{t} instead, you'll be prompted
8555just once for each series of articles you save. If you like to really
8556have Gnus do all your thinking for you, you can even set this variable
8557to @code{nil}, which means that you will never be prompted for files to
8558save articles in. Gnus will simply save all the articles in the default
8559files.
8560
8561
8562@vindex gnus-default-article-saver
8563You can customize the @code{gnus-default-article-saver} variable to make
8564Gnus do what you want it to. You can use any of the eight ready-made
8565functions below, or you can create your own.
8566
8567@table @code
8568
8569@item gnus-summary-save-in-rmail
8570@findex gnus-summary-save-in-rmail
8571@vindex gnus-rmail-save-name
8572@findex gnus-plain-save-name
8573This is the default format, @dfn{Babyl}. Uses the function in the
8574@code{gnus-rmail-save-name} variable to get a file name to save the
8575article in. The default is @code{gnus-plain-save-name}.
8576
8577@item gnus-summary-save-in-mail
8578@findex gnus-summary-save-in-mail
8579@vindex gnus-mail-save-name
8580Save in a Unix mail (mbox) file. Uses the function in the
8581@code{gnus-mail-save-name} variable to get a file name to save the
8582article in. The default is @code{gnus-plain-save-name}.
8583
8584@item gnus-summary-save-in-file
8585@findex gnus-summary-save-in-file
8586@vindex gnus-file-save-name
8587@findex gnus-numeric-save-name
8588Append the article straight to an ordinary file. Uses the function in
8589the @code{gnus-file-save-name} variable to get a file name to save the
8590article in. The default is @code{gnus-numeric-save-name}.
8591
8592@item gnus-summary-write-to-file
8593@findex gnus-summary-write-to-file
8594Write the article straight to an ordinary file. The file is
8595overwritten if it exists. Uses the function in the
8596@code{gnus-file-save-name} variable to get a file name to save the
8597article in. The default is @code{gnus-numeric-save-name}.
8598
8599@item gnus-summary-save-body-in-file
8600@findex gnus-summary-save-body-in-file
8601Append the article body to an ordinary file. Uses the function in the
8602@code{gnus-file-save-name} variable to get a file name to save the
8603article in. The default is @code{gnus-numeric-save-name}.
8604
8605@item gnus-summary-write-body-to-file
8606@findex gnus-summary-write-body-to-file
8607Write the article body straight to an ordinary file. The file is
8608overwritten if it exists. Uses the function in the
8609@code{gnus-file-save-name} variable to get a file name to save the
8610article in. The default is @code{gnus-numeric-save-name}.
8611
8612@item gnus-summary-save-in-folder
8613@findex gnus-summary-save-in-folder
8614@findex gnus-folder-save-name
8615@findex gnus-Folder-save-name
8616@vindex gnus-folder-save-name
8617@cindex rcvstore
8618@cindex MH folders
8619Save the article to an MH folder using @code{rcvstore} from the MH
8620library. Uses the function in the @code{gnus-folder-save-name} variable
8621to get a file name to save the article in. The default is
8622@code{gnus-folder-save-name}, but you can also use
8623@code{gnus-Folder-save-name}, which creates capitalized names.
8624
8625@item gnus-summary-save-in-vm
8626@findex gnus-summary-save-in-vm
8627Save the article in a VM folder. You have to have the VM mail
8628reader to use this setting.
89167438
MB
8629
8630@item gnus-summary-save-in-pipe
8631@findex gnus-summary-save-in-pipe
d62672f3
MB
8632Pipe the article to a shell command. This function takes optional two
8633arguments COMMAND and RAW. Valid values for COMMAND include:
8634
8635@itemize @bullet
8636@item a string@*
8637The executable command name and possibly arguments.
8638@item @code{nil}@*
8639You will be prompted for the command in the minibuffer.
8640@item the symbol @code{default}@*
8641It will be replaced with the command which the variable
8642@code{gnus-summary-pipe-output-default-command} holds or the command
8643last used for saving.
8644@end itemize
8645
8646Non-@code{nil} value for RAW overrides @code{:decode} and
8647@code{:headers} properties (see below) and the raw article including all
8648headers will be piped.
4009494e
GM
8649@end table
8650
8651The symbol of each function may have the following properties:
8652
8653@table @code
8654@item :decode
8655The value non-@code{nil} means save decoded articles. This is
8656meaningful only with @code{gnus-summary-save-in-file},
8657@code{gnus-summary-save-body-in-file},
89167438
MB
8658@code{gnus-summary-write-to-file},
8659@code{gnus-summary-write-body-to-file}, and
8660@code{gnus-summary-save-in-pipe}.
4009494e
GM
8661
8662@item :function
8663The value specifies an alternative function which appends, not
8664overwrites, articles to a file. This implies that when saving many
8665articles at a time, @code{gnus-prompt-before-saving} is bound to
8666@code{t} and all articles are saved in a single file. This is
8667meaningful only with @code{gnus-summary-write-to-file} and
8668@code{gnus-summary-write-body-to-file}.
8669
8670@item :headers
8671The value specifies the symbol of a variable of which the value
8672specifies headers to be saved. If it is omitted,
8673@code{gnus-save-all-headers} and @code{gnus-saved-headers} control what
8674headers should be saved.
8675@end table
8676
8677@vindex gnus-article-save-directory
8678All of these functions, except for the last one, will save the article
8679in the @code{gnus-article-save-directory}, which is initialized from the
8680@env{SAVEDIR} environment variable. This is @file{~/News/} by
8681default.
8682
8683As you can see above, the functions use different functions to find a
8684suitable name of a file to save the article in. Below is a list of
8685available functions that generate names:
8686
8687@table @code
8688
8689@item gnus-Numeric-save-name
8690@findex gnus-Numeric-save-name
8691File names like @file{~/News/Alt.andrea-dworkin/45}.
8692
8693@item gnus-numeric-save-name
8694@findex gnus-numeric-save-name
8695File names like @file{~/News/alt.andrea-dworkin/45}.
8696
8697@item gnus-Plain-save-name
8698@findex gnus-Plain-save-name
8699File names like @file{~/News/Alt.andrea-dworkin}.
8700
8701@item gnus-plain-save-name
8702@findex gnus-plain-save-name
8703File names like @file{~/News/alt.andrea-dworkin}.
8704
8705@item gnus-sender-save-name
8706@findex gnus-sender-save-name
8707File names like @file{~/News/larsi}.
8708@end table
8709
8710@vindex gnus-split-methods
8711You can have Gnus suggest where to save articles by plonking a regexp into
8712the @code{gnus-split-methods} alist. For instance, if you would like to
8713save articles related to Gnus in the file @file{gnus-stuff}, and articles
8714related to VM in @file{vm-stuff}, you could set this variable to something
8715like:
8716
8717@lisp
8718(("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff")
8719 ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff")
8720 (my-choosing-function "../other-dir/my-stuff")
8721 ((equal gnus-newsgroup-name "mail.misc") "mail-stuff"))
8722@end lisp
8723
8724We see that this is a list where each element is a list that has two
8725elements---the @dfn{match} and the @dfn{file}. The match can either be
8726a string (in which case it is used as a regexp to match on the article
8727head); it can be a symbol (which will be called as a function with the
8728group name as a parameter); or it can be a list (which will be
8729@code{eval}ed). If any of these actions have a non-@code{nil} result,
8730the @dfn{file} will be used as a default prompt. In addition, the
8731result of the operation itself will be used if the function or form
8732called returns a string or a list of strings.
8733
8734You basically end up with a list of file names that might be used when
8735saving the current article. (All ``matches'' will be used.) You will
8736then be prompted for what you really want to use as a name, with file
8737name completion over the results from applying this variable.
8738
8739This variable is @code{((gnus-article-archive-name))} by default, which
8740means that Gnus will look at the articles it saves for an
8741@code{Archive-name} line and use that as a suggestion for the file
8742name.
8743
8744Here's an example function to clean up file names somewhat. If you have
8745lots of mail groups called things like
8746@samp{nnml:mail.whatever}, you may want to chop off the beginning of
8747these group names before creating the file name to save to. The
8748following will do just that:
8749
8750@lisp
8751(defun my-save-name (group)
8752 (when (string-match "^nnml:mail." group)
8753 (substring group (match-end 0))))
8754
8755(setq gnus-split-methods
8756 '((gnus-article-archive-name)
8757 (my-save-name)))
8758@end lisp
8759
8760
8761@vindex gnus-use-long-file-name
8762Finally, you have the @code{gnus-use-long-file-name} variable. If it is
8763@code{nil}, all the preceding functions will replace all periods
8764(@samp{.}) in the group names with slashes (@samp{/})---which means that
8765the functions will generate hierarchies of directories instead of having
8766all the files in the top level directory
8767(@file{~/News/alt/andrea-dworkin} instead of
8768@file{~/News/alt.andrea-dworkin}.) This variable is @code{t} by default
8769on most systems. However, for historical reasons, this is @code{nil} on
8770Xenix and usg-unix-v machines by default.
8771
8772This function also affects kill and score file names. If this variable
8773is a list, and the list contains the element @code{not-score}, long file
8774names will not be used for score files, if it contains the element
8775@code{not-save}, long file names will not be used for saving, and if it
8776contains the element @code{not-kill}, long file names will not be used
8777for kill files.
8778
8779If you'd like to save articles in a hierarchy that looks something like
8780a spool, you could
8781
8782@lisp
8783(setq gnus-use-long-file-name '(not-save)) ; @r{to get a hierarchy}
8784(setq gnus-default-article-saver
8785 'gnus-summary-save-in-file) ; @r{no encoding}
8786@end lisp
8787
8788Then just save with @kbd{o}. You'd then read this hierarchy with
8789ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and
8790the top level directory as the argument (@file{~/News/}). Then just walk
8791around to the groups/directories with @code{nneething}.
8792
8793
8794@node Decoding Articles
8795@section Decoding Articles
8796@cindex decoding articles
8797
8798Sometime users post articles (or series of articles) that have been
8799encoded in some way or other. Gnus can decode them for you.
8800
8801@menu
8802* Uuencoded Articles:: Uudecode articles.
8803* Shell Archives:: Unshar articles.
8804* PostScript Files:: Split PostScript.
8805* Other Files:: Plain save and binhex.
8806* Decoding Variables:: Variables for a happy decoding.
8807* Viewing Files:: You want to look at the result of the decoding?
8808@end menu
8809
8810@cindex series
8811@cindex article series
8812All these functions use the process/prefix convention
8813(@pxref{Process/Prefix}) for finding out what articles to work on, with
8814the extension that a ``single article'' means ``a single series''. Gnus
8815can find out by itself what articles belong to a series, decode all the
8816articles and unpack/view/save the resulting file(s).
8817
8818Gnus guesses what articles are in the series according to the following
8819simplish rule: The subjects must be (nearly) identical, except for the
8820last two numbers of the line. (Spaces are largely ignored, however.)
8821
8822For example: If you choose a subject called @samp{cat.gif (2/3)}, Gnus
8823will find all the articles that match the regexp @samp{^cat.gif
8824([0-9]+/[0-9]+).*$}.
8825
8826Subjects that are non-standard, like @samp{cat.gif (2/3) Part 6 of a
8827series}, will not be properly recognized by any of the automatic viewing
8828commands, and you have to mark the articles manually with @kbd{#}.
8829
8830
8831@node Uuencoded Articles
8832@subsection Uuencoded Articles
8833@cindex uudecode
8834@cindex uuencoded articles
8835
8836@table @kbd
8837
8838@item X u
8839@kindex X u (Summary)
8840@findex gnus-uu-decode-uu
8841@c @icon{gnus-uu-decode-uu}
8842Uudecodes the current series (@code{gnus-uu-decode-uu}).
8843
8844@item X U
8845@kindex X U (Summary)
8846@findex gnus-uu-decode-uu-and-save
8847Uudecodes and saves the current series
8848(@code{gnus-uu-decode-uu-and-save}).
8849
8850@item X v u
8851@kindex X v u (Summary)
8852@findex gnus-uu-decode-uu-view
8853Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}).
8854
8855@item X v U
8856@kindex X v U (Summary)
8857@findex gnus-uu-decode-uu-and-save-view
8858Uudecodes, views and saves the current series
8859(@code{gnus-uu-decode-uu-and-save-view}).
8860
8861@end table
8862
8863Remember that these all react to the presence of articles marked with
8864the process mark. If, for instance, you'd like to decode and save an
8865entire newsgroup, you'd typically do @kbd{M P a}
8866(@code{gnus-uu-mark-all}) and then @kbd{X U}
8867(@code{gnus-uu-decode-uu-and-save}).
8868
8869All this is very much different from how @code{gnus-uu} worked with
8870@sc{gnus 4.1}, where you had explicit keystrokes for everything under
8871the sun. This version of @code{gnus-uu} generally assumes that you mark
8872articles in some way (@pxref{Setting Process Marks}) and then press
8873@kbd{X u}.
8874
8875@vindex gnus-uu-notify-files
8876Note: When trying to decode articles that have names matching
8877@code{gnus-uu-notify-files}, which is hard-coded to
8878@samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will
8879automatically post an article on @samp{comp.unix.wizards} saying that
8880you have just viewed the file in question. This feature can't be turned
8881off.
8882
8883
8884@node Shell Archives
8885@subsection Shell Archives
8886@cindex unshar
8887@cindex shell archives
8888@cindex shared articles
8889
8890Shell archives (``shar files'') used to be a popular way to distribute
8891sources, but it isn't used all that much today. In any case, we have
8892some commands to deal with these:
8893
8894@table @kbd
8895
8896@item X s
8897@kindex X s (Summary)
8898@findex gnus-uu-decode-unshar
8899Unshars the current series (@code{gnus-uu-decode-unshar}).
8900
8901@item X S
8902@kindex X S (Summary)
8903@findex gnus-uu-decode-unshar-and-save
8904Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}).
8905
8906@item X v s
8907@kindex X v s (Summary)
8908@findex gnus-uu-decode-unshar-view
8909Unshars and views the current series (@code{gnus-uu-decode-unshar-view}).
8910
8911@item X v S
8912@kindex X v S (Summary)
8913@findex gnus-uu-decode-unshar-and-save-view
8914Unshars, views and saves the current series
8915(@code{gnus-uu-decode-unshar-and-save-view}).
8916@end table
8917
8918
8919@node PostScript Files
8920@subsection PostScript Files
8921@cindex PostScript
8922
8923@table @kbd
8924
8925@item X p
8926@kindex X p (Summary)
8927@findex gnus-uu-decode-postscript
8928Unpack the current PostScript series (@code{gnus-uu-decode-postscript}).
8929
8930@item X P
8931@kindex X P (Summary)
8932@findex gnus-uu-decode-postscript-and-save
8933Unpack and save the current PostScript series
8934(@code{gnus-uu-decode-postscript-and-save}).
8935
8936@item X v p
8937@kindex X v p (Summary)
8938@findex gnus-uu-decode-postscript-view
8939View the current PostScript series
8940(@code{gnus-uu-decode-postscript-view}).
8941
8942@item X v P
8943@kindex X v P (Summary)
8944@findex gnus-uu-decode-postscript-and-save-view
8945View and save the current PostScript series
8946(@code{gnus-uu-decode-postscript-and-save-view}).
8947@end table
8948
8949
8950@node Other Files
8951@subsection Other Files
8952
8953@table @kbd
8954@item X o
8955@kindex X o (Summary)
8956@findex gnus-uu-decode-save
8957Save the current series
8958(@code{gnus-uu-decode-save}).
8959
8960@item X b
8961@kindex X b (Summary)
8962@findex gnus-uu-decode-binhex
8963Unbinhex the current series (@code{gnus-uu-decode-binhex}). This
8964doesn't really work yet.
b890d447
MB
8965
8966@item X Y
8967@kindex X Y (Summary)
8968@findex gnus-uu-decode-yenc
8969yEnc-decode the current series and save it (@code{gnus-uu-decode-yenc}).
4009494e
GM
8970@end table
8971
8972
8973@node Decoding Variables
8974@subsection Decoding Variables
8975
8976Adjective, not verb.
8977
8978@menu
8979* Rule Variables:: Variables that say how a file is to be viewed.
8980* Other Decode Variables:: Other decode variables.
8981* Uuencoding and Posting:: Variables for customizing uuencoding.
8982@end menu
8983
8984
8985@node Rule Variables
8986@subsubsection Rule Variables
8987@cindex rule variables
8988
8989Gnus uses @dfn{rule variables} to decide how to view a file. All these
8990variables are of the form
8991
8992@lisp
8993 (list '(regexp1 command2)
8994 '(regexp2 command2)
8995 ...)
8996@end lisp
8997
8998@table @code
8999
9000@item gnus-uu-user-view-rules
9001@vindex gnus-uu-user-view-rules
9002@cindex sox
9003This variable is consulted first when viewing files. If you wish to use,
9004for instance, @code{sox} to convert an @file{.au} sound file, you could
9005say something like:
9006@lisp
9007(setq gnus-uu-user-view-rules
9008 (list '("\\\\.au$" "sox %s -t .aiff > /dev/audio")))
9009@end lisp
9010
9011@item gnus-uu-user-view-rules-end
9012@vindex gnus-uu-user-view-rules-end
9013This variable is consulted if Gnus couldn't make any matches from the
9014user and default view rules.
9015
9016@item gnus-uu-user-archive-rules
9017@vindex gnus-uu-user-archive-rules
9018This variable can be used to say what commands should be used to unpack
9019archives.
9020@end table
9021
9022
9023@node Other Decode Variables
9024@subsubsection Other Decode Variables
9025
9026@table @code
9027@vindex gnus-uu-grabbed-file-functions
9028
9029@item gnus-uu-grabbed-file-functions
9030All functions in this list will be called right after each file has been
9031successfully decoded---so that you can move or view files right away,
9032and don't have to wait for all files to be decoded before you can do
9033anything. Ready-made functions you can put in this list are:
9034
9035@table @code
9036
9037@item gnus-uu-grab-view
9038@findex gnus-uu-grab-view
9039View the file.
9040
9041@item gnus-uu-grab-move
9042@findex gnus-uu-grab-move
9043Move the file (if you're using a saving function.)
9044@end table
9045
9046@item gnus-uu-be-dangerous
9047@vindex gnus-uu-be-dangerous
9048Specifies what to do if unusual situations arise during decoding. If
9049@code{nil}, be as conservative as possible. If @code{t}, ignore things
9050that didn't work, and overwrite existing files. Otherwise, ask each
9051time.
9052
9053@item gnus-uu-ignore-files-by-name
9054@vindex gnus-uu-ignore-files-by-name
9055Files with name matching this regular expression won't be viewed.
9056
9057@item gnus-uu-ignore-files-by-type
9058@vindex gnus-uu-ignore-files-by-type
9059Files with a @acronym{MIME} type matching this variable won't be viewed.
9060Note that Gnus tries to guess what type the file is based on the name.
9061@code{gnus-uu} is not a @acronym{MIME} package (yet), so this is slightly
9062kludgey.
9063
9064@item gnus-uu-tmp-dir
9065@vindex gnus-uu-tmp-dir
9066Where @code{gnus-uu} does its work.
9067
9068@item gnus-uu-do-not-unpack-archives
9069@vindex gnus-uu-do-not-unpack-archives
9070Non-@code{nil} means that @code{gnus-uu} won't peek inside archives
9071looking for files to display.
9072
9073@item gnus-uu-view-and-save
9074@vindex gnus-uu-view-and-save
9075Non-@code{nil} means that the user will always be asked to save a file
9076after viewing it.
9077
9078@item gnus-uu-ignore-default-view-rules
9079@vindex gnus-uu-ignore-default-view-rules
9080Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing
9081rules.
9082
9083@item gnus-uu-ignore-default-archive-rules
9084@vindex gnus-uu-ignore-default-archive-rules
9085Non-@code{nil} means that @code{gnus-uu} will ignore the default archive
9086unpacking commands.
9087
9088@item gnus-uu-kill-carriage-return
9089@vindex gnus-uu-kill-carriage-return
9090Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns
9091from articles.
9092
9093@item gnus-uu-unmark-articles-not-decoded
9094@vindex gnus-uu-unmark-articles-not-decoded
9095Non-@code{nil} means that @code{gnus-uu} will mark unsuccessfully
9096decoded articles as unread.
9097
9098@item gnus-uu-correct-stripped-uucode
9099@vindex gnus-uu-correct-stripped-uucode
9100Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix
9101uuencoded files that have had trailing spaces deleted.
9102
9103@item gnus-uu-pre-uudecode-hook
9104@vindex gnus-uu-pre-uudecode-hook
9105Hook run before sending a message to @code{uudecode}.
9106
9107@item gnus-uu-view-with-metamail
9108@vindex gnus-uu-view-with-metamail
9109@cindex metamail
9110Non-@code{nil} means that @code{gnus-uu} will ignore the viewing
9111commands defined by the rule variables and just fudge a @acronym{MIME}
9112content type based on the file name. The result will be fed to
9113@code{metamail} for viewing.
9114
9115@item gnus-uu-save-in-digest
9116@vindex gnus-uu-save-in-digest
9117Non-@code{nil} means that @code{gnus-uu}, when asked to save without
9118decoding, will save in digests. If this variable is @code{nil},
9119@code{gnus-uu} will just save everything in a file without any
9120embellishments. The digesting almost conforms to RFC 1153---no easy way
9121to specify any meaningful volume and issue numbers were found, so I
9122simply dropped them.
9123
9124@end table
9125
9126
9127@node Uuencoding and Posting
9128@subsubsection Uuencoding and Posting
9129
9130@table @code
9131
9132@item gnus-uu-post-include-before-composing
9133@vindex gnus-uu-post-include-before-composing
9134Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode
9135before you compose the article. If this variable is @code{t}, you can
9136either include an encoded file with @kbd{C-c C-i} or have one included
9137for you when you post the article.
9138
9139@item gnus-uu-post-length
9140@vindex gnus-uu-post-length
9141Maximum length of an article. The encoded file will be split into how
9142many articles it takes to post the entire file.
9143
9144@item gnus-uu-post-threaded
9145@vindex gnus-uu-post-threaded
9146Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a
9147thread. This may not be smart, as no other decoder I have seen is able
9148to follow threads when collecting uuencoded articles. (Well, I have
9149seen one package that does that---@code{gnus-uu}, but somehow, I don't
9150think that counts@dots{}) Default is @code{nil}.
9151
9152@item gnus-uu-post-separate-description
9153@vindex gnus-uu-post-separate-description
9154Non-@code{nil} means that the description will be posted in a separate
9155article. The first article will typically be numbered (0/x). If this
9156variable is @code{nil}, the description the user enters will be included
9157at the beginning of the first article, which will be numbered (1/x).
9158Default is @code{t}.
9159
9160@end table
9161
9162
9163@node Viewing Files
9164@subsection Viewing Files
9165@cindex viewing files
9166@cindex pseudo-articles
9167
9168After decoding, if the file is some sort of archive, Gnus will attempt
9169to unpack the archive and see if any of the files in the archive can be
9170viewed. For instance, if you have a gzipped tar file @file{pics.tar.gz}
9171containing the files @file{pic1.jpg} and @file{pic2.gif}, Gnus will
9172uncompress and de-tar the main file, and then view the two pictures.
9173This unpacking process is recursive, so if the archive contains archives
9174of archives, it'll all be unpacked.
9175
9176Finally, Gnus will normally insert a @dfn{pseudo-article} for each
9177extracted file into the summary buffer. If you go to these
9178``articles'', you will be prompted for a command to run (usually Gnus
9179will make a suggestion), and then the command will be run.
9180
9181@vindex gnus-view-pseudo-asynchronously
9182If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait
9183until the viewing is done before proceeding.
9184
9185@vindex gnus-view-pseudos
9186If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert
9187the pseudo-articles into the summary buffer, but view them
9188immediately. If this variable is @code{not-confirm}, the user won't even
9189be asked for a confirmation before viewing is done.
9190
9191@vindex gnus-view-pseudos-separately
9192If @code{gnus-view-pseudos-separately} is non-@code{nil}, one
9193pseudo-article will be created for each file to be viewed. If
9194@code{nil}, all files that use the same viewing command will be given as
9195a list of parameters to that command.
9196
9197@vindex gnus-insert-pseudo-articles
9198If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert
9199pseudo-articles when decoding. It is @code{t} by default.
9200
9201So; there you are, reading your @emph{pseudo-articles} in your
9202@emph{virtual newsgroup} from the @emph{virtual server}; and you think:
9203Why isn't anything real anymore? How did we get here?
9204
9205
9206@node Article Treatment
9207@section Article Treatment
9208
9209Reading through this huge manual, you may have quite forgotten that the
9210object of newsreaders is to actually, like, read what people have
9211written. Reading articles. Unfortunately, people are quite bad at
9212writing, so there are tons of functions and variables to make reading
9213these articles easier.
9214
9215@menu
9216* Article Highlighting:: You want to make the article look like fruit salad.
9217* Article Fontisizing:: Making emphasized text look nice.
9218* Article Hiding:: You also want to make certain info go away.
9219* Article Washing:: Lots of way-neat functions to make life better.
9220* Article Header:: Doing various header transformations.
9221* Article Buttons:: Click on URLs, Message-IDs, addresses and the like.
9222* Article Button Levels:: Controlling appearance of buttons.
9223* Article Date:: Grumble, UT!
9224* Article Display:: Display various stuff---X-Face, Picons, Smileys
9225* Article Signature:: What is a signature?
9226* Article Miscellanea:: Various other stuff.
9227@end menu
9228
9229
9230@node Article Highlighting
9231@subsection Article Highlighting
9232@cindex highlighting
9233
9234Not only do you want your article buffer to look like fruit salad, but
9235you want it to look like technicolor fruit salad.
9236
9237@table @kbd
9238
9239@item W H a
9240@kindex W H a (Summary)
9241@findex gnus-article-highlight
9242@findex gnus-article-maybe-highlight
9243Do much highlighting of the current article
9244(@code{gnus-article-highlight}). This function highlights header, cited
9245text, the signature, and adds buttons to the body and the head.
9246
9247@item W H h
9248@kindex W H h (Summary)
9249@findex gnus-article-highlight-headers
9250@vindex gnus-header-face-alist
9251Highlight the headers (@code{gnus-article-highlight-headers}). The
9252highlighting will be done according to the @code{gnus-header-face-alist}
9253variable, which is a list where each element has the form
9254@code{(@var{regexp} @var{name} @var{content})}.
9255@var{regexp} is a regular expression for matching the
9256header, @var{name} is the face used for highlighting the header name
9257(@pxref{Faces and Fonts}) and @var{content} is the face for highlighting
9258the header value. The first match made will be used. Note that
9259@var{regexp} shouldn't have @samp{^} prepended---Gnus will add one.
9260
9261@item W H c
9262@kindex W H c (Summary)
9263@findex gnus-article-highlight-citation
9264Highlight cited text (@code{gnus-article-highlight-citation}).
9265
9266Some variables to customize the citation highlights:
9267
9268@table @code
9269@vindex gnus-cite-parse-max-size
9270
9271@item gnus-cite-parse-max-size
9272If the article size in bytes is bigger than this variable (which is
927325000 by default), no citation highlighting will be performed.
9274
9275@item gnus-cite-max-prefix
9276@vindex gnus-cite-max-prefix
9277Maximum possible length for a citation prefix (default 20).
9278
9279@item gnus-cite-face-list
9280@vindex gnus-cite-face-list
9281List of faces used for highlighting citations (@pxref{Faces and Fonts}).
9282When there are citations from multiple articles in the same message,
9283Gnus will try to give each citation from each article its own face.
9284This should make it easier to see who wrote what.
9285
9286@item gnus-supercite-regexp
9287@vindex gnus-supercite-regexp
9288Regexp matching normal Supercite attribution lines.
9289
9290@item gnus-supercite-secondary-regexp
9291@vindex gnus-supercite-secondary-regexp
9292Regexp matching mangled Supercite attribution lines.
9293
9294@item gnus-cite-minimum-match-count
9295@vindex gnus-cite-minimum-match-count
9296Minimum number of identical prefixes we have to see before we believe
9297that it's a citation.
9298
9299@item gnus-cite-attribution-prefix
9300@vindex gnus-cite-attribution-prefix
9301Regexp matching the beginning of an attribution line.
9302
9303@item gnus-cite-attribution-suffix
9304@vindex gnus-cite-attribution-suffix
9305Regexp matching the end of an attribution line.
9306
9307@item gnus-cite-attribution-face
9308@vindex gnus-cite-attribution-face
9309Face used for attribution lines. It is merged with the face for the
9310cited text belonging to the attribution.
9311
9312@item gnus-cite-ignore-quoted-from
9313@vindex gnus-cite-ignore-quoted-from
9314If non-@code{nil}, no citation highlighting will be performed on lines
9315beginning with @samp{>From }. Those lines may have been quoted by MTAs
9316in order not to mix up with the envelope From line. The default value
9317is @code{t}.
9318
9319@end table
9320
9321
9322@item W H s
9323@kindex W H s (Summary)
9324@vindex gnus-signature-separator
9325@vindex gnus-signature-face
9326@findex gnus-article-highlight-signature
9327Highlight the signature (@code{gnus-article-highlight-signature}).
9328Everything after @code{gnus-signature-separator} (@pxref{Article
9329Signature}) in an article will be considered a signature and will be
9330highlighted with @code{gnus-signature-face}, which is @code{italic} by
9331default.
9332
9333@end table
9334
9335@xref{Customizing Articles}, for how to highlight articles automatically.
9336
9337
9338@node Article Fontisizing
9339@subsection Article Fontisizing
9340@cindex emphasis
9341@cindex article emphasis
9342
9343@findex gnus-article-emphasize
9344@kindex W e (Summary)
9345People commonly add emphasis to words in news articles by writing things
9346like @samp{_this_} or @samp{*this*} or @samp{/this/}. Gnus can make
9347this look nicer by running the article through the @kbd{W e}
9348(@code{gnus-article-emphasize}) command.
9349
9350@vindex gnus-emphasis-alist
9351How the emphasis is computed is controlled by the
9352@code{gnus-emphasis-alist} variable. This is an alist where the first
9353element is a regular expression to be matched. The second is a number
9354that says what regular expression grouping is used to find the entire
9355emphasized word. The third is a number that says what regexp grouping
9356should be displayed and highlighted. (The text between these two
9357groupings will be hidden.) The fourth is the face used for
9358highlighting.
9359
9360@lisp
9361(setq gnus-emphasis-alist
9362 '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline)
9363 ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold)))
9364@end lisp
9365
9366@cindex slash
9367@cindex asterisk
9368@cindex underline
9369@cindex /
9370@cindex *
9371
9372@vindex gnus-emphasis-underline
9373@vindex gnus-emphasis-bold
9374@vindex gnus-emphasis-italic
9375@vindex gnus-emphasis-underline-bold
9376@vindex gnus-emphasis-underline-italic
9377@vindex gnus-emphasis-bold-italic
9378@vindex gnus-emphasis-underline-bold-italic
9379By default, there are seven rules, and they use the following faces:
9380@code{gnus-emphasis-bold}, @code{gnus-emphasis-italic},
9381@code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic},
9382@code{gnus-emphasis-underline-italic},
9383@code{gnus-emphasis-underline-bold}, and
9384@code{gnus-emphasis-underline-bold-italic}.
9385
9386If you want to change these faces, you can either use @kbd{M-x
9387customize}, or you can use @code{copy-face}. For instance, if you want
9388to make @code{gnus-emphasis-italic} use a red face instead, you could
9389say something like:
9390
9391@lisp
9392(copy-face 'red 'gnus-emphasis-italic)
9393@end lisp
9394
9395@vindex gnus-group-highlight-words-alist
9396
9397If you want to highlight arbitrary words, you can use the
9398@code{gnus-group-highlight-words-alist} variable, which uses the same
9399syntax as @code{gnus-emphasis-alist}. The @code{highlight-words} group
9400parameter (@pxref{Group Parameters}) can also be used.
9401
9402@xref{Customizing Articles}, for how to fontize articles automatically.
9403
9404
9405@node Article Hiding
9406@subsection Article Hiding
9407@cindex article hiding
9408
9409Or rather, hiding certain things in each article. There usually is much
9410too much cruft in most articles.
9411
9412@table @kbd
9413
9414@item W W a
9415@kindex W W a (Summary)
9416@findex gnus-article-hide
9417Do quite a lot of hiding on the article buffer
9418(@kbd{gnus-article-hide}). In particular, this function will hide
9419headers, @acronym{PGP}, cited text and the signature.
9420
9421@item W W h
9422@kindex W W h (Summary)
9423@findex gnus-article-hide-headers
9424Hide headers (@code{gnus-article-hide-headers}). @xref{Hiding
9425Headers}.
9426
9427@item W W b
9428@kindex W W b (Summary)
9429@findex gnus-article-hide-boring-headers
9430Hide headers that aren't particularly interesting
9431(@code{gnus-article-hide-boring-headers}). @xref{Hiding Headers}.
9432
9433@item W W s
9434@kindex W W s (Summary)
9435@findex gnus-article-hide-signature
9436Hide signature (@code{gnus-article-hide-signature}). @xref{Article
9437Signature}.
9438
9439@item W W l
9440@kindex W W l (Summary)
9441@findex gnus-article-hide-list-identifiers
9442@vindex gnus-list-identifiers
9443Strip list identifiers specified in @code{gnus-list-identifiers}. These
9444are strings some mailing list servers add to the beginning of all
9445@code{Subject} headers---for example, @samp{[zebra 4711]}. Any leading
9446@samp{Re: } is skipped before stripping. @code{gnus-list-identifiers}
9447may not contain @code{\\(..\\)}.
9448
9449@table @code
9450
9451@item gnus-list-identifiers
9452@vindex gnus-list-identifiers
9453A regular expression that matches list identifiers to be removed from
9454subject. This can also be a list of regular expressions.
9455
9456@end table
9457
9458@item W W P
9459@kindex W W P (Summary)
9460@findex gnus-article-hide-pem
9461Hide @acronym{PEM} (privacy enhanced messages) cruft
9462(@code{gnus-article-hide-pem}).
9463
9464@item W W B
9465@kindex W W B (Summary)
9466@findex gnus-article-strip-banner
9467@vindex gnus-article-banner-alist
9468@vindex gnus-article-address-banner-alist
9469@cindex banner
9470@cindex OneList
9471@cindex stripping advertisements
9472@cindex advertisements
9473Strip the banner specified by the @code{banner} group parameter
9474(@code{gnus-article-strip-banner}). This is mainly used to hide those
9475annoying banners and/or signatures that some mailing lists and moderated
9476groups adds to all the messages. The way to use this function is to add
9477the @code{banner} group parameter (@pxref{Group Parameters}) to the
9478group you want banners stripped from. The parameter either be a string,
9479which will be interpreted as a regular expression matching text to be
9480removed, or the symbol @code{signature}, meaning that the (last)
9481signature should be removed, or other symbol, meaning that the
9482corresponding regular expression in @code{gnus-article-banner-alist} is
9483used.
9484
9485Regardless of a group, you can hide things like advertisements only when
9486the sender of an article has a certain mail address specified in
9487@code{gnus-article-address-banner-alist}.
9488
9489@table @code
9490
9491@item gnus-article-address-banner-alist
9492@vindex gnus-article-address-banner-alist
9493Alist of mail addresses and banners. Each element has the form
9494@code{(@var{address} . @var{banner})}, where @var{address} is a regexp
9495matching a mail address in the From header, @var{banner} is one of a
9496symbol @code{signature}, an item in @code{gnus-article-banner-alist},
9497a regexp and @code{nil}. If @var{address} matches author's mail
9498address, it will remove things like advertisements. For example, if a
9499sender has the mail address @samp{hail@@yoo-hoo.co.jp} and there is a
9500banner something like @samp{Do You Yoo-hoo!?} in all articles he
9501sends, you can use the following element to remove them:
9502
9503@lisp
9504("@@yoo-hoo\\.co\\.jp\\'" .
9505 "\n_+\nDo You Yoo-hoo!\\?\n.*\n.*\n")
9506@end lisp
9507
9508@end table
9509
9510@item W W c
9511@kindex W W c (Summary)
9512@findex gnus-article-hide-citation
9513Hide citation (@code{gnus-article-hide-citation}). Some variables for
9514customizing the hiding:
9515
9516@table @code
9517
9518@item gnus-cited-opened-text-button-line-format
9519@itemx gnus-cited-closed-text-button-line-format
9520@vindex gnus-cited-closed-text-button-line-format
9521@vindex gnus-cited-opened-text-button-line-format
9522Gnus adds buttons to show where the cited text has been hidden, and to
9523allow toggle hiding the text. The format of the variable is specified
9524by these format-like variable (@pxref{Formatting Variables}). These
9525specs are valid:
9526
9527@table @samp
9528@item b
9529Starting point of the hidden text.
9530@item e
9531Ending point of the hidden text.
9532@item l
9533Number of characters in the hidden region.
9534@item n
9535Number of lines of hidden text.
9536@end table
9537
9538@item gnus-cited-lines-visible
9539@vindex gnus-cited-lines-visible
9540The number of lines at the beginning of the cited text to leave
9541shown. This can also be a cons cell with the number of lines at the top
9542and bottom of the text, respectively, to remain visible.
9543
9544@end table
9545
9546@item W W C-c
9547@kindex W W C-c (Summary)
9548@findex gnus-article-hide-citation-maybe
9549
9550Hide citation (@code{gnus-article-hide-citation-maybe}) depending on the
9551following two variables:
9552
9553@table @code
9554@item gnus-cite-hide-percentage
9555@vindex gnus-cite-hide-percentage
9556If the cited text is of a bigger percentage than this variable (default
955750), hide the cited text.
9558
9559@item gnus-cite-hide-absolute
9560@vindex gnus-cite-hide-absolute
9561The cited text must have at least this length (default 10) before it
9562is hidden.
9563@end table
9564
9565@item W W C
9566@kindex W W C (Summary)
9567@findex gnus-article-hide-citation-in-followups
9568Hide cited text in articles that aren't roots
9569(@code{gnus-article-hide-citation-in-followups}). This isn't very
9570useful as an interactive command, but might be a handy function to stick
9571have happen automatically (@pxref{Customizing Articles}).
9572
9573@end table
9574
9575All these ``hiding'' commands are toggles, but if you give a negative
9576prefix to these commands, they will show what they have previously
9577hidden. If you give a positive prefix, they will always hide.
9578
9579Also @pxref{Article Highlighting} for further variables for
9580citation customization.
9581
9582@xref{Customizing Articles}, for how to hide article elements
9583automatically.
9584
9585
9586@node Article Washing
9587@subsection Article Washing
9588@cindex washing
9589@cindex article washing
9590
9591We call this ``article washing'' for a really good reason. Namely, the
9592@kbd{A} key was taken, so we had to use the @kbd{W} key instead.
9593
9594@dfn{Washing} is defined by us as ``changing something from something to
9595something else'', but normally results in something looking better.
9596Cleaner, perhaps.
9597
9598@xref{Customizing Articles}, if you want to change how Gnus displays
9599articles by default.
9600
9601@table @kbd
9602
9603@item C-u g
9604This is not really washing, it's sort of the opposite of washing. If
9605you type this, you see the article exactly as it exists on disk or on
9606the server.
9607
9608@item g
9609Force redisplaying of the current article
9610(@code{gnus-summary-show-article}). This is also not really washing.
9611If you type this, you see the article without any previously applied
9612interactive Washing functions but with all default treatments
9613(@pxref{Customizing Articles}).
9614
9615@item W l
9616@kindex W l (Summary)
9617@findex gnus-summary-stop-page-breaking
9618Remove page breaks from the current article
9619(@code{gnus-summary-stop-page-breaking}). @xref{Misc Article}, for page
9620delimiters.
9621
9622@item W r
9623@kindex W r (Summary)
9624@findex gnus-summary-caesar-message
9625@c @icon{gnus-summary-caesar-message}
9626Do a Caesar rotate (rot13) on the article buffer
9627(@code{gnus-summary-caesar-message}).
9628Unreadable articles that tell you to read them with Caesar rotate or rot13.
9629(Typically offensive jokes and such.)
9630
9631It's commonly called ``rot13'' because each letter is rotated 13
9632positions in the alphabet, e. g. @samp{B} (letter #2) -> @samp{O} (letter
9633#15). It is sometimes referred to as ``Caesar rotate'' because Caesar
9634is rumored to have employed this form of, uh, somewhat weak encryption.
9635
9636@item W m
9637@kindex W m (Summary)
9638@findex gnus-summary-morse-message
9639Morse decode the article buffer (@code{gnus-summary-morse-message}).
9640
01c52d31
MB
9641@item W i
9642@kindex W i (Summary)
9643@findex gnus-summary-idna-message
9644Decode IDNA encoded domain names in the current articles. IDNA
9645encoded domain names looks like @samp{xn--bar}. If a string remain
9646unencoded after running invoking this, it is likely an invalid IDNA
9647string (@samp{xn--bar} is invalid). You must have GNU Libidn
9648(@url{http://www.gnu.org/software/libidn/}) installed for this command
9649to work.
9650
4009494e
GM
9651@item W t
9652@item t
9653@kindex W t (Summary)
9654@kindex t (Summary)
9655@findex gnus-summary-toggle-header
9656Toggle whether to display all headers in the article buffer
9657(@code{gnus-summary-toggle-header}).
9658
9659@item W v
9660@kindex W v (Summary)
9661@findex gnus-summary-verbose-headers
9662Toggle whether to display all headers in the article buffer permanently
9663(@code{gnus-summary-verbose-headers}).
9664
9665@item W o
9666@kindex W o (Summary)
9667@findex gnus-article-treat-overstrike
9668Treat overstrike (@code{gnus-article-treat-overstrike}).
9669
9670@item W d
9671@kindex W d (Summary)
9672@findex gnus-article-treat-dumbquotes
9673@vindex gnus-article-dumbquotes-map
9674@cindex Smartquotes
9675@cindex M****s*** sm*rtq**t*s
9676@cindex Latin 1
9677Treat M****s*** sm*rtq**t*s according to
9678@code{gnus-article-dumbquotes-map}
9679(@code{gnus-article-treat-dumbquotes}). Note that this function guesses
9680whether a character is a sm*rtq**t* or not, so it should only be used
9681interactively.
9682
9683Sm*rtq**t*s are M****s***'s unilateral extension to the character map in
9684an attempt to provide more quoting characters. If you see something
9685like @code{\222} or @code{\264} where you're expecting some kind of
9686apostrophe or quotation mark, then try this wash.
9687
9688@item W Y f
9689@kindex W Y f (Summary)
9690@findex gnus-article-outlook-deuglify-article
9691@cindex Outlook Express
9692Full deuglify of broken Outlook (Express) articles: Treat dumbquotes,
9693unwrap lines, repair attribution and rearrange citation.
9694(@code{gnus-article-outlook-deuglify-article}).
9695
9696@item W Y u
9697@kindex W Y u (Summary)
9698@findex gnus-article-outlook-unwrap-lines
9699@vindex gnus-outlook-deuglify-unwrap-min
9700@vindex gnus-outlook-deuglify-unwrap-max
9701Unwrap lines that appear to be wrapped citation lines. You can control
9702what lines will be unwrapped by frobbing
9703@code{gnus-outlook-deuglify-unwrap-min} and
9704@code{gnus-outlook-deuglify-unwrap-max}, indicating the minimum and
9705maximum length of an unwrapped citation line.
9706(@code{gnus-article-outlook-unwrap-lines}).
9707
9708@item W Y a
9709@kindex W Y a (Summary)
9710@findex gnus-article-outlook-repair-attribution
9711Repair a broken attribution line.@*
9712(@code{gnus-article-outlook-repair-attribution}).
9713
9714@item W Y c
9715@kindex W Y c (Summary)
9716@findex gnus-article-outlook-rearrange-citation
9717Repair broken citations by rearranging the text.
9718(@code{gnus-article-outlook-rearrange-citation}).
9719
9720@item W w
9721@kindex W w (Summary)
9722@findex gnus-article-fill-cited-article
9723Do word wrap (@code{gnus-article-fill-cited-article}).
9724
9725You can give the command a numerical prefix to specify the width to use
9726when filling.
9727
9728@item W Q
9729@kindex W Q (Summary)
9730@findex gnus-article-fill-long-lines
9731Fill long lines (@code{gnus-article-fill-long-lines}).
9732
9733@item W C
9734@kindex W C (Summary)
9735@findex gnus-article-capitalize-sentences
9736Capitalize the first word in each sentence
9737(@code{gnus-article-capitalize-sentences}).
9738
9739@item W c
9740@kindex W c (Summary)
9741@findex gnus-article-remove-cr
9742Translate CRLF pairs (i. e., @samp{^M}s on the end of the lines) into LF
9743(this takes care of DOS line endings), and then translate any remaining
9744CRs into LF (this takes care of Mac line endings)
9745(@code{gnus-article-remove-cr}).
9746
9747@item W q
9748@kindex W q (Summary)
9749@findex gnus-article-de-quoted-unreadable
9750Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}).
9751Quoted-Printable is one common @acronym{MIME} encoding employed when
9752sending non-@acronym{ASCII} (i.e., 8-bit) articles. It typically
01c52d31
MB
9753makes strings like @samp{d@'ej@`a vu} look like @samp{d=E9j=E0 vu},
9754which doesn't look very readable to me. Note that this is usually
9755done automatically by Gnus if the message in question has a
4009494e
GM
9756@code{Content-Transfer-Encoding} header that says that this encoding
9757has been done. If a prefix is given, a charset will be asked for.
9758
9759@item W 6
9760@kindex W 6 (Summary)
9761@findex gnus-article-de-base64-unreadable
9762Treat base64 (@code{gnus-article-de-base64-unreadable}). Base64 is
9763one common @acronym{MIME} encoding employed when sending
9764non-@acronym{ASCII} (i.e., 8-bit) articles. Note that this is
9765usually done automatically by Gnus if the message in question has a
9766@code{Content-Transfer-Encoding} header that says that this encoding
9767has been done. If a prefix is given, a charset will be asked for.
9768
9769@item W Z
9770@kindex W Z (Summary)
9771@findex gnus-article-decode-HZ
9772Treat HZ or HZP (@code{gnus-article-decode-HZ}). HZ (or HZP) is one
9773common encoding employed when sending Chinese articles. It typically
9774makes strings look like @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}}.
9775
01c52d31
MB
9776@item W A
9777@kindex W A (Summary)
9778@findex gnus-article-treat-ansi-sequences
9779@cindex @acronym{ANSI} control sequences
9780Translate @acronym{ANSI} SGR control sequences into overlays or
9781extents (@code{gnus-article-treat-ansi-sequences}). @acronym{ANSI}
9782sequences are used in some Chinese hierarchies for highlighting.
9783
4009494e
GM
9784@item W u
9785@kindex W u (Summary)
9786@findex gnus-article-unsplit-urls
9787Remove newlines from within URLs. Some mailers insert newlines into
9788outgoing email messages to keep lines short. This reformatting can
9789split long URLs onto multiple lines. Repair those URLs by removing
9790the newlines (@code{gnus-article-unsplit-urls}).
9791
9792@item W h
9793@kindex W h (Summary)
9794@findex gnus-article-wash-html
9795Treat @acronym{HTML} (@code{gnus-article-wash-html}). Note that this is
9796usually done automatically by Gnus if the message in question has a
9797@code{Content-Type} header that says that the message is @acronym{HTML}.
9798
9799If a prefix is given, a charset will be asked for. If it is a number,
9800the charset defined in @code{gnus-summary-show-article-charset-alist}
9801(@pxref{Paging the Article}) will be used.
9802
9803@vindex gnus-article-wash-function
9804The default is to use the function specified by
9805@code{mm-text-html-renderer} (@pxref{Display Customization, ,Display
9806Customization, emacs-mime, The Emacs MIME Manual}) to convert the
9807@acronym{HTML}, but this is controlled by the
9808@code{gnus-article-wash-function} variable. Pre-defined functions you
9809can use include:
9810
9811@table @code
9812@item w3
9813Use Emacs/W3.
9814
9815@item w3m
9816Use @uref{http://emacs-w3m.namazu.org/, emacs-w3m}.
9817
9818@item w3m-standalone
9819Use @uref{http://w3m.sourceforge.net/, w3m}.
9820
9821@item links
9822Use @uref{http://links.sf.net/, Links}.
9823
9824@item lynx
9825Use @uref{http://lynx.isc.org/, Lynx}.
9826
9827@item html2text
9828Use html2text---a simple @acronym{HTML} converter included with Gnus.
9829
9830@end table
9831
9832@item W b
9833@kindex W b (Summary)
9834@findex gnus-article-add-buttons
9835Add clickable buttons to the article (@code{gnus-article-add-buttons}).
9836@xref{Article Buttons}.
9837
9838@item W B
9839@kindex W B (Summary)
9840@findex gnus-article-add-buttons-to-head
9841Add clickable buttons to the article headers
9842(@code{gnus-article-add-buttons-to-head}).
9843
9844@item W p
9845@kindex W p (Summary)
9846@findex gnus-article-verify-x-pgp-sig
9847Verify a signed control message
9848(@code{gnus-article-verify-x-pgp-sig}). Control messages such as
9849@code{newgroup} and @code{checkgroups} are usually signed by the
9850hierarchy maintainer. You need to add the @acronym{PGP} public key of
9851the maintainer to your keyring to verify the
9852message.@footnote{@acronym{PGP} keys for many hierarchies are
9853available at @uref{ftp://ftp.isc.org/pub/pgpcontrol/README.html}}
9854
9855@item W s
9856@kindex W s (Summary)
9857@findex gnus-summary-force-verify-and-decrypt
9858Verify a signed (@acronym{PGP}, @acronym{PGP/MIME} or
9859@acronym{S/MIME}) message
9860(@code{gnus-summary-force-verify-and-decrypt}). @xref{Security}.
9861
9862@item W a
9863@kindex W a (Summary)
9864@findex gnus-article-strip-headers-in-body
9865Strip headers like the @code{X-No-Archive} header from the beginning of
9866article bodies (@code{gnus-article-strip-headers-in-body}).
9867
9868@item W E l
9869@kindex W E l (Summary)
9870@findex gnus-article-strip-leading-blank-lines
9871Remove all blank lines from the beginning of the article
9872(@code{gnus-article-strip-leading-blank-lines}).
9873
9874@item W E m
9875@kindex W E m (Summary)
9876@findex gnus-article-strip-multiple-blank-lines
9877Replace all blank lines with empty lines and then all multiple empty
9878lines with a single empty line.
9879(@code{gnus-article-strip-multiple-blank-lines}).
9880
9881@item W E t
9882@kindex W E t (Summary)
9883@findex gnus-article-remove-trailing-blank-lines
9884Remove all blank lines at the end of the article
9885(@code{gnus-article-remove-trailing-blank-lines}).
9886
9887@item W E a
9888@kindex W E a (Summary)
9889@findex gnus-article-strip-blank-lines
9890Do all the three commands above
9891(@code{gnus-article-strip-blank-lines}).
9892
9893@item W E A
9894@kindex W E A (Summary)
9895@findex gnus-article-strip-all-blank-lines
9896Remove all blank lines
9897(@code{gnus-article-strip-all-blank-lines}).
9898
9899@item W E s
9900@kindex W E s (Summary)
9901@findex gnus-article-strip-leading-space
9902Remove all white space from the beginning of all lines of the article
9903body (@code{gnus-article-strip-leading-space}).
9904
9905@item W E e
9906@kindex W E e (Summary)
9907@findex gnus-article-strip-trailing-space
9908Remove all white space from the end of all lines of the article
9909body (@code{gnus-article-strip-trailing-space}).
9910
9911@end table
9912
9913@xref{Customizing Articles}, for how to wash articles automatically.
9914
9915
9916@node Article Header
9917@subsection Article Header
9918
9919These commands perform various transformations of article header.
9920
9921@table @kbd
9922
9923@item W G u
9924@kindex W G u (Summary)
9925@findex gnus-article-treat-unfold-headers
9926Unfold folded header lines (@code{gnus-article-treat-unfold-headers}).
9927
9928@item W G n
9929@kindex W G n (Summary)
9930@findex gnus-article-treat-fold-newsgroups
9931Fold the @code{Newsgroups} and @code{Followup-To} headers
9932(@code{gnus-article-treat-fold-newsgroups}).
9933
9934@item W G f
9935@kindex W G f (Summary)
9936@findex gnus-article-treat-fold-headers
9937Fold all the message headers
9938(@code{gnus-article-treat-fold-headers}).
9939
9940@item W E w
9941@kindex W E w (Summary)
9942@findex gnus-article-remove-leading-whitespace
9943Remove excessive whitespace from all headers
9944(@code{gnus-article-remove-leading-whitespace}).
9945
9946@end table
9947
9948
9949@node Article Buttons
9950@subsection Article Buttons
9951@cindex buttons
9952
9953People often include references to other stuff in articles, and it would
9954be nice if Gnus could just fetch whatever it is that people talk about
9955with the minimum of fuzz when you hit @kbd{RET} or use the middle mouse
9956button on these references.
9957
9958@vindex gnus-button-man-handler
9959Gnus adds @dfn{buttons} to certain standard references by default:
9960Well-formed URLs, mail addresses, Message-IDs, Info links, man pages and
9961Emacs or Gnus related references. This is controlled by two variables,
9962one that handles article bodies and one that handles article heads:
9963
9964@table @code
9965
9966@item gnus-button-alist
9967@vindex gnus-button-alist
9968This is an alist where each entry has this form:
9969
9970@lisp
9971(@var{regexp} @var{button-par} @var{use-p} @var{function} @var{data-par})
9972@end lisp
9973
9974@table @var
9975
9976@item regexp
9977All text that match this regular expression (case insensitive) will be
9978considered an external reference. Here's a typical regexp that matches
9979embedded URLs: @samp{<URL:\\([^\n\r>]*\\)>}. This can also be a
9980variable containing a regexp, useful variables to use include
9981@code{gnus-button-url-regexp} and @code{gnus-button-mid-or-mail-regexp}.
9982
9983@item button-par
9984Gnus has to know which parts of the matches is to be highlighted. This
9985is a number that says what sub-expression of the regexp is to be
9986highlighted. If you want it all highlighted, you use 0 here.
9987
9988@item use-p
9989This form will be @code{eval}ed, and if the result is non-@code{nil},
9990this is considered a match. This is useful if you want extra sifting to
9991avoid false matches. Often variables named
9992@code{gnus-button-@var{*}-level} are used here, @xref{Article Button
9993Levels}, but any other form may be used too.
9994
9995@c @code{use-p} is @code{eval}ed only if @code{regexp} matches.
9996
9997@item function
9998This function will be called when you click on this button.
9999
10000@item data-par
10001As with @var{button-par}, this is a sub-expression number, but this one
10002says which part of the match is to be sent as data to @var{function}.
10003
10004@end table
10005
10006So the full entry for buttonizing URLs is then
10007
10008@lisp
10009("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)
10010@end lisp
10011
10012@item gnus-header-button-alist
10013@vindex gnus-header-button-alist
10014This is just like the other alist, except that it is applied to the
10015article head only, and that each entry has an additional element that is
10016used to say what headers to apply the buttonize coding to:
10017
10018@lisp
10019(@var{header} @var{regexp} @var{button-par} @var{use-p} @var{function} @var{data-par})
10020@end lisp
10021
10022@var{header} is a regular expression.
10023@end table
10024
10025@subsubsection Related variables and functions
10026
10027@table @code
10028@item gnus-button-@var{*}-level
10029@xref{Article Button Levels}.
10030
10031@c Stuff related to gnus-button-browse-level
10032
10033@item gnus-button-url-regexp
10034@vindex gnus-button-url-regexp
10035A regular expression that matches embedded URLs. It is used in the
10036default values of the variables above.
10037
10038@c Stuff related to gnus-button-man-level
10039
10040@item gnus-button-man-handler
10041@vindex gnus-button-man-handler
10042The function to use for displaying man pages. It must take at least one
10043argument with a string naming the man page.
10044
10045@c Stuff related to gnus-button-message-level
10046
10047@item gnus-button-mid-or-mail-regexp
10048@vindex gnus-button-mid-or-mail-regexp
10049Regular expression that matches a message ID or a mail address.
10050
10051@item gnus-button-prefer-mid-or-mail
10052@vindex gnus-button-prefer-mid-or-mail
10053This variable determines what to do when the button on a string as
10054@samp{foo123@@bar.invalid} is pushed. Strings like this can be either a
10055message ID or a mail address. If it is one of the symbols @code{mid} or
10056@code{mail}, Gnus will always assume that the string is a message ID or
10057a mail address, respectively. If this variable is set to the symbol
10058@code{ask}, always query the user what to do. If it is a function, this
10059function will be called with the string as its only argument. The
10060function must return @code{mid}, @code{mail}, @code{invalid} or
10061@code{ask}. The default value is the function
10062@code{gnus-button-mid-or-mail-heuristic}.
10063
10064@item gnus-button-mid-or-mail-heuristic
10065@findex gnus-button-mid-or-mail-heuristic
10066Function that guesses whether its argument is a message ID or a mail
10067address. Returns @code{mid} if it's a message IDs, @code{mail} if
10068it's a mail address, @code{ask} if unsure and @code{invalid} if the
10069string is invalid.
10070
10071@item gnus-button-mid-or-mail-heuristic-alist
10072@vindex gnus-button-mid-or-mail-heuristic-alist
10073An alist of @code{(RATE . REGEXP)} pairs used by the function
10074@code{gnus-button-mid-or-mail-heuristic}.
10075
10076@c Stuff related to gnus-button-tex-level
10077
10078@item gnus-button-ctan-handler
10079@findex gnus-button-ctan-handler
10080The function to use for displaying CTAN links. It must take one
10081argument, the string naming the URL.
10082
10083@item gnus-ctan-url
10084@vindex gnus-ctan-url
10085Top directory of a CTAN (Comprehensive TeX Archive Network) archive used
10086by @code{gnus-button-ctan-handler}.
10087
10088@c Misc stuff
10089
10090@item gnus-article-button-face
10091@vindex gnus-article-button-face
10092Face used on buttons.
10093
10094@item gnus-article-mouse-face
10095@vindex gnus-article-mouse-face
10096Face used when the mouse cursor is over a button.
10097
10098@end table
10099
10100@xref{Customizing Articles}, for how to buttonize articles automatically.
10101
10102
10103@node Article Button Levels
10104@subsection Article button levels
10105@cindex button levels
10106The higher the value of the variables @code{gnus-button-@var{*}-level},
10107the more buttons will appear. If the level is zero, no corresponding
10108buttons are displayed. With the default value (which is 5) you should
10109already see quite a lot of buttons. With higher levels, you will see
10110more buttons, but you may also get more false positives. To avoid them,
10111you can set the variables @code{gnus-button-@var{*}-level} local to
10112specific groups (@pxref{Group Parameters}). Here's an example for the
10113variable @code{gnus-parameters}:
10114
10115@lisp
10116;; @r{increase @code{gnus-button-*-level} in some groups:}
10117(setq gnus-parameters
10118 '(("\\<\\(emacs\\|gnus\\)\\>" (gnus-button-emacs-level 10))
10119 ("\\<unix\\>" (gnus-button-man-level 10))
10120 ("\\<tex\\>" (gnus-button-tex-level 10))))
10121@end lisp
10122
10123@table @code
10124
10125@item gnus-button-browse-level
10126@vindex gnus-button-browse-level
10127Controls the display of references to message IDs, mail addresses and
10128news URLs. Related variables and functions include
10129@code{gnus-button-url-regexp}, @code{browse-url}, and
10130@code{browse-url-browser-function}.
10131
10132@item gnus-button-emacs-level
10133@vindex gnus-button-emacs-level
10134Controls the display of Emacs or Gnus references. Related functions are
10135@code{gnus-button-handle-custom},
10136@code{gnus-button-handle-describe-function},
10137@code{gnus-button-handle-describe-variable},
10138@code{gnus-button-handle-symbol},
10139@code{gnus-button-handle-describe-key},
10140@code{gnus-button-handle-apropos},
10141@code{gnus-button-handle-apropos-command},
10142@code{gnus-button-handle-apropos-variable},
10143@code{gnus-button-handle-apropos-documentation}, and
10144@code{gnus-button-handle-library}.
10145
10146@item gnus-button-man-level
10147@vindex gnus-button-man-level
10148Controls the display of references to (Unix) man pages.
10149See @code{gnus-button-man-handler}.
10150
10151@item gnus-button-message-level
10152@vindex gnus-button-message-level
10153Controls the display of message IDs, mail addresses and news URLs.
10154Related variables and functions include
10155@code{gnus-button-mid-or-mail-regexp},
10156@code{gnus-button-prefer-mid-or-mail},
10157@code{gnus-button-mid-or-mail-heuristic}, and
10158@code{gnus-button-mid-or-mail-heuristic-alist}.
10159
10160@item gnus-button-tex-level
10161@vindex gnus-button-tex-level
10162Controls the display of references to @TeX{} or LaTeX stuff, e.g. for CTAN
10163URLs. See the variables @code{gnus-ctan-url},
10164@code{gnus-button-ctan-handler},
10165@code{gnus-button-ctan-directory-regexp}, and
10166@code{gnus-button-handle-ctan-bogus-regexp}.
10167
10168@end table
10169
10170
10171@node Article Date
10172@subsection Article Date
10173
10174The date is most likely generated in some obscure timezone you've never
10175heard of, so it's quite nice to be able to find out what the time was
10176when the article was sent.
10177
10178@table @kbd
10179
10180@item W T u
10181@kindex W T u (Summary)
10182@findex gnus-article-date-ut
10183Display the date in UT (aka. GMT, aka ZULU)
10184(@code{gnus-article-date-ut}).
10185
10186@item W T i
10187@kindex W T i (Summary)
10188@findex gnus-article-date-iso8601
10189@cindex ISO 8601
10190Display the date in international format, aka. ISO 8601
10191(@code{gnus-article-date-iso8601}).
10192
10193@item W T l
10194@kindex W T l (Summary)
10195@findex gnus-article-date-local
10196Display the date in the local timezone (@code{gnus-article-date-local}).
10197
10198@item W T p
10199@kindex W T p (Summary)
10200@findex gnus-article-date-english
10201Display the date in a format that's easily pronounceable in English
10202(@code{gnus-article-date-english}).
10203
10204@item W T s
10205@kindex W T s (Summary)
10206@vindex gnus-article-time-format
10207@findex gnus-article-date-user
10208@findex format-time-string
10209Display the date using a user-defined format
10210(@code{gnus-article-date-user}). The format is specified by the
10211@code{gnus-article-time-format} variable, and is a string that's passed
10212to @code{format-time-string}. See the documentation of that variable
10213for a list of possible format specs.
10214
10215@item W T e
10216@kindex W T e (Summary)
10217@findex gnus-article-date-lapsed
10218@findex gnus-start-date-timer
10219@findex gnus-stop-date-timer
10220Say how much time has elapsed between the article was posted and now
10221(@code{gnus-article-date-lapsed}). It looks something like:
10222
10223@example
10224X-Sent: 6 weeks, 4 days, 1 hour, 3 minutes, 8 seconds ago
10225@end example
10226
10227@vindex gnus-article-date-lapsed-new-header
10228The value of @code{gnus-article-date-lapsed-new-header} determines
10229whether this header will just be added below the old Date one, or will
10230replace it.
10231
10232An advantage of using Gnus to read mail is that it converts simple bugs
10233into wonderful absurdities.
10234
10235If you want to have this line updated continually, you can put
10236
10237@lisp
10238(gnus-start-date-timer)
10239@end lisp
10240
10241in your @file{~/.gnus.el} file, or you can run it off of some hook. If
10242you want to stop the timer, you can use the @code{gnus-stop-date-timer}
10243command.
10244
10245@item W T o
10246@kindex W T o (Summary)
10247@findex gnus-article-date-original
10248Display the original date (@code{gnus-article-date-original}). This can
10249be useful if you normally use some other conversion function and are
10250worried that it might be doing something totally wrong. Say, claiming
10251that the article was posted in 1854. Although something like that is
10252@emph{totally} impossible. Don't you trust me? *titter*
10253
10254@end table
10255
10256@xref{Customizing Articles}, for how to display the date in your
10257preferred format automatically.
10258
10259
10260@node Article Display
10261@subsection Article Display
10262@cindex picons
10263@cindex x-face
10264@cindex smileys
10265
10266These commands add various frivolous display gimmicks to the article
10267buffer in Emacs versions that support them.
10268
10269@code{X-Face} headers are small black-and-white images supplied by the
10270message headers (@pxref{X-Face}).
10271
10272@code{Face} headers are small colored images supplied by the message
10273headers (@pxref{Face}).
10274
10275Smileys are those little @samp{:-)} symbols that people like to litter
10276their messages with (@pxref{Smileys}).
10277
10278Picons, on the other hand, reside on your own system, and Gnus will
10279try to match the headers to what you have (@pxref{Picons}).
10280
10281All these functions are toggles---if the elements already exist,
10282they'll be removed.
10283
10284@table @kbd
10285@item W D x
10286@kindex W D x (Summary)
10287@findex gnus-article-display-x-face
10288Display an @code{X-Face} in the @code{From} header.
10289(@code{gnus-article-display-x-face}).
10290
10291@item W D d
10292@kindex W D d (Summary)
10293@findex gnus-article-display-face
10294Display a @code{Face} in the @code{From} header.
10295(@code{gnus-article-display-face}).
10296
10297@item W D s
10298@kindex W D s (Summary)
10299@findex gnus-treat-smiley
10300Display smileys (@code{gnus-treat-smiley}).
10301
10302@item W D f
10303@kindex W D f (Summary)
10304@findex gnus-treat-from-picon
10305Piconify the @code{From} header (@code{gnus-treat-from-picon}).
10306
10307@item W D m
10308@kindex W D m (Summary)
10309@findex gnus-treat-mail-picon
10310Piconify all mail headers (i. e., @code{Cc}, @code{To})
10311(@code{gnus-treat-mail-picon}).
10312
10313@item W D n
10314@kindex W D n (Summary)
10315@findex gnus-treat-newsgroups-picon
10316Piconify all news headers (i. e., @code{Newsgroups} and
10317@code{Followup-To}) (@code{gnus-treat-newsgroups-picon}).
10318
10319@item W D D
10320@kindex W D D (Summary)
10321@findex gnus-article-remove-images
10322Remove all images from the article buffer
10323(@code{gnus-article-remove-images}).
10324
10325@end table
10326
10327
10328
10329@node Article Signature
10330@subsection Article Signature
10331@cindex signatures
10332@cindex article signature
10333
10334@vindex gnus-signature-separator
10335Each article is divided into two parts---the head and the body. The
10336body can be divided into a signature part and a text part. The variable
10337that says what is to be considered a signature is
10338@code{gnus-signature-separator}. This is normally the standard
10339@samp{^-- $} as mandated by son-of-RFC 1036. However, many people use
10340non-standard signature separators, so this variable can also be a list
10341of regular expressions to be tested, one by one. (Searches are done
10342from the end of the body towards the beginning.) One likely value is:
10343
10344@lisp
10345(setq gnus-signature-separator
10346 '("^-- $" ; @r{The standard}
10347 "^-- *$" ; @r{A common mangling}
10348 "^-------*$" ; @r{Many people just use a looong}
10349 ; @r{line of dashes. Shame!}
10350 "^ *--------*$" ; @r{Double-shame!}
10351 "^________*$" ; @r{Underscores are also popular}
10352 "^========*$")) ; @r{Pervert!}
10353@end lisp
10354
10355The more permissive you are, the more likely it is that you'll get false
10356positives.
10357
10358@vindex gnus-signature-limit
10359@code{gnus-signature-limit} provides a limit to what is considered a
10360signature when displaying articles.
10361
10362@enumerate
10363@item
10364If it is an integer, no signature may be longer (in characters) than
10365that integer.
10366@item
10367If it is a floating point number, no signature may be longer (in lines)
10368than that number.
10369@item
10370If it is a function, the function will be called without any parameters,
10371and if it returns @code{nil}, there is no signature in the buffer.
10372@item
10373If it is a string, it will be used as a regexp. If it matches, the text
10374in question is not a signature.
10375@end enumerate
10376
10377This variable can also be a list where the elements may be of the types
10378listed above. Here's an example:
10379
10380@lisp
10381(setq gnus-signature-limit
10382 '(200.0 "^---*Forwarded article"))
10383@end lisp
10384
10385This means that if there are more than 200 lines after the signature
10386separator, or the text after the signature separator is matched by
10387the regular expression @samp{^---*Forwarded article}, then it isn't a
10388signature after all.
10389
10390
10391@node Article Miscellanea
10392@subsection Article Miscellanea
10393
10394@table @kbd
10395@item A t
10396@kindex A t (Summary)
10397@findex gnus-article-babel
10398Translate the article from one language to another
10399(@code{gnus-article-babel}).
10400
10401@end table
10402
10403
10404@node MIME Commands
10405@section MIME Commands
10406@cindex MIME decoding
10407@cindex attachments
10408@cindex viewing attachments
10409
10410The following commands all understand the numerical prefix. For
01c52d31 10411instance, @kbd{3 K v} means ``view the third @acronym{MIME} part''.
4009494e
GM
10412
10413@table @kbd
10414@item b
10415@itemx K v
10416@kindex b (Summary)
10417@kindex K v (Summary)
10418View the @acronym{MIME} part.
10419
10420@item K o
10421@kindex K o (Summary)
10422Save the @acronym{MIME} part.
10423
01c52d31
MB
10424@item K O
10425@kindex K O (Summary)
10426Prompt for a file name, then save the @acronym{MIME} part and strip it
10427from the article. The stripped @acronym{MIME} object will be referred
10428via the message/external-body @acronym{MIME} type.
10429
10430@item K r
10431@kindex K r (Summary)
10432Replace the @acronym{MIME} part with an external body.
10433
10434@item K d
10435@kindex K d (Summary)
10436Delete the @acronym{MIME} part and add some information about the
10437removed part.
10438
4009494e
GM
10439@item K c
10440@kindex K c (Summary)
10441Copy the @acronym{MIME} part.
10442
10443@item K e
10444@kindex K e (Summary)
10445View the @acronym{MIME} part externally.
10446
10447@item K i
10448@kindex K i (Summary)
10449View the @acronym{MIME} part internally.
10450
10451@item K |
10452@kindex K | (Summary)
10453Pipe the @acronym{MIME} part to an external command.
10454@end table
10455
10456The rest of these @acronym{MIME} commands do not use the numerical prefix in
10457the same manner:
10458
10459@table @kbd
9b3ebcb6
MB
10460@item K H
10461@kindex K H (Summary)
10462@findex gnus-article-browse-html-article
10463View @samp{text/html} parts of the current article with a WWW browser.
10464The message header is added to the beginning of every html part unless
10465the prefix argument is given.
10466
10467Warning: Spammers use links to images in HTML articles to verify whether
10468you have read the message. As this command passes the @acronym{HTML}
10469content to the browser without eliminating these ``web bugs'' you should
10470only use it for mails from trusted senders.
10471
10472If you always want to display @acronym{HTML} parts in the browser, set
10473@code{mm-text-html-renderer} to @code{nil}.
10474
4009494e
GM
10475@item K b
10476@kindex K b (Summary)
10477Make all the @acronym{MIME} parts have buttons in front of them. This is
10478mostly useful if you wish to save (or perform other actions) on inlined
10479parts.
10480
10481@item K m
10482@kindex K m (Summary)
10483@findex gnus-summary-repair-multipart
10484Some multipart messages are transmitted with missing or faulty headers.
10485This command will attempt to ``repair'' these messages so that they can
10486be viewed in a more pleasant manner
10487(@code{gnus-summary-repair-multipart}).
10488
10489@item X m
10490@kindex X m (Summary)
10491@findex gnus-summary-save-parts
10492Save all parts matching a @acronym{MIME} type to a directory
10493(@code{gnus-summary-save-parts}). Understands the process/prefix
10494convention (@pxref{Process/Prefix}).
10495
10496@item M-t
10497@kindex M-t (Summary)
10498@findex gnus-summary-toggle-display-buttonized
10499Toggle the buttonized display of the article buffer
10500(@code{gnus-summary-toggle-display-buttonized}).
10501
10502@item W M w
10503@kindex W M w (Summary)
10504@findex gnus-article-decode-mime-words
10505Decode RFC 2047-encoded words in the article headers
10506(@code{gnus-article-decode-mime-words}).
10507
10508@item W M c
10509@kindex W M c (Summary)
10510@findex gnus-article-decode-charset
10511Decode encoded article bodies as well as charsets
10512(@code{gnus-article-decode-charset}).
10513
10514This command looks in the @code{Content-Type} header to determine the
10515charset. If there is no such header in the article, you can give it a
10516prefix, which will prompt for the charset to decode as. In regional
10517groups where people post using some common encoding (but do not
10518include @acronym{MIME} headers), you can set the @code{charset} group/topic
10519parameter to the required charset (@pxref{Group Parameters}).
10520
10521@item W M v
10522@kindex W M v (Summary)
10523@findex gnus-mime-view-all-parts
10524View all the @acronym{MIME} parts in the current article
10525(@code{gnus-mime-view-all-parts}).
10526
10527@end table
10528
10529Relevant variables:
10530
10531@table @code
10532@item gnus-ignored-mime-types
10533@vindex gnus-ignored-mime-types
10534This is a list of regexps. @acronym{MIME} types that match a regexp from
10535this list will be completely ignored by Gnus. The default value is
10536@code{nil}.
10537
10538To have all Vcards be ignored, you'd say something like this:
10539
10540@lisp
10541(setq gnus-ignored-mime-types
10542 '("text/x-vcard"))
10543@end lisp
10544
10545@item gnus-article-loose-mime
10546@vindex gnus-article-loose-mime
10547If non-@code{nil}, Gnus won't require the @samp{MIME-Version} header
10548before interpreting the message as a @acronym{MIME} message. This helps
10549when reading messages from certain broken mail user agents. The
b890d447 10550default is @code{t}.
4009494e
GM
10551
10552@item gnus-article-emulate-mime
10553@vindex gnus-article-emulate-mime
10554@cindex uuencode
10555@cindex yEnc
10556There are other, non-@acronym{MIME} encoding methods used. The most common
10557is @samp{uuencode}, but yEncode is also getting to be popular. If
10558this variable is non-@code{nil}, Gnus will look in message bodies to
10559see if it finds these encodings, and if so, it'll run them through the
10560Gnus @acronym{MIME} machinery. The default is @code{t}. Only
10561single-part yEnc encoded attachments can be decoded. There's no support
10562for encoding in Gnus.
10563
10564@item gnus-unbuttonized-mime-types
10565@vindex gnus-unbuttonized-mime-types
10566This is a list of regexps. @acronym{MIME} types that match a regexp from
10567this list won't have @acronym{MIME} buttons inserted unless they aren't
10568displayed or this variable is overridden by
10569@code{gnus-buttonized-mime-types}. The default value is
10570@code{(".*/.*")}. This variable is only used when
10571@code{gnus-inhibit-mime-unbuttonizing} is @code{nil}.
10572
10573@item gnus-buttonized-mime-types
10574@vindex gnus-buttonized-mime-types
10575This is a list of regexps. @acronym{MIME} types that match a regexp from
10576this list will have @acronym{MIME} buttons inserted unless they aren't
10577displayed. This variable overrides
10578@code{gnus-unbuttonized-mime-types}. The default value is @code{nil}.
10579This variable is only used when @code{gnus-inhibit-mime-unbuttonizing}
10580is @code{nil}.
10581
10582To see e.g. security buttons but no other buttons, you could set this
10583variable to @code{("multipart/signed")} and leave
10584@code{gnus-unbuttonized-mime-types} at the default value.
10585
10586You could also add @code{"multipart/alternative"} to this list to
10587display radio buttons that allow you to choose one of two media types
10588those mails include. See also @code{mm-discouraged-alternatives}
10589(@pxref{Display Customization, ,Display Customization, emacs-mime, The
10590Emacs MIME Manual}).
10591
10592@item gnus-inhibit-mime-unbuttonizing
10593@vindex gnus-inhibit-mime-unbuttonizing
10594If this is non-@code{nil}, then all @acronym{MIME} parts get buttons. The
10595default value is @code{nil}.
10596
10597@item gnus-article-mime-part-function
10598@vindex gnus-article-mime-part-function
10599For each @acronym{MIME} part, this function will be called with the @acronym{MIME}
10600handle as the parameter. The function is meant to be used to allow
10601users to gather information from the article (e. g., add Vcard info to
10602the bbdb database) or to do actions based on parts (e. g., automatically
10603save all jpegs into some directory).
10604
10605Here's an example function the does the latter:
10606
10607@lisp
10608(defun my-save-all-jpeg-parts (handle)
10609 (when (equal (car (mm-handle-type handle)) "image/jpeg")
10610 (with-temp-buffer
10611 (insert (mm-get-part handle))
10612 (write-region (point-min) (point-max)
10613 (read-file-name "Save jpeg to: ")))))
10614(setq gnus-article-mime-part-function
10615 'my-save-all-jpeg-parts)
10616@end lisp
10617
10618@vindex gnus-mime-multipart-functions
10619@item gnus-mime-multipart-functions
10620Alist of @acronym{MIME} multipart types and functions to handle them.
10621
10622@vindex gnus-mime-display-multipart-alternative-as-mixed
10623@item gnus-mime-display-multipart-alternative-as-mixed
10624Display "multipart/alternative" parts as "multipart/mixed".
10625
10626@vindex gnus-mime-display-multipart-related-as-mixed
10627@item gnus-mime-display-multipart-related-as-mixed
10628Display "multipart/related" parts as "multipart/mixed".
10629
9b3ebcb6 10630If displaying @samp{text/html} is discouraged, see
4009494e
GM
10631@code{mm-discouraged-alternatives}, images or other material inside a
10632"multipart/related" part might be overlooked when this variable is
10633@code{nil}. @ref{Display Customization, Display Customization, ,
10634emacs-mime, Emacs-Mime Manual}.
10635
10636@vindex gnus-mime-display-multipart-as-mixed
10637@item gnus-mime-display-multipart-as-mixed
10638Display "multipart" parts as "multipart/mixed". If @code{t}, it
10639overrides @code{nil} values of
10640@code{gnus-mime-display-multipart-alternative-as-mixed} and
10641@code{gnus-mime-display-multipart-related-as-mixed}.
10642
10643@vindex mm-file-name-rewrite-functions
10644@item mm-file-name-rewrite-functions
10645List of functions used for rewriting file names of @acronym{MIME} parts.
10646Each function takes a file name as input and returns a file name.
10647
10648Ready-made functions include@*
10649@code{mm-file-name-delete-whitespace},
10650@code{mm-file-name-trim-whitespace},
10651@code{mm-file-name-collapse-whitespace}, and
10652@code{mm-file-name-replace-whitespace}. The later uses the value of
10653the variable @code{mm-file-name-replace-whitespace} to replace each
10654whitespace character in a file name with that string; default value
10655is @code{"_"} (a single underscore).
10656@findex mm-file-name-delete-whitespace
10657@findex mm-file-name-trim-whitespace
10658@findex mm-file-name-collapse-whitespace
10659@findex mm-file-name-replace-whitespace
10660@vindex mm-file-name-replace-whitespace
10661
10662The standard functions @code{capitalize}, @code{downcase},
10663@code{upcase}, and @code{upcase-initials} may be useful, too.
10664
10665Everybody knows that whitespace characters in file names are evil,
10666except those who don't know. If you receive lots of attachments from
10667such unenlightened users, you can make live easier by adding
10668
10669@lisp
10670(setq mm-file-name-rewrite-functions
10671 '(mm-file-name-trim-whitespace
10672 mm-file-name-collapse-whitespace
10673 mm-file-name-replace-whitespace))
10674@end lisp
10675
10676@noindent
10677to your @file{~/.gnus.el} file.
10678
10679@end table
10680
10681
10682@node Charsets
10683@section Charsets
10684@cindex charsets
10685
10686People use different charsets, and we have @acronym{MIME} to let us know what
10687charsets they use. Or rather, we wish we had. Many people use
10688newsreaders and mailers that do not understand or use @acronym{MIME}, and
10689just send out messages without saying what character sets they use. To
10690help a bit with this, some local news hierarchies have policies that say
10691what character set is the default. For instance, the @samp{fj}
10692hierarchy uses @code{iso-2022-jp}.
10693
10694@vindex gnus-group-charset-alist
10695This knowledge is encoded in the @code{gnus-group-charset-alist}
10696variable, which is an alist of regexps (use the first item to match full
10697group names) and default charsets to be used when reading these groups.
10698
10699@vindex gnus-newsgroup-ignored-charsets
10700In addition, some people do use soi-disant @acronym{MIME}-aware agents that
10701aren't. These blithely mark messages as being in @code{iso-8859-1}
10702even if they really are in @code{koi-8}. To help here, the
10703@code{gnus-newsgroup-ignored-charsets} variable can be used. The
10704charsets that are listed here will be ignored. The variable can be
10705set on a group-by-group basis using the group parameters (@pxref{Group
10706Parameters}). The default value is @code{(unknown-8bit x-unknown)},
10707which includes values some agents insist on having in there.
10708
10709@vindex gnus-group-posting-charset-alist
10710When posting, @code{gnus-group-posting-charset-alist} is used to
10711determine which charsets should not be encoded using the @acronym{MIME}
10712encodings. For instance, some hierarchies discourage using
10713quoted-printable header encoding.
10714
10715This variable is an alist of regexps and permitted unencoded charsets
10716for posting. Each element of the alist has the form @code{(}@var{test
10717header body-list}@code{)}, where:
10718
10719@table @var
10720@item test
10721is either a regular expression matching the newsgroup header or a
10722variable to query,
10723@item header
10724is the charset which may be left unencoded in the header (@code{nil}
10725means encode all charsets),
10726@item body-list
10727is a list of charsets which may be encoded using 8bit content-transfer
10728encoding in the body, or one of the special values @code{nil} (always
10729encode using quoted-printable) or @code{t} (always use 8bit).
10730@end table
10731
10732@cindex Russian
10733@cindex koi8-r
10734@cindex koi8-u
10735@cindex iso-8859-5
10736@cindex coding system aliases
10737@cindex preferred charset
10738
10739@xref{Encoding Customization, , Encoding Customization, emacs-mime,
10740The Emacs MIME Manual}, for additional variables that control which
10741MIME charsets are used when sending messages.
10742
10743Other charset tricks that may be useful, although not Gnus-specific:
10744
10745If there are several @acronym{MIME} charsets that encode the same Emacs
10746charset, you can choose what charset to use by saying the following:
10747
10748@lisp
10749(put-charset-property 'cyrillic-iso8859-5
10750 'preferred-coding-system 'koi8-r)
10751@end lisp
10752
10753This means that Russian will be encoded using @code{koi8-r} instead of
10754the default @code{iso-8859-5} @acronym{MIME} charset.
10755
10756If you want to read messages in @code{koi8-u}, you can cheat and say
10757
10758@lisp
10759(define-coding-system-alias 'koi8-u 'koi8-r)
10760@end lisp
10761
10762This will almost do the right thing.
10763
10764And finally, to read charsets like @code{windows-1251}, you can say
10765something like
10766
10767@lisp
10768(codepage-setup 1251)
10769(define-coding-system-alias 'windows-1251 'cp1251)
10770@end lisp
10771
10772
10773@node Article Commands
10774@section Article Commands
10775
10776@table @kbd
10777
10778@item A P
10779@cindex PostScript
10780@cindex printing
10781@kindex A P (Summary)
10782@vindex gnus-ps-print-hook
10783@findex gnus-summary-print-article
10784Generate and print a PostScript image of the article buffer
10785(@code{gnus-summary-print-article}). @code{gnus-ps-print-hook} will
10786be run just before printing the buffer. An alternative way to print
10787article is to use Muttprint (@pxref{Saving Articles}).
10788
10789@end table
10790
10791
10792@node Summary Sorting
10793@section Summary Sorting
10794@cindex summary sorting
10795
10796You can have the summary buffer sorted in various ways, even though I
10797can't really see why you'd want that.
10798
10799@table @kbd
10800
10801@item C-c C-s C-n
10802@kindex C-c C-s C-n (Summary)
10803@findex gnus-summary-sort-by-number
10804Sort by article number (@code{gnus-summary-sort-by-number}).
10805
6ecfe5c2
MB
10806@item C-c C-s C-m C-n
10807@kindex C-c C-s C-n (Summary)
10808@findex gnus-summary-sort-by-most-recent-number
10809Sort by most recent article number
10810(@code{gnus-summary-sort-by-most-recent-number}).
10811
4009494e
GM
10812@item C-c C-s C-a
10813@kindex C-c C-s C-a (Summary)
10814@findex gnus-summary-sort-by-author
10815Sort by author (@code{gnus-summary-sort-by-author}).
10816
01c52d31
MB
10817@item C-c C-s C-t
10818@kindex C-c C-s C-t (Summary)
10819@findex gnus-summary-sort-by-recipient
10820Sort by recipient (@code{gnus-summary-sort-by-recipient}).
10821
4009494e
GM
10822@item C-c C-s C-s
10823@kindex C-c C-s C-s (Summary)
10824@findex gnus-summary-sort-by-subject
10825Sort by subject (@code{gnus-summary-sort-by-subject}).
10826
10827@item C-c C-s C-d
10828@kindex C-c C-s C-d (Summary)
10829@findex gnus-summary-sort-by-date
10830Sort by date (@code{gnus-summary-sort-by-date}).
10831
6ecfe5c2
MB
10832@item C-c C-s C-m C-d
10833@kindex C-c C-s C-m C-d (Summary)
10834@findex gnus-summary-sort-by-most-recent-date
10835Sort by most recent date (@code{gnus-summary-sort-by-most-recent-date}).
10836
4009494e
GM
10837@item C-c C-s C-l
10838@kindex C-c C-s C-l (Summary)
10839@findex gnus-summary-sort-by-lines
10840Sort by lines (@code{gnus-summary-sort-by-lines}).
10841
10842@item C-c C-s C-c
10843@kindex C-c C-s C-c (Summary)
10844@findex gnus-summary-sort-by-chars
10845Sort by article length (@code{gnus-summary-sort-by-chars}).
10846
10847@item C-c C-s C-i
10848@kindex C-c C-s C-i (Summary)
10849@findex gnus-summary-sort-by-score
10850Sort by score (@code{gnus-summary-sort-by-score}).
10851
10852@item C-c C-s C-r
10853@kindex C-c C-s C-r (Summary)
10854@findex gnus-summary-sort-by-random
10855Randomize (@code{gnus-summary-sort-by-random}).
10856
10857@item C-c C-s C-o
10858@kindex C-c C-s C-o (Summary)
10859@findex gnus-summary-sort-by-original
10860Sort using the default sorting method
10861(@code{gnus-summary-sort-by-original}).
10862@end table
10863
10864These functions will work both when you use threading and when you don't
10865use threading. In the latter case, all summary lines will be sorted,
10866line by line. In the former case, sorting will be done on a
10867root-by-root basis, which might not be what you were looking for. To
10868toggle whether to use threading, type @kbd{T T} (@pxref{Thread
10869Commands}).
10870
6ecfe5c2
MB
10871If a prefix argument if given, the sort order is reversed.
10872
4009494e
GM
10873
10874@node Finding the Parent
10875@section Finding the Parent
10876@cindex parent articles
10877@cindex referring articles
10878
10879@table @kbd
10880@item ^
10881@kindex ^ (Summary)
10882@findex gnus-summary-refer-parent-article
10883If you'd like to read the parent of the current article, and it is not
10884displayed in the summary buffer, you might still be able to. That is,
10885if the current group is fetched by @acronym{NNTP}, the parent hasn't expired
10886and the @code{References} in the current article are not mangled, you
10887can just press @kbd{^} or @kbd{A r}
10888(@code{gnus-summary-refer-parent-article}). If everything goes well,
10889you'll get the parent. If the parent is already displayed in the
10890summary buffer, point will just move to this article.
10891
10892If given a positive numerical prefix, fetch that many articles back into
10893the ancestry. If given a negative numerical prefix, fetch just that
10894ancestor. So if you say @kbd{3 ^}, Gnus will fetch the parent, the
10895grandparent and the grandgrandparent of the current article. If you say
10896@kbd{-3 ^}, Gnus will only fetch the grandgrandparent of the current
10897article.
10898
10899@item A R (Summary)
10900@findex gnus-summary-refer-references
10901@kindex A R (Summary)
10902Fetch all articles mentioned in the @code{References} header of the
10903article (@code{gnus-summary-refer-references}).
10904
10905@item A T (Summary)
10906@findex gnus-summary-refer-thread
10907@kindex A T (Summary)
10908Display the full thread where the current article appears
10909(@code{gnus-summary-refer-thread}). This command has to fetch all the
10910headers in the current group to work, so it usually takes a while. If
10911you do it often, you may consider setting @code{gnus-fetch-old-headers}
10912to @code{invisible} (@pxref{Filling In Threads}). This won't have any
10913visible effects normally, but it'll make this command work a whole lot
10914faster. Of course, it'll make group entry somewhat slow.
10915
10916@vindex gnus-refer-thread-limit
10917The @code{gnus-refer-thread-limit} variable says how many old (i. e.,
10918articles before the first displayed in the current group) headers to
10919fetch when doing this command. The default is 200. If @code{t}, all
10920the available headers will be fetched. This variable can be overridden
10921by giving the @kbd{A T} command a numerical prefix.
10922
10923@item M-^ (Summary)
10924@findex gnus-summary-refer-article
10925@kindex M-^ (Summary)
10926@cindex Message-ID
10927@cindex fetching by Message-ID
10928You can also ask Gnus for an arbitrary article, no matter what group it
10929belongs to. @kbd{M-^} (@code{gnus-summary-refer-article}) will ask you
10930for a @code{Message-ID}, which is one of those long, hard-to-read
10931thingies that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}.
10932You have to get it all exactly right. No fuzzy searches, I'm afraid.
10933
10934Gnus looks for the @code{Message-ID} in the headers that have already
10935been fetched, but also tries all the select methods specified by
10936@code{gnus-refer-article-method} if it is not found.
10937@end table
10938
10939@vindex gnus-refer-article-method
10940If the group you are reading is located on a back end that does not
10941support fetching by @code{Message-ID} very well (like @code{nnspool}),
10942you can set @code{gnus-refer-article-method} to an @acronym{NNTP} method. It
10943would, perhaps, be best if the @acronym{NNTP} server you consult is the one
10944updating the spool you are reading from, but that's not really
10945necessary.
10946
10947It can also be a list of select methods, as well as the special symbol
10948@code{current}, which means to use the current select method. If it
10949is a list, Gnus will try all the methods in the list until it finds a
10950match.
10951
10952Here's an example setting that will first try the current method, and
10953then ask Google if that fails:
10954
10955@lisp
10956(setq gnus-refer-article-method
10957 '(current
10958 (nnweb "google" (nnweb-type google))))
10959@end lisp
10960
10961Most of the mail back ends support fetching by @code{Message-ID}, but
10962do not do a particularly excellent job at it. That is, @code{nnmbox},
10963@code{nnbabyl}, @code{nnmaildir}, @code{nnml}, are able to locate
10964articles from any groups, while @code{nnfolder}, and @code{nnimap} are
10965only able to locate articles that have been posted to the current
10966group. (Anything else would be too time consuming.) @code{nnmh} does
10967not support this at all.
10968
10969
10970@node Alternative Approaches
10971@section Alternative Approaches
10972
10973Different people like to read news using different methods. This being
10974Gnus, we offer a small selection of minor modes for the summary buffers.
10975
10976@menu
10977* Pick and Read:: First mark articles and then read them.
10978* Binary Groups:: Auto-decode all articles.
10979@end menu
10980
10981
10982@node Pick and Read
10983@subsection Pick and Read
10984@cindex pick and read
10985
10986Some newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) use
10987a two-phased reading interface. The user first marks in a summary
10988buffer the articles she wants to read. Then she starts reading the
10989articles with just an article buffer displayed.
10990
10991@findex gnus-pick-mode
10992@kindex M-x gnus-pick-mode
10993Gnus provides a summary buffer minor mode that allows
10994this---@code{gnus-pick-mode}. This basically means that a few process
10995mark commands become one-keystroke commands to allow easy marking, and
10996it provides one additional command for switching to the summary buffer.
10997
10998Here are the available keystrokes when using pick mode:
10999
11000@table @kbd
11001@item .
11002@kindex . (Pick)
11003@findex gnus-pick-article-or-thread
11004Pick the article or thread on the current line
11005(@code{gnus-pick-article-or-thread}). If the variable
11006@code{gnus-thread-hide-subtree} is true, then this key selects the
11007entire thread when used at the first article of the thread. Otherwise,
11008it selects just the article. If given a numerical prefix, go to that
11009thread or article and pick it. (The line number is normally displayed
11010at the beginning of the summary pick lines.)
11011
11012@item SPACE
11013@kindex SPACE (Pick)
11014@findex gnus-pick-next-page
11015Scroll the summary buffer up one page (@code{gnus-pick-next-page}). If
11016at the end of the buffer, start reading the picked articles.
11017
11018@item u
11019@kindex u (Pick)
11020@findex gnus-pick-unmark-article-or-thread.
11021Unpick the thread or article
11022(@code{gnus-pick-unmark-article-or-thread}). If the variable
11023@code{gnus-thread-hide-subtree} is true, then this key unpicks the
11024thread if used at the first article of the thread. Otherwise it unpicks
11025just the article. You can give this key a numerical prefix to unpick
11026the thread or article at that line.
11027
11028@item RET
11029@kindex RET (Pick)
11030@findex gnus-pick-start-reading
11031@vindex gnus-pick-display-summary
11032Start reading the picked articles (@code{gnus-pick-start-reading}). If
11033given a prefix, mark all unpicked articles as read first. If
11034@code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer
11035will still be visible when you are reading.
11036
11037@end table
11038
11039All the normal summary mode commands are still available in the
11040pick-mode, with the exception of @kbd{u}. However @kbd{!} is available
11041which is mapped to the same function
11042@code{gnus-summary-tick-article-forward}.
11043
11044If this sounds like a good idea to you, you could say:
11045
11046@lisp
11047(add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
11048@end lisp
11049
11050@vindex gnus-pick-mode-hook
11051@code{gnus-pick-mode-hook} is run in pick minor mode buffers.
11052
11053@vindex gnus-mark-unpicked-articles-as-read
11054If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark
11055all unpicked articles as read. The default is @code{nil}.
11056
11057@vindex gnus-summary-pick-line-format
11058The summary line format in pick mode is slightly different from the
11059standard format. At the beginning of each line the line number is
11060displayed. The pick mode line format is controlled by the
11061@code{gnus-summary-pick-line-format} variable (@pxref{Formatting
11062Variables}). It accepts the same format specs that
11063@code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}).
11064
11065
11066@node Binary Groups
11067@subsection Binary Groups
11068@cindex binary groups
11069
11070@findex gnus-binary-mode
11071@kindex M-x gnus-binary-mode
11072If you spend much time in binary groups, you may grow tired of hitting
11073@kbd{X u}, @kbd{n}, @kbd{RET} all the time. @kbd{M-x gnus-binary-mode}
11074is a minor mode for summary buffers that makes all ordinary Gnus article
11075selection functions uudecode series of articles and display the result
11076instead of just displaying the articles the normal way.
11077
11078@kindex g (Binary)
11079@findex gnus-binary-show-article
11080The only way, in fact, to see the actual articles is the @kbd{g}
11081command, when you have turned on this mode
11082(@code{gnus-binary-show-article}).
11083
11084@vindex gnus-binary-mode-hook
11085@code{gnus-binary-mode-hook} is called in binary minor mode buffers.
11086
11087
11088@node Tree Display
11089@section Tree Display
11090@cindex trees
11091
11092@vindex gnus-use-trees
11093If you don't like the normal Gnus summary display, you might try setting
11094@code{gnus-use-trees} to @code{t}. This will create (by default) an
11095additional @dfn{tree buffer}. You can execute all summary mode commands
11096in the tree buffer.
11097
11098There are a few variables to customize the tree display, of course:
11099
11100@table @code
11101@item gnus-tree-mode-hook
11102@vindex gnus-tree-mode-hook
11103A hook called in all tree mode buffers.
11104
11105@item gnus-tree-mode-line-format
11106@vindex gnus-tree-mode-line-format
11107A format string for the mode bar in the tree mode buffers (@pxref{Mode
11108Line Formatting}). The default is @samp{Gnus: %%b %S %Z}. For a list
11109of valid specs, @pxref{Summary Buffer Mode Line}.
11110
11111@item gnus-selected-tree-face
11112@vindex gnus-selected-tree-face
11113Face used for highlighting the selected article in the tree buffer. The
11114default is @code{modeline}.
11115
11116@item gnus-tree-line-format
11117@vindex gnus-tree-line-format
11118A format string for the tree nodes. The name is a bit of a misnomer,
11119though---it doesn't define a line, but just the node. The default value
11120is @samp{%(%[%3,3n%]%)}, which displays the first three characters of
11121the name of the poster. It is vital that all nodes are of the same
11122length, so you @emph{must} use @samp{%4,4n}-like specifiers.
11123
11124Valid specs are:
11125
11126@table @samp
11127@item n
11128The name of the poster.
11129@item f
11130The @code{From} header.
11131@item N
11132The number of the article.
11133@item [
11134The opening bracket.
11135@item ]
11136The closing bracket.
11137@item s
11138The subject.
11139@end table
11140
11141@xref{Formatting Variables}.
11142
11143Variables related to the display are:
11144
11145@table @code
11146@item gnus-tree-brackets
11147@vindex gnus-tree-brackets
11148This is used for differentiating between ``real'' articles and
11149``sparse'' articles. The format is
11150@example
11151((@var{real-open} . @var{real-close})
11152 (@var{sparse-open} . @var{sparse-close})
11153 (@var{dummy-open} . @var{dummy-close}))
11154@end example
11155and the default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))}.
11156
11157@item gnus-tree-parent-child-edges
11158@vindex gnus-tree-parent-child-edges
11159This is a list that contains the characters used for connecting parent
11160nodes to their children. The default is @code{(?- ?\\ ?|)}.
11161
11162@end table
11163
11164@item gnus-tree-minimize-window
11165@vindex gnus-tree-minimize-window
11166If this variable is non-@code{nil}, Gnus will try to keep the tree
11167buffer as small as possible to allow more room for the other Gnus
11168windows. If this variable is a number, the tree buffer will never be
11169higher than that number. The default is @code{t}. Note that if you
11170have several windows displayed side-by-side in a frame and the tree
11171buffer is one of these, minimizing the tree window will also resize all
11172other windows displayed next to it.
11173
11174You may also wish to add the following hook to keep the window minimized
11175at all times:
11176
11177@lisp
11178(add-hook 'gnus-configure-windows-hook
11179 'gnus-tree-perhaps-minimize)
11180@end lisp
11181
11182@item gnus-generate-tree-function
11183@vindex gnus-generate-tree-function
11184@findex gnus-generate-horizontal-tree
11185@findex gnus-generate-vertical-tree
11186The function that actually generates the thread tree. Two predefined
11187functions are available: @code{gnus-generate-horizontal-tree} and
11188@code{gnus-generate-vertical-tree} (which is the default).
11189
11190@end table
11191
11192Here's an example from a horizontal tree buffer:
11193
11194@example
11195@{***@}-(***)-[odd]-[Gun]
11196 | \[Jan]
11197 | \[odd]-[Eri]
11198 | \(***)-[Eri]
11199 | \[odd]-[Paa]
11200 \[Bjo]
11201 \[Gun]
11202 \[Gun]-[Jor]
11203@end example
11204
11205Here's the same thread displayed in a vertical tree buffer:
11206
11207@example
11208@group
11209@{***@}
11210 |--------------------------\-----\-----\
11211(***) [Bjo] [Gun] [Gun]
11212 |--\-----\-----\ |
11213[odd] [Jan] [odd] (***) [Jor]
11214 | | |--\
11215[Gun] [Eri] [Eri] [odd]
11216 |
11217 [Paa]
11218@end group
11219@end example
11220
11221If you're using horizontal trees, it might be nice to display the trees
11222side-by-side with the summary buffer. You could add something like the
11223following to your @file{~/.gnus.el} file:
11224
11225@lisp
11226(setq gnus-use-trees t
11227 gnus-generate-tree-function 'gnus-generate-horizontal-tree
11228 gnus-tree-minimize-window nil)
11229(gnus-add-configuration
11230 '(article
11231 (vertical 1.0
11232 (horizontal 0.25
11233 (summary 0.75 point)
11234 (tree 1.0))
11235 (article 1.0))))
11236@end lisp
11237
11238@xref{Window Layout}.
11239
11240
11241@node Mail Group Commands
11242@section Mail Group Commands
11243@cindex mail group commands
11244
11245Some commands only make sense in mail groups. If these commands are
11246invalid in the current group, they will raise a hell and let you know.
11247
11248All these commands (except the expiry and edit commands) use the
11249process/prefix convention (@pxref{Process/Prefix}).
11250
11251@table @kbd
11252
11253@item B e
11254@kindex B e (Summary)
11255@findex gnus-summary-expire-articles
11256@cindex expiring mail
11257Run all expirable articles in the current group through the expiry
11258process (@code{gnus-summary-expire-articles}). That is, delete all
11259expirable articles in the group that have been around for a while.
11260(@pxref{Expiring Mail}).
11261
11262@item B C-M-e
11263@kindex B C-M-e (Summary)
11264@findex gnus-summary-expire-articles-now
11265@cindex expiring mail
11266Delete all the expirable articles in the group
11267(@code{gnus-summary-expire-articles-now}). This means that @strong{all}
11268articles eligible for expiry in the current group will
11269disappear forever into that big @file{/dev/null} in the sky.
11270
11271@item B DEL
11272@kindex B DEL (Summary)
11273@findex gnus-summary-delete-article
11274@c @icon{gnus-summary-mail-delete}
11275Delete the mail article. This is ``delete'' as in ``delete it from your
11276disk forever and ever, never to return again.'' Use with caution.
11277(@code{gnus-summary-delete-article}).
11278
11279@item B m
11280@kindex B m (Summary)
11281@cindex move mail
11282@findex gnus-summary-move-article
11283@vindex gnus-preserve-marks
11284Move the article from one mail group to another
11285(@code{gnus-summary-move-article}). Marks will be preserved if
11286@code{gnus-preserve-marks} is non-@code{nil} (which is the default).
11287
11288@item B c
11289@kindex B c (Summary)
11290@cindex copy mail
11291@findex gnus-summary-copy-article
11292@c @icon{gnus-summary-mail-copy}
11293Copy the article from one group (mail group or not) to a mail group
11294(@code{gnus-summary-copy-article}). Marks will be preserved if
11295@code{gnus-preserve-marks} is non-@code{nil} (which is the default).
11296
11297@item B B
11298@kindex B B (Summary)
11299@cindex crosspost mail
11300@findex gnus-summary-crosspost-article
11301Crosspost the current article to some other group
11302(@code{gnus-summary-crosspost-article}). This will create a new copy of
11303the article in the other group, and the Xref headers of the article will
11304be properly updated.
11305
11306@item B i
11307@kindex B i (Summary)
11308@findex gnus-summary-import-article
11309Import an arbitrary file into the current mail newsgroup
11310(@code{gnus-summary-import-article}). You will be prompted for a file
11311name, a @code{From} header and a @code{Subject} header.
11312
11313@item B I
11314@kindex B I (Summary)
11315@findex gnus-summary-create-article
11316Create an empty article in the current mail newsgroups
11317(@code{gnus-summary-create-article}). You will be prompted for a
11318@code{From} header and a @code{Subject} header.
11319
11320@item B r
11321@kindex B r (Summary)
11322@findex gnus-summary-respool-article
11323@vindex gnus-summary-respool-default-method
11324Respool the mail article (@code{gnus-summary-respool-article}).
11325@code{gnus-summary-respool-default-method} will be used as the default
11326select method when respooling. This variable is @code{nil} by default,
11327which means that the current group select method will be used instead.
11328Marks will be preserved if @code{gnus-preserve-marks} is non-@code{nil}
11329(which is the default).
11330
11331@item B w
11332@itemx e
11333@kindex B w (Summary)
11334@kindex e (Summary)
11335@findex gnus-summary-edit-article
11336@kindex C-c C-c (Article)
11337@findex gnus-summary-edit-article-done
11338Edit the current article (@code{gnus-summary-edit-article}). To finish
11339editing and make the changes permanent, type @kbd{C-c C-c}
11340(@code{gnus-summary-edit-article-done}). If you give a prefix to the
11341@kbd{C-c C-c} command, Gnus won't re-highlight the article.
11342
11343@item B q
11344@kindex B q (Summary)
11345@findex gnus-summary-respool-query
11346If you want to re-spool an article, you might be curious as to what group
11347the article will end up in before you do the re-spooling. This command
11348will tell you (@code{gnus-summary-respool-query}).
11349
11350@item B t
11351@kindex B t (Summary)
11352@findex gnus-summary-respool-trace
11353Similarly, this command will display all fancy splitting patterns used
11354when respooling, if any (@code{gnus-summary-respool-trace}).
11355
11356@item B p
11357@kindex B p (Summary)
11358@findex gnus-summary-article-posted-p
11359Some people have a tendency to send you ``courtesy'' copies when they
11360follow up to articles you have posted. These usually have a
11361@code{Newsgroups} header in them, but not always. This command
11362(@code{gnus-summary-article-posted-p}) will try to fetch the current
11363article from your news server (or rather, from
11364@code{gnus-refer-article-method} or @code{gnus-select-method}) and will
11365report back whether it found the article or not. Even if it says that
11366it didn't find the article, it may have been posted anyway---mail
11367propagation is much faster than news propagation, and the news copy may
11368just not have arrived yet.
11369
11370@item K E
11371@kindex K E (Summary)
11372@findex gnus-article-encrypt-body
11373@vindex gnus-article-encrypt-protocol
11374Encrypt the body of an article (@code{gnus-article-encrypt-body}).
11375The body is encrypted with the encryption protocol specified by the
11376variable @code{gnus-article-encrypt-protocol}.
11377
11378@end table
11379
11380@vindex gnus-move-split-methods
11381@cindex moving articles
11382If you move (or copy) articles regularly, you might wish to have Gnus
11383suggest where to put the articles. @code{gnus-move-split-methods} is a
11384variable that uses the same syntax as @code{gnus-split-methods}
11385(@pxref{Saving Articles}). You may customize that variable to create
11386suggestions you find reasonable. (Note that
11387@code{gnus-move-split-methods} uses group names where
11388@code{gnus-split-methods} uses file names.)
11389
11390@lisp
11391(setq gnus-move-split-methods
11392 '(("^From:.*Lars Magne" "nnml:junk")
11393 ("^Subject:.*gnus" "nnfolder:important")
11394 (".*" "nnml:misc")))
11395@end lisp
11396
11397
11398@node Various Summary Stuff
11399@section Various Summary Stuff
11400
11401@menu
11402* Summary Group Information:: Information oriented commands.
11403* Searching for Articles:: Multiple article commands.
11404* Summary Generation Commands::
11405* Really Various Summary Commands:: Those pesky non-conformant commands.
11406@end menu
11407
11408@table @code
11409@vindex gnus-summary-display-while-building
11410@item gnus-summary-display-while-building
11411If non-@code{nil}, show and update the summary buffer as it's being
11412built. If @code{t}, update the buffer after every line is inserted.
11413If the value is an integer, @var{n}, update the display every @var{n}
11414lines. The default is @code{nil}.
11415
11416@vindex gnus-summary-display-arrow
11417@item gnus-summary-display-arrow
11418If non-@code{nil}, display an arrow in the fringe to indicate the
11419current article.
11420
11421@vindex gnus-summary-mode-hook
11422@item gnus-summary-mode-hook
11423This hook is called when creating a summary mode buffer.
11424
11425@vindex gnus-summary-generate-hook
11426@item gnus-summary-generate-hook
11427This is called as the last thing before doing the threading and the
11428generation of the summary buffer. It's quite convenient for customizing
11429the threading variables based on what data the newsgroup has. This hook
11430is called from the summary buffer after most summary buffer variables
11431have been set.
11432
11433@vindex gnus-summary-prepare-hook
11434@item gnus-summary-prepare-hook
11435It is called after the summary buffer has been generated. You might use
11436it to, for instance, highlight lines or modify the look of the buffer in
11437some other ungodly manner. I don't care.
11438
11439@vindex gnus-summary-prepared-hook
11440@item gnus-summary-prepared-hook
11441A hook called as the very last thing after the summary buffer has been
11442generated.
11443
11444@vindex gnus-summary-ignore-duplicates
11445@item gnus-summary-ignore-duplicates
11446When Gnus discovers two articles that have the same @code{Message-ID},
11447it has to do something drastic. No articles are allowed to have the
11448same @code{Message-ID}, but this may happen when reading mail from some
11449sources. Gnus allows you to customize what happens with this variable.
11450If it is @code{nil} (which is the default), Gnus will rename the
11451@code{Message-ID} (for display purposes only) and display the article as
11452any other article. If this variable is @code{t}, it won't display the
11453article---it'll be as if it never existed.
11454
11455@vindex gnus-alter-articles-to-read-function
11456@item gnus-alter-articles-to-read-function
11457This function, which takes two parameters (the group name and the list
11458of articles to be selected), is called to allow the user to alter the
11459list of articles to be selected.
11460
11461For instance, the following function adds the list of cached articles to
11462the list in one particular group:
11463
11464@lisp
11465(defun my-add-cached-articles (group articles)
11466 (if (string= group "some.group")
11467 (append gnus-newsgroup-cached articles)
11468 articles))
11469@end lisp
11470
11471@vindex gnus-newsgroup-variables
11472@item gnus-newsgroup-variables
11473A list of newsgroup (summary buffer) local variables, or cons of
11474variables and their default expressions to be evalled (when the default
11475values are not @code{nil}), that should be made global while the summary
11476buffer is active.
11477
11478Note: The default expressions will be evaluated (using function
11479@code{eval}) before assignment to the local variable rather than just
11480assigned to it. If the default expression is the symbol @code{global},
11481that symbol will not be evaluated but the global value of the local
11482variable will be used instead.
11483
11484These variables can be used to set variables in the group parameters
11485while still allowing them to affect operations done in other
11486buffers. For example:
11487
11488@lisp
11489(setq gnus-newsgroup-variables
11490 '(message-use-followup-to
11491 (gnus-visible-headers .
11492 "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^To:")))
11493@end lisp
11494
11495Also @pxref{Group Parameters}.
3a23a519
MB
11496
11497@vindex gnus-propagate-marks
11498@item gnus-propagate-marks
11499If non-@code{nil}, propagate marks to the backends for possible
11500storing. @xref{NNTP marks}, and friends, for a more fine-grained
11501sieve.
11502
4009494e
GM
11503@end table
11504
11505
11506@node Summary Group Information
11507@subsection Summary Group Information
11508
11509@table @kbd
11510
11511@item H f
11512@kindex H f (Summary)
11513@findex gnus-summary-fetch-faq
11514@vindex gnus-group-faq-directory
11515Try to fetch the @acronym{FAQ} (list of frequently asked questions)
11516for the current group (@code{gnus-summary-fetch-faq}). Gnus will try
11517to get the @acronym{FAQ} from @code{gnus-group-faq-directory}, which
11518is usually a directory on a remote machine. This variable can also be
11519a list of directories. In that case, giving a prefix to this command
11520will allow you to choose between the various sites. @code{ange-ftp}
11521or @code{efs} will probably be used for fetching the file.
11522
11523@item H d
11524@kindex H d (Summary)
11525@findex gnus-summary-describe-group
11526Give a brief description of the current group
11527(@code{gnus-summary-describe-group}). If given a prefix, force
11528rereading the description from the server.
11529
11530@item H h
11531@kindex H h (Summary)
11532@findex gnus-summary-describe-briefly
11533Give an extremely brief description of the most important summary
11534keystrokes (@code{gnus-summary-describe-briefly}).
11535
11536@item H i
11537@kindex H i (Summary)
11538@findex gnus-info-find-node
11539Go to the Gnus info node (@code{gnus-info-find-node}).
11540@end table
11541
11542
11543@node Searching for Articles
11544@subsection Searching for Articles
11545
11546@table @kbd
11547
11548@item M-s
11549@kindex M-s (Summary)
11550@findex gnus-summary-search-article-forward
11551Search through all subsequent (raw) articles for a regexp
11552(@code{gnus-summary-search-article-forward}).
11553
11554@item M-r
11555@kindex M-r (Summary)
11556@findex gnus-summary-search-article-backward
11557Search through all previous (raw) articles for a regexp
11558(@code{gnus-summary-search-article-backward}).
11559
01c52d31
MB
11560@item M-S
11561@kindex M-S (Summary)
11562@findex gnus-summary-repeat-search-article-forward
11563Repeat the previous search forwards
11564(@code{gnus-summary-repeat-search-article-forward}).
11565
11566@item M-R
11567@kindex M-R (Summary)
11568@findex gnus-summary-repeat-search-article-backward
11569Repeat the previous search backwards
11570(@code{gnus-summary-repeat-search-article-backward}).
11571
4009494e
GM
11572@item &
11573@kindex & (Summary)
11574@findex gnus-summary-execute-command
11575This command will prompt you for a header, a regular expression to match
11576on this field, and a command to be executed if the match is made
11577(@code{gnus-summary-execute-command}). If the header is an empty
11578string, the match is done on the entire article. If given a prefix,
11579search backward instead.
11580
11581For instance, @kbd{& RET some.*string RET #} will put the process mark on
11582all articles that have heads or bodies that match @samp{some.*string}.
11583
11584@item M-&
11585@kindex M-& (Summary)
11586@findex gnus-summary-universal-argument
11587Perform any operation on all articles that have been marked with
11588the process mark (@code{gnus-summary-universal-argument}).
11589@end table
11590
11591@node Summary Generation Commands
11592@subsection Summary Generation Commands
11593
11594@table @kbd
11595
11596@item Y g
11597@kindex Y g (Summary)
11598@findex gnus-summary-prepare
11599Regenerate the current summary buffer (@code{gnus-summary-prepare}).
11600
11601@item Y c
11602@kindex Y c (Summary)
11603@findex gnus-summary-insert-cached-articles
11604Pull all cached articles (for the current group) into the summary buffer
11605(@code{gnus-summary-insert-cached-articles}).
11606
11607@item Y d
11608@kindex Y d (Summary)
11609@findex gnus-summary-insert-dormant-articles
11610Pull all dormant articles (for the current group) into the summary buffer
11611(@code{gnus-summary-insert-dormant-articles}).
11612
01c52d31
MB
11613@item Y t
11614@kindex Y t (Summary)
11615@findex gnus-summary-insert-ticked-articles
11616Pull all ticked articles (for the current group) into the summary buffer
11617(@code{gnus-summary-insert-ticked-articles}).
11618
4009494e
GM
11619@end table
11620
11621
11622@node Really Various Summary Commands
11623@subsection Really Various Summary Commands
11624
11625@table @kbd
11626
11627@item A D
11628@itemx C-d
11629@kindex C-d (Summary)
11630@kindex A D (Summary)
11631@findex gnus-summary-enter-digest-group
11632If the current article is a collection of other articles (for instance,
11633a digest), you might use this command to enter a group based on the that
11634article (@code{gnus-summary-enter-digest-group}). Gnus will try to
11635guess what article type is currently displayed unless you give a prefix
11636to this command, which forces a ``digest'' interpretation. Basically,
11637whenever you see a message that is a collection of other messages of
11638some format, you @kbd{C-d} and read these messages in a more convenient
11639fashion.
11640
01c52d31
MB
11641@vindex gnus-auto-select-on-ephemeral-exit
11642The variable @code{gnus-auto-select-on-ephemeral-exit} controls what
11643article should be selected after exiting a digest group. Valid values
11644include:
11645
11646@table @code
11647@item next
11648Select the next article.
11649
11650@item next-unread
11651Select the next unread article.
11652
11653@item next-noselect
11654Move the cursor to the next article. This is the default.
11655
11656@item next-unread-noselect
11657Move the cursor to the next unread article.
11658@end table
11659
11660If it has any other value or there is no next (unread) article, the
11661article selected before entering to the digest group will appear.
11662
4009494e
GM
11663@item C-M-d
11664@kindex C-M-d (Summary)
11665@findex gnus-summary-read-document
11666This command is very similar to the one above, but lets you gather
11667several documents into one biiig group
11668(@code{gnus-summary-read-document}). It does this by opening several
11669@code{nndoc} groups for each document, and then opening an
11670@code{nnvirtual} group on top of these @code{nndoc} groups. This
11671command understands the process/prefix convention
11672(@pxref{Process/Prefix}).
11673
11674@item C-t
11675@kindex C-t (Summary)
11676@findex gnus-summary-toggle-truncation
11677Toggle truncation of summary lines
11678(@code{gnus-summary-toggle-truncation}). This will probably confuse the
11679line centering function in the summary buffer, so it's not a good idea
11680to have truncation switched off while reading articles.
11681
11682@item =
11683@kindex = (Summary)
11684@findex gnus-summary-expand-window
11685Expand the summary buffer window (@code{gnus-summary-expand-window}).
11686If given a prefix, force an @code{article} window configuration.
11687
11688@item C-M-e
11689@kindex C-M-e (Summary)
11690@findex gnus-summary-edit-parameters
11691Edit the group parameters (@pxref{Group Parameters}) of the current
11692group (@code{gnus-summary-edit-parameters}).
11693
11694@item C-M-a
11695@kindex C-M-a (Summary)
11696@findex gnus-summary-customize-parameters
11697Customize the group parameters (@pxref{Group Parameters}) of the current
11698group (@code{gnus-summary-customize-parameters}).
11699
11700@end table
11701
11702
11703@node Exiting the Summary Buffer
11704@section Exiting the Summary Buffer
11705@cindex summary exit
11706@cindex exiting groups
11707
11708Exiting from the summary buffer will normally update all info on the
11709group and return you to the group buffer.
11710
11711@table @kbd
11712
11713@item Z Z
11714@itemx Z Q
11715@itemx q
11716@kindex Z Z (Summary)
11717@kindex Z Q (Summary)
11718@kindex q (Summary)
11719@findex gnus-summary-exit
11720@vindex gnus-summary-exit-hook
11721@vindex gnus-summary-prepare-exit-hook
11722@vindex gnus-group-no-more-groups-hook
11723@c @icon{gnus-summary-exit}
11724Exit the current group and update all information on the group
11725(@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} is
11726called before doing much of the exiting, which calls
11727@code{gnus-summary-expire-articles} by default.
11728@code{gnus-summary-exit-hook} is called after finishing the exit
11729process. @code{gnus-group-no-more-groups-hook} is run when returning to
11730group mode having no more (unread) groups.
11731
11732@item Z E
11733@itemx Q
11734@kindex Z E (Summary)
11735@kindex Q (Summary)
11736@findex gnus-summary-exit-no-update
11737Exit the current group without updating any information on the group
11738(@code{gnus-summary-exit-no-update}).
11739
11740@item Z c
11741@itemx c
11742@kindex Z c (Summary)
11743@kindex c (Summary)
11744@findex gnus-summary-catchup-and-exit
11745@c @icon{gnus-summary-catchup-and-exit}
11746Mark all unticked articles in the group as read and then exit
11747(@code{gnus-summary-catchup-and-exit}).
11748
11749@item Z C
11750@kindex Z C (Summary)
11751@findex gnus-summary-catchup-all-and-exit
11752Mark all articles, even the ticked ones, as read and then exit
11753(@code{gnus-summary-catchup-all-and-exit}).
11754
11755@item Z n
11756@kindex Z n (Summary)
11757@findex gnus-summary-catchup-and-goto-next-group
11758Mark all articles as read and go to the next group
11759(@code{gnus-summary-catchup-and-goto-next-group}).
11760
01c52d31
MB
11761@item Z p
11762@kindex Z p (Summary)
11763@findex gnus-summary-catchup-and-goto-prev-group
11764Mark all articles as read and go to the previous group
11765(@code{gnus-summary-catchup-and-goto-prev-group}).
11766
4009494e
GM
11767@item Z R
11768@itemx C-x C-s
11769@kindex Z R (Summary)
11770@kindex C-x C-s (Summary)
11771@findex gnus-summary-reselect-current-group
11772Exit this group, and then enter it again
11773(@code{gnus-summary-reselect-current-group}). If given a prefix, select
11774all articles, both read and unread.
11775
11776@item Z G
11777@itemx M-g
11778@kindex Z G (Summary)
11779@kindex M-g (Summary)
11780@findex gnus-summary-rescan-group
11781@c @icon{gnus-summary-mail-get}
11782Exit the group, check for new articles in the group, and select the
11783group (@code{gnus-summary-rescan-group}). If given a prefix, select all
11784articles, both read and unread.
11785
11786@item Z N
11787@kindex Z N (Summary)
11788@findex gnus-summary-next-group
11789Exit the group and go to the next group
11790(@code{gnus-summary-next-group}).
11791
11792@item Z P
11793@kindex Z P (Summary)
11794@findex gnus-summary-prev-group
11795Exit the group and go to the previous group
11796(@code{gnus-summary-prev-group}).
11797
11798@item Z s
11799@kindex Z s (Summary)
11800@findex gnus-summary-save-newsrc
11801Save the current number of read/marked articles in the dribble buffer
11802and then save the dribble buffer (@code{gnus-summary-save-newsrc}). If
11803given a prefix, also save the @file{.newsrc} file(s). Using this
11804command will make exit without updating (the @kbd{Q} command) worthless.
11805@end table
11806
11807@vindex gnus-exit-group-hook
11808@code{gnus-exit-group-hook} is called when you exit the current group
11809with an ``updating'' exit. For instance @kbd{Q}
11810(@code{gnus-summary-exit-no-update}) does not call this hook.
11811
11812@findex gnus-summary-wake-up-the-dead
11813@findex gnus-dead-summary-mode
11814@vindex gnus-kill-summary-on-exit
11815If you're in the habit of exiting groups, and then changing your mind
11816about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}.
11817If you do that, Gnus won't kill the summary buffer when you exit it.
11818(Quelle surprise!) Instead it will change the name of the buffer to
11819something like @samp{*Dead Summary ... *} and install a minor mode
11820called @code{gnus-dead-summary-mode}. Now, if you switch back to this
11821buffer, you'll find that all keys are mapped to a function called
11822@code{gnus-summary-wake-up-the-dead}. So tapping any keys in a dead
11823summary buffer will result in a live, normal summary buffer.
11824
11825There will never be more than one dead summary buffer at any one time.
11826
11827@vindex gnus-use-cross-reference
11828The data on the current group will be updated (which articles you have
11829read, which articles you have replied to, etc.) when you exit the
11830summary buffer. If the @code{gnus-use-cross-reference} variable is
11831@code{t} (which is the default), articles that are cross-referenced to
11832this group and are marked as read, will also be marked as read in the
11833other subscribed groups they were cross-posted to. If this variable is
11834neither @code{nil} nor @code{t}, the article will be marked as read in
11835both subscribed and unsubscribed groups (@pxref{Crosspost Handling}).
11836
11837
11838@node Crosspost Handling
11839@section Crosspost Handling
11840
11841@cindex velveeta
11842@cindex spamming
11843Marking cross-posted articles as read ensures that you'll never have to
11844read the same article more than once. Unless, of course, somebody has
11845posted it to several groups separately. Posting the same article to
11846several groups (not cross-posting) is called @dfn{spamming}, and you are
11847by law required to send nasty-grams to anyone who perpetrates such a
11848heinous crime. You may want to try NoCeM handling to filter out spam
11849(@pxref{NoCeM}).
11850
11851Remember: Cross-posting is kinda ok, but posting the same article
11852separately to several groups is not. Massive cross-posting (aka.
11853@dfn{velveeta}) is to be avoided at all costs, and you can even use the
11854@code{gnus-summary-mail-crosspost-complaint} command to complain about
11855excessive crossposting (@pxref{Summary Mail Commands}).
11856
11857@cindex cross-posting
11858@cindex Xref
11859@cindex @acronym{NOV}
11860One thing that may cause Gnus to not do the cross-posting thing
11861correctly is if you use an @acronym{NNTP} server that supports @sc{xover}
11862(which is very nice, because it speeds things up considerably) which
11863does not include the @code{Xref} header in its @acronym{NOV} lines. This is
11864Evil, but all too common, alas, alack. Gnus tries to Do The Right Thing
11865even with @sc{xover} by registering the @code{Xref} lines of all
11866articles you actually read, but if you kill the articles, or just mark
11867them as read without reading them, Gnus will not get a chance to snoop
11868the @code{Xref} lines out of these articles, and will be unable to use
11869the cross reference mechanism.
11870
11871@cindex LIST overview.fmt
11872@cindex overview.fmt
11873To check whether your @acronym{NNTP} server includes the @code{Xref} header
11874in its overview files, try @samp{telnet your.nntp.server nntp},
11875@samp{MODE READER} on @code{inn} servers, and then say @samp{LIST
11876overview.fmt}. This may not work, but if it does, and the last line you
11877get does not read @samp{Xref:full}, then you should shout and whine at
11878your news admin until she includes the @code{Xref} header in the
11879overview files.
11880
4009494e 11881If you want Gnus to get the @code{Xref}s right all the time, you have to
4b70e299
MB
11882set @code{nntp-nov-is-evil} to @code{t}, which slows things down
11883considerably. Also @pxref{Slow/Expensive Connection}.
4009494e
GM
11884
11885C'est la vie.
11886
11887For an alternative approach, @pxref{Duplicate Suppression}.
11888
11889
11890@node Duplicate Suppression
11891@section Duplicate Suppression
11892
11893By default, Gnus tries to make sure that you don't have to read the same
11894article more than once by utilizing the crossposting mechanism
11895(@pxref{Crosspost Handling}). However, that simple and efficient
11896approach may not work satisfactory for some users for various
11897reasons.
11898
11899@enumerate
11900@item
11901The @acronym{NNTP} server may fail to generate the @code{Xref} header. This
11902is evil and not very common.
11903
11904@item
11905The @acronym{NNTP} server may fail to include the @code{Xref} header in the
11906@file{.overview} data bases. This is evil and all too common, alas.
11907
11908@item
11909You may be reading the same group (or several related groups) from
11910different @acronym{NNTP} servers.
11911
11912@item
11913You may be getting mail that duplicates articles posted to groups.
11914@end enumerate
11915
11916I'm sure there are other situations where @code{Xref} handling fails as
11917well, but these four are the most common situations.
11918
11919If, and only if, @code{Xref} handling fails for you, then you may
11920consider switching on @dfn{duplicate suppression}. If you do so, Gnus
11921will remember the @code{Message-ID}s of all articles you have read or
11922otherwise marked as read, and then, as if by magic, mark them as read
11923all subsequent times you see them---in @emph{all} groups. Using this
11924mechanism is quite likely to be somewhat inefficient, but not overly
11925so. It's certainly preferable to reading the same articles more than
11926once.
11927
11928Duplicate suppression is not a very subtle instrument. It's more like a
11929sledge hammer than anything else. It works in a very simple
11930fashion---if you have marked an article as read, it adds this Message-ID
11931to a cache. The next time it sees this Message-ID, it will mark the
11932article as read with the @samp{M} mark. It doesn't care what group it
11933saw the article in.
11934
11935@table @code
11936@item gnus-suppress-duplicates
11937@vindex gnus-suppress-duplicates
11938If non-@code{nil}, suppress duplicates.
11939
11940@item gnus-save-duplicate-list
11941@vindex gnus-save-duplicate-list
11942If non-@code{nil}, save the list of duplicates to a file. This will
11943make startup and shutdown take longer, so the default is @code{nil}.
11944However, this means that only duplicate articles read in a single Gnus
11945session are suppressed.
11946
11947@item gnus-duplicate-list-length
11948@vindex gnus-duplicate-list-length
11949This variable says how many @code{Message-ID}s to keep in the duplicate
11950suppression list. The default is 10000.
11951
11952@item gnus-duplicate-file
11953@vindex gnus-duplicate-file
11954The name of the file to store the duplicate suppression list in. The
11955default is @file{~/News/suppression}.
11956@end table
11957
11958If you have a tendency to stop and start Gnus often, setting
11959@code{gnus-save-duplicate-list} to @code{t} is probably a good idea. If
11960you leave Gnus running for weeks on end, you may have it @code{nil}. On
11961the other hand, saving the list makes startup and shutdown much slower,
11962so that means that if you stop and start Gnus often, you should set
11963@code{gnus-save-duplicate-list} to @code{nil}. Uhm. I'll leave this up
11964to you to figure out, I think.
11965
11966@node Security
11967@section Security
11968
11969Gnus is able to verify signed messages or decrypt encrypted messages.
11970The formats that are supported are @acronym{PGP}, @acronym{PGP/MIME}
11971and @acronym{S/MIME}, however you need some external programs to get
11972things to work:
11973
11974@enumerate
11975@item
11976To handle @acronym{PGP} and @acronym{PGP/MIME} messages, you have to
11977install an OpenPGP implementation such as GnuPG. The Lisp interface
11978to GnuPG included with Gnus is called PGG (@pxref{Top, ,PGG, pgg, PGG
11979Manual}), but Mailcrypt and gpg.el are also supported.
11980
11981@item
11982To handle @acronym{S/MIME} message, you need to install OpenSSL. OpenSSL 0.9.6
11983or newer is recommended.
11984
11985@end enumerate
11986
11987The variables that control security functionality on reading messages
11988include:
11989
11990@table @code
11991@item mm-verify-option
11992@vindex mm-verify-option
11993Option of verifying signed parts. @code{never}, not verify;
11994@code{always}, always verify; @code{known}, only verify known
11995protocols. Otherwise, ask user.
11996
11997@item mm-decrypt-option
11998@vindex mm-decrypt-option
11999Option of decrypting encrypted parts. @code{never}, no decryption;
12000@code{always}, always decrypt; @code{known}, only decrypt known
12001protocols. Otherwise, ask user.
12002
12003@item mml1991-use
12004@vindex mml1991-use
12005Symbol indicating elisp interface to OpenPGP implementation for
12006@acronym{PGP} messages. The default is @code{pgg}, but
12007@code{mailcrypt} and @code{gpg} are also supported although
12008deprecated.
12009
12010@item mml2015-use
12011@vindex mml2015-use
12012Symbol indicating elisp interface to OpenPGP implementation for
12013@acronym{PGP/MIME} messages. The default is @code{pgg}, but
12014@code{mailcrypt} and @code{gpg} are also supported although
12015deprecated.
12016
12017@end table
12018
12019By default the buttons that display security information are not
12020shown, because they clutter reading the actual e-mail. You can type
12021@kbd{K b} manually to display the information. Use the
12022@code{gnus-buttonized-mime-types} and
12023@code{gnus-unbuttonized-mime-types} variables to control this
12024permanently. @ref{MIME Commands} for further details, and hints on
12025how to customize these variables to always display security
12026information.
12027
12028@cindex snarfing keys
12029@cindex importing PGP keys
12030@cindex PGP key ring import
12031Snarfing OpenPGP keys (i.e., importing keys from articles into your
12032key ring) is not supported explicitly through a menu item or command,
12033rather Gnus do detect and label keys as @samp{application/pgp-keys},
12034allowing you to specify whatever action you think is appropriate
12035through the usual @acronym{MIME} infrastructure. You can use a
12036@file{~/.mailcap} entry (@pxref{mailcap, , mailcap, emacs-mime, The
12037Emacs MIME Manual}) such as the following to import keys using GNU
12038Privacy Guard when you click on the @acronym{MIME} button
12039(@pxref{Using MIME}).
12040
12041@example
12042application/pgp-keys; gpg --import --interactive --verbose; needsterminal
12043@end example
12044@noindent
12045This happens to also be the default action defined in
12046@code{mailcap-mime-data}.
12047
12048More information on how to set things for sending outgoing signed and
12049encrypted messages up can be found in the message manual
12050(@pxref{Security, ,Security, message, Message Manual}).
12051
12052@node Mailing List
12053@section Mailing List
12054@cindex mailing list
12055@cindex RFC 2396
12056
12057@kindex A M (summary)
12058@findex gnus-mailing-list-insinuate
12059Gnus understands some mailing list fields of RFC 2369. To enable it,
12060add a @code{to-list} group parameter (@pxref{Group Parameters}),
12061possibly using @kbd{A M} (@code{gnus-mailing-list-insinuate}) in the
12062summary buffer.
12063
12064That enables the following commands to the summary buffer:
12065
12066@table @kbd
12067
12068@item C-c C-n h
12069@kindex C-c C-n h (Summary)
12070@findex gnus-mailing-list-help
12071Send a message to fetch mailing list help, if List-Help field exists.
12072
12073@item C-c C-n s
12074@kindex C-c C-n s (Summary)
12075@findex gnus-mailing-list-subscribe
12076Send a message to subscribe the mailing list, if List-Subscribe field exists.
12077
12078@item C-c C-n u
12079@kindex C-c C-n u (Summary)
12080@findex gnus-mailing-list-unsubscribe
12081Send a message to unsubscribe the mailing list, if List-Unsubscribe
12082field exists.
12083
12084@item C-c C-n p
12085@kindex C-c C-n p (Summary)
12086@findex gnus-mailing-list-post
12087Post to the mailing list, if List-Post field exists.
12088
12089@item C-c C-n o
12090@kindex C-c C-n o (Summary)
12091@findex gnus-mailing-list-owner
12092Send a message to the mailing list owner, if List-Owner field exists.
12093
12094@item C-c C-n a
12095@kindex C-c C-n a (Summary)
01c52d31 12096@findex gnus-mailing-list-archive
4009494e
GM
12097Browse the mailing list archive, if List-Archive field exists.
12098
12099@end table
12100
12101
12102@node Article Buffer
12103@chapter Article Buffer
12104@cindex article buffer
12105
12106The articles are displayed in the article buffer, of which there is only
12107one. All the summary buffers share the same article buffer unless you
12108tell Gnus otherwise.
12109
12110@menu
12111* Hiding Headers:: Deciding what headers should be displayed.
12112* Using MIME:: Pushing articles through @acronym{MIME} before reading them.
12113* Customizing Articles:: Tailoring the look of the articles.
12114* Article Keymap:: Keystrokes available in the article buffer.
12115* Misc Article:: Other stuff.
12116@end menu
12117
12118
12119@node Hiding Headers
12120@section Hiding Headers
12121@cindex hiding headers
12122@cindex deleting headers
12123
12124The top section of each article is the @dfn{head}. (The rest is the
12125@dfn{body}, but you may have guessed that already.)
12126
12127@vindex gnus-show-all-headers
12128There is a lot of useful information in the head: the name of the person
12129who wrote the article, the date it was written and the subject of the
12130article. That's well and nice, but there's also lots of information
12131most people do not want to see---what systems the article has passed
12132through before reaching you, the @code{Message-ID}, the
12133@code{References}, etc. ad nauseam---and you'll probably want to get rid
12134of some of those lines. If you want to keep all those lines in the
12135article buffer, you can set @code{gnus-show-all-headers} to @code{t}.
12136
12137Gnus provides you with two variables for sifting headers:
12138
12139@table @code
12140
12141@item gnus-visible-headers
12142@vindex gnus-visible-headers
12143If this variable is non-@code{nil}, it should be a regular expression
12144that says what headers you wish to keep in the article buffer. All
12145headers that do not match this variable will be hidden.
12146
12147For instance, if you only want to see the name of the person who wrote
12148the article and the subject, you'd say:
12149
12150@lisp
12151(setq gnus-visible-headers "^From:\\|^Subject:")
12152@end lisp
12153
12154This variable can also be a list of regexps to match headers to
12155remain visible.
12156
12157@item gnus-ignored-headers
12158@vindex gnus-ignored-headers
12159This variable is the reverse of @code{gnus-visible-headers}. If this
12160variable is set (and @code{gnus-visible-headers} is @code{nil}), it
12161should be a regular expression that matches all lines that you want to
12162hide. All lines that do not match this variable will remain visible.
12163
12164For instance, if you just want to get rid of the @code{References} line
12165and the @code{Xref} line, you might say:
12166
12167@lisp
12168(setq gnus-ignored-headers "^References:\\|^Xref:")
12169@end lisp
12170
12171This variable can also be a list of regexps to match headers to
12172be removed.
12173
12174Note that if @code{gnus-visible-headers} is non-@code{nil}, this
12175variable will have no effect.
12176
12177@end table
12178
12179@vindex gnus-sorted-header-list
12180Gnus can also sort the headers for you. (It does this by default.) You
12181can control the sorting by setting the @code{gnus-sorted-header-list}
12182variable. It is a list of regular expressions that says in what order
12183the headers are to be displayed.
12184
12185For instance, if you want the name of the author of the article first,
12186and then the subject, you might say something like:
12187
12188@lisp
12189(setq gnus-sorted-header-list '("^From:" "^Subject:"))
12190@end lisp
12191
12192Any headers that are to remain visible, but are not listed in this
12193variable, will be displayed in random order after all the headers listed in this variable.
12194
12195@findex gnus-article-hide-boring-headers
12196@vindex gnus-boring-article-headers
12197You can hide further boring headers by setting
12198@code{gnus-treat-hide-boring-headers} to @code{head}. What this function
12199does depends on the @code{gnus-boring-article-headers} variable. It's a
12200list, but this list doesn't actually contain header names. Instead it
12201lists various @dfn{boring conditions} that Gnus can check and remove
12202from sight.
12203
12204These conditions are:
12205@table @code
12206@item empty
12207Remove all empty headers.
12208@item followup-to
12209Remove the @code{Followup-To} header if it is identical to the
12210@code{Newsgroups} header.
12211@item reply-to
12212Remove the @code{Reply-To} header if it lists the same addresses as
12213the @code{From} header, or if the @code{broken-reply-to} group
12214parameter is set.
12215@item newsgroups
12216Remove the @code{Newsgroups} header if it only contains the current group
12217name.
12218@item to-address
12219Remove the @code{To} header if it only contains the address identical to
12220the current group's @code{to-address} parameter.
12221@item to-list
12222Remove the @code{To} header if it only contains the address identical to
12223the current group's @code{to-list} parameter.
12224@item cc-list
12225Remove the @code{Cc} header if it only contains the address identical to
12226the current group's @code{to-list} parameter.
12227@item date
12228Remove the @code{Date} header if the article is less than three days
12229old.
12230@item long-to
12231Remove the @code{To} and/or @code{Cc} header if it is very long.
12232@item many-to
12233Remove all @code{To} and/or @code{Cc} headers if there are more than one.
12234@end table
12235
12236To include these three elements, you could say something like:
12237
12238@lisp
12239(setq gnus-boring-article-headers
12240 '(empty followup-to reply-to))
12241@end lisp
12242
12243This is also the default value for this variable.
12244
12245
12246@node Using MIME
12247@section Using MIME
12248@cindex @acronym{MIME}
12249
12250Mime is a standard for waving your hands through the air, aimlessly,
12251while people stand around yawning.
12252
12253@acronym{MIME}, however, is a standard for encoding your articles, aimlessly,
12254while all newsreaders die of fear.
12255
12256@acronym{MIME} may specify what character set the article uses, the encoding
12257of the characters, and it also makes it possible to embed pictures and
12258other naughty stuff in innocent-looking articles.
12259
12260@vindex gnus-display-mime-function
12261@findex gnus-display-mime
12262Gnus pushes @acronym{MIME} articles through @code{gnus-display-mime-function}
12263to display the @acronym{MIME} parts. This is @code{gnus-display-mime} by
12264default, which creates a bundle of clickable buttons that can be used to
12265display, save and manipulate the @acronym{MIME} objects.
12266
12267The following commands are available when you have placed point over a
12268@acronym{MIME} button:
12269
12270@table @kbd
12271@findex gnus-article-press-button
12272@item RET (Article)
12273@kindex RET (Article)
12274@itemx BUTTON-2 (Article)
12275Toggle displaying of the @acronym{MIME} object
12276(@code{gnus-article-press-button}). If built-in viewers can not display
12277the object, Gnus resorts to external viewers in the @file{mailcap}
12278files. If a viewer has the @samp{copiousoutput} specification, the
12279object is displayed inline.
12280
12281@findex gnus-mime-view-part
12282@item M-RET (Article)
12283@kindex M-RET (Article)
12284@itemx v (Article)
12285Prompt for a method, and then view the @acronym{MIME} object using this
12286method (@code{gnus-mime-view-part}).
12287
12288@findex gnus-mime-view-part-as-type
12289@item t (Article)
12290@kindex t (Article)
12291View the @acronym{MIME} object as if it were a different @acronym{MIME} media type
12292(@code{gnus-mime-view-part-as-type}).
12293
12294@findex gnus-mime-view-part-as-charset
12295@item C (Article)
12296@kindex C (Article)
12297Prompt for a charset, and then view the @acronym{MIME} object using this
12298charset (@code{gnus-mime-view-part-as-charset}).
12299
12300@findex gnus-mime-save-part
12301@item o (Article)
12302@kindex o (Article)
12303Prompt for a file name, and then save the @acronym{MIME} object
12304(@code{gnus-mime-save-part}).
12305
12306@findex gnus-mime-save-part-and-strip
12307@item C-o (Article)
12308@kindex C-o (Article)
12309Prompt for a file name, then save the @acronym{MIME} object and strip it from
12310the article. Then proceed to article editing, where a reasonable
12311suggestion is being made on how the altered article should look
12312like. The stripped @acronym{MIME} object will be referred via the
12313message/external-body @acronym{MIME} type.
12314(@code{gnus-mime-save-part-and-strip}).
12315
01c52d31
MB
12316@findex gnus-mime-replace-part
12317@item r (Article)
12318@kindex r (Article)
12319Prompt for a file name, replace the @acronym{MIME} object with an
12320external body refering to the file via the message/external-body
12321@acronym{MIME} type. (@code{gnus-mime-replace-part}).
12322
4009494e
GM
12323@findex gnus-mime-delete-part
12324@item d (Article)
12325@kindex d (Article)
12326Delete the @acronym{MIME} object from the article and replace it with some
12327information about the removed @acronym{MIME} object
12328(@code{gnus-mime-delete-part}).
12329
01c52d31
MB
12330@c FIXME: gnus-auto-select-part should be documented here
12331
4009494e
GM
12332@findex gnus-mime-copy-part
12333@item c (Article)
12334@kindex c (Article)
12335Copy the @acronym{MIME} object to a fresh buffer and display this buffer
01c52d31
MB
12336(@code{gnus-mime-copy-part}). If given a prefix, copy the raw contents
12337without decoding. If given a numerical prefix, you can do semi-manual
12338charset stuff (see @code{gnus-summary-show-article-charset-alist} in
12339@ref{Paging the Article}). Compressed files like @file{.gz} and
4009494e
GM
12340@file{.bz2} are automatically decompressed if
12341@code{auto-compression-mode} is enabled (@pxref{Compressed Files,,
12342Accessing Compressed Files, emacs, The Emacs Editor}).
12343
12344@findex gnus-mime-print-part
12345@item p (Article)
12346@kindex p (Article)
12347Print the @acronym{MIME} object (@code{gnus-mime-print-part}). This
12348command respects the @samp{print=} specifications in the
12349@file{.mailcap} file.
12350
12351@findex gnus-mime-inline-part
12352@item i (Article)
12353@kindex i (Article)
12354Insert the contents of the @acronym{MIME} object into the buffer
9b3ebcb6 12355(@code{gnus-mime-inline-part}) as @samp{text/plain}. If given a prefix, insert
4009494e
GM
12356the raw contents without decoding. If given a numerical prefix, you can
12357do semi-manual charset stuff (see
12358@code{gnus-summary-show-article-charset-alist} in @ref{Paging the
01c52d31
MB
12359Article}). Compressed files like @file{.gz} and @file{.bz2} are
12360automatically decompressed depending on @code{jka-compr} regardless of
12361@code{auto-compression-mode} (@pxref{Compressed Files,, Accessing
12362Compressed Files, emacs, The Emacs Editor}).
4009494e
GM
12363
12364@findex gnus-mime-view-part-internally
12365@item E (Article)
12366@kindex E (Article)
12367View the @acronym{MIME} object with an internal viewer. If no internal
12368viewer is available, use an external viewer
12369(@code{gnus-mime-view-part-internally}).
12370
12371@findex gnus-mime-view-part-externally
12372@item e (Article)
12373@kindex e (Article)
12374View the @acronym{MIME} object with an external viewer.
12375(@code{gnus-mime-view-part-externally}).
12376
12377@findex gnus-mime-pipe-part
12378@item | (Article)
12379@kindex | (Article)
12380Output the @acronym{MIME} object to a process (@code{gnus-mime-pipe-part}).
12381
12382@findex gnus-mime-action-on-part
12383@item . (Article)
12384@kindex . (Article)
12385Interactively run an action on the @acronym{MIME} object
12386(@code{gnus-mime-action-on-part}).
12387
12388@end table
12389
12390Gnus will display some @acronym{MIME} objects automatically. The way Gnus
12391determines which parts to do this with is described in the Emacs
12392@acronym{MIME} manual.
12393
12394It might be best to just use the toggling functions from the article
12395buffer to avoid getting nasty surprises. (For instance, you enter the
12396group @samp{alt.sing-a-long} and, before you know it, @acronym{MIME} has
12397decoded the sound file in the article and some horrible sing-a-long song
12398comes screaming out your speakers, and you can't find the volume button,
12399because there isn't one, and people are starting to look at you, and you
12400try to stop the program, but you can't, and you can't find the program
12401to control the volume, and everybody else in the room suddenly decides
12402to look at you disdainfully, and you'll feel rather stupid.)
12403
12404Any similarity to real events and people is purely coincidental. Ahem.
12405
12406Also @pxref{MIME Commands}.
12407
12408
12409@node Customizing Articles
12410@section Customizing Articles
12411@cindex article customization
12412
12413A slew of functions for customizing how the articles are to look like
12414exist. You can call these functions interactively
12415(@pxref{Article Washing}), or you can have them
12416called automatically when you select the articles.
12417
12418To have them called automatically, you should set the corresponding
12419``treatment'' variable. For instance, to have headers hidden, you'd set
12420@code{gnus-treat-hide-headers}. Below is a list of variables that can
12421be set, but first we discuss the values these variables can have.
12422
12423Note: Some values, while valid, make little sense. Check the list below
12424for sensible values.
12425
12426@enumerate
12427@item
12428@code{nil}: Don't do this treatment.
12429
12430@item
12431@code{t}: Do this treatment on all body parts.
12432
12433@item
12434@code{head}: Do the treatment on the headers.
12435
12436@item
01c52d31
MB
12437@code{first}: Do this treatment on the first body part.
12438
12439@item
12440@code{last}: Do this treatment on the last body part.
4009494e
GM
12441
12442@item
12443An integer: Do this treatment on all body parts that have a length less
12444than this number.
12445
12446@item
12447A list of strings: Do this treatment on all body parts that are in
12448articles that are read in groups that have names that match one of the
12449regexps in the list.
12450
12451@item
12452A list where the first element is not a string:
12453
12454The list is evaluated recursively. The first element of the list is a
12455predicate. The following predicates are recognized: @code{or},
12456@code{and}, @code{not} and @code{typep}. Here's an example:
12457
12458@lisp
12459(or last
12460 (typep "text/x-vcard"))
12461@end lisp
12462
12463@end enumerate
12464
12465You may have noticed that the word @dfn{part} is used here. This refers
12466to the fact that some messages are @acronym{MIME} multipart articles that may
12467be divided into several parts. Articles that are not multiparts are
12468considered to contain just a single part.
12469
12470@vindex gnus-article-treat-types
12471Are the treatments applied to all sorts of multipart parts? Yes, if you
12472want to, but by default, only @samp{text/plain} parts are given the
12473treatment. This is controlled by the @code{gnus-article-treat-types}
12474variable, which is a list of regular expressions that are matched to the
12475type of the part. This variable is ignored if the value of the
12476controlling variable is a predicate list, as described above.
12477
12478@ifinfo
12479@c Avoid sort of redundant entries in the same section for the printed
12480@c manual, but add them in info to allow `i gnus-treat-foo-bar RET' or
12481@c `i foo-bar'.
12482@vindex gnus-treat-buttonize
12483@vindex gnus-treat-buttonize-head
12484@vindex gnus-treat-capitalize-sentences
12485@vindex gnus-treat-overstrike
12486@vindex gnus-treat-strip-cr
12487@vindex gnus-treat-strip-headers-in-body
12488@vindex gnus-treat-strip-leading-blank-lines
12489@vindex gnus-treat-strip-multiple-blank-lines
12490@vindex gnus-treat-strip-pem
12491@vindex gnus-treat-strip-trailing-blank-lines
12492@vindex gnus-treat-unsplit-urls
12493@vindex gnus-treat-wash-html
12494@vindex gnus-treat-date-english
12495@vindex gnus-treat-date-iso8601
12496@vindex gnus-treat-date-lapsed
12497@vindex gnus-treat-date-local
12498@vindex gnus-treat-date-original
12499@vindex gnus-treat-date-user-defined
12500@vindex gnus-treat-date-ut
12501@vindex gnus-treat-from-picon
12502@vindex gnus-treat-mail-picon
12503@vindex gnus-treat-newsgroups-picon
12504@vindex gnus-treat-display-smileys
12505@vindex gnus-treat-body-boundary
12506@vindex gnus-treat-display-x-face
12507@vindex gnus-treat-display-face
12508@vindex gnus-treat-emphasize
12509@vindex gnus-treat-fill-article
12510@vindex gnus-treat-fill-long-lines
12511@vindex gnus-treat-hide-boring-headers
12512@vindex gnus-treat-hide-citation
12513@vindex gnus-treat-hide-citation-maybe
12514@vindex gnus-treat-hide-headers
12515@vindex gnus-treat-hide-signature
12516@vindex gnus-treat-strip-banner
12517@vindex gnus-treat-strip-list-identifiers
12518@vindex gnus-treat-highlight-citation
12519@vindex gnus-treat-highlight-headers
12520@vindex gnus-treat-highlight-signature
12521@vindex gnus-treat-play-sounds
12522@vindex gnus-treat-translate
12523@vindex gnus-treat-x-pgp-sig
12524@vindex gnus-treat-unfold-headers
12525@vindex gnus-treat-fold-headers
12526@vindex gnus-treat-fold-newsgroups
12527@vindex gnus-treat-leading-whitespace
12528@end ifinfo
12529
12530The following treatment options are available. The easiest way to
12531customize this is to examine the @code{gnus-article-treat} customization
12532group. Values in parenthesis are suggested sensible values. Others are
12533possible but those listed are probably sufficient for most people.
12534
12535@table @code
12536@item gnus-treat-buttonize (t, integer)
12537@item gnus-treat-buttonize-head (head)
12538
12539@xref{Article Buttons}.
12540
12541@item gnus-treat-capitalize-sentences (t, integer)
12542@item gnus-treat-overstrike (t, integer)
12543@item gnus-treat-strip-cr (t, integer)
12544@item gnus-treat-strip-headers-in-body (t, integer)
01c52d31 12545@item gnus-treat-strip-leading-blank-lines (t, first, integer)
4009494e
GM
12546@item gnus-treat-strip-multiple-blank-lines (t, integer)
12547@item gnus-treat-strip-pem (t, last, integer)
12548@item gnus-treat-strip-trailing-blank-lines (t, last, integer)
12549@item gnus-treat-unsplit-urls (t, integer)
12550@item gnus-treat-wash-html (t, integer)
12551
12552@xref{Article Washing}.
12553
12554@item gnus-treat-date-english (head)
12555@item gnus-treat-date-iso8601 (head)
12556@item gnus-treat-date-lapsed (head)
12557@item gnus-treat-date-local (head)
12558@item gnus-treat-date-original (head)
12559@item gnus-treat-date-user-defined (head)
12560@item gnus-treat-date-ut (head)
12561
12562@xref{Article Date}.
12563
12564@item gnus-treat-from-picon (head)
12565@item gnus-treat-mail-picon (head)
12566@item gnus-treat-newsgroups-picon (head)
12567
12568@xref{Picons}.
12569
12570@item gnus-treat-display-smileys (t, integer)
12571
12572@item gnus-treat-body-boundary (head)
12573
12574@vindex gnus-body-boundary-delimiter
12575Adds a delimiter between header and body, the string used as delimiter
12576is controlled by @code{gnus-body-boundary-delimiter}.
12577
12578@xref{Smileys}.
12579
12580@vindex gnus-treat-display-x-face
12581@item gnus-treat-display-x-face (head)
12582
12583@xref{X-Face}.
12584
12585@vindex gnus-treat-display-face
12586@item gnus-treat-display-face (head)
12587
12588@xref{Face}.
12589
12590@vindex gnus-treat-emphasize
12591@item gnus-treat-emphasize (t, head, integer)
12592@vindex gnus-treat-fill-article
12593@item gnus-treat-fill-article (t, integer)
12594@vindex gnus-treat-fill-long-lines
12595@item gnus-treat-fill-long-lines (t, integer)
12596@vindex gnus-treat-hide-boring-headers
12597@item gnus-treat-hide-boring-headers (head)
12598@vindex gnus-treat-hide-citation
12599@item gnus-treat-hide-citation (t, integer)
12600@vindex gnus-treat-hide-citation-maybe
12601@item gnus-treat-hide-citation-maybe (t, integer)
12602@vindex gnus-treat-hide-headers
12603@item gnus-treat-hide-headers (head)
12604@vindex gnus-treat-hide-signature
12605@item gnus-treat-hide-signature (t, last)
12606@vindex gnus-treat-strip-banner
12607@item gnus-treat-strip-banner (t, last)
12608@vindex gnus-treat-strip-list-identifiers
12609@item gnus-treat-strip-list-identifiers (head)
12610
12611@xref{Article Hiding}.
12612
12613@vindex gnus-treat-highlight-citation
12614@item gnus-treat-highlight-citation (t, integer)
12615@vindex gnus-treat-highlight-headers
12616@item gnus-treat-highlight-headers (head)
12617@vindex gnus-treat-highlight-signature
12618@item gnus-treat-highlight-signature (t, last, integer)
12619
12620@xref{Article Highlighting}.
12621
12622@vindex gnus-treat-play-sounds
12623@item gnus-treat-play-sounds
12624@vindex gnus-treat-translate
12625@item gnus-treat-translate
01c52d31 12626@item gnus-treat-ansi-sequences (t)
4009494e
GM
12627@vindex gnus-treat-x-pgp-sig
12628@item gnus-treat-x-pgp-sig (head)
12629
12630@vindex gnus-treat-unfold-headers
12631@item gnus-treat-unfold-headers (head)
12632@vindex gnus-treat-fold-headers
12633@item gnus-treat-fold-headers (head)
12634@vindex gnus-treat-fold-newsgroups
12635@item gnus-treat-fold-newsgroups (head)
12636@vindex gnus-treat-leading-whitespace
12637@item gnus-treat-leading-whitespace (head)
12638
12639@xref{Article Header}.
12640
12641
12642@end table
12643
12644@vindex gnus-part-display-hook
12645You can, of course, write your own functions to be called from
12646@code{gnus-part-display-hook}. The functions are called narrowed to the
12647part, and you can do anything you like, pretty much. There is no
12648information that you have to keep in the buffer---you can change
12649everything.
12650
12651
12652@node Article Keymap
12653@section Article Keymap
12654
12655Most of the keystrokes in the summary buffer can also be used in the
12656article buffer. They should behave as if you typed them in the summary
12657buffer, which means that you don't actually have to have a summary
12658buffer displayed while reading. You can do it all from the article
12659buffer.
12660
12661@kindex v (Article)
12662@cindex keys, reserved for users (Article)
12663The key @kbd{v} is reserved for users. You can bind it to some
12664command or better use it as a prefix key.
12665
12666A few additional keystrokes are available:
12667
12668@table @kbd
12669
12670@item SPACE
12671@kindex SPACE (Article)
12672@findex gnus-article-next-page
12673Scroll forwards one page (@code{gnus-article-next-page}).
12674This is exactly the same as @kbd{h SPACE h}.
12675
12676@item DEL
12677@kindex DEL (Article)
12678@findex gnus-article-prev-page
12679Scroll backwards one page (@code{gnus-article-prev-page}).
12680This is exactly the same as @kbd{h DEL h}.
12681
12682@item C-c ^
12683@kindex C-c ^ (Article)
12684@findex gnus-article-refer-article
12685If point is in the neighborhood of a @code{Message-ID} and you press
12686@kbd{C-c ^}, Gnus will try to get that article from the server
12687(@code{gnus-article-refer-article}).
12688
12689@item C-c C-m
12690@kindex C-c C-m (Article)
12691@findex gnus-article-mail
12692Send a reply to the address near point (@code{gnus-article-mail}). If
12693given a prefix, include the mail.
12694
12695@item s
12696@kindex s (Article)
12697@findex gnus-article-show-summary
12698Reconfigure the buffers so that the summary buffer becomes visible
12699(@code{gnus-article-show-summary}).
12700
12701@item ?
12702@kindex ? (Article)
12703@findex gnus-article-describe-briefly
12704Give a very brief description of the available keystrokes
12705(@code{gnus-article-describe-briefly}).
12706
12707@item TAB
12708@kindex TAB (Article)
12709@findex gnus-article-next-button
12710Go to the next button, if any (@code{gnus-article-next-button}). This
12711only makes sense if you have buttonizing turned on.
12712
12713@item M-TAB
12714@kindex M-TAB (Article)
12715@findex gnus-article-prev-button
12716Go to the previous button, if any (@code{gnus-article-prev-button}).
12717
12718@item R
12719@kindex R (Article)
12720@findex gnus-article-reply-with-original
12721Send a reply to the current article and yank the current article
95838435
MB
12722(@code{gnus-article-reply-with-original}). If the region is active,
12723only yank the text in the region.
12724
12725@item S W
12726@kindex S W (Article)
12727@findex gnus-article-wide-reply-with-original
12728Send a wide reply to the current article and yank the current article
12729(@code{gnus-article-wide-reply-with-original}). If the region is
12730active, only yank the text in the region.
4009494e
GM
12731
12732@item F
12733@kindex F (Article)
12734@findex gnus-article-followup-with-original
12735Send a followup to the current article and yank the current article
95838435
MB
12736(@code{gnus-article-followup-with-original}). If the region is active,
12737only yank the text in the region.
4009494e
GM
12738
12739
12740@end table
12741
12742
12743@node Misc Article
12744@section Misc Article
12745
12746@table @code
12747
12748@item gnus-single-article-buffer
12749@vindex gnus-single-article-buffer
12750@cindex article buffers, several
12751If non-@code{nil}, use the same article buffer for all the groups.
12752(This is the default.) If @code{nil}, each group will have its own
12753article buffer.
12754
12755@vindex gnus-article-decode-hook
12756@item gnus-article-decode-hook
12757@cindex @acronym{MIME}
12758Hook used to decode @acronym{MIME} articles. The default value is
12759@code{(article-decode-charset article-decode-encoded-words)}
12760
12761@vindex gnus-article-prepare-hook
12762@item gnus-article-prepare-hook
12763This hook is called right after the article has been inserted into the
12764article buffer. It is mainly intended for functions that do something
12765depending on the contents; it should probably not be used for changing
12766the contents of the article buffer.
12767
12768@item gnus-article-mode-hook
12769@vindex gnus-article-mode-hook
12770Hook called in article mode buffers.
12771
12772@item gnus-article-mode-syntax-table
12773@vindex gnus-article-mode-syntax-table
12774Syntax table used in article buffers. It is initialized from
12775@code{text-mode-syntax-table}.
12776
12777@vindex gnus-article-over-scroll
12778@item gnus-article-over-scroll
12779If non-@code{nil}, allow scrolling the article buffer even when there
12780no more new text to scroll in. The default is @code{nil}.
12781
12782@vindex gnus-article-mode-line-format
12783@item gnus-article-mode-line-format
12784This variable is a format string along the same lines as
12785@code{gnus-summary-mode-line-format} (@pxref{Summary Buffer Mode
12786Line}). It accepts the same format specifications as that variable,
12787with two extensions:
12788
12789@table @samp
12790
12791@item w
12792The @dfn{wash status} of the article. This is a short string with one
12793character for each possible article wash operation that may have been
12794performed. The characters and their meaning:
12795
12796@table @samp
12797
12798@item c
12799Displayed when cited text may be hidden in the article buffer.
12800
12801@item h
12802Displayed when headers are hidden in the article buffer.
12803
12804@item p
12805Displayed when article is digitally signed or encrypted, and Gnus has
12806hidden the security headers. (N.B. does not tell anything about
12807security status, i.e. good or bad signature.)
12808
12809@item s
12810Displayed when the signature has been hidden in the Article buffer.
12811
12812@item o
12813Displayed when Gnus has treated overstrike characters in the article buffer.
12814
12815@item e
6772c8e1 12816Displayed when Gnus has treated emphasized strings in the article buffer.
4009494e
GM
12817
12818@end table
12819
12820@item m
12821The number of @acronym{MIME} parts in the article.
12822
12823@end table
12824
12825@vindex gnus-break-pages
12826
12827@item gnus-break-pages
12828Controls whether @dfn{page breaking} is to take place. If this variable
12829is non-@code{nil}, the articles will be divided into pages whenever a
12830page delimiter appears in the article. If this variable is @code{nil},
12831paging will not be done.
12832
12833@item gnus-page-delimiter
12834@vindex gnus-page-delimiter
12835This is the delimiter mentioned above. By default, it is @samp{^L}
12836(formfeed).
12837
12838@cindex IDNA
12839@cindex internationalized domain names
12840@vindex gnus-use-idna
12841@item gnus-use-idna
12842This variable controls whether Gnus performs IDNA decoding of
12843internationalized domain names inside @samp{From}, @samp{To} and
01c52d31
MB
12844@samp{Cc} headers. @xref{IDNA, ,IDNA,message, The Message Manual},
12845for how to compose such messages. This requires
4009494e
GM
12846@uref{http://www.gnu.org/software/libidn/, GNU Libidn}, and this
12847variable is only enabled if you have installed it.
12848
12849@end table
12850
12851
12852@node Composing Messages
12853@chapter Composing Messages
12854@cindex composing messages
12855@cindex messages
12856@cindex mail
12857@cindex sending mail
12858@cindex reply
12859@cindex followup
12860@cindex post
12861@cindex using gpg
12862@cindex using s/mime
12863@cindex using smime
12864
12865@kindex C-c C-c (Post)
12866All commands for posting and mailing will put you in a message buffer
12867where you can edit the article all you like, before you send the
12868article by pressing @kbd{C-c C-c}. @xref{Top, , Overview, message,
12869Message Manual}. Where the message will be posted/mailed to depends
12870on your setup (@pxref{Posting Server}).
12871
12872@menu
12873* Mail:: Mailing and replying.
12874* Posting Server:: What server should you post and mail via?
12875* POP before SMTP:: You cannot send a mail unless you read a mail.
12876* Mail and Post:: Mailing and posting at the same time.
12877* Archived Messages:: Where Gnus stores the messages you've sent.
12878* Posting Styles:: An easier way to specify who you are.
12879* Drafts:: Postponing messages and rejected messages.
12880* Rejected Articles:: What happens if the server doesn't like your article?
12881* Signing and encrypting:: How to compose secure messages.
12882@end menu
12883
12884Also @pxref{Canceling and Superseding} for information on how to
12885remove articles you shouldn't have posted.
12886
12887
12888@node Mail
12889@section Mail
12890
12891Variables for customizing outgoing mail:
12892
12893@table @code
12894@item gnus-uu-digest-headers
12895@vindex gnus-uu-digest-headers
12896List of regexps to match headers included in digested messages. The
12897headers will be included in the sequence they are matched. If
12898@code{nil} include all headers.
12899
12900@item gnus-add-to-list
12901@vindex gnus-add-to-list
12902If non-@code{nil}, add a @code{to-list} group parameter to mail groups
12903that have none when you do a @kbd{a}.
12904
12905@item gnus-confirm-mail-reply-to-news
12906@vindex gnus-confirm-mail-reply-to-news
12907If non-@code{nil}, Gnus will ask you for a confirmation when you are
12908about to reply to news articles by mail. If it is @code{nil}, nothing
12909interferes in what you want to do. This can also be a function
12910receiving the group name as the only parameter which should return
12911non-@code{nil} if a confirmation is needed, or a regular expression
12912matching group names, where confirmation should be asked for.
12913
12914If you find yourself never wanting to reply to mail, but occasionally
12915press @kbd{R} anyway, this variable might be for you.
12916
12917@item gnus-confirm-treat-mail-like-news
12918@vindex gnus-confirm-treat-mail-like-news
12919If non-@code{nil}, Gnus also requests confirmation according to
12920@code{gnus-confirm-mail-reply-to-news} when replying to mail. This is
12921useful for treating mailing lists like newsgroups.
12922
12923@end table
12924
12925
12926@node Posting Server
12927@section Posting Server
12928
12929When you press those magical @kbd{C-c C-c} keys to ship off your latest
12930(extremely intelligent, of course) article, where does it go?
12931
12932Thank you for asking. I hate you.
12933
12934It can be quite complicated.
12935
12936@vindex gnus-post-method
12937When posting news, Message usually invokes @code{message-send-news}
12938(@pxref{News Variables, , News Variables, message, Message Manual}).
12939Normally, Gnus will post using the same select method as you're
12940reading from (which might be convenient if you're reading lots of
12941groups from different private servers). However. If the server
12942you're reading from doesn't allow posting, just reading, you probably
12943want to use some other server to post your (extremely intelligent and
12944fabulously interesting) articles. You can then set the
12945@code{gnus-post-method} to some other method:
12946
12947@lisp
12948(setq gnus-post-method '(nnspool ""))
12949@end lisp
12950
12951Now, if you've done this, and then this server rejects your article, or
12952this server is down, what do you do then? To override this variable you
12953can use a non-zero prefix to the @kbd{C-c C-c} command to force using
12954the ``current'' server, to get back the default behavior, for posting.
12955
12956If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command,
12957Gnus will prompt you for what method to use for posting.
12958
12959You can also set @code{gnus-post-method} to a list of select methods.
12960If that's the case, Gnus will always prompt you for what method to use
12961for posting.
12962
12963Finally, if you want to always post using the native select method,
12964you can set this variable to @code{native}.
12965
d82cf70b
MB
12966@vindex message-send-mail-function
12967When sending mail, Message invokes the function specified by the
12968variable @code{message-send-mail-function}. Gnus tries to set it to a
12969value suitable for your system.
12970@xref{Mail Variables, ,Mail Variables,message,Message manual}, for more
12971information.
4009494e
GM
12972
12973@node POP before SMTP
12974@section POP before SMTP
12975@cindex pop before smtp
12976@findex message-smtpmail-send-it
12977@findex mail-source-touch-pop
12978
12979Does your @acronym{ISP} require the @acronym{POP}-before-@acronym{SMTP}
12980authentication? It is whether you need to connect to the @acronym{POP}
12981mail server within a certain time before sending mails. If so, there is
12982a convenient way. To do that, put the following lines in your
12983@file{~/.gnus.el} file:
12984
12985@lisp
12986(setq message-send-mail-function 'message-smtpmail-send-it)
12987(add-hook 'message-send-mail-hook 'mail-source-touch-pop)
12988@end lisp
12989
12990@noindent
12991It means to let Gnus connect to the @acronym{POP} mail server in advance
12992whenever you send a mail. The @code{mail-source-touch-pop} function
12993does only a @acronym{POP} authentication according to the value of
12994@code{mail-sources} without fetching mails, just before sending a mail.
12995Note that you have to use @code{message-smtpmail-send-it} which runs
12996@code{message-send-mail-hook} rather than @code{smtpmail-send-it} and
12997set the value of @code{mail-sources} for a @acronym{POP} connection
12998correctly. @xref{Mail Sources}.
12999
13000If you have two or more @acronym{POP} mail servers set in
13001@code{mail-sources}, you may want to specify one of them to
13002@code{mail-source-primary-source} as the @acronym{POP} mail server to be
13003used for the @acronym{POP}-before-@acronym{SMTP} authentication. If it
13004is your primary @acronym{POP} mail server (i.e., you are fetching mails
13005mainly from that server), you can set it permanently as follows:
13006
13007@lisp
13008(setq mail-source-primary-source
13009 '(pop :server "pop3.mail.server"
13010 :password "secret"))
13011@end lisp
13012
13013@noindent
13014Otherwise, bind it dynamically only when performing the
13015@acronym{POP}-before-@acronym{SMTP} authentication as follows:
13016
13017@lisp
13018(add-hook 'message-send-mail-hook
13019 (lambda ()
13020 (let ((mail-source-primary-source
13021 '(pop :server "pop3.mail.server"
13022 :password "secret")))
13023 (mail-source-touch-pop))))
13024@end lisp
13025
13026@node Mail and Post
13027@section Mail and Post
13028
13029Here's a list of variables relevant to both mailing and
13030posting:
13031
13032@table @code
13033@item gnus-mailing-list-groups
13034@findex gnus-mailing-list-groups
13035@cindex mailing lists
13036
13037If your news server offers groups that are really mailing lists
13038gatewayed to the @acronym{NNTP} server, you can read those groups without
13039problems, but you can't post/followup to them without some difficulty.
13040One solution is to add a @code{to-address} to the group parameters
13041(@pxref{Group Parameters}). An easier thing to do is set the
13042@code{gnus-mailing-list-groups} to a regexp that matches the groups that
13043really are mailing lists. Then, at least, followups to the mailing
13044lists will work most of the time. Posting to these groups (@kbd{a}) is
13045still a pain, though.
13046
13047@item gnus-user-agent
13048@vindex gnus-user-agent
13049@cindex User-Agent
13050
13051This variable controls which information should be exposed in the
13052User-Agent header. It can be a list of symbols or a string. Valid
13053symbols are @code{gnus} (show Gnus version) and @code{emacs} (show Emacs
13054version). In addition to the Emacs version, you can add @code{codename}
13055(show (S)XEmacs codename) or either @code{config} (show system
13056configuration) or @code{type} (show system type). If you set it to a
13057string, be sure to use a valid format, see RFC 2616.
13058
13059@end table
13060
13061You may want to do spell-checking on messages that you send out. Or, if
13062you don't want to spell-check by hand, you could add automatic
13063spell-checking via the @code{ispell} package:
13064
13065@cindex ispell
13066@findex ispell-message
13067@lisp
13068(add-hook 'message-send-hook 'ispell-message)
13069@end lisp
13070
13071If you want to change the @code{ispell} dictionary based on what group
13072you're in, you could say something like the following:
13073
13074@lisp
13075(add-hook 'gnus-select-group-hook
13076 (lambda ()
13077 (cond
13078 ((string-match
13079 "^de\\." (gnus-group-real-name gnus-newsgroup-name))
13080 (ispell-change-dictionary "deutsch"))
13081 (t
13082 (ispell-change-dictionary "english")))))
13083@end lisp
13084
13085Modify to suit your needs.
13086
01c52d31
MB
13087@vindex gnus-message-highlight-citation
13088If @code{gnus-message-highlight-citation} is t, different levels of
13089citations are highlighted like in Gnus article buffers also in message
13090mode buffers.
4009494e
GM
13091
13092@node Archived Messages
13093@section Archived Messages
13094@cindex archived messages
13095@cindex sent messages
13096
13097Gnus provides a few different methods for storing the mail and news you
13098send. The default method is to use the @dfn{archive virtual server} to
13099store the messages. If you want to disable this completely, the
13100@code{gnus-message-archive-group} variable should be @code{nil}, which
13101is the default.
13102
13103For archiving interesting messages in a group you read, see the
13104@kbd{B c} (@code{gnus-summary-copy-article}) command (@pxref{Mail
13105Group Commands}).
13106
13107@vindex gnus-message-archive-method
13108@code{gnus-message-archive-method} says what virtual server Gnus is to
01c52d31
MB
13109use to store sent messages. The default is @code{"archive"}, and when
13110actually being used it is expanded into:
4009494e
GM
13111
13112@lisp
13113(nnfolder "archive"
13114 (nnfolder-directory "~/Mail/archive")
13115 (nnfolder-active-file "~/Mail/archive/active")
13116 (nnfolder-get-new-mail nil)
13117 (nnfolder-inhibit-expiry t))
13118@end lisp
13119
01c52d31
MB
13120@quotation
13121@vindex gnus-update-message-archive-method
13122Note: a server like this is saved in the @file{~/.newsrc.eld} file first
13123so that it may be used as a real method of the server which is named
13124@code{"archive"} (that is, for the case where
13125@code{gnus-message-archive-method} is set to @code{"archive"}) ever
13126since. If it once has been saved, it will never be updated by default
13127even if you change the value of @code{gnus-message-archive-method}
13128afterward. Therefore, the server @code{"archive"} doesn't necessarily
13129mean the @code{nnfolder} server like this at all times. If you want the
13130saved method to reflect always the value of
13131@code{gnus-message-archive-method}, set the
13132@code{gnus-update-message-archive-method} variable to a non-@code{nil}
13133value. The default value of this variable is @code{nil}.
13134@end quotation
13135
4009494e
GM
13136You can, however, use any mail select method (@code{nnml},
13137@code{nnmbox}, etc.). @code{nnfolder} is a quite likable select method
13138for doing this sort of thing, though. If you don't like the default
13139directory chosen, you could say something like:
13140
13141@lisp
13142(setq gnus-message-archive-method
13143 '(nnfolder "archive"
13144 (nnfolder-inhibit-expiry t)
13145 (nnfolder-active-file "~/News/sent-mail/active")
13146 (nnfolder-directory "~/News/sent-mail/")))
13147@end lisp
13148
13149@vindex gnus-message-archive-group
13150@cindex Gcc
13151Gnus will insert @code{Gcc} headers in all outgoing messages that point
13152to one or more group(s) on that server. Which group to use is
13153determined by the @code{gnus-message-archive-group} variable.
13154
13155This variable can be used to do the following:
13156
13157@table @asis
13158@item a string
13159Messages will be saved in that group.
13160
13161Note that you can include a select method in the group name, then the
13162message will not be stored in the select method given by
13163@code{gnus-message-archive-method}, but in the select method specified
13164by the group name, instead. Suppose @code{gnus-message-archive-method}
13165has the default value shown above. Then setting
13166@code{gnus-message-archive-group} to @code{"foo"} means that outgoing
13167messages are stored in @samp{nnfolder+archive:foo}, but if you use the
13168value @code{"nnml:foo"}, then outgoing messages will be stored in
13169@samp{nnml:foo}.
13170
13171@item a list of strings
13172Messages will be saved in all those groups.
13173
13174@item an alist of regexps, functions and forms
13175When a key ``matches'', the result is used.
13176
13177@item @code{nil}
13178No message archiving will take place. This is the default.
13179@end table
13180
13181Let's illustrate:
13182
13183Just saving to a single group called @samp{MisK}:
13184@lisp
13185(setq gnus-message-archive-group "MisK")
13186@end lisp
13187
13188Saving to two groups, @samp{MisK} and @samp{safe}:
13189@lisp
13190(setq gnus-message-archive-group '("MisK" "safe"))
13191@end lisp
13192
13193Save to different groups based on what group you are in:
13194@lisp
13195(setq gnus-message-archive-group
13196 '(("^alt" "sent-to-alt")
13197 ("mail" "sent-to-mail")
13198 (".*" "sent-to-misc")))
13199@end lisp
13200
13201More complex stuff:
13202@lisp
13203(setq gnus-message-archive-group
13204 '((if (message-news-p)
13205 "misc-news"
13206 "misc-mail")))
13207@end lisp
13208
13209How about storing all news messages in one file, but storing all mail
13210messages in one file per month:
13211
13212@lisp
13213(setq gnus-message-archive-group
13214 '((if (message-news-p)
13215 "misc-news"
13216 (concat "mail." (format-time-string "%Y-%m")))))
13217@end lisp
13218
13219@c (XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to
13220@c use a different value for @code{gnus-message-archive-group} there.)
13221
13222Now, when you send a message off, it will be stored in the appropriate
13223group. (If you want to disable storing for just one particular message,
13224you can just remove the @code{Gcc} header that has been inserted.) The
13225archive group will appear in the group buffer the next time you start
13226Gnus, or the next time you press @kbd{F} in the group buffer. You can
13227enter it and read the articles in it just like you'd read any other
13228group. If the group gets really big and annoying, you can simply rename
13229if (using @kbd{G r} in the group buffer) to something
13230nice---@samp{misc-mail-september-1995}, or whatever. New messages will
13231continue to be stored in the old (now empty) group.
13232
13233That's the default method of archiving sent messages. Gnus offers a
13234different way for the people who don't like the default method. In that
13235case you should set @code{gnus-message-archive-group} to @code{nil};
13236this will disable archiving.
13237
13238@table @code
13239@item gnus-outgoing-message-group
13240@vindex gnus-outgoing-message-group
13241All outgoing messages will be put in this group. If you want to store
13242all your outgoing mail and articles in the group @samp{nnml:archive},
13243you set this variable to that value. This variable can also be a list of
13244group names.
13245
13246If you want to have greater control over what group to put each
13247message in, you can set this variable to a function that checks the
13248current newsgroup name and then returns a suitable group name (or list
13249of names).
13250
13251This variable can be used instead of @code{gnus-message-archive-group},
13252but the latter is the preferred method.
13253
13254@item gnus-gcc-mark-as-read
13255@vindex gnus-gcc-mark-as-read
13256If non-@code{nil}, automatically mark @code{Gcc} articles as read.
13257
13258@item gnus-gcc-externalize-attachments
13259@vindex gnus-gcc-externalize-attachments
13260If @code{nil}, attach files as normal parts in Gcc copies; if a regexp
13261and matches the Gcc group name, attach files as external parts; if it is
13262@code{all}, attach local files as external parts; if it is other
13263non-@code{nil}, the behavior is the same as @code{all}, but it may be
13264changed in the future.
13265
13266@end table
13267
13268
13269@node Posting Styles
13270@section Posting Styles
13271@cindex posting styles
13272@cindex styles
13273
13274All them variables, they make my head swim.
13275
13276So what if you want a different @code{Organization} and signature based
13277on what groups you post to? And you post both from your home machine
13278and your work machine, and you want different @code{From} lines, and so
13279on?
13280
13281@vindex gnus-posting-styles
13282One way to do stuff like that is to write clever hooks that change the
13283variables you need to have changed. That's a bit boring, so somebody
13284came up with the bright idea of letting the user specify these things in
13285a handy alist. Here's an example of a @code{gnus-posting-styles}
13286variable:
13287
13288@lisp
13289((".*"
13290 (signature "Peace and happiness")
13291 (organization "What me?"))
13292 ("^comp"
13293 (signature "Death to everybody"))
13294 ("comp.emacs.i-love-it"
13295 (organization "Emacs is it")))
13296@end lisp
13297
13298As you might surmise from this example, this alist consists of several
13299@dfn{styles}. Each style will be applicable if the first element
13300``matches'', in some form or other. The entire alist will be iterated
13301over, from the beginning towards the end, and each match will be
13302applied, which means that attributes in later styles that match override
13303the same attributes in earlier matching styles. So
13304@samp{comp.programming.literate} will have the @samp{Death to everybody}
13305signature and the @samp{What me?} @code{Organization} header.
13306
13307The first element in each style is called the @code{match}. If it's a
13308string, then Gnus will try to regexp match it against the group name.
13309If it is the form @code{(header @var{match} @var{regexp})}, then Gnus
13310will look in the original article for a header whose name is
13311@var{match} and compare that @var{regexp}. @var{match} and
13312@var{regexp} are strings. (The original article is the one you are
13313replying or following up to. If you are not composing a reply or a
13314followup, then there is nothing to match against.) If the
13315@code{match} is a function symbol, that function will be called with
13316no arguments. If it's a variable symbol, then the variable will be
13317referenced. If it's a list, then that list will be @code{eval}ed. In
13318any case, if this returns a non-@code{nil} value, then the style is
13319said to @dfn{match}.
13320
13321Each style may contain an arbitrary amount of @dfn{attributes}. Each
13322attribute consists of a @code{(@var{name} @var{value})} pair. In
13323addition, you can also use the @code{(@var{name} :file @var{value})}
13324form or the @code{(@var{name} :value @var{value})} form. Where
13325@code{:file} signifies @var{value} represents a file name and its
13326contents should be used as the attribute value, @code{:value} signifies
13327@var{value} does not represent a file name explicitly. The attribute
13328name can be one of:
13329
13330@itemize @bullet
13331@item @code{signature}
13332@item @code{signature-file}
13333@item @code{x-face-file}
13334@item @code{address}, overriding @code{user-mail-address}
13335@item @code{name}, overriding @code{(user-full-name)}
13336@item @code{body}
13337@end itemize
13338
01c52d31
MB
13339Note that the @code{signature-file} attribute honors the variable
13340@code{message-signature-directory}.
13341
4009494e
GM
13342The attribute name can also be a string or a symbol. In that case,
13343this will be used as a header name, and the value will be inserted in
13344the headers of the article; if the value is @code{nil}, the header
13345name will be removed. If the attribute name is @code{eval}, the form
13346is evaluated, and the result is thrown away.
13347
13348The attribute value can be a string (used verbatim), a function with
13349zero arguments (the return value will be used), a variable (its value
13350will be used) or a list (it will be @code{eval}ed and the return value
13351will be used). The functions and sexps are called/@code{eval}ed in the
13352message buffer that is being set up. The headers of the current article
13353are available through the @code{message-reply-headers} variable, which
13354is a vector of the following headers: number subject from date id
13355references chars lines xref extra.
13356
13357@vindex message-reply-headers
13358
13359If you wish to check whether the message you are about to compose is
13360meant to be a news article or a mail message, you can check the values
13361of the @code{message-news-p} and @code{message-mail-p} functions.
13362
13363@findex message-mail-p
13364@findex message-news-p
13365
13366So here's a new example:
13367
13368@lisp
13369(setq gnus-posting-styles
13370 '((".*"
13371 (signature-file "~/.signature")
13372 (name "User Name")
13373 (x-face-file "~/.xface")
13374 (x-url (getenv "WWW_HOME"))
13375 (organization "People's Front Against MWM"))
13376 ("^rec.humor"
13377 (signature my-funny-signature-randomizer))
13378 ((equal (system-name) "gnarly") ;; @r{A form}
13379 (signature my-quote-randomizer))
13380 (message-news-p ;; @r{A function symbol}
13381 (signature my-news-signature))
13382 (window-system ;; @r{A value symbol}
13383 ("X-Window-System" (format "%s" window-system)))
13384 ;; @r{If I'm replying to Larsi, set the Organization header.}
13385 ((header "from" "larsi.*org")
13386 (Organization "Somewhere, Inc."))
13387 ((posting-from-work-p) ;; @r{A user defined function}
13388 (signature-file "~/.work-signature")
13389 (address "user@@bar.foo")
13390 (body "You are fired.\n\nSincerely, your boss.")
13391 (organization "Important Work, Inc"))
13392 ("nnml:.*"
13393 (From (save-excursion
13394 (set-buffer gnus-article-buffer)
13395 (message-fetch-field "to"))))
13396 ("^nn.+:"
13397 (signature-file "~/.mail-signature"))))
13398@end lisp
13399
13400The @samp{nnml:.*} rule means that you use the @code{To} address as the
13401@code{From} address in all your outgoing replies, which might be handy
13402if you fill many roles.
13403You may also use @code{message-alternative-emails} instead.
13404@xref{Message Headers, ,Message Headers, message, Message Manual}.
13405
13406@node Drafts
13407@section Drafts
13408@cindex drafts
13409
13410If you are writing a message (mail or news) and suddenly remember that
13411you have a steak in the oven (or some pesto in the food processor, you
13412craaazy vegetarians), you'll probably wish there was a method to save
13413the message you are writing so that you can continue editing it some
13414other day, and send it when you feel its finished.
13415
13416Well, don't worry about it. Whenever you start composing a message of
13417some sort using the Gnus mail and post commands, the buffer you get will
13418automatically associate to an article in a special @dfn{draft} group.
13419If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the
13420article will be saved there. (Auto-save files also go to the draft
13421group.)
13422
13423@cindex nndraft
13424@vindex nndraft-directory
13425The draft group is a special group (which is implemented as an
13426@code{nndraft} group, if you absolutely have to know) called
13427@samp{nndraft:drafts}. The variable @code{nndraft-directory} says where
13428@code{nndraft} is to store its files. What makes this group special is
13429that you can't tick any articles in it or mark any articles as
13430read---all articles in the group are permanently unread.
13431
13432If the group doesn't exist, it will be created and you'll be subscribed
13433to it. The only way to make it disappear from the Group buffer is to
13434unsubscribe it. The special properties of the draft group comes from
13435a group property (@pxref{Group Parameters}), and if lost the group
13436behaves like any other group. This means the commands below will not
13437be available. To restore the special properties of the group, the
13438simplest way is to kill the group, using @kbd{C-k}, and restart
13439Gnus. The group is automatically created again with the
13440correct parameters. The content of the group is not lost.
13441
13442@c @findex gnus-dissociate-buffer-from-draft
13443@c @kindex C-c M-d (Mail)
13444@c @kindex C-c M-d (Post)
13445@c @findex gnus-associate-buffer-with-draft
13446@c @kindex C-c C-d (Mail)
13447@c @kindex C-c C-d (Post)
13448@c If you're writing some super-secret message that you later want to
13449@c encode with PGP before sending, you may wish to turn the auto-saving
13450@c (and association with the draft group) off. You never know who might be
13451@c interested in reading all your extremely valuable and terribly horrible
13452@c and interesting secrets. The @kbd{C-c M-d}
13453@c (@code{gnus-dissociate-buffer-from-draft}) command does that for you.
13454@c If you change your mind and want to turn the auto-saving back on again,
13455@c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that.
13456@c
13457@c @vindex gnus-use-draft
13458@c To leave association with the draft group off by default, set
13459@c @code{gnus-use-draft} to @code{nil}. It is @code{t} by default.
13460
13461@findex gnus-draft-edit-message
13462@kindex D e (Draft)
13463When you want to continue editing the article, you simply enter the
13464draft group and push @kbd{D e} (@code{gnus-draft-edit-message}) to do
13465that. You will be placed in a buffer where you left off.
13466
13467Rejected articles will also be put in this draft group (@pxref{Rejected
13468Articles}).
13469
13470@findex gnus-draft-send-all-messages
13471@kindex D s (Draft)
13472@findex gnus-draft-send-message
13473@kindex D S (Draft)
13474If you have lots of rejected messages you want to post (or mail) without
13475doing further editing, you can use the @kbd{D s} command
13476(@code{gnus-draft-send-message}). This command understands the
13477process/prefix convention (@pxref{Process/Prefix}). The @kbd{D S}
13478command (@code{gnus-draft-send-all-messages}) will ship off all messages
13479in the buffer.
13480
13481@findex gnus-draft-toggle-sending
13482@kindex D t (Draft)
13483If you have some messages that you wish not to send, you can use the
13484@kbd{D t} (@code{gnus-draft-toggle-sending}) command to mark the message
13485as unsendable. This is a toggling command.
13486
13487
13488@node Rejected Articles
13489@section Rejected Articles
13490@cindex rejected articles
13491
13492Sometimes a news server will reject an article. Perhaps the server
13493doesn't like your face. Perhaps it just feels miserable. Perhaps
13494@emph{there be demons}. Perhaps you have included too much cited text.
13495Perhaps the disk is full. Perhaps the server is down.
13496
13497These situations are, of course, totally beyond the control of Gnus.
13498(Gnus, of course, loves the way you look, always feels great, has angels
13499fluttering around inside of it, doesn't care about how much cited text
13500you include, never runs full and never goes down.) So Gnus saves these
13501articles until some later time when the server feels better.
13502
13503The rejected articles will automatically be put in a special draft group
13504(@pxref{Drafts}). When the server comes back up again, you'd then
13505typically enter that group and send all the articles off.
13506
13507@node Signing and encrypting
13508@section Signing and encrypting
13509@cindex using gpg
13510@cindex using s/mime
13511@cindex using smime
13512
13513Gnus can digitally sign and encrypt your messages, using vanilla
13514@acronym{PGP} format or @acronym{PGP/MIME} or @acronym{S/MIME}. For
13515decoding such messages, see the @code{mm-verify-option} and
13516@code{mm-decrypt-option} options (@pxref{Security}).
13517
13518@vindex gnus-message-replysign
13519@vindex gnus-message-replyencrypt
13520@vindex gnus-message-replysignencrypted
13521Often, you would like to sign replies to people who send you signed
13522messages. Even more often, you might want to encrypt messages which
13523are in reply to encrypted messages. Gnus offers
13524@code{gnus-message-replysign} to enable the former, and
13525@code{gnus-message-replyencrypt} for the latter. In addition, setting
13526@code{gnus-message-replysignencrypted} (on by default) will sign
13527automatically encrypted messages.
13528
13529Instructing @acronym{MML} to perform security operations on a
13530@acronym{MIME} part is done using the @kbd{C-c C-m s} key map for
13531signing and the @kbd{C-c C-m c} key map for encryption, as follows.
13532
13533@table @kbd
13534
13535@item C-c C-m s s
13536@kindex C-c C-m s s (Message)
13537@findex mml-secure-message-sign-smime
13538
13539Digitally sign current message using @acronym{S/MIME}.
13540
13541@item C-c C-m s o
13542@kindex C-c C-m s o (Message)
13543@findex mml-secure-message-sign-pgp
13544
13545Digitally sign current message using @acronym{PGP}.
13546
13547@item C-c C-m s p
13548@kindex C-c C-m s p (Message)
13549@findex mml-secure-message-sign-pgp
13550
13551Digitally sign current message using @acronym{PGP/MIME}.
13552
13553@item C-c C-m c s
13554@kindex C-c C-m c s (Message)
13555@findex mml-secure-message-encrypt-smime
13556
13557Digitally encrypt current message using @acronym{S/MIME}.
13558
13559@item C-c C-m c o
13560@kindex C-c C-m c o (Message)
13561@findex mml-secure-message-encrypt-pgp
13562
13563Digitally encrypt current message using @acronym{PGP}.
13564
13565@item C-c C-m c p
13566@kindex C-c C-m c p (Message)
13567@findex mml-secure-message-encrypt-pgpmime
13568
13569Digitally encrypt current message using @acronym{PGP/MIME}.
13570
13571@item C-c C-m C-n
13572@kindex C-c C-m C-n (Message)
13573@findex mml-unsecure-message
13574Remove security related @acronym{MML} tags from message.
13575
13576@end table
13577
13578@xref{Security, ,Security, message, Message Manual}, for more information.
13579
13580@node Select Methods
13581@chapter Select Methods
13582@cindex foreign groups
13583@cindex select methods
13584
13585A @dfn{foreign group} is a group not read by the usual (or
13586default) means. It could be, for instance, a group from a different
13587@acronym{NNTP} server, it could be a virtual group, or it could be your own
13588personal mail group.
13589
13590A foreign group (or any group, really) is specified by a @dfn{name} and
13591a @dfn{select method}. To take the latter first, a select method is a
13592list where the first element says what back end to use (e.g. @code{nntp},
13593@code{nnspool}, @code{nnml}) and the second element is the @dfn{server
13594name}. There may be additional elements in the select method, where the
13595value may have special meaning for the back end in question.
13596
13597One could say that a select method defines a @dfn{virtual server}---so
13598we do just that (@pxref{Server Buffer}).
13599
13600The @dfn{name} of the group is the name the back end will recognize the
13601group as.
13602
13603For instance, the group @samp{soc.motss} on the @acronym{NNTP} server
13604@samp{some.where.edu} will have the name @samp{soc.motss} and select
13605method @code{(nntp "some.where.edu")}. Gnus will call this group
13606@samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp}
13607back end just knows this group as @samp{soc.motss}.
13608
13609The different methods all have their peculiarities, of course.
13610
13611@menu
13612* Server Buffer:: Making and editing virtual servers.
13613* Getting News:: Reading USENET news with Gnus.
13614* Getting Mail:: Reading your personal mail with Gnus.
13615* Browsing the Web:: Getting messages from a plethora of Web sources.
13616* IMAP:: Using Gnus as a @acronym{IMAP} client.
13617* Other Sources:: Reading directories, files, SOUP packets.
13618* Combined Groups:: Combining groups into one group.
13619* Email Based Diary:: Using mails to manage diary events in Gnus.
13620* Gnus Unplugged:: Reading news and mail offline.
13621@end menu
13622
13623
13624@node Server Buffer
13625@section Server Buffer
13626
13627Traditionally, a @dfn{server} is a machine or a piece of software that
13628one connects to, and then requests information from. Gnus does not
13629connect directly to any real servers, but does all transactions through
13630one back end or other. But that's just putting one layer more between
13631the actual media and Gnus, so we might just as well say that each
13632back end represents a virtual server.
13633
13634For instance, the @code{nntp} back end may be used to connect to several
13635different actual @acronym{NNTP} servers, or, perhaps, to many different ports
13636on the same actual @acronym{NNTP} server. You tell Gnus which back end to
13637use, and what parameters to set by specifying a @dfn{select method}.
13638
13639These select method specifications can sometimes become quite
13640complicated---say, for instance, that you want to read from the
13641@acronym{NNTP} server @samp{news.funet.fi} on port number 13, which
13642hangs if queried for @acronym{NOV} headers and has a buggy select. Ahem.
13643Anyway, if you had to specify that for each group that used this
13644server, that would be too much work, so Gnus offers a way of naming
13645select methods, which is what you do in the server buffer.
13646
13647To enter the server buffer, use the @kbd{^}
13648(@code{gnus-group-enter-server-mode}) command in the group buffer.
13649
13650@menu
13651* Server Buffer Format:: You can customize the look of this buffer.
13652* Server Commands:: Commands to manipulate servers.
13653* Example Methods:: Examples server specifications.
13654* Creating a Virtual Server:: An example session.
13655* Server Variables:: Which variables to set.
13656* Servers and Methods:: You can use server names as select methods.
13657* Unavailable Servers:: Some servers you try to contact may be down.
13658@end menu
13659
13660@vindex gnus-server-mode-hook
13661@code{gnus-server-mode-hook} is run when creating the server buffer.
13662
13663
13664@node Server Buffer Format
13665@subsection Server Buffer Format
13666@cindex server buffer format
13667
13668@vindex gnus-server-line-format
13669You can change the look of the server buffer lines by changing the
13670@code{gnus-server-line-format} variable. This is a @code{format}-like
13671variable, with some simple extensions:
13672
13673@table @samp
13674
13675@item h
13676How the news is fetched---the back end name.
13677
13678@item n
13679The name of this server.
13680
13681@item w
13682Where the news is to be fetched from---the address.
13683
13684@item s
13685The opened/closed/denied status of the server.
13686
13687@item a
13688Whether this server is agentized.
13689@end table
13690
13691@vindex gnus-server-mode-line-format
13692The mode line can also be customized by using the
13693@code{gnus-server-mode-line-format} variable (@pxref{Mode Line
13694Formatting}). The following specs are understood:
13695
13696@table @samp
13697@item S
13698Server name.
13699
13700@item M
13701Server method.
13702@end table
13703
13704Also @pxref{Formatting Variables}.
13705
13706
13707@node Server Commands
13708@subsection Server Commands
13709@cindex server commands
13710
13711@table @kbd
13712
13713@item v
13714@kindex v (Server)
13715@cindex keys, reserved for users (Server)
13716The key @kbd{v} is reserved for users. You can bind it to some
13717command or better use it as a prefix key.
13718
13719@item a
13720@kindex a (Server)
13721@findex gnus-server-add-server
13722Add a new server (@code{gnus-server-add-server}).
13723
13724@item e
13725@kindex e (Server)
13726@findex gnus-server-edit-server
13727Edit a server (@code{gnus-server-edit-server}).
13728
13729@item SPACE
13730@kindex SPACE (Server)
13731@findex gnus-server-read-server
13732Browse the current server (@code{gnus-server-read-server}).
13733
13734@item q
13735@kindex q (Server)
13736@findex gnus-server-exit
13737Return to the group buffer (@code{gnus-server-exit}).
13738
13739@item k
13740@kindex k (Server)
13741@findex gnus-server-kill-server
13742Kill the current server (@code{gnus-server-kill-server}).
13743
13744@item y
13745@kindex y (Server)
13746@findex gnus-server-yank-server
13747Yank the previously killed server (@code{gnus-server-yank-server}).
13748
13749@item c
13750@kindex c (Server)
13751@findex gnus-server-copy-server
13752Copy the current server (@code{gnus-server-copy-server}).
13753
13754@item l
13755@kindex l (Server)
13756@findex gnus-server-list-servers
13757List all servers (@code{gnus-server-list-servers}).
13758
13759@item s
13760@kindex s (Server)
13761@findex gnus-server-scan-server
13762Request that the server scan its sources for new articles
13763(@code{gnus-server-scan-server}). This is mainly sensible with mail
13764servers.
13765
13766@item g
13767@kindex g (Server)
13768@findex gnus-server-regenerate-server
13769Request that the server regenerate all its data structures
13770(@code{gnus-server-regenerate-server}). This can be useful if you have
13771a mail back end that has gotten out of sync.
13772
01c52d31
MB
13773@item z
13774@kindex z (Server)
13775@findex gnus-server-compact-server
13776
13777Compact all groups in the server under point
13778(@code{gnus-server-compact-server}). Currently implemented only in
13779nnml (@pxref{Mail Spool}). This removes gaps between article numbers,
13780hence getting a correct total article count.
13781
4009494e
GM
13782@end table
13783
13784
13785@node Example Methods
13786@subsection Example Methods
13787
13788Most select methods are pretty simple and self-explanatory:
13789
13790@lisp
13791(nntp "news.funet.fi")
13792@end lisp
13793
13794Reading directly from the spool is even simpler:
13795
13796@lisp
13797(nnspool "")
13798@end lisp
13799
13800As you can see, the first element in a select method is the name of the
13801back end, and the second is the @dfn{address}, or @dfn{name}, if you
13802will.
13803
13804After these two elements, there may be an arbitrary number of
13805@code{(@var{variable} @var{form})} pairs.
13806
13807To go back to the first example---imagine that you want to read from
13808port 15 on that machine. This is what the select method should
13809look like then:
13810
13811@lisp
13812(nntp "news.funet.fi" (nntp-port-number 15))
13813@end lisp
13814
13815You should read the documentation to each back end to find out what
13816variables are relevant, but here's an @code{nnmh} example:
13817
13818@code{nnmh} is a mail back end that reads a spool-like structure. Say
13819you have two structures that you wish to access: One is your private
13820mail spool, and the other is a public one. Here's the possible spec for
13821your private mail:
13822
13823@lisp
13824(nnmh "private" (nnmh-directory "~/private/mail/"))
13825@end lisp
13826
13827(This server is then called @samp{private}, but you may have guessed
13828that.)
13829
13830Here's the method for a public spool:
13831
13832@lisp
13833(nnmh "public"
13834 (nnmh-directory "/usr/information/spool/")
13835 (nnmh-get-new-mail nil))
13836@end lisp
13837
13838@cindex proxy
13839@cindex firewall
13840
13841If you are behind a firewall and only have access to the @acronym{NNTP}
13842server from the firewall machine, you can instruct Gnus to @code{rlogin}
31fe2b00
SM
13843on the firewall machine and connect with
13844@uref{http://netcat.sourceforge.net/, netcat} from there to the
13845@acronym{NNTP} server.
4009494e
GM
13846Doing this can be rather fiddly, but your virtual server definition
13847should probably look something like this:
13848
13849@lisp
13850(nntp "firewall"
31fe2b00 13851 (nntp-open-connection-function nntp-open-via-rlogin-and-netcat)
4009494e 13852 (nntp-via-address "the.firewall.machine")
31fe2b00 13853 (nntp-address "the.real.nntp.host"))
4009494e
GM
13854@end lisp
13855
13856If you want to use the wonderful @code{ssh} program to provide a
13857compressed connection over the modem line, you could add the following
13858configuration to the example above:
13859
13860@lisp
13861 (nntp-via-rlogin-command "ssh")
13862@end lisp
13863
01c52d31
MB
13864See also @code{nntp-via-rlogin-command-switches}. Here's an example for
13865an indirect connection:
fbcbb58c 13866
01c52d31
MB
13867@lisp
13868(setq gnus-select-method
13869 '(nntp "indirect"
13870 (nntp-address "news.server.example")
13871 (nntp-via-user-name "intermediate_user_name")
13872 (nntp-via-address "intermediate.host.example")
13873 (nntp-via-rlogin-command "ssh")
31fe2b00
SM
13874 (nntp-via-rlogin-command-switches ("-C"))
13875 (nntp-open-connection-function nntp-open-via-rlogin-and-netcat)))
01c52d31 13876@end lisp
4009494e 13877
fbcbb58c
KY
13878This means that you have to have set up @code{ssh-agent} correctly to
13879provide automatic authorization, of course.
13880
4009494e
GM
13881If you're behind a firewall, but have direct access to the outside world
13882through a wrapper command like "runsocks", you could open a socksified
31fe2b00 13883netcat connection to the news server as follows:
4009494e
GM
13884
13885@lisp
13886(nntp "outside"
13887 (nntp-pre-command "runsocks")
990e2c2f 13888 (nntp-open-connection-function nntp-open-netcat-stream)
31fe2b00 13889 (nntp-address "the.news.server"))
4009494e
GM
13890@end lisp
13891
4009494e
GM
13892
13893@node Creating a Virtual Server
13894@subsection Creating a Virtual Server
13895
13896If you're saving lots of articles in the cache by using persistent
13897articles, you may want to create a virtual server to read the cache.
13898
13899First you need to add a new server. The @kbd{a} command does that. It
13900would probably be best to use @code{nnml} to read the cache. You
13901could also use @code{nnspool} or @code{nnmh}, though.
13902
13903Type @kbd{a nnml RET cache RET}.
13904
13905You should now have a brand new @code{nnml} virtual server called
13906@samp{cache}. You now need to edit it to have the right definitions.
13907Type @kbd{e} to edit the server. You'll be entered into a buffer that
13908will contain the following:
13909
13910@lisp
13911(nnml "cache")
13912@end lisp
13913
13914Change that to:
13915
13916@lisp
13917(nnml "cache"
13918 (nnml-directory "~/News/cache/")
13919 (nnml-active-file "~/News/cache/active"))
13920@end lisp
13921
13922Type @kbd{C-c C-c} to return to the server buffer. If you now press
13923@kbd{RET} over this virtual server, you should be entered into a browse
13924buffer, and you should be able to enter any of the groups displayed.
13925
13926
13927@node Server Variables
13928@subsection Server Variables
13929@cindex server variables
13930@cindex server parameters
13931
13932One sticky point when defining variables (both on back ends and in Emacs
13933in general) is that some variables are typically initialized from other
13934variables when the definition of the variables is being loaded. If you
13935change the ``base'' variable after the variables have been loaded, you
13936won't change the ``derived'' variables.
13937
13938This typically affects directory and file variables. For instance,
13939@code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml}
13940directory variables are initialized from that variable, so
13941@code{nnml-active-file} will be @file{~/Mail/active}. If you define a
13942new virtual @code{nnml} server, it will @emph{not} suffice to set just
13943@code{nnml-directory}---you have to explicitly set all the file
13944variables to be what you want them to be. For a complete list of
13945variables for each back end, see each back end's section later in this
13946manual, but here's an example @code{nnml} definition:
13947
13948@lisp
13949(nnml "public"
13950 (nnml-directory "~/my-mail/")
13951 (nnml-active-file "~/my-mail/active")
13952 (nnml-newsgroups-file "~/my-mail/newsgroups"))
13953@end lisp
13954
13955Server variables are often called @dfn{server parameters}.
13956
13957@node Servers and Methods
13958@subsection Servers and Methods
13959
13960Wherever you would normally use a select method
13961(e.g. @code{gnus-secondary-select-method}, in the group select method,
13962when browsing a foreign server) you can use a virtual server name
13963instead. This could potentially save lots of typing. And it's nice all
13964over.
13965
13966
13967@node Unavailable Servers
13968@subsection Unavailable Servers
13969
13970If a server seems to be unreachable, Gnus will mark that server as
13971@code{denied}. That means that any subsequent attempt to make contact
13972with that server will just be ignored. ``It can't be opened,'' Gnus
13973will tell you, without making the least effort to see whether that is
13974actually the case or not.
13975
13976That might seem quite naughty, but it does make sense most of the time.
13977Let's say you have 10 groups subscribed to on server
13978@samp{nephelococcygia.com}. This server is located somewhere quite far
13979away from you and the machine is quite slow, so it takes 1 minute just
13980to find out that it refuses connection to you today. If Gnus were to
13981attempt to do that 10 times, you'd be quite annoyed, so Gnus won't
13982attempt to do that. Once it has gotten a single ``connection refused'',
13983it will regard that server as ``down''.
13984
13985So, what happens if the machine was only feeling unwell temporarily?
13986How do you test to see whether the machine has come up again?
13987
13988You jump to the server buffer (@pxref{Server Buffer}) and poke it
13989with the following commands:
13990
13991@table @kbd
13992
13993@item O
13994@kindex O (Server)
13995@findex gnus-server-open-server
13996Try to establish connection to the server on the current line
13997(@code{gnus-server-open-server}).
13998
13999@item C
14000@kindex C (Server)
14001@findex gnus-server-close-server
14002Close the connection (if any) to the server
14003(@code{gnus-server-close-server}).
14004
14005@item D
14006@kindex D (Server)
14007@findex gnus-server-deny-server
14008Mark the current server as unreachable
14009(@code{gnus-server-deny-server}).
14010
14011@item M-o
14012@kindex M-o (Server)
14013@findex gnus-server-open-all-servers
14014Open the connections to all servers in the buffer
14015(@code{gnus-server-open-all-servers}).
14016
14017@item M-c
14018@kindex M-c (Server)
14019@findex gnus-server-close-all-servers
14020Close the connections to all servers in the buffer
14021(@code{gnus-server-close-all-servers}).
14022
14023@item R
14024@kindex R (Server)
14025@findex gnus-server-remove-denials
14026Remove all marks to whether Gnus was denied connection from any servers
14027(@code{gnus-server-remove-denials}).
14028
14029@item L
14030@kindex L (Server)
14031@findex gnus-server-offline-server
14032Set server status to offline (@code{gnus-server-offline-server}).
14033
14034@end table
14035
14036
14037@node Getting News
14038@section Getting News
14039@cindex reading news
14040@cindex news back ends
14041
14042A newsreader is normally used for reading news. Gnus currently provides
14043only two methods of getting news---it can read from an @acronym{NNTP} server,
14044or it can read from a local spool.
14045
14046@menu
14047* NNTP:: Reading news from an @acronym{NNTP} server.
14048* News Spool:: Reading news from the local spool.
14049@end menu
14050
14051
14052@node NNTP
14053@subsection NNTP
14054@cindex nntp
14055
14056Subscribing to a foreign group from an @acronym{NNTP} server is rather easy.
14057You just specify @code{nntp} as method and the address of the @acronym{NNTP}
14058server as the, uhm, address.
14059
14060If the @acronym{NNTP} server is located at a non-standard port, setting the
14061third element of the select method to this port number should allow you
14062to connect to the right port. You'll have to edit the group info for
14063that (@pxref{Foreign Groups}).
14064
14065The name of the foreign group can be the same as a native group. In
14066fact, you can subscribe to the same group from as many different servers
14067you feel like. There will be no name collisions.
14068
14069The following variables can be used to create a virtual @code{nntp}
14070server:
14071
14072@table @code
14073
14074@item nntp-server-opened-hook
14075@vindex nntp-server-opened-hook
14076@cindex @sc{mode reader}
14077@cindex authinfo
14078@cindex authentication
14079@cindex nntp authentication
14080@findex nntp-send-authinfo
14081@findex nntp-send-mode-reader
14082is run after a connection has been made. It can be used to send
14083commands to the @acronym{NNTP} server after it has been contacted. By
14084default it sends the command @code{MODE READER} to the server with the
14085@code{nntp-send-mode-reader} function. This function should always be
14086present in this hook.
14087
14088@item nntp-authinfo-function
14089@vindex nntp-authinfo-function
14090@findex nntp-send-authinfo
14091@vindex nntp-authinfo-file
14092This function will be used to send @samp{AUTHINFO} to the @acronym{NNTP}
14093server. The default function is @code{nntp-send-authinfo}, which looks
14094through your @file{~/.authinfo} (or whatever you've set the
14095@code{nntp-authinfo-file} variable to) for applicable entries. If none
14096are found, it will prompt you for a login name and a password. The
14097format of the @file{~/.authinfo} file is (almost) the same as the
14098@code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp}
14099manual page, but here are the salient facts:
14100
14101@enumerate
14102@item
14103The file contains one or more line, each of which define one server.
14104
14105@item
14106Each line may contain an arbitrary number of token/value pairs.
14107
14108The valid tokens include @samp{machine}, @samp{login}, @samp{password},
14109@samp{default}. In addition Gnus introduces two new tokens, not present
14110in the original @file{.netrc}/@code{ftp} syntax, namely @samp{port} and
14111@samp{force}. (This is the only way the @file{.authinfo} file format
14112deviates from the @file{.netrc} file format.) @samp{port} is used to
14113indicate what port on the server the credentials apply to and
14114@samp{force} is explained below.
14115
14116@end enumerate
14117
14118Here's an example file:
14119
14120@example
14121machine news.uio.no login larsi password geheimnis
14122machine nntp.ifi.uio.no login larsi force yes
14123@end example
14124
14125The token/value pairs may appear in any order; @samp{machine} doesn't
14126have to be first, for instance.
14127
14128In this example, both login name and password have been supplied for the
14129former server, while the latter has only the login name listed, and the
14130user will be prompted for the password. The latter also has the
14131@samp{force} tag, which means that the authinfo will be sent to the
14132@var{nntp} server upon connection; the default (i.e., when there is not
14133@samp{force} tag) is to not send authinfo to the @var{nntp} server
14134until the @var{nntp} server asks for it.
14135
14136You can also add @samp{default} lines that will apply to all servers
14137that don't have matching @samp{machine} lines.
14138
14139@example
14140default force yes
14141@end example
14142
14143This will force sending @samp{AUTHINFO} commands to all servers not
14144previously mentioned.
14145
14146Remember to not leave the @file{~/.authinfo} file world-readable.
14147
14148@item nntp-server-action-alist
14149@vindex nntp-server-action-alist
14150This is a list of regexps to match on server types and actions to be
14151taken when matches are made. For instance, if you want Gnus to beep
14152every time you connect to innd, you could say something like:
14153
14154@lisp
14155(setq nntp-server-action-alist
14156 '(("innd" (ding))))
14157@end lisp
14158
14159You probably don't want to do that, though.
14160
14161The default value is
14162
14163@lisp
14164'(("nntpd 1\\.5\\.11t"
14165 (remove-hook 'nntp-server-opened-hook
14166 'nntp-send-mode-reader)))
14167@end lisp
14168
14169This ensures that Gnus doesn't send the @code{MODE READER} command to
14170nntpd 1.5.11t, since that command chokes that server, I've been told.
14171
14172@item nntp-maximum-request
14173@vindex nntp-maximum-request
14174If the @acronym{NNTP} server doesn't support @acronym{NOV} headers, this back end
14175will collect headers by sending a series of @code{head} commands. To
14176speed things up, the back end sends lots of these commands without
14177waiting for reply, and then reads all the replies. This is controlled
14178by the @code{nntp-maximum-request} variable, and is 400 by default. If
14179your network is buggy, you should set this to 1.
14180
14181@item nntp-connection-timeout
14182@vindex nntp-connection-timeout
14183If you have lots of foreign @code{nntp} groups that you connect to
14184regularly, you're sure to have problems with @acronym{NNTP} servers not
14185responding properly, or being too loaded to reply within reasonable
14186time. This is can lead to awkward problems, which can be helped
14187somewhat by setting @code{nntp-connection-timeout}. This is an integer
14188that says how many seconds the @code{nntp} back end should wait for a
14189connection before giving up. If it is @code{nil}, which is the default,
14190no timeouts are done.
14191
14192@item nntp-nov-is-evil
14193@vindex nntp-nov-is-evil
14194If the @acronym{NNTP} server does not support @acronym{NOV}, you could set this
14195variable to @code{t}, but @code{nntp} usually checks automatically whether @acronym{NOV}
14196can be used.
14197
14198@item nntp-xover-commands
14199@vindex nntp-xover-commands
14200@cindex @acronym{NOV}
14201@cindex XOVER
14202List of strings used as commands to fetch @acronym{NOV} lines from a
14203server. The default value of this variable is @code{("XOVER"
14204"XOVERVIEW")}.
14205
14206@item nntp-nov-gap
14207@vindex nntp-nov-gap
14208@code{nntp} normally sends just one big request for @acronym{NOV} lines to
14209the server. The server responds with one huge list of lines. However,
14210if you have read articles 2-5000 in the group, and only want to read
14211article 1 and 5001, that means that @code{nntp} will fetch 4999 @acronym{NOV}
14212lines that you will not need. This variable says how
14213big a gap between two consecutive articles is allowed to be before the
14214@code{XOVER} request is split into several request. Note that if your
14215network is fast, setting this variable to a really small number means
14216that fetching will probably be slower. If this variable is @code{nil},
14217@code{nntp} will never split requests. The default is 5.
14218
14219@item nntp-xref-number-is-evil
14220@vindex nntp-xref-number-is-evil
14221When Gnus refers to an article having the @code{Message-ID} that a user
14222specifies or having the @code{Message-ID} of the parent article of the
14223current one (@pxref{Finding the Parent}), Gnus sends a @code{HEAD}
14224command to the @acronym{NNTP} server to know where it is, and the server
14225returns the data containing the pairs of a group and an article number
14226in the @code{Xref} header. Gnus normally uses the article number to
14227refer to the article if the data shows that that article is in the
14228current group, while it uses the @code{Message-ID} otherwise. However,
14229some news servers, e.g., ones running Diablo, run multiple engines
14230having the same articles but article numbers are not kept synchronized
14231between them. In that case, the article number that appears in the
14232@code{Xref} header varies by which engine is chosen, so you cannot refer
14233to the parent article that is in the current group, for instance. If
14234you connect to such a server, set this variable to a non-@code{nil}
14235value, and Gnus never uses article numbers. For example:
14236
14237@lisp
14238(setq gnus-select-method
14239 '(nntp "newszilla"
14240 (nntp-address "newszilla.example.com")
14241 (nntp-xref-number-is-evil t)
14242 @dots{}))
14243@end lisp
14244
14245The default value of this server variable is @code{nil}.
14246
14247@item nntp-prepare-server-hook
14248@vindex nntp-prepare-server-hook
14249A hook run before attempting to connect to an @acronym{NNTP} server.
14250
14251@item nntp-record-commands
14252@vindex nntp-record-commands
14253If non-@code{nil}, @code{nntp} will log all commands it sends to the
14254@acronym{NNTP} server (along with a timestamp) in the @samp{*nntp-log*}
14255buffer. This is useful if you are debugging a Gnus/@acronym{NNTP} connection
14256that doesn't seem to work.
14257
14258@item nntp-open-connection-function
14259@vindex nntp-open-connection-function
14260It is possible to customize how the connection to the nntp server will
14261be opened. If you specify an @code{nntp-open-connection-function}
14262parameter, Gnus will use that function to establish the connection.
01c52d31
MB
14263Seven pre-made functions are supplied. These functions can be grouped
14264in two categories: direct connection functions (four pre-made), and
14265indirect ones (three pre-made).
4009494e
GM
14266
14267@item nntp-never-echoes-commands
14268@vindex nntp-never-echoes-commands
14269Non-@code{nil} means the nntp server never echoes commands. It is
14270reported that some nntps server doesn't echo commands. So, you may want
14271to set this to non-@code{nil} in the method for such a server setting
14272@code{nntp-open-connection-function} to @code{nntp-open-ssl-stream} for
14273example. The default value is @code{nil}. Note that the
14274@code{nntp-open-connection-functions-never-echo-commands} variable
14275overrides the @code{nil} value of this variable.
14276
14277@item nntp-open-connection-functions-never-echo-commands
14278@vindex nntp-open-connection-functions-never-echo-commands
14279List of functions that never echo commands. Add or set a function which
14280you set to @code{nntp-open-connection-function} to this list if it does
14281not echo commands. Note that a non-@code{nil} value of the
14282@code{nntp-never-echoes-commands} variable overrides this variable. The
14283default value is @code{(nntp-open-network-stream)}.
14284
14285@item nntp-prepare-post-hook
14286@vindex nntp-prepare-post-hook
14287A hook run just before posting an article. If there is no
14288@code{Message-ID} header in the article and the news server provides the
14289recommended ID, it will be added to the article before running this
14290hook. It is useful to make @code{Cancel-Lock} headers even if you
14291inhibit Gnus to add a @code{Message-ID} header, you could say:
14292
14293@lisp
14294(add-hook 'nntp-prepare-post-hook 'canlock-insert-header)
14295@end lisp
14296
14297Note that not all servers support the recommended ID. This works for
14298INN versions 2.3.0 and later, for instance.
14299
14300@end table
14301
14302@menu
14303* Direct Functions:: Connecting directly to the server.
14304* Indirect Functions:: Connecting indirectly to the server.
14305* Common Variables:: Understood by several connection functions.
01c52d31 14306* NNTP marks:: Storing marks for @acronym{NNTP} servers.
4009494e
GM
14307@end menu
14308
14309
14310@node Direct Functions
14311@subsubsection Direct Functions
14312@cindex direct connection functions
14313
14314These functions are called direct because they open a direct connection
14315between your machine and the @acronym{NNTP} server. The behavior of these
14316functions is also affected by commonly understood variables
14317(@pxref{Common Variables}).
14318
14319@table @code
14320@findex nntp-open-network-stream
14321@item nntp-open-network-stream
14322This is the default, and simply connects to some port or other on the
14323remote system.
14324
14325@findex nntp-open-tls-stream
14326@item nntp-open-tls-stream
14327Opens a connection to a server over a @dfn{secure} channel. To use
14328this you must have @uref{http://www.gnu.org/software/gnutls/, GNUTLS}
14329installed. You then define a server as follows:
14330
14331@lisp
14332;; @r{"nntps" is port 563 and is predefined in our @file{/etc/services}}
14333;; @r{however, @samp{gnutls-cli -p} doesn't like named ports.}
14334;;
14335(nntp "snews.bar.com"
14336 (nntp-open-connection-function nntp-open-tls-stream)
14337 (nntp-port-number )
14338 (nntp-address "snews.bar.com"))
14339@end lisp
14340
14341@findex nntp-open-ssl-stream
14342@item nntp-open-ssl-stream
14343Opens a connection to a server over a @dfn{secure} channel. To use
14344this you must have @uref{http://www.openssl.org, OpenSSL} or
14345@uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL, SSLeay} installed. You
14346then define a server as follows:
14347
14348@lisp
14349;; @r{"snews" is port 563 and is predefined in our @file{/etc/services}}
14350;; @r{however, @samp{openssl s_client -port} doesn't like named ports.}
14351;;
14352(nntp "snews.bar.com"
14353 (nntp-open-connection-function nntp-open-ssl-stream)
14354 (nntp-port-number 563)
14355 (nntp-address "snews.bar.com"))
14356@end lisp
14357
990e2c2f
SM
14358@findex nntp-open-netcat-stream
14359@item nntp-open-netcat-stream
31fe2b00
SM
14360Opens a connection to an @acronym{NNTP} server using the @code{netcat}
14361program. You might wonder why this function exists, since we have
14362the default @code{nntp-open-network-stream} which would do the job. (One
4009494e
GM
14363of) the reason(s) is that if you are behind a firewall but have direct
14364connections to the outside world thanks to a command wrapper like
14365@code{runsocks}, you can use it like this:
14366
14367@lisp
14368(nntp "socksified"
14369 (nntp-pre-command "runsocks")
990e2c2f 14370 (nntp-open-connection-function nntp-open-netcat-stream)
4009494e
GM
14371 (nntp-address "the.news.server"))
14372@end lisp
14373
14374With the default method, you would need to wrap your whole Emacs
14375session, which is not a good idea.
31fe2b00
SM
14376
14377@findex nntp-open-telnet-stream
14378@item nntp-open-telnet-stream
990e2c2f 14379Like @code{nntp-open-netcat-stream}, but uses @code{telnet} rather than
31fe2b00
SM
14380@code{netcat}. @code{telnet} is a bit less robust because of things
14381like line-end-conversion, but sometimes netcat is simply
14382not available. The previous example would turn into:
14383
14384@lisp
14385(nntp "socksified"
14386 (nntp-pre-command "runsocks")
14387 (nntp-open-connection-function nntp-open-telnet-stream)
14388 (nntp-address "the.news.server")
14389 (nntp-end-of-line "\n"))
14390@end lisp
4009494e
GM
14391@end table
14392
14393
14394@node Indirect Functions
14395@subsubsection Indirect Functions
14396@cindex indirect connection functions
14397
14398These functions are called indirect because they connect to an
14399intermediate host before actually connecting to the @acronym{NNTP} server.
14400All of these functions and related variables are also said to belong to
14401the ``via'' family of connection: they're all prefixed with ``via'' to make
14402things cleaner. The behavior of these functions is also affected by
14403commonly understood variables (@pxref{Common Variables}).
14404
14405@table @code
31fe2b00
SM
14406@item nntp-open-via-rlogin-and-netcat
14407@findex nntp-open-via-rlogin-and-netcat
14408Does an @samp{rlogin} on a remote system, and then uses @code{netcat} to connect
4009494e
GM
14409to the real @acronym{NNTP} server from there. This is useful for instance if
14410you need to connect to a firewall machine first.
14411
31fe2b00 14412@code{nntp-open-via-rlogin-and-netcat}-specific variables:
4009494e
GM
14413
14414@table @code
14415@item nntp-via-rlogin-command
14416@vindex nntp-via-rlogin-command
14417Command used to log in on the intermediate host. The default is
14418@samp{rsh}, but @samp{ssh} is a popular alternative.
14419
14420@item nntp-via-rlogin-command-switches
14421@vindex nntp-via-rlogin-command-switches
14422List of strings to be used as the switches to
14423@code{nntp-via-rlogin-command}. The default is @code{nil}. If you use
14424@samp{ssh} for @code{nntp-via-rlogin-command}, you may set this to
31fe2b00 14425@samp{("-C")} in order to compress all data connections.
4009494e
GM
14426@end table
14427
31fe2b00
SM
14428@item nntp-open-via-rlogin-and-telnet
14429@findex nntp-open-via-rlogin-and-telnet
14430Does essentially the same, but uses @code{telnet} instead of @samp{netcat}
01c52d31 14431to connect to the real @acronym{NNTP} server from the intermediate host.
31fe2b00
SM
14432@code{telnet} is a bit less robust because of things like
14433line-end-conversion, but sometimes @code{netcat} is simply not available.
01c52d31 14434
31fe2b00 14435@code{nntp-open-via-rlogin-and-telnet}-specific variables:
01c52d31
MB
14436
14437@table @code
31fe2b00
SM
14438@item nntp-telnet-command
14439@vindex nntp-telnet-command
01c52d31 14440Command used to connect to the real @acronym{NNTP} server from the
fbcbb58c 14441intermediate host. The default is @samp{telnet}.
01c52d31 14442
31fe2b00
SM
14443@item nntp-telnet-switches
14444@vindex nntp-telnet-switches
01c52d31 14445List of strings to be used as the switches to the
31fe2b00 14446@code{nntp-telnet-command} command. The default is @code{("-8")}.
01c52d31
MB
14447
14448@item nntp-via-rlogin-command
14449@vindex nntp-via-rlogin-command
14450Command used to log in on the intermediate host. The default is
14451@samp{rsh}, but @samp{ssh} is a popular alternative.
14452
14453@item nntp-via-rlogin-command-switches
14454@vindex nntp-via-rlogin-command-switches
14455List of strings to be used as the switches to
31fe2b00
SM
14456@code{nntp-via-rlogin-command}. If you use @samp{ssh}, you may need to set
14457this to @samp{("-t" "-e" "none")} or @samp{("-C" "-t" "-e" "none")} if
14458the telnet command requires a pseudo-tty allocation on an intermediate
14459host. The default is @code{nil}.
01c52d31
MB
14460@end table
14461
31fe2b00
SM
14462Note that you may want to change the value for @code{nntp-end-of-line}
14463to @samp{\n} (@pxref{Common Variables}).
14464
4009494e
GM
14465@item nntp-open-via-telnet-and-telnet
14466@findex nntp-open-via-telnet-and-telnet
14467Does essentially the same, but uses @samp{telnet} instead of
14468@samp{rlogin} to connect to the intermediate host.
14469
14470@code{nntp-open-via-telnet-and-telnet}-specific variables:
14471
14472@table @code
14473@item nntp-via-telnet-command
14474@vindex nntp-via-telnet-command
14475Command used to @code{telnet} the intermediate host. The default is
14476@samp{telnet}.
14477
14478@item nntp-via-telnet-switches
14479@vindex nntp-via-telnet-switches
14480List of strings to be used as the switches to the
14481@code{nntp-via-telnet-command} command. The default is @samp{("-8")}.
14482
14483@item nntp-via-user-password
14484@vindex nntp-via-user-password
14485Password to use when logging in on the intermediate host.
14486
14487@item nntp-via-envuser
14488@vindex nntp-via-envuser
14489If non-@code{nil}, the intermediate @code{telnet} session (client and
14490server both) will support the @code{ENVIRON} option and not prompt for
14491login name. This works for Solaris @code{telnet}, for instance.
14492
14493@item nntp-via-shell-prompt
14494@vindex nntp-via-shell-prompt
14495Regexp matching the shell prompt on the intermediate host. The default
14496is @samp{bash\\|\$ *\r?$\\|> *\r?}.
14497
14498@end table
14499
01c52d31
MB
14500Note that you may want to change the value for @code{nntp-end-of-line}
14501to @samp{\n} (@pxref{Common Variables}).
4009494e
GM
14502@end table
14503
14504
14505Here are some additional variables that are understood by all the above
14506functions:
14507
14508@table @code
14509
14510@item nntp-via-user-name
14511@vindex nntp-via-user-name
14512User name to use when connecting to the intermediate host.
14513
14514@item nntp-via-address
14515@vindex nntp-via-address
14516Address of the intermediate host to connect to.
14517
14518@end table
14519
14520
14521@node Common Variables
14522@subsubsection Common Variables
14523
14524The following variables affect the behavior of all, or several of the
14525pre-made connection functions. When not specified, all functions are
14526affected (the values of the following variables will be used as the
14527default if each virtual @code{nntp} server doesn't specify those server
14528variables individually).
14529
14530@table @code
14531
14532@item nntp-pre-command
14533@vindex nntp-pre-command
14534A command wrapper to use when connecting through a non native
14535connection function (all except @code{nntp-open-network-stream},
14536@code{nntp-open-tls-stream}, and @code{nntp-open-ssl-stream}). This is
14537where you would put a @samp{SOCKS} wrapper for instance.
14538
14539@item nntp-address
14540@vindex nntp-address
14541The address of the @acronym{NNTP} server.
14542
14543@item nntp-port-number
14544@vindex nntp-port-number
14545Port number to connect to the @acronym{NNTP} server. The default is
14546@samp{nntp}. If you use @acronym{NNTP} over
14547@acronym{TLS}/@acronym{SSL}, you may want to use integer ports rather
14548than named ports (i.e, use @samp{563} instead of @samp{snews} or
14549@samp{nntps}), because external @acronym{TLS}/@acronym{SSL} tools may
14550not work with named ports.
14551
14552@item nntp-end-of-line
14553@vindex nntp-end-of-line
14554String to use as end-of-line marker when talking to the @acronym{NNTP}
14555server. This is @samp{\r\n} by default, but should be @samp{\n} when
01c52d31 14556using a non native telnet connection function.
4009494e 14557
990e2c2f
SM
14558@item nntp-netcat-command
14559@vindex nntp-netcat-command
4009494e 14560Command to use when connecting to the @acronym{NNTP} server through
31fe2b00 14561@samp{netcat}. This is @emph{not} for an intermediate host. This is
4009494e 14562just for the real @acronym{NNTP} server. The default is
31fe2b00 14563@samp{nc}.
4009494e 14564
990e2c2f
SM
14565@item nntp-netcat-switches
14566@vindex nntp-netcat-switches
14567A list of switches to pass to @code{nntp-netcat-command}. The default
31fe2b00 14568is @samp{()}.
4009494e
GM
14569
14570@end table
14571
01c52d31
MB
14572@node NNTP marks
14573@subsubsection NNTP marks
14574@cindex storing NNTP marks
14575
14576Gnus stores marks (@pxref{Marking Articles}) for @acronym{NNTP}
14577servers in marks files. A marks file records what marks you have set
14578in a group and each file is specific to the corresponding server.
14579Marks files are stored in @file{~/News/marks}
14580(@code{nntp-marks-directory}) under a classic hierarchy resembling
14581that of a news server, for example marks for the group
14582@samp{gmane.discuss} on the news.gmane.org server will be stored in
14583the file @file{~/News/marks/news.gmane.org/gmane/discuss/.marks}.
14584
14585Marks files are useful because you can copy the @file{~/News/marks}
14586directory (using rsync, scp or whatever) to another Gnus installation,
14587and it will realize what articles you have read and marked. The data
14588in @file{~/News/marks} has priority over the same data in
14589@file{~/.newsrc.eld}.
14590
14591Note that marks files are very much server-specific: Gnus remembers
14592the article numbers so if you don't use the same servers on both
14593installations things are most likely to break (most @acronym{NNTP}
14594servers do not use the same article numbers as any other server).
14595However, if you use servers A, B, C on one installation and servers A,
14596D, E on the other, you can sync the marks files for A and then you'll
14597get synchronization for that server between the two installations.
14598
14599Using @acronym{NNTP} marks can possibly incur a performance penalty so
14600if Gnus feels sluggish, try setting the @code{nntp-marks-is-evil}
14601variable to @code{t}. Marks will then be stored in @file{~/.newsrc.eld}.
14602
14603Related variables:
14604
14605@table @code
14606
14607@item nntp-marks-is-evil
14608@vindex nntp-marks-is-evil
14609If non-@code{nil}, this back end will ignore any marks files. The
14610default is @code{nil}.
14611
14612@item nntp-marks-directory
14613@vindex nntp-marks-directory
14614The directory where marks for nntp groups will be stored.
14615
14616@end table
14617
4009494e
GM
14618
14619@node News Spool
14620@subsection News Spool
14621@cindex nnspool
14622@cindex news spool
14623
14624Subscribing to a foreign group from the local spool is extremely easy,
14625and might be useful, for instance, to speed up reading groups that
14626contain very big articles---@samp{alt.binaries.pictures.furniture}, for
14627instance.
14628
14629Anyway, you just specify @code{nnspool} as the method and @code{""} (or
14630anything else) as the address.
14631
14632If you have access to a local spool, you should probably use that as the
14633native select method (@pxref{Finding the News}). It is normally faster
14634than using an @code{nntp} select method, but might not be. It depends.
14635You just have to try to find out what's best at your site.
14636
14637@table @code
14638
14639@item nnspool-inews-program
14640@vindex nnspool-inews-program
14641Program used to post an article.
14642
14643@item nnspool-inews-switches
14644@vindex nnspool-inews-switches
14645Parameters given to the inews program when posting an article.
14646
14647@item nnspool-spool-directory
14648@vindex nnspool-spool-directory
14649Where @code{nnspool} looks for the articles. This is normally
14650@file{/usr/spool/news/}.
14651
14652@item nnspool-nov-directory
14653@vindex nnspool-nov-directory
14654Where @code{nnspool} will look for @acronym{NOV} files. This is normally@*
14655@file{/usr/spool/news/over.view/}.
14656
14657@item nnspool-lib-dir
14658@vindex nnspool-lib-dir
14659Where the news lib dir is (@file{/usr/lib/news/} by default).
14660
14661@item nnspool-active-file
14662@vindex nnspool-active-file
14663The name of the active file.
14664
14665@item nnspool-newsgroups-file
14666@vindex nnspool-newsgroups-file
14667The name of the group descriptions file.
14668
14669@item nnspool-history-file
14670@vindex nnspool-history-file
14671The name of the news history file.
14672
14673@item nnspool-active-times-file
14674@vindex nnspool-active-times-file
14675The name of the active date file.
14676
14677@item nnspool-nov-is-evil
14678@vindex nnspool-nov-is-evil
14679If non-@code{nil}, @code{nnspool} won't try to use any @acronym{NOV} files
14680that it finds.
14681
14682@item nnspool-sift-nov-with-sed
14683@vindex nnspool-sift-nov-with-sed
14684@cindex sed
14685If non-@code{nil}, which is the default, use @code{sed} to get the
14686relevant portion from the overview file. If @code{nil},
14687@code{nnspool} will load the entire file into a buffer and process it
14688there.
14689
14690@end table
14691
14692
14693@node Getting Mail
14694@section Getting Mail
14695@cindex reading mail
14696@cindex mail
14697
14698Reading mail with a newsreader---isn't that just plain WeIrD? But of
14699course.
14700
14701@menu
14702* Mail in a Newsreader:: Important introductory notes.
14703* Getting Started Reading Mail:: A simple cookbook example.
14704* Splitting Mail:: How to create mail groups.
14705* Mail Sources:: How to tell Gnus where to get mail from.
14706* Mail Back End Variables:: Variables for customizing mail handling.
14707* Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.
14708* Group Mail Splitting:: Use group customize to drive mail splitting.
14709* Incorporating Old Mail:: What about the old mail you have?
14710* Expiring Mail:: Getting rid of unwanted mail.
14711* Washing Mail:: Removing cruft from the mail you get.
14712* Duplicates:: Dealing with duplicated mail.
14713* Not Reading Mail:: Using mail back ends for reading other files.
14714* Choosing a Mail Back End:: Gnus can read a variety of mail formats.
14715@end menu
14716
14717
14718@node Mail in a Newsreader
14719@subsection Mail in a Newsreader
14720
14721If you are used to traditional mail readers, but have decided to switch
14722to reading mail with Gnus, you may find yourself experiencing something
14723of a culture shock.
14724
14725Gnus does not behave like traditional mail readers. If you want to make
14726it behave that way, you can, but it's an uphill battle.
14727
14728Gnus, by default, handles all its groups using the same approach. This
14729approach is very newsreaderly---you enter a group, see the new/unread
14730messages, and when you read the messages, they get marked as read, and
14731you don't see them any more. (Unless you explicitly ask for them.)
14732
14733In particular, you do not do anything explicitly to delete messages.
14734
14735Does this mean that all the messages that have been marked as read are
14736deleted? How awful!
14737
14738But, no, it means that old messages are @dfn{expired} according to some
14739scheme or other. For news messages, the expire process is controlled by
14740the news administrator; for mail, the expire process is controlled by
14741you. The expire process for mail is covered in depth in @ref{Expiring
14742Mail}.
14743
14744What many Gnus users find, after using it a while for both news and
14745mail, is that the transport mechanism has very little to do with how
14746they want to treat a message.
14747
14748Many people subscribe to several mailing lists. These are transported
14749via @acronym{SMTP}, and are therefore mail. But we might go for weeks without
14750answering, or even reading these messages very carefully. We may not
14751need to save them because if we should need to read one again, they are
14752archived somewhere else.
14753
14754Some people have local news groups which have only a handful of readers.
14755These are transported via @acronym{NNTP}, and are therefore news. But we may need
14756to read and answer a large fraction of the messages very carefully in
14757order to do our work. And there may not be an archive, so we may need
14758to save the interesting messages the same way we would personal mail.
14759
14760The important distinction turns out to be not the transport mechanism,
14761but other factors such as how interested we are in the subject matter,
14762or how easy it is to retrieve the message if we need to read it again.
14763
14764Gnus provides many options for sorting mail into ``groups'' which behave
14765like newsgroups, and for treating each group (whether mail or news)
14766differently.
14767
14768Some users never get comfortable using the Gnus (ahem) paradigm and wish
14769that Gnus should grow up and be a male, er, mail reader. It is possible
14770to whip Gnus into a more mailreaderly being, but, as said before, it's
14771not easy. People who prefer proper mail readers should try @sc{vm}
14772instead, which is an excellent, and proper, mail reader.
14773
14774I don't mean to scare anybody off, but I want to make it clear that you
14775may be required to learn a new way of thinking about messages. After
14776you've been subjected to The Gnus Way, you will come to love it. I can
14777guarantee it. (At least the guy who sold me the Emacs Subliminal
14778Brain-Washing Functions that I've put into Gnus did guarantee it. You
14779Will Be Assimilated. You Love Gnus. You Love The Gnus Mail Way.
14780You Do.)
14781
14782
14783@node Getting Started Reading Mail
14784@subsection Getting Started Reading Mail
14785
14786It's quite easy to use Gnus to read your new mail. You just plonk the
14787mail back end of your choice into @code{gnus-secondary-select-methods},
14788and things will happen automatically.
14789
14790For instance, if you want to use @code{nnml} (which is a ``one file per
14791mail'' back end), you could put the following in your @file{~/.gnus.el} file:
14792
14793@lisp
14794(setq gnus-secondary-select-methods '((nnml "")))
14795@end lisp
14796
14797Now, the next time you start Gnus, this back end will be queried for new
14798articles, and it will move all the messages in your spool file to its
14799directory, which is @file{~/Mail/} by default. The new group that will
14800be created (@samp{mail.misc}) will be subscribed, and you can read it
14801like any other group.
14802
14803You will probably want to split the mail into several groups, though:
14804
14805@lisp
14806(setq nnmail-split-methods
14807 '(("junk" "^From:.*Lars Ingebrigtsen")
14808 ("crazy" "^Subject:.*die\\|^Organization:.*flabby")
14809 ("other" "")))
14810@end lisp
14811
14812This will result in three new @code{nnml} mail groups being created:
14813@samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}. All the
14814mail that doesn't fit into the first two groups will be placed in the
14815last group.
14816
14817This should be sufficient for reading mail with Gnus. You might want to
14818give the other sections in this part of the manual a perusal, though.
14819Especially @pxref{Choosing a Mail Back End} and @pxref{Expiring Mail}.
14820
14821
14822@node Splitting Mail
14823@subsection Splitting Mail
14824@cindex splitting mail
14825@cindex mail splitting
14826@cindex mail filtering (splitting)
14827
14828@vindex nnmail-split-methods
14829The @code{nnmail-split-methods} variable says how the incoming mail is
14830to be split into groups.
14831
14832@lisp
14833(setq nnmail-split-methods
14834 '(("mail.junk" "^From:.*Lars Ingebrigtsen")
14835 ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby")
14836 ("mail.other" "")))
14837@end lisp
14838
14839This variable is a list of lists, where the first element of each of
14840these lists is the name of the mail group (they do not have to be called
14841something beginning with @samp{mail}, by the way), and the second
14842element is a regular expression used on the header of each mail to
14843determine if it belongs in this mail group. The first string may
14844contain @samp{\\1} forms, like the ones used by @code{replace-match} to
14845insert sub-expressions from the matched text. For instance:
14846
14847@lisp
14848("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com")
14849@end lisp
14850
14851@noindent
14852In that case, @code{nnmail-split-lowercase-expanded} controls whether
14853the inserted text should be made lowercase. @xref{Fancy Mail Splitting}.
14854
14855The second element can also be a function. In that case, it will be
14856called narrowed to the headers with the first element of the rule as the
14857argument. It should return a non-@code{nil} value if it thinks that the
14858mail belongs in that group.
14859
14860@cindex @samp{bogus} group
14861The last of these groups should always be a general one, and the regular
14862expression should @emph{always} be @samp{""} so that it matches any mails
14863that haven't been matched by any of the other regexps. (These rules are
14864processed from the beginning of the alist toward the end. The first rule
14865to make a match will ``win'', unless you have crossposting enabled. In
14866that case, all matching rules will ``win''.) If no rule matched, the mail
14867will end up in the @samp{bogus} group. When new groups are created by
14868splitting mail, you may want to run @code{gnus-group-find-new-groups} to
14869see the new groups. This also applies to the @samp{bogus} group.
14870
14871If you like to tinker with this yourself, you can set this variable to a
14872function of your choice. This function will be called without any
14873arguments in a buffer narrowed to the headers of an incoming mail
14874message. The function should return a list of group names that it
14875thinks should carry this mail message.
14876
14877Note that the mail back ends are free to maul the poor, innocent,
14878incoming headers all they want to. They all add @code{Lines} headers;
14879some add @code{X-Gnus-Group} headers; most rename the Unix mbox
14880@code{From<SPACE>} line to something else.
14881
14882@vindex nnmail-crosspost
14883The mail back ends all support cross-posting. If several regexps match,
14884the mail will be ``cross-posted'' to all those groups.
14885@code{nnmail-crosspost} says whether to use this mechanism or not. Note
14886that no articles are crossposted to the general (@samp{""}) group.
14887
14888@vindex nnmail-crosspost-link-function
14889@cindex crosspost
14890@cindex links
14891@code{nnmh} and @code{nnml} makes crossposts by creating hard links to
14892the crossposted articles. However, not all file systems support hard
14893links. If that's the case for you, set
14894@code{nnmail-crosspost-link-function} to @code{copy-file}. (This
14895variable is @code{add-name-to-file} by default.)
14896
14897@kindex M-x nnmail-split-history
14898@findex nnmail-split-history
14899If you wish to see where the previous mail split put the messages, you
14900can use the @kbd{M-x nnmail-split-history} command. If you wish to see
14901where re-spooling messages would put the messages, you can use
14902@code{gnus-summary-respool-trace} and related commands (@pxref{Mail
14903Group Commands}).
14904
14905@vindex nnmail-split-header-length-limit
14906Header lines longer than the value of
14907@code{nnmail-split-header-length-limit} are excluded from the split
14908function.
14909
14910@vindex nnmail-mail-splitting-decodes
14911@vindex nnmail-mail-splitting-charset
14912By default, splitting does not decode headers, so you can not match on
14913non-@acronym{ASCII} strings. But it is useful if you want to match
14914articles based on the raw header data. To enable it, set the
14915@code{nnmail-mail-splitting-decodes} variable to a non-@code{nil} value.
14916In addition, the value of the @code{nnmail-mail-splitting-charset}
14917variable is used for decoding non-@acronym{MIME} encoded string when
14918@code{nnmail-mail-splitting-decodes} is non-@code{nil}. The default
14919value is @code{nil} which means not to decode non-@acronym{MIME} encoded
14920string. A suitable value for you will be @code{undecided} or be the
14921charset used normally in mails you are interested in.
14922
14923@vindex nnmail-resplit-incoming
14924By default, splitting is performed on all incoming messages. If you
14925specify a @code{directory} entry for the variable @code{mail-sources}
14926(@pxref{Mail Source Specifiers}), however, then splitting does
14927@emph{not} happen by default. You can set the variable
14928@code{nnmail-resplit-incoming} to a non-@code{nil} value to make
14929splitting happen even in this case. (This variable has no effect on
14930other kinds of entries.)
14931
14932Gnus gives you all the opportunity you could possibly want for shooting
14933yourself in the foot. Let's say you create a group that will contain
14934all the mail you get from your boss. And then you accidentally
14935unsubscribe from the group. Gnus will still put all the mail from your
14936boss in the unsubscribed group, and so, when your boss mails you ``Have
14937that report ready by Monday or you're fired!'', you'll never see it and,
14938come Tuesday, you'll still believe that you're gainfully employed while
14939you really should be out collecting empty bottles to save up for next
14940month's rent money.
14941
14942
14943@node Mail Sources
14944@subsection Mail Sources
14945
14946Mail can be gotten from many different sources---the mail spool, from
14947a @acronym{POP} mail server, from a procmail directory, or from a
14948maildir, for instance.
14949
14950@menu
14951* Mail Source Specifiers:: How to specify what a mail source is.
14952* Mail Source Customization:: Some variables that influence things.
14953* Fetching Mail:: Using the mail source specifiers.
14954@end menu
14955
14956
14957@node Mail Source Specifiers
14958@subsubsection Mail Source Specifiers
14959@cindex POP
14960@cindex mail server
14961@cindex procmail
14962@cindex mail spool
14963@cindex mail source
14964
14965You tell Gnus how to fetch mail by setting @code{mail-sources}
14966(@pxref{Fetching Mail}) to a @dfn{mail source specifier}.
14967
14968Here's an example:
14969
14970@lisp
14971(pop :server "pop3.mailserver.com" :user "myname")
14972@end lisp
14973
14974As can be observed, a mail source specifier is a list where the first
14975element is a @dfn{mail source type}, followed by an arbitrary number of
14976@dfn{keywords}. Keywords that are not explicitly specified are given
14977default values.
14978
a1da1e37
MB
14979The @code{mail-sources} is global for all mail groups. You can specify
14980an additional mail source for a particular group by including the
14981@code{group} mail specifier in @code{mail-sources}, and setting a
14982@code{mail-source} group parameter (@pxref{Group Parameters}) specifying
14983a single mail source. When this is used, @code{mail-sources} is
14984typically just @code{(group)}; the @code{mail-source} parameter for a
14985group might look like this:
14986
14987@lisp
14988(mail-source . (file :path "home/user/spools/foo.spool"))
14989@end lisp
14990
14991This means that the group's (and only this group's) messages will be
14992fetched from the spool file @samp{/user/spools/foo.spool}.
14993
4009494e
GM
14994The following mail source types are available:
14995
14996@table @code
14997@item file
14998Get mail from a single file; typically from the mail spool.
14999
15000Keywords:
15001
15002@table @code
15003@item :path
15004The file name. Defaults to the value of the @env{MAIL}
15005environment variable or the value of @code{rmail-spool-directory}
15006(usually something like @file{/usr/mail/spool/user-name}).
15007
15008@item :prescript
15009@itemx :postscript
15010Script run before/after fetching mail.
15011@end table
15012
15013An example file mail source:
15014
15015@lisp
15016(file :path "/usr/spool/mail/user-name")
15017@end lisp
15018
15019Or using the default file name:
15020
15021@lisp
15022(file)
15023@end lisp
15024
15025If the mail spool file is not located on the local machine, it's best
15026to use @acronym{POP} or @acronym{IMAP} or the like to fetch the mail.
15027You can not use ange-ftp file names here---it has no way to lock the
15028mail spool while moving the mail.
15029
15030If it's impossible to set up a proper server, you can use ssh instead.
15031
15032@lisp
15033(setq mail-sources
15034 '((file :prescript "ssh host bin/getmail >%t")))
15035@end lisp
15036
15037The @samp{getmail} script would look something like the following:
15038
15039@example
15040#!/bin/sh
15041# getmail - move mail from spool to stdout
15042# flu@@iki.fi
15043
15044MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail
15045TMP=$HOME/Mail/tmp
15046rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP
15047@end example
15048
15049Alter this script to fit the @samp{movemail} and temporary
15050file you want to use.
15051
15052
15053@item directory
15054@vindex nnmail-scan-directory-mail-source-once
15055Get mail from several files in a directory. This is typically used
15056when you have procmail split the incoming mail into several files.
15057That is, there is a one-to-one correspondence between files in that
15058directory and groups, so that mail from the file @file{foo.bar.spool}
15059will be put in the group @code{foo.bar}. (You can change the suffix
15060to be used instead of @code{.spool}.) Setting
15061@code{nnmail-scan-directory-mail-source-once} to non-@code{nil} forces
15062Gnus to scan the mail source only once. This is particularly useful
15063if you want to scan mail groups at a specified level.
15064
15065@vindex nnmail-resplit-incoming
15066There is also the variable @code{nnmail-resplit-incoming}, if you set
15067that to a non-@code{nil} value, then the normal splitting process is
15068applied to all the files from the directory, @ref{Splitting Mail}.
15069
15070Keywords:
15071
15072@table @code
15073@item :path
15074The name of the directory where the files are. There is no default
15075value.
15076
15077@item :suffix
15078Only files ending with this suffix are used. The default is
15079@samp{.spool}.
15080
15081@item :predicate
15082Only files that have this predicate return non-@code{nil} are returned.
15083The default is @code{identity}. This is used as an additional
15084filter---only files that have the right suffix @emph{and} satisfy this
15085predicate are considered.
15086
15087@item :prescript
15088@itemx :postscript
15089Script run before/after fetching mail.
15090
15091@end table
15092
15093An example directory mail source:
15094
15095@lisp
15096(directory :path "/home/user-name/procmail-dir/"
15097 :suffix ".prcml")
15098@end lisp
15099
15100@item pop
15101Get mail from a @acronym{POP} server.
15102
15103Keywords:
15104
15105@table @code
15106@item :server
15107The name of the @acronym{POP} server. The default is taken from the
15108@env{MAILHOST} environment variable.
15109
15110@item :port
15111The port number of the @acronym{POP} server. This can be a number (eg,
15112@samp{:port 1234}) or a string (eg, @samp{:port "pop3"}). If it is a
15113string, it should be a service name as listed in @file{/etc/services} on
15114Unix systems. The default is @samp{"pop3"}. On some systems you might
15115need to specify it as @samp{"pop-3"} instead.
15116
15117@item :user
15118The user name to give to the @acronym{POP} server. The default is the login
15119name.
15120
15121@item :password
15122The password to give to the @acronym{POP} server. If not specified,
15123the user is prompted.
15124
15125@item :program
15126The program to use to fetch mail from the @acronym{POP} server. This
15127should be a @code{format}-like string. Here's an example:
15128
15129@example
15130fetchmail %u@@%s -P %p %t
15131@end example
15132
15133The valid format specifier characters are:
15134
15135@table @samp
15136@item t
15137The name of the file the mail is to be moved to. This must always be
15138included in this string.
15139
15140@item s
15141The name of the server.
15142
15143@item P
15144The port number of the server.
15145
15146@item u
15147The user name to use.
15148
15149@item p
15150The password to use.
15151@end table
15152
15153The values used for these specs are taken from the values you give the
15154corresponding keywords.
15155
15156@item :prescript
15157A script to be run before fetching the mail. The syntax is the same as
15158the @code{:program} keyword. This can also be a function to be run.
15159
15160@item :postscript
15161A script to be run after fetching the mail. The syntax is the same as
15162the @code{:program} keyword. This can also be a function to be run.
15163
15164@item :function
15165The function to use to fetch mail from the @acronym{POP} server. The
15166function is called with one parameter---the name of the file where the
15167mail should be moved to.
15168
15169@item :authentication
15170This can be either the symbol @code{password} or the symbol @code{apop}
15171and says what authentication scheme to use. The default is
15172@code{password}.
15173
15174@end table
15175
15176@vindex pop3-movemail
15177@vindex pop3-leave-mail-on-server
15178If the @code{:program} and @code{:function} keywords aren't specified,
15179@code{pop3-movemail} will be used. If @code{pop3-leave-mail-on-server}
15180is non-@code{nil} the mail is to be left on the @acronym{POP} server
15181after fetching when using @code{pop3-movemail}. Note that POP servers
15182maintain no state information between sessions, so what the client
15183believes is there and what is actually there may not match up. If they
15184do not, then you may get duplicate mails or the whole thing can fall
15185apart and leave you with a corrupt mailbox.
15186
15187Here are some examples for getting mail from a @acronym{POP} server.
15188Fetch from the default @acronym{POP} server, using the default user
15189name, and default fetcher:
15190
15191@lisp
15192(pop)
15193@end lisp
15194
15195Fetch from a named server with a named user and password:
15196
15197@lisp
15198(pop :server "my.pop.server"
15199 :user "user-name" :password "secret")
15200@end lisp
15201
15202Use @samp{movemail} to move the mail:
15203
15204@lisp
15205(pop :program "movemail po:%u %t %p")
15206@end lisp
15207
15208@item maildir
15209Get mail from a maildir. This is a type of mailbox that is supported by
15210at least qmail and postfix, where each file in a special directory
15211contains exactly one mail.
15212
15213Keywords:
15214
15215@table @code
15216@item :path
15217The name of the directory where the mails are stored. The default is
15218taken from the @env{MAILDIR} environment variable or
15219@file{~/Maildir/}.
15220@item :subdirs
15221The subdirectories of the Maildir. The default is
15222@samp{("new" "cur")}.
15223
15224@c If you sometimes look at your mail through a pop3 daemon before fetching
15225@c them with Gnus, you may also have to fetch your mails from the
15226@c @code{cur} directory inside the maildir, like in the first example
15227@c below.
15228
15229You can also get mails from remote hosts (because maildirs don't suffer
15230from locking problems).
15231
15232@end table
15233
15234Two example maildir mail sources:
15235
15236@lisp
15237(maildir :path "/home/user-name/Maildir/"
15238 :subdirs ("cur" "new"))
15239@end lisp
15240
15241@lisp
15242(maildir :path "/user@@remotehost.org:~/Maildir/"
15243 :subdirs ("new"))
15244@end lisp
15245
15246@item imap
15247Get mail from a @acronym{IMAP} server. If you don't want to use
15248@acronym{IMAP} as intended, as a network mail reading protocol (ie
15249with nnimap), for some reason or other, Gnus let you treat it similar
15250to a @acronym{POP} server and fetches articles from a given
15251@acronym{IMAP} mailbox. @xref{IMAP}, for more information.
15252
15253Note that for the Kerberos, GSSAPI, @acronym{TLS}/@acronym{SSL} and STARTTLS support you
15254may need external programs and libraries, @xref{IMAP}.
15255
15256Keywords:
15257
15258@table @code
15259@item :server
15260The name of the @acronym{IMAP} server. The default is taken from the
15261@env{MAILHOST} environment variable.
15262
15263@item :port
15264The port number of the @acronym{IMAP} server. The default is @samp{143}, or
15265@samp{993} for @acronym{TLS}/@acronym{SSL} connections.
15266
15267@item :user
15268The user name to give to the @acronym{IMAP} server. The default is the login
15269name.
15270
15271@item :password
15272The password to give to the @acronym{IMAP} server. If not specified, the user is
15273prompted.
15274
15275@item :stream
15276What stream to use for connecting to the server, this is one of the
15277symbols in @code{imap-stream-alist}. Right now, this means
15278@samp{gssapi}, @samp{kerberos4}, @samp{starttls}, @samp{tls},
15279@samp{ssl}, @samp{shell} or the default @samp{network}.
15280
15281@item :authentication
15282Which authenticator to use for authenticating to the server, this is
15283one of the symbols in @code{imap-authenticator-alist}. Right now,
15284this means @samp{gssapi}, @samp{kerberos4}, @samp{digest-md5},
15285@samp{cram-md5}, @samp{anonymous} or the default @samp{login}.
15286
15287@item :program
15288When using the `shell' :stream, the contents of this variable is
15289mapped into the @code{imap-shell-program} variable. This should be a
15290@code{format}-like string (or list of strings). Here's an example:
15291
15292@example
15293ssh %s imapd
15294@end example
15295
01c52d31
MB
15296Make sure nothing is interfering with the output of the program, e.g.,
15297don't forget to redirect the error output to the void. The valid format
15298specifier characters are:
4009494e
GM
15299
15300@table @samp
15301@item s
15302The name of the server.
15303
15304@item l
15305User name from @code{imap-default-user}.
15306
15307@item p
15308The port number of the server.
15309@end table
15310
15311The values used for these specs are taken from the values you give the
15312corresponding keywords.
15313
15314@item :mailbox
15315The name of the mailbox to get mail from. The default is @samp{INBOX}
d55fe5bb 15316which normally is the mailbox which receives incoming mail.
4009494e
GM
15317
15318@item :predicate
15319The predicate used to find articles to fetch. The default, @samp{UNSEEN
15320UNDELETED}, is probably the best choice for most people, but if you
15321sometimes peek in your mailbox with a @acronym{IMAP} client and mark some
15322articles as read (or; SEEN) you might want to set this to @samp{1:*}.
15323Then all articles in the mailbox is fetched, no matter what. For a
15324complete list of predicates, see RFC 2060 section 6.4.4.
15325
15326@item :fetchflag
15327How to flag fetched articles on the server, the default @samp{\Deleted}
15328will mark them as deleted, an alternative would be @samp{\Seen} which
15329would simply mark them as read. These are the two most likely choices,
15330but more flags are defined in RFC 2060 section 2.3.2.
15331
15332@item :dontexpunge
15333If non-@code{nil}, don't remove all articles marked as deleted in the
15334mailbox after finishing the fetch.
15335
15336@end table
15337
15338An example @acronym{IMAP} mail source:
15339
15340@lisp
15341(imap :server "mail.mycorp.com"
15342 :stream kerberos4
15343 :fetchflag "\\Seen")
15344@end lisp
15345
15346@item webmail
15347Get mail from a webmail server, such as @uref{http://www.hotmail.com/},
15348@uref{http://webmail.netscape.com/}, @uref{http://www.netaddress.com/},
15349@uref{http://mail.yahoo.com/}.
15350
15351NOTE: Webmail largely depends on cookies. A "one-line-cookie" patch is
15352required for url "4.0pre.46".
15353
15354WARNING: Mails may be lost. NO WARRANTY.
15355
15356Keywords:
15357
15358@table @code
15359@item :subtype
15360The type of the webmail server. The default is @code{hotmail}. The
15361alternatives are @code{netscape}, @code{netaddress}, @code{my-deja}.
15362
15363@item :user
15364The user name to give to the webmail server. The default is the login
15365name.
15366
15367@item :password
15368The password to give to the webmail server. If not specified, the user is
15369prompted.
15370
15371@item :dontexpunge
15372If non-@code{nil}, only fetch unread articles and don't move them to
15373trash folder after finishing the fetch.
15374
15375@end table
15376
15377An example webmail source:
15378
15379@lisp
15380(webmail :subtype 'hotmail
15381 :user "user-name"
15382 :password "secret")
15383@end lisp
a1da1e37
MB
15384
15385@item group
15386Get the actual mail source from the @code{mail-source} group parameter,
15387@xref{Group Parameters}.
15388
4009494e
GM
15389@end table
15390
15391@table @dfn
15392@item Common Keywords
15393Common keywords can be used in any type of mail source.
15394
15395Keywords:
15396
15397@table @code
15398@item :plugged
15399If non-@code{nil}, fetch the mail even when Gnus is unplugged. If you
15400use directory source to get mail, you can specify it as in this
15401example:
15402
15403@lisp
15404(setq mail-sources
15405 '((directory :path "/home/pavel/.Spool/"
15406 :suffix ""
15407 :plugged t)))
15408@end lisp
15409
15410Gnus will then fetch your mail even when you are unplugged. This is
15411useful when you use local mail and news.
15412
15413@end table
15414@end table
15415
15416@subsubsection Function Interface
15417
15418Some of the above keywords specify a Lisp function to be executed.
15419For each keyword @code{:foo}, the Lisp variable @code{foo} is bound to
15420the value of the keyword while the function is executing. For example,
15421consider the following mail-source setting:
15422
15423@lisp
15424(setq mail-sources '((pop :user "jrl"
15425 :server "pophost" :function fetchfunc)))
15426@end lisp
15427
15428While the function @code{fetchfunc} is executing, the symbol @code{user}
15429is bound to @code{"jrl"}, and the symbol @code{server} is bound to
15430@code{"pophost"}. The symbols @code{port}, @code{password},
15431@code{program}, @code{prescript}, @code{postscript}, @code{function},
15432and @code{authentication} are also bound (to their default values).
15433
15434See above for a list of keywords for each type of mail source.
15435
15436
15437@node Mail Source Customization
15438@subsubsection Mail Source Customization
15439
15440The following is a list of variables that influence how the mail is
15441fetched. You would normally not need to set or change any of these
15442variables.
15443
15444@table @code
15445@item mail-source-crash-box
15446@vindex mail-source-crash-box
15447File where mail will be stored while processing it. The default is@*
15448@file{~/.emacs-mail-crash-box}.
15449
37a68866 15450@cindex Incoming*
4009494e
GM
15451@item mail-source-delete-incoming
15452@vindex mail-source-delete-incoming
15453If non-@code{nil}, delete incoming files after handling them. If
15454@code{t}, delete the files immediately, if @code{nil}, never delete any
15455files. If a positive number, delete files older than number of days
37a68866
MB
15456(the deletion will only happen when receiving new mail). You may also
15457set @code{mail-source-delete-incoming} to @code{nil} and call
4009494e 15458@code{mail-source-delete-old-incoming} from a hook or interactively.
2b968687
MB
15459@code{mail-source-delete-incoming} defaults to @code{10} in alpha Gnusae
15460and @code{2} in released Gnusae. @xref{Gnus Development}.
4009494e
GM
15461
15462@item mail-source-delete-old-incoming-confirm
15463@vindex mail-source-delete-old-incoming-confirm
15464If non-@code{nil}, ask for confirmation before deleting old incoming
15465files. This variable only applies when
15466@code{mail-source-delete-incoming} is a positive number.
15467
15468@item mail-source-ignore-errors
15469@vindex mail-source-ignore-errors
15470If non-@code{nil}, ignore errors when reading mail from a mail source.
15471
15472@item mail-source-directory
15473@vindex mail-source-directory
15474Directory where incoming mail source files (if any) will be stored. The
15475default is @file{~/Mail/}. At present, the only thing this is used for
15476is to say where the incoming files will be stored if the variable
15477@code{mail-source-delete-incoming} is @code{nil} or a number.
15478
15479@item mail-source-incoming-file-prefix
15480@vindex mail-source-incoming-file-prefix
15481Prefix for file name for storing incoming mail. The default is
15482@file{Incoming}, in which case files will end up with names like
15483@file{Incoming30630D_} or @file{Incoming298602ZD}. This is really only
15484relevant if @code{mail-source-delete-incoming} is @code{nil} or a
15485number.
15486
15487@item mail-source-default-file-modes
15488@vindex mail-source-default-file-modes
15489All new mail files will get this file mode. The default is 384.
15490
15491@item mail-source-movemail-program
15492@vindex mail-source-movemail-program
15493If non-@code{nil}, name of program for fetching new mail. If
15494@code{nil}, @code{movemail} in @var{exec-directory}.
15495
15496@end table
15497
15498
15499@node Fetching Mail
15500@subsubsection Fetching Mail
15501
15502@vindex mail-sources
4009494e
GM
15503The way to actually tell Gnus where to get new mail from is to set
15504@code{mail-sources} to a list of mail source specifiers
15505(@pxref{Mail Source Specifiers}).
15506
b890d447
MB
15507If this variable is @code{nil}, the mail back ends will never attempt to
15508fetch mail by themselves.
4009494e
GM
15509
15510If you want to fetch mail both from your local spool as well as a
15511@acronym{POP} mail server, you'd say something like:
15512
15513@lisp
15514(setq mail-sources
15515 '((file)
15516 (pop :server "pop3.mail.server"
15517 :password "secret")))
15518@end lisp
15519
15520Or, if you don't want to use any of the keyword defaults:
15521
15522@lisp
15523(setq mail-sources
15524 '((file :path "/var/spool/mail/user-name")
15525 (pop :server "pop3.mail.server"
15526 :user "user-name"
15527 :port "pop3"
15528 :password "secret")))
15529@end lisp
15530
15531
15532When you use a mail back end, Gnus will slurp all your mail from your
15533inbox and plonk it down in your home directory. Gnus doesn't move any
15534mail if you're not using a mail back end---you have to do a lot of magic
15535invocations first. At the time when you have finished drawing the
15536pentagram, lightened the candles, and sacrificed the goat, you really
15537shouldn't be too surprised when Gnus moves your mail.
15538
15539
15540
15541@node Mail Back End Variables
15542@subsection Mail Back End Variables
15543
15544These variables are (for the most part) pertinent to all the various
15545mail back ends.
15546
15547@table @code
15548@vindex nnmail-read-incoming-hook
15549@item nnmail-read-incoming-hook
15550The mail back ends all call this hook after reading new mail. You can
15551use this hook to notify any mail watch programs, if you want to.
15552
15553@vindex nnmail-split-hook
15554@item nnmail-split-hook
15555@findex gnus-article-decode-encoded-words
15556@cindex RFC 1522 decoding
15557@cindex RFC 2047 decoding
15558Hook run in the buffer where the mail headers of each message is kept
15559just before the splitting based on these headers is done. The hook is
15560free to modify the buffer contents in any way it sees fit---the buffer
15561is discarded after the splitting has been done, and no changes performed
15562in the buffer will show up in any files.
15563@code{gnus-article-decode-encoded-words} is one likely function to add
15564to this hook.
15565
15566@vindex nnmail-pre-get-new-mail-hook
15567@vindex nnmail-post-get-new-mail-hook
15568@item nnmail-pre-get-new-mail-hook
15569@itemx nnmail-post-get-new-mail-hook
15570These are two useful hooks executed when treating new incoming
15571mail---@code{nnmail-pre-get-new-mail-hook} (is called just before
15572starting to handle the new mail) and
15573@code{nnmail-post-get-new-mail-hook} (is called when the mail handling
15574is done). Here's and example of using these two hooks to change the
15575default file modes the new mail files get:
15576
15577@lisp
15578(add-hook 'nnmail-pre-get-new-mail-hook
15579 (lambda () (set-default-file-modes 511)))
15580
15581(add-hook 'nnmail-post-get-new-mail-hook
15582 (lambda () (set-default-file-modes 551)))
15583@end lisp
15584
15585@item nnmail-use-long-file-names
15586@vindex nnmail-use-long-file-names
15587If non-@code{nil}, the mail back ends will use long file and directory
15588names. Groups like @samp{mail.misc} will end up in directories
15589(assuming use of @code{nnml} back end) or files (assuming use of
15590@code{nnfolder} back end) like @file{mail.misc}. If it is @code{nil},
15591the same group will end up in @file{mail/misc}.
15592
15593@item nnmail-delete-file-function
15594@vindex nnmail-delete-file-function
15595@findex delete-file
15596Function called to delete files. It is @code{delete-file} by default.
15597
15598@item nnmail-cache-accepted-message-ids
15599@vindex nnmail-cache-accepted-message-ids
15600If non-@code{nil}, put the @code{Message-ID}s of articles imported into
15601the back end (via @code{Gcc}, for instance) into the mail duplication
15602discovery cache. The default is @code{nil}.
15603
15604@item nnmail-cache-ignore-groups
15605@vindex nnmail-cache-ignore-groups
15606This can be a regular expression or a list of regular expressions.
15607Group names that match any of the regular expressions will never be
15608recorded in the @code{Message-ID} cache.
15609
15610This can be useful, for example, when using Fancy Splitting
15611(@pxref{Fancy Mail Splitting}) together with the function
15612@code{nnmail-split-fancy-with-parent}.
15613
15614@end table
15615
15616
15617@node Fancy Mail Splitting
15618@subsection Fancy Mail Splitting
15619@cindex mail splitting
15620@cindex fancy mail splitting
15621
15622@vindex nnmail-split-fancy
15623@findex nnmail-split-fancy
15624If the rather simple, standard method for specifying how to split mail
15625doesn't allow you to do what you want, you can set
15626@code{nnmail-split-methods} to @code{nnmail-split-fancy}. Then you can
15627play with the @code{nnmail-split-fancy} variable.
15628
15629Let's look at an example value of this variable first:
15630
15631@lisp
15632;; @r{Messages from the mailer daemon are not crossposted to any of}
15633;; @r{the ordinary groups. Warnings are put in a separate group}
15634;; @r{from real errors.}
15635(| ("from" mail (| ("subject" "warn.*" "mail.warning")
15636 "mail.misc"))
15637 ;; @r{Non-error messages are crossposted to all relevant}
15638 ;; @r{groups, but we don't crosspost between the group for the}
15639 ;; @r{(ding) list and the group for other (ding) related mail.}
15640 (& (| (any "ding@@ifi\\.uio\\.no" "ding.list")
15641 ("subject" "ding" "ding.misc"))
15642 ;; @r{Other mailing lists@dots{}}
15643 (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list")
15644 (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list")
15645 ;; @r{Both lists below have the same suffix, so prevent}
15646 ;; @r{cross-posting to mkpkg.list of messages posted only to}
15647 ;; @r{the bugs- list, but allow cross-posting when the}
15648 ;; @r{message was really cross-posted.}
15649 (any "bugs-mypackage@@somewhere" "mypkg.bugs")
15650 (any "mypackage@@somewhere" - "bugs-mypackage" "mypkg.list")
15651 ;; @r{People@dots{}}
15652 (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen"))
15653 ;; @r{Unmatched mail goes to the catch all group.}
15654 "misc.misc")
15655@end lisp
15656
15657This variable has the format of a @dfn{split}. A split is a
15658(possibly) recursive structure where each split may contain other
15659splits. Here are the possible split syntaxes:
15660
15661@table @code
15662
15663@item group
15664If the split is a string, that will be taken as a group name. Normal
15665regexp match expansion will be done. See below for examples.
15666
15667@c Don't fold this line.
15668@item (@var{field} @var{value} [- @var{restrict} [@dots{}] ] @var{split} [@var{invert-partial}])
15669The split can be a list containing at least three elements. If the
15670first element @var{field} (a regexp matching a header) contains
15671@var{value} (also a regexp) then store the message as specified by
15672@var{split}.
15673
15674If @var{restrict} (yet another regexp) matches some string after
15675@var{field} and before the end of the matched @var{value}, the
15676@var{split} is ignored. If none of the @var{restrict} clauses match,
15677@var{split} is processed.
15678
15679The last element @var{invert-partial} is optional. If it is
15680non-@code{nil}, the match-partial-words behavior controlled by the
15681variable @code{nnmail-split-fancy-match-partial-words} (see below) is
15682be inverted. (New in Gnus 5.10.7)
15683
15684@item (| @var{split} @dots{})
15685If the split is a list, and the first element is @code{|} (vertical
15686bar), then process each @var{split} until one of them matches. A
15687@var{split} is said to match if it will cause the mail message to be
15688stored in one or more groups.
15689
15690@item (& @var{split} @dots{})
15691If the split is a list, and the first element is @code{&}, then
15692process all @var{split}s in the list.
15693
15694@item junk
15695If the split is the symbol @code{junk}, then don't save (i.e., delete)
15696this message. Use with extreme caution.
15697
15698@item (: @var{function} @var{arg1} @var{arg2} @dots{})
15699If the split is a list, and the first element is @samp{:}, then the
15700second element will be called as a function with @var{args} given as
15701arguments. The function should return a @var{split}.
15702
15703@cindex body split
15704For instance, the following function could be used to split based on the
15705body of the messages:
15706
15707@lisp
15708(defun split-on-body ()
15709 (save-excursion
15710 (save-restriction
15711 (widen)
15712 (goto-char (point-min))
15713 (when (re-search-forward "Some.*string" nil t)
15714 "string.group"))))
15715@end lisp
15716
b890d447
MB
15717The buffer is narrowed to the header of the message in question when
15718@var{function} is run. That's why @code{(widen)} needs to be called
15719after @code{save-excursion} and @code{save-restriction} in the example
23f87bed 15720above. Also note that with the nnimap backend, message bodies will
4009494e
GM
15721not be downloaded by default. You need to set
15722@code{nnimap-split-download-body} to @code{t} to do that
15723(@pxref{Splitting in IMAP}).
15724
15725@item (! @var{func} @var{split})
15726If the split is a list, and the first element is @code{!}, then
15727@var{split} will be processed, and @var{func} will be called as a
15728function with the result of @var{split} as argument. @var{func}
15729should return a split.
15730
15731@item nil
15732If the split is @code{nil}, it is ignored.
15733
15734@end table
15735
15736In these splits, @var{field} must match a complete field name.
15737
15738Normally, @var{value} in these splits must match a complete @emph{word}
15739according to the fundamental mode syntax table. In other words, all
15740@var{value}'s will be implicitly surrounded by @code{\<...\>} markers,
15741which are word delimiters. Therefore, if you use the following split,
15742for example,
15743
15744@example
15745(any "joe" "joemail")
15746@end example
15747
15748@noindent
15749messages sent from @samp{joedavis@@foo.org} will normally not be filed
15750in @samp{joemail}. If you want to alter this behavior, you can use any
15751of the following three ways:
15752
15753@enumerate
15754@item
15755@vindex nnmail-split-fancy-match-partial-words
15756You can set the @code{nnmail-split-fancy-match-partial-words} variable
15757to non-@code{nil} in order to ignore word boundaries and instead the
15758match becomes more like a grep. This variable controls whether partial
15759words are matched during fancy splitting. The default value is
15760@code{nil}.
15761
15762Note that it influences all @var{value}'s in your split rules.
15763
15764@item
15765@var{value} beginning with @code{.*} ignores word boundaries in front of
15766a word. Similarly, if @var{value} ends with @code{.*}, word boundaries
15767in the rear of a word will be ignored. For example, the @var{value}
15768@code{"@@example\\.com"} does not match @samp{foo@@example.com} but
15769@code{".*@@example\\.com"} does.
15770
15771@item
15772You can set the @var{invert-partial} flag in your split rules of the
15773@samp{(@var{field} @var{value} @dots{})} types, aforementioned in this
15774section. If the flag is set, word boundaries on both sides of a word
15775are ignored even if @code{nnmail-split-fancy-match-partial-words} is
15776@code{nil}. Contrarily, if the flag is set, word boundaries are not
15777ignored even if @code{nnmail-split-fancy-match-partial-words} is
15778non-@code{nil}. (New in Gnus 5.10.7)
15779@end enumerate
15780
15781@vindex nnmail-split-abbrev-alist
15782@var{field} and @var{value} can also be Lisp symbols, in that case
15783they are expanded as specified by the variable
15784@code{nnmail-split-abbrev-alist}. This is an alist of cons cells,
15785where the @sc{car} of a cell contains the key, and the @sc{cdr}
15786contains the associated value. Predefined entries in
15787@code{nnmail-split-abbrev-alist} include:
15788
15789@table @code
15790@item from
15791Matches the @samp{From}, @samp{Sender} and @samp{Resent-From} fields.
15792@item to
15793Matches the @samp{To}, @samp{Cc}, @samp{Apparently-To},
15794@samp{Resent-To} and @samp{Resent-Cc} fields.
15795@item any
15796Is the union of the @code{from} and @code{to} entries.
15797@end table
15798
15799@vindex nnmail-split-fancy-syntax-table
15800@code{nnmail-split-fancy-syntax-table} is the syntax table in effect
15801when all this splitting is performed.
15802
15803If you want to have Gnus create groups dynamically based on some
15804information in the headers (i.e., do @code{replace-match}-like
15805substitutions in the group names), you can say things like:
15806
15807@example
15808(any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1")
15809@end example
15810
15811In this example, messages sent to @samp{debian-foo@@lists.debian.org}
15812will be filed in @samp{mail.debian.foo}.
15813
15814If the string contains the element @samp{\&}, then the previously
15815matched string will be substituted. Similarly, the elements @samp{\\1}
15816up to @samp{\\9} will be substituted with the text matched by the
15817groupings 1 through 9.
15818
15819@vindex nnmail-split-lowercase-expanded
15820Where @code{nnmail-split-lowercase-expanded} controls whether the
15821lowercase of the matched string should be used for the substitution.
15822Setting it as non-@code{nil} is useful to avoid the creation of multiple
15823groups when users send to an address using different case
15824(i.e. mailing-list@@domain vs Mailing-List@@Domain). The default value
15825is @code{t}.
15826
15827@findex nnmail-split-fancy-with-parent
15828@code{nnmail-split-fancy-with-parent} is a function which allows you to
15829split followups into the same groups their parents are in. Sometimes
15830you can't make splitting rules for all your mail. For example, your
15831boss might send you personal mail regarding different projects you are
15832working on, and as you can't tell your boss to put a distinguishing
15833string into the subject line, you have to resort to manually moving the
15834messages into the right group. With this function, you only have to do
15835it once per thread.
15836
15837To use this feature, you have to set @code{nnmail-treat-duplicates}
15838and @code{nnmail-cache-accepted-message-ids} to a non-@code{nil}
15839value. And then you can include @code{nnmail-split-fancy-with-parent}
15840using the colon feature, like so:
15841@lisp
15842(setq nnmail-treat-duplicates 'warn ; @r{or @code{delete}}
15843 nnmail-cache-accepted-message-ids t
15844 nnmail-split-fancy
15845 '(| (: nnmail-split-fancy-with-parent)
15846 ;; @r{other splits go here}
15847 ))
15848@end lisp
15849
15850This feature works as follows: when @code{nnmail-treat-duplicates} is
15851non-@code{nil}, Gnus records the message id of every message it sees
15852in the file specified by the variable
15853@code{nnmail-message-id-cache-file}, together with the group it is in
15854(the group is omitted for non-mail messages). When mail splitting is
15855invoked, the function @code{nnmail-split-fancy-with-parent} then looks
15856at the References (and In-Reply-To) header of each message to split
15857and searches the file specified by @code{nnmail-message-id-cache-file}
15858for the message ids. When it has found a parent, it returns the
15859corresponding group name unless the group name matches the regexp
15860@code{nnmail-split-fancy-with-parent-ignore-groups}. It is
15861recommended that you set @code{nnmail-message-id-cache-length} to a
15862somewhat higher number than the default so that the message ids are
15863still in the cache. (A value of 5000 appears to create a file some
15864300 kBytes in size.)
15865@vindex nnmail-cache-accepted-message-ids
15866When @code{nnmail-cache-accepted-message-ids} is non-@code{nil}, Gnus
15867also records the message ids of moved articles, so that the followup
15868messages goes into the new group.
15869
15870Also see the variable @code{nnmail-cache-ignore-groups} if you don't
15871want certain groups to be recorded in the cache. For example, if all
15872outgoing messages are written to an ``outgoing'' group, you could set
15873@code{nnmail-cache-ignore-groups} to match that group name.
15874Otherwise, answers to all your messages would end up in the
15875``outgoing'' group.
15876
15877
15878@node Group Mail Splitting
15879@subsection Group Mail Splitting
15880@cindex mail splitting
15881@cindex group mail splitting
15882
15883@findex gnus-group-split
15884If you subscribe to dozens of mailing lists but you don't want to
15885maintain mail splitting rules manually, group mail splitting is for you.
15886You just have to set @code{to-list} and/or @code{to-address} in group
15887parameters or group customization and set @code{nnmail-split-methods} to
15888@code{gnus-group-split}. This splitting function will scan all groups
15889for those parameters and split mail accordingly, i.e., messages posted
15890from or to the addresses specified in the parameters @code{to-list} or
15891@code{to-address} of a mail group will be stored in that group.
15892
15893Sometimes, mailing lists have multiple addresses, and you may want mail
15894splitting to recognize them all: just set the @code{extra-aliases} group
15895parameter to the list of additional addresses and it's done. If you'd
15896rather use a regular expression, set @code{split-regexp}.
15897
15898All these parameters in a group will be used to create an
15899@code{nnmail-split-fancy} split, in which the @var{field} is @samp{any},
15900the @var{value} is a single regular expression that matches
15901@code{to-list}, @code{to-address}, all of @code{extra-aliases} and all
15902matches of @code{split-regexp}, and the @var{split} is the name of the
15903group. @var{restrict}s are also supported: just set the
15904@code{split-exclude} parameter to a list of regular expressions.
15905
15906If you can't get the right split to be generated using all these
15907parameters, or you just need something fancier, you can set the
15908parameter @code{split-spec} to an @code{nnmail-split-fancy} split. In
15909this case, all other aforementioned parameters will be ignored by
15910@code{gnus-group-split}. In particular, @code{split-spec} may be set to
15911@code{nil}, in which case the group will be ignored by
15912@code{gnus-group-split}.
15913
15914@vindex gnus-group-split-default-catch-all-group
15915@code{gnus-group-split} will do cross-posting on all groups that match,
15916by defining a single @code{&} fancy split containing one split for each
15917group. If a message doesn't match any split, it will be stored in the
15918group named in @code{gnus-group-split-default-catch-all-group}, unless
15919some group has @code{split-spec} set to @code{catch-all}, in which case
15920that group is used as the catch-all group. Even though this variable is
15921often used just to name a group, it may also be set to an arbitrarily
15922complex fancy split (after all, a group name is a fancy split), and this
15923may be useful to split mail that doesn't go to any mailing list to
15924personal mail folders. Note that this fancy split is added as the last
15925element of a @code{|} split list that also contains a @code{&} split
15926with the rules extracted from group parameters.
15927
15928It's time for an example. Assume the following group parameters have
15929been defined:
15930
15931@example
15932nnml:mail.bar:
15933((to-address . "bar@@femail.com")
15934 (split-regexp . ".*@@femail\\.com"))
15935nnml:mail.foo:
15936((to-list . "foo@@nowhere.gov")
15937 (extra-aliases "foo@@localhost" "foo-redist@@home")
15938 (split-exclude "bugs-foo" "rambling-foo")
15939 (admin-address . "foo-request@@nowhere.gov"))
15940nnml:mail.others:
15941((split-spec . catch-all))
15942@end example
15943
15944Setting @code{nnmail-split-methods} to @code{gnus-group-split} will
15945behave as if @code{nnmail-split-fancy} had been selected and variable
15946@code{nnmail-split-fancy} had been set as follows:
15947
15948@lisp
15949(| (& (any "\\(bar@@femail\\.com\\|.*@@femail\\.com\\)" "mail.bar")
15950 (any "\\(foo@@nowhere\\.gov\\|foo@@localhost\\|foo-redist@@home\\)"
15951 - "bugs-foo" - "rambling-foo" "mail.foo"))
15952 "mail.others")
15953@end lisp
15954
15955@findex gnus-group-split-fancy
15956If you'd rather not use group splitting for all your mail groups, you
15957may use it for only some of them, by using @code{nnmail-split-fancy}
15958splits like this:
15959
15960@lisp
15961(: gnus-group-split-fancy @var{groups} @var{no-crosspost} @var{catch-all})
15962@end lisp
15963
15964@var{groups} may be a regular expression or a list of group names whose
15965parameters will be scanned to generate the output split.
15966@var{no-crosspost} can be used to disable cross-posting; in this case, a
15967single @code{|} split will be output. @var{catch-all} is the fall back
15968fancy split, used like @code{gnus-group-split-default-catch-all-group}.
15969If @var{catch-all} is @code{nil}, or if @code{split-regexp} matches the
15970empty string in any selected group, no catch-all split will be issued.
15971Otherwise, if some group has @code{split-spec} set to @code{catch-all},
15972this group will override the value of the @var{catch-all} argument.
15973
15974@findex gnus-group-split-setup
15975Unfortunately, scanning all groups and their parameters can be quite
15976slow, especially considering that it has to be done for every message.
15977But don't despair! The function @code{gnus-group-split-setup} can be
15978used to enable @code{gnus-group-split} in a much more efficient way. It
15979sets @code{nnmail-split-methods} to @code{nnmail-split-fancy} and sets
15980@code{nnmail-split-fancy} to the split produced by
15981@code{gnus-group-split-fancy}. Thus, the group parameters are only
15982scanned once, no matter how many messages are split.
15983
15984@findex gnus-group-split-update
15985However, if you change group parameters, you'd have to update
15986@code{nnmail-split-fancy} manually. You can do it by running
15987@code{gnus-group-split-update}. If you'd rather have it updated
15988automatically, just tell @code{gnus-group-split-setup} to do it for
15989you. For example, add to your @file{~/.gnus.el}:
15990
15991@lisp
15992(gnus-group-split-setup @var{auto-update} @var{catch-all})
15993@end lisp
15994
15995If @var{auto-update} is non-@code{nil}, @code{gnus-group-split-update}
15996will be added to @code{nnmail-pre-get-new-mail-hook}, so you won't ever
15997have to worry about updating @code{nnmail-split-fancy} again. If you
15998don't omit @var{catch-all} (it's optional, equivalent to @code{nil}),
15999@code{gnus-group-split-default-catch-all-group} will be set to its
16000value.
16001
16002@vindex gnus-group-split-updated-hook
16003Because you may want to change @code{nnmail-split-fancy} after it is set
16004by @code{gnus-group-split-update}, this function will run
16005@code{gnus-group-split-updated-hook} just before finishing.
16006
16007@node Incorporating Old Mail
16008@subsection Incorporating Old Mail
16009@cindex incorporating old mail
16010@cindex import old mail
16011
16012Most people have lots of old mail stored in various file formats. If
16013you have set up Gnus to read mail using one of the spiffy Gnus mail
16014back ends, you'll probably wish to have that old mail incorporated into
16015your mail groups.
16016
16017Doing so can be quite easy.
16018
16019To take an example: You're reading mail using @code{nnml}
16020(@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a
16021satisfactory value (@pxref{Splitting Mail}). You have an old Unix mbox
16022file filled with important, but old, mail. You want to move it into
16023your @code{nnml} groups.
16024
16025Here's how:
16026
16027@enumerate
16028@item
16029Go to the group buffer.
16030
16031@item
16032Type @kbd{G f} and give the file name to the mbox file when prompted to create an
16033@code{nndoc} group from the mbox file (@pxref{Foreign Groups}).
16034
16035@item
16036Type @kbd{SPACE} to enter the newly created group.
16037
16038@item
16039Type @kbd{M P b} to process-mark all articles in this group's buffer
16040(@pxref{Setting Process Marks}).
16041
16042@item
16043Type @kbd{B r} to respool all the process-marked articles, and answer
16044@samp{nnml} when prompted (@pxref{Mail Group Commands}).
16045@end enumerate
16046
16047All the mail messages in the mbox file will now also be spread out over
16048all your @code{nnml} groups. Try entering them and check whether things
16049have gone without a glitch. If things look ok, you may consider
16050deleting the mbox file, but I wouldn't do that unless I was absolutely
16051sure that all the mail has ended up where it should be.
16052
16053Respooling is also a handy thing to do if you're switching from one mail
16054back end to another. Just respool all the mail in the old mail groups
16055using the new mail back end.
16056
16057
16058@node Expiring Mail
16059@subsection Expiring Mail
16060@cindex article expiry
16061@cindex expiring mail
16062
16063Traditional mail readers have a tendency to remove mail articles when
16064you mark them as read, in some way. Gnus takes a fundamentally
16065different approach to mail reading.
16066
16067Gnus basically considers mail just to be news that has been received in
16068a rather peculiar manner. It does not think that it has the power to
16069actually change the mail, or delete any mail messages. If you enter a
16070mail group, and mark articles as ``read'', or kill them in some other
16071fashion, the mail articles will still exist on the system. I repeat:
16072Gnus will not delete your old, read mail. Unless you ask it to, of
16073course.
16074
16075To make Gnus get rid of your unwanted mail, you have to mark the
16076articles as @dfn{expirable}. (With the default key bindings, this means
16077that you have to type @kbd{E}.) This does not mean that the articles
16078will disappear right away, however. In general, a mail article will be
16079deleted from your system if, 1) it is marked as expirable, AND 2) it is
16080more than one week old. If you do not mark an article as expirable, it
16081will remain on your system until hell freezes over. This bears
16082repeating one more time, with some spurious capitalizations: IF you do
16083NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES.
16084
16085You do not have to mark articles as expirable by hand. Gnus provides
16086two features, called ``auto-expire'' and ``total-expire'', that can help you
16087with this. In a nutshell, ``auto-expire'' means that Gnus hits @kbd{E}
16088for you when you select an article. And ``total-expire'' means that Gnus
16089considers all articles as expirable that are read. So, in addition to
16090the articles marked @samp{E}, also the articles marked @samp{r},
16091@samp{R}, @samp{O}, @samp{K}, @samp{Y} and so on are considered
16092expirable.
16093
16094When should either auto-expire or total-expire be used? Most people
16095who are subscribed to mailing lists split each list into its own group
16096and then turn on auto-expire or total-expire for those groups.
16097(@xref{Splitting Mail}, for more information on splitting each list
16098into its own group.)
16099
16100Which one is better, auto-expire or total-expire? It's not easy to
16101answer. Generally speaking, auto-expire is probably faster. Another
16102advantage of auto-expire is that you get more marks to work with: for
16103the articles that are supposed to stick around, you can still choose
16104between tick and dormant and read marks. But with total-expire, you
16105only have dormant and ticked to choose from. The advantage of
16106total-expire is that it works well with adaptive scoring (@pxref{Adaptive
16107Scoring}). Auto-expire works with normal scoring but not with adaptive
16108scoring.
16109
16110@vindex gnus-auto-expirable-newsgroups
16111Groups that match the regular expression
16112@code{gnus-auto-expirable-newsgroups} will have all articles that you
16113read marked as expirable automatically. All articles marked as
16114expirable have an @samp{E} in the first column in the summary buffer.
16115
16116By default, if you have auto expiry switched on, Gnus will mark all the
16117articles you read as expirable, no matter if they were read or unread
16118before. To avoid having articles marked as read marked as expirable
16119automatically, you can put something like the following in your
16120@file{~/.gnus.el} file:
16121
16122@vindex gnus-mark-article-hook
16123@lisp
16124(remove-hook 'gnus-mark-article-hook
16125 'gnus-summary-mark-read-and-unread-as-read)
16126(add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read)
16127@end lisp
16128
16129Note that making a group auto-expirable doesn't mean that all read
16130articles are expired---only the articles marked as expirable
16131will be expired. Also note that using the @kbd{d} command won't make
16132articles expirable---only semi-automatic marking of articles as read will
16133mark the articles as expirable in auto-expirable groups.
16134
16135Let's say you subscribe to a couple of mailing lists, and you want the
16136articles you have read to disappear after a while:
16137
16138@lisp
16139(setq gnus-auto-expirable-newsgroups
16140 "mail.nonsense-list\\|mail.nice-list")
16141@end lisp
16142
16143Another way to have auto-expiry happen is to have the element
16144@code{auto-expire} in the group parameters of the group.
16145
16146If you use adaptive scoring (@pxref{Adaptive Scoring}) and
16147auto-expiring, you'll have problems. Auto-expiring and adaptive scoring
16148don't really mix very well.
16149
16150@vindex nnmail-expiry-wait
16151The @code{nnmail-expiry-wait} variable supplies the default time an
16152expirable article has to live. Gnus starts counting days from when the
16153message @emph{arrived}, not from when it was sent. The default is seven
16154days.
16155
16156Gnus also supplies a function that lets you fine-tune how long articles
16157are to live, based on what group they are in. Let's say you want to
16158have one month expiry period in the @samp{mail.private} group, a one day
16159expiry period in the @samp{mail.junk} group, and a six day expiry period
16160everywhere else:
16161
16162@vindex nnmail-expiry-wait-function
16163@lisp
16164(setq nnmail-expiry-wait-function
16165 (lambda (group)
16166 (cond ((string= group "mail.private")
16167 31)
16168 ((string= group "mail.junk")
16169 1)
16170 ((string= group "important")
16171 'never)
16172 (t
16173 6))))
16174@end lisp
16175
16176The group names this function is fed are ``unadorned'' group
16177names---no @samp{nnml:} prefixes and the like.
16178
16179The @code{nnmail-expiry-wait} variable and
16180@code{nnmail-expiry-wait-function} function can either be a number (not
16181necessarily an integer) or one of the symbols @code{immediate} or
16182@code{never}.
16183
16184You can also use the @code{expiry-wait} group parameter to selectively
16185change the expiry period (@pxref{Group Parameters}).
16186
16187@vindex nnmail-expiry-target
16188The normal action taken when expiring articles is to delete them.
16189However, in some circumstances it might make more sense to move them
16190to other groups instead of deleting them. The variable
16191@code{nnmail-expiry-target} (and the @code{expiry-target} group
16192parameter) controls this. The variable supplies a default value for
16193all groups, which can be overridden for specific groups by the group
16194parameter. default value is @code{delete}, but this can also be a
16195string (which should be the name of the group the message should be
16196moved to), or a function (which will be called in a buffer narrowed to
16197the message in question, and with the name of the group being moved
16198from as its parameter) which should return a target---either a group
16199name or @code{delete}.
16200
16201Here's an example for specifying a group name:
16202@lisp
16203(setq nnmail-expiry-target "nnml:expired")
16204@end lisp
16205
16206@findex nnmail-fancy-expiry-target
16207@vindex nnmail-fancy-expiry-targets
16208Gnus provides a function @code{nnmail-fancy-expiry-target} which will
16209expire mail to groups according to the variable
16210@code{nnmail-fancy-expiry-targets}. Here's an example:
16211
16212@lisp
16213 (setq nnmail-expiry-target 'nnmail-fancy-expiry-target
16214 nnmail-fancy-expiry-targets
16215 '((to-from "boss" "nnfolder:Work")
16216 ("subject" "IMPORTANT" "nnfolder:IMPORTANT.%Y.%b")
16217 ("from" ".*" "nnfolder:Archive-%Y")))
16218@end lisp
16219
16220With this setup, any mail that has @code{IMPORTANT} in its Subject
16221header and was sent in the year @code{YYYY} and month @code{MMM}, will
16222get expired to the group @code{nnfolder:IMPORTANT.YYYY.MMM}. If its
16223From or To header contains the string @code{boss}, it will get expired
16224to @code{nnfolder:Work}. All other mail will get expired to
16225@code{nnfolder:Archive-YYYY}.
16226
16227@vindex nnmail-keep-last-article
16228If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never
16229expire the final article in a mail newsgroup. This is to make life
16230easier for procmail users.
16231
16232@vindex gnus-total-expirable-newsgroups
16233By the way: That line up there, about Gnus never expiring non-expirable
16234articles, is a lie. If you put @code{total-expire} in the group
16235parameters, articles will not be marked as expirable, but all read
16236articles will be put through the expiry process. Use with extreme
16237caution. Even more dangerous is the
16238@code{gnus-total-expirable-newsgroups} variable. All groups that match
16239this regexp will have all read articles put through the expiry process,
16240which means that @emph{all} old mail articles in the groups in question
16241will be deleted after a while. Use with extreme caution, and don't come
16242crying to me when you discover that the regexp you used matched the
16243wrong group and all your important mail has disappeared. Be a
16244@emph{man}! Or a @emph{woman}! Whatever you feel more comfortable
16245with! So there!
16246
16247Most people make most of their mail groups total-expirable, though.
16248
16249@vindex gnus-inhibit-user-auto-expire
16250If @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user marking
16251commands will not mark an article as expirable, even if the group has
16252auto-expire turned on.
16253
16254
16255@node Washing Mail
16256@subsection Washing Mail
16257@cindex mail washing
16258@cindex list server brain damage
16259@cindex incoming mail treatment
16260
16261Mailers and list servers are notorious for doing all sorts of really,
16262really stupid things with mail. ``Hey, RFC 822 doesn't explicitly
16263prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the
16264end of all lines passing through our server, so let's do that!!!!1!''
16265Yes, but RFC 822 wasn't designed to be read by morons. Things that were
16266considered to be self-evident were not discussed. So. Here we are.
16267
16268Case in point: The German version of Microsoft Exchange adds @samp{AW:
16269} to the subjects of replies instead of @samp{Re: }. I could pretend to
16270be shocked and dismayed by this, but I haven't got the energy. It is to
16271laugh.
16272
16273Gnus provides a plethora of functions for washing articles while
16274displaying them, but it might be nicer to do the filtering before
16275storing the mail to disk. For that purpose, we have three hooks and
16276various functions that can be put in these hooks.
16277
16278@table @code
16279@item nnmail-prepare-incoming-hook
16280@vindex nnmail-prepare-incoming-hook
16281This hook is called before doing anything with the mail and is meant for
16282grand, sweeping gestures. It is called in a buffer that contains all
16283the new, incoming mail. Functions to be used include:
16284
16285@table @code
16286@item nnheader-ms-strip-cr
16287@findex nnheader-ms-strip-cr
16288Remove trailing carriage returns from each line. This is default on
16289Emacs running on MS machines.
16290
16291@end table
16292
16293@item nnmail-prepare-incoming-header-hook
16294@vindex nnmail-prepare-incoming-header-hook
16295This hook is called narrowed to each header. It can be used when
16296cleaning up the headers. Functions that can be used include:
16297
16298@table @code
16299@item nnmail-remove-leading-whitespace
16300@findex nnmail-remove-leading-whitespace
16301Clear leading white space that ``helpful'' listservs have added to the
16302headers to make them look nice. Aaah.
16303
16304(Note that this function works on both the header on the body of all
16305messages, so it is a potentially dangerous function to use (if a body
16306of a message contains something that looks like a header line). So
16307rather than fix the bug, it is of course the right solution to make it
16308into a feature by documenting it.)
16309
16310@item nnmail-remove-list-identifiers
16311@findex nnmail-remove-list-identifiers
16312Some list servers add an identifier---for example, @samp{(idm)}---to the
16313beginning of all @code{Subject} headers. I'm sure that's nice for
16314people who use stone age mail readers. This function will remove
16315strings that match the @code{nnmail-list-identifiers} regexp, which can
16316also be a list of regexp. @code{nnmail-list-identifiers} may not contain
16317@code{\\(..\\)}.
16318
16319For instance, if you want to remove the @samp{(idm)} and the
16320@samp{nagnagnag} identifiers:
16321
16322@lisp
16323(setq nnmail-list-identifiers
16324 '("(idm)" "nagnagnag"))
16325@end lisp
16326
16327This can also be done non-destructively with
16328@code{gnus-list-identifiers}, @xref{Article Hiding}.
16329
16330@item nnmail-remove-tabs
16331@findex nnmail-remove-tabs
16332Translate all @samp{TAB} characters into @samp{SPACE} characters.
16333
01c52d31
MB
16334@item nnmail-ignore-broken-references
16335@findex nnmail-ignore-broken-references
16336@c @findex nnmail-fix-eudora-headers
4009494e 16337@cindex Eudora
01c52d31
MB
16338@cindex Pegasus
16339Some mail user agents (e.g. Eudora and Pegasus) produce broken
16340@code{References} headers, but correct @code{In-Reply-To} headers. This
16341function will get rid of the @code{References} header if the headers
16342contain a line matching the regular expression
16343@code{nnmail-broken-references-mailers}.
4009494e
GM
16344
16345@end table
16346
16347@item nnmail-prepare-incoming-message-hook
16348@vindex nnmail-prepare-incoming-message-hook
16349This hook is called narrowed to each message. Functions to be used
16350include:
16351
16352@table @code
16353@item article-de-quoted-unreadable
16354@findex article-de-quoted-unreadable
16355Decode Quoted Readable encoding.
16356
16357@end table
16358@end table
16359
16360
16361@node Duplicates
16362@subsection Duplicates
16363
16364@vindex nnmail-treat-duplicates
16365@vindex nnmail-message-id-cache-length
16366@vindex nnmail-message-id-cache-file
16367@cindex duplicate mails
16368If you are a member of a couple of mailing lists, you will sometimes
16369receive two copies of the same mail. This can be quite annoying, so
16370@code{nnmail} checks for and treats any duplicates it might find. To do
16371this, it keeps a cache of old @code{Message-ID}s---
16372@code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by
16373default. The approximate maximum number of @code{Message-ID}s stored
16374there is controlled by the @code{nnmail-message-id-cache-length}
16375variable, which is 1000 by default. (So 1000 @code{Message-ID}s will be
16376stored.) If all this sounds scary to you, you can set
16377@code{nnmail-treat-duplicates} to @code{warn} (which is what it is by
16378default), and @code{nnmail} won't delete duplicate mails. Instead it
16379will insert a warning into the head of the mail saying that it thinks
16380that this is a duplicate of a different message.
16381
16382This variable can also be a function. If that's the case, the function
16383will be called from a buffer narrowed to the message in question with
16384the @code{Message-ID} as a parameter. The function must return either
16385@code{nil}, @code{warn}, or @code{delete}.
16386
16387You can turn this feature off completely by setting the variable to
16388@code{nil}.
16389
16390If you want all the duplicate mails to be put into a special
16391@dfn{duplicates} group, you could do that using the normal mail split
16392methods:
16393
16394@lisp
16395(setq nnmail-split-fancy
16396 '(| ;; @r{Messages duplicates go to a separate group.}
16397 ("gnus-warning" "duplicat\\(e\\|ion\\) of message" "duplicate")
16398 ;; @r{Message from daemons, postmaster, and the like to another.}
16399 (any mail "mail.misc")
16400 ;; @r{Other rules.}
16401 [...] ))
16402@end lisp
16403@noindent
16404Or something like:
16405@lisp
16406(setq nnmail-split-methods
16407 '(("duplicates" "^Gnus-Warning:.*duplicate")
16408 ;; @r{Other rules.}
16409 [...]))
16410@end lisp
16411
16412Here's a neat feature: If you know that the recipient reads her mail
16413with Gnus, and that she has @code{nnmail-treat-duplicates} set to
16414@code{delete}, you can send her as many insults as you like, just by
16415using a @code{Message-ID} of a mail that you know that she's already
16416received. Think of all the fun! She'll never see any of it! Whee!
16417
16418
16419@node Not Reading Mail
16420@subsection Not Reading Mail
16421
16422If you start using any of the mail back ends, they have the annoying
16423habit of assuming that you want to read mail with them. This might not
16424be unreasonable, but it might not be what you want.
16425
16426If you set @code{mail-sources} and @code{nnmail-spool-file} to
16427@code{nil}, none of the back ends will ever attempt to read incoming
16428mail, which should help.
16429
16430@vindex nnbabyl-get-new-mail
16431@vindex nnmbox-get-new-mail
16432@vindex nnml-get-new-mail
16433@vindex nnmh-get-new-mail
16434@vindex nnfolder-get-new-mail
16435This might be too much, if, for instance, you are reading mail quite
16436happily with @code{nnml} and just want to peek at some old Rmail
16437file you have stashed away with @code{nnbabyl}. All back ends have
16438variables called back-end-@code{get-new-mail}. If you want to disable
16439the @code{nnbabyl} mail reading, you edit the virtual server for the
16440group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}.
16441
16442All the mail back ends will call @code{nn}*@code{-prepare-save-mail-hook}
16443narrowed to the article to be saved before saving it when reading
16444incoming mail.
16445
16446
16447@node Choosing a Mail Back End
16448@subsection Choosing a Mail Back End
16449
16450Gnus will read the mail spool when you activate a mail group. The mail
16451file is first copied to your home directory. What happens after that
16452depends on what format you want to store your mail in.
16453
16454There are six different mail back ends in the standard Gnus, and more
16455back ends are available separately. The mail back end most people use
16456(because it is possibly the fastest) is @code{nnml} (@pxref{Mail
16457Spool}).
16458
16459@menu
16460* Unix Mail Box:: Using the (quite) standard Un*x mbox.
16461* Rmail Babyl:: Emacs programs use the Rmail Babyl format.
16462* Mail Spool:: Store your mail in a private spool?
16463* MH Spool:: An mhspool-like back end.
16464* Maildir:: Another one-file-per-message format.
16465* Mail Folders:: Having one file for each group.
16466* Comparing Mail Back Ends:: An in-depth looks at pros and cons.
16467@end menu
16468
16469
16470@node Unix Mail Box
16471@subsubsection Unix Mail Box
16472@cindex nnmbox
16473@cindex unix mail box
16474
16475@vindex nnmbox-active-file
16476@vindex nnmbox-mbox-file
16477The @dfn{nnmbox} back end will use the standard Un*x mbox file to store
16478mail. @code{nnmbox} will add extra headers to each mail article to say
16479which group it belongs in.
16480
16481Virtual server settings:
16482
16483@table @code
16484@item nnmbox-mbox-file
16485@vindex nnmbox-mbox-file
16486The name of the mail box in the user's home directory. Default is
16487@file{~/mbox}.
16488
16489@item nnmbox-active-file
16490@vindex nnmbox-active-file
16491The name of the active file for the mail box. Default is
16492@file{~/.mbox-active}.
16493
16494@item nnmbox-get-new-mail
16495@vindex nnmbox-get-new-mail
16496If non-@code{nil}, @code{nnmbox} will read incoming mail and split it
16497into groups. Default is @code{t}.
16498@end table
16499
16500
16501@node Rmail Babyl
16502@subsubsection Rmail Babyl
16503@cindex nnbabyl
16504@cindex Rmail mbox
16505
16506@vindex nnbabyl-active-file
16507@vindex nnbabyl-mbox-file
16508The @dfn{nnbabyl} back end will use a Babyl mail box (aka. @dfn{Rmail
16509mbox}) to store mail. @code{nnbabyl} will add extra headers to each
16510mail article to say which group it belongs in.
16511
16512Virtual server settings:
16513
16514@table @code
16515@item nnbabyl-mbox-file
16516@vindex nnbabyl-mbox-file
16517The name of the Rmail mbox file. The default is @file{~/RMAIL}
16518
16519@item nnbabyl-active-file
16520@vindex nnbabyl-active-file
16521The name of the active file for the rmail box. The default is
16522@file{~/.rmail-active}
16523
16524@item nnbabyl-get-new-mail
16525@vindex nnbabyl-get-new-mail
16526If non-@code{nil}, @code{nnbabyl} will read incoming mail. Default is
16527@code{t}
16528@end table
16529
16530
16531@node Mail Spool
16532@subsubsection Mail Spool
16533@cindex nnml
16534@cindex mail @acronym{NOV} spool
16535
16536The @dfn{nnml} spool mail format isn't compatible with any other known
16537format. It should be used with some caution.
16538
16539@vindex nnml-directory
16540If you use this back end, Gnus will split all incoming mail into files,
16541one file for each mail, and put the articles into the corresponding
16542directories under the directory specified by the @code{nnml-directory}
16543variable. The default value is @file{~/Mail/}.
16544
16545You do not have to create any directories beforehand; Gnus will take
16546care of all that.
16547
16548If you have a strict limit as to how many files you are allowed to store
16549in your account, you should not use this back end. As each mail gets its
16550own file, you might very well occupy thousands of inodes within a few
16551weeks. If this is no problem for you, and it isn't a problem for you
16552having your friendly systems administrator walking around, madly,
16553shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should
16554know that this is probably the fastest format to use. You do not have
16555to trudge through a big mbox file just to read your new mail.
16556
16557@code{nnml} is probably the slowest back end when it comes to article
16558splitting. It has to create lots of files, and it also generates
16559@acronym{NOV} databases for the incoming mails. This makes it possibly the
16560fastest back end when it comes to reading mail.
16561
16562@cindex self contained nnml servers
16563@cindex marks
16564When the marks file is used (which it is by default), @code{nnml}
16565servers have the property that you may backup them using @code{tar} or
16566similar, and later be able to restore them into Gnus (by adding the
16567proper @code{nnml} server) and have all your marks be preserved. Marks
01c52d31 16568for a group are usually stored in the @code{.marks} file (but see
4009494e
GM
16569@code{nnml-marks-file-name}) within each @code{nnml} group's directory.
16570Individual @code{nnml} groups are also possible to backup, use @kbd{G m}
16571to restore the group (after restoring the backup into the nnml
16572directory).
16573
16574If for some reason you believe your @file{.marks} files are screwed
16575up, you can just delete them all. Gnus will then correctly regenerate
16576them next time it starts.
16577
16578Virtual server settings:
16579
16580@table @code
16581@item nnml-directory
16582@vindex nnml-directory
16583All @code{nnml} directories will be placed under this directory. The
16584default is the value of @code{message-directory} (whose default value
16585is @file{~/Mail}).
16586
16587@item nnml-active-file
16588@vindex nnml-active-file
16589The active file for the @code{nnml} server. The default is
16590@file{~/Mail/active}.
16591
16592@item nnml-newsgroups-file
16593@vindex nnml-newsgroups-file
16594The @code{nnml} group descriptions file. @xref{Newsgroups File
16595Format}. The default is @file{~/Mail/newsgroups}.
16596
16597@item nnml-get-new-mail
16598@vindex nnml-get-new-mail
16599If non-@code{nil}, @code{nnml} will read incoming mail. The default is
16600@code{t}.
16601
16602@item nnml-nov-is-evil
16603@vindex nnml-nov-is-evil
16604If non-@code{nil}, this back end will ignore any @acronym{NOV} files. The
16605default is @code{nil}.
16606
16607@item nnml-nov-file-name
16608@vindex nnml-nov-file-name
16609The name of the @acronym{NOV} files. The default is @file{.overview}.
16610
16611@item nnml-prepare-save-mail-hook
16612@vindex nnml-prepare-save-mail-hook
16613Hook run narrowed to an article before saving.
16614
16615@item nnml-marks-is-evil
16616@vindex nnml-marks-is-evil
16617If non-@code{nil}, this back end will ignore any @sc{marks} files. The
16618default is @code{nil}.
16619
16620@item nnml-marks-file-name
16621@vindex nnml-marks-file-name
16622The name of the @dfn{marks} files. The default is @file{.marks}.
16623
16624@item nnml-use-compressed-files
16625@vindex nnml-use-compressed-files
16626If non-@code{nil}, @code{nnml} will allow using compressed message
01c52d31
MB
16627files. This requires @code{auto-compression-mode} to be enabled
16628(@pxref{Compressed Files, ,Compressed Files, emacs, The Emacs Manual}).
16629If the value of @code{nnml-use-compressed-files} is a string, it is used
16630as the file extension specifying the compression program. You can set it
16631to @samp{.bz2} if your Emacs supports it. A value of @code{t} is
16632equivalent to @samp{.gz}.
16633
16634@item nnml-compressed-files-size-threshold
16635@vindex nnml-compressed-files-size-threshold
16636Default size threshold for compressed message files. Message files with
16637bodies larger than that many characters will be automatically compressed
16638if @code{nnml-use-compressed-files} is non-@code{nil}.
4009494e
GM
16639
16640@end table
16641
16642@findex nnml-generate-nov-databases
16643If your @code{nnml} groups and @acronym{NOV} files get totally out of
16644whack, you can do a complete update by typing @kbd{M-x
16645nnml-generate-nov-databases}. This command will trawl through the
16646entire @code{nnml} hierarchy, looking at each and every article, so it
16647might take a while to complete. A better interface to this
16648functionality can be found in the server buffer (@pxref{Server
16649Commands}).
16650
16651
16652@node MH Spool
16653@subsubsection MH Spool
16654@cindex nnmh
16655@cindex mh-e mail spool
16656
16657@code{nnmh} is just like @code{nnml}, except that is doesn't generate
16658@acronym{NOV} databases and it doesn't keep an active file or marks
16659file. This makes @code{nnmh} a @emph{much} slower back end than
16660@code{nnml}, but it also makes it easier to write procmail scripts
16661for.
16662
16663Virtual server settings:
16664
16665@table @code
16666@item nnmh-directory
16667@vindex nnmh-directory
16668All @code{nnmh} directories will be located under this directory. The
16669default is the value of @code{message-directory} (whose default is
16670@file{~/Mail})
16671
16672@item nnmh-get-new-mail
16673@vindex nnmh-get-new-mail
16674If non-@code{nil}, @code{nnmh} will read incoming mail. The default is
16675@code{t}.
16676
16677@item nnmh-be-safe
16678@vindex nnmh-be-safe
16679If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make
16680sure that the articles in the folder are actually what Gnus thinks
16681they are. It will check date stamps and stat everything in sight, so
16682setting this to @code{t} will mean a serious slow-down. If you never
16683use anything but Gnus to read the @code{nnmh} articles, you do not
16684have to set this variable to @code{t}. The default is @code{nil}.
16685@end table
16686
16687
16688@node Maildir
16689@subsubsection Maildir
16690@cindex nnmaildir
16691@cindex maildir
16692
16693@code{nnmaildir} stores mail in the maildir format, with each maildir
16694corresponding to a group in Gnus. This format is documented here:
16695@uref{http://cr.yp.to/proto/maildir.html} and here:
16696@uref{http://www.qmail.org/man/man5/maildir.html}. @code{nnmaildir}
16697also stores extra information in the @file{.nnmaildir/} directory
16698within a maildir.
16699
16700Maildir format was designed to allow concurrent deliveries and
16701reading, without needing locks. With other back ends, you would have
16702your mail delivered to a spool of some kind, and then you would
16703configure Gnus to split mail from that spool into your groups. You
16704can still do that with @code{nnmaildir}, but the more common
16705configuration is to have your mail delivered directly to the maildirs
16706that appear as group in Gnus.
16707
16708@code{nnmaildir} is designed to be perfectly reliable: @kbd{C-g} will
16709never corrupt its data in memory, and @code{SIGKILL} will never
16710corrupt its data in the filesystem.
16711
16712@code{nnmaildir} stores article marks and @acronym{NOV} data in each
16713maildir. So you can copy a whole maildir from one Gnus setup to
16714another, and you will keep your marks.
16715
16716Virtual server settings:
16717
16718@table @code
16719@item directory
16720For each of your @code{nnmaildir} servers (it's very unlikely that
16721you'd need more than one), you need to create a directory and populate
16722it with maildirs or symlinks to maildirs (and nothing else; do not
16723choose a directory already used for other purposes). Each maildir
16724will be represented in Gnus as a newsgroup on that server; the
16725filename of the symlink will be the name of the group. Any filenames
16726in the directory starting with @samp{.} are ignored. The directory is
16727scanned when you first start Gnus, and each time you type @kbd{g} in
16728the group buffer; if any maildirs have been removed or added,
16729@code{nnmaildir} notices at these times.
16730
16731The value of the @code{directory} parameter should be a Lisp form
16732which is processed by @code{eval} and @code{expand-file-name} to get
16733the path of the directory for this server. The form is @code{eval}ed
16734only when the server is opened; the resulting string is used until the
16735server is closed. (If you don't know about forms and @code{eval},
16736don't worry---a simple string will work.) This parameter is not
16737optional; you must specify it. I don't recommend using
16738@code{"~/Mail"} or a subdirectory of it; several other parts of Gnus
16739use that directory by default for various things, and may get confused
16740if @code{nnmaildir} uses it too. @code{"~/.nnmaildir"} is a typical
16741value.
16742
16743@item target-prefix
16744This should be a Lisp form which is processed by @code{eval} and
16745@code{expand-file-name}. The form is @code{eval}ed only when the
16746server is opened; the resulting string is used until the server is
16747closed.
16748
16749When you create a group on an @code{nnmaildir} server, the maildir is
16750created with @code{target-prefix} prepended to its name, and a symlink
16751pointing to that maildir is created, named with the plain group name.
16752So if @code{directory} is @code{"~/.nnmaildir"} and
16753@code{target-prefix} is @code{"../maildirs/"}, then when you create
16754the group @code{foo}, @code{nnmaildir} will create
16755@file{~/.nnmaildir/../maildirs/foo} as a maildir, and will create
16756@file{~/.nnmaildir/foo} as a symlink pointing to
16757@file{../maildirs/foo}.
16758
16759You can set @code{target-prefix} to a string without any slashes to
16760create both maildirs and symlinks in the same @code{directory}; in
16761this case, any maildirs found in @code{directory} whose names start
16762with @code{target-prefix} will not be listed as groups (but the
16763symlinks pointing to them will be).
16764
16765As a special case, if @code{target-prefix} is @code{""} (the default),
16766then when you create a group, the maildir will be created in
16767@code{directory} without a corresponding symlink. Beware that you
16768cannot use @code{gnus-group-delete-group} on such groups without the
16769@code{force} argument.
16770
16771@item directory-files
16772This should be a function with the same interface as
16773@code{directory-files} (such as @code{directory-files} itself). It is
16774used to scan the server's @code{directory} for maildirs. This
16775parameter is optional; the default is
16776@code{nnheader-directory-files-safe} if
16777@code{nnheader-directory-files-is-safe} is @code{nil}, and
16778@code{directory-files} otherwise.
16779(@code{nnheader-directory-files-is-safe} is checked only once when the
16780server is opened; if you want to check it each time the directory is
16781scanned, you'll have to provide your own function that does that.)
16782
16783@item get-new-mail
16784If non-@code{nil}, then after scanning for new mail in the group
16785maildirs themselves as usual, this server will also incorporate mail
16786the conventional Gnus way, from @code{mail-sources} according to
16787@code{nnmail-split-methods} or @code{nnmail-split-fancy}. The default
16788value is @code{nil}.
16789
16790Do @emph{not} use the same maildir both in @code{mail-sources} and as
16791an @code{nnmaildir} group. The results might happen to be useful, but
16792that would be by chance, not by design, and the results might be
16793different in the future. If your split rules create new groups,
16794remember to supply a @code{create-directory} server parameter.
16795@end table
16796
16797@subsubsection Group parameters
16798
16799@code{nnmaildir} uses several group parameters. It's safe to ignore
16800all this; the default behavior for @code{nnmaildir} is the same as the
16801default behavior for other mail back ends: articles are deleted after
16802one week, etc. Except for the expiry parameters, all this
16803functionality is unique to @code{nnmaildir}, so you can ignore it if
16804you're just trying to duplicate the behavior you already have with
16805another back end.
16806
16807If the value of any of these parameters is a vector, the first element
16808is evaluated as a Lisp form and the result is used, rather than the
16809original value. If the value is not a vector, the value itself is
16810evaluated as a Lisp form. (This is why these parameters use names
16811different from those of other, similar parameters supported by other
16812back ends: they have different, though similar, meanings.) (For
16813numbers, strings, @code{nil}, and @code{t}, you can ignore the
16814@code{eval} business again; for other values, remember to use an extra
16815quote and wrap the value in a vector when appropriate.)
16816
16817@table @code
16818@item expire-age
16819An integer specifying the minimum age, in seconds, of an article
16820before it will be expired, or the symbol @code{never} to specify that
16821articles should never be expired. If this parameter is not set,
16822@code{nnmaildir} falls back to the usual
16823@code{nnmail-expiry-wait}(@code{-function}) variables (the
16824@code{expiry-wait} group parameter overrides @code{nnmail-expiry-wait}
16825and makes @code{nnmail-expiry-wait-function} ineffective). If you
16826wanted a value of 3 days, you could use something like @code{[(* 3 24
1682760 60)]}; @code{nnmaildir} will evaluate the form and use the result.
16828An article's age is measured starting from the article file's
16829modification time. Normally, this is the same as the article's
16830delivery time, but editing an article makes it younger. Moving an
16831article (other than via expiry) may also make an article younger.
16832
16833@item expire-group
16834If this is set to a string such as a full Gnus group name, like
16835@example
16836"backend+server.address.string:group.name"
16837@end example
16838and if it is not the name of the same group that the parameter belongs
16839to, then articles will be moved to the specified group during expiry
16840before being deleted. @emph{If this is set to an @code{nnmaildir}
16841group, the article will be just as old in the destination group as it
16842was in the source group.} So be careful with @code{expire-age} in the
16843destination group. If this is set to the name of the same group that
16844the parameter belongs to, then the article is not expired at all. If
16845you use the vector form, the first element is evaluated once for each
16846article. So that form can refer to
16847@code{nnmaildir-article-file-name}, etc., to decide where to put the
16848article. @emph{Even if this parameter is not set, @code{nnmaildir}
16849does not fall back to the @code{expiry-target} group parameter or the
16850@code{nnmail-expiry-target} variable.}
16851
16852@item read-only
16853If this is set to @code{t}, @code{nnmaildir} will treat the articles
16854in this maildir as read-only. This means: articles are not renamed
16855from @file{new/} into @file{cur/}; articles are only found in
16856@file{new/}, not @file{cur/}; articles are never deleted; articles
16857cannot be edited. @file{new/} is expected to be a symlink to the
16858@file{new/} directory of another maildir---e.g., a system-wide mailbox
16859containing a mailing list of common interest. Everything in the
16860maildir outside @file{new/} is @emph{not} treated as read-only, so for
16861a shared mailbox, you do still need to set up your own maildir (or
16862have write permission to the shared mailbox); your maildir just won't
16863contain extra copies of the articles.
16864
16865@item directory-files
16866A function with the same interface as @code{directory-files}. It is
16867used to scan the directories in the maildir corresponding to this
16868group to find articles. The default is the function specified by the
16869server's @code{directory-files} parameter.
16870
16871@item distrust-Lines:
16872If non-@code{nil}, @code{nnmaildir} will always count the lines of an
16873article, rather than use the @code{Lines:} header field. If
16874@code{nil}, the header field will be used if present.
16875
16876@item always-marks
16877A list of mark symbols, such as @code{['(read expire)]}. Whenever
16878Gnus asks @code{nnmaildir} for article marks, @code{nnmaildir} will
16879say that all articles have these marks, regardless of whether the
16880marks stored in the filesystem say so. This is a proof-of-concept
16881feature that will probably be removed eventually; it ought to be done
16882in Gnus proper, or abandoned if it's not worthwhile.
16883
16884@item never-marks
16885A list of mark symbols, such as @code{['(tick expire)]}. Whenever
16886Gnus asks @code{nnmaildir} for article marks, @code{nnmaildir} will
16887say that no articles have these marks, regardless of whether the marks
16888stored in the filesystem say so. @code{never-marks} overrides
16889@code{always-marks}. This is a proof-of-concept feature that will
16890probably be removed eventually; it ought to be done in Gnus proper, or
16891abandoned if it's not worthwhile.
16892
16893@item nov-cache-size
16894An integer specifying the size of the @acronym{NOV} memory cache. To
16895speed things up, @code{nnmaildir} keeps @acronym{NOV} data in memory
16896for a limited number of articles in each group. (This is probably not
16897worthwhile, and will probably be removed in the future.) This
16898parameter's value is noticed only the first time a group is seen after
16899the server is opened---i.e., when you first start Gnus, typically.
16900The @acronym{NOV} cache is never resized until the server is closed
16901and reopened. The default is an estimate of the number of articles
16902that would be displayed in the summary buffer: a count of articles
16903that are either marked with @code{tick} or not marked with
16904@code{read}, plus a little extra.
16905@end table
16906
16907@subsubsection Article identification
16908Articles are stored in the @file{cur/} subdirectory of each maildir.
16909Each article file is named like @code{uniq:info}, where @code{uniq}
16910contains no colons. @code{nnmaildir} ignores, but preserves, the
16911@code{:info} part. (Other maildir readers typically use this part of
16912the filename to store marks.) The @code{uniq} part uniquely
16913identifies the article, and is used in various places in the
16914@file{.nnmaildir/} subdirectory of the maildir to store information
16915about the corresponding article. The full pathname of an article is
16916available in the variable @code{nnmaildir-article-file-name} after you
16917request the article in the summary buffer.
16918
16919@subsubsection NOV data
16920An article identified by @code{uniq} has its @acronym{NOV} data (used
16921to generate lines in the summary buffer) stored in
16922@code{.nnmaildir/nov/uniq}. There is no
16923@code{nnmaildir-generate-nov-databases} function. (There isn't much
16924need for it---an article's @acronym{NOV} data is updated automatically
16925when the article or @code{nnmail-extra-headers} has changed.) You can
16926force @code{nnmaildir} to regenerate the @acronym{NOV} data for a
16927single article simply by deleting the corresponding @acronym{NOV}
16928file, but @emph{beware}: this will also cause @code{nnmaildir} to
16929assign a new article number for this article, which may cause trouble
16930with @code{seen} marks, the Agent, and the cache.
16931
16932@subsubsection Article marks
16933An article identified by @code{uniq} is considered to have the mark
16934@code{flag} when the file @file{.nnmaildir/marks/flag/uniq} exists.
16935When Gnus asks @code{nnmaildir} for a group's marks, @code{nnmaildir}
16936looks for such files and reports the set of marks it finds. When Gnus
16937asks @code{nnmaildir} to store a new set of marks, @code{nnmaildir}
16938creates and deletes the corresponding files as needed. (Actually,
16939rather than create a new file for each mark, it just creates hard
16940links to @file{.nnmaildir/markfile}, to save inodes.)
16941
16942You can invent new marks by creating a new directory in
16943@file{.nnmaildir/marks/}. You can tar up a maildir and remove it from
16944your server, untar it later, and keep your marks. You can add and
16945remove marks yourself by creating and deleting mark files. If you do
16946this while Gnus is running and your @code{nnmaildir} server is open,
16947it's best to exit all summary buffers for @code{nnmaildir} groups and
16948type @kbd{s} in the group buffer first, and to type @kbd{g} or
16949@kbd{M-g} in the group buffer afterwards. Otherwise, Gnus might not
16950pick up the changes, and might undo them.
16951
16952
16953@node Mail Folders
16954@subsubsection Mail Folders
16955@cindex nnfolder
16956@cindex mbox folders
16957@cindex mail folders
16958
16959@code{nnfolder} is a back end for storing each mail group in a
16960separate file. Each file is in the standard Un*x mbox format.
16961@code{nnfolder} will add extra headers to keep track of article
16962numbers and arrival dates.
16963
16964@cindex self contained nnfolder servers
16965@cindex marks
16966When the marks file is used (which it is by default), @code{nnfolder}
16967servers have the property that you may backup them using @code{tar} or
16968similar, and later be able to restore them into Gnus (by adding the
16969proper @code{nnfolder} server) and have all your marks be preserved.
16970Marks for a group are usually stored in a file named as the mbox file
16971with @code{.mrk} concatenated to it (but see
16972@code{nnfolder-marks-file-suffix}) within the @code{nnfolder}
16973directory. Individual @code{nnfolder} groups are also possible to
16974backup, use @kbd{G m} to restore the group (after restoring the backup
16975into the @code{nnfolder} directory).
16976
16977Virtual server settings:
16978
16979@table @code
16980@item nnfolder-directory
16981@vindex nnfolder-directory
16982All the @code{nnfolder} mail boxes will be stored under this
16983directory. The default is the value of @code{message-directory}
16984(whose default is @file{~/Mail})
16985
16986@item nnfolder-active-file
16987@vindex nnfolder-active-file
16988The name of the active file. The default is @file{~/Mail/active}.
16989
16990@item nnfolder-newsgroups-file
16991@vindex nnfolder-newsgroups-file
16992The name of the group descriptions file. @xref{Newsgroups File
16993Format}. The default is @file{~/Mail/newsgroups}
16994
16995@item nnfolder-get-new-mail
16996@vindex nnfolder-get-new-mail
16997If non-@code{nil}, @code{nnfolder} will read incoming mail. The
16998default is @code{t}
16999
17000@item nnfolder-save-buffer-hook
17001@vindex nnfolder-save-buffer-hook
17002@cindex backup files
17003Hook run before saving the folders. Note that Emacs does the normal
17004backup renaming of files even with the @code{nnfolder} buffers. If
17005you wish to switch this off, you could say something like the
17006following in your @file{.emacs} file:
17007
17008@lisp
17009(defun turn-off-backup ()
17010 (set (make-local-variable 'backup-inhibited) t))
17011
17012(add-hook 'nnfolder-save-buffer-hook 'turn-off-backup)
17013@end lisp
17014
17015@item nnfolder-delete-mail-hook
17016@vindex nnfolder-delete-mail-hook
17017Hook run in a buffer narrowed to the message that is to be deleted.
17018This function can be used to copy the message to somewhere else, or to
17019extract some information from it before removing it.
17020
17021@item nnfolder-nov-is-evil
17022@vindex nnfolder-nov-is-evil
17023If non-@code{nil}, this back end will ignore any @acronym{NOV} files. The
17024default is @code{nil}.
17025
17026@item nnfolder-nov-file-suffix
17027@vindex nnfolder-nov-file-suffix
17028The extension for @acronym{NOV} files. The default is @file{.nov}.
17029
17030@item nnfolder-nov-directory
17031@vindex nnfolder-nov-directory
17032The directory where the @acronym{NOV} files should be stored. If
17033@code{nil}, @code{nnfolder-directory} is used.
17034
17035@item nnfolder-marks-is-evil
17036@vindex nnfolder-marks-is-evil
17037If non-@code{nil}, this back end will ignore any @sc{marks} files. The
17038default is @code{nil}.
17039
17040@item nnfolder-marks-file-suffix
17041@vindex nnfolder-marks-file-suffix
17042The extension for @sc{marks} files. The default is @file{.mrk}.
17043
17044@item nnfolder-marks-directory
17045@vindex nnfolder-marks-directory
17046The directory where the @sc{marks} files should be stored. If
17047@code{nil}, @code{nnfolder-directory} is used.
17048
17049@end table
17050
17051
17052@findex nnfolder-generate-active-file
17053@kindex M-x nnfolder-generate-active-file
17054If you have lots of @code{nnfolder}-like files you'd like to read with
17055@code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file}
17056command to make @code{nnfolder} aware of all likely files in
17057@code{nnfolder-directory}. This only works if you use long file names,
17058though.
17059
17060@node Comparing Mail Back Ends
17061@subsubsection Comparing Mail Back Ends
17062
17063First, just for terminology, the @dfn{back end} is the common word for a
17064low-level access method---a transport, if you will, by which something
17065is acquired. The sense is that one's mail has to come from somewhere,
17066and so selection of a suitable back end is required in order to get that
17067mail within spitting distance of Gnus.
17068
17069The same concept exists for Usenet itself: Though access to articles is
17070typically done by @acronym{NNTP} these days, once upon a midnight dreary, everyone
17071in the world got at Usenet by running a reader on the machine where the
17072articles lay (the machine which today we call an @acronym{NNTP} server), and
17073access was by the reader stepping into the articles' directory spool
17074area directly. One can still select between either the @code{nntp} or
17075@code{nnspool} back ends, to select between these methods, if one happens
17076actually to live on the server (or can see its spool directly, anyway,
17077via NFS).
17078
17079The goal in selecting a mail back end is to pick one which
17080simultaneously represents a suitable way of dealing with the original
17081format plus leaving mail in a form that is convenient to use in the
17082future. Here are some high and low points on each:
17083
17084@table @code
17085@item nnmbox
17086
17087UNIX systems have historically had a single, very common, and well-
17088defined format. All messages arrive in a single @dfn{spool file}, and
17089they are delineated by a line whose regular expression matches
17090@samp{^From_}. (My notational use of @samp{_} is to indicate a space,
17091to make it clear in this instance that this is not the RFC-specified
17092@samp{From:} header.) Because Emacs and therefore Gnus emanate
17093historically from the Unix environment, it is simplest if one does not
17094mess a great deal with the original mailbox format, so if one chooses
17095this back end, Gnus' primary activity in getting mail from the real spool
17096area to Gnus' preferred directory is simply to copy it, with no
17097(appreciable) format change in the process. It is the ``dumbest'' way
17098to move mail into availability in the Gnus environment. This makes it
17099fast to move into place, but slow to parse, when Gnus has to look at
17100what's where.
17101
17102@item nnbabyl
17103
17104Once upon a time, there was the DEC-10 and DEC-20, running operating
17105systems called TOPS and related things, and the usual (only?) mail
17106reading environment was a thing called Babyl. I don't know what format
17107was used for mail landing on the system, but Babyl had its own internal
17108format to which mail was converted, primarily involving creating a
17109spool-file-like entity with a scheme for inserting Babyl-specific
17110headers and status bits above the top of each message in the file.
17111Rmail was Emacs' first mail reader, it was written by Richard Stallman,
17112and Stallman came out of that TOPS/Babyl environment, so he wrote Rmail
17113to understand the mail files folks already had in existence. Gnus (and
17114VM, for that matter) continue to support this format because it's
17115perceived as having some good qualities in those mailer-specific
17116headers/status bits stuff. Rmail itself still exists as well, of
17117course, and is still maintained by Stallman.
17118
17119Both of the above forms leave your mail in a single file on your
17120file system, and they must parse that entire file each time you take a
17121look at your mail.
17122
17123@item nnml
17124
17125@code{nnml} is the back end which smells the most as though you were
17126actually operating with an @code{nnspool}-accessed Usenet system. (In
17127fact, I believe @code{nnml} actually derived from @code{nnspool} code,
17128lo these years ago.) One's mail is taken from the original spool file,
17129and is then cut up into individual message files, 1:1. It maintains a
17130Usenet-style active file (analogous to what one finds in an INN- or
17131CNews-based news system in (for instance) @file{/var/lib/news/active},
17132or what is returned via the @samp{NNTP LIST} verb) and also creates
17133@dfn{overview} files for efficient group entry, as has been defined for
17134@acronym{NNTP} servers for some years now. It is slower in mail-splitting,
17135due to the creation of lots of files, updates to the @code{nnml} active
17136file, and additions to overview files on a per-message basis, but it is
17137extremely fast on access because of what amounts to the indexing support
17138provided by the active file and overviews.
17139
17140@code{nnml} costs @dfn{inodes} in a big way; that is, it soaks up the
17141resource which defines available places in the file system to put new
17142files. Sysadmins take a dim view of heavy inode occupation within
17143tight, shared file systems. But if you live on a personal machine where
17144the file system is your own and space is not at a premium, @code{nnml}
17145wins big.
17146
17147It is also problematic using this back end if you are living in a
17148FAT16-based Windows world, since much space will be wasted on all these
17149tiny files.
17150
17151@item nnmh
17152
17153The Rand MH mail-reading system has been around UNIX systems for a very
17154long time; it operates by splitting one's spool file of messages into
17155individual files, but with little or no indexing support---@code{nnmh}
17156is considered to be semantically equivalent to ``@code{nnml} without
17157active file or overviews''. This is arguably the worst choice, because
17158one gets the slowness of individual file creation married to the
17159slowness of access parsing when learning what's new in one's groups.
17160
17161@item nnfolder
17162
17163Basically the effect of @code{nnfolder} is @code{nnmbox} (the first
17164method described above) on a per-group basis. That is, @code{nnmbox}
17165itself puts @emph{all} one's mail in one file; @code{nnfolder} provides a
17166little bit of optimization to this so that each of one's mail groups has
17167a Unix mail box file. It's faster than @code{nnmbox} because each group
17168can be parsed separately, and still provides the simple Unix mail box
17169format requiring minimal effort in moving the mail around. In addition,
17170it maintains an ``active'' file making it much faster for Gnus to figure
17171out how many messages there are in each separate group.
17172
17173If you have groups that are expected to have a massive amount of
17174messages, @code{nnfolder} is not the best choice, but if you receive
17175only a moderate amount of mail, @code{nnfolder} is probably the most
17176friendly mail back end all over.
17177
17178@item nnmaildir
17179
17180For configuring expiry and other things, @code{nnmaildir} uses
17181incompatible group parameters, slightly different from those of other
17182mail back ends.
17183
17184@code{nnmaildir} is largely similar to @code{nnml}, with some notable
17185differences. Each message is stored in a separate file, but the
17186filename is unrelated to the article number in Gnus. @code{nnmaildir}
17187also stores the equivalent of @code{nnml}'s overview files in one file
17188per article, so it uses about twice as many inodes as @code{nnml}. (Use
17189@code{df -i} to see how plentiful your inode supply is.) If this slows
17190you down or takes up very much space, consider switching to
17191@uref{http://www.namesys.com/, ReiserFS} or another non-block-structured
17192file system.
17193
17194Since maildirs don't require locking for delivery, the maildirs you use
17195as groups can also be the maildirs your mail is directly delivered to.
17196This means you can skip Gnus' mail splitting if your mail is already
17197organized into different mailboxes during delivery. A @code{directory}
17198entry in @code{mail-sources} would have a similar effect, but would
17199require one set of mailboxes for spooling deliveries (in mbox format,
17200thus damaging message bodies), and another set to be used as groups (in
17201whatever format you like). A maildir has a built-in spool, in the
17202@code{new/} subdirectory. Beware that currently, mail moved from
17203@code{new/} to @code{cur/} instead of via mail splitting will not
17204undergo treatment such as duplicate checking.
17205
17206@code{nnmaildir} stores article marks for a given group in the
17207corresponding maildir, in a way designed so that it's easy to manipulate
17208them from outside Gnus. You can tar up a maildir, unpack it somewhere
17209else, and still have your marks. @code{nnml} also stores marks, but
17210it's not as easy to work with them from outside Gnus as with
17211@code{nnmaildir}.
17212
17213@code{nnmaildir} uses a significant amount of memory to speed things up.
17214(It keeps in memory some of the things that @code{nnml} stores in files
17215and that @code{nnmh} repeatedly parses out of message files.) If this
17216is a problem for you, you can set the @code{nov-cache-size} group
17217parameter to something small (0 would probably not work, but 1 probably
17218would) to make it use less memory. This caching will probably be
17219removed in the future.
17220
17221Startup is likely to be slower with @code{nnmaildir} than with other
17222back ends. Everything else is likely to be faster, depending in part
17223on your file system.
17224
17225@code{nnmaildir} does not use @code{nnoo}, so you cannot use @code{nnoo}
17226to write an @code{nnmaildir}-derived back end.
17227
17228@end table
17229
17230
17231@node Browsing the Web
17232@section Browsing the Web
17233@cindex web
17234@cindex browsing the web
17235@cindex www
17236@cindex http
17237
17238Web-based discussion forums are getting more and more popular. On many
17239subjects, the web-based forums have become the most important forums,
17240eclipsing the importance of mailing lists and news groups. The reason
17241is easy to understand---they are friendly to new users; you just point
17242and click, and there's the discussion. With mailing lists, you have to
17243go through a cumbersome subscription procedure, and most people don't
17244even know what a news group is.
17245
17246The problem with this scenario is that web browsers are not very good at
17247being newsreaders. They do not keep track of what articles you've read;
17248they do not allow you to score on subjects you're interested in; they do
17249not allow off-line browsing; they require you to click around and drive
17250you mad in the end.
17251
17252So---if web browsers suck at reading discussion forums, why not use Gnus
17253to do it instead?
17254
17255Gnus has been getting a bit of a collection of back ends for providing
17256interfaces to these sources.
17257
17258@menu
17259* Archiving Mail::
17260* Web Searches:: Creating groups from articles that match a string.
17261* Slashdot:: Reading the Slashdot comments.
17262* Ultimate:: The Ultimate Bulletin Board systems.
17263* Web Archive:: Reading mailing list archived on web.
17264* RSS:: Reading RDF site summary.
17265* Customizing W3:: Doing stuff to Emacs/W3 from Gnus.
17266@end menu
17267
17268All the web sources require Emacs/W3 and the url library or those
17269alternatives to work.
17270
17271The main caveat with all these web sources is that they probably won't
17272work for a very long time. Gleaning information from the @acronym{HTML} data
17273is guesswork at best, and when the layout is altered, the Gnus back end
17274will fail. If you have reasonably new versions of these back ends,
17275though, you should be ok.
17276
17277One thing all these Web methods have in common is that the Web sources
17278are often down, unavailable or just plain too slow to be fun. In those
17279cases, it makes a lot of sense to let the Gnus Agent (@pxref{Gnus
17280Unplugged}) handle downloading articles, and then you can read them at
17281leisure from your local disk. No more World Wide Wait for you.
17282
17283@node Archiving Mail
17284@subsection Archiving Mail
17285@cindex archiving mail
17286@cindex backup of mail
17287
17288Some of the back ends, notably @code{nnml}, @code{nnfolder}, and
17289@code{nnmaildir}, now actually store the article marks with each group.
17290For these servers, archiving and restoring a group while preserving
17291marks is fairly simple.
17292
17293(Preserving the group level and group parameters as well still
17294requires ritual dancing and sacrifices to the @file{.newsrc.eld} deity
17295though.)
17296
17297To archive an entire @code{nnml}, @code{nnfolder}, or @code{nnmaildir}
17298server, take a recursive copy of the server directory. There is no need
17299to shut down Gnus, so archiving may be invoked by @code{cron} or
17300similar. You restore the data by restoring the directory tree, and
17301adding a server definition pointing to that directory in Gnus. The
17302@ref{Article Backlog}, @ref{Asynchronous Fetching} and other things
17303might interfere with overwriting data, so you may want to shut down Gnus
17304before you restore the data.
17305
17306It is also possible to archive individual @code{nnml},
17307@code{nnfolder}, or @code{nnmaildir} groups, while preserving marks.
17308For @code{nnml} or @code{nnmaildir}, you copy all files in the group's
17309directory. For @code{nnfolder} you need to copy both the base folder
17310file itself (@file{FOO}, say), and the marks file (@file{FOO.mrk} in
17311this example). Restoring the group is done with @kbd{G m} from the Group
17312buffer. The last step makes Gnus notice the new directory.
17313@code{nnmaildir} notices the new directory automatically, so @kbd{G m}
17314is unnecessary in that case.
17315
17316@node Web Searches
17317@subsection Web Searches
17318@cindex nnweb
17319@cindex Google
17320@cindex dejanews
17321@cindex gmane
17322@cindex Usenet searches
17323@cindex searching the Usenet
17324
17325It's, like, too neat to search the Usenet for articles that match a
17326string, but it, like, totally @emph{sucks}, like, totally, to use one of
17327those, like, Web browsers, and you, like, have to, rilly, like, look at
17328the commercials, so, like, with Gnus you can do @emph{rad}, rilly,
17329searches without having to use a browser.
17330
17331The @code{nnweb} back end allows an easy interface to the mighty search
17332engine. You create an @code{nnweb} group, enter a search pattern, and
17333then enter the group and read the articles like you would any normal
17334group. The @kbd{G w} command in the group buffer (@pxref{Foreign
17335Groups}) will do this in an easy-to-use fashion.
17336
17337@code{nnweb} groups don't really lend themselves to being solid
17338groups---they have a very fleeting idea of article numbers. In fact,
17339each time you enter an @code{nnweb} group (not even changing the search
17340pattern), you are likely to get the articles ordered in a different
17341manner. Not even using duplicate suppression (@pxref{Duplicate
17342Suppression}) will help, since @code{nnweb} doesn't even know the
17343@code{Message-ID} of the articles before reading them using some search
17344engines (Google, for instance). The only possible way to keep track
17345of which articles you've read is by scoring on the @code{Date}
17346header---mark all articles posted before the last date you read the
17347group as read.
17348
17349If the search engine changes its output substantially, @code{nnweb}
17350won't be able to parse it and will fail. One could hardly fault the Web
01c52d31 17351providers if they were to do this---their @emph{raison d'@^etre} is to
4009494e
GM
17352make money off of advertisements, not to provide services to the
17353community. Since @code{nnweb} washes the ads off all the articles, one
17354might think that the providers might be somewhat miffed. We'll see.
17355
17356You must have the @code{url} and @code{W3} package or those alternatives
17357(try @code{customize-group} on the @samp{mm-url} variable group)
17358installed to be able to use @code{nnweb}.
17359
17360Virtual server variables:
17361
17362@table @code
17363@item nnweb-type
17364@vindex nnweb-type
17365What search engine type is being used. The currently supported types
17366are @code{google}, @code{dejanews}, and @code{gmane}. Note that
17367@code{dejanews} is an alias to @code{google}.
17368
17369@item nnweb-search
17370@vindex nnweb-search
17371The search string to feed to the search engine.
17372
17373@item nnweb-max-hits
17374@vindex nnweb-max-hits
17375Advisory maximum number of hits per search to display. The default is
17376999.
17377
17378@item nnweb-type-definition
17379@vindex nnweb-type-definition
17380Type-to-definition alist. This alist says what @code{nnweb} should do
17381with the various search engine types. The following elements must be
17382present:
17383
17384@table @code
17385@item article
17386Function to decode the article and provide something that Gnus
17387understands.
17388
17389@item map
17390Function to create an article number to message header and URL alist.
17391
17392@item search
17393Function to send the search string to the search engine.
17394
17395@item address
17396The address the aforementioned function should send the search string
17397to.
17398
17399@item id
17400Format string URL to fetch an article by @code{Message-ID}.
17401@end table
17402
17403@end table
17404
17405
17406@node Slashdot
17407@subsection Slashdot
17408@cindex Slashdot
17409@cindex nnslashdot
17410
17411@uref{http://slashdot.org/, Slashdot} is a popular news site, with
17412lively discussion following the news articles. @code{nnslashdot} will
17413let you read this forum in a convenient manner.
17414
17415The easiest way to read this source is to put something like the
17416following in your @file{~/.gnus.el} file:
17417
17418@lisp
17419(setq gnus-secondary-select-methods
17420 '((nnslashdot "")))
17421@end lisp
17422
17423This will make Gnus query the @code{nnslashdot} back end for new comments
17424and groups. The @kbd{F} command will subscribe each new news article as
17425a new Gnus group, and you can read the comments by entering these
17426groups. (Note that the default subscription method is to subscribe new
17427groups as zombies. Other methods are available (@pxref{Subscription
17428Methods}).
17429
17430If you want to remove an old @code{nnslashdot} group, the @kbd{G DEL}
17431command is the most handy tool (@pxref{Foreign Groups}).
17432
17433When following up to @code{nnslashdot} comments (or posting new
17434comments), some light @acronym{HTML}izations will be performed. In
17435particular, text quoted with @samp{> } will be quoted with
17436@samp{blockquote} instead, and signatures will have @samp{br} added to
17437the end of each line. Other than that, you can just write @acronym{HTML}
17438directly into the message buffer. Note that Slashdot filters out some
17439@acronym{HTML} forms.
17440
17441The following variables can be altered to change its behavior:
17442
17443@table @code
17444@item nnslashdot-threaded
17445Whether @code{nnslashdot} should display threaded groups or not. The
17446default is @code{t}. To be able to display threads, @code{nnslashdot}
17447has to retrieve absolutely all comments in a group upon entry. If a
17448threaded display is not required, @code{nnslashdot} will only retrieve
17449the comments that are actually wanted by the user. Threading is nicer,
17450but much, much slower than unthreaded.
17451
17452@item nnslashdot-login-name
17453@vindex nnslashdot-login-name
17454The login name to use when posting.
17455
17456@item nnslashdot-password
17457@vindex nnslashdot-password
17458The password to use when posting.
17459
17460@item nnslashdot-directory
17461@vindex nnslashdot-directory
17462Where @code{nnslashdot} will store its files. The default is
17463@file{~/News/slashdot/}.
17464
17465@item nnslashdot-active-url
17466@vindex nnslashdot-active-url
17467The @acronym{URL} format string that will be used to fetch the
17468information on news articles and comments. The default is@*
17469@samp{http://slashdot.org/search.pl?section=&min=%d}.
17470
17471@item nnslashdot-comments-url
17472@vindex nnslashdot-comments-url
17473The @acronym{URL} format string that will be used to fetch comments.
17474
17475@item nnslashdot-article-url
17476@vindex nnslashdot-article-url
17477The @acronym{URL} format string that will be used to fetch the news
17478article. The default is
17479@samp{http://slashdot.org/article.pl?sid=%s&mode=nocomment}.
17480
17481@item nnslashdot-threshold
17482@vindex nnslashdot-threshold
17483The score threshold. The default is -1.
17484
17485@item nnslashdot-group-number
17486@vindex nnslashdot-group-number
17487The number of old groups, in addition to the ten latest, to keep
17488updated. The default is 0.
17489
17490@end table
17491
17492
17493
17494@node Ultimate
17495@subsection Ultimate
17496@cindex nnultimate
17497@cindex Ultimate Bulletin Board
17498
17499@uref{http://www.ultimatebb.com/, The Ultimate Bulletin Board} is
17500probably the most popular Web bulletin board system used. It has a
17501quite regular and nice interface, and it's possible to get the
17502information Gnus needs to keep groups updated.
17503
17504The easiest way to get started with @code{nnultimate} is to say
17505something like the following in the group buffer: @kbd{B nnultimate RET
17506http://www.tcj.com/messboard/ubbcgi/ RET}. (Substitute the @acronym{URL}
17507(not including @samp{Ultimate.cgi} or the like at the end) for a forum
17508you're interested in; there's quite a list of them on the Ultimate web
17509site.) Then subscribe to the groups you're interested in from the
17510server buffer, and read them from the group buffer.
17511
17512The following @code{nnultimate} variables can be altered:
17513
17514@table @code
17515@item nnultimate-directory
17516@vindex nnultimate-directory
17517The directory where @code{nnultimate} stores its files. The default is@*
17518@file{~/News/ultimate/}.
17519@end table
17520
17521
17522@node Web Archive
17523@subsection Web Archive
17524@cindex nnwarchive
17525@cindex Web Archive
17526
17527Some mailing lists only have archives on Web servers, such as
17528@uref{http://www.egroups.com/} and
17529@uref{http://www.mail-archive.com/}. It has a quite regular and nice
17530interface, and it's possible to get the information Gnus needs to keep
17531groups updated.
17532
17533@findex gnus-group-make-warchive-group
17534The easiest way to get started with @code{nnwarchive} is to say
17535something like the following in the group buffer: @kbd{M-x
17536gnus-group-make-warchive-group RET @var{an_egroup} RET egroups RET
17537www.egroups.com RET @var{your@@email.address} RET}. (Substitute the
17538@var{an_egroup} with the mailing list you subscribed, the
17539@var{your@@email.address} with your email address.), or to browse the
17540back end by @kbd{B nnwarchive RET mail-archive RET}.
17541
17542The following @code{nnwarchive} variables can be altered:
17543
17544@table @code
17545@item nnwarchive-directory
17546@vindex nnwarchive-directory
17547The directory where @code{nnwarchive} stores its files. The default is@*
17548@file{~/News/warchive/}.
17549
17550@item nnwarchive-login
17551@vindex nnwarchive-login
17552The account name on the web server.
17553
17554@item nnwarchive-passwd
17555@vindex nnwarchive-passwd
17556The password for your account on the web server.
17557@end table
17558
17559@node RSS
17560@subsection RSS
17561@cindex nnrss
17562@cindex RSS
17563
17564Some web sites have an RDF Site Summary (@acronym{RSS}).
17565@acronym{RSS} is a format for summarizing headlines from news related
17566sites (such as BBC or CNN). But basically anything list-like can be
17567presented as an @acronym{RSS} feed: weblogs, changelogs or recent
17568changes to a wiki (e.g. @url{http://cliki.net/recent-changes.rdf}).
17569
17570@acronym{RSS} has a quite regular and nice interface, and it's
17571possible to get the information Gnus needs to keep groups updated.
17572
17573Note: you had better use Emacs which supports the @code{utf-8} coding
17574system because @acronym{RSS} uses UTF-8 for encoding non-@acronym{ASCII}
17575text by default. It is also used by default for non-@acronym{ASCII}
17576group names.
17577
17578@kindex G R (Group)
17579Use @kbd{G R} from the group buffer to subscribe to a feed---you will be
17580prompted for the location, the title and the description of the feed.
17581The title, which allows any characters, will be used for the group name
17582and the name of the group data file. The description can be omitted.
17583
17584An easy way to get started with @code{nnrss} is to say something like
17585the following in the group buffer: @kbd{B nnrss RET RET y}, then
17586subscribe to groups.
17587
17588The @code{nnrss} back end saves the group data file in
17589@code{nnrss-directory} (see below) for each @code{nnrss} group. File
17590names containing non-@acronym{ASCII} characters will be encoded by the
17591coding system specified with the @code{nnmail-pathname-coding-system}
17592variable. If it is @code{nil}, in Emacs the coding system defaults to
17593the value of @code{default-file-name-coding-system}. If you are using
17594XEmacs and want to use non-@acronym{ASCII} group names, you should set
17595the value for the @code{nnmail-pathname-coding-system} variable properly.
17596
17597The @code{nnrss} back end generates @samp{multipart/alternative}
17598@acronym{MIME} articles in which each contains a @samp{text/plain} part
17599and a @samp{text/html} part.
17600
17601@cindex OPML
17602You can also use the following commands to import and export your
17603subscriptions from a file in @acronym{OPML} format (Outline Processor
17604Markup Language).
17605
17606@defun nnrss-opml-import file
17607Prompt for an @acronym{OPML} file, and subscribe to each feed in the
17608file.
17609@end defun
17610
17611@defun nnrss-opml-export
17612Write your current @acronym{RSS} subscriptions to a buffer in
17613@acronym{OPML} format.
17614@end defun
17615
17616The following @code{nnrss} variables can be altered:
17617
17618@table @code
17619@item nnrss-directory
17620@vindex nnrss-directory
17621The directory where @code{nnrss} stores its files. The default is
17622@file{~/News/rss/}.
17623
17624@item nnrss-file-coding-system
17625@vindex nnrss-file-coding-system
17626The coding system used when reading and writing the @code{nnrss} groups
17627data files. The default is the value of
17628@code{mm-universal-coding-system} (which defaults to @code{emacs-mule}
17629in Emacs or @code{escape-quoted} in XEmacs).
17630
01c52d31
MB
17631@item nnrss-ignore-article-fields
17632@vindex nnrss-ignore-article-fields
17633Some feeds update constantly article fields during their publications,
17634e.g. to indicate the number of comments. However, if there is
17635a difference between the local article and the distant one, the latter
17636is considered to be new. To avoid this and discard some fields, set this
17637variable to the list of fields to be ignored. The default is
17638@code{'(slash:comments)}.
17639
4009494e
GM
17640@item nnrss-use-local
17641@vindex nnrss-use-local
17642@findex nnrss-generate-download-script
17643If you set @code{nnrss-use-local} to @code{t}, @code{nnrss} will read
17644the feeds from local files in @code{nnrss-directory}. You can use
17645the command @code{nnrss-generate-download-script} to generate a
17646download script using @command{wget}.
17647
17648@item nnrss-wash-html-in-text-plain-parts
17649Non-@code{nil} means that @code{nnrss} renders text in @samp{text/plain}
17650parts as @acronym{HTML}. The function specified by the
17651@code{mm-text-html-renderer} variable (@pxref{Display Customization,
17652,Display Customization, emacs-mime, The Emacs MIME Manual}) will be used
17653to render text. If it is @code{nil}, which is the default, text will
17654simply be folded. Leave it @code{nil} if you prefer to see
17655@samp{text/html} parts.
17656@end table
17657
17658The following code may be helpful, if you want to show the description in
17659the summary buffer.
17660
17661@lisp
17662(add-to-list 'nnmail-extra-headers nnrss-description-field)
17663(setq gnus-summary-line-format "%U%R%z%I%(%[%4L: %-15,15f%]%) %s%uX\n")
17664
17665(defun gnus-user-format-function-X (header)
17666 (let ((descr
17667 (assq nnrss-description-field (mail-header-extra header))))
17668 (if descr (concat "\n\t" (cdr descr)) "")))
17669@end lisp
17670
17671The following code may be useful to open an nnrss url directly from the
17672summary buffer.
17673
17674@lisp
17675(require 'browse-url)
17676
01c52d31 17677(defun browse-nnrss-url (arg)
4009494e
GM
17678 (interactive "p")
17679 (let ((url (assq nnrss-url-field
17680 (mail-header-extra
17681 (gnus-data-header
17682 (assq (gnus-summary-article-number)
17683 gnus-newsgroup-data))))))
17684 (if url
17685 (progn
17686 (browse-url (cdr url))
17687 (gnus-summary-mark-as-read-forward 1))
17688 (gnus-summary-scroll-up arg))))
17689
17690(eval-after-load "gnus"
17691 #'(define-key gnus-summary-mode-map
17692 (kbd "<RET>") 'browse-nnrss-url))
17693(add-to-list 'nnmail-extra-headers nnrss-url-field)
17694@end lisp
17695
9b3ebcb6 17696Even if you have added @samp{text/html} to the
4009494e
GM
17697@code{mm-discouraged-alternatives} variable (@pxref{Display
17698Customization, ,Display Customization, emacs-mime, The Emacs MIME
17699Manual}) since you don't want to see @acronym{HTML} parts, it might be
17700more useful especially in @code{nnrss} groups to display
17701@samp{text/html} parts. Here's an example of setting
17702@code{mm-discouraged-alternatives} as a group parameter (@pxref{Group
17703Parameters}) in order to display @samp{text/html} parts only in
17704@code{nnrss} groups:
17705
17706@lisp
17707;; @r{Set the default value of @code{mm-discouraged-alternatives}.}
17708(eval-after-load "gnus-sum"
17709 '(add-to-list
17710 'gnus-newsgroup-variables
17711 '(mm-discouraged-alternatives
17712 . '("text/html" "image/.*"))))
17713
17714;; @r{Display @samp{text/html} parts in @code{nnrss} groups.}
17715(add-to-list
17716 'gnus-parameters
17717 '("\\`nnrss:" (mm-discouraged-alternatives nil)))
17718@end lisp
17719
17720
17721@node Customizing W3
17722@subsection Customizing W3
17723@cindex W3
17724@cindex html
17725@cindex url
17726@cindex Netscape
17727
17728Gnus uses the url library to fetch web pages and Emacs/W3 (or those
17729alternatives) to display web pages. Emacs/W3 is documented in its own
17730manual, but there are some things that may be more relevant for Gnus
17731users.
17732
17733For instance, a common question is how to make Emacs/W3 follow links
17734using the @code{browse-url} functions (which will call some external web
17735browser like Netscape). Here's one way:
17736
17737@lisp
17738(eval-after-load "w3"
17739 '(progn
17740 (fset 'w3-fetch-orig (symbol-function 'w3-fetch))
17741 (defun w3-fetch (&optional url target)
17742 (interactive (list (w3-read-url-with-default)))
17743 (if (eq major-mode 'gnus-article-mode)
17744 (browse-url url)
17745 (w3-fetch-orig url target)))))
17746@end lisp
17747
17748Put that in your @file{.emacs} file, and hitting links in W3-rendered
17749@acronym{HTML} in the Gnus article buffers will use @code{browse-url} to
17750follow the link.
17751
17752
17753@node IMAP
17754@section IMAP
17755@cindex nnimap
17756@cindex @acronym{IMAP}
17757
17758@acronym{IMAP} is a network protocol for reading mail (or news, or @dots{}),
17759think of it as a modernized @acronym{NNTP}. Connecting to a @acronym{IMAP}
17760server is much similar to connecting to a news server, you just
17761specify the network address of the server.
17762
17763@acronym{IMAP} has two properties. First, @acronym{IMAP} can do
17764everything that @acronym{POP} can, it can hence be viewed as a
17765@acronym{POP++}. Secondly, @acronym{IMAP} is a mail storage protocol,
17766similar to @acronym{NNTP} being a news storage protocol---however,
17767@acronym{IMAP} offers more features than @acronym{NNTP} because news
17768is more or less read-only whereas mail is read-write.
17769
17770If you want to use @acronym{IMAP} as a @acronym{POP++}, use an imap
17771entry in @code{mail-sources}. With this, Gnus will fetch mails from
17772the @acronym{IMAP} server and store them on the local disk. This is
17773not the usage described in this section---@xref{Mail Sources}.
17774
17775If you want to use @acronym{IMAP} as a mail storage protocol, use an nnimap
17776entry in @code{gnus-secondary-select-methods}. With this, Gnus will
17777manipulate mails stored on the @acronym{IMAP} server. This is the kind of
17778usage explained in this section.
17779
17780A server configuration in @file{~/.gnus.el} with a few @acronym{IMAP}
17781servers might look something like the following. (Note that for
17782@acronym{TLS}/@acronym{SSL}, you need external programs and libraries,
17783see below.)
17784
17785@lisp
17786(setq gnus-secondary-select-methods
17787 '((nnimap "simpleserver") ; @r{no special configuration}
17788 ; @r{perhaps a ssh port forwarded server:}
17789 (nnimap "dolk"
17790 (nnimap-address "localhost")
17791 (nnimap-server-port 1430))
17792 ; @r{a UW server running on localhost}
17793 (nnimap "barbar"
17794 (nnimap-server-port 143)
17795 (nnimap-address "localhost")
17796 (nnimap-list-pattern ("INBOX" "mail/*")))
17797 ; @r{anonymous public cyrus server:}
17798 (nnimap "cyrus.andrew.cmu.edu"
17799 (nnimap-authenticator anonymous)
17800 (nnimap-list-pattern "archive.*")
17801 (nnimap-stream network))
17802 ; @r{a ssl server on a non-standard port:}
17803 (nnimap "vic20"
17804 (nnimap-address "vic20.somewhere.com")
17805 (nnimap-server-port 9930)
17806 (nnimap-stream ssl))))
17807@end lisp
17808
17809After defining the new server, you can subscribe to groups on the
17810server using normal Gnus commands such as @kbd{U} in the Group Buffer
17811(@pxref{Subscription Commands}) or via the Server Buffer
17812(@pxref{Server Buffer}).
17813
17814The following variables can be used to create a virtual @code{nnimap}
17815server:
17816
17817@table @code
17818
17819@item nnimap-address
17820@vindex nnimap-address
17821
17822The address of the remote @acronym{IMAP} server. Defaults to the virtual
17823server name if not specified.
17824
17825@item nnimap-server-port
17826@vindex nnimap-server-port
17827Port on server to contact. Defaults to port 143, or 993 for @acronym{TLS}/@acronym{SSL}.
17828
17829Note that this should be an integer, example server specification:
17830
17831@lisp
17832(nnimap "mail.server.com"
17833 (nnimap-server-port 4711))
17834@end lisp
17835
17836@item nnimap-list-pattern
17837@vindex nnimap-list-pattern
17838String or list of strings of mailboxes to limit available groups to.
17839This is used when the server has very many mailboxes and you're only
17840interested in a few---some servers export your home directory via
17841@acronym{IMAP}, you'll probably want to limit the mailboxes to those in
17842@file{~/Mail/*} then.
17843
17844The string can also be a cons of REFERENCE and the string as above, what
17845REFERENCE is used for is server specific, but on the University of
17846Washington server it's a directory that will be concatenated with the
17847mailbox.
17848
17849Example server specification:
17850
17851@lisp
17852(nnimap "mail.server.com"
17853 (nnimap-list-pattern ("INBOX" "Mail/*" "alt.sex.*"
17854 ("~friend/Mail/" . "list/*"))))
17855@end lisp
17856
17857@item nnimap-stream
17858@vindex nnimap-stream
17859The type of stream used to connect to your server. By default, nnimap
17860will detect and automatically use all of the below, with the exception
17861of @acronym{TLS}/@acronym{SSL}. (@acronym{IMAP} over
17862@acronym{TLS}/@acronym{SSL} is being replaced by STARTTLS, which can
17863be automatically detected, but it's not widely deployed yet.)
17864
17865Example server specification:
17866
17867@lisp
17868(nnimap "mail.server.com"
17869 (nnimap-stream ssl))
17870@end lisp
17871
17872Please note that the value of @code{nnimap-stream} is a symbol!
17873
17874@itemize @bullet
17875@item
17876@dfn{gssapi:} Connect with GSSAPI (usually Kerberos 5). Requires the
17877@samp{gsasl} or @samp{imtest} program.
17878@item
17879@dfn{kerberos4:} Connect with Kerberos 4. Requires the @samp{imtest} program.
17880@item
17881@dfn{starttls:} Connect via the STARTTLS extension (similar to
17882@acronym{TLS}/@acronym{SSL}). Requires the external library @samp{starttls.el} and program
17883@samp{starttls}.
17884@item
17885@dfn{tls:} Connect through @acronym{TLS}. Requires GNUTLS (the program
17886@samp{gnutls-cli}).
17887@item
17888@dfn{ssl:} Connect through @acronym{SSL}. Requires OpenSSL (the program
17889@samp{openssl}) or SSLeay (@samp{s_client}).
17890@item
17891@dfn{shell:} Use a shell command to start @acronym{IMAP} connection.
17892@item
17893@dfn{network:} Plain, TCP/IP network connection.
17894@end itemize
17895
17896@vindex imap-kerberos4-program
17897The @samp{imtest} program is shipped with Cyrus IMAPD. If you're
17898using @samp{imtest} from Cyrus IMAPD < 2.0.14 (which includes version
178991.5.x and 1.6.x) you need to frob @code{imap-process-connection-type}
17900to make @code{imap.el} use a pty instead of a pipe when communicating
17901with @samp{imtest}. You will then suffer from a line length
17902restrictions on @acronym{IMAP} commands, which might make Gnus seem to hang
17903indefinitely if you have many articles in a mailbox. The variable
17904@code{imap-kerberos4-program} contain parameters to pass to the imtest
17905program.
17906
17907For @acronym{TLS} connection, the @code{gnutls-cli} program from GNUTLS is
17908needed. It is available from
17909@uref{http://www.gnu.org/software/gnutls/}.
17910
17911@vindex imap-gssapi-program
17912This parameter specifies a list of command lines that invoke a GSSAPI
17913authenticated @acronym{IMAP} stream in a subshell. They are tried
17914sequentially until a connection is made, or the list has been
17915exhausted. By default, @samp{gsasl} from GNU SASL, available from
17916@uref{http://www.gnu.org/software/gsasl/}, and the @samp{imtest}
17917program from Cyrus IMAPD (see @code{imap-kerberos4-program}), are
17918tried.
17919
17920@vindex imap-ssl-program
17921For @acronym{SSL} connections, the OpenSSL program is available from
17922@uref{http://www.openssl.org/}. OpenSSL was formerly known as SSLeay,
17923and nnimap support it too---although the most recent versions of
17924SSLeay, 0.9.x, are known to have serious bugs making it
17925useless. Earlier versions, especially 0.8.x, of SSLeay are known to
17926work. The variable @code{imap-ssl-program} contain parameters to pass
17927to OpenSSL/SSLeay.
17928
17929@vindex imap-shell-program
17930@vindex imap-shell-host
01c52d31
MB
17931For @acronym{IMAP} connections using the @code{shell} stream, the
17932variable @code{imap-shell-program} specify what program to call. Make
17933sure nothing is interfering with the output of the program, e.g., don't
17934forget to redirect the error output to the void.
4009494e
GM
17935
17936@item nnimap-authenticator
17937@vindex nnimap-authenticator
17938
17939The authenticator used to connect to the server. By default, nnimap
17940will use the most secure authenticator your server is capable of.
17941
17942Example server specification:
17943
17944@lisp
17945(nnimap "mail.server.com"
17946 (nnimap-authenticator anonymous))
17947@end lisp
17948
17949Please note that the value of @code{nnimap-authenticator} is a symbol!
17950
17951@itemize @bullet
17952@item
17953@dfn{gssapi:} GSSAPI (usually kerberos 5) authentication. Requires
17954external program @code{gsasl} or @code{imtest}.
17955@item
17956@dfn{kerberos4:} Kerberos 4 authentication. Requires external program
17957@code{imtest}.
17958@item
17959@dfn{digest-md5:} Encrypted username/password via DIGEST-MD5. Requires
17960external library @code{digest-md5.el}.
17961@item
17962@dfn{cram-md5:} Encrypted username/password via CRAM-MD5.
17963@item
17964@dfn{login:} Plain-text username/password via LOGIN.
17965@item
17966@dfn{anonymous:} Login as ``anonymous'', supplying your email address as password.
17967@end itemize
17968
17969@item nnimap-expunge-on-close
17970@cindex expunging
17971@vindex nnimap-expunge-on-close
17972Unlike Parmenides the @acronym{IMAP} designers have decided things that
17973don't exist actually do exist. More specifically, @acronym{IMAP} has
17974this concept of marking articles @code{Deleted} which doesn't actually
17975delete them, and this (marking them @code{Deleted}, that is) is what
17976nnimap does when you delete an article in Gnus (with @kbd{B DEL} or
17977similar).
17978
17979Since the articles aren't really removed when we mark them with the
17980@code{Deleted} flag we'll need a way to actually delete them. Feel like
17981running in circles yet?
17982
17983Traditionally, nnimap has removed all articles marked as @code{Deleted}
17984when closing a mailbox but this is now configurable by this server
17985variable.
17986
17987The possible options are:
17988
17989@table @code
17990
17991@item always
17992The default behavior, delete all articles marked as ``Deleted'' when
17993closing a mailbox.
17994@item never
17995Never actually delete articles. Currently there is no way of showing
17996the articles marked for deletion in nnimap, but other @acronym{IMAP} clients
17997may allow you to do this. If you ever want to run the EXPUNGE command
17998manually, @xref{Expunging mailboxes}.
17999@item ask
18000When closing mailboxes, nnimap will ask if you wish to expunge deleted
18001articles or not.
18002
18003@end table
18004
18005@item nnimap-importantize-dormant
18006@vindex nnimap-importantize-dormant
18007
18008If non-@code{nil} (the default), marks dormant articles as ticked (as
18009well), for other @acronym{IMAP} clients. Within Gnus, dormant articles will
18010naturally still (only) be marked as dormant. This is to make dormant
18011articles stand out, just like ticked articles, in other @acronym{IMAP}
18012clients. (In other words, Gnus has two ``Tick'' marks and @acronym{IMAP}
18013has only one.)
18014
18015Probably the only reason for frobbing this would be if you're trying
18016enable per-user persistent dormant flags, using something like:
18017
18018@lisp
18019(setcdr (assq 'dormant nnimap-mark-to-flag-alist)
18020 (format "gnus-dormant-%s" (user-login-name)))
18021(setcdr (assq 'dormant nnimap-mark-to-predicate-alist)
18022 (format "KEYWORD gnus-dormant-%s" (user-login-name)))
18023@end lisp
18024
18025In this case, you would not want the per-user dormant flag showing up
18026as ticked for other users.
18027
18028@item nnimap-expunge-search-string
18029@cindex expunging
18030@vindex nnimap-expunge-search-string
18031@cindex expiring @acronym{IMAP} mail
18032
18033This variable contain the @acronym{IMAP} search command sent to server when
18034searching for articles eligible for expiring. The default is
18035@code{"UID %s NOT SINCE %s"}, where the first @code{%s} is replaced by
18036UID set and the second @code{%s} is replaced by a date.
18037
18038Probably the only useful value to change this to is
18039@code{"UID %s NOT SENTSINCE %s"}, which makes nnimap use the Date: in
18040messages instead of the internal article date. See section 6.4.4 of
18041RFC 2060 for more information on valid strings.
18042
18043However, if @code{nnimap-search-uids-not-since-is-evil}
18044is true, this variable has no effect since the search logic
18045is reversed, as described below.
18046
18047@item nnimap-authinfo-file
18048@vindex nnimap-authinfo-file
18049
18050A file containing credentials used to log in on servers. The format is
18051(almost) the same as the @code{ftp} @file{~/.netrc} file. See the
18052variable @code{nntp-authinfo-file} for exact syntax; also see
18053@ref{NNTP}. An example of an .authinfo line for an IMAP server, is:
18054
18055@example
18056machine students.uio.no login larsi password geheimnis port imap
18057@end example
18058
18059Note that it should be @code{port imap}, or @code{port 143}, if you
18060use a @code{nnimap-stream} of @code{tls} or @code{ssl}, even if the
18061actual port number used is port 993 for secured IMAP. For
18062convenience, Gnus will accept @code{port imaps} as a synonym of
18063@code{port imap}.
18064
18065@item nnimap-need-unselect-to-notice-new-mail
18066@vindex nnimap-need-unselect-to-notice-new-mail
18067
18068Unselect mailboxes before looking for new mail in them. Some servers
18069seem to need this under some circumstances; it was reported that
18070Courier 1.7.1 did.
18071
18072@item nnimap-nov-is-evil
18073@vindex nnimap-nov-is-evil
18074@cindex Courier @acronym{IMAP} server
18075@cindex @acronym{NOV}
18076
18077Never generate or use a local @acronym{NOV} database. Defaults to the
18078value of @code{gnus-agent}.
18079
18080Using a @acronym{NOV} database usually makes header fetching much
18081faster, but it uses the @code{UID SEARCH UID} command, which is very
18082slow on some servers (notably some versions of Courier). Since the Gnus
18083Agent caches the information in the @acronym{NOV} database without using
18084the slow command, this variable defaults to true if the Agent is in use,
18085and false otherwise.
18086
18087@item nnimap-search-uids-not-since-is-evil
18088@vindex nnimap-search-uids-not-since-is-evil
18089@cindex Courier @acronym{IMAP} server
18090@cindex expiring @acronym{IMAP} mail
18091
18092Avoid the @code{UID SEARCH UID @var{message numbers} NOT SINCE
18093@var{date}} command, which is slow on some @acronym{IMAP} servers
18094(notably, some versions of Courier). Instead, use @code{UID SEARCH SINCE
18095@var{date}} and prune the list of expirable articles within Gnus.
18096
18097When Gnus expires your mail (@pxref{Expiring Mail}), it starts with a
18098list of expirable articles and asks the IMAP server questions like ``Of
18099these articles, which ones are older than a week?'' While this seems
18100like a perfectly reasonable question, some IMAP servers take a long time
18101to answer it, since they seemingly go looking into every old article to
18102see if it is one of the expirable ones. Curiously, the question ``Of
18103@emph{all} articles, which ones are newer than a week?'' seems to be
18104much faster to answer, so setting this variable causes Gnus to ask this
18105question and figure out the answer to the real question itself.
18106
18107This problem can really sneak up on you: when you first configure Gnus,
18108everything works fine, but once you accumulate a couple thousand
18109messages, you start cursing Gnus for being so slow. On the other hand,
18110if you get a lot of email within a week, setting this variable will
18111cause a lot of network traffic between Gnus and the IMAP server.
18112
01c52d31
MB
18113@item nnimap-logout-timeout
18114@vindex nnimap-logout-timeout
18115
18116There is a case where a connection to a @acronym{IMAP} server is unable
18117to close, when connecting to the server via a certain kind of network,
18118e.g. @acronym{VPN}. In that case, it will be observed that a connection
18119between Emacs and the local network looks alive even if the server has
18120closed a connection for some reason (typically, a timeout).
18121Consequently, Emacs continues waiting for a response from the server for
18122the @code{LOGOUT} command that Emacs sent, or hangs in other words. If
18123you are in such a network, setting this variable to a number of seconds
18124will be helpful. If it is set, a hung connection will be closed
18125forcibly, after this number of seconds from the time Emacs sends the
18126@code{LOGOUT} command. It should not be too small value but too large
18127value will be inconvenient too. Perhaps the value 1.0 will be a good
18128candidate but it might be worth trying some other values.
18129
18130Example server specification:
18131
18132@lisp
18133(nnimap "mail.server.com"
18134 (nnimap-logout-timeout 1.0))
18135@end lisp
18136
4009494e
GM
18137@end table
18138
18139@menu
18140* Splitting in IMAP:: Splitting mail with nnimap.
18141* Expiring in IMAP:: Expiring mail with nnimap.
18142* Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox.
18143* Expunging mailboxes:: Equivalent of a ``compress mailbox'' button.
18144* A note on namespaces:: How to (not) use @acronym{IMAP} namespace in Gnus.
18145* Debugging IMAP:: What to do when things don't work.
18146@end menu
18147
18148
18149
18150@node Splitting in IMAP
18151@subsection Splitting in IMAP
18152@cindex splitting imap mail
18153
18154Splitting is something Gnus users have loved and used for years, and now
18155the rest of the world is catching up. Yeah, dream on, not many
18156@acronym{IMAP} servers have server side splitting and those that have
18157splitting seem to use some non-standard protocol. This means that
18158@acronym{IMAP} support for Gnus has to do its own splitting.
18159
18160And it does.
18161
18162(Incidentally, people seem to have been dreaming on, and Sieve has
18163gaining a market share and is supported by several IMAP servers.
18164Fortunately, Gnus support it too, @xref{Sieve Commands}.)
18165
18166Here are the variables of interest:
18167
18168@table @code
18169
18170@item nnimap-split-crosspost
18171@cindex splitting, crosspost
18172@cindex crosspost
18173@vindex nnimap-split-crosspost
18174
18175If non-@code{nil}, do crossposting if several split methods match the
18176mail. If @code{nil}, the first match in @code{nnimap-split-rule}
18177found will be used.
18178
18179Nnmail equivalent: @code{nnmail-crosspost}.
18180
18181@item nnimap-split-inbox
18182@cindex splitting, inbox
18183@cindex inbox
18184@vindex nnimap-split-inbox
18185
18186A string or a list of strings that gives the name(s) of @acronym{IMAP}
18187mailboxes to split from. Defaults to @code{nil}, which means that
18188splitting is disabled!
18189
18190@lisp
18191(setq nnimap-split-inbox
18192 '("INBOX" ("~/friend/Mail" . "lists/*") "lists.imap"))
18193@end lisp
18194
18195No nnmail equivalent.
18196
18197@item nnimap-split-rule
18198@cindex splitting, rules
18199@vindex nnimap-split-rule
18200
18201New mail found in @code{nnimap-split-inbox} will be split according to
18202this variable.
18203
18204This variable contains a list of lists, where the first element in the
18205sublist gives the name of the @acronym{IMAP} mailbox to move articles
18206matching the regexp in the second element in the sublist. Got that?
18207Neither did I, we need examples.
18208
18209@lisp
18210(setq nnimap-split-rule
18211 '(("INBOX.nnimap"
18212 "^Sender: owner-nnimap@@vic20.globalcom.se")
18213 ("INBOX.junk" "^Subject:.*MAKE MONEY")
18214 ("INBOX.private" "")))
18215@end lisp
18216
18217This will put all articles from the nnimap mailing list into mailbox
18218INBOX.nnimap, all articles containing MAKE MONEY in the Subject: line
18219into INBOX.junk and everything else in INBOX.private.
18220
18221The first string may contain @samp{\\1} forms, like the ones used by
18222replace-match to insert sub-expressions from the matched text. For
18223instance:
18224
18225@lisp
18226("INBOX.lists.\\1" "^Sender: owner-\\([a-z-]+\\)@@")
18227@end lisp
18228
18229The first element can also be the symbol @code{junk} to indicate that
18230matching messages should simply be deleted. Use with care.
18231
18232The second element can also be a function. In that case, it will be
18233called with the first element of the rule as the argument, in a buffer
18234containing the headers of the article. It should return a
18235non-@code{nil} value if it thinks that the mail belongs in that group.
18236
18237Nnmail users might recollect that the last regexp had to be empty to
18238match all articles (like in the example above). This is not required in
18239nnimap. Articles not matching any of the regexps will not be moved out
18240of your inbox. (This might affect performance if you keep lots of
18241unread articles in your inbox, since the splitting code would go over
18242them every time you fetch new mail.)
18243
18244These rules are processed from the beginning of the alist toward the
18245end. The first rule to make a match will ``win'', unless you have
18246crossposting enabled. In that case, all matching rules will ``win''.
18247
18248This variable can also have a function as its value, the function will
18249be called with the headers narrowed and should return a group where it
18250thinks the article should be split to. See @code{nnimap-split-fancy}.
18251
18252The splitting code tries to create mailboxes if it needs to.
18253
18254To allow for different split rules on different virtual servers, and
18255even different split rules in different inboxes on the same server,
18256the syntax of this variable have been extended along the lines of:
18257
18258@lisp
18259(setq nnimap-split-rule
18260 '(("my1server" (".*" (("ding" "ding@@gnus.org")
18261 ("junk" "From:.*Simon"))))
18262 ("my2server" ("INBOX" nnimap-split-fancy))
18263 ("my[34]server" (".*" (("private" "To:.*Simon")
18264 ("junk" my-junk-func))))))
18265@end lisp
18266
18267The virtual server name is in fact a regexp, so that the same rules
18268may apply to several servers. In the example, the servers
18269@code{my3server} and @code{my4server} both use the same rules.
18270Similarly, the inbox string is also a regexp. The actual splitting
18271rules are as before, either a function, or a list with group/regexp or
18272group/function elements.
18273
18274Nnmail equivalent: @code{nnmail-split-methods}.
18275
18276@item nnimap-split-predicate
18277@cindex splitting
18278@vindex nnimap-split-predicate
18279
18280Mail matching this predicate in @code{nnimap-split-inbox} will be
18281split, it is a string and the default is @samp{UNSEEN UNDELETED}.
18282
18283This might be useful if you use another @acronym{IMAP} client to read mail in
18284your inbox but would like Gnus to split all articles in the inbox
18285regardless of readedness. Then you might change this to
18286@samp{UNDELETED}.
18287
18288@item nnimap-split-fancy
18289@cindex splitting, fancy
18290@findex nnimap-split-fancy
18291@vindex nnimap-split-fancy
18292
18293It's possible to set @code{nnimap-split-rule} to
18294@code{nnmail-split-fancy} if you want to use fancy
18295splitting. @xref{Fancy Mail Splitting}.
18296
18297However, to be able to have different fancy split rules for nnmail and
18298nnimap back ends you can set @code{nnimap-split-rule} to
18299@code{nnimap-split-fancy} and define the nnimap specific fancy split
18300rule in @code{nnimap-split-fancy}.
18301
18302Example:
18303
18304@lisp
18305(setq nnimap-split-rule 'nnimap-split-fancy
18306 nnimap-split-fancy ...)
18307@end lisp
18308
18309Nnmail equivalent: @code{nnmail-split-fancy}.
18310
18311@item nnimap-split-download-body
18312@findex nnimap-split-download-body
18313@vindex nnimap-split-download-body
18314
18315Set to non-@code{nil} to download entire articles during splitting.
18316This is generally not required, and will slow things down
18317considerably. You may need it if you want to use an advanced
18318splitting function that analyzes the body to split the article.
18319
18320@end table
18321
18322@node Expiring in IMAP
18323@subsection Expiring in IMAP
18324@cindex expiring @acronym{IMAP} mail
18325
18326Even though @code{nnimap} is not a proper @code{nnmail} derived back
18327end, it supports most features in regular expiring (@pxref{Expiring
18328Mail}). Unlike splitting in @acronym{IMAP} (@pxref{Splitting in
18329IMAP}) it does not clone the @code{nnmail} variables (i.e., creating
18330@var{nnimap-expiry-wait}) but reuse the @code{nnmail} variables. What
18331follows below are the variables used by the @code{nnimap} expiry
18332process.
18333
18334A note on how the expire mark is stored on the @acronym{IMAP} server is
18335appropriate here as well. The expire mark is translated into a
18336@code{imap} client specific mark, @code{gnus-expire}, and stored on the
18337message. This means that likely only Gnus will understand and treat
18338the @code{gnus-expire} mark properly, although other clients may allow
18339you to view client specific flags on the message. It also means that
18340your server must support permanent storage of client specific flags on
18341messages. Most do, fortunately.
18342
18343If expiring @acronym{IMAP} mail seems very slow, try setting the server
18344variable @code{nnimap-search-uids-not-since-is-evil}.
18345
18346@table @code
18347
18348@item nnmail-expiry-wait
18349@item nnmail-expiry-wait-function
18350
18351These variables are fully supported. The expire value can be a
18352number, the symbol @code{immediate} or @code{never}.
18353
18354@item nnmail-expiry-target
18355
18356This variable is supported, and internally implemented by calling the
18357@code{nnmail} functions that handle this. It contains an optimization
18358that if the destination is a @acronym{IMAP} group on the same server, the
18359article is copied instead of appended (that is, uploaded again).
18360
18361@end table
18362
18363@node Editing IMAP ACLs
18364@subsection Editing IMAP ACLs
18365@cindex editing imap acls
18366@cindex Access Control Lists
18367@cindex Editing @acronym{IMAP} ACLs
18368@kindex G l (Group)
18369@findex gnus-group-nnimap-edit-acl
18370
18371ACL stands for Access Control List. ACLs are used in @acronym{IMAP} for
18372limiting (or enabling) other users access to your mail boxes. Not all
18373@acronym{IMAP} servers support this, this function will give an error if it
18374doesn't.
18375
18376To edit an ACL for a mailbox, type @kbd{G l}
18377(@code{gnus-group-edit-nnimap-acl}) and you'll be presented with an ACL
18378editing window with detailed instructions.
18379
18380Some possible uses:
18381
18382@itemize @bullet
18383@item
18384Giving ``anyone'' the ``lrs'' rights (lookup, read, keep seen/unseen flags)
18385on your mailing list mailboxes enables other users on the same server to
18386follow the list without subscribing to it.
18387@item
18388At least with the Cyrus server, you are required to give the user
18389``anyone'' posting ("p") capabilities to have ``plussing'' work (that is,
18390mail sent to user+mailbox@@domain ending up in the @acronym{IMAP} mailbox
18391INBOX.mailbox).
18392@end itemize
18393
18394@node Expunging mailboxes
18395@subsection Expunging mailboxes
18396@cindex expunging
18397
18398@cindex expunge
18399@cindex manual expunging
18400@kindex G x (Group)
18401@findex gnus-group-nnimap-expunge
18402
18403If you're using the @code{never} setting of @code{nnimap-expunge-on-close},
18404you may want the option of expunging all deleted articles in a mailbox
18405manually. This is exactly what @kbd{G x} does.
18406
18407Currently there is no way of showing deleted articles, you can just
18408delete them.
18409
18410@node A note on namespaces
18411@subsection A note on namespaces
18412@cindex IMAP namespace
18413@cindex namespaces
18414
18415The @acronym{IMAP} protocol has a concept called namespaces, described
18416by the following text in the RFC2060:
18417
18418@display
184195.1.2. Mailbox Namespace Naming Convention
18420
18421 By convention, the first hierarchical element of any mailbox name
18422 which begins with "#" identifies the "namespace" of the remainder of
18423 the name. This makes it possible to disambiguate between different
18424 types of mailbox stores, each of which have their own namespaces.
18425
18426 For example, implementations which offer access to USENET
18427 newsgroups MAY use the "#news" namespace to partition the USENET
18428 newsgroup namespace from that of other mailboxes. Thus, the
18429 comp.mail.misc newsgroup would have an mailbox name of
18430 "#news.comp.mail.misc", and the name "comp.mail.misc" could refer
18431 to a different object (e.g. a user's private mailbox).
18432@end display
18433
18434While there is nothing in this text that warrants concern for the
18435@acronym{IMAP} implementation in Gnus, some servers use namespace
18436prefixes in a way that does not work with how Gnus uses mailbox names.
18437
18438Specifically, University of Washington's @acronym{IMAP} server uses
18439mailbox names like @code{#driver.mbx/read-mail} which are valid only
18440in the @sc{create} and @sc{append} commands. After the mailbox is
18441created (or a messages is appended to a mailbox), it must be accessed
18442without the namespace prefix, i.e. @code{read-mail}. Since Gnus do
18443not make it possible for the user to guarantee that user entered
18444mailbox names will only be used with the CREATE and APPEND commands,
18445you should simply not use the namespace prefixed mailbox names in
18446Gnus.
18447
18448See the UoW IMAPD documentation for the @code{#driver.*/} prefix
18449for more information on how to use the prefixes. They are a power
18450tool and should be used only if you are sure what the effects are.
18451
18452@node Debugging IMAP
18453@subsection Debugging IMAP
18454@cindex IMAP debugging
18455@cindex protocol dump (IMAP)
18456
18457@acronym{IMAP} is a complex protocol, more so than @acronym{NNTP} or
18458@acronym{POP3}. Implementation bugs are not unlikely, and we do our
18459best to fix them right away. If you encounter odd behavior, chances
18460are that either the server or Gnus is buggy.
18461
18462If you are familiar with network protocols in general, you will
18463probably be able to extract some clues from the protocol dump of the
18464exchanges between Gnus and the server. Even if you are not familiar
18465with network protocols, when you include the protocol dump in
18466@acronym{IMAP}-related bug reports you are helping us with data
18467critical to solving the problem. Therefore, we strongly encourage you
18468to include the protocol dump when reporting IMAP bugs in Gnus.
18469
18470
18471@vindex imap-log
18472Because the protocol dump, when enabled, generates lots of data, it is
18473disabled by default. You can enable it by setting @code{imap-log} as
18474follows:
18475
18476@lisp
18477(setq imap-log t)
18478@end lisp
18479
18480This instructs the @code{imap.el} package to log any exchanges with
18481the server. The log is stored in the buffer @samp{*imap-log*}. Look
18482for error messages, which sometimes are tagged with the keyword
18483@code{BAD}---but when submitting a bug, make sure to include all the
18484data.
18485
18486@node Other Sources
18487@section Other Sources
18488
18489Gnus can do more than just read news or mail. The methods described
18490below allow Gnus to view directories and files as if they were
18491newsgroups.
18492
18493@menu
18494* Directory Groups:: You can read a directory as if it was a newsgroup.
18495* Anything Groups:: Dired? Who needs dired?
18496* Document Groups:: Single files can be the basis of a group.
18497* SOUP:: Reading @sc{soup} packets ``offline''.
18498* Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
18499@end menu
18500
18501
18502@node Directory Groups
18503@subsection Directory Groups
18504@cindex nndir
18505@cindex directory groups
18506
18507If you have a directory that has lots of articles in separate files in
18508it, you might treat it as a newsgroup. The files have to have numerical
18509names, of course.
18510
18511This might be an opportune moment to mention @code{ange-ftp} (and its
18512successor @code{efs}), that most wonderful of all wonderful Emacs
18513packages. When I wrote @code{nndir}, I didn't think much about it---a
18514back end to read directories. Big deal.
18515
18516@code{ange-ftp} changes that picture dramatically. For instance, if you
18517enter the @code{ange-ftp} file name
18518@file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the directory name,
18519@code{ange-ftp} or @code{efs} will actually allow you to read this
18520directory over at @samp{sina} as a newsgroup. Distributed news ahoy!
18521
18522@code{nndir} will use @acronym{NOV} files if they are present.
18523
18524@code{nndir} is a ``read-only'' back end---you can't delete or expire
18525articles with this method. You can use @code{nnmh} or @code{nnml} for
18526whatever you use @code{nndir} for, so you could switch to any of those
18527methods if you feel the need to have a non-read-only @code{nndir}.
18528
18529
18530@node Anything Groups
18531@subsection Anything Groups
18532@cindex nneething
18533
18534From the @code{nndir} back end (which reads a single spool-like
18535directory), it's just a hop and a skip to @code{nneething}, which
18536pretends that any arbitrary directory is a newsgroup. Strange, but
18537true.
18538
18539When @code{nneething} is presented with a directory, it will scan this
18540directory and assign article numbers to each file. When you enter such
18541a group, @code{nneething} must create ``headers'' that Gnus can use.
18542After all, Gnus is a newsreader, in case you're forgetting.
18543@code{nneething} does this in a two-step process. First, it snoops each
18544file in question. If the file looks like an article (i.e., the first
18545few lines look like headers), it will use this as the head. If this is
18546just some arbitrary file without a head (e.g. a C source file),
18547@code{nneething} will cobble up a header out of thin air. It will use
18548file ownership, name and date and do whatever it can with these
18549elements.
18550
18551All this should happen automatically for you, and you will be presented
18552with something that looks very much like a newsgroup. Totally like a
18553newsgroup, to be precise. If you select an article, it will be displayed
18554in the article buffer, just as usual.
18555
18556If you select a line that represents a directory, Gnus will pop you into
18557a new summary buffer for this @code{nneething} group. And so on. You can
18558traverse the entire disk this way, if you feel like, but remember that
18559Gnus is not dired, really, and does not intend to be, either.
18560
18561There are two overall modes to this action---ephemeral or solid. When
18562doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus
18563will not store information on what files you have read, and what files
18564are new, and so on. If you create a solid @code{nneething} group the
18565normal way with @kbd{G m}, Gnus will store a mapping table between
18566article numbers and file names, and you can treat this group like any
18567other groups. When you activate a solid @code{nneething} group, you will
18568be told how many unread articles it contains, etc., etc.
18569
18570Some variables:
18571
18572@table @code
18573@item nneething-map-file-directory
18574@vindex nneething-map-file-directory
18575All the mapping files for solid @code{nneething} groups will be stored
18576in this directory, which defaults to @file{~/.nneething/}.
18577
18578@item nneething-exclude-files
18579@vindex nneething-exclude-files
18580All files that match this regexp will be ignored. Nice to use to exclude
18581auto-save files and the like, which is what it does by default.
18582
18583@item nneething-include-files
18584@vindex nneething-include-files
18585Regexp saying what files to include in the group. If this variable is
18586non-@code{nil}, only files matching this regexp will be included.
18587
18588@item nneething-map-file
18589@vindex nneething-map-file
18590Name of the map files.
18591@end table
18592
18593
18594@node Document Groups
18595@subsection Document Groups
18596@cindex nndoc
18597@cindex documentation group
18598@cindex help group
18599
18600@code{nndoc} is a cute little thing that will let you read a single file
18601as a newsgroup. Several files types are supported:
18602
18603@table @code
18604@cindex Babyl
18605@cindex Rmail mbox
18606@item babyl
18607The Babyl (Rmail) mail box.
18608
18609@cindex mbox
18610@cindex Unix mbox
18611@item mbox
18612The standard Unix mbox file.
18613
18614@cindex MMDF mail box
18615@item mmdf
18616The MMDF mail box format.
18617
18618@item news
18619Several news articles appended into a file.
18620
18621@cindex rnews batch files
18622@item rnews
18623The rnews batch transport format.
18624
18625@item nsmail
18626Netscape mail boxes.
18627
18628@item mime-parts
18629@acronym{MIME} multipart messages.
18630
18631@item standard-digest
18632The standard (RFC 1153) digest format.
18633
18634@item mime-digest
18635A @acronym{MIME} digest of messages.
18636
18637@item lanl-gov-announce
18638Announcement messages from LANL Gov Announce.
18639
18640@cindex forwarded messages
18641@item rfc822-forward
18642A message forwarded according to RFC822.
18643
18644@item outlook
18645The Outlook mail box.
18646
18647@item oe-dbx
18648The Outlook Express dbx mail box.
18649
18650@item exim-bounce
18651A bounce message from the Exim MTA.
18652
18653@item forward
18654A message forwarded according to informal rules.
18655
18656@item rfc934
18657An RFC934-forwarded message.
18658
18659@item mailman
18660A mailman digest.
18661
18662@item clari-briefs
18663A digest of Clarinet brief news items.
18664
18665@item slack-digest
18666Non-standard digest format---matches most things, but does it badly.
18667
18668@item mail-in-mail
18669The last resort.
18670@end table
18671
18672You can also use the special ``file type'' @code{guess}, which means
18673that @code{nndoc} will try to guess what file type it is looking at.
18674@code{digest} means that @code{nndoc} should guess what digest type the
18675file is.
18676
18677@code{nndoc} will not try to change the file or insert any extra headers into
18678it---it will simply, like, let you use the file as the basis for a
18679group. And that's it.
18680
18681If you have some old archived articles that you want to insert into your
18682new & spiffy Gnus mail back end, @code{nndoc} can probably help you with
18683that. Say you have an old @file{RMAIL} file with mail that you now want
18684to split into your new @code{nnml} groups. You look at that file using
18685@code{nndoc} (using the @kbd{G f} command in the group buffer
18686(@pxref{Foreign Groups})), set the process mark on all the articles in
18687the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r})
18688using @code{nnml}. If all goes well, all the mail in the @file{RMAIL}
18689file is now also stored in lots of @code{nnml} directories, and you can
18690delete that pesky @file{RMAIL} file. If you have the guts!
18691
18692Virtual server variables:
18693
18694@table @code
18695@item nndoc-article-type
18696@vindex nndoc-article-type
18697This should be one of @code{mbox}, @code{babyl}, @code{digest},
18698@code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
18699@code{rfc822-forward}, @code{mime-parts}, @code{standard-digest},
18700@code{slack-digest}, @code{clari-briefs}, @code{nsmail}, @code{outlook},
18701@code{oe-dbx}, @code{mailman}, and @code{mail-in-mail} or @code{guess}.
18702
18703@item nndoc-post-type
18704@vindex nndoc-post-type
18705This variable says whether Gnus is to consider the group a news group or
18706a mail group. There are two valid values: @code{mail} (the default)
18707and @code{news}.
18708@end table
18709
18710@menu
18711* Document Server Internals:: How to add your own document types.
18712@end menu
18713
18714
18715@node Document Server Internals
18716@subsubsection Document Server Internals
18717
18718Adding new document types to be recognized by @code{nndoc} isn't
18719difficult. You just have to whip up a definition of what the document
18720looks like, write a predicate function to recognize that document type,
18721and then hook into @code{nndoc}.
18722
18723First, here's an example document type definition:
18724
18725@example
18726(mmdf
18727 (article-begin . "^\^A\^A\^A\^A\n")
18728 (body-end . "^\^A\^A\^A\^A\n"))
18729@end example
18730
18731The definition is simply a unique @dfn{name} followed by a series of
18732regexp pseudo-variable settings. Below are the possible
18733variables---don't be daunted by the number of variables; most document
18734types can be defined with very few settings:
18735
18736@table @code
18737@item first-article
18738If present, @code{nndoc} will skip past all text until it finds
18739something that match this regexp. All text before this will be
18740totally ignored.
18741
18742@item article-begin
18743This setting has to be present in all document type definitions. It
18744says what the beginning of each article looks like. To do more
18745complicated things that cannot be dealt with a simple regexp, you can
18746use @code{article-begin-function} instead of this.
18747
18748@item article-begin-function
18749If present, this should be a function that moves point to the beginning
18750of each article. This setting overrides @code{article-begin}.
18751
18752@item head-begin
18753If present, this should be a regexp that matches the head of the
18754article. To do more complicated things that cannot be dealt with a
18755simple regexp, you can use @code{head-begin-function} instead of this.
18756
18757@item head-begin-function
18758If present, this should be a function that moves point to the head of
18759the article. This setting overrides @code{head-begin}.
18760
18761@item head-end
18762This should match the end of the head of the article. It defaults to
18763@samp{^$}---the empty line.
18764
18765@item body-begin
18766This should match the beginning of the body of the article. It defaults
18767to @samp{^\n}. To do more complicated things that cannot be dealt with
18768a simple regexp, you can use @code{body-begin-function} instead of this.
18769
18770@item body-begin-function
18771If present, this function should move point to the beginning of the body
18772of the article. This setting overrides @code{body-begin}.
18773
18774@item body-end
18775If present, this should match the end of the body of the article. To do
18776more complicated things that cannot be dealt with a simple regexp, you
18777can use @code{body-end-function} instead of this.
18778
18779@item body-end-function
18780If present, this function should move point to the end of the body of
18781the article. This setting overrides @code{body-end}.
18782
18783@item file-begin
18784If present, this should match the beginning of the file. All text
18785before this regexp will be totally ignored.
18786
18787@item file-end
18788If present, this should match the end of the file. All text after this
18789regexp will be totally ignored.
18790
18791@end table
18792
18793So, using these variables @code{nndoc} is able to dissect a document
18794file into a series of articles, each with a head and a body. However, a
18795few more variables are needed since not all document types are all that
18796news-like---variables needed to transform the head or the body into
18797something that's palatable for Gnus:
18798
18799@table @code
18800@item prepare-body-function
18801If present, this function will be called when requesting an article. It
18802will be called with point at the start of the body, and is useful if the
18803document has encoded some parts of its contents.
18804
18805@item article-transform-function
18806If present, this function is called when requesting an article. It's
18807meant to be used for more wide-ranging transformation of both head and
18808body of the article.
18809
18810@item generate-head-function
18811If present, this function is called to generate a head that Gnus can
18812understand. It is called with the article number as a parameter, and is
18813expected to generate a nice head for the article in question. It is
18814called when requesting the headers of all articles.
18815
18816@item generate-article-function
18817If present, this function is called to generate an entire article that
18818Gnus can understand. It is called with the article number as a
18819parameter when requesting all articles.
18820
18821@item dissection-function
18822If present, this function is called to dissect a document by itself,
18823overriding @code{first-article}, @code{article-begin},
18824@code{article-begin-function}, @code{head-begin},
18825@code{head-begin-function}, @code{head-end}, @code{body-begin},
18826@code{body-begin-function}, @code{body-end}, @code{body-end-function},
18827@code{file-begin}, and @code{file-end}.
18828
18829@end table
18830
18831Let's look at the most complicated example I can come up with---standard
18832digests:
18833
18834@example
18835(standard-digest
18836 (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+"))
18837 (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+"))
18838 (prepare-body-function . nndoc-unquote-dashes)
18839 (body-end-function . nndoc-digest-body-end)
18840 (head-end . "^ ?$")
18841 (body-begin . "^ ?\n")
18842 (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
18843 (subtype digest guess))
18844@end example
18845
18846We see that all text before a 70-width line of dashes is ignored; all
18847text after a line that starts with that @samp{^End of} is also ignored;
18848each article begins with a 30-width line of dashes; the line separating
18849the head from the body may contain a single space; and that the body is
18850run through @code{nndoc-unquote-dashes} before being delivered.
18851
18852To hook your own document definition into @code{nndoc}, use the
18853@code{nndoc-add-type} function. It takes two parameters---the first
18854is the definition itself and the second (optional) parameter says
18855where in the document type definition alist to put this definition.
18856The alist is traversed sequentially, and
18857@code{nndoc-@var{type}-type-p} is called for a given type @var{type}.
18858So @code{nndoc-mmdf-type-p} is called to see whether a document is of
18859@code{mmdf} type, and so on. These type predicates should return
18860@code{nil} if the document is not of the correct type; @code{t} if it
18861is of the correct type; and a number if the document might be of the
18862correct type. A high number means high probability; a low number
18863means low probability with @samp{0} being the lowest valid number.
18864
18865
18866@node SOUP
18867@subsection SOUP
18868@cindex SOUP
18869@cindex offline
18870
18871In the PC world people often talk about ``offline'' newsreaders. These
18872are thingies that are combined reader/news transport monstrosities.
18873With built-in modem programs. Yecchh!
18874
18875Of course, us Unix Weenie types of human beans use things like
18876@code{uucp} and, like, @code{nntpd} and set up proper news and mail
18877transport things like Ghod intended. And then we just use normal
18878newsreaders.
18879
18880However, it can sometimes be convenient to do something that's a bit
18881easier on the brain if you have a very slow modem, and you're not really
18882that interested in doing things properly.
18883
18884A file format called @sc{soup} has been developed for transporting news
18885and mail from servers to home machines and back again. It can be a bit
18886fiddly.
18887
18888First some terminology:
18889
18890@table @dfn
18891
18892@item server
18893This is the machine that is connected to the outside world and where you
18894get news and/or mail from.
18895
18896@item home machine
18897This is the machine that you want to do the actual reading and responding
18898on. It is typically not connected to the rest of the world in any way.
18899
18900@item packet
18901Something that contains messages and/or commands. There are two kinds
18902of packets:
18903
18904@table @dfn
18905@item message packets
18906These are packets made at the server, and typically contain lots of
18907messages for you to read. These are called @file{SoupoutX.tgz} by
18908default, where @var{x} is a number.
18909
18910@item response packets
18911These are packets made at the home machine, and typically contains
18912replies that you've written. These are called @file{SoupinX.tgz} by
18913default, where @var{x} is a number.
18914
18915@end table
18916
18917@end table
18918
18919
18920@enumerate
18921
18922@item
18923You log in on the server and create a @sc{soup} packet. You can either
18924use a dedicated @sc{soup} thingie (like the @code{awk} program), or you
18925can use Gnus to create the packet with its @sc{soup} commands (@kbd{O
18926s} and/or @kbd{G s b}; and then @kbd{G s p}) (@pxref{SOUP Commands}).
18927
18928@item
18929You transfer the packet home. Rail, boat, car or modem will do fine.
18930
18931@item
18932You put the packet in your home directory.
18933
18934@item
18935You fire up Gnus on your home machine using the @code{nnsoup} back end as
18936the native or secondary server.
18937
18938@item
18939You read articles and mail and answer and followup to the things you
18940want (@pxref{SOUP Replies}).
18941
18942@item
18943You do the @kbd{G s r} command to pack these replies into a @sc{soup}
18944packet.
18945
18946@item
18947You transfer this packet to the server.
18948
18949@item
18950You use Gnus to mail this packet out with the @kbd{G s s} command.
18951
18952@item
18953You then repeat until you die.
18954
18955@end enumerate
18956
18957So you basically have a bipartite system---you use @code{nnsoup} for
18958reading and Gnus for packing/sending these @sc{soup} packets.
18959
18960@menu
18961* SOUP Commands:: Commands for creating and sending @sc{soup} packets
18962* SOUP Groups:: A back end for reading @sc{soup} packets.
18963* SOUP Replies:: How to enable @code{nnsoup} to take over mail and news.
18964@end menu
18965
18966
18967@node SOUP Commands
18968@subsubsection SOUP Commands
18969
18970These are commands for creating and manipulating @sc{soup} packets.
18971
18972@table @kbd
18973@item G s b
18974@kindex G s b (Group)
18975@findex gnus-group-brew-soup
18976Pack all unread articles in the current group
18977(@code{gnus-group-brew-soup}). This command understands the
18978process/prefix convention.
18979
18980@item G s w
18981@kindex G s w (Group)
18982@findex gnus-soup-save-areas
18983Save all @sc{soup} data files (@code{gnus-soup-save-areas}).
18984
18985@item G s s
18986@kindex G s s (Group)
18987@findex gnus-soup-send-replies
18988Send all replies from the replies packet
18989(@code{gnus-soup-send-replies}).
18990
18991@item G s p
18992@kindex G s p (Group)
18993@findex gnus-soup-pack-packet
18994Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}).
18995
18996@item G s r
18997@kindex G s r (Group)
18998@findex nnsoup-pack-replies
18999Pack all replies into a replies packet (@code{nnsoup-pack-replies}).
19000
19001@item O s
19002@kindex O s (Summary)
19003@findex gnus-soup-add-article
19004This summary-mode command adds the current article to a @sc{soup} packet
19005(@code{gnus-soup-add-article}). It understands the process/prefix
19006convention (@pxref{Process/Prefix}).
19007
19008@end table
19009
19010
19011There are a few variables to customize where Gnus will put all these
19012thingies:
19013
19014@table @code
19015
19016@item gnus-soup-directory
19017@vindex gnus-soup-directory
19018Directory where Gnus will save intermediate files while composing
19019@sc{soup} packets. The default is @file{~/SoupBrew/}.
19020
19021@item gnus-soup-replies-directory
19022@vindex gnus-soup-replies-directory
19023This is what Gnus will use as a temporary directory while sending our
19024reply packets. @file{~/SoupBrew/SoupReplies/} is the default.
19025
19026@item gnus-soup-prefix-file
19027@vindex gnus-soup-prefix-file
19028Name of the file where Gnus stores the last used prefix. The default is
19029@samp{gnus-prefix}.
19030
19031@item gnus-soup-packer
19032@vindex gnus-soup-packer
19033A format string command for packing a @sc{soup} packet. The default is
19034@samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}.
19035
19036@item gnus-soup-unpacker
19037@vindex gnus-soup-unpacker
19038Format string command for unpacking a @sc{soup} packet. The default is
19039@samp{gunzip -c %s | tar xvf -}.
19040
19041@item gnus-soup-packet-directory
19042@vindex gnus-soup-packet-directory
19043Where Gnus will look for reply packets. The default is @file{~/}.
19044
19045@item gnus-soup-packet-regexp
19046@vindex gnus-soup-packet-regexp
19047Regular expression matching @sc{soup} reply packets in
19048@code{gnus-soup-packet-directory}.
19049
19050@end table
19051
19052
19053@node SOUP Groups
19054@subsubsection SOUP Groups
19055@cindex nnsoup
19056
19057@code{nnsoup} is the back end for reading @sc{soup} packets. It will
19058read incoming packets, unpack them, and put them in a directory where
19059you can read them at leisure.
19060
19061These are the variables you can use to customize its behavior:
19062
19063@table @code
19064
19065@item nnsoup-tmp-directory
19066@vindex nnsoup-tmp-directory
19067When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this
19068directory. (@file{/tmp/} by default.)
19069
19070@item nnsoup-directory
19071@vindex nnsoup-directory
19072@code{nnsoup} then moves each message and index file to this directory.
19073The default is @file{~/SOUP/}.
19074
19075@item nnsoup-replies-directory
19076@vindex nnsoup-replies-directory
19077All replies will be stored in this directory before being packed into a
19078reply packet. The default is @file{~/SOUP/replies/}.
19079
19080@item nnsoup-replies-format-type
19081@vindex nnsoup-replies-format-type
19082The @sc{soup} format of the replies packets. The default is @samp{?n}
19083(rnews), and I don't think you should touch that variable. I probably
19084shouldn't even have documented it. Drats! Too late!
19085
19086@item nnsoup-replies-index-type
19087@vindex nnsoup-replies-index-type
19088The index type of the replies packet. The default is @samp{?n}, which
19089means ``none''. Don't fiddle with this one either!
19090
19091@item nnsoup-active-file
19092@vindex nnsoup-active-file
19093Where @code{nnsoup} stores lots of information. This is not an ``active
19094file'' in the @code{nntp} sense; it's an Emacs Lisp file. If you lose
19095this file or mess it up in any way, you're dead. The default is
19096@file{~/SOUP/active}.
19097
19098@item nnsoup-packer
19099@vindex nnsoup-packer
19100Format string command for packing a reply @sc{soup} packet. The default
19101is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}.
19102
19103@item nnsoup-unpacker
19104@vindex nnsoup-unpacker
19105Format string command for unpacking incoming @sc{soup} packets. The
19106default is @samp{gunzip -c %s | tar xvf -}.
19107
19108@item nnsoup-packet-directory
19109@vindex nnsoup-packet-directory
19110Where @code{nnsoup} will look for incoming packets. The default is
19111@file{~/}.
19112
19113@item nnsoup-packet-regexp
19114@vindex nnsoup-packet-regexp
19115Regular expression matching incoming @sc{soup} packets. The default is
19116@samp{Soupout}.
19117
19118@item nnsoup-always-save
19119@vindex nnsoup-always-save
19120If non-@code{nil}, save the replies buffer after each posted message.
19121
19122@end table
19123
19124
19125@node SOUP Replies
19126@subsubsection SOUP Replies
19127
19128Just using @code{nnsoup} won't mean that your postings and mailings end
19129up in @sc{soup} reply packets automagically. You have to work a bit
19130more for that to happen.
19131
19132@findex nnsoup-set-variables
19133The @code{nnsoup-set-variables} command will set the appropriate
19134variables to ensure that all your followups and replies end up in the
19135@sc{soup} system.
19136
19137In specific, this is what it does:
19138
19139@lisp
19140(setq message-send-news-function 'nnsoup-request-post)
19141(setq message-send-mail-function 'nnsoup-request-mail)
19142@end lisp
19143
19144And that's it, really. If you only want news to go into the @sc{soup}
19145system you just use the first line. If you only want mail to be
19146@sc{soup}ed you use the second.
19147
19148
19149@node Mail-To-News Gateways
19150@subsection Mail-To-News Gateways
19151@cindex mail-to-news gateways
19152@cindex gateways
19153
19154If your local @code{nntp} server doesn't allow posting, for some reason
19155or other, you can post using one of the numerous mail-to-news gateways.
19156The @code{nngateway} back end provides the interface.
19157
19158Note that you can't read anything from this back end---it can only be
19159used to post with.
19160
19161Server variables:
19162
19163@table @code
19164@item nngateway-address
19165@vindex nngateway-address
19166This is the address of the mail-to-news gateway.
19167
19168@item nngateway-header-transformation
19169@vindex nngateway-header-transformation
19170News headers often have to be transformed in some odd way or other
19171for the mail-to-news gateway to accept it. This variable says what
19172transformation should be called, and defaults to
19173@code{nngateway-simple-header-transformation}. The function is called
19174narrowed to the headers to be transformed and with one parameter---the
19175gateway address.
19176
19177This default function just inserts a new @code{To} header based on the
19178@code{Newsgroups} header and the gateway address.
19179For instance, an article with this @code{Newsgroups} header:
19180
19181@example
19182Newsgroups: alt.religion.emacs
19183@end example
19184
19185will get this @code{To} header inserted:
19186
19187@example
19188To: alt-religion-emacs@@GATEWAY
19189@end example
19190
19191The following pre-defined functions exist:
19192
19193@findex nngateway-simple-header-transformation
19194@table @code
19195
19196@item nngateway-simple-header-transformation
19197Creates a @code{To} header that looks like
19198@var{newsgroup}@@@code{nngateway-address}.
19199
19200@findex nngateway-mail2news-header-transformation
19201
19202@item nngateway-mail2news-header-transformation
19203Creates a @code{To} header that looks like
19204@code{nngateway-address}.
19205@end table
19206
19207@end table
19208
19209Here's an example:
19210
19211@lisp
19212(setq gnus-post-method
19213 '(nngateway
19214 "mail2news@@replay.com"
19215 (nngateway-header-transformation
19216 nngateway-mail2news-header-transformation)))
19217@end lisp
19218
19219So, to use this, simply say something like:
19220
19221@lisp
19222(setq gnus-post-method '(nngateway "GATEWAY.ADDRESS"))
19223@end lisp
19224
19225
19226
19227@node Combined Groups
19228@section Combined Groups
19229
19230Gnus allows combining a mixture of all the other group types into bigger
19231groups.
19232
19233@menu
19234* Virtual Groups:: Combining articles from many groups.
19235* Kibozed Groups:: Looking through parts of the newsfeed for articles.
19236@end menu
19237
19238
19239@node Virtual Groups
19240@subsection Virtual Groups
19241@cindex nnvirtual
19242@cindex virtual groups
19243@cindex merging groups
19244
19245An @dfn{nnvirtual group} is really nothing more than a collection of
19246other groups.
19247
19248For instance, if you are tired of reading many small groups, you can
19249put them all in one big group, and then grow tired of reading one
19250big, unwieldy group. The joys of computing!
19251
19252You specify @code{nnvirtual} as the method. The address should be a
19253regexp to match component groups.
19254
19255All marks in the virtual group will stick to the articles in the
19256component groups. So if you tick an article in a virtual group, the
19257article will also be ticked in the component group from whence it
19258came. (And vice versa---marks from the component groups will also be
19259shown in the virtual group.). To create an empty virtual group, run
19260@kbd{G V} (@code{gnus-group-make-empty-virtual}) in the group buffer
19261and edit the method regexp with @kbd{M-e}
19262(@code{gnus-group-edit-group-method})
19263
19264Here's an example @code{nnvirtual} method that collects all Andrea Dworkin
19265newsgroups into one, big, happy newsgroup:
19266
19267@lisp
19268(nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*")
19269@end lisp
19270
19271The component groups can be native or foreign; everything should work
19272smoothly, but if your computer explodes, it was probably my fault.
19273
19274Collecting the same group from several servers might actually be a good
19275idea if users have set the Distribution header to limit distribution.
19276If you would like to read @samp{soc.motss} both from a server in Japan
19277and a server in Norway, you could use the following as the group regexp:
19278
19279@example
19280"^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$"
19281@end example
19282
19283(Remember, though, that if you're creating the group with @kbd{G m}, you
19284shouldn't double the backslashes, and you should leave off the quote
19285characters at the beginning and the end of the string.)
19286
19287This should work kinda smoothly---all articles from both groups should
19288end up in this one, and there should be no duplicates. Threading (and
19289the rest) will still work as usual, but there might be problems with the
19290sequence of articles. Sorting on date might be an option here
19291(@pxref{Selecting a Group}).
19292
19293One limitation, however---all groups included in a virtual
19294group have to be alive (i.e., subscribed or unsubscribed). Killed or
19295zombie groups can't be component groups for @code{nnvirtual} groups.
19296
19297@vindex nnvirtual-always-rescan
19298If the @code{nnvirtual-always-rescan} variable is non-@code{nil} (which
19299is the default), @code{nnvirtual} will always scan groups for unread
19300articles when entering a virtual group. If this variable is @code{nil}
19301and you read articles in a component group after the virtual group has
19302been activated, the read articles from the component group will show up
19303when you enter the virtual group. You'll also see this effect if you
19304have two virtual groups that have a component group in common. If
19305that's the case, you should set this variable to @code{t}. Or you can
19306just tap @code{M-g} on the virtual group every time before you enter
19307it---it'll have much the same effect.
19308
19309@code{nnvirtual} can have both mail and news groups as component groups.
19310When responding to articles in @code{nnvirtual} groups, @code{nnvirtual}
19311has to ask the back end of the component group the article comes from
19312whether it is a news or mail back end. However, when you do a @kbd{^},
19313there is typically no sure way for the component back end to know this,
19314and in that case @code{nnvirtual} tells Gnus that the article came from a
19315not-news back end. (Just to be on the safe side.)
19316
19317@kbd{C-c C-n} in the message buffer will insert the @code{Newsgroups}
19318line from the article you respond to in these cases.
19319
19320@code{nnvirtual} groups do not inherit anything but articles and marks
19321from component groups---group parameters, for instance, are not
19322inherited.
19323
19324
19325@node Kibozed Groups
19326@subsection Kibozed Groups
19327@cindex nnkiboze
19328@cindex kibozing
19329
19330@dfn{Kibozing} is defined by the @acronym{OED} as ``grepping through
19331(parts of) the news feed''. @code{nnkiboze} is a back end that will
19332do this for you. Oh joy! Now you can grind any @acronym{NNTP} server
19333down to a halt with useless requests! Oh happiness!
19334
19335@kindex G k (Group)
19336To create a kibozed group, use the @kbd{G k} command in the group
19337buffer.
19338
19339The address field of the @code{nnkiboze} method is, as with
19340@code{nnvirtual}, a regexp to match groups to be ``included'' in the
19341@code{nnkiboze} group. That's where most similarities between
19342@code{nnkiboze} and @code{nnvirtual} end.
19343
19344In addition to this regexp detailing component groups, an
19345@code{nnkiboze} group must have a score file to say what articles are
19346to be included in the group (@pxref{Scoring}).
19347
19348@kindex M-x nnkiboze-generate-groups
19349@findex nnkiboze-generate-groups
19350You must run @kbd{M-x nnkiboze-generate-groups} after creating the
19351@code{nnkiboze} groups you want to have. This command will take time.
19352Lots of time. Oodles and oodles of time. Gnus has to fetch the
19353headers from all the articles in all the component groups and run them
19354through the scoring process to determine if there are any articles in
19355the groups that are to be part of the @code{nnkiboze} groups.
19356
19357Please limit the number of component groups by using restrictive
19358regexps. Otherwise your sysadmin may become annoyed with you, and the
19359@acronym{NNTP} site may throw you off and never let you back in again.
19360Stranger things have happened.
19361
19362@code{nnkiboze} component groups do not have to be alive---they can be dead,
19363and they can be foreign. No restrictions.
19364
19365@vindex nnkiboze-directory
19366The generation of an @code{nnkiboze} group means writing two files in
19367@code{nnkiboze-directory}, which is @file{~/News/kiboze/} by default.
19368One contains the @acronym{NOV} header lines for all the articles in
19369the group, and the other is an additional @file{.newsrc} file to store
19370information on what groups have been searched through to find
19371component articles.
19372
19373Articles marked as read in the @code{nnkiboze} group will have
19374their @acronym{NOV} lines removed from the @acronym{NOV} file.
19375
19376
19377@node Email Based Diary
19378@section Email Based Diary
19379@cindex diary
19380@cindex email based diary
19381@cindex calendar
19382
19383This section describes a special mail back end called @code{nndiary},
19384and its companion library @code{gnus-diary}. It is ``special'' in the
19385sense that it is not meant to be one of the standard alternatives for
19386reading mail with Gnus. See @ref{Choosing a Mail Back End} for that.
19387Instead, it is used to treat @emph{some} of your mails in a special way,
19388namely, as event reminders.
19389
19390Here is a typical scenario:
19391
19392@itemize @bullet
19393@item
19394You've got a date with Andy Mc Dowell or Bruce Willis (select according
19395to your sexual preference) in one month. You don't want to forget it.
19396@item
19397So you send a ``reminder'' message (actually, a diary one) to yourself.
19398@item
19399You forget all about it and keep on getting and reading new mail, as usual.
19400@item
19401From time to time, as you type `g' in the group buffer and as the date
19402is getting closer, the message will pop up again to remind you of your
19403appointment, just as if it were new and unread.
19404@item
19405Read your ``new'' messages, this one included, and start dreaming again
19406of the night you're gonna have.
19407@item
19408Once the date is over (you actually fell asleep just after dinner), the
19409message will be automatically deleted if it is marked as expirable.
19410@end itemize
19411
19412The Gnus Diary back end has the ability to handle regular appointments
19413(that wouldn't ever be deleted) as well as punctual ones, operates as a
19414real mail back end and is configurable in many ways. All of this is
19415explained in the sections below.
19416
19417@menu
19418* The NNDiary Back End:: Basic setup and usage.
19419* The Gnus Diary Library:: Utility toolkit on top of nndiary.
19420* Sending or Not Sending:: A final note on sending diary messages.
19421@end menu
19422
19423
19424@node The NNDiary Back End
19425@subsection The NNDiary Back End
19426@cindex nndiary
19427@cindex the nndiary back end
19428
19429@code{nndiary} is a back end very similar to @code{nnml} (@pxref{Mail
19430Spool}). Actually, it could appear as a mix of @code{nnml} and
19431@code{nndraft}. If you know @code{nnml}, you're already familiar with
19432the message storing scheme of @code{nndiary}: one file per message, one
19433directory per group.
19434
19435 Before anything, there is one requirement to be able to run
19436@code{nndiary} properly: you @emph{must} use the group timestamp feature
19437of Gnus. This adds a timestamp to each group's parameters. @ref{Group
19438Timestamp} to see how it's done.
19439
19440@menu
19441* Diary Messages:: What makes a message valid for nndiary.
19442* Running NNDiary:: NNDiary has two modes of operation.
19443* Customizing NNDiary:: Bells and whistles.
19444@end menu
19445
19446@node Diary Messages
19447@subsubsection Diary Messages
19448@cindex nndiary messages
19449@cindex nndiary mails
19450
19451@code{nndiary} messages are just normal ones, except for the mandatory
19452presence of 7 special headers. These headers are of the form
19453@code{X-Diary-<something>}, @code{<something>} being one of
19454@code{Minute}, @code{Hour}, @code{Dom}, @code{Month}, @code{Year},
19455@code{Time-Zone} and @code{Dow}. @code{Dom} means ``Day of Month'', and
19456@code{dow} means ``Day of Week''. These headers actually behave like
19457crontab specifications and define the event date(s):
19458
19459@itemize @bullet
19460@item
19461For all headers except the @code{Time-Zone} one, a header value is
19462either a star (meaning all possible values), or a list of fields
19463(separated by a comma).
19464@item
19465A field is either an integer, or a range.
19466@item
19467A range is two integers separated by a dash.
19468@item
19469Possible integer values are 0--59 for @code{Minute}, 0--23 for
19470@code{Hour}, 1--31 for @code{Dom}, 1--12 for @code{Month}, above 1971
19471for @code{Year} and 0--6 for @code{Dow} (0 meaning Sunday).
19472@item
19473As a special case, a star in either @code{Dom} or @code{Dow} doesn't
19474mean ``all possible values'', but ``use only the other field''. Note
19475that if both are star'ed, the use of either one gives the same result.
19476@item
19477The @code{Time-Zone} header is special in that it can only have one
19478value (@code{GMT}, for instance). A star doesn't mean ``all possible
19479values'' (because it makes no sense), but ``the current local time
19480zone''. Most of the time, you'll be using a star here. However, for a
19481list of available time zone values, see the variable
19482@code{nndiary-headers}.
19483@end itemize
19484
19485As a concrete example, here are the diary headers to add to your message
19486for specifying ``Each Monday and each 1st of month, at 12:00, 20:00,
1948721:00, 22:00, 23:00 and 24:00, from 1999 to 2010'' (I'll let you find
19488what to do then):
19489
19490@example
19491X-Diary-Minute: 0
19492X-Diary-Hour: 12, 20-24
19493X-Diary-Dom: 1
19494X-Diary-Month: *
19495X-Diary-Year: 1999-2010
19496X-Diary-Dow: 1
19497X-Diary-Time-Zone: *
19498@end example
19499
19500@node Running NNDiary
19501@subsubsection Running NNDiary
19502@cindex running nndiary
19503@cindex nndiary operation modes
19504
19505@code{nndiary} has two modes of operation: ``traditional'' (the default)
19506and ``autonomous''. In traditional mode, @code{nndiary} does not get new
19507mail by itself. You have to move (@kbd{B m}) or copy (@kbd{B c}) mails
19508from your primary mail back end to nndiary groups in order to handle them
19509as diary messages. In autonomous mode, @code{nndiary} retrieves its own
19510mail and handles it independently from your primary mail back end.
19511
19512One should note that Gnus is not inherently designed to allow several
19513``master'' mail back ends at the same time. However, this does make
19514sense with @code{nndiary}: you really want to send and receive diary
19515messages to your diary groups directly. So, @code{nndiary} supports
19516being sort of a ``second primary mail back end'' (to my knowledge, it is
19517the only back end offering this feature). However, there is a limitation
19518(which I hope to fix some day): respooling doesn't work in autonomous
19519mode.
19520
19521In order to use @code{nndiary} in autonomous mode, you have several
19522things to do:
19523
19524@itemize @bullet
19525@item
19526Allow @code{nndiary} to retrieve new mail by itself. Put the following
19527line in your @file{~/.gnus.el} file:
19528
19529@lisp
19530(setq nndiary-get-new-mail t)
19531@end lisp
19532@item
19533You must arrange for diary messages (those containing @code{X-Diary-*}
19534headers) to be split in a private folder @emph{before} Gnus treat them.
19535Again, this is needed because Gnus cannot (yet ?) properly handle
19536multiple primary mail back ends. Getting those messages from a separate
19537source will compensate this misfeature to some extent.
19538
19539As an example, here's my procmailrc entry to store diary files in
19540@file{~/.nndiary} (the default @code{nndiary} mail source file):
19541
19542@example
19543:0 HD :
19544* ^X-Diary
19545.nndiary
19546@end example
19547@end itemize
19548
19549Once this is done, you might want to customize the following two options
19550that affect the diary mail retrieval and splitting processes:
19551
19552@defvar nndiary-mail-sources
19553This is the diary-specific replacement for the standard
19554@code{mail-sources} variable. It obeys the same syntax, and defaults to
19555@code{(file :path "~/.nndiary")}.
19556@end defvar
19557
19558@defvar nndiary-split-methods
19559This is the diary-specific replacement for the standard
19560@code{nnmail-split-methods} variable. It obeys the same syntax.
19561@end defvar
19562
19563 Finally, you may add a permanent @code{nndiary} virtual server
19564(something like @code{(nndiary "diary")} should do) to your
19565@code{gnus-secondary-select-methods}.
19566
19567 Hopefully, almost everything (see the TODO section in
19568@file{nndiary.el}) will work as expected when you restart Gnus: in
19569autonomous mode, typing @kbd{g} and @kbd{M-g} in the group buffer, will
19570also get your new diary mails and split them according to your
19571diary-specific rules, @kbd{F} will find your new diary groups etc.
19572
19573@node Customizing NNDiary
19574@subsubsection Customizing NNDiary
19575@cindex customizing nndiary
19576@cindex nndiary customization
19577
19578Now that @code{nndiary} is up and running, it's time to customize it.
19579The custom group is called @code{nndiary} (no, really ?!). You should
19580browse it to figure out which options you'd like to tweak. The following
19581two variables are probably the only ones you will want to change:
19582
19583@defvar nndiary-reminders
19584This is the list of times when you want to be reminded of your
19585appointments (e.g. 3 weeks before, then 2 days before, then 1 hour
19586before and that's it). Remember that ``being reminded'' means that the
19587diary message will pop up as brand new and unread again when you get new
19588mail.
19589@end defvar
19590
19591@defvar nndiary-week-starts-on-monday
19592Rather self-explanatory. Otherwise, Sunday is assumed (this is the
19593default).
19594@end defvar
19595
19596
19597@node The Gnus Diary Library
19598@subsection The Gnus Diary Library
19599@cindex gnus-diary
19600@cindex the gnus diary library
19601
19602Using @code{nndiary} manually (I mean, writing the headers by hand and
19603so on) would be rather boring. Fortunately, there is a library called
19604@code{gnus-diary} written on top of @code{nndiary}, that does many
19605useful things for you.
19606
19607 In order to use it, add the following line to your @file{~/.gnus.el} file:
19608
19609@lisp
19610(require 'gnus-diary)
19611@end lisp
19612
19613 Also, you shouldn't use any @code{gnus-user-format-function-[d|D]}
19614(@pxref{Summary Buffer Lines}). @code{gnus-diary} provides both of these
19615(sorry if you used them before).
19616
19617
19618@menu
19619* Diary Summary Line Format:: A nicer summary buffer line format.
19620* Diary Articles Sorting:: A nicer way to sort messages.
19621* Diary Headers Generation:: Not doing it manually.
19622* Diary Group Parameters:: Not handling them manually.
19623@end menu
19624
19625@node Diary Summary Line Format
19626@subsubsection Diary Summary Line Format
19627@cindex diary summary buffer line
19628@cindex diary summary line format
19629
19630Displaying diary messages in standard summary line format (usually
19631something like @samp{From Joe: Subject}) is pretty useless. Most of
19632the time, you're the one who wrote the message, and you mostly want to
19633see the event's date.
19634
19635 @code{gnus-diary} provides two supplemental user formats to be used in
19636summary line formats. @code{D} corresponds to a formatted time string
19637for the next occurrence of the event (e.g. ``Sat, Sep 22 01, 12:00''),
19638while @code{d} corresponds to an approximative remaining time until the
19639next occurrence of the event (e.g. ``in 6 months, 1 week'').
19640
19641 For example, here's how Joe's birthday is displayed in my
19642@code{nndiary+diary:birthdays} summary buffer (note that the message is
19643expirable, but will never be deleted, as it specifies a periodic event):
19644
19645@example
19646 E Sat, Sep 22 01, 12:00: Joe's birthday (in 6 months, 1 week)
19647@end example
19648
19649In order to get something like the above, you would normally add the
19650following line to your diary groups'parameters:
19651
19652@lisp
19653(gnus-summary-line-format "%U%R%z %uD: %(%s%) (%ud)\n")
19654@end lisp
19655
19656However, @code{gnus-diary} does it automatically (@pxref{Diary Group
19657Parameters}). You can however customize the provided summary line format
19658with the following user options:
19659
19660@defvar gnus-diary-summary-line-format
19661Defines the summary line format used for diary groups (@pxref{Summary
19662Buffer Lines}). @code{gnus-diary} uses it to automatically update the
19663diary groups'parameters.
19664@end defvar
19665
19666@defvar gnus-diary-time-format
19667Defines the format to display dates in diary summary buffers. This is
19668used by the @code{D} user format. See the docstring for details.
19669@end defvar
19670
19671@defvar gnus-diary-delay-format-function
19672Defines the format function to use for displaying delays (remaining
19673times) in diary summary buffers. This is used by the @code{d} user
19674format. There are currently built-in functions for English and French;
19675you can also define your own. See the docstring for details.
19676@end defvar
19677
19678@node Diary Articles Sorting
19679@subsubsection Diary Articles Sorting
19680@cindex diary articles sorting
19681@cindex diary summary lines sorting
19682@findex gnus-summary-sort-by-schedule
19683@findex gnus-thread-sort-by-schedule
19684@findex gnus-article-sort-by-schedule
19685
19686@code{gnus-diary} provides new sorting functions (@pxref{Sorting the
19687Summary Buffer} ) called @code{gnus-summary-sort-by-schedule},
19688@code{gnus-thread-sort-by-schedule} and
19689@code{gnus-article-sort-by-schedule}. These functions let you organize
19690your diary summary buffers from the closest event to the farthest one.
19691
19692@code{gnus-diary} automatically installs
19693@code{gnus-summary-sort-by-schedule} as a menu item in the summary
19694buffer's ``sort'' menu, and the two others as the primary (hence
19695default) sorting functions in the group parameters (@pxref{Diary Group
19696Parameters}).
19697
19698@node Diary Headers Generation
19699@subsubsection Diary Headers Generation
19700@cindex diary headers generation
19701@findex gnus-diary-check-message
19702
19703@code{gnus-diary} provides a function called
19704@code{gnus-diary-check-message} to help you handle the @code{X-Diary-*}
19705headers. This function ensures that the current message contains all the
19706required diary headers, and prompts you for values or corrections if
19707needed.
19708
19709 This function is hooked into the @code{nndiary} back end, so that
19710moving or copying an article to a diary group will trigger it
d55fe5bb
MB
19711automatically. It is also bound to @kbd{C-c C-f d} in
19712@code{message-mode} and @code{article-edit-mode} in order to ease the
19713process of converting a usual mail to a diary one.
4009494e
GM
19714
19715 This function takes a prefix argument which will force prompting of
19716all diary headers, regardless of their presence or validity. That way,
19717you can very easily reschedule an already valid diary message, for
19718instance.
19719
19720@node Diary Group Parameters
19721@subsubsection Diary Group Parameters
19722@cindex diary group parameters
19723
19724When you create a new diary group, or visit one, @code{gnus-diary}
19725automatically checks your group parameters and if needed, sets the
19726summary line format to the diary-specific value, installs the
19727diary-specific sorting functions, and also adds the different
19728@code{X-Diary-*} headers to the group's posting-style. It is then easier
19729to send a diary message, because if you use @kbd{C-u a} or @kbd{C-u m}
19730on a diary group to prepare a message, these headers will be inserted
19731automatically (although not filled with proper values yet).
19732
19733@node Sending or Not Sending
19734@subsection Sending or Not Sending
19735
19736Well, assuming you've read all of the above, here are two final notes on
19737mail sending with @code{nndiary}:
19738
19739@itemize @bullet
19740@item
19741@code{nndiary} is a @emph{real} mail back end. You really send real diary
19742messsages for real. This means for instance that you can give
19743appointments to anybody (provided they use Gnus and @code{nndiary}) by
19744sending the diary message to them as well.
19745@item
19746However, since @code{nndiary} also has a @code{request-post} method, you
19747can also use @kbd{C-u a} instead of @kbd{C-u m} on a diary group and the
19748message won't actually be sent; just stored locally in the group. This
19749comes in very handy for private appointments.
19750@end itemize
19751
19752@node Gnus Unplugged
19753@section Gnus Unplugged
19754@cindex offline
19755@cindex unplugged
19756@cindex agent
19757@cindex Gnus agent
19758@cindex Gnus unplugged
19759
19760In olden times (ca. February '88), people used to run their newsreaders
19761on big machines with permanent connections to the net. News transport
19762was dealt with by news servers, and all the newsreaders had to do was to
19763read news. Believe it or not.
19764
19765Nowadays most people read news and mail at home, and use some sort of
19766modem to connect to the net. To avoid running up huge phone bills, it
19767would be nice to have a way to slurp down all the news and mail, hang up
19768the phone, read for several hours, and then upload any responses you
19769have to make. And then you repeat the procedure.
19770
19771Of course, you can use news servers for doing this as well. I've used
19772@code{inn} together with @code{slurp}, @code{pop} and @code{sendmail}
19773for some years, but doing that's a bore. Moving the news server
19774functionality up to the newsreader makes sense if you're the only person
19775reading news on a machine.
19776
19777Setting up Gnus as an ``offline'' newsreader is quite simple. In
01c52d31
MB
19778fact, you don't have to configure anything as the agent is now enabled
19779by default (@pxref{Agent Variables, gnus-agent}).
4009494e
GM
19780
19781Of course, to use it as such, you have to learn a few new commands.
19782
19783@menu
19784* Agent Basics:: How it all is supposed to work.
19785* Agent Categories:: How to tell the Gnus Agent what to download.
19786* Agent Commands:: New commands for all the buffers.
19787* Agent Visuals:: Ways that the agent may effect your summary buffer.
19788* Agent as Cache:: The Agent is a big cache too.
19789* Agent Expiry:: How to make old articles go away.
19790* Agent Regeneration:: How to recover from lost connections and other accidents.
01c52d31 19791* Agent and flags:: How the Agent maintains flags.
4009494e
GM
19792* Agent and IMAP:: How to use the Agent with @acronym{IMAP}.
19793* Outgoing Messages:: What happens when you post/mail something?
19794* Agent Variables:: Customizing is fun.
19795* Example Setup:: An example @file{~/.gnus.el} file for offline people.
19796* Batching Agents:: How to fetch news from a @code{cron} job.
19797* Agent Caveats:: What you think it'll do and what it does.
19798@end menu
19799
19800
19801@node Agent Basics
19802@subsection Agent Basics
19803
19804First, let's get some terminology out of the way.
19805
19806The Gnus Agent is said to be @dfn{unplugged} when you have severed the
19807connection to the net (and notified the Agent that this is the case).
19808When the connection to the net is up again (and Gnus knows this), the
19809Agent is @dfn{plugged}.
19810
19811The @dfn{local} machine is the one you're running on, and which isn't
19812connected to the net continuously.
19813
19814@dfn{Downloading} means fetching things from the net to your local
19815machine. @dfn{Uploading} is doing the opposite.
19816
19817You know that Gnus gives you all the opportunity you'd ever want for
19818shooting yourself in the foot. Some people call it flexibility. Gnus
19819is also customizable to a great extent, which means that the user has a
19820say on how Gnus behaves. Other newsreaders might unconditionally shoot
19821you in your foot, but with Gnus, you have a choice!
19822
19823Gnus is never really in plugged or unplugged state. Rather, it applies
19824that state to each server individually. This means that some servers
19825can be plugged while others can be unplugged. Additionally, some
19826servers can be ignored by the Agent altogether (which means that
19827they're kinda like plugged always).
19828
19829So when you unplug the Agent and then wonder why is Gnus opening a
19830connection to the Net, the next step to do is to look whether all
19831servers are agentized. If there is an unagentized server, you found
19832the culprit.
19833
19834Another thing is the @dfn{offline} state. Sometimes, servers aren't
19835reachable. When Gnus notices this, it asks you whether you want the
19836server to be switched to offline state. If you say yes, then the
19837server will behave somewhat as if it was unplugged, except that Gnus
19838will ask you whether you want to switch it back online again.
19839
19840Let's take a typical Gnus session using the Agent.
19841
19842@itemize @bullet
19843
19844@item
19845@findex gnus-unplugged
19846You start Gnus with @code{gnus-unplugged}. This brings up the Gnus
19847Agent in a disconnected state. You can read all the news that you have
19848already fetched while in this mode.
19849
19850@item
19851You then decide to see whether any new news has arrived. You connect
19852your machine to the net (using PPP or whatever), and then hit @kbd{J j}
19853to make Gnus become @dfn{plugged} and use @kbd{g} to check for new mail
19854as usual. To check for new mail in unplugged mode (@pxref{Mail
19855Source Specifiers}).
19856
19857@item
19858You can then read the new news immediately, or you can download the
19859news onto your local machine. If you want to do the latter, you press
19860@kbd{g} to check if there are any new news and then @kbd{J s} to fetch
19861all the eligible articles in all the groups. (To let Gnus know which
19862articles you want to download, @pxref{Agent Categories}).
19863
19864@item
19865After fetching the articles, you press @kbd{J j} to make Gnus become
19866unplugged again, and you shut down the PPP thing (or whatever). And
19867then you read the news offline.
19868
19869@item
19870And then you go to step 2.
19871@end itemize
19872
19873Here are some things you should do the first time (or so) that you use
19874the Agent.
19875
19876@itemize @bullet
19877
19878@item
19879Decide which servers should be covered by the Agent. If you have a mail
19880back end, it would probably be nonsensical to have it covered by the
19881Agent. Go to the server buffer (@kbd{^} in the group buffer) and press
19882@kbd{J a} on the server (or servers) that you wish to have covered by the
19883Agent (@pxref{Server Agent Commands}), or @kbd{J r} on automatically
19884added servers you do not wish to have covered by the Agent. By default,
19885all @code{nntp} and @code{nnimap} servers in @code{gnus-select-method} and
19886@code{gnus-secondary-select-methods} are agentized.
19887
19888@item
19889Decide on download policy. It's fairly simple once you decide whether
19890you are going to use agent categories, topic parameters, and/or group
19891parameters to implement your policy. If you're new to gnus, it
19892is probably best to start with a category, @xref{Agent Categories}.
19893
19894Both topic parameters (@pxref{Topic Parameters}) and agent categories
19895(@pxref{Agent Categories}) provide for setting a policy that applies
19896to multiple groups. Which you use is entirely up to you. Topic
19897parameters do override categories so, if you mix the two, you'll have
19898to take that into account. If you have a few groups that deviate from
19899your policy, you can use group parameters (@pxref{Group Parameters}) to
19900configure them.
19901
19902@item
19903Uhm@dots{} that's it.
19904@end itemize
19905
19906
19907@node Agent Categories
19908@subsection Agent Categories
19909
19910One of the main reasons to integrate the news transport layer into the
19911newsreader is to allow greater control over what articles to download.
19912There's not much point in downloading huge amounts of articles, just to
19913find out that you're not interested in reading any of them. It's better
19914to be somewhat more conservative in choosing what to download, and then
19915mark the articles for downloading manually if it should turn out that
19916you're interested in the articles anyway.
19917
19918One of the more effective methods for controlling what is to be
19919downloaded is to create a @dfn{category} and then assign some (or all)
19920groups to this category. Groups that do not belong in any other
19921category belong to the @code{default} category. Gnus has its own
19922buffer for creating and managing categories.
19923
19924If you prefer, you can also use group parameters (@pxref{Group
19925Parameters}) and topic parameters (@pxref{Topic Parameters}) for an
19926alternative approach to controlling the agent. The only real
19927difference is that categories are specific to the agent (so there is
19928less to learn) while group and topic parameters include the kitchen
19929sink.
19930
19931Since you can set agent parameters in several different places we have
19932a rule to decide which source to believe. This rule specifies that
19933the parameter sources are checked in the following order: group
19934parameters, topic parameters, agent category, and finally customizable
19935variables. So you can mix all of these sources to produce a wide range
19936of behavior, just don't blame me if you don't remember where you put
19937your settings.
19938
19939@menu
19940* Category Syntax:: What a category looks like.
19941* Category Buffer:: A buffer for maintaining categories.
19942* Category Variables:: Customize'r'Us.
19943@end menu
19944
19945
19946@node Category Syntax
19947@subsubsection Category Syntax
19948
19949A category consists of a name, the list of groups belonging to the
19950category, and a number of optional parameters that override the
19951customizable variables. The complete list of agent parameters are
19952listed below.
19953
19954@cindex Agent Parameters
19955@table @code
01c52d31 19956@item agent-groups
4009494e
GM
19957The list of groups that are in this category.
19958
01c52d31 19959@item agent-predicate
4009494e
GM
19960A predicate which (generally) gives a rough outline of which articles
19961are eligible for downloading; and
19962
01c52d31 19963@item agent-score
4009494e
GM
19964a score rule which (generally) gives you a finer granularity when
19965deciding what articles to download. (Note that this @dfn{download
19966score} is not necessarily related to normal scores.)
19967
01c52d31 19968@item agent-enable-expiration
4009494e
GM
19969a boolean indicating whether the agent should expire old articles in
19970this group. Most groups should be expired to conserve disk space. In
19971fact, its probably safe to say that the gnus.* hierarchy contains the
19972only groups that should not be expired.
19973
01c52d31 19974@item agent-days-until-old
4009494e
GM
19975an integer indicating the number of days that the agent should wait
19976before deciding that a read article is safe to expire.
19977
01c52d31 19978@item agent-low-score
4009494e
GM
19979an integer that overrides the value of @code{gnus-agent-low-score}.
19980
01c52d31 19981@item agent-high-score
4009494e
GM
19982an integer that overrides the value of @code{gnus-agent-high-score}.
19983
01c52d31 19984@item agent-short-article
4009494e
GM
19985an integer that overrides the value of
19986@code{gnus-agent-short-article}.
19987
01c52d31 19988@item agent-long-article
4009494e
GM
19989an integer that overrides the value of @code{gnus-agent-long-article}.
19990
01c52d31 19991@item agent-enable-undownloaded-faces
4009494e 19992a symbol indicating whether the summary buffer should display
01c52d31
MB
19993undownloaded articles using the @code{gnus-summary-*-undownloaded-face}
19994faces. Any symbol other than @code{nil} will enable the use of
19995undownloaded faces.
4009494e
GM
19996@end table
19997
19998The name of a category can not be changed once the category has been
19999created.
20000
20001Each category maintains a list of groups that are exclusive members of
20002that category. The exclusivity rule is automatically enforced, add a
20003group to a new category and it is automatically removed from its old
20004category.
20005
20006A predicate in its simplest form can be a single predicate such as
20007@code{true} or @code{false}. These two will download every available
20008article or nothing respectively. In the case of these two special
20009predicates an additional score rule is superfluous.
20010
20011Predicates of @code{high} or @code{low} download articles in respect of
20012their scores in relationship to @code{gnus-agent-high-score} and
20013@code{gnus-agent-low-score} as described below.
20014
20015To gain even finer control of what is to be regarded eligible for
20016download a predicate can consist of a number of predicates with logical
20017operators sprinkled in between.
20018
20019Perhaps some examples are in order.
20020
20021Here's a simple predicate. (It's the default predicate, in fact, used
20022for all groups that don't belong to any other category.)
20023
20024@lisp
20025short
20026@end lisp
20027
20028Quite simple, eh? This predicate is true if and only if the article is
20029short (for some value of ``short'').
20030
20031Here's a more complex predicate:
20032
20033@lisp
20034(or high
20035 (and
20036 (not low)
20037 (not long)))
20038@end lisp
20039
20040This means that an article should be downloaded if it has a high score,
20041or if the score is not low and the article is not long. You get the
20042drift.
20043
20044The available logical operators are @code{or}, @code{and} and
20045@code{not}. (If you prefer, you can use the more ``C''-ish operators
20046@samp{|}, @code{&} and @code{!} instead.)
20047
20048The following predicates are pre-defined, but if none of these fit what
20049you want to do, you can write your own.
20050
20051When evaluating each of these predicates, the named constant will be
20052bound to the value determined by calling
20053@code{gnus-agent-find-parameter} on the appropriate parameter. For
20054example, gnus-agent-short-article will be bound to
20055@code{(gnus-agent-find-parameter group 'agent-short-article)}. This
20056means that you can specify a predicate in your category then tune that
20057predicate to individual groups.
20058
20059@table @code
20060@item short
20061True if the article is shorter than @code{gnus-agent-short-article}
20062lines; default 100.
20063
20064@item long
20065True if the article is longer than @code{gnus-agent-long-article}
20066lines; default 200.
20067
20068@item low
20069True if the article has a download score less than
20070@code{gnus-agent-low-score}; default 0.
20071
20072@item high
20073True if the article has a download score greater than
20074@code{gnus-agent-high-score}; default 0.
20075
20076@item spam
20077True if the Gnus Agent guesses that the article is spam. The
20078heuristics may change over time, but at present it just computes a
20079checksum and sees whether articles match.
20080
20081@item true
20082Always true.
20083
20084@item false
20085Always false.
20086@end table
20087
20088If you want to create your own predicate function, here's what you have
20089to know: The functions are called with no parameters, but the
20090@code{gnus-headers} and @code{gnus-score} dynamic variables are bound to
20091useful values.
20092
20093For example, you could decide that you don't want to download articles
20094that were posted more than a certain number of days ago (e.g. posted
20095more than @code{gnus-agent-expire-days} ago) you might write a function
20096something along the lines of the following:
20097
20098@lisp
20099(defun my-article-old-p ()
20100 "Say whether an article is old."
20101 (< (time-to-days (date-to-time (mail-header-date gnus-headers)))
20102 (- (time-to-days (current-time)) gnus-agent-expire-days)))
20103@end lisp
20104
20105with the predicate then defined as:
20106
20107@lisp
20108(not my-article-old-p)
20109@end lisp
20110
20111or you could append your predicate to the predefined
20112@code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or
20113wherever.
20114
20115@lisp
20116(require 'gnus-agent)
20117(setq gnus-category-predicate-alist
20118 (append gnus-category-predicate-alist
20119 '((old . my-article-old-p))))
20120@end lisp
20121
20122and simply specify your predicate as:
20123
20124@lisp
20125(not old)
20126@end lisp
20127
20128If/when using something like the above, be aware that there are many
20129misconfigured systems/mailers out there and so an article's date is not
20130always a reliable indication of when it was posted. Hell, some people
20131just don't give a damn.
20132
20133The above predicates apply to @emph{all} the groups which belong to the
20134category. However, if you wish to have a specific predicate for an
20135individual group within a category, or you're just too lazy to set up a
20136new category, you can enter a group's individual predicate in its group
20137parameters like so:
20138
20139@lisp
20140(agent-predicate . short)
20141@end lisp
20142
20143This is the group/topic parameter equivalent of the agent category default.
20144Note that when specifying a single word predicate like this, the
20145@code{agent-predicate} specification must be in dotted pair notation.
20146
20147The equivalent of the longer example from above would be:
20148
20149@lisp
20150(agent-predicate or high (and (not low) (not long)))
20151@end lisp
20152
20153The outer parenthesis required in the category specification are not
20154entered here as, not being in dotted pair notation, the value of the
20155predicate is assumed to be a list.
20156
20157
20158Now, the syntax of the download score is the same as the syntax of
20159normal score files, except that all elements that require actually
20160seeing the article itself are verboten. This means that only the
20161following headers can be scored on: @code{Subject}, @code{From},
20162@code{Date}, @code{Message-ID}, @code{References}, @code{Chars},
20163@code{Lines}, and @code{Xref}.
20164
20165As with predicates, the specification of the @code{download score rule}
20166to use in respect of a group can be in either the category definition if
20167it's to be applicable to all groups in therein, or a group's parameters
20168if it's to be specific to that group.
20169
20170In both of these places the @code{download score rule} can take one of
20171three forms:
20172
20173@enumerate
20174@item
20175Score rule
20176
20177This has the same syntax as a normal Gnus score file except only a
20178subset of scoring keywords are available as mentioned above.
20179
20180example:
20181
20182@itemize @bullet
20183@item
20184Category specification
20185
20186@lisp
20187(("from"
20188 ("Lars Ingebrigtsen" 1000000 nil s))
20189("lines"
20190 (500 -100 nil <)))
20191@end lisp
20192
20193@item
20194Group/Topic Parameter specification
20195
20196@lisp
20197(agent-score ("from"
20198 ("Lars Ingebrigtsen" 1000000 nil s))
20199 ("lines"
20200 (500 -100 nil <)))
20201@end lisp
20202
20203Again, note the omission of the outermost parenthesis here.
20204@end itemize
20205
20206@item
20207Agent score file
20208
20209These score files must @emph{only} contain the permitted scoring
20210keywords stated above.
20211
20212example:
20213
20214@itemize @bullet
20215@item
20216Category specification
20217
20218@lisp
20219("~/News/agent.SCORE")
20220@end lisp
20221
20222or perhaps
20223
20224@lisp
20225("~/News/agent.SCORE" "~/News/agent.group.SCORE")
20226@end lisp
20227
20228@item
20229Group Parameter specification
20230
20231@lisp
20232(agent-score "~/News/agent.SCORE")
20233@end lisp
20234
20235Additional score files can be specified as above. Need I say anything
20236about parenthesis?
20237@end itemize
20238
20239@item
20240Use @code{normal} score files
20241
20242If you don't want to maintain two sets of scoring rules for a group, and
20243your desired @code{downloading} criteria for a group are the same as your
20244@code{reading} criteria then you can tell the agent to refer to your
20245@code{normal} score files when deciding what to download.
20246
20247These directives in either the category definition or a group's
20248parameters will cause the agent to read in all the applicable score
20249files for a group, @emph{filtering out} those sections that do not
20250relate to one of the permitted subset of scoring keywords.
20251
20252@itemize @bullet
20253@item
20254Category Specification
20255
20256@lisp
20257file
20258@end lisp
20259
20260@item
20261Group Parameter specification
20262
20263@lisp
20264(agent-score . file)
20265@end lisp
20266@end itemize
20267@end enumerate
20268
20269@node Category Buffer
20270@subsubsection Category Buffer
20271
20272You'd normally do all category maintenance from the category buffer.
20273When you enter it for the first time (with the @kbd{J c} command from
20274the group buffer), you'll only see the @code{default} category.
20275
20276The following commands are available in this buffer:
20277
20278@table @kbd
20279@item q
20280@kindex q (Category)
20281@findex gnus-category-exit
20282Return to the group buffer (@code{gnus-category-exit}).
20283
20284@item e
20285@kindex e (Category)
20286@findex gnus-category-customize-category
20287Use a customization buffer to set all of the selected category's
20288parameters at one time (@code{gnus-category-customize-category}).
20289
20290@item k
20291@kindex k (Category)
20292@findex gnus-category-kill
20293Kill the current category (@code{gnus-category-kill}).
20294
20295@item c
20296@kindex c (Category)
20297@findex gnus-category-copy
20298Copy the current category (@code{gnus-category-copy}).
20299
20300@item a
20301@kindex a (Category)
20302@findex gnus-category-add
20303Add a new category (@code{gnus-category-add}).
20304
20305@item p
20306@kindex p (Category)
20307@findex gnus-category-edit-predicate
20308Edit the predicate of the current category
20309(@code{gnus-category-edit-predicate}).
20310
20311@item g
20312@kindex g (Category)
20313@findex gnus-category-edit-groups
20314Edit the list of groups belonging to the current category
20315(@code{gnus-category-edit-groups}).
20316
20317@item s
20318@kindex s (Category)
20319@findex gnus-category-edit-score
20320Edit the download score rule of the current category
20321(@code{gnus-category-edit-score}).
20322
20323@item l
20324@kindex l (Category)
20325@findex gnus-category-list
20326List all the categories (@code{gnus-category-list}).
20327@end table
20328
20329
20330@node Category Variables
20331@subsubsection Category Variables
20332
20333@table @code
20334@item gnus-category-mode-hook
20335@vindex gnus-category-mode-hook
20336Hook run in category buffers.
20337
20338@item gnus-category-line-format
20339@vindex gnus-category-line-format
20340Format of the lines in the category buffer (@pxref{Formatting
20341Variables}). Valid elements are:
20342
20343@table @samp
20344@item c
20345The name of the category.
20346
20347@item g
20348The number of groups in the category.
20349@end table
20350
20351@item gnus-category-mode-line-format
20352@vindex gnus-category-mode-line-format
20353Format of the category mode line (@pxref{Mode Line Formatting}).
20354
20355@item gnus-agent-short-article
20356@vindex gnus-agent-short-article
20357Articles that have fewer lines than this are short. Default 100.
20358
20359@item gnus-agent-long-article
20360@vindex gnus-agent-long-article
20361Articles that have more lines than this are long. Default 200.
20362
20363@item gnus-agent-low-score
20364@vindex gnus-agent-low-score
20365Articles that have a score lower than this have a low score. Default
203660.
20367
20368@item gnus-agent-high-score
20369@vindex gnus-agent-high-score
20370Articles that have a score higher than this have a high score. Default
203710.
20372
20373@item gnus-agent-expire-days
20374@vindex gnus-agent-expire-days
20375The number of days that a @samp{read} article must stay in the agent's
20376local disk before becoming eligible for expiration (While the name is
20377the same, this doesn't mean expiring the article on the server. It
20378just means deleting the local copy of the article). What is also
20379important to understand is that the counter starts with the time the
20380article was written to the local disk and not the time the article was
20381read.
20382Default 7.
20383
20384@item gnus-agent-enable-expiration
20385@vindex gnus-agent-enable-expiration
20386Determines whether articles in a group are, by default, expired or
20387retained indefinitely. The default is @code{ENABLE} which means that
20388you'll have to disable expiration when desired. On the other hand,
20389you could set this to @code{DISABLE}. In that case, you would then
20390have to enable expiration in selected groups.
20391
20392@end table
20393
20394
20395@node Agent Commands
20396@subsection Agent Commands
20397@findex gnus-agent-toggle-plugged
20398@kindex J j (Agent)
20399
20400All the Gnus Agent commands are on the @kbd{J} submap. The @kbd{J j}
20401(@code{gnus-agent-toggle-plugged}) command works in all modes, and
20402toggles the plugged/unplugged state of the Gnus Agent.
20403
20404
20405@menu
20406* Group Agent Commands:: Configure groups and fetch their contents.
20407* Summary Agent Commands:: Manually select then fetch specific articles.
20408* Server Agent Commands:: Select the servers that are supported by the agent.
20409@end menu
20410
20411
20412
20413
20414@node Group Agent Commands
20415@subsubsection Group Agent Commands
20416
20417@table @kbd
20418@item J u
20419@kindex J u (Agent Group)
20420@findex gnus-agent-fetch-groups
20421Fetch all eligible articles in the current group
20422(@code{gnus-agent-fetch-groups}).
20423
20424@item J c
20425@kindex J c (Agent Group)
20426@findex gnus-enter-category-buffer
20427Enter the Agent category buffer (@code{gnus-enter-category-buffer}).
20428
20429@item J s
20430@kindex J s (Agent Group)
20431@findex gnus-agent-fetch-session
20432Fetch all eligible articles in all groups
20433(@code{gnus-agent-fetch-session}).
20434
20435@item J S
20436@kindex J S (Agent Group)
20437@findex gnus-group-send-queue
20438Send all sendable messages in the queue group
20439(@code{gnus-group-send-queue}). @xref{Drafts}.
20440
20441@item J a
20442@kindex J a (Agent Group)
20443@findex gnus-agent-add-group
20444Add the current group to an Agent category
20445(@code{gnus-agent-add-group}). This command understands the
20446process/prefix convention (@pxref{Process/Prefix}).
20447
20448@item J r
20449@kindex J r (Agent Group)
20450@findex gnus-agent-remove-group
20451Remove the current group from its category, if any
20452(@code{gnus-agent-remove-group}). This command understands the
20453process/prefix convention (@pxref{Process/Prefix}).
20454
20455@item J Y
20456@kindex J Y (Agent Group)
20457@findex gnus-agent-synchronize-flags
20458Synchronize flags changed while unplugged with remote server, if any.
20459
20460
20461@end table
20462
20463
20464@node Summary Agent Commands
20465@subsubsection Summary Agent Commands
20466
20467@table @kbd
20468@item J #
20469@kindex J # (Agent Summary)
20470@findex gnus-agent-mark-article
20471Mark the article for downloading (@code{gnus-agent-mark-article}).
20472
20473@item J M-#
20474@kindex J M-# (Agent Summary)
20475@findex gnus-agent-unmark-article
20476Remove the downloading mark from the article
20477(@code{gnus-agent-unmark-article}).
20478
20479@cindex %
20480@item @@
20481@kindex @@ (Agent Summary)
20482@findex gnus-agent-toggle-mark
20483Toggle whether to download the article
20484(@code{gnus-agent-toggle-mark}). The download mark is @samp{%} by
20485default.
20486
20487@item J c
20488@kindex J c (Agent Summary)
20489@findex gnus-agent-catchup
20490Mark all articles as read (@code{gnus-agent-catchup}) that are neither cached, downloaded, nor downloadable.
20491
20492@item J S
20493@kindex J S (Agent Summary)
20494@findex gnus-agent-fetch-group
20495Download all eligible (@pxref{Agent Categories}) articles in this group.
20496(@code{gnus-agent-fetch-group}).
20497
20498@item J s
20499@kindex J s (Agent Summary)
01c52d31 20500@findex gnus-agent-summary-fetch-series
4009494e 20501Download all processable articles in this group.
01c52d31 20502(@code{gnus-agent-summary-fetch-series}).
4009494e
GM
20503
20504@item J u
20505@kindex J u (Agent Summary)
20506@findex gnus-agent-summary-fetch-group
20507Download all downloadable articles in the current group
20508(@code{gnus-agent-summary-fetch-group}).
20509
20510@end table
20511
20512
20513@node Server Agent Commands
20514@subsubsection Server Agent Commands
20515
20516@table @kbd
20517@item J a
20518@kindex J a (Agent Server)
20519@findex gnus-agent-add-server
20520Add the current server to the list of servers covered by the Gnus Agent
20521(@code{gnus-agent-add-server}).
20522
20523@item J r
20524@kindex J r (Agent Server)
20525@findex gnus-agent-remove-server
20526Remove the current server from the list of servers covered by the Gnus
20527Agent (@code{gnus-agent-remove-server}).
20528
20529@end table
20530
20531
20532@node Agent Visuals
20533@subsection Agent Visuals
20534
20535If you open a summary while unplugged and, Gnus knows from the group's
20536active range that there are more articles than the headers currently
20537stored in the Agent, you may see some articles whose subject looks
20538something like @samp{[Undownloaded article #####]}. These are
20539placeholders for the missing headers. Aside from setting a mark,
20540there is not much that can be done with one of these placeholders.
20541When Gnus finally gets a chance to fetch the group's headers, the
20542placeholders will automatically be replaced by the actual headers.
20543You can configure the summary buffer's maneuvering to skip over the
20544placeholders if you care (See @code{gnus-auto-goto-ignores}).
20545
20546While it may be obvious to all, the only headers and articles
20547available while unplugged are those headers and articles that were
20548fetched into the Agent while previously plugged. To put it another
20549way, ``If you forget to fetch something while plugged, you might have a
20550less than satisfying unplugged session''. For this reason, the Agent
20551adds two visual effects to your summary buffer. These effects display
20552the download status of each article so that you always know which
20553articles will be available when unplugged.
20554
20555The first visual effect is the @samp{%O} spec. If you customize
20556@code{gnus-summary-line-format} to include this specifier, you will add
20557a single character field that indicates an article's download status.
20558Articles that have been fetched into either the Agent or the Cache,
20559will display @code{gnus-downloaded-mark} (defaults to @samp{+}). All
20560other articles will display @code{gnus-undownloaded-mark} (defaults to
20561@samp{-}). If you open a group that has not been agentized, a space
20562(@samp{ }) will be displayed.
20563
20564The second visual effect are the undownloaded faces. The faces, there
20565are three indicating the article's score (low, normal, high), seem to
20566result in a love/hate response from many Gnus users. The problem is
20567that the face selection is controlled by a list of condition tests and
20568face names (See @code{gnus-summary-highlight}). Each condition is
20569tested in the order in which it appears in the list so early
20570conditions have precedence over later conditions. All of this means
20571that, if you tick an undownloaded article, the article will continue
20572to be displayed in the undownloaded face rather than the ticked face.
20573
20574If you use the Agent as a cache (to avoid downloading the same article
20575each time you visit it or to minimize your connection time), the
20576undownloaded face will probably seem like a good idea. The reason
20577being that you do all of our work (marking, reading, deleting) with
01c52d31
MB
20578downloaded articles so the normal faces always appear. For those
20579users using the agent to improve online performance by caching the NOV
20580database (most users since 5.10.2), the undownloaded faces may appear
20581to be an absolutely horrible idea. The issue being that, since none
20582of their articles have been fetched into the Agent, all of the
20583normal faces will be obscured by the undownloaded faces.
20584
20585If you would like to use the undownloaded faces, you must enable the
20586undownloaded faces by setting the @code{agent-enable-undownloaded-faces}
20587group parameter to @code{t}. This parameter, like all other agent
20588parameters, may be set on an Agent Category (@pxref{Agent Categories}),
20589a Group Topic (@pxref{Topic Parameters}), or an individual group
20590(@pxref{Group Parameters}).
20591
20592The one problem common to all users using the agent is how quickly it
20593can consume disk space. If you using the agent on many groups, it is
20594even more difficult to effectively recover disk space. One solution
20595is the @samp{%F} format available in @code{gnus-group-line-format}.
20596This format will display the actual disk space used by articles
20597fetched into both the agent and cache. By knowing which groups use
20598the most space, users know where to focus their efforts when ``agent
20599expiring'' articles.
4009494e
GM
20600
20601@node Agent as Cache
20602@subsection Agent as Cache
20603
20604When Gnus is plugged, it is not efficient to download headers or
20605articles from the server again, if they are already stored in the
20606Agent. So, Gnus normally only downloads headers once, and stores them
20607in the Agent. These headers are later used when generating the summary
20608buffer, regardless of whether you are plugged or unplugged. Articles
20609are not cached in the Agent by default though (that would potentially
20610consume lots of disk space), but if you have already downloaded an
20611article into the Agent, Gnus will not download the article from the
20612server again but use the locally stored copy instead.
20613
20614If you so desire, you can configure the agent (see @code{gnus-agent-cache}
20615@pxref{Agent Variables}) to always download headers and articles while
20616plugged. Gnus will almost certainly be slower, but it will be kept
20617synchronized with the server. That last point probably won't make any
20618sense if you are using a nntp or nnimap back end.
20619
20620@node Agent Expiry
20621@subsection Agent Expiry
20622
20623@vindex gnus-agent-expire-days
20624@findex gnus-agent-expire
20625@kindex M-x gnus-agent-expire
20626@kindex M-x gnus-agent-expire-group
20627@findex gnus-agent-expire-group
20628@cindex agent expiry
20629@cindex Gnus agent expiry
20630@cindex expiry, in Gnus agent
20631
20632The Agent back end, @code{nnagent}, doesn't handle expiry. Well, at
20633least it doesn't handle it like other back ends. Instead, there are
20634special @code{gnus-agent-expire} and @code{gnus-agent-expire-group}
20635commands that will expire all read articles that are older than
20636@code{gnus-agent-expire-days} days. They can be run whenever you feel
20637that you're running out of space. Neither are particularly fast or
20638efficient, and it's not a particularly good idea to interrupt them (with
20639@kbd{C-g} or anything else) once you've started one of them.
20640
20641Note that other functions, e.g. @code{gnus-request-expire-articles},
20642might run @code{gnus-agent-expire} for you to keep the agent
20643synchronized with the group.
20644
20645The agent parameter @code{agent-enable-expiration} may be used to
20646prevent expiration in selected groups.
20647
20648@vindex gnus-agent-expire-all
20649If @code{gnus-agent-expire-all} is non-@code{nil}, the agent
20650expiration commands will expire all articles---unread, read, ticked
20651and dormant. If @code{nil} (which is the default), only read articles
20652are eligible for expiry, and unread, ticked and dormant articles will
20653be kept indefinitely.
20654
20655If you find that some articles eligible for expiry are never expired,
20656perhaps some Gnus Agent files are corrupted. There's are special
20657commands, @code{gnus-agent-regenerate} and
20658@code{gnus-agent-regenerate-group}, to fix possible problems.
20659
20660@node Agent Regeneration
20661@subsection Agent Regeneration
20662
20663@cindex agent regeneration
20664@cindex Gnus agent regeneration
20665@cindex regeneration
20666
20667The local data structures used by @code{nnagent} may become corrupted
20668due to certain exceptional conditions. When this happens,
20669@code{nnagent} functionality may degrade or even fail. The solution
20670to this problem is to repair the local data structures by removing all
20671internal inconsistencies.
20672
20673For example, if your connection to your server is lost while
20674downloaded articles into the agent, the local data structures will not
20675know about articles successfully downloaded prior to the connection
20676failure. Running @code{gnus-agent-regenerate} or
20677@code{gnus-agent-regenerate-group} will update the data structures
20678such that you don't need to download these articles a second time.
20679
20680@findex gnus-agent-regenerate
20681@kindex M-x gnus-agent-regenerate
20682The command @code{gnus-agent-regenerate} will perform
20683@code{gnus-agent-regenerate-group} on every agentized group. While
20684you can run @code{gnus-agent-regenerate} in any buffer, it is strongly
20685recommended that you first close all summary buffers.
20686
20687@findex gnus-agent-regenerate-group
20688@kindex M-x gnus-agent-regenerate-group
20689The command @code{gnus-agent-regenerate-group} uses the local copies
20690of individual articles to repair the local @acronym{NOV}(header) database. It
20691then updates the internal data structures that document which articles
20692are stored locally. An optional argument will mark articles in the
20693agent as unread.
20694
01c52d31
MB
20695@node Agent and flags
20696@subsection Agent and flags
4009494e 20697
01c52d31
MB
20698The Agent works with any Gnus back end including those, such as
20699nnimap, that store flags (read, ticked, etc) on the server. Sadly,
20700the Agent does not actually know which backends keep their flags in
20701the backend server rather than in @file{.newsrc}. This means that the
20702Agent, while unplugged or disconnected, will always record all changes
20703to the flags in its own files.
4009494e 20704
01c52d31
MB
20705When you plug back in, Gnus will then check to see if you have any
20706changed any flags and ask if you wish to synchronize these with the
20707server. This behavior is customizable by @code{gnus-agent-synchronize-flags}.
4009494e
GM
20708
20709@vindex gnus-agent-synchronize-flags
20710If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
20711never automatically synchronize flags. If it is @code{ask}, which is
20712the default, the Agent will check if you made any changes and if so
20713ask if you wish to synchronize these when you re-connect. If it has
20714any other value, all flags will be synchronized automatically.
20715
20716If you do not wish to synchronize flags automatically when you
20717re-connect, you can do it manually with the
20718@code{gnus-agent-synchronize-flags} command that is bound to @kbd{J Y}
20719in the group buffer.
20720
01c52d31
MB
20721Technical note: the synchronization algorithm does not work by ``pushing''
20722all local flags to the server, but rather by incrementally updated the
20723server view of flags by changing only those flags that were changed by
20724the user. Thus, if you set one flag on an article, quit the group then
20725re-select the group and remove the flag; the flag will be set and
20726removed from the server when you ``synchronize''. The queued flag
20727operations can be found in the per-server @code{flags} file in the Agent
20728directory. It's emptied when you synchronize flags.
20729
20730@node Agent and IMAP
20731@subsection Agent and IMAP
20732
20733The Agent works with any Gnus back end, including nnimap. However,
20734since there are some conceptual differences between @acronym{NNTP} and
20735@acronym{IMAP}, this section (should) provide you with some information to
20736make Gnus Agent work smoother as a @acronym{IMAP} Disconnected Mode client.
20737
4009494e
GM
20738Some things are currently not implemented in the Agent that you'd might
20739expect from a disconnected @acronym{IMAP} client, including:
20740
20741@itemize @bullet
20742
20743@item
20744Copying/moving articles into nnimap groups when unplugged.
20745
20746@item
20747Creating/deleting nnimap groups when unplugged.
20748
20749@end itemize
20750
4009494e
GM
20751@node Outgoing Messages
20752@subsection Outgoing Messages
20753
01c52d31
MB
20754By default, when Gnus is unplugged, all outgoing messages (both mail
20755and news) are stored in the draft group ``queue'' (@pxref{Drafts}).
20756You can view them there after posting, and edit them at will.
4009494e 20757
01c52d31
MB
20758You can control the circumstances under which outgoing mail is queued
20759(see @code{gnus-agent-queue-mail}, @pxref{Agent Variables}). Outgoing
20760news is always queued when Gnus is unplugged, and never otherwise.
4009494e 20761
01c52d31
MB
20762You can send the messages either from the draft group with the special
20763commands available there, or you can use the @kbd{J S} command in the
20764group buffer to send all the sendable messages in the draft group.
20765Posting news will only work when Gnus is plugged, but you can send
20766mail at any time.
4009494e 20767
01c52d31
MB
20768If sending mail while unplugged does not work for you and you worry
20769about hitting @kbd{J S} by accident when unplugged, you can have Gnus
20770ask you to confirm your action (see
20771@code{gnus-agent-prompt-send-queue}, @pxref{Agent Variables}).
4009494e
GM
20772
20773@node Agent Variables
20774@subsection Agent Variables
20775
20776@table @code
01c52d31
MB
20777@item gnus-agent
20778@vindex gnus-agent
20779Is the agent enabled? The default is @code{t}. When first enabled,
20780the agent will use @code{gnus-agent-auto-agentize-methods} to
20781automatically mark some back ends as agentized. You may change which
20782back ends are agentized using the agent commands in the server buffer.
20783
20784To enter the server buffer, use the @kbd{^}
20785(@code{gnus-group-enter-server-mode}) command in the group buffer.
20786
20787
4009494e
GM
20788@item gnus-agent-directory
20789@vindex gnus-agent-directory
20790Where the Gnus Agent will store its files. The default is
20791@file{~/News/agent/}.
20792
20793@item gnus-agent-handle-level
20794@vindex gnus-agent-handle-level
20795Groups on levels (@pxref{Group Levels}) higher than this variable will
20796be ignored by the Agent. The default is @code{gnus-level-subscribed},
20797which means that only subscribed group will be considered by the Agent
20798by default.
20799
20800@item gnus-agent-plugged-hook
20801@vindex gnus-agent-plugged-hook
20802Hook run when connecting to the network.
20803
20804@item gnus-agent-unplugged-hook
20805@vindex gnus-agent-unplugged-hook
20806Hook run when disconnecting from the network.
20807
20808@item gnus-agent-fetched-hook
20809@vindex gnus-agent-fetched-hook
20810Hook run when finished fetching articles.
20811
20812@item gnus-agent-cache
20813@vindex gnus-agent-cache
20814Variable to control whether use the locally stored @acronym{NOV} and
20815articles when plugged, e.g. essentially using the Agent as a cache.
20816The default is non-@code{nil}, which means to use the Agent as a cache.
20817
20818@item gnus-agent-go-online
20819@vindex gnus-agent-go-online
20820If @code{gnus-agent-go-online} is @code{nil}, the Agent will never
20821automatically switch offline servers into online status. If it is
20822@code{ask}, the default, the Agent will ask if you wish to switch
20823offline servers into online status when you re-connect. If it has any
20824other value, all offline servers will be automatically switched into
20825online status.
20826
20827@item gnus-agent-mark-unread-after-downloaded
20828@vindex gnus-agent-mark-unread-after-downloaded
20829If @code{gnus-agent-mark-unread-after-downloaded} is non-@code{nil},
20830mark articles as unread after downloading. This is usually a safe
20831thing to do as the newly downloaded article has obviously not been
20832read. The default is @code{t}.
20833
01c52d31
MB
20834@item gnus-agent-synchronize-flags
20835@vindex gnus-agent-synchronize-flags
20836If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
20837never automatically synchronize flags. If it is @code{ask}, which is
20838the default, the Agent will check if you made any changes and if so
20839ask if you wish to synchronize these when you re-connect. If it has
20840any other value, all flags will be synchronized automatically.
20841
4009494e
GM
20842@item gnus-agent-consider-all-articles
20843@vindex gnus-agent-consider-all-articles
20844If @code{gnus-agent-consider-all-articles} is non-@code{nil}, the
20845agent will let the agent predicate decide whether articles need to be
20846downloaded or not, for all articles. When @code{nil}, the default,
20847the agent will only let the predicate decide whether unread articles
20848are downloaded or not. If you enable this, you may also want to look
20849into the agent expiry settings (@pxref{Category Variables}), so that
20850the agent doesn't download articles which the agent will later expire,
20851over and over again.
20852
20853@item gnus-agent-max-fetch-size
20854@vindex gnus-agent-max-fetch-size
20855The agent fetches articles into a temporary buffer prior to parsing
20856them into individual files. To avoid exceeding the max. buffer size,
20857the agent alternates between fetching and parsing until all articles
20858have been fetched. @code{gnus-agent-max-fetch-size} provides a size
20859limit to control how often the cycling occurs. A large value improves
20860performance. A small value minimizes the time lost should the
20861connection be lost while fetching (You may need to run
20862@code{gnus-agent-regenerate-group} to update the group's state.
20863However, all articles parsed prior to loosing the connection will be
20864available while unplugged). The default is 10M so it is unusual to
20865see any cycling.
20866
20867@item gnus-server-unopen-status
20868@vindex gnus-server-unopen-status
20869Perhaps not an Agent variable, but closely related to the Agent, this
20870variable says what will happen if Gnus cannot open a server. If the
20871Agent is enabled, the default, @code{nil}, makes Gnus ask the user
20872whether to deny the server or whether to unplug the agent. If the
20873Agent is disabled, Gnus always simply deny the server. Other choices
20874for this variable include @code{denied} and @code{offline} the latter
20875is only valid if the Agent is used.
20876
20877@item gnus-auto-goto-ignores
20878@vindex gnus-auto-goto-ignores
20879Another variable that isn't an Agent variable, yet so closely related
20880that most will look for it here, this variable tells the summary
20881buffer how to maneuver around undownloaded (only headers stored in the
20882agent) and unfetched (neither article nor headers stored) articles.
20883
20884The valid values are @code{nil} (maneuver to any article),
20885@code{undownloaded} (maneuvering while unplugged ignores articles that
20886have not been fetched), @code{always-undownloaded} (maneuvering always
20887ignores articles that have not been fetched), @code{unfetched}
20888(maneuvering ignores articles whose headers have not been fetched).
20889
01c52d31
MB
20890@item gnus-agent-queue-mail
20891@vindex gnus-agent-queue-mail
20892When @code{gnus-agent-queue-mail} is @code{always}, Gnus will always
20893queue mail rather than sending it straight away. When @code{t}, Gnus
20894will queue mail when unplugged only. When @code{nil}, never queue
20895mail. The default is @code{t}.
20896
20897@item gnus-agent-prompt-send-queue
20898@vindex gnus-agent-prompt-send-queue
20899When @code{gnus-agent-prompt-send-queue} is non-@code{nil} Gnus will
20900prompt you to confirm that you really wish to proceed if you hit
20901@kbd{J S} while unplugged. The default is @code{nil}.
20902
4009494e
GM
20903@item gnus-agent-auto-agentize-methods
20904@vindex gnus-agent-auto-agentize-methods
20905If you have never used the Agent before (or more technically, if
20906@file{~/News/agent/lib/servers} does not exist), Gnus will
20907automatically agentize a few servers for you. This variable control
01c52d31
MB
20908which back ends should be auto-agentized. It is typically only useful
20909to agentize remote back ends. The auto-agentizing has the same effect
4009494e
GM
20910as running @kbd{J a} on the servers (@pxref{Server Agent Commands}).
20911If the file exist, you must manage the servers manually by adding or
20912removing them, this variable is only applicable the first time you
20913start Gnus. The default is @samp{(nntp nnimap)}.
20914
20915@end table
20916
20917
20918@node Example Setup
20919@subsection Example Setup
20920
20921If you don't want to read this manual, and you have a fairly standard
20922setup, you may be able to use something like the following as your
20923@file{~/.gnus.el} file to get started.
20924
20925@lisp
20926;; @r{Define how Gnus is to fetch news. We do this over @acronym{NNTP}}
20927;; @r{from your ISP's server.}
20928(setq gnus-select-method '(nntp "news.your-isp.com"))
20929
20930;; @r{Define how Gnus is to read your mail. We read mail from}
20931;; @r{your ISP's @acronym{POP} server.}
20932(setq mail-sources '((pop :server "pop.your-isp.com")))
20933
20934;; @r{Say how Gnus is to store the mail. We use nnml groups.}
20935(setq gnus-secondary-select-methods '((nnml "")))
20936
20937;; @r{Make Gnus into an offline newsreader.}
20938;; (gnus-agentize) ; @r{The obsolete setting.}
20939;; (setq gnus-agent t) ; @r{Now the default.}
20940@end lisp
20941
20942That should be it, basically. Put that in your @file{~/.gnus.el} file,
20943edit to suit your needs, start up PPP (or whatever), and type @kbd{M-x
20944gnus}.
20945
20946If this is the first time you've run Gnus, you will be subscribed
20947automatically to a few default newsgroups. You'll probably want to
20948subscribe to more groups, and to do that, you have to query the
20949@acronym{NNTP} server for a complete list of groups with the @kbd{A A}
20950command. This usually takes quite a while, but you only have to do it
20951once.
20952
20953After reading and parsing a while, you'll be presented with a list of
20954groups. Subscribe to the ones you want to read with the @kbd{u}
20955command. @kbd{l} to make all the killed groups disappear after you've
20956subscribe to all the groups you want to read. (@kbd{A k} will bring
20957back all the killed groups.)
20958
20959You can now read the groups at once, or you can download the articles
20960with the @kbd{J s} command. And then read the rest of this manual to
20961find out which of the other gazillion things you want to customize.
20962
20963
20964@node Batching Agents
20965@subsection Batching Agents
20966@findex gnus-agent-batch
20967
20968Having the Gnus Agent fetch articles (and post whatever messages you've
20969written) is quite easy once you've gotten things set up properly. The
20970following shell script will do everything that is necessary:
20971
20972You can run a complete batch command from the command line with the
20973following incantation:
20974
20975@example
20976#!/bin/sh
20977emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-agent-batch >/dev/null 2>&1
20978@end example
20979
20980
20981@node Agent Caveats
20982@subsection Agent Caveats
20983
20984The Gnus Agent doesn't seem to work like most other offline
20985newsreaders. Here are some common questions that some imaginary people
20986may ask:
20987
20988@table @dfn
20989@item If I read an article while plugged, do they get entered into the Agent?
20990
20991@strong{No}. If you want this behavior, add
20992@code{gnus-agent-fetch-selected-article} to
20993@code{gnus-select-article-hook}.
20994
20995@item If I read an article while plugged, and the article already exists in
20996the Agent, will it get downloaded once more?
20997
20998@strong{No}, unless @code{gnus-agent-cache} is @code{nil}.
20999
21000@end table
21001
21002In short, when Gnus is unplugged, it only looks into the locally stored
21003articles; when it's plugged, it talks to your ISP and may also use the
21004locally stored articles.
21005
21006
21007@node Scoring
21008@chapter Scoring
21009@cindex scoring
21010
21011Other people use @dfn{kill files}, but we here at Gnus Towers like
21012scoring better than killing, so we'd rather switch than fight. They do
21013something completely different as well, so sit up straight and pay
21014attention!
21015
21016@vindex gnus-summary-mark-below
21017All articles have a default score (@code{gnus-summary-default-score}),
21018which is 0 by default. This score may be raised or lowered either
21019interactively or by score files. Articles that have a score lower than
21020@code{gnus-summary-mark-below} are marked as read.
21021
21022Gnus will read any @dfn{score files} that apply to the current group
21023before generating the summary buffer.
21024
21025There are several commands in the summary buffer that insert score
21026entries based on the current article. You can, for instance, ask Gnus to
21027lower or increase the score of all articles with a certain subject.
21028
21029There are two sorts of scoring entries: Permanent and temporary.
21030Temporary score entries are self-expiring entries. Any entries that are
21031temporary and have not been used for, say, a week, will be removed
21032silently to help keep the sizes of the score files down.
21033
21034@menu
21035* Summary Score Commands:: Adding score entries for the current group.
21036* Group Score Commands:: General score commands.
21037* Score Variables:: Customize your scoring. (My, what terminology).
21038* Score File Format:: What a score file may contain.
21039* Score File Editing:: You can edit score files by hand as well.
21040* Adaptive Scoring:: Big Sister Gnus knows what you read.
21041* Home Score File:: How to say where new score entries are to go.
21042* Followups To Yourself:: Having Gnus notice when people answer you.
21043* Scoring On Other Headers:: Scoring on non-standard headers.
21044* Scoring Tips:: How to score effectively.
21045* Reverse Scoring:: That problem child of old is not problem.
21046* Global Score Files:: Earth-spanning, ear-splitting score files.
21047* Kill Files:: They are still here, but they can be ignored.
21048* Converting Kill Files:: Translating kill files to score files.
4009494e
GM
21049* Advanced Scoring:: Using logical expressions to build score rules.
21050* Score Decays:: It can be useful to let scores wither away.
21051@end menu
21052
21053
21054@node Summary Score Commands
21055@section Summary Score Commands
21056@cindex score commands
21057
21058The score commands that alter score entries do not actually modify real
21059score files. That would be too inefficient. Gnus maintains a cache of
21060previously loaded score files, one of which is considered the
21061@dfn{current score file alist}. The score commands simply insert
21062entries into this list, and upon group exit, this list is saved.
21063
21064The current score file is by default the group's local score file, even
21065if no such score file actually exists. To insert score commands into
21066some other score file (e.g. @file{all.SCORE}), you must first make this
21067score file the current one.
21068
21069General score commands that don't actually change the score file:
21070
21071@table @kbd
21072
21073@item V s
21074@kindex V s (Summary)
21075@findex gnus-summary-set-score
21076Set the score of the current article (@code{gnus-summary-set-score}).
21077
21078@item V S
21079@kindex V S (Summary)
21080@findex gnus-summary-current-score
21081Display the score of the current article
21082(@code{gnus-summary-current-score}).
21083
21084@item V t
21085@kindex V t (Summary)
21086@findex gnus-score-find-trace
21087Display all score rules that have been used on the current article
21088(@code{gnus-score-find-trace}). In the @code{*Score Trace*} buffer, you
21089may type @kbd{e} to edit score file corresponding to the score rule on
21090current line and @kbd{f} to format (@code{gnus-score-pretty-print}) the
21091score file and edit it.
21092
21093@item V w
21094@kindex V w (Summary)
21095@findex gnus-score-find-favourite-words
21096List words used in scoring (@code{gnus-score-find-favourite-words}).
21097
21098@item V R
21099@kindex V R (Summary)
21100@findex gnus-summary-rescore
21101Run the current summary through the scoring process
21102(@code{gnus-summary-rescore}). This might be useful if you're playing
21103around with your score files behind Gnus' back and want to see the
21104effect you're having.
21105
21106@item V c
21107@kindex V c (Summary)
21108@findex gnus-score-change-score-file
21109Make a different score file the current
21110(@code{gnus-score-change-score-file}).
21111
21112@item V e
21113@kindex V e (Summary)
21114@findex gnus-score-edit-current-scores
21115Edit the current score file (@code{gnus-score-edit-current-scores}).
21116You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score
21117File Editing}).
21118
21119@item V f
21120@kindex V f (Summary)
21121@findex gnus-score-edit-file
21122Edit a score file and make this score file the current one
21123(@code{gnus-score-edit-file}).
21124
21125@item V F
21126@kindex V F (Summary)
21127@findex gnus-score-flush-cache
21128Flush the score cache (@code{gnus-score-flush-cache}). This is useful
21129after editing score files.
21130
21131@item V C
21132@kindex V C (Summary)
21133@findex gnus-score-customize
21134Customize a score file in a visually pleasing manner
21135(@code{gnus-score-customize}).
21136
21137@end table
21138
21139The rest of these commands modify the local score file.
21140
21141@table @kbd
21142
21143@item V m
21144@kindex V m (Summary)
21145@findex gnus-score-set-mark-below
21146Prompt for a score, and mark all articles with a score below this as
21147read (@code{gnus-score-set-mark-below}).
21148
21149@item V x
21150@kindex V x (Summary)
21151@findex gnus-score-set-expunge-below
21152Prompt for a score, and add a score rule to the current score file to
21153expunge all articles below this score
21154(@code{gnus-score-set-expunge-below}).
21155@end table
21156
21157The keystrokes for actually making score entries follow a very regular
21158pattern, so there's no need to list all the commands. (Hundreds of
21159them.)
21160
21161@findex gnus-summary-increase-score
21162@findex gnus-summary-lower-score
21163
21164@enumerate
21165@item
21166The first key is either @kbd{I} (upper case i) for increasing the score
21167or @kbd{L} for lowering the score.
21168@item
21169The second key says what header you want to score on. The following
21170keys are available:
21171@table @kbd
21172
21173@item a
21174Score on the author name.
21175
21176@item s
21177Score on the subject line.
21178
21179@item x
21180Score on the @code{Xref} line---i.e., the cross-posting line.
21181
21182@item r
21183Score on the @code{References} line.
21184
21185@item d
21186Score on the date.
21187
21188@item l
21189Score on the number of lines.
21190
21191@item i
21192Score on the @code{Message-ID} header.
21193
21194@item e
21195Score on an ``extra'' header, that is, one of those in gnus-extra-headers,
21196if your @acronym{NNTP} server tracks additional header data in overviews.
21197
21198@item f
21199Score on followups---this matches the author name, and adds scores to
21200the followups to this author. (Using this key leads to the creation of
21201@file{ADAPT} files.)
21202
21203@item b
21204Score on the body.
21205
21206@item h
21207Score on the head.
21208
21209@item t
21210Score on thread. (Using this key leads to the creation of @file{ADAPT}
21211files.)
21212
21213@end table
21214
21215@item
21216The third key is the match type. Which match types are valid depends on
21217what headers you are scoring on.
21218
21219@table @code
21220
21221@item strings
21222
21223@table @kbd
21224
21225@item e
21226Exact matching.
21227
21228@item s
21229Substring matching.
21230
21231@item f
21232Fuzzy matching (@pxref{Fuzzy Matching}).
21233
21234@item r
21235Regexp matching
21236@end table
21237
21238@item date
21239@table @kbd
21240
21241@item b
21242Before date.
21243
21244@item a
21245After date.
21246
21247@item n
21248This date.
21249@end table
21250
21251@item number
21252@table @kbd
21253
21254@item <
21255Less than number.
21256
21257@item =
21258Equal to number.
21259
21260@item >
21261Greater than number.
21262@end table
21263@end table
21264
21265@item
21266The fourth and usually final key says whether this is a temporary (i.e.,
21267expiring) score entry, or a permanent (i.e., non-expiring) score entry,
21268or whether it is to be done immediately, without adding to the score
21269file.
21270@table @kbd
21271
21272@item t
21273Temporary score entry.
21274
21275@item p
21276Permanent score entry.
21277
21278@item i
21279Immediately scoring.
21280@end table
21281
21282@item
21283If you are scoring on `e' (extra) headers, you will then be prompted for
21284the header name on which you wish to score. This must be a header named
21285in gnus-extra-headers, and @samp{TAB} completion is available.
21286
21287@end enumerate
21288
21289So, let's say you want to increase the score on the current author with
21290exact matching permanently: @kbd{I a e p}. If you want to lower the
21291score based on the subject line, using substring matching, and make a
21292temporary score entry: @kbd{L s s t}. Pretty easy.
21293
21294To make things a bit more complicated, there are shortcuts. If you use
21295a capital letter on either the second or third keys, Gnus will use
21296defaults for the remaining one or two keystrokes. The defaults are
21297``substring'' and ``temporary''. So @kbd{I A} is the same as @kbd{I a s
21298t}, and @kbd{I a R} is the same as @kbd{I a r t}.
21299
21300These functions take both the numerical prefix and the symbolic prefix
21301(@pxref{Symbolic Prefixes}). A numerical prefix says how much to lower
21302(or increase) the score of the article. A symbolic prefix of @code{a}
21303says to use the @file{all.SCORE} file for the command instead of the
21304current score file.
21305
21306@vindex gnus-score-mimic-keymap
21307The @code{gnus-score-mimic-keymap} says whether these commands will
21308pretend they are keymaps or not.
21309
21310
21311@node Group Score Commands
21312@section Group Score Commands
21313@cindex group score commands
21314
21315There aren't many of these as yet, I'm afraid.
21316
21317@table @kbd
21318
01c52d31
MB
21319@item W e
21320@kindex W e (Group)
21321@findex gnus-score-edit-all-score
21322Edit the apply-to-all-groups all.SCORE file. You will be popped into
21323a @code{gnus-score-mode} buffer (@pxref{Score File Editing}).
21324
4009494e
GM
21325@item W f
21326@kindex W f (Group)
21327@findex gnus-score-flush-cache
21328Gnus maintains a cache of score alists to avoid having to reload them
21329all the time. This command will flush the cache
21330(@code{gnus-score-flush-cache}).
21331
21332@end table
21333
21334You can do scoring from the command line by saying something like:
21335
21336@findex gnus-batch-score
21337@cindex batch scoring
21338@example
21339$ emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score
21340@end example
21341
21342
21343@node Score Variables
21344@section Score Variables
21345@cindex score variables
21346
21347@table @code
21348
21349@item gnus-use-scoring
21350@vindex gnus-use-scoring
21351If @code{nil}, Gnus will not check for score files, and will not, in
21352general, do any score-related work. This is @code{t} by default.
21353
21354@item gnus-kill-killed
21355@vindex gnus-kill-killed
21356If this variable is @code{nil}, Gnus will never apply score files to
21357articles that have already been through the kill process. While this
21358may save you lots of time, it also means that if you apply a kill file
21359to a group, and then change the kill file and want to run it over you
21360group again to kill more articles, it won't work. You have to set this
21361variable to @code{t} to do that. (It is @code{t} by default.)
21362
21363@item gnus-kill-files-directory
21364@vindex gnus-kill-files-directory
21365All kill and score files will be stored in this directory, which is
21366initialized from the @env{SAVEDIR} environment variable by default.
21367This is @file{~/News/} by default.
21368
21369@item gnus-score-file-suffix
21370@vindex gnus-score-file-suffix
21371Suffix to add to the group name to arrive at the score file name
21372(@file{SCORE} by default.)
21373
21374@item gnus-score-uncacheable-files
21375@vindex gnus-score-uncacheable-files
21376@cindex score cache
21377All score files are normally cached to avoid excessive re-loading of
bbbe940b 21378score files. However, this might make your Emacs grow big and
4009494e
GM
21379bloated, so this regexp can be used to weed out score files unlikely
21380to be needed again. It would be a bad idea to deny caching of
21381@file{all.SCORE}, while it might be a good idea to not cache
21382@file{comp.infosystems.www.authoring.misc.ADAPT}. In fact, this
21383variable is @samp{ADAPT$} by default, so no adaptive score files will
21384be cached.
21385
21386@item gnus-save-score
21387@vindex gnus-save-score
21388If you have really complicated score files, and do lots of batch
21389scoring, then you might set this variable to @code{t}. This will make
21390Gnus save the scores into the @file{.newsrc.eld} file.
21391
21392If you do not set this to @code{t}, then manual scores (like those set
21393with @kbd{V s} (@code{gnus-summary-set-score})) will not be preserved
21394across group visits.
21395
21396@item gnus-score-interactive-default-score
21397@vindex gnus-score-interactive-default-score
21398Score used by all the interactive raise/lower commands to raise/lower
21399score with. Default is 1000, which may seem excessive, but this is to
21400ensure that the adaptive scoring scheme gets enough room to play with.
21401We don't want the small changes from the adaptive scoring to overwrite
21402manually entered data.
21403
21404@item gnus-summary-default-score
21405@vindex gnus-summary-default-score
21406Default score of an article, which is 0 by default.
21407
21408@item gnus-summary-expunge-below
21409@vindex gnus-summary-expunge-below
21410Don't display the summary lines of articles that have scores lower than
21411this variable. This is @code{nil} by default, which means that no
21412articles will be hidden. This variable is local to the summary buffers,
21413and has to be set from @code{gnus-summary-mode-hook}.
21414
21415@item gnus-score-over-mark
21416@vindex gnus-score-over-mark
21417Mark (in the third column) used for articles with a score over the
21418default. Default is @samp{+}.
21419
21420@item gnus-score-below-mark
21421@vindex gnus-score-below-mark
21422Mark (in the third column) used for articles with a score below the
21423default. Default is @samp{-}.
21424
21425@item gnus-score-find-score-files-function
21426@vindex gnus-score-find-score-files-function
21427Function used to find score files for the current group. This function
21428is called with the name of the group as the argument.
21429
21430Predefined functions available are:
21431@table @code
21432
21433@item gnus-score-find-single
21434@findex gnus-score-find-single
21435Only apply the group's own score file.
21436
21437@item gnus-score-find-bnews
21438@findex gnus-score-find-bnews
21439Apply all score files that match, using bnews syntax. This is the
21440default. If the current group is @samp{gnu.emacs.gnus}, for instance,
21441@file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and
21442@file{gnu.all.SCORE} would all apply. In short, the instances of
21443@samp{all} in the score file names are translated into @samp{.*}, and
21444then a regexp match is done.
21445
21446This means that if you have some score entries that you want to apply to
21447all groups, then you put those entries in the @file{all.SCORE} file.
21448
21449The score files are applied in a semi-random order, although Gnus will
21450try to apply the more general score files before the more specific score
21451files. It does this by looking at the number of elements in the score
21452file names---discarding the @samp{all} elements.
21453
21454@item gnus-score-find-hierarchical
21455@findex gnus-score-find-hierarchical
21456Apply all score files from all the parent groups. This means that you
21457can't have score files like @file{all.SCORE}, but you can have
21458@file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE} for each
21459server.
21460
21461@end table
21462This variable can also be a list of functions. In that case, all
21463these functions will be called with the group name as argument, and
21464all the returned lists of score files will be applied. These
21465functions can also return lists of lists of score alists directly. In
21466that case, the functions that return these non-file score alists
21467should probably be placed before the ``real'' score file functions, to
21468ensure that the last score file returned is the local score file.
21469Phu.
21470
21471For example, to do hierarchical scoring but use a non-server-specific
21472overall score file, you could use the value
21473@example
21474(list (lambda (group) ("all.SCORE"))
21475 'gnus-score-find-hierarchical)
21476@end example
21477
21478@item gnus-score-expiry-days
21479@vindex gnus-score-expiry-days
21480This variable says how many days should pass before an unused score file
21481entry is expired. If this variable is @code{nil}, no score file entries
21482are expired. It's 7 by default.
21483
21484@item gnus-update-score-entry-dates
21485@vindex gnus-update-score-entry-dates
21486If this variable is non-@code{nil}, temporary score entries that have
21487been triggered (matched) will have their dates updated. (This is how Gnus
21488controls expiry---all non-matched-entries will become too old while
21489matched entries will stay fresh and young.) However, if you set this
21490variable to @code{nil}, even matched entries will grow old and will
21491have to face that oh-so grim reaper.
21492
21493@item gnus-score-after-write-file-function
21494@vindex gnus-score-after-write-file-function
21495Function called with the name of the score file just written.
21496
21497@item gnus-score-thread-simplify
21498@vindex gnus-score-thread-simplify
21499If this variable is non-@code{nil}, article subjects will be
21500simplified for subject scoring purposes in the same manner as with
21501threading---according to the current value of
21502@code{gnus-simplify-subject-functions}. If the scoring entry uses
21503@code{substring} or @code{exact} matching, the match will also be
21504simplified in this manner.
21505
21506@end table
21507
21508
21509@node Score File Format
21510@section Score File Format
21511@cindex score file format
21512
21513A score file is an @code{emacs-lisp} file that normally contains just a
21514single form. Casual users are not expected to edit these files;
21515everything can be changed from the summary buffer.
21516
21517Anyway, if you'd like to dig into it yourself, here's an example:
21518
21519@lisp
21520(("from"
21521 ("Lars Ingebrigtsen" -10000)
21522 ("Per Abrahamsen")
21523 ("larsi\\|lmi" -50000 nil R))
21524 ("subject"
21525 ("Ding is Badd" nil 728373))
21526 ("xref"
21527 ("alt.politics" -1000 728372 s))
21528 ("lines"
21529 (2 -100 nil <))
21530 (mark 0)
21531 (expunge -1000)
21532 (mark-and-expunge -10)
21533 (read-only nil)
21534 (orphan -10)
21535 (adapt t)
21536 (files "/hom/larsi/News/gnu.SCORE")
21537 (exclude-files "all.SCORE")
21538 (local (gnus-newsgroup-auto-expire t)
21539 (gnus-summary-make-false-root empty))
21540 (eval (ding)))
21541@end lisp
21542
21543This example demonstrates most score file elements. @xref{Advanced
21544Scoring}, for a different approach.
21545
21546Even though this looks much like Lisp code, nothing here is actually
21547@code{eval}ed. The Lisp reader is used to read this form, though, so it
21548has to be valid syntactically, if not semantically.
21549
21550Six keys are supported by this alist:
21551
21552@table @code
21553
21554@item STRING
21555If the key is a string, it is the name of the header to perform the
21556match on. Scoring can only be performed on these eight headers:
21557@code{From}, @code{Subject}, @code{References}, @code{Message-ID},
21558@code{Xref}, @code{Lines}, @code{Chars} and @code{Date}. In addition to
21559these headers, there are three strings to tell Gnus to fetch the entire
21560article and do the match on larger parts of the article: @code{Body}
21561will perform the match on the body of the article, @code{Head} will
21562perform the match on the head of the article, and @code{All} will
21563perform the match on the entire article. Note that using any of these
21564last three keys will slow down group entry @emph{considerably}. The
21565final ``header'' you can score on is @code{Followup}. These score
21566entries will result in new score entries being added for all follow-ups
21567to articles that matches these score entries.
21568
21569Following this key is an arbitrary number of score entries, where each
21570score entry has one to four elements.
21571@enumerate
21572
21573@item
21574The first element is the @dfn{match element}. On most headers this will
21575be a string, but on the Lines and Chars headers, this must be an
21576integer.
21577
21578@item
21579If the second element is present, it should be a number---the @dfn{score
21580element}. This number should be an integer in the neginf to posinf
21581interval. This number is added to the score of the article if the match
21582is successful. If this element is not present, the
21583@code{gnus-score-interactive-default-score} number will be used
21584instead. This is 1000 by default.
21585
21586@item
21587If the third element is present, it should be a number---the @dfn{date
21588element}. This date says when the last time this score entry matched,
21589which provides a mechanism for expiring the score entries. It this
21590element is not present, the score entry is permanent. The date is
21591represented by the number of days since December 31, 1 BCE.
21592
21593@item
21594If the fourth element is present, it should be a symbol---the @dfn{type
21595element}. This element specifies what function should be used to see
21596whether this score entry matches the article. What match types that can
21597be used depends on what header you wish to perform the match on.
21598@table @dfn
21599
21600@item From, Subject, References, Xref, Message-ID
21601For most header types, there are the @code{r} and @code{R} (regexp), as
21602well as @code{s} and @code{S} (substring) types, and @code{e} and
21603@code{E} (exact match), and @code{w} (word match) types. If this
21604element is not present, Gnus will assume that substring matching should
21605be used. @code{R}, @code{S}, and @code{E} differ from the others in
21606that the matches will be done in a case-sensitive manner. All these
21607one-letter types are really just abbreviations for the @code{regexp},
21608@code{string}, @code{exact}, and @code{word} types, which you can use
21609instead, if you feel like.
21610
21611@item Extra
21612Just as for the standard string overview headers, if you are using
21613gnus-extra-headers, you can score on these headers' values. In this
21614case, there is a 5th element in the score entry, being the name of the
21615header to be scored. The following entry is useful in your
21616@file{all.SCORE} file in case of spam attacks from a single origin
21617host, if your @acronym{NNTP} server tracks @samp{NNTP-Posting-Host} in
21618overviews:
21619
21620@lisp
21621("111.222.333.444" -1000 nil s
21622 "NNTP-Posting-Host")
21623@end lisp
21624
21625@item Lines, Chars
21626These two headers use different match types: @code{<}, @code{>},
21627@code{=}, @code{>=} and @code{<=}.
21628
21629These predicates are true if
21630
21631@example
21632(PREDICATE HEADER MATCH)
21633@end example
21634
21635evaluates to non-@code{nil}. For instance, the advanced match
21636@code{("lines" 4 <)} (@pxref{Advanced Scoring}) will result in the
21637following form:
21638
21639@lisp
21640(< header-value 4)
21641@end lisp
21642
21643Or to put it another way: When using @code{<} on @code{Lines} with 4 as
21644the match, we get the score added if the article has less than 4 lines.
21645(It's easy to get confused and think it's the other way around. But
21646it's not. I think.)
21647
21648When matching on @code{Lines}, be careful because some back ends (like
21649@code{nndir}) do not generate @code{Lines} header, so every article ends
21650up being marked as having 0 lines. This can lead to strange results if
21651you happen to lower score of the articles with few lines.
21652
21653@item Date
21654For the Date header we have three kinda silly match types:
21655@code{before}, @code{at} and @code{after}. I can't really imagine this
21656ever being useful, but, like, it would feel kinda silly not to provide
21657this function. Just in case. You never know. Better safe than sorry.
21658Once burnt, twice shy. Don't judge a book by its cover. Never not have
21659sex on a first date. (I have been told that at least one person, and I
21660quote, ``found this function indispensable'', however.)
21661
21662@cindex ISO8601
21663@cindex date
21664A more useful match type is @code{regexp}. With it, you can match the
21665date string using a regular expression. The date is normalized to
21666ISO8601 compact format first---@var{YYYYMMDD}@code{T}@var{HHMMSS}. If
21667you want to match all articles that have been posted on April 1st in
21668every year, you could use @samp{....0401.........} as a match string,
21669for instance. (Note that the date is kept in its original time zone, so
21670this will match articles that were posted when it was April 1st where
21671the article was posted from. Time zones are such wholesome fun for the
21672whole family, eh?)
21673
21674@item Head, Body, All
21675These three match keys use the same match types as the @code{From} (etc)
21676header uses.
21677
21678@item Followup
21679This match key is somewhat special, in that it will match the
21680@code{From} header, and affect the score of not only the matching
21681articles, but also all followups to the matching articles. This allows
21682you e.g. increase the score of followups to your own articles, or
21683decrease the score of followups to the articles of some known
21684trouble-maker. Uses the same match types as the @code{From} header
21685uses. (Using this match key will lead to creation of @file{ADAPT}
21686files.)
21687
21688@item Thread
21689This match key works along the same lines as the @code{Followup} match
21690key. If you say that you want to score on a (sub-)thread started by an
21691article with a @code{Message-ID} @var{x}, then you add a @samp{thread}
21692match. This will add a new @samp{thread} match for each article that
21693has @var{x} in its @code{References} header. (These new @samp{thread}
21694matches will use the @code{Message-ID}s of these matching articles.)
21695This will ensure that you can raise/lower the score of an entire thread,
21696even though some articles in the thread may not have complete
21697@code{References} headers. Note that using this may lead to
21698undeterministic scores of the articles in the thread. (Using this match
21699key will lead to creation of @file{ADAPT} files.)
21700@end table
21701@end enumerate
21702
21703@cindex score file atoms
21704@item mark
21705The value of this entry should be a number. Any articles with a score
21706lower than this number will be marked as read.
21707
21708@item expunge
21709The value of this entry should be a number. Any articles with a score
21710lower than this number will be removed from the summary buffer.
21711
21712@item mark-and-expunge
21713The value of this entry should be a number. Any articles with a score
21714lower than this number will be marked as read and removed from the
21715summary buffer.
21716
21717@item thread-mark-and-expunge
21718The value of this entry should be a number. All articles that belong to
21719a thread that has a total score below this number will be marked as read
21720and removed from the summary buffer. @code{gnus-thread-score-function}
21721says how to compute the total score for a thread.
21722
21723@item files
21724The value of this entry should be any number of file names. These files
21725are assumed to be score files as well, and will be loaded the same way
21726this one was.
21727
21728@item exclude-files
21729The clue of this entry should be any number of files. These files will
21730not be loaded, even though they would normally be so, for some reason or
21731other.
21732
21733@item eval
21734The value of this entry will be @code{eval}el. This element will be
21735ignored when handling global score files.
21736
21737@item read-only
21738Read-only score files will not be updated or saved. Global score files
21739should feature this atom (@pxref{Global Score Files}). (Note:
21740@dfn{Global} here really means @dfn{global}; not your personal
21741apply-to-all-groups score files.)
21742
21743@item orphan
21744The value of this entry should be a number. Articles that do not have
21745parents will get this number added to their scores. Imagine you follow
21746some high-volume newsgroup, like @samp{comp.lang.c}. Most likely you
21747will only follow a few of the threads, also want to see any new threads.
21748
21749You can do this with the following two score file entries:
21750
21751@example
21752 (orphan -500)
21753 (mark-and-expunge -100)
21754@end example
21755
21756When you enter the group the first time, you will only see the new
21757threads. You then raise the score of the threads that you find
21758interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) the
21759rest. Next time you enter the group, you will see new articles in the
21760interesting threads, plus any new threads.
21761
21762I.e.---the orphan score atom is for high-volume groups where a few
21763interesting threads which can't be found automatically by ordinary
21764scoring rules exist.
21765
21766@item adapt
21767This entry controls the adaptive scoring. If it is @code{t}, the
21768default adaptive scoring rules will be used. If it is @code{ignore}, no
21769adaptive scoring will be performed on this group. If it is a list, this
21770list will be used as the adaptive scoring rules. If it isn't present,
21771or is something other than @code{t} or @code{ignore}, the default
21772adaptive scoring rules will be used. If you want to use adaptive
21773scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to
21774@code{t}, and insert an @code{(adapt ignore)} in the groups where you do
21775not want adaptive scoring. If you only want adaptive scoring in a few
21776groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and
21777insert @code{(adapt t)} in the score files of the groups where you want
21778it.
21779
21780@item adapt-file
21781All adaptive score entries will go to the file named by this entry. It
21782will also be applied when entering the group. This atom might be handy
21783if you want to adapt on several groups at once, using the same adaptive
21784file for a number of groups.
21785
21786@item local
21787@cindex local variables
21788The value of this entry should be a list of @code{(@var{var}
21789@var{value})} pairs. Each @var{var} will be made buffer-local to the
21790current summary buffer, and set to the value specified. This is a
21791convenient, if somewhat strange, way of setting variables in some
21792groups if you don't like hooks much. Note that the @var{value} won't
21793be evaluated.
21794@end table
21795
21796
21797@node Score File Editing
21798@section Score File Editing
21799
21800You normally enter all scoring commands from the summary buffer, but you
21801might feel the urge to edit them by hand as well, so we've supplied you
21802with a mode for that.
21803
21804It's simply a slightly customized @code{emacs-lisp} mode, with these
21805additional commands:
21806
21807@table @kbd
21808
21809@item C-c C-c
21810@kindex C-c C-c (Score)
87035689 21811@findex gnus-score-edit-exit
4009494e 21812Save the changes you have made and return to the summary buffer
87035689 21813(@code{gnus-score-edit-exit}).
4009494e
GM
21814
21815@item C-c C-d
21816@kindex C-c C-d (Score)
21817@findex gnus-score-edit-insert-date
21818Insert the current date in numerical format
21819(@code{gnus-score-edit-insert-date}). This is really the day number, if
21820you were wondering.
21821
21822@item C-c C-p
21823@kindex C-c C-p (Score)
21824@findex gnus-score-pretty-print
21825The adaptive score files are saved in an unformatted fashion. If you
21826intend to read one of these files, you want to @dfn{pretty print} it
21827first. This command (@code{gnus-score-pretty-print}) does that for
21828you.
21829
21830@end table
21831
21832Type @kbd{M-x gnus-score-mode} to use this mode.
21833
21834@vindex gnus-score-mode-hook
21835@code{gnus-score-menu-hook} is run in score mode buffers.
21836
21837In the summary buffer you can use commands like @kbd{V f}, @kbd{V e} and
21838@kbd{V t} to begin editing score files.
21839
21840
21841@node Adaptive Scoring
21842@section Adaptive Scoring
21843@cindex adaptive scoring
21844
21845If all this scoring is getting you down, Gnus has a way of making it all
21846happen automatically---as if by magic. Or rather, as if by artificial
21847stupidity, to be precise.
21848
21849@vindex gnus-use-adaptive-scoring
21850When you read an article, or mark an article as read, or kill an
21851article, you leave marks behind. On exit from the group, Gnus can sniff
21852these marks and add score elements depending on what marks it finds.
21853You turn on this ability by setting @code{gnus-use-adaptive-scoring} to
21854@code{t} or @code{(line)}. If you want score adaptively on separate
21855words appearing in the subjects, you should set this variable to
21856@code{(word)}. If you want to use both adaptive methods, set this
21857variable to @code{(word line)}.
21858
21859@vindex gnus-default-adaptive-score-alist
21860To give you complete control over the scoring process, you can customize
21861the @code{gnus-default-adaptive-score-alist} variable. For instance, it
21862might look something like this:
21863
21864@lisp
21865(setq gnus-default-adaptive-score-alist
21866 '((gnus-unread-mark)
21867 (gnus-ticked-mark (from 4))
21868 (gnus-dormant-mark (from 5))
21869 (gnus-del-mark (from -4) (subject -1))
21870 (gnus-read-mark (from 4) (subject 2))
21871 (gnus-expirable-mark (from -1) (subject -1))
21872 (gnus-killed-mark (from -1) (subject -3))
21873 (gnus-kill-file-mark)
21874 (gnus-ancient-mark)
21875 (gnus-low-score-mark)
21876 (gnus-catchup-mark (from -1) (subject -1))))
21877@end lisp
21878
21879As you see, each element in this alist has a mark as a key (either a
21880variable name or a ``real'' mark---a character). Following this key is
21881a arbitrary number of header/score pairs. If there are no header/score
21882pairs following the key, no adaptive scoring will be done on articles
21883that have that key as the article mark. For instance, articles with
21884@code{gnus-unread-mark} in the example above will not get adaptive score
21885entries.
21886
21887Each article can have only one mark, so just a single of these rules
21888will be applied to each article.
21889
21890To take @code{gnus-del-mark} as an example---this alist says that all
21891articles that have that mark (i.e., are marked with @samp{e}) will have a
21892score entry added to lower based on the @code{From} header by -4, and
21893lowered by @code{Subject} by -1. Change this to fit your prejudices.
21894
21895If you have marked 10 articles with the same subject with
21896@code{gnus-del-mark}, the rule for that mark will be applied ten times.
21897That means that that subject will get a score of ten times -1, which
21898should be, unless I'm much mistaken, -10.
21899
21900If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), all
21901the read articles will be marked with the @samp{E} mark. This'll
21902probably make adaptive scoring slightly impossible, so auto-expiring and
21903adaptive scoring doesn't really mix very well.
21904
21905The headers you can score on are @code{from}, @code{subject},
21906@code{message-id}, @code{references}, @code{xref}, @code{lines},
21907@code{chars} and @code{date}. In addition, you can score on
21908@code{followup}, which will create an adaptive score entry that matches
21909on the @code{References} header using the @code{Message-ID} of the
21910current article, thereby matching the following thread.
21911
21912If you use this scheme, you should set the score file atom @code{mark}
21913to something small---like -300, perhaps, to avoid having small random
21914changes result in articles getting marked as read.
21915
21916After using adaptive scoring for a week or so, Gnus should start to
21917become properly trained and enhance the authors you like best, and kill
21918the authors you like least, without you having to say so explicitly.
21919
21920You can control what groups the adaptive scoring is to be performed on
21921by using the score files (@pxref{Score File Format}). This will also
21922let you use different rules in different groups.
21923
21924@vindex gnus-adaptive-file-suffix
21925The adaptive score entries will be put into a file where the name is the
21926group name with @code{gnus-adaptive-file-suffix} appended. The default
21927is @file{ADAPT}.
21928
01c52d31
MB
21929@vindex gnus-adaptive-pretty-print
21930Adaptive score files can get huge and are not meant to be edited by
21931human hands. If @code{gnus-adaptive-pretty-print} is @code{nil} (the
21932deafult) those files will not be written in a human readable way.
21933
4009494e
GM
21934@vindex gnus-score-exact-adapt-limit
21935When doing adaptive scoring, substring or fuzzy matching would probably
21936give you the best results in most cases. However, if the header one
21937matches is short, the possibility for false positives is great, so if
21938the length of the match is less than
21939@code{gnus-score-exact-adapt-limit}, exact matching will be used. If
21940this variable is @code{nil}, exact matching will always be used to avoid
21941this problem.
21942
21943@vindex gnus-default-adaptive-word-score-alist
21944As mentioned above, you can adapt either on individual words or entire
21945headers. If you adapt on words, the
21946@code{gnus-default-adaptive-word-score-alist} variable says what score
21947each instance of a word should add given a mark.
21948
21949@lisp
21950(setq gnus-default-adaptive-word-score-alist
21951 `((,gnus-read-mark . 30)
21952 (,gnus-catchup-mark . -10)
21953 (,gnus-killed-mark . -20)
21954 (,gnus-del-mark . -15)))
21955@end lisp
21956
21957This is the default value. If you have adaption on words enabled, every
21958word that appears in subjects of articles marked with
21959@code{gnus-read-mark} will result in a score rule that increase the
21960score with 30 points.
21961
21962@vindex gnus-default-ignored-adaptive-words
21963@vindex gnus-ignored-adaptive-words
21964Words that appear in the @code{gnus-default-ignored-adaptive-words} list
21965will be ignored. If you wish to add more words to be ignored, use the
21966@code{gnus-ignored-adaptive-words} list instead.
21967
21968@vindex gnus-adaptive-word-length-limit
21969Some may feel that short words shouldn't count when doing adaptive
21970scoring. If so, you may set @code{gnus-adaptive-word-length-limit} to
21971an integer. Words shorter than this number will be ignored. This
21972variable defaults to @code{nil}.
21973
21974@vindex gnus-adaptive-word-syntax-table
21975When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the
21976syntax table in effect. It is similar to the standard syntax table, but
21977it considers numbers to be non-word-constituent characters.
21978
21979@vindex gnus-adaptive-word-minimum
21980If @code{gnus-adaptive-word-minimum} is set to a number, the adaptive
21981word scoring process will never bring down the score of an article to
21982below this number. The default is @code{nil}.
21983
21984@vindex gnus-adaptive-word-no-group-words
21985If @code{gnus-adaptive-word-no-group-words} is set to @code{t}, gnus
21986won't adaptively word score any of the words in the group name. Useful
21987for groups like @samp{comp.editors.emacs}, where most of the subject
21988lines contain the word @samp{emacs}.
21989
21990After using this scheme for a while, it might be nice to write a
21991@code{gnus-psychoanalyze-user} command to go through the rules and see
21992what words you like and what words you don't like. Or perhaps not.
21993
21994Note that the adaptive word scoring thing is highly experimental and is
21995likely to change in the future. Initial impressions seem to indicate
21996that it's totally useless as it stands. Some more work (involving more
21997rigorous statistical methods) will have to be done to make this useful.
21998
21999
22000@node Home Score File
22001@section Home Score File
22002
22003The score file where new score file entries will go is called the
22004@dfn{home score file}. This is normally (and by default) the score file
22005for the group itself. For instance, the home score file for
22006@samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}.
22007
22008However, this may not be what you want. It is often convenient to share
22009a common home score file among many groups---all @samp{emacs} groups
22010could perhaps use the same home score file.
22011
22012@vindex gnus-home-score-file
22013The variable that controls this is @code{gnus-home-score-file}. It can
22014be:
22015
22016@enumerate
22017@item
22018A string. Then this file will be used as the home score file for all
22019groups.
22020
22021@item
22022A function. The result of this function will be used as the home score
22023file. The function will be called with the name of the group as the
22024parameter.
22025
22026@item
22027A list. The elements in this list can be:
22028
22029@enumerate
22030@item
22031@code{(@var{regexp} @var{file-name})}. If the @var{regexp} matches the
22032group name, the @var{file-name} will be used as the home score file.
22033
22034@item
22035A function. If the function returns non-@code{nil}, the result will
22036be used as the home score file. The function will be called with the
22037name of the group as the parameter.
22038
22039@item
22040A string. Use the string as the home score file.
22041@end enumerate
22042
22043The list will be traversed from the beginning towards the end looking
22044for matches.
22045
22046@end enumerate
22047
22048So, if you want to use just a single score file, you could say:
22049
22050@lisp
22051(setq gnus-home-score-file
22052 "my-total-score-file.SCORE")
22053@end lisp
22054
22055If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and
22056@file{rec.SCORE} for all @samp{rec} groups (and so on), you can say:
22057
22058@findex gnus-hierarchial-home-score-file
22059@lisp
22060(setq gnus-home-score-file
22061 'gnus-hierarchial-home-score-file)
22062@end lisp
22063
22064This is a ready-made function provided for your convenience.
22065Other functions include
22066
22067@table @code
22068@item gnus-current-home-score-file
22069@findex gnus-current-home-score-file
22070Return the ``current'' regular score file. This will make scoring
22071commands add entry to the ``innermost'' matching score file.
22072
22073@end table
22074
22075If you want to have one score file for the @samp{emacs} groups and
22076another for the @samp{comp} groups, while letting all other groups use
22077their own home score files:
22078
22079@lisp
22080(setq gnus-home-score-file
22081 ;; @r{All groups that match the regexp @code{"\\.emacs"}}
22082 '(("\\.emacs" "emacs.SCORE")
22083 ;; @r{All the comp groups in one score file}
22084 ("^comp" "comp.SCORE")))
22085@end lisp
22086
22087@vindex gnus-home-adapt-file
22088@code{gnus-home-adapt-file} works exactly the same way as
22089@code{gnus-home-score-file}, but says what the home adaptive score file
22090is instead. All new adaptive file entries will go into the file
22091specified by this variable, and the same syntax is allowed.
22092
22093In addition to using @code{gnus-home-score-file} and
22094@code{gnus-home-adapt-file}, you can also use group parameters
22095(@pxref{Group Parameters}) and topic parameters (@pxref{Topic
22096Parameters}) to achieve much the same. Group and topic parameters take
22097precedence over this variable.
22098
22099
22100@node Followups To Yourself
22101@section Followups To Yourself
22102
22103Gnus offers two commands for picking out the @code{Message-ID} header in
22104the current buffer. Gnus will then add a score rule that scores using
22105this @code{Message-ID} on the @code{References} header of other
22106articles. This will, in effect, increase the score of all articles that
22107respond to the article in the current buffer. Quite useful if you want
22108to easily note when people answer what you've said.
22109
22110@table @code
22111
22112@item gnus-score-followup-article
22113@findex gnus-score-followup-article
22114This will add a score to articles that directly follow up your own
22115article.
22116
22117@item gnus-score-followup-thread
22118@findex gnus-score-followup-thread
22119This will add a score to all articles that appear in a thread ``below''
22120your own article.
22121@end table
22122
22123@vindex message-sent-hook
22124These two functions are both primarily meant to be used in hooks like
22125@code{message-sent-hook}, like this:
22126@lisp
22127(add-hook 'message-sent-hook 'gnus-score-followup-thread)
22128@end lisp
22129
22130
22131If you look closely at your own @code{Message-ID}, you'll notice that
22132the first two or three characters are always the same. Here's two of
22133mine:
22134
22135@example
22136<x6u3u47icf.fsf@@eyesore.no>
22137<x6sp9o7ibw.fsf@@eyesore.no>
22138@end example
22139
22140So ``my'' ident on this machine is @samp{x6}. This can be
22141exploited---the following rule will raise the score on all followups to
22142myself:
22143
22144@lisp
22145("references"
22146 ("<x6[0-9a-z]+\\.fsf\\(_-_\\)?@@.*eyesore\\.no>"
22147 1000 nil r))
22148@end lisp
22149
22150Whether it's the first two or first three characters that are ``yours''
22151is system-dependent.
22152
22153
22154@node Scoring On Other Headers
22155@section Scoring On Other Headers
22156@cindex scoring on other headers
22157
22158Gnus is quite fast when scoring the ``traditional''
22159headers---@samp{From}, @samp{Subject} and so on. However, scoring
22160other headers requires writing a @code{head} scoring rule, which means
22161that Gnus has to request every single article from the back end to find
22162matches. This takes a long time in big groups.
22163
58333467
MB
22164@vindex gnus-inhibit-slow-scoring
22165You can inhibit this slow scoring on headers or body by setting the
22166variable @code{gnus-inhibit-slow-scoring}. If
22167@code{gnus-inhibit-slow-scoring} is regexp, slow scoring is inhibited if
22168the group matches the regexp. If it is t, slow scoring on it is
22169inhibited for all groups.
22170
22171Now, there's not much you can do about the slowness for news groups, but for
4009494e
GM
22172mail groups, you have greater control. In @ref{To From Newsgroups},
22173it's explained in greater detail what this mechanism does, but here's
22174a cookbook example for @code{nnml} on how to allow scoring on the
22175@samp{To} and @samp{Cc} headers.
22176
22177Put the following in your @file{~/.gnus.el} file.
22178
22179@lisp
22180(setq gnus-extra-headers '(To Cc Newsgroups Keywords)
22181 nnmail-extra-headers gnus-extra-headers)
22182@end lisp
22183
22184Restart Gnus and rebuild your @code{nnml} overview files with the
22185@kbd{M-x nnml-generate-nov-databases} command. This will take a long
22186time if you have much mail.
22187
22188Now you can score on @samp{To} and @samp{Cc} as ``extra headers'' like
22189so: @kbd{I e s p To RET <your name> RET}.
22190
22191See? Simple.
22192
22193
22194@node Scoring Tips
22195@section Scoring Tips
22196@cindex scoring tips
22197
22198@table @dfn
22199
22200@item Crossposts
22201@cindex crossposts
22202@cindex scoring crossposts
22203If you want to lower the score of crossposts, the line to match on is
22204the @code{Xref} header.
22205@lisp
22206("xref" (" talk.politics.misc:" -1000))
22207@end lisp
22208
22209@item Multiple crossposts
22210If you want to lower the score of articles that have been crossposted to
22211more than, say, 3 groups:
22212@lisp
22213("xref"
22214 ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+"
22215 -1000 nil r))
22216@end lisp
22217
22218@item Matching on the body
22219This is generally not a very good idea---it takes a very long time.
22220Gnus actually has to fetch each individual article from the server. But
22221you might want to anyway, I guess. Even though there are three match
22222keys (@code{Head}, @code{Body} and @code{All}), you should choose one
22223and stick with it in each score file. If you use any two, each article
22224will be fetched @emph{twice}. If you want to match a bit on the
22225@code{Head} and a bit on the @code{Body}, just use @code{All} for all
22226the matches.
22227
22228@item Marking as read
22229You will probably want to mark articles that have scores below a certain
22230number as read. This is most easily achieved by putting the following
22231in your @file{all.SCORE} file:
22232@lisp
22233((mark -100))
22234@end lisp
22235You may also consider doing something similar with @code{expunge}.
22236
22237@item Negated character classes
22238If you say stuff like @code{[^abcd]*}, you may get unexpected results.
22239That will match newlines, which might lead to, well, The Unknown. Say
22240@code{[^abcd\n]*} instead.
22241@end table
22242
22243
22244@node Reverse Scoring
22245@section Reverse Scoring
22246@cindex reverse scoring
22247
22248If you want to keep just articles that have @samp{Sex with Emacs} in the
22249subject header, and expunge all other articles, you could put something
22250like this in your score file:
22251
22252@lisp
22253(("subject"
22254 ("Sex with Emacs" 2))
22255 (mark 1)
22256 (expunge 1))
22257@end lisp
22258
22259So, you raise all articles that match @samp{Sex with Emacs} and mark the
22260rest as read, and expunge them to boot.
22261
22262
22263@node Global Score Files
22264@section Global Score Files
22265@cindex global score files
22266
22267Sure, other newsreaders have ``global kill files''. These are usually
22268nothing more than a single kill file that applies to all groups, stored
22269in the user's home directory. Bah! Puny, weak newsreaders!
22270
22271What I'm talking about here are Global Score Files. Score files from
22272all over the world, from users everywhere, uniting all nations in one
22273big, happy score file union! Ange-score! New and untested!
22274
22275@vindex gnus-global-score-files
22276All you have to do to use other people's score files is to set the
22277@code{gnus-global-score-files} variable. One entry for each score file,
22278or each score file directory. Gnus will decide by itself what score
22279files are applicable to which group.
22280
22281To use the score file
22282@file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} and
22283all score files in the @file{/ftp@@ftp.some-where:/pub/score} directory,
22284say this:
22285
22286@lisp
22287(setq gnus-global-score-files
22288 '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE"
22289 "/ftp@@ftp.some-where:/pub/score/"))
22290@end lisp
22291
22292@findex gnus-score-search-global-directories
22293@noindent
22294Simple, eh? Directory names must end with a @samp{/}. These
22295directories are typically scanned only once during each Gnus session.
22296If you feel the need to manually re-scan the remote directories, you can
22297use the @code{gnus-score-search-global-directories} command.
22298
22299Note that, at present, using this option will slow down group entry
22300somewhat. (That is---a lot.)
22301
22302If you want to start maintaining score files for other people to use,
22303just put your score file up for anonymous ftp and announce it to the
22304world. Become a retro-moderator! Participate in the retro-moderator
22305wars sure to ensue, where retro-moderators battle it out for the
22306sympathy of the people, luring them to use their score files on false
22307premises! Yay! The net is saved!
22308
22309Here are some tips for the would-be retro-moderator, off the top of my
22310head:
22311
22312@itemize @bullet
22313
22314@item
22315Articles heavily crossposted are probably junk.
22316@item
22317To lower a single inappropriate article, lower by @code{Message-ID}.
22318@item
22319Particularly brilliant authors can be raised on a permanent basis.
22320@item
22321Authors that repeatedly post off-charter for the group can safely be
22322lowered out of existence.
22323@item
22324Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest
22325articles completely.
22326
22327@item
22328Use expiring score entries to keep the size of the file down. You
22329should probably have a long expiry period, though, as some sites keep
22330old articles for a long time.
22331@end itemize
22332
22333@dots{} I wonder whether other newsreaders will support global score files
22334in the future. @emph{Snicker}. Yup, any day now, newsreaders like Blue
22335Wave, xrn and 1stReader are bound to implement scoring. Should we start
22336holding our breath yet?
22337
22338
22339@node Kill Files
22340@section Kill Files
22341@cindex kill files
22342
22343Gnus still supports those pesky old kill files. In fact, the kill file
22344entries can now be expiring, which is something I wrote before Daniel
22345Quinlan thought of doing score files, so I've left the code in there.
22346
22347In short, kill processing is a lot slower (and I do mean @emph{a lot})
22348than score processing, so it might be a good idea to rewrite your kill
22349files into score files.
22350
22351Anyway, a kill file is a normal @code{emacs-lisp} file. You can put any
22352forms into this file, which means that you can use kill files as some
22353sort of primitive hook function to be run on group entry, even though
22354that isn't a very good idea.
22355
22356Normal kill files look like this:
22357
22358@lisp
22359(gnus-kill "From" "Lars Ingebrigtsen")
22360(gnus-kill "Subject" "ding")
22361(gnus-expunge "X")
22362@end lisp
22363
22364This will mark every article written by me as read, and remove the
22365marked articles from the summary buffer. Very useful, you'll agree.
22366
22367Other programs use a totally different kill file syntax. If Gnus
22368encounters what looks like a @code{rn} kill file, it will take a stab at
22369interpreting it.
22370
22371Two summary functions for editing a @sc{gnus} kill file:
22372
22373@table @kbd
22374
22375@item M-k
22376@kindex M-k (Summary)
22377@findex gnus-summary-edit-local-kill
22378Edit this group's kill file (@code{gnus-summary-edit-local-kill}).
22379
22380@item M-K
22381@kindex M-K (Summary)
22382@findex gnus-summary-edit-global-kill
22383Edit the general kill file (@code{gnus-summary-edit-global-kill}).
22384@end table
22385
22386Two group mode functions for editing the kill files:
22387
22388@table @kbd
22389
22390@item M-k
22391@kindex M-k (Group)
22392@findex gnus-group-edit-local-kill
22393Edit this group's kill file (@code{gnus-group-edit-local-kill}).
22394
22395@item M-K
22396@kindex M-K (Group)
22397@findex gnus-group-edit-global-kill
22398Edit the general kill file (@code{gnus-group-edit-global-kill}).
22399@end table
22400
22401Kill file variables:
22402
22403@table @code
22404@item gnus-kill-file-name
22405@vindex gnus-kill-file-name
22406A kill file for the group @samp{soc.motss} is normally called
22407@file{soc.motss.KILL}. The suffix appended to the group name to get
22408this file name is detailed by the @code{gnus-kill-file-name} variable.
22409The ``global'' kill file (not in the score file sense of ``global'', of
22410course) is just called @file{KILL}.
22411
22412@vindex gnus-kill-save-kill-file
22413@item gnus-kill-save-kill-file
22414If this variable is non-@code{nil}, Gnus will save the
22415kill file after processing, which is necessary if you use expiring
22416kills.
22417
22418@item gnus-apply-kill-hook
22419@vindex gnus-apply-kill-hook
22420@findex gnus-apply-kill-file-unless-scored
22421@findex gnus-apply-kill-file
22422A hook called to apply kill files to a group. It is
22423@code{(gnus-apply-kill-file)} by default. If you want to ignore the
22424kill file if you have a score file for the same group, you can set this
22425hook to @code{(gnus-apply-kill-file-unless-scored)}. If you don't want
22426kill files to be processed, you should set this variable to @code{nil}.
22427
22428@item gnus-kill-file-mode-hook
22429@vindex gnus-kill-file-mode-hook
22430A hook called in kill-file mode buffers.
22431
22432@end table
22433
22434
22435@node Converting Kill Files
22436@section Converting Kill Files
22437@cindex kill files
22438@cindex converting kill files
22439
22440If you have loads of old kill files, you may want to convert them into
22441score files. If they are ``regular'', you can use
22442the @file{gnus-kill-to-score.el} package; if not, you'll have to do it
22443by hand.
22444
22445The kill to score conversion package isn't included in Gnus by default.
22446You can fetch it from
22447@uref{http://www.stud.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el}.
22448
22449If your old kill files are very complex---if they contain more
22450non-@code{gnus-kill} forms than not, you'll have to convert them by
22451hand. Or just let them be as they are. Gnus will still use them as
22452before.
22453
22454
4009494e
GM
22455@node Advanced Scoring
22456@section Advanced Scoring
22457
22458Scoring on Subjects and From headers is nice enough, but what if you're
22459really interested in what a person has to say only when she's talking
22460about a particular subject? Or what if you really don't want to
22461read what person A has to say when she's following up to person B, but
22462want to read what she says when she's following up to person C?
22463
22464By using advanced scoring rules you may create arbitrarily complex
22465scoring patterns.
22466
22467@menu
22468* Advanced Scoring Syntax:: A definition.
22469* Advanced Scoring Examples:: What they look like.
22470* Advanced Scoring Tips:: Getting the most out of it.
22471@end menu
22472
22473
22474@node Advanced Scoring Syntax
22475@subsection Advanced Scoring Syntax
22476
22477Ordinary scoring rules have a string as the first element in the rule.
22478Advanced scoring rules have a list as the first element. The second
22479element is the score to be applied if the first element evaluated to a
22480non-@code{nil} value.
22481
22482These lists may consist of three logical operators, one redirection
22483operator, and various match operators.
22484
22485Logical operators:
22486
22487@table @code
22488@item &
22489@itemx and
22490This logical operator will evaluate each of its arguments until it finds
22491one that evaluates to @code{false}, and then it'll stop. If all arguments
22492evaluate to @code{true} values, then this operator will return
22493@code{true}.
22494
22495@item |
22496@itemx or
22497This logical operator will evaluate each of its arguments until it finds
22498one that evaluates to @code{true}. If no arguments are @code{true},
22499then this operator will return @code{false}.
22500
22501@item !
22502@itemx not
22503