gnus.texi (Delayed Articles): Mention that the Date header is the original one, even...
[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 11@copying
e3e955fe 12Copyright @copyright{} 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
c57008f6 132003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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
4009494e
GM
323@dircategory Emacs
324@direntry
62e034c2 325* Gnus: (gnus). The newsreader Gnus.
4009494e
GM
326@end direntry
327@iftex
328@finalout
329@end iftex
4009494e
GM
330
331
332@titlepage
333@title Gnus Manual
334
335@author by Lars Magne Ingebrigtsen
336@page
337@vskip 0pt plus 1filll
338@insertcopying
339@end titlepage
340
5dc584b5
KB
341@summarycontents
342@contents
4009494e
GM
343
344@node Top
345@top The Gnus Newsreader
346
347@ifinfo
348
349You can read news (and mail) from within Emacs by using Gnus. The news
350can be gotten by any nefarious means you can think of---@acronym{NNTP}, local
351spool or your mbox file. All at the same time, if you want to push your
352luck.
353
354@c Adjust ../Makefile.in if you change the following line:
c7ff939a 355This manual corresponds to Gnus v5.13
4009494e 356
5dc584b5
KB
357@ifnottex
358@insertcopying
359@end ifnottex
360
4009494e
GM
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.
bc79f9ab 687* Babyl:: Babyl was used by older versions of Rmail.
4009494e
GM
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
357e2d8e
KY
999First of all, you should know that there is a special buffer called
1000@code{*Server*} that lists all the servers Gnus knows about. You can
1001press @kbd{^} from the Group buffer to see it. In the Server buffer,
1002you can press @kbd{RET} on a defined server to see all the groups it
1003serves (subscribed or not!). You can also add or delete servers, edit
1004a foreign server's definition, agentize or de-agentize a server, and
1005do many other neat things. @xref{Server Buffer}.
1006@xref{Foreign Groups}. @xref{Agent Basics}.
1007
4009494e
GM
1008@vindex gnus-select-method
1009@c @head
1010The @code{gnus-select-method} variable says where Gnus should look for
1011news. This variable should be a list where the first element says
1012@dfn{how} and the second element says @dfn{where}. This method is your
1013native method. All groups not fetched with this method are
1014foreign groups.
1015
1016For instance, if the @samp{news.somewhere.edu} @acronym{NNTP} server is where
1017you want to get your daily dosage of news from, you'd say:
1018
1019@lisp
1020(setq gnus-select-method '(nntp "news.somewhere.edu"))
1021@end lisp
1022
1023If you want to read directly from the local spool, say:
1024
1025@lisp
1026(setq gnus-select-method '(nnspool ""))
1027@end lisp
1028
1029If you can use a local spool, you probably should, as it will almost
1030certainly be much faster. But do not use the local spool if your
1031server is running Leafnode (which is a simple, standalone private news
1032server); in this case, use @code{(nntp "localhost")}.
1033
1034@vindex gnus-nntpserver-file
1035@cindex NNTPSERVER
1036@cindex @acronym{NNTP} server
1037If this variable is not set, Gnus will take a look at the
1038@env{NNTPSERVER} environment variable. If that variable isn't set,
1039Gnus will see whether @code{gnus-nntpserver-file}
1040(@file{/etc/nntpserver} by default) has any opinions on the matter.
1041If that fails as well, Gnus will try to use the machine running Emacs
1042as an @acronym{NNTP} server. That's a long shot, though.
1043
1044@vindex gnus-nntp-server
1045If @code{gnus-nntp-server} is set, this variable will override
1046@code{gnus-select-method}. You should therefore set
1047@code{gnus-nntp-server} to @code{nil}, which is what it is by default.
1048
1049@vindex gnus-secondary-servers
1050@vindex gnus-nntp-server
1051You can also make Gnus prompt you interactively for the name of an
1052@acronym{NNTP} server. If you give a non-numerical prefix to @code{gnus}
1053(i.e., @kbd{C-u M-x gnus}), Gnus will let you choose between the servers
1054in the @code{gnus-secondary-servers} list (if any). You can also just
1055type in the name of any server you feel like visiting. (Note that this
1056will set @code{gnus-nntp-server}, which means that if you then @kbd{M-x
1057gnus} later in the same Emacs session, Gnus will contact the same
1058server.)
1059
1060@findex gnus-group-browse-foreign-server
1061@kindex B (Group)
1062However, if you use one @acronym{NNTP} server regularly and are just
1063interested in a couple of groups from a different server, you would be
1064better served by using the @kbd{B} command in the group buffer. It will
1065let you have a look at what groups are available, and you can subscribe
1066to any of the groups you want to. This also makes @file{.newsrc}
1067maintenance much tidier. @xref{Foreign Groups}.
1068
1069@vindex gnus-secondary-select-methods
1070@c @head
1071A slightly different approach to foreign groups is to set the
1072@code{gnus-secondary-select-methods} variable. The select methods
1073listed in this variable are in many ways just as native as the
1074@code{gnus-select-method} server. They will also be queried for active
1075files during startup (if that's required), and new newsgroups that
1076appear on these servers will be subscribed (or not) just as native
1077groups are.
1078
1079For instance, if you use the @code{nnmbox} back end to read your mail,
1080you would typically set this variable to
1081
1082@lisp
1083(setq gnus-secondary-select-methods '((nnmbox "")))
1084@end lisp
1085
01c52d31
MB
1086Note: the @acronym{NNTP} back end stores marks in marks files
1087(@pxref{NNTP marks}). This feature makes it easy to share marks between
1088several Gnus installations, but may slow down things a bit when fetching
1089new articles. @xref{NNTP marks}, for more information.
1090
4009494e
GM
1091
1092@node The First Time
1093@section The First Time
1094@cindex first time usage
1095
1096If no startup files exist (@pxref{Startup Files}), Gnus will try to
1097determine what groups should be subscribed by default.
1098
1099@vindex gnus-default-subscribed-newsgroups
1100If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus
1101will subscribe you to just those groups in that list, leaving the rest
1102killed. Your system administrator should have set this variable to
1103something useful.
1104
1105Since she hasn't, Gnus will just subscribe you to a few arbitrarily
1106picked groups (i.e., @samp{*.newusers}). (@dfn{Arbitrary} is defined
1107here as @dfn{whatever Lars thinks you should read}.)
1108
1109You'll also be subscribed to the Gnus documentation group, which should
1110help you with most common problems.
1111
1112If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will just
1113use the normal functions for handling new groups, and not do anything
1114special.
1115
1116
1117@node The Server is Down
1118@section The Server is Down
1119@cindex server errors
1120
1121If the default server is down, Gnus will understandably have some
1122problems starting. However, if you have some mail groups in addition to
1123the news groups, you may want to start Gnus anyway.
1124
1125Gnus, being the trusting sort of program, will ask whether to proceed
1126without a native select method if that server can't be contacted. This
1127will happen whether the server doesn't actually exist (i.e., you have
1128given the wrong address) or the server has just momentarily taken ill
1129for some reason or other. If you decide to continue and have no foreign
1130groups, you'll find it difficult to actually do anything in the group
1131buffer. But, hey, that's your problem. Blllrph!
1132
1133@findex gnus-no-server
1134@kindex M-x gnus-no-server
1135@c @head
1136If you know that the server is definitely down, or you just want to read
1137your mail without bothering with the server at all, you can use the
1138@code{gnus-no-server} command to start Gnus. That might come in handy
1139if you're in a hurry as well. This command will not attempt to contact
1140your primary server---instead, it will just activate all groups on level
11411 and 2. (You should preferably keep no native groups on those two
1142levels.) Also @pxref{Group Levels}.
1143
1144
1145@node Slave Gnusae
1146@section Slave Gnusae
1147@cindex slave
1148
1149You might want to run more than one Emacs with more than one Gnus at the
1150same time. If you are using different @file{.newsrc} files (e.g., if you
1151are using the two different Gnusae to read from two different servers),
1152that is no problem whatsoever. You just do it.
1153
1154The problem appears when you want to run two Gnusae that use the same
1155@file{.newsrc} file.
1156
1157To work around that problem some, we here at the Think-Tank at the Gnus
1158Towers have come up with a new concept: @dfn{Masters} and
1159@dfn{slaves}. (We have applied for a patent on this concept, and have
1160taken out a copyright on those words. If you wish to use those words in
1161conjunction with each other, you have to send $1 per usage instance to
1162me. Usage of the patent (@dfn{Master/Slave Relationships In Computer
1163Applications}) will be much more expensive, of course.)
1164
1165@findex gnus-slave
1166Anyway, you start one Gnus up the normal way with @kbd{M-x gnus} (or
1167however you do it). Each subsequent slave Gnusae should be started with
1168@kbd{M-x gnus-slave}. These slaves won't save normal @file{.newsrc}
1169files, but instead save @dfn{slave files} that contain information only
1170on what groups have been read in the slave session. When a master Gnus
1171starts, it will read (and delete) these slave files, incorporating all
1172information from them. (The slave files will be read in the sequence
1173they were created, so the latest changes will have precedence.)
1174
1175Information from the slave files has, of course, precedence over the
1176information in the normal (i.e., master) @file{.newsrc} file.
1177
1178If the @file{.newsrc*} files have not been saved in the master when the
1179slave starts, you may be prompted as to whether to read an auto-save
1180file. If you answer ``yes'', the unsaved changes to the master will be
1181incorporated into the slave. If you answer ``no'', the slave may see some
1182messages as unread that have been read in the master.
1183
1184
1185
1186@node New Groups
1187@section New Groups
1188@cindex new groups
1189@cindex subscription
1190
1191@vindex gnus-check-new-newsgroups
1192If you are satisfied that you really never want to see any new groups,
1193you can set @code{gnus-check-new-newsgroups} to @code{nil}. This will
1194also save you some time at startup. Even if this variable is
1195@code{nil}, you can always subscribe to the new groups just by pressing
1196@kbd{U} in the group buffer (@pxref{Group Maintenance}). This variable
1197is @code{ask-server} by default. If you set this variable to
1198@code{always}, then Gnus will query the back ends for new groups even
1199when you do the @kbd{g} command (@pxref{Scanning New Messages}).
1200
1201@menu
1202* Checking New Groups:: Determining what groups are new.
1203* Subscription Methods:: What Gnus should do with new groups.
1204* Filtering New Groups:: Making Gnus ignore certain new groups.
1205@end menu
1206
1207
1208@node Checking New Groups
1209@subsection Checking New Groups
1210
1211Gnus normally determines whether a group is new or not by comparing the
1212list of groups from the active file(s) with the lists of subscribed and
1213dead groups. This isn't a particularly fast method. If
1214@code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask the
1215server for new groups since the last time. This is both faster and
1216cheaper. This also means that you can get rid of the list of killed
1217groups altogether, so you may set @code{gnus-save-killed-list} to
1218@code{nil}, which will save time both at startup, at exit, and all over.
1219Saves disk space, too. Why isn't this the default, then?
1220Unfortunately, not all servers support this command.
1221
1222I bet I know what you're thinking now: How do I find out whether my
1223server supports @code{ask-server}? No? Good, because I don't have a
1224fail-safe answer. I would suggest just setting this variable to
1225@code{ask-server} and see whether any new groups appear within the next
1226few days. If any do, then it works. If none do, then it doesn't
1227work. I could write a function to make Gnus guess whether the server
1228supports @code{ask-server}, but it would just be a guess. So I won't.
1229You could @code{telnet} to the server and say @code{HELP} and see
1230whether it lists @samp{NEWGROUPS} among the commands it understands. If
1231it does, then it might work. (But there are servers that lists
1232@samp{NEWGROUPS} without supporting the function properly.)
1233
1234This variable can also be a list of select methods. If so, Gnus will
1235issue an @code{ask-server} command to each of the select methods, and
1236subscribe them (or not) using the normal methods. This might be handy
1237if you are monitoring a few servers for new groups. A side effect is
1238that startup will take much longer, so you can meditate while waiting.
1239Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss.
1240
1241
1242@node Subscription Methods
1243@subsection Subscription Methods
1244
1245@vindex gnus-subscribe-newsgroup-method
1246What Gnus does when it encounters a new group is determined by the
1247@code{gnus-subscribe-newsgroup-method} variable.
1248
1249This variable should contain a function. This function will be called
1250with the name of the new group as the only parameter.
1251
1252Some handy pre-fab functions are:
1253
1254@table @code
1255
1256@item gnus-subscribe-zombies
1257@vindex gnus-subscribe-zombies
1258Make all new groups zombies. This is the default. You can browse the
1259zombies later (with @kbd{A z}) and either kill them all off properly
1260(with @kbd{S z}), or subscribe to them (with @kbd{u}).
1261
1262@item gnus-subscribe-randomly
1263@vindex gnus-subscribe-randomly
1264Subscribe all new groups in arbitrary order. This really means that all
1265new groups will be added at ``the top'' of the group buffer.
1266
1267@item gnus-subscribe-alphabetically
1268@vindex gnus-subscribe-alphabetically
1269Subscribe all new groups in alphabetical order.
1270
1271@item gnus-subscribe-hierarchically
1272@vindex gnus-subscribe-hierarchically
1273Subscribe all new groups hierarchically. The difference between this
1274function and @code{gnus-subscribe-alphabetically} is slight.
1275@code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly
1276alphabetical fashion, while this function will enter groups into its
1277hierarchy. So if you want to have the @samp{rec} hierarchy before the
1278@samp{comp} hierarchy, this function will not mess that configuration
1279up. Or something like that.
1280
1281@item gnus-subscribe-interactively
1282@vindex gnus-subscribe-interactively
1283Subscribe new groups interactively. This means that Gnus will ask
1284you about @strong{all} new groups. The groups you choose to subscribe
1285to will be subscribed hierarchically.
1286
1287@item gnus-subscribe-killed
1288@vindex gnus-subscribe-killed
1289Kill all new groups.
1290
1291@item gnus-subscribe-topics
1292@vindex gnus-subscribe-topics
1293Put the groups into the topic that has a matching @code{subscribe} topic
1294parameter (@pxref{Topic Parameters}). For instance, a @code{subscribe}
1295topic parameter that looks like
1296
1297@example
1298"nnslashdot"
1299@end example
1300
1301will mean that all groups that match that regex will be subscribed under
1302that topic.
1303
1304If no topics match the groups, the groups will be subscribed in the
1305top-level topic.
1306
1307@end table
1308
1309@vindex gnus-subscribe-hierarchical-interactive
1310A closely related variable is
1311@code{gnus-subscribe-hierarchical-interactive}. (That's quite a
1312mouthful.) If this variable is non-@code{nil}, Gnus will ask you in a
1313hierarchical fashion whether to subscribe to new groups or not. Gnus
1314will ask you for each sub-hierarchy whether you want to descend the
1315hierarchy or not.
1316
1317One common mistake is to set the variable a few paragraphs above
1318(@code{gnus-subscribe-newsgroup-method}) to
1319@code{gnus-subscribe-hierarchical-interactive}. This is an error. This
1320will not work. This is ga-ga. So don't do it.
1321
1322
1323@node Filtering New Groups
1324@subsection Filtering New Groups
1325
1326A nice and portable way to control which new newsgroups should be
1327subscribed (or ignored) is to put an @dfn{options} line at the start of
1328the @file{.newsrc} file. Here's an example:
1329
1330@example
1331options -n !alt.all !rec.all sci.all
1332@end example
1333
1334@vindex gnus-subscribe-options-newsgroup-method
1335This line obviously belongs to a serious-minded intellectual scientific
1336person (or she may just be plain old boring), because it says that all
1337groups that have names beginning with @samp{alt} and @samp{rec} should
1338be ignored, and all groups with names beginning with @samp{sci} should
1339be subscribed. Gnus will not use the normal subscription method for
1340subscribing these groups.
1341@code{gnus-subscribe-options-newsgroup-method} is used instead. This
1342variable defaults to @code{gnus-subscribe-alphabetically}.
1343
1344@vindex gnus-options-not-subscribe
1345@vindex gnus-options-subscribe
1346If you don't want to mess with your @file{.newsrc} file, you can just
1347set the two variables @code{gnus-options-subscribe} and
1348@code{gnus-options-not-subscribe}. These two variables do exactly the
1349same as the @file{.newsrc} @samp{options -n} trick. Both are regexps,
1350and if the new group matches the former, it will be unconditionally
1351subscribed, and if it matches the latter, it will be ignored.
1352
1353@vindex gnus-auto-subscribed-groups
1354Yet another variable that meddles here is
1355@code{gnus-auto-subscribed-groups}. It works exactly like
1356@code{gnus-options-subscribe}, and is therefore really superfluous,
1357but I thought it would be nice to have two of these. This variable is
1358more meant for setting some ground rules, while the other variable is
1359used more for user fiddling. By default this variable makes all new
1360groups that come from mail back ends (@code{nnml}, @code{nnbabyl},
1361@code{nnfolder}, @code{nnmbox}, @code{nnmh}, and @code{nnmaildir})
1362subscribed. If you don't like that, just set this variable to
1363@code{nil}.
1364
1365New groups that match this regexp are subscribed using
1366@code{gnus-subscribe-options-newsgroup-method}.
1367
1368
1369@node Changing Servers
1370@section Changing Servers
1371@cindex changing servers
1372
1373Sometimes it is necessary to move from one @acronym{NNTP} server to another.
1374This happens very rarely, but perhaps you change jobs, or one server is
1375very flaky and you want to use another.
1376
1377Changing the server is pretty easy, right? You just change
1378@code{gnus-select-method} to point to the new server?
1379
1380@emph{Wrong!}
1381
1382Article numbers are not (in any way) kept synchronized between different
1383@acronym{NNTP} servers, and the only way Gnus keeps track of what articles
1384you have read is by keeping track of article numbers. So when you
1385change @code{gnus-select-method}, your @file{.newsrc} file becomes
1386worthless.
1387
1388Gnus provides a few functions to attempt to translate a @file{.newsrc}
1389file from one server to another. They all have one thing in
1390common---they take a looong time to run. You don't want to use these
1391functions more than absolutely necessary.
1392
1393@kindex M-x gnus-change-server
1394@findex gnus-change-server
1395If you have access to both servers, Gnus can request the headers for all
1396the articles you have read and compare @code{Message-ID}s and map the
1397article numbers of the read articles and article marks. The @kbd{M-x
1398gnus-change-server} command will do this for all your native groups. It
1399will prompt for the method you want to move to.
1400
1401@kindex M-x gnus-group-move-group-to-server
1402@findex gnus-group-move-group-to-server
1403You can also move individual groups with the @kbd{M-x
1404gnus-group-move-group-to-server} command. This is useful if you want to
1405move a (foreign) group from one server to another.
1406
1407@kindex M-x gnus-group-clear-data-on-native-groups
1408@findex gnus-group-clear-data-on-native-groups
1409If you don't have access to both the old and new server, all your marks
1410and read ranges have become worthless. You can use the @kbd{M-x
1411gnus-group-clear-data-on-native-groups} command to clear out all data
1412that you have on your native groups. Use with caution.
1413
1414@kindex M-x gnus-group-clear-data
1415@findex gnus-group-clear-data
1416Clear the data from the current group only---nix out marks and the
1417list of read articles (@code{gnus-group-clear-data}).
1418
1419After changing servers, you @strong{must} move the cache hierarchy away,
1420since the cached articles will have wrong article numbers, which will
1421affect which articles Gnus thinks are read.
1422@code{gnus-group-clear-data-on-native-groups} will ask you if you want
1423to have it done automatically; for @code{gnus-group-clear-data}, you
1424can use @kbd{M-x gnus-cache-move-cache} (but beware, it will move the
1425cache for all groups).
1426
1427
1428@node Startup Files
1429@section Startup Files
1430@cindex startup files
1431@cindex .newsrc
1432@cindex .newsrc.el
1433@cindex .newsrc.eld
1434
1435Most common Unix news readers use a shared startup file called
1436@file{.newsrc}. This file contains all the information about what
1437groups are subscribed, and which articles in these groups have been
1438read.
1439
1440Things got a bit more complicated with @sc{gnus}. In addition to
1441keeping the @file{.newsrc} file updated, it also used a file called
1442@file{.newsrc.el} for storing all the information that didn't fit into
1443the @file{.newsrc} file. (Actually, it also duplicated everything in
1444the @file{.newsrc} file.) @sc{gnus} would read whichever one of these
1445files was the most recently saved, which enabled people to swap between
1446@sc{gnus} and other newsreaders.
1447
1448That was kinda silly, so Gnus went one better: In addition to the
1449@file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called
1450@file{.newsrc.eld}. It will read whichever of these files that are most
1451recent, but it will never write a @file{.newsrc.el} file. You should
1452never delete the @file{.newsrc.eld} file---it contains much information
1453not stored in the @file{.newsrc} file.
1454
1455@vindex gnus-save-newsrc-file
1456@vindex gnus-read-newsrc-file
1457You can turn off writing the @file{.newsrc} file by setting
1458@code{gnus-save-newsrc-file} to @code{nil}, which means you can delete
1459the file and save some space, as well as exiting from Gnus faster.
1460However, this will make it impossible to use other newsreaders than
1461Gnus. But hey, who would want to, right? Similarly, setting
1462@code{gnus-read-newsrc-file} to @code{nil} makes Gnus ignore the
1463@file{.newsrc} file and any @file{.newsrc-SERVER} files, which can be
1464convenient if you use a different news reader occasionally, and you
1465want to read a different subset of the available groups with that
1466news reader.
1467
1468@vindex gnus-save-killed-list
1469If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus
1470will not save the list of killed groups to the startup file. This will
1471save both time (when starting and quitting) and space (on disk). It
1472will also mean that Gnus has no record of what groups are new or old,
1473so the automatic new groups subscription methods become meaningless.
1474You should always set @code{gnus-check-new-newsgroups} to @code{nil} or
1475@code{ask-server} if you set this variable to @code{nil} (@pxref{New
1476Groups}). This variable can also be a regular expression. If that's
1477the case, remove all groups that do not match this regexp before
1478saving. This can be useful in certain obscure situations that involve
1479several servers where not all servers support @code{ask-server}.
1480
1481@vindex gnus-startup-file
1482@vindex gnus-backup-startup-file
1483@vindex version-control
1484The @code{gnus-startup-file} variable says where the startup files are.
1485The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup
1486file being whatever that one is, with a @samp{.eld} appended.
1487If you want version control for this file, set
1488@code{gnus-backup-startup-file}. It respects the same values as the
1489@code{version-control} variable.
1490
1491@vindex gnus-save-newsrc-hook
1492@vindex gnus-save-quick-newsrc-hook
1493@vindex gnus-save-standard-newsrc-hook
1494@code{gnus-save-newsrc-hook} is called before saving any of the newsrc
1495files, while @code{gnus-save-quick-newsrc-hook} is called just before
1496saving the @file{.newsrc.eld} file, and
1497@code{gnus-save-standard-newsrc-hook} is called just before saving the
1498@file{.newsrc} file. The latter two are commonly used to turn version
1499control on or off. Version control is on by default when saving the
1500startup files. If you want to turn backup creation off, say something like:
1501
1502@lisp
1503(defun turn-off-backup ()
1504 (set (make-local-variable 'backup-inhibited) t))
1505
1506(add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup)
1507(add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup)
1508@end lisp
1509
1510@vindex gnus-init-file
1511@vindex gnus-site-init-file
1512When Gnus starts, it will read the @code{gnus-site-init-file}
1513(@file{.../site-lisp/gnus-init} by default) and @code{gnus-init-file}
1514(@file{~/.gnus} by default) files. These are normal Emacs Lisp files
1515and can be used to avoid cluttering your @file{~/.emacs} and
1516@file{site-init} files with Gnus stuff. Gnus will also check for files
1517with the same names as these, but with @file{.elc} and @file{.el}
1518suffixes. In other words, if you have set @code{gnus-init-file} to
1519@file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el},
1520and finally @file{~/.gnus} (in this order). If Emacs was invoked with
1521the @option{-q} or @option{--no-init-file} options (@pxref{Initial
1522Options, ,Initial Options, emacs, The Emacs Manual}), Gnus doesn't read
1523@code{gnus-init-file}.
1524
1525
1526@node Auto Save
1527@section Auto Save
1528@cindex dribble file
1529@cindex auto-save
1530
1531Whenever you do something that changes the Gnus data (reading articles,
1532catching up, killing/subscribing groups), the change is added to a
1533special @dfn{dribble buffer}. This buffer is auto-saved the normal
1534Emacs way. If your Emacs should crash before you have saved the
1535@file{.newsrc} files, all changes you have made can be recovered from
1536this file.
1537
1538If Gnus detects this file at startup, it will ask the user whether to
1539read it. The auto save file is deleted whenever the real startup file is
1540saved.
1541
1542@vindex gnus-use-dribble-file
1543If @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create and
1544maintain a dribble buffer. The default is @code{t}.
1545
1546@vindex gnus-dribble-directory
1547Gnus will put the dribble file(s) in @code{gnus-dribble-directory}. If
1548this variable is @code{nil}, which it is by default, Gnus will dribble
1549into the directory where the @file{.newsrc} file is located. (This is
1550normally the user's home directory.) The dribble file will get the same
1551file permissions as the @file{.newsrc} file.
1552
1553@vindex gnus-always-read-dribble-file
1554If @code{gnus-always-read-dribble-file} is non-@code{nil}, Gnus will
1555read the dribble file on startup without querying the user.
1556
1557
1558@node The Active File
1559@section The Active File
1560@cindex active file
1561@cindex ignored groups
1562
1563When Gnus starts, or indeed whenever it tries to determine whether new
1564articles have arrived, it reads the active file. This is a very large
1565file that lists all the active groups and articles on the server.
1566
1567@vindex gnus-ignored-newsgroups
1568Before examining the active file, Gnus deletes all lines that match the
1569regexp @code{gnus-ignored-newsgroups}. This is done primarily to reject
1570any groups with bogus names, but you can use this variable to make Gnus
1571ignore hierarchies you aren't ever interested in. However, this is not
1572recommended. In fact, it's highly discouraged. Instead, @pxref{New
1573Groups} for an overview of other variables that can be used instead.
1574
1575@c This variable is
1576@c @code{nil} by default, and will slow down active file handling somewhat
1577@c if you set it to anything else.
1578
1579@vindex gnus-read-active-file
1580@c @head
1581The active file can be rather Huge, so if you have a slow network, you
1582can set @code{gnus-read-active-file} to @code{nil} to prevent Gnus from
1583reading the active file. This variable is @code{some} by default.
1584
1585Gnus will try to make do by getting information just on the groups that
1586you actually subscribe to.
1587
1588Note that if you subscribe to lots and lots of groups, setting this
1589variable to @code{nil} will probably make Gnus slower, not faster. At
1590present, having this variable @code{nil} will slow Gnus down
1591considerably, unless you read news over a 2400 baud modem.
1592
1593This variable can also have the value @code{some}. Gnus will then
1594attempt to read active info only on the subscribed groups. On some
1595servers this is quite fast (on sparkling, brand new INN servers that
1596support the @code{LIST ACTIVE group} command), on others this isn't fast
1597at all. In any case, @code{some} should be faster than @code{nil}, and
1598is certainly faster than @code{t} over slow lines.
1599
1600Some news servers (old versions of Leafnode and old versions of INN, for
1601instance) do not support the @code{LIST ACTIVE group}. For these
1602servers, @code{nil} is probably the most efficient value for this
1603variable.
1604
1605If this variable is @code{nil}, Gnus will ask for group info in total
1606lock-step, which isn't very fast. If it is @code{some} and you use an
1607@acronym{NNTP} server, Gnus will pump out commands as fast as it can, and
1608read all the replies in one swoop. This will normally result in better
1609performance, but if the server does not support the aforementioned
1610@code{LIST ACTIVE group} command, this isn't very nice to the server.
1611
1612If you think that starting up Gnus takes too long, try all the three
1613different values for this variable and see what works best for you.
1614
1615In any case, if you use @code{some} or @code{nil}, you should definitely
1616kill all groups that you aren't interested in to speed things up.
1617
1618Note that this variable also affects active file retrieval from
1619secondary select methods.
1620
1621
1622@node Startup Variables
1623@section Startup Variables
1624
1625@table @code
1626
1627@item gnus-load-hook
1628@vindex gnus-load-hook
1629A hook run while Gnus is being loaded. Note that this hook will
1630normally be run just once in each Emacs session, no matter how many
1631times you start Gnus.
1632
1633@item gnus-before-startup-hook
1634@vindex gnus-before-startup-hook
e3e955fe 1635A hook called as the first thing when Gnus is started.
4009494e
GM
1636
1637@item gnus-startup-hook
1638@vindex gnus-startup-hook
1639A hook run as the very last thing after starting up Gnus
1640
1641@item gnus-started-hook
1642@vindex gnus-started-hook
1643A hook that is run as the very last thing after starting up Gnus
1644successfully.
1645
1646@item gnus-setup-news-hook
1647@vindex gnus-setup-news-hook
1648A hook that is run after reading the @file{.newsrc} file(s), but before
1649generating the group buffer.
1650
1651@item gnus-check-bogus-newsgroups
1652@vindex gnus-check-bogus-newsgroups
1653If non-@code{nil}, Gnus will check for and delete all bogus groups at
1654startup. A @dfn{bogus group} is a group that you have in your
1655@file{.newsrc} file, but doesn't exist on the news server. Checking for
1656bogus groups can take quite a while, so to save time and resources it's
1657best to leave this option off, and do the checking for bogus groups once
1658in a while from the group buffer instead (@pxref{Group Maintenance}).
1659
1660@item gnus-inhibit-startup-message
1661@vindex gnus-inhibit-startup-message
1662If non-@code{nil}, the startup message won't be displayed. That way,
1663your boss might not notice as easily that you are reading news instead
1664of doing your job. Note that this variable is used before
1665@file{~/.gnus.el} is loaded, so it should be set in @file{.emacs} instead.
1666
1667@item gnus-no-groups-message
1668@vindex gnus-no-groups-message
1669Message displayed by Gnus when no groups are available.
1670
1671@item gnus-play-startup-jingle
1672@vindex gnus-play-startup-jingle
1673If non-@code{nil}, play the Gnus jingle at startup.
1674
1675@item gnus-startup-jingle
1676@vindex gnus-startup-jingle
1677Jingle to be played if the above variable is non-@code{nil}. The
1678default is @samp{Tuxedomoon.Jingle4.au}.
1679
1680@end table
1681
1682
1683@node Group Buffer
1684@chapter Group Buffer
1685@cindex group buffer
1686
1687@c Alex Schroeder suggests to rearrange this as follows:
1688@c
1689@c <kensanata> ok, just save it for reference. I'll go to bed in a minute.
1690@c 1. Selecting a Group, 2. (new) Finding a Group, 3. Group Levels,
1691@c 4. Subscription Commands, 5. Group Maneuvering, 6. Group Data,
1692@c 7. Group Score, 8. Group Buffer Format
1693@c <kensanata> Group Levels should have more information on levels 5 to 9. I
1694@c suggest to split the 4th paragraph ("Gnus considers groups...") as follows:
1695@c <kensanata> First, "Gnus considers groups... (default 9)."
1696@c <kensanata> New, a table summarizing what levels 1 to 9 mean.
1697@c <kensanata> Third, "Gnus treats subscribed ... reasons of efficiency"
1698@c <kensanata> Then expand the next paragraph or add some more to it.
1699@c This short one sentence explains levels 1 and 2, therefore I understand
1700@c that I should keep important news at 3 and boring news at 4.
1701@c Say so! Then go on to explain why I should bother with levels 6 to 9.
1702@c Maybe keep those that you don't want to read temporarily at 6,
1703@c those that you never want to read at 8, those that offend your
1704@c human rights at 9...
1705
1706
1707The @dfn{group buffer} lists all (or parts) of the available groups. It
1708is the first buffer shown when Gnus starts, and will never be killed as
1709long as Gnus is active.
1710
1711@iftex
1712@iflatex
1713\gnusfigure{The Group Buffer}{320}{
1714\put(75,50){\epsfig{figure=ps/group,height=9cm}}
1715\put(120,37){\makebox(0,0)[t]{Buffer name}}
1716\put(120,38){\vector(1,2){10}}
1717\put(40,60){\makebox(0,0)[r]{Mode line}}
1718\put(40,58){\vector(1,0){30}}
1719\put(200,28){\makebox(0,0)[t]{Native select method}}
1720\put(200,26){\vector(-1,2){15}}
1721}
1722@end iflatex
1723@end iftex
1724
1725@menu
1726* Group Buffer Format:: Information listed and how you can change it.
1727* Group Maneuvering:: Commands for moving in the group buffer.
1728* Selecting a Group:: Actually reading news.
1729* Subscription Commands:: Unsubscribing, killing, subscribing.
1730* Group Data:: Changing the info for a group.
1731* Group Levels:: Levels? What are those, then?
1732* Group Score:: A mechanism for finding out what groups you like.
1733* Marking Groups:: You can mark groups for later processing.
1734* Foreign Groups:: Creating and editing groups.
1735* Group Parameters:: Each group may have different parameters set.
1736* Listing Groups:: Gnus can list various subsets of the groups.
1737* Sorting Groups:: Re-arrange the group order.
1738* Group Maintenance:: Maintaining a tidy @file{.newsrc} file.
1739* Browse Foreign Server:: You can browse a server. See what it has to offer.
1740* Exiting Gnus:: Stop reading news and get some work done.
1741* Group Topics:: A folding group mode divided into topics.
01c52d31 1742* Non-ASCII Group Names:: Accessing groups of non-English names.
e6d2d263 1743* Searching:: Mail search engines.
4009494e
GM
1744* Misc Group Stuff:: Other stuff that you can to do.
1745@end menu
1746
1747
1748@node Group Buffer Format
1749@section Group Buffer Format
1750
1751@menu
1752* Group Line Specification:: Deciding how the group buffer is to look.
1753* Group Mode Line Specification:: The group buffer mode line.
1754* Group Highlighting:: Having nice colors in the group buffer.
1755@end menu
1756
1757You can customize the Group Mode tool bar, see @kbd{M-x
1758customize-apropos RET gnus-group-tool-bar}. This feature is only
1759available in Emacs.
1760
1761The tool bar icons are now (de)activated correctly depending on the
1762cursor position. Therefore, moving around in the Group Buffer is
1763slower. You can disable this via the variable
1764@code{gnus-group-update-tool-bar}. Its default value depends on your
1765Emacs version.
1766
1767@node Group Line Specification
1768@subsection Group Line Specification
1769@cindex group buffer format
1770
1771The default format of the group buffer is nice and dull, but you can
1772make it as exciting and ugly as you feel like.
1773
1774Here's a couple of example group lines:
1775
1776@example
1777 25: news.announce.newusers
1778 * 0: alt.fan.andrea-dworkin
1779@end example
1780
1781Quite simple, huh?
1782
1783You can see that there are 25 unread articles in
1784@samp{news.announce.newusers}. There are no unread articles, but some
1785ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little
1786asterisk at the beginning of the line?).
1787
1788@vindex gnus-group-line-format
1789You can change that format to whatever you want by fiddling with the
1790@code{gnus-group-line-format} variable. This variable works along the
1791lines of a @code{format} specification, which is pretty much the same as
1792a @code{printf} specifications, for those of you who use (feh!) C.
1793@xref{Formatting Variables}.
1794
1795@samp{%M%S%5y:%B%(%g%)\n} is the value that produced those lines above.
1796
1797There should always be a colon on the line; the cursor always moves to
1798the colon after performing an operation. @xref{Positioning
1799Point}. Nothing else is required---not even the group name. All
1800displayed text is just window dressing, and is never examined by Gnus.
1801Gnus stores all real information it needs using text properties.
1802
1803(Note that if you make a really strange, wonderful, spreadsheet-like
1804layout, everybody will believe you are hard at work with the accounting
1805instead of wasting time reading news.)
1806
1807Here's a list of all available format characters:
1808
1809@table @samp
1810
1811@item M
1812An asterisk if the group only has marked articles.
1813
1814@item S
1815Whether the group is subscribed.
1816
1817@item L
1818Level of subscribedness.
1819
1820@item N
1821Number of unread articles.
1822
1823@item I
1824Number of dormant articles.
1825
1826@item T
1827Number of ticked articles.
1828
1829@item R
1830Number of read articles.
1831
1832@item U
1833Number of unseen articles.
1834
1835@item t
1836Estimated total number of articles. (This is really @var{max-number}
1837minus @var{min-number} plus 1.)
1838
1839Gnus uses this estimation because the @acronym{NNTP} protocol provides
1840efficient access to @var{max-number} and @var{min-number} but getting
1841the true unread message count is not possible efficiently. For
1842hysterical raisins, even the mail back ends, where the true number of
1843unread messages might be available efficiently, use the same limited
1844interface. To remove this restriction from Gnus means that the back
01c52d31
MB
1845end interface has to be changed, which is not an easy job.
1846
1847The nnml backend (@pxref{Mail Spool}) has a feature called ``group
1848compaction'' which circumvents this deficiency: the idea is to
1849renumber all articles from 1, removing all gaps between numbers, hence
1850getting a correct total count. Other backends may support this in the
1851future. In order to keep your total article count relatively up to
1852date, you might want to compact your groups (or even directly your
1853server) from time to time. @xref{Misc Group Stuff}, @xref{Server Commands}.
4009494e
GM
1854
1855@item y
1856Number of unread, unticked, non-dormant articles.
1857
1858@item i
1859Number of ticked and dormant articles.
1860
1861@item g
1862Full group name.
1863
1864@item G
1865Group name.
1866
1867@item C
1868Group comment (@pxref{Group Parameters}) or group name if there is no
1869comment element in the group parameters.
1870
1871@item D
1872Newsgroup description. You need to read the group descriptions
1873before these will appear, and to do that, you either have to set
1874@code{gnus-read-active-file} or use the group buffer @kbd{M-d}
1875command.
1876
1877@item o
1878@samp{m} if moderated.
1879
1880@item O
1881@samp{(m)} if moderated.
1882
1883@item s
1884Select method.
1885
1886@item B
1887If the summary buffer for the group is open or not.
1888
1889@item n
1890Select from where.
1891
1892@item z
1893A string that looks like @samp{<%s:%n>} if a foreign select method is
1894used.
1895
1896@item P
1897Indentation based on the level of the topic (@pxref{Group Topics}).
1898
1899@item c
1900@vindex gnus-group-uncollapsed-levels
1901Short (collapsed) group name. The @code{gnus-group-uncollapsed-levels}
1902variable says how many levels to leave at the end of the group name.
1903The default is 1---this will mean that group names like
1904@samp{gnu.emacs.gnus} will be shortened to @samp{g.e.gnus}.
1905
1906@item m
1907@vindex gnus-new-mail-mark
1908@cindex %
1909@samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail to
1910the group lately.
1911
1912@item p
1913@samp{#} (@code{gnus-process-mark}) if the group is process marked.
1914
1915@item d
1916A string that says when you last read the group (@pxref{Group
1917Timestamp}).
1918
01c52d31
MB
1919@item F
1920The disk space used by the articles fetched by both the cache and
1921agent. The value is automatically scaled to bytes(B), kilobytes(K),
1922megabytes(M), or gigabytes(G) to minimize the column width. A format
1923of %7F is sufficient for a fixed-width column.
1924
4009494e
GM
1925@item u
1926User defined specifier. The next character in the format string should
1927be a letter. Gnus will call the function
1928@code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
1929following @samp{%u}. The function will be passed a single dummy
1930parameter as argument. The function should return a string, which will
1931be inserted into the buffer just like information from any other
1932specifier.
1933@end table
1934
1935@cindex *
1936All the ``number-of'' specs will be filled with an asterisk (@samp{*})
1937if no info is available---for instance, if it is a non-activated foreign
1938group, or a bogus native group.
1939
1940
1941@node Group Mode Line Specification
1942@subsection Group Mode Line Specification
1943@cindex group mode line
1944
1945@vindex gnus-group-mode-line-format
1946The mode line can be changed by setting
1947@code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}). It
1948doesn't understand that many format specifiers:
1949
1950@table @samp
1951@item S
1952The native news server.
1953@item M
1954The native select method.
1955@end table
1956
1957
1958@node Group Highlighting
1959@subsection Group Highlighting
1960@cindex highlighting
1961@cindex group highlighting
1962
1963@vindex gnus-group-highlight
1964Highlighting in the group buffer is controlled by the
1965@code{gnus-group-highlight} variable. This is an alist with elements
1966that look like @code{(@var{form} . @var{face})}. If @var{form} evaluates to
1967something non-@code{nil}, the @var{face} will be used on the line.
1968
1969Here's an example value for this variable that might look nice if the
1970background is dark:
1971
1972@lisp
1973(cond (window-system
1974 (setq custom-background-mode 'light)
1975 (defface my-group-face-1
1976 '((t (:foreground "Red" :bold t))) "First group face")
1977 (defface my-group-face-2
1978 '((t (:foreground "DarkSeaGreen4" :bold t)))
1979 "Second group face")
1980 (defface my-group-face-3
1981 '((t (:foreground "Green4" :bold t))) "Third group face")
1982 (defface my-group-face-4
1983 '((t (:foreground "SteelBlue" :bold t))) "Fourth group face")
1984 (defface my-group-face-5
1985 '((t (:foreground "Blue" :bold t))) "Fifth group face")))
1986
1987(setq gnus-group-highlight
1988 '(((> unread 200) . my-group-face-1)
1989 ((and (< level 3) (zerop unread)) . my-group-face-2)
1990 ((< level 3) . my-group-face-3)
1991 ((zerop unread) . my-group-face-4)
1992 (t . my-group-face-5)))
1993@end lisp
1994
1995Also @pxref{Faces and Fonts}.
1996
1997Variables that are dynamically bound when the forms are evaluated
1998include:
1999
2000@table @code
2001@item group
2002The group name.
2003@item unread
2004The number of unread articles in the group.
2005@item method
2006The select method.
2007@item mailp
2008Whether the group is a mail group.
2009@item level
2010The level of the group.
2011@item score
2012The score of the group.
2013@item ticked
2014The number of ticked articles in the group.
2015@item total
2016The total number of articles in the group. Or rather,
2017@var{max-number} minus @var{min-number} plus one.
2018@item topic
2019When using the topic minor mode, this variable is bound to the current
2020topic being inserted.
2021@end table
2022
2023When the forms are @code{eval}ed, point is at the beginning of the line
2024of the group in question, so you can use many of the normal Gnus
2025functions for snarfing info on the group.
2026
2027@vindex gnus-group-update-hook
2028@findex gnus-group-highlight-line
2029@code{gnus-group-update-hook} is called when a group line is changed.
2030It will not be called when @code{gnus-visual} is @code{nil}. This hook
2031calls @code{gnus-group-highlight-line} by default.
2032
2033
2034@node Group Maneuvering
2035@section Group Maneuvering
2036@cindex group movement
2037
2038All movement commands understand the numeric prefix and will behave as
2039expected, hopefully.
2040
2041@table @kbd
2042
2043@item n
2044@kindex n (Group)
2045@findex gnus-group-next-unread-group
2046Go to the next group that has unread articles
2047(@code{gnus-group-next-unread-group}).
2048
2049@item p
2050@itemx DEL
2051@kindex DEL (Group)
2052@kindex p (Group)
2053@findex gnus-group-prev-unread-group
2054Go to the previous group that has unread articles
2055(@code{gnus-group-prev-unread-group}).
2056
2057@item N
2058@kindex N (Group)
2059@findex gnus-group-next-group
2060Go to the next group (@code{gnus-group-next-group}).
2061
2062@item P
2063@kindex P (Group)
2064@findex gnus-group-prev-group
2065Go to the previous group (@code{gnus-group-prev-group}).
2066
2067@item M-n
2068@kindex M-n (Group)
2069@findex gnus-group-next-unread-group-same-level
2070Go to the next unread group on the same (or lower) level
2071(@code{gnus-group-next-unread-group-same-level}).
2072
2073@item M-p
2074@kindex M-p (Group)
2075@findex gnus-group-prev-unread-group-same-level
2076Go to the previous unread group on the same (or lower) level
2077(@code{gnus-group-prev-unread-group-same-level}).
2078@end table
2079
2080Three commands for jumping to groups:
2081
2082@table @kbd
2083
2084@item j
2085@kindex j (Group)
2086@findex gnus-group-jump-to-group
2087Jump to a group (and make it visible if it isn't already)
2088(@code{gnus-group-jump-to-group}). Killed groups can be jumped to, just
2089like living groups.
2090
2091@item ,
2092@kindex , (Group)
2093@findex gnus-group-best-unread-group
2094Jump to the unread group with the lowest level
2095(@code{gnus-group-best-unread-group}).
2096
2097@item .
2098@kindex . (Group)
2099@findex gnus-group-first-unread-group
2100Jump to the first group with unread articles
2101(@code{gnus-group-first-unread-group}).
2102@end table
2103
2104@vindex gnus-group-goto-unread
2105If @code{gnus-group-goto-unread} is @code{nil}, all the movement
2106commands will move to the next group, not the next unread group. Even
2107the commands that say they move to the next unread group. The default
2108is @code{t}.
2109
01c52d31
MB
2110@vindex gnus-summary-next-group-on-exit
2111If @code{gnus-summary-next-group-on-exit} is @code{t}, when a summary is
2112exited, the point in the group buffer is moved to the next unread group.
2113Otherwise, the point is set to the group just exited. The default is
2114@code{t}.
4009494e
GM
2115
2116@node Selecting a Group
2117@section Selecting a Group
2118@cindex group selection
2119
2120@table @kbd
2121
2122@item SPACE
2123@kindex SPACE (Group)
2124@findex gnus-group-read-group
2125Select the current group, switch to the summary buffer and display the
2126first unread article (@code{gnus-group-read-group}). If there are no
2127unread articles in the group, or if you give a non-numerical prefix to
2128this command, Gnus will offer to fetch all the old articles in this
2129group from the server. If you give a numerical prefix @var{n}, @var{n}
2130determines the number of articles Gnus will fetch. If @var{n} is
2131positive, Gnus fetches the @var{n} newest articles, if @var{n} is
2132negative, Gnus fetches the @code{abs(@var{n})} oldest articles.
2133
2134Thus, @kbd{SPC} enters the group normally, @kbd{C-u SPC} offers old
2135articles, @kbd{C-u 4 2 SPC} fetches the 42 newest articles, and @kbd{C-u
2136- 4 2 SPC} fetches the 42 oldest ones.
2137
2138When you are in the group (in the Summary buffer), you can type
2139@kbd{M-g} to fetch new articles, or @kbd{C-u M-g} to also show the old
2140ones.
2141
2142@item RET
2143@kindex RET (Group)
2144@findex gnus-group-select-group
2145Select the current group and switch to the summary buffer
2146(@code{gnus-group-select-group}). Takes the same arguments as
2147@code{gnus-group-read-group}---the only difference is that this command
2148does not display the first unread article automatically upon group
2149entry.
2150
2151@item M-RET
2152@kindex M-RET (Group)
2153@findex gnus-group-quick-select-group
2154This does the same as the command above, but tries to do it with the
2155minimum amount of fuzz (@code{gnus-group-quick-select-group}). No
2156scoring/killing will be performed, there will be no highlights and no
2157expunging. This might be useful if you're in a real hurry and have to
2158enter some humongous group. If you give a 0 prefix to this command
2159(i.e., @kbd{0 M-RET}), Gnus won't even generate the summary buffer,
2160which is useful if you want to toggle threading before generating the
2161summary buffer (@pxref{Summary Generation Commands}).
2162
2163@item M-SPACE
2164@kindex M-SPACE (Group)
2165@findex gnus-group-visible-select-group
2166This is yet one more command that does the same as the @kbd{RET}
2167command, but this one does it without expunging and hiding dormants
2168(@code{gnus-group-visible-select-group}).
2169
2170@item C-M-RET
2171@kindex C-M-RET (Group)
2172@findex gnus-group-select-group-ephemerally
2173Finally, this command selects the current group ephemerally without
2174doing any processing of its contents
2175(@code{gnus-group-select-group-ephemerally}). Even threading has been
2176turned off. Everything you do in the group after selecting it in this
2177manner will have no permanent effects.
2178
2179@end table
2180
2181@vindex gnus-large-newsgroup
2182The @code{gnus-large-newsgroup} variable says what Gnus should
2183consider to be a big group. If it is @code{nil}, no groups are
2184considered big. The default value is 200. If the group has more
2185(unread and/or ticked) articles than this, Gnus will query the user
2186before entering the group. The user can then specify how many
2187articles should be fetched from the server. If the user specifies a
2188negative number (@var{-n}), the @var{n} oldest articles will be
2189fetched. If it is positive, the @var{n} articles that have arrived
2190most recently will be fetched.
2191
2192@vindex gnus-large-ephemeral-newsgroup
2193@code{gnus-large-ephemeral-newsgroup} is the same as
2194@code{gnus-large-newsgroup}, but is only used for ephemeral
2195newsgroups.
2196
4b70e299 2197@vindex gnus-newsgroup-maximum-articles
4009494e
GM
2198In groups in some news servers, there might be a big gap between a few
2199very old articles that will never be expired and the recent ones. In
2200such a case, the server will return the data like @code{(1 . 30000000)}
2201for the @code{LIST ACTIVE group} command, for example. Even if there
2202are actually only the articles 1-10 and 29999900-30000000, Gnus doesn't
2203know it at first and prepares for getting 30000000 articles. However,
2204it will consume hundreds megabytes of memories and might make Emacs get
2205stuck as the case may be. If you use such news servers, set the
4b70e299
MB
2206variable @code{gnus-newsgroup-maximum-articles} to a positive number.
2207The value means that Gnus ignores articles other than this number of the
2208latest ones in every group. For instance, the value 10000 makes Gnus
2209get only the articles 29990001-30000000 (if the latest article number is
221030000000 in a group). Note that setting this variable to a number might
2211prevent you from reading very old articles. The default value of the
2212variable @code{gnus-newsgroup-maximum-articles} is @code{nil}, which
2213means Gnus never ignores old articles.
4009494e
GM
2214
2215@vindex gnus-select-group-hook
2216@vindex gnus-auto-select-first
2217@vindex gnus-auto-select-subject
2218If @code{gnus-auto-select-first} is non-@code{nil}, select an article
2219automatically when entering a group with the @kbd{SPACE} command.
867d4bb3 2220Which article this is controlled by the
4009494e
GM
2221@code{gnus-auto-select-subject} variable. Valid values for this
2222variable are:
2223
2224@table @code
2225
2226@item unread
2227Place point on the subject line of the first unread article.
2228
2229@item first
2230Place point on the subject line of the first article.
2231
2232@item unseen
2233Place point on the subject line of the first unseen article.
2234
2235@item unseen-or-unread
2236Place point on the subject line of the first unseen article, and if
2237there is no such article, place point on the subject line of the first
2238unread article.
2239
2240@item best
2241Place point on the subject line of the highest-scored unread article.
2242
2243@end table
2244
2245This variable can also be a function. In that case, that function
2246will be called to place point on a subject line.
2247
2248If you want to prevent automatic selection in some group (say, in a
2249binary group with Huge articles) you can set the
2250@code{gnus-auto-select-first} variable to @code{nil} in
2251@code{gnus-select-group-hook}, which is called when a group is
2252selected.
2253
2254
2255@node Subscription Commands
2256@section Subscription Commands
2257@cindex subscription
2258
2259@table @kbd
2260
2261@item S t
2262@itemx u
2263@kindex S t (Group)
2264@kindex u (Group)
2265@findex gnus-group-unsubscribe-current-group
2266@c @icon{gnus-group-unsubscribe}
2267Toggle subscription to the current group
2268(@code{gnus-group-unsubscribe-current-group}).
2269
2270@item S s
2271@itemx U
2272@kindex S s (Group)
2273@kindex U (Group)
2274@findex gnus-group-unsubscribe-group
2275Prompt for a group to subscribe, and then subscribe it. If it was
2276subscribed already, unsubscribe it instead
2277(@code{gnus-group-unsubscribe-group}).
2278
2279@item S k
2280@itemx C-k
2281@kindex S k (Group)
2282@kindex C-k (Group)
2283@findex gnus-group-kill-group
2284@c @icon{gnus-group-kill-group}
2285Kill the current group (@code{gnus-group-kill-group}).
2286
2287@item S y
2288@itemx C-y
2289@kindex S y (Group)
2290@kindex C-y (Group)
2291@findex gnus-group-yank-group
2292Yank the last killed group (@code{gnus-group-yank-group}).
2293
2294@item C-x C-t
2295@kindex C-x C-t (Group)
2296@findex gnus-group-transpose-groups
2297Transpose two groups (@code{gnus-group-transpose-groups}). This isn't
2298really a subscription command, but you can use it instead of a
2299kill-and-yank sequence sometimes.
2300
2301@item S w
2302@itemx C-w
2303@kindex S w (Group)
2304@kindex C-w (Group)
2305@findex gnus-group-kill-region
2306Kill all groups in the region (@code{gnus-group-kill-region}).
2307
2308@item S z
2309@kindex S z (Group)
2310@findex gnus-group-kill-all-zombies
2311Kill all zombie groups (@code{gnus-group-kill-all-zombies}).
2312
2313@item S C-k
2314@kindex S C-k (Group)
2315@findex gnus-group-kill-level
2316Kill all groups on a certain level (@code{gnus-group-kill-level}).
2317These groups can't be yanked back after killing, so this command should
2318be used with some caution. The only time where this command comes in
2319really handy is when you have a @file{.newsrc} with lots of unsubscribed
2320groups that you want to get rid off. @kbd{S C-k} on level 7 will
2321kill off all unsubscribed groups that do not have message numbers in the
2322@file{.newsrc} file.
2323
2324@end table
2325
2326Also @pxref{Group Levels}.
2327
2328
2329@node Group Data
2330@section Group Data
2331
2332@table @kbd
2333
2334@item c
2335@kindex c (Group)
2336@findex gnus-group-catchup-current
2337@vindex gnus-group-catchup-group-hook
2338@c @icon{gnus-group-catchup-current}
2339Mark all unticked articles in this group as read
2340(@code{gnus-group-catchup-current}).
2341@code{gnus-group-catchup-group-hook} is called when catching up a group from
2342the group buffer.
2343
2344@item C
2345@kindex C (Group)
2346@findex gnus-group-catchup-current-all
2347Mark all articles in this group, even the ticked ones, as read
2348(@code{gnus-group-catchup-current-all}).
2349
2350@item M-c
2351@kindex M-c (Group)
2352@findex gnus-group-clear-data
2353Clear the data from the current group---nix out marks and the list of
2354read articles (@code{gnus-group-clear-data}).
2355
2356@item M-x gnus-group-clear-data-on-native-groups
2357@kindex M-x gnus-group-clear-data-on-native-groups
2358@findex gnus-group-clear-data-on-native-groups
2359If you have switched from one @acronym{NNTP} server to another, all your marks
2360and read ranges have become worthless. You can use this command to
2361clear out all data that you have on your native groups. Use with
2362caution.
2363
2364@end table
2365
2366
2367@node Group Levels
2368@section Group Levels
2369@cindex group level
2370@cindex level
2371
2372All groups have a level of @dfn{subscribedness}. For instance, if a
2373group is on level 2, it is more subscribed than a group on level 5. You
2374can ask Gnus to just list groups on a given level or lower
2375(@pxref{Listing Groups}), or to just check for new articles in groups on
2376a given level or lower (@pxref{Scanning New Messages}).
2377
2378Remember: The higher the level of the group, the less important it is.
2379
2380@table @kbd
2381
2382@item S l
2383@kindex S l (Group)
2384@findex gnus-group-set-current-level
2385Set the level of the current group. If a numeric prefix is given, the
2386next @var{n} groups will have their levels set. The user will be
2387prompted for a level.
2388@end table
2389
2390@vindex gnus-level-killed
2391@vindex gnus-level-zombie
2392@vindex gnus-level-unsubscribed
2393@vindex gnus-level-subscribed
2394Gnus considers groups from levels 1 to
2395@code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed,
2396@code{gnus-level-subscribed} (exclusive) and
2397@code{gnus-level-unsubscribed} (inclusive) (default 7) to be
2398unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead)
2399(default 8) and @code{gnus-level-killed} to be killed (completely dead)
2400(default 9). Gnus treats subscribed and unsubscribed groups exactly the
2401same, but zombie and killed groups have no information on what articles
2402you have read, etc, stored. This distinction between dead and living
2403groups isn't done because it is nice or clever, it is done purely for
2404reasons of efficiency.
2405
2406It is recommended that you keep all your mail groups (if any) on quite
2407low levels (e.g. 1 or 2).
2408
2409Maybe the following description of the default behavior of Gnus helps to
2410understand what these levels are all about. By default, Gnus shows you
2411subscribed nonempty groups, but by hitting @kbd{L} you can have it show
2412empty subscribed groups and unsubscribed groups, too. Type @kbd{l} to
2413go back to showing nonempty subscribed groups again. Thus, unsubscribed
2414groups are hidden, in a way.
2415
2416Zombie and killed groups are similar to unsubscribed groups in that they
2417are hidden by default. But they are different from subscribed and
2418unsubscribed groups in that Gnus doesn't ask the news server for
2419information (number of messages, number of unread messages) on zombie
2420and killed groups. Normally, you use @kbd{C-k} to kill the groups you
2421aren't interested in. If most groups are killed, Gnus is faster.
2422
2423Why does Gnus distinguish between zombie and killed groups? Well, when
2424a new group arrives on the server, Gnus by default makes it a zombie
2425group. This means that you are normally not bothered with new groups,
2426but you can type @kbd{A z} to get a list of all new groups. Subscribe
2427the ones you like and kill the ones you don't want. (@kbd{A k} shows a
2428list of killed groups.)
2429
2430If you want to play with the level variables, you should show some care.
2431Set them once, and don't touch them ever again. Better yet, don't touch
2432them at all unless you know exactly what you're doing.
2433
2434@vindex gnus-level-default-unsubscribed
2435@vindex gnus-level-default-subscribed
2436Two closely related variables are @code{gnus-level-default-subscribed}
2437(default 3) and @code{gnus-level-default-unsubscribed} (default 6),
2438which are the levels that new groups will be put on if they are
2439(un)subscribed. These two variables should, of course, be inside the
2440relevant valid ranges.
2441
2442@vindex gnus-keep-same-level
2443If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands
2444will only move to groups of the same level (or lower). In
2445particular, going from the last article in one group to the next group
2446will go to the next group of the same level (or lower). This might be
2447handy if you want to read the most important groups before you read the
2448rest.
2449
2450If this variable is @code{best}, Gnus will make the next newsgroup the
2451one with the best level.
2452
2453@vindex gnus-group-default-list-level
2454All groups with a level less than or equal to
2455@code{gnus-group-default-list-level} will be listed in the group buffer
2456by default.
2457
2458@vindex gnus-group-list-inactive-groups
2459If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active
2460groups will be listed along with the unread groups. This variable is
2461@code{t} by default. If it is @code{nil}, inactive groups won't be
2462listed.
2463
2464@vindex gnus-group-use-permanent-levels
2465If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you
2466give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
2467use this level as the ``work'' level.
2468
2469@vindex gnus-activate-level
2470Gnus will normally just activate (i. e., query the server about) groups
2471on level @code{gnus-activate-level} or less. If you don't want to
2472activate unsubscribed groups, for instance, you might set this variable
2473to 5. The default is 6.
2474
2475
2476@node Group Score
2477@section Group Score
2478@cindex group score
2479@cindex group rank
2480@cindex rank
2481
2482You would normally keep important groups on high levels, but that scheme
2483is somewhat restrictive. Don't you wish you could have Gnus sort the
2484group buffer according to how often you read groups, perhaps? Within
2485reason?
2486
2487This is what @dfn{group score} is for. You can have Gnus assign a score
2488to each group through the mechanism described below. You can then sort
2489the group buffer based on this score. Alternatively, you can sort on
2490score and then level. (Taken together, the level and the score is
2491called the @dfn{rank} of the group. A group that is on level 4 and has
2492a score of 1 has a higher rank than a group on level 5 that has a score
2493of 300. (The level is the most significant part and the score is the
2494least significant part.))
2495
2496@findex gnus-summary-bubble-group
2497If you want groups you read often to get higher scores than groups you
2498read seldom you can add the @code{gnus-summary-bubble-group} function to
2499the @code{gnus-summary-exit-hook} hook. This will result (after
2500sorting) in a bubbling sort of action. If you want to see that in
2501action after each summary exit, you can add
2502@code{gnus-group-sort-groups-by-rank} or
2503@code{gnus-group-sort-groups-by-score} to the same hook, but that will
2504slow things down somewhat.
2505
2506
2507@node Marking Groups
2508@section Marking Groups
2509@cindex marking groups
2510
2511If you want to perform some command on several groups, and they appear
2512subsequently in the group buffer, you would normally just give a
2513numerical prefix to the command. Most group commands will then do your
2514bidding on those groups.
2515
2516However, if the groups are not in sequential order, you can still
2517perform a command on several groups. You simply mark the groups first
2518with the process mark and then execute the command.
2519
2520@table @kbd
2521
2522@item #
2523@kindex # (Group)
2524@itemx M m
2525@kindex M m (Group)
2526@findex gnus-group-mark-group
2527Set the mark on the current group (@code{gnus-group-mark-group}).
2528
2529@item M-#
2530@kindex M-# (Group)
2531@itemx M u
2532@kindex M u (Group)
2533@findex gnus-group-unmark-group
2534Remove the mark from the current group
2535(@code{gnus-group-unmark-group}).
2536
2537@item M U
2538@kindex M U (Group)
2539@findex gnus-group-unmark-all-groups
2540Remove the mark from all groups (@code{gnus-group-unmark-all-groups}).
2541
2542@item M w
2543@kindex M w (Group)
2544@findex gnus-group-mark-region
2545Mark all groups between point and mark (@code{gnus-group-mark-region}).
2546
2547@item M b
2548@kindex M b (Group)
2549@findex gnus-group-mark-buffer
2550Mark all groups in the buffer (@code{gnus-group-mark-buffer}).
2551
2552@item M r
2553@kindex M r (Group)
2554@findex gnus-group-mark-regexp
2555Mark all groups that match some regular expression
2556(@code{gnus-group-mark-regexp}).
2557@end table
2558
2559Also @pxref{Process/Prefix}.
2560
2561@findex gnus-group-universal-argument
2562If you want to execute some command on all groups that have been marked
2563with the process mark, you can use the @kbd{M-&}
2564(@code{gnus-group-universal-argument}) command. It will prompt you for
2565the command to be executed.
2566
2567
2568@node Foreign Groups
2569@section Foreign Groups
2570@cindex foreign groups
2571
2572Below are some group mode commands for making and editing general foreign
2573groups, as well as commands to ease the creation of a few
2574special-purpose groups. All these commands insert the newly created
2575groups under point---@code{gnus-subscribe-newsgroup-method} is not
2576consulted.
2577
2578Changes from the group editing commands are stored in
2579@file{~/.newsrc.eld} (@code{gnus-startup-file}). An alternative is the
2580variable @code{gnus-parameters}, @xref{Group Parameters}.
2581
2582@table @kbd
2583
2584@item G m
2585@kindex G m (Group)
2586@findex gnus-group-make-group
2587@cindex making groups
2588Make a new group (@code{gnus-group-make-group}). Gnus will prompt you
2589for a name, a method and possibly an @dfn{address}. For an easier way
2590to subscribe to @acronym{NNTP} groups (@pxref{Browse Foreign Server}).
2591
2592@item G M
2593@kindex G M (Group)
2594@findex gnus-group-read-ephemeral-group
2595Make an ephemeral group (@code{gnus-group-read-ephemeral-group}). Gnus
2596will prompt you for a name, a method and an @dfn{address}.
2597
2598@item G r
2599@kindex G r (Group)
2600@findex gnus-group-rename-group
2601@cindex renaming groups
2602Rename the current group to something else
2603(@code{gnus-group-rename-group}). This is valid only on some
2604groups---mail groups mostly. This command might very well be quite slow
2605on some back ends.
2606
2607@item G c
2608@kindex G c (Group)
2609@cindex customizing
2610@findex gnus-group-customize
2611Customize the group parameters (@code{gnus-group-customize}).
2612
2613@item G e
2614@kindex G e (Group)
2615@findex gnus-group-edit-group-method
2616@cindex renaming groups
2617Enter a buffer where you can edit the select method of the current
2618group (@code{gnus-group-edit-group-method}).
2619
2620@item G p
2621@kindex G p (Group)
2622@findex gnus-group-edit-group-parameters
2623Enter a buffer where you can edit the group parameters
2624(@code{gnus-group-edit-group-parameters}).
2625
2626@item G E
2627@kindex G E (Group)
2628@findex gnus-group-edit-group
2629Enter a buffer where you can edit the group info
2630(@code{gnus-group-edit-group}).
2631
2632@item G d
2633@kindex G d (Group)
2634@findex gnus-group-make-directory-group
2635@cindex nndir
2636Make a directory group (@pxref{Directory Groups}). You will be prompted
2637for a directory name (@code{gnus-group-make-directory-group}).
2638
2639@item G h
2640@kindex G h (Group)
2641@cindex help group
2642@findex gnus-group-make-help-group
2643Make the Gnus help group (@code{gnus-group-make-help-group}).
2644
2645@item G a
2646@kindex G a (Group)
2647@cindex (ding) archive
2648@cindex archive group
2649@findex gnus-group-make-archive-group
2650@vindex gnus-group-archive-directory
2651@vindex gnus-group-recent-archive-directory
2652Make a Gnus archive group (@code{gnus-group-make-archive-group}). By
2653default a group pointing to the most recent articles will be created
2654(@code{gnus-group-recent-archive-directory}), but given a prefix, a full
2655group will be created from @code{gnus-group-archive-directory}.
2656
2657@item G k
2658@kindex G k (Group)
2659@findex gnus-group-make-kiboze-group
2660@cindex nnkiboze
2661Make a kiboze group. You will be prompted for a name, for a regexp to
2662match groups to be ``included'' in the kiboze group, and a series of
2663strings to match on headers (@code{gnus-group-make-kiboze-group}).
2664@xref{Kibozed Groups}.
2665
2666@item G D
2667@kindex G D (Group)
2668@findex gnus-group-enter-directory
2669@cindex nneething
2670Read an arbitrary directory as if it were a newsgroup with the
2671@code{nneething} back end (@code{gnus-group-enter-directory}).
2672@xref{Anything Groups}.
2673
2674@item G f
2675@kindex G f (Group)
2676@findex gnus-group-make-doc-group
2677@cindex ClariNet Briefs
2678@cindex nndoc
2679Make a group based on some file or other
2680(@code{gnus-group-make-doc-group}). If you give a prefix to this
2681command, you will be prompted for a file name and a file type.
2682Currently supported types are @code{mbox}, @code{babyl},
2683@code{digest}, @code{news}, @code{rnews}, @code{mmdf}, @code{forward},
2684@code{rfc934}, @code{rfc822-forward}, @code{mime-parts},
2685@code{standard-digest}, @code{slack-digest}, @code{clari-briefs},
2686@code{nsmail}, @code{outlook}, @code{oe-dbx}, and @code{mailman}. If
2687you run this command without a prefix, Gnus will guess at the file
2688type. @xref{Document Groups}.
2689
2690@item G u
2691@kindex G u (Group)
2692@vindex gnus-useful-groups
2693@findex gnus-group-make-useful-group
2694Create one of the groups mentioned in @code{gnus-useful-groups}
2695(@code{gnus-group-make-useful-group}).
2696
2697@item G w
2698@kindex G w (Group)
2699@findex gnus-group-make-web-group
2700@cindex Google
2701@cindex nnweb
2702@cindex gmane
2703Make an ephemeral group based on a web search
2704(@code{gnus-group-make-web-group}). If you give a prefix to this
2705command, make a solid group instead. You will be prompted for the
2706search engine type and the search string. Valid search engine types
2707include @code{google}, @code{dejanews}, and @code{gmane}.
2708@xref{Web Searches}.
2709
2710If you use the @code{google} search engine, you can limit the search
2711to a particular group by using a match string like
2712@samp{shaving group:alt.sysadmin.recovery}.
2713
2714@item G R
2715@kindex G R (Group)
2716@findex gnus-group-make-rss-group
2717Make a group based on an @acronym{RSS} feed
2718(@code{gnus-group-make-rss-group}). You will be prompted for an URL.
2719@xref{RSS}.
2720
2721@item G DEL
2722@kindex G DEL (Group)
2723@findex gnus-group-delete-group
2724This function will delete the current group
2725(@code{gnus-group-delete-group}). If given a prefix, this function will
2726actually delete all the articles in the group, and forcibly remove the
2727group itself from the face of the Earth. Use a prefix only if you are
2728absolutely sure of what you are doing. This command can't be used on
2729read-only groups (like @code{nntp} groups), though.
2730
2731@item G V
2732@kindex G V (Group)
2733@findex gnus-group-make-empty-virtual
2734Make a new, fresh, empty @code{nnvirtual} group
2735(@code{gnus-group-make-empty-virtual}). @xref{Virtual Groups}.
2736
2737@item G v
2738@kindex G v (Group)
2739@findex gnus-group-add-to-virtual
2740Add the current group to an @code{nnvirtual} group
2741(@code{gnus-group-add-to-virtual}). Uses the process/prefix convention.
2742@end table
2743
2744@xref{Select Methods}, for more information on the various select
2745methods.
2746
2747@vindex gnus-activate-foreign-newsgroups
2748If @code{gnus-activate-foreign-newsgroups} is a positive number,
2749Gnus will check all foreign groups with this level or lower at startup.
2750This might take quite a while, especially if you subscribe to lots of
2751groups from different @acronym{NNTP} servers. Also @pxref{Group Levels};
2752@code{gnus-activate-level} also affects activation of foreign
2753newsgroups.
2754
2755
9b3ebcb6
MB
2756The following commands create ephemeral groups. They can be called not
2757only from the Group buffer, but in any Gnus buffer.
2758
2759@table @code
2760@item gnus-read-ephemeral-gmane-group
2761@findex gnus-read-ephemeral-gmane-group
2762@vindex gnus-gmane-group-download-format
2763Read an ephemeral group on Gmane.org. The articles are downloaded via
2764HTTP using the URL specified by @code{gnus-gmane-group-download-format}.
2765Gnus will prompt you for a group name, the start article number and an
2766the article range.
2767
2768@item gnus-read-ephemeral-gmane-group-url
2769@findex gnus-read-ephemeral-gmane-group-url
2770This command is similar to @code{gnus-read-ephemeral-gmane-group}, but
2771the group name and the article number and range are constructed from a
2772given @acronym{URL}. Supported @acronym{URL} formats include e.g.
2773@url{http://thread.gmane.org/gmane.foo.bar/12300/focus=12399},
2774@url{http://thread.gmane.org/gmane.foo.bar/12345/},
2775@url{http://article.gmane.org/gmane.foo.bar/12345/},
2776@url{http://permalink.gmane.org/gmane.foo.bar/12345/}, and
2777@url{http://news.gmane.org/group/gmane.foo.bar/thread=12345}.
2778
2779@item gnus-read-ephemeral-emacs-bug-group
2780@findex gnus-read-ephemeral-emacs-bug-group
2781Read an Emacs bug report in an ephemeral group. Gnus will prompt for a
2782bug number. The default is the number at point. The @acronym{URL} is
2783specified in @code{gnus-bug-group-download-format-alist}.
2784
2785@item gnus-read-ephemeral-debian-bug-group
2786@findex gnus-read-ephemeral-debian-bug-group
2787Read a Debian bug report in an ephemeral group. Analog to
2788@code{gnus-read-ephemeral-emacs-bug-group}.
2789@end table
2790
2791Some of these command are also useful for article buttons, @xref{Article
2792Buttons}.
2793
2794Here is an example:
2795@lisp
2796(require 'gnus-art)
2797(add-to-list
2798 'gnus-button-alist
2799 '("#\\([0-9]+\\)\\>" 1
2800 (string-match "\\<emacs\\>" (or gnus-newsgroup-name ""))
2801 gnus-read-ephemeral-emacs-bug-group 1))
2802@end lisp
2803
2804
4009494e
GM
2805@node Group Parameters
2806@section Group Parameters
2807@cindex group parameters
2808
2809The group parameters store information local to a particular group.
87035689
MB
2810
2811Use the @kbd{G p} or the @kbd{G c} command to edit group parameters of a
2812group. (@kbd{G p} presents you with a Lisp-based interface, @kbd{G c}
2813presents you with a Customize-like interface. The latter helps avoid
2814silly Lisp errors.) You might also be interested in reading about topic
2815parameters (@pxref{Topic Parameters}).
2816Additionally, you can set group parameters via the
2817@code{gnus-parameters} variable, see below.
2818
4009494e
GM
2819Here's an example group parameter list:
2820
2821@example
2822((to-address . "ding@@gnus.org")
2823 (auto-expire . t))
2824@end example
2825
2826We see that each element consists of a ``dotted pair''---the thing before
2827the dot is the key, while the thing after the dot is the value. All the
2828parameters have this form @emph{except} local variable specs, which are
2829not dotted pairs, but proper lists.
2830
2831Some parameters have correspondent customizable variables, each of which
2832is an alist of regexps and values.
2833
2834The following group parameters can be used:
2835
2836@table @code
2837@item to-address
2838@cindex to-address
2839Address used by when doing followups and new posts.
2840
2841@example
2842(to-address . "some@@where.com")
2843@end example
2844
2845This is primarily useful in mail groups that represent closed mailing
2846lists---mailing lists where it's expected that everybody that writes to
2847the mailing list is subscribed to it. Since using this parameter
2848ensures that the mail only goes to the mailing list itself, it means
2849that members won't receive two copies of your followups.
2850
2851Using @code{to-address} will actually work whether the group is foreign
2852or not. Let's say there's a group on the server that is called
2853@samp{fa.4ad-l}. This is a real newsgroup, but the server has gotten
2854the articles from a mail-to-news gateway. Posting directly to this
2855group is therefore impossible---you have to send mail to the mailing
2856list address instead.
2857
2858See also @code{gnus-parameter-to-address-alist}.
2859
2860@item to-list
2861@cindex to-list
2862Address used when doing @kbd{a} in that group.
2863
2864@example
2865(to-list . "some@@where.com")
2866@end example
2867
2868It is totally ignored
2869when doing a followup---except that if it is present in a news group,
2870you'll get mail group semantics when doing @kbd{f}.
2871
2872If you do an @kbd{a} command in a mail group and you have neither a
2873@code{to-list} group parameter nor a @code{to-address} group parameter,
2874then a @code{to-list} group parameter will be added automatically upon
2875sending the message if @code{gnus-add-to-list} is set to @code{t}.
2876@vindex gnus-add-to-list
2877
2878@findex gnus-mailing-list-mode
2879@cindex mail list groups
2880If this variable is set, @code{gnus-mailing-list-mode} is turned on when
2881entering summary buffer.
2882
2883See also @code{gnus-parameter-to-list-alist}.
2884
2885@anchor{subscribed}
2886@item subscribed
2887@cindex subscribed
2888@cindex Mail-Followup-To
2889@findex gnus-find-subscribed-addresses
2890If this parameter is set to @code{t}, Gnus will consider the
2891to-address and to-list parameters for this group as addresses of
2892mailing lists you are subscribed to. Giving Gnus this information is
2893(only) a first step in getting it to generate correct Mail-Followup-To
2894headers for your posts to these lists. The second step is to put the
2895following in your @file{.gnus.el}
2896
2897@lisp
2898(setq message-subscribed-address-functions
2899 '(gnus-find-subscribed-addresses))
2900@end lisp
2901
2902@xref{Mailing Lists, ,Mailing Lists, message, The Message Manual}, for
2903a complete treatment of available MFT support.
2904
2905@item visible
2906@cindex visible
2907If the group parameter list has the element @code{(visible . t)},
2908that group will always be visible in the Group buffer, regardless
2909of whether it has any unread articles.
2910
2911This parameter cannot be set via @code{gnus-parameters}. See
2912@code{gnus-permanently-visible-groups} as an alternative.
2913
2914@item broken-reply-to
2915@cindex broken-reply-to
2916Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
2917headers in this group are to be ignored, and for the header to be hidden
2918if @code{reply-to} is part of @code{gnus-boring-article-headers}. This
2919can be useful if you're reading a mailing list group where the listserv
2920has inserted @code{Reply-To} headers that point back to the listserv
2921itself. That is broken behavior. So there!
2922
2923@item to-group
2924@cindex to-group
2925Elements like @code{(to-group . "some.group.name")} means that all
2926posts in that group will be sent to @code{some.group.name}.
2927
2928@item newsgroup
2929@cindex newsgroup
2930If you have @code{(newsgroup . t)} in the group parameter list, Gnus
2931will treat all responses as if they were responses to news articles.
2932This can be useful if you have a mail group that's really a mirror of a
2933news group.
2934
2935@item gcc-self
2936@cindex gcc-self
2937If @code{(gcc-self . t)} is present in the group parameter list, newly
2938composed messages will be @code{Gcc}'d to the current group. If
2939@code{(gcc-self . none)} is present, no @code{Gcc:} header will be
2940generated, if @code{(gcc-self . "string")} is present, this string will
2941be inserted literally as a @code{gcc} header. This parameter takes
2942precedence over any default @code{Gcc} rules as described later
2943(@pxref{Archived Messages}).
2944
2945@strong{Caveat}: Adding @code{(gcc-self . t)} to the parameter list of
2946@code{nntp} groups (or the like) isn't valid. An @code{nntp} server
2947doesn't accept articles.
2948
2949@item auto-expire
2950@cindex auto-expire
2951@cindex expiring mail
2952If the group parameter has an element that looks like @code{(auto-expire
2953. t)}, all articles read will be marked as expirable. For an
2954alternative approach, @pxref{Expiring Mail}.
2955
2956See also @code{gnus-auto-expirable-newsgroups}.
2957
2958@item total-expire
2959@cindex total-expire
2960@cindex expiring mail
2961If the group parameter has an element that looks like
2962@code{(total-expire . t)}, all read articles will be put through the
2963expiry process, even if they are not marked as expirable. Use with
2964caution. Unread, ticked and dormant articles are not eligible for
2965expiry.
2966
2967See also @code{gnus-total-expirable-newsgroups}.
2968
2969@item expiry-wait
2970@cindex expiry-wait
2971@vindex nnmail-expiry-wait-function
2972If the group parameter has an element that looks like
2973@code{(expiry-wait . 10)}, this value will override any
2974@code{nnmail-expiry-wait} and @code{nnmail-expiry-wait-function}
2975(@pxref{Expiring Mail}) when expiring expirable messages. The value
2976can either be a number of days (not necessarily an integer) or the
2977symbols @code{never} or @code{immediate}.
2978
2979@item expiry-target
2980@cindex expiry-target
2981Where expired messages end up. This parameter overrides
2982@code{nnmail-expiry-target}.
2983
2984@item score-file
2985@cindex score file group parameter
2986Elements that look like @code{(score-file . "file")} will make
2987@file{file} into the current score file for the group in question. All
2988interactive score entries will be put into this file.
2989
2990@item adapt-file
2991@cindex adapt file group parameter
2992Elements that look like @code{(adapt-file . "file")} will make
2993@file{file} into the current adaptive file for the group in question.
2994All adaptive score entries will be put into this file.
2995
2996@item admin-address
2997@cindex admin-address
2998When unsubscribing from a mailing list you should never send the
2999unsubscription notice to the mailing list itself. Instead, you'd send
3000messages to the administrative address. This parameter allows you to
3001put the admin address somewhere convenient.
3002
3003@item display
3004@cindex display
3005Elements that look like @code{(display . MODE)} say which articles to
3006display on entering the group. Valid values are:
3007
3008@table @code
3009@item all
3010Display all articles, both read and unread.
3011
3012@item an integer
3013Display the last @var{integer} articles in the group. This is the same as
3014entering the group with @kbd{C-u @var{integer}}.
3015
3016@item default
3017Display the default visible articles, which normally includes unread and
3018ticked articles.
3019
3020@item an array
3021Display articles that satisfy a predicate.
3022
3023Here are some examples:
3024
3025@table @code
3026@item [unread]
3027Display only unread articles.
3028
3029@item [not expire]
3030Display everything except expirable articles.
3031
3032@item [and (not reply) (not expire)]
3033Display everything except expirable and articles you've already
3034responded to.
3035@end table
3036
3037The available operators are @code{not}, @code{and} and @code{or}.
3038Predicates include @code{tick}, @code{unsend}, @code{undownload},
3039@code{unread}, @code{dormant}, @code{expire}, @code{reply},
3040@code{killed}, @code{bookmark}, @code{score}, @code{save},
3041@code{cache}, @code{forward}, @code{unseen} and @code{recent}.
3042
3043@end table
3044
3045The @code{display} parameter works by limiting the summary buffer to
3046the subset specified. You can pop the limit by using the @kbd{/ w}
3047command (@pxref{Limiting}).
3048
3049@item comment
3050@cindex comment
3051Elements that look like @code{(comment . "This is a comment")} are
3052arbitrary comments on the group. You can display comments in the
3053group line (@pxref{Group Line Specification}).
3054
3055@item charset
3056@cindex charset
3057Elements that look like @code{(charset . iso-8859-1)} will make
3058@code{iso-8859-1} the default charset; that is, the charset that will be
3059used for all articles that do not specify a charset.
3060
3061See also @code{gnus-group-charset-alist}.
3062
3063@item ignored-charsets
3064@cindex ignored-charset
3065Elements that look like @code{(ignored-charsets x-unknown iso-8859-1)}
3066will make @code{iso-8859-1} and @code{x-unknown} ignored; that is, the
3067default charset will be used for decoding articles.
3068
3069See also @code{gnus-group-ignored-charsets-alist}.
3070
3071@item posting-style
3072@cindex posting-style
3073You can store additional posting style information for this group
3074here (@pxref{Posting Styles}). The format is that of an entry in the
3075@code{gnus-posting-styles} alist, except that there's no regexp matching
3076the group name (of course). Style elements in this group parameter will
3077take precedence over the ones found in @code{gnus-posting-styles}.
3078
3079For instance, if you want a funky name and signature in this group only,
3080instead of hacking @code{gnus-posting-styles}, you could put something
3081like this in the group parameters:
3082
3083@example
3084(posting-style
3085 (name "Funky Name")
3086 ("X-My-Header" "Funky Value")
3087 (signature "Funky Signature"))
3088@end example
3089
01c52d31
MB
3090If you're using topics to organize your group buffer
3091(@pxref{Group Topics}), note that posting styles can also be set in
3092the topics parameters. Posting styles in topic parameters apply to all
3093groups in this topic. More precisely, the posting-style settings for a
3094group result from the hierarchical merging of all posting-style
3095entries in the parameters of this group and all the topics it belongs
3096to.
3097
3098
4009494e
GM
3099@item post-method
3100@cindex post-method
3101If it is set, the value is used as the method for posting message
3102instead of @code{gnus-post-method}.
3103
a1da1e37
MB
3104@item mail-source
3105@cindex mail-source
3106If it is set, and the setting of @code{mail-sources} includes a
3107@code{group} mail source (@pxref{Mail Sources}), the value is a
3108mail source for this group.
3109
4009494e
GM
3110@item banner
3111@cindex banner
3112An item like @code{(banner . @var{regexp})} causes any part of an article
3113that matches the regular expression @var{regexp} to be stripped. Instead of
3114@var{regexp}, you can also use the symbol @code{signature} which strips the
3115last signature or any of the elements of the alist
3116@code{gnus-article-banner-alist}.
3117
3118@item sieve
3119@cindex sieve
3120This parameter contains a Sieve test that should match incoming mail
3121that should be placed in this group. From this group parameter, a
3122Sieve @samp{IF} control structure is generated, having the test as the
3123condition and @samp{fileinto "group.name";} as the body.
3124
3125For example, if the @samp{INBOX.list.sieve} group has the @code{(sieve
3126address "sender" "sieve-admin@@extundo.com")} group parameter, when
3127translating the group parameter into a Sieve script (@pxref{Sieve
3128Commands}) the following Sieve code is generated:
3129
3130@example
01c52d31
MB
3131if address "sender" "sieve-admin@@extundo.com" @{
3132 fileinto "INBOX.list.sieve";
3133@}
3134@end example
3135
3136To generate tests for multiple email-addresses use a group parameter
3137like @code{(sieve address "sender" ("name@@one.org" else@@two.org"))}.
3138When generating a sieve script (@pxref{Sieve Commands}) Sieve code
3139like the following is generated:
3140
3141@example
3142if address "sender" ["name@@one.org", "else@@two.org"] @{
3143 fileinto "INBOX.list.sieve";
4009494e
GM
3144@}
3145@end example
3146
01c52d31
MB
3147See @pxref{Sieve Commands} for commands and variables that might be of
3148interest in relation to the sieve parameter.
3149
4009494e
GM
3150The Sieve language is described in RFC 3028. @xref{Top, Emacs Sieve,
3151Top, sieve, Emacs Sieve}.
3152
3153@item (agent parameters)
3154If the agent has been enabled, you can set any of the its parameters
3155to control the behavior of the agent in individual groups. See Agent
3156Parameters in @ref{Category Syntax}. Most users will choose to set
3157agent parameters in either an agent category or group topic to
3158minimize the configuration effort.
3159
3160@item (@var{variable} @var{form})
3161You can use the group parameters to set variables local to the group you
3162are entering. If you want to turn threading off in @samp{news.answers},
3163you could put @code{(gnus-show-threads nil)} in the group parameters of
3164that group. @code{gnus-show-threads} will be made into a local variable
3165in the summary buffer you enter, and the form @code{nil} will be
3166@code{eval}ed there.
3167
e3e955fe
MB
3168Note that this feature sets the variable locally to the summary buffer
3169if and only if @var{variable} has been bound as a variable. Otherwise,
3170only evaluating the form will take place. So, you may want to bind the
3171variable in advance using @code{defvar} or other if the result of the
3172form needs to be set to it.
3173
4009494e
GM
3174But some variables are evaluated in the article buffer, or in the
3175message buffer (of a reply or followup or otherwise newly created
3176message). As a workaround, it might help to add the variable in
3177question to @code{gnus-newsgroup-variables}. @xref{Various Summary
3178Stuff}. So if you want to set @code{message-from-style} via the group
3179parameters, then you may need the following statement elsewhere in your
e6d2d263 3180@file{~/.gnus.el} file:
4009494e
GM
3181
3182@lisp
3183(add-to-list 'gnus-newsgroup-variables 'message-from-style)
3184@end lisp
3185
3186@vindex gnus-list-identifiers
3187A use for this feature is to remove a mailing list identifier tag in
3188the subject fields of articles. E.g. if the news group
3189
3190@example
3191nntp+news.gnus.org:gmane.text.docbook.apps
3192@end example
3193
3194has the tag @samp{DOC-BOOK-APPS:} in the subject of all articles, this
3195tag can be removed from the article subjects in the summary buffer for
3196the group by putting @code{(gnus-list-identifiers "DOCBOOK-APPS:")}
3197into the group parameters for the group.
3198
3199This can also be used as a group-specific hook function. If you want to
3200hear a beep when you enter a group, you could put something like
e3e955fe
MB
3201@code{(dummy-variable (ding))} in the parameters of that group. If
3202@code{dummy-variable} has been bound (see above), it will be set to the
3203(meaningless) result of the @code{(ding)} form.
4009494e
GM
3204
3205Alternatively, since the VARIABLE becomes local to the group, this
3206pattern can be used to temporarily change a hook. For example, if the
3207following is added to a group parameter
3208
3209@lisp
3210(gnus-summary-prepared-hook
3211 '(lambda nil (local-set-key "d" (local-key-binding "n"))))
3212@end lisp
3213
3214when the group is entered, the 'd' key will not mark the article as
3215expired.
3216
3217@end table
3218
4009494e
GM
3219@vindex gnus-parameters
3220Group parameters can be set via the @code{gnus-parameters} variable too.
3221But some variables, such as @code{visible}, have no effect (For this
3222case see @code{gnus-permanently-visible-groups} as an alternative.).
3223For example:
3224
3225@lisp
3226(setq gnus-parameters
3227 '(("mail\\..*"
3228 (gnus-show-threads nil)
3229 (gnus-use-scoring nil)
3230 (gnus-summary-line-format
3231 "%U%R%z%I%(%[%d:%ub%-23,23f%]%) %s\n")
3232 (gcc-self . t)
3233 (display . all))
3234
3235 ("^nnimap:\\(foo.bar\\)$"
3236 (to-group . "\\1"))
3237
3238 ("mail\\.me"
3239 (gnus-use-scoring t))
3240
3241 ("list\\..*"
3242 (total-expire . t)
3243 (broken-reply-to . t))))
3244@end lisp
3245
3246String value of parameters will be subjected to regexp substitution, as
3247the @code{to-group} example shows.
3248
3249@vindex gnus-parameters-case-fold-search
3250By default, whether comparing the group name and one of those regexps
3251specified in @code{gnus-parameters} is done in a case-sensitive manner
3252or a case-insensitive manner depends on the value of
3253@code{case-fold-search} at the time when the comparison is done. The
3254value of @code{case-fold-search} is typically @code{t}; it means, for
3255example, the element @code{("INBOX\\.FOO" (total-expire . t))} might be
3256applied to both the @samp{INBOX.FOO} group and the @samp{INBOX.foo}
3257group. If you want to make those regexps always case-sensitive, set the
3258value of the @code{gnus-parameters-case-fold-search} variable to
3259@code{nil}. Otherwise, set it to @code{t} if you want to compare them
3260always in a case-insensitive manner.
3261
01c52d31
MB
3262You can define different sorting to different groups via
3263@code{gnus-parameters}. Here is an example to sort an @acronym{NNTP}
3264group by reverse date to see the latest news at the top and an
3265@acronym{RSS} group by subject. In this example, the first group is the
3266Debian daily news group @code{gmane.linux.debian.user.news} from
3267news.gmane.org. The @acronym{RSS} group corresponds to the Debian
3268weekly news RSS feed
3269@url{http://packages.debian.org/unstable/newpkg_main.en.rdf},
3270@xref{RSS}.
3271
3272@lisp
3273(setq
3274 gnus-parameters
3275 '(("nntp.*gmane\\.debian\\.user\\.news"
3276 (gnus-show-threads nil)
3277 (gnus-article-sort-functions '((not gnus-article-sort-by-date)))
3278 (gnus-use-adaptive-scoring nil)
3279 (gnus-use-scoring nil))
3280 ("nnrss.*debian"
3281 (gnus-show-threads nil)
3282 (gnus-article-sort-functions 'gnus-article-sort-by-subject)
3283 (gnus-use-adaptive-scoring nil)
3284 (gnus-use-scoring t)
3285 (gnus-score-find-score-files-function 'gnus-score-find-single)
3286 (gnus-summary-line-format "%U%R%z%d %I%(%[ %s %]%)\n"))))
3287@end lisp
3288
4009494e
GM
3289
3290@node Listing Groups
3291@section Listing Groups
3292@cindex group listing
3293
3294These commands all list various slices of the groups available.
3295
3296@table @kbd
3297
3298@item l
3299@itemx A s
3300@kindex A s (Group)
3301@kindex l (Group)
3302@findex gnus-group-list-groups
3303List all groups that have unread articles
3304(@code{gnus-group-list-groups}). If the numeric prefix is used, this
3305command will list only groups of level ARG and lower. By default, it
3306only lists groups of level five (i.e.,
3307@code{gnus-group-default-list-level}) or lower (i.e., just subscribed
3308groups).
3309
3310@item L
3311@itemx A u
3312@kindex A u (Group)
3313@kindex L (Group)
3314@findex gnus-group-list-all-groups
3315List all groups, whether they have unread articles or not
3316(@code{gnus-group-list-all-groups}). If the numeric prefix is used,
3317this command will list only groups of level ARG and lower. By default,
3318it lists groups of level seven or lower (i.e., just subscribed and
3319unsubscribed groups).
3320
3321@item A l
3322@kindex A l (Group)
3323@findex gnus-group-list-level
3324List all unread groups on a specific level
3325(@code{gnus-group-list-level}). If given a prefix, also list the groups
3326with no unread articles.
3327
3328@item A k
3329@kindex A k (Group)
3330@findex gnus-group-list-killed
3331List all killed groups (@code{gnus-group-list-killed}). If given a
3332prefix argument, really list all groups that are available, but aren't
3333currently (un)subscribed. This could entail reading the active file
3334from the server.
3335
3336@item A z
3337@kindex A z (Group)
3338@findex gnus-group-list-zombies
3339List all zombie groups (@code{gnus-group-list-zombies}).
3340
3341@item A m
3342@kindex A m (Group)
3343@findex gnus-group-list-matching
3344List all unread, subscribed groups with names that match a regexp
3345(@code{gnus-group-list-matching}).
3346
3347@item A M
3348@kindex A M (Group)
3349@findex gnus-group-list-all-matching
3350List groups that match a regexp (@code{gnus-group-list-all-matching}).
3351
3352@item A A
3353@kindex A A (Group)
3354@findex gnus-group-list-active
3355List absolutely all groups in the active file(s) of the
3356server(s) you are connected to (@code{gnus-group-list-active}). This
3357might very well take quite a while. It might actually be a better idea
3358to do a @kbd{A M} to list all matching, and just give @samp{.} as the
3359thing to match on. Also note that this command may list groups that
3360don't exist (yet)---these will be listed as if they were killed groups.
3361Take the output with some grains of salt.
3362
3363@item A a
3364@kindex A a (Group)
3365@findex gnus-group-apropos
3366List all groups that have names that match a regexp
3367(@code{gnus-group-apropos}).
3368
3369@item A d
3370@kindex A d (Group)
3371@findex gnus-group-description-apropos
3372List all groups that have names or descriptions that match a regexp
3373(@code{gnus-group-description-apropos}).
3374
3375@item A c
3376@kindex A c (Group)
3377@findex gnus-group-list-cached
3378List all groups with cached articles (@code{gnus-group-list-cached}).
3379
3380@item A ?
3381@kindex A ? (Group)
3382@findex gnus-group-list-dormant
3383List all groups with dormant articles (@code{gnus-group-list-dormant}).
3384
3385@item A /
3386@kindex A / (Group)
3387@findex gnus-group-list-limit
3388List groups limited within the current selection
3389(@code{gnus-group-list-limit}).
3390
3391@item A f
3392@kindex A f (Group)
3393@findex gnus-group-list-flush
3394Flush groups from the current selection (@code{gnus-group-list-flush}).
3395
3396@item A p
3397@kindex A p (Group)
3398@findex gnus-group-list-plus
3399List groups plus the current selection (@code{gnus-group-list-plus}).
3400
3401@end table
3402
3403@vindex gnus-permanently-visible-groups
3404@cindex visible group parameter
3405Groups that match the @code{gnus-permanently-visible-groups} regexp will
3406always be shown, whether they have unread articles or not. You can also
3407add the @code{visible} element to the group parameters in question to
3408get the same effect.
3409
3410@vindex gnus-list-groups-with-ticked-articles
3411Groups that have just ticked articles in it are normally listed in the
3412group buffer. If @code{gnus-list-groups-with-ticked-articles} is
3413@code{nil}, these groups will be treated just like totally empty
3414groups. It is @code{t} by default.
3415
3416
3417@node Sorting Groups
3418@section Sorting Groups
3419@cindex sorting groups
3420
3421@kindex C-c C-s (Group)
3422@findex gnus-group-sort-groups
3423@vindex gnus-group-sort-function
3424The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the
3425group buffer according to the function(s) given by the
3426@code{gnus-group-sort-function} variable. Available sorting functions
3427include:
3428
3429@table @code
3430
3431@item gnus-group-sort-by-alphabet
3432@findex gnus-group-sort-by-alphabet
3433Sort the group names alphabetically. This is the default.
3434
3435@item gnus-group-sort-by-real-name
3436@findex gnus-group-sort-by-real-name
3437Sort the group alphabetically on the real (unprefixed) group names.
3438
3439@item gnus-group-sort-by-level
3440@findex gnus-group-sort-by-level
3441Sort by group level.
3442
3443@item gnus-group-sort-by-score
3444@findex gnus-group-sort-by-score
3445Sort by group score. @xref{Group Score}.
3446
3447@item gnus-group-sort-by-rank
3448@findex gnus-group-sort-by-rank
3449Sort by group score and then the group level. The level and the score
3450are, when taken together, the group's @dfn{rank}. @xref{Group Score}.
3451
3452@item gnus-group-sort-by-unread
3453@findex gnus-group-sort-by-unread
3454Sort by number of unread articles.
3455
3456@item gnus-group-sort-by-method
3457@findex gnus-group-sort-by-method
3458Sort alphabetically on the select method.
3459
3460@item gnus-group-sort-by-server
3461@findex gnus-group-sort-by-server
3462Sort alphabetically on the Gnus server name.
3463
3464
3465@end table
3466
3467@code{gnus-group-sort-function} can also be a list of sorting
3468functions. In that case, the most significant sort key function must be
3469the last one.
3470
3471
3472There are also a number of commands for sorting directly according to
3473some sorting criteria:
3474
3475@table @kbd
3476@item G S a
3477@kindex G S a (Group)
3478@findex gnus-group-sort-groups-by-alphabet
3479Sort the group buffer alphabetically by group name
3480(@code{gnus-group-sort-groups-by-alphabet}).
3481
3482@item G S u
3483@kindex G S u (Group)
3484@findex gnus-group-sort-groups-by-unread
3485Sort the group buffer by the number of unread articles
3486(@code{gnus-group-sort-groups-by-unread}).
3487
3488@item G S l
3489@kindex G S l (Group)
3490@findex gnus-group-sort-groups-by-level
3491Sort the group buffer by group level
3492(@code{gnus-group-sort-groups-by-level}).
3493
3494@item G S v
3495@kindex G S v (Group)
3496@findex gnus-group-sort-groups-by-score
3497Sort the group buffer by group score
3498(@code{gnus-group-sort-groups-by-score}). @xref{Group Score}.
3499
3500@item G S r
3501@kindex G S r (Group)
3502@findex gnus-group-sort-groups-by-rank
3503Sort the group buffer by group rank
3504(@code{gnus-group-sort-groups-by-rank}). @xref{Group Score}.
3505
3506@item G S m
3507@kindex G S m (Group)
3508@findex gnus-group-sort-groups-by-method
3509Sort the group buffer alphabetically by back end name@*
3510(@code{gnus-group-sort-groups-by-method}).
3511
3512@item G S n
3513@kindex G S n (Group)
3514@findex gnus-group-sort-groups-by-real-name
3515Sort the group buffer alphabetically by real (unprefixed) group name
3516(@code{gnus-group-sort-groups-by-real-name}).
3517
3518@end table
3519
3520All the commands below obey the process/prefix convention
3521(@pxref{Process/Prefix}).
3522
3523When given a symbolic prefix (@pxref{Symbolic Prefixes}), all these
3524commands will sort in reverse order.
3525
3526You can also sort a subset of the groups:
3527
3528@table @kbd
3529@item G P a
3530@kindex G P a (Group)
3531@findex gnus-group-sort-selected-groups-by-alphabet
3532Sort the groups alphabetically by group name
3533(@code{gnus-group-sort-selected-groups-by-alphabet}).
3534
3535@item G P u
3536@kindex G P u (Group)
3537@findex gnus-group-sort-selected-groups-by-unread
3538Sort the groups by the number of unread articles
3539(@code{gnus-group-sort-selected-groups-by-unread}).
3540
3541@item G P l
3542@kindex G P l (Group)
3543@findex gnus-group-sort-selected-groups-by-level
3544Sort the groups by group level
3545(@code{gnus-group-sort-selected-groups-by-level}).
3546
3547@item G P v
3548@kindex G P v (Group)
3549@findex gnus-group-sort-selected-groups-by-score
3550Sort the groups by group score
3551(@code{gnus-group-sort-selected-groups-by-score}). @xref{Group Score}.
3552
3553@item G P r
3554@kindex G P r (Group)
3555@findex gnus-group-sort-selected-groups-by-rank
3556Sort the groups by group rank
3557(@code{gnus-group-sort-selected-groups-by-rank}). @xref{Group Score}.
3558
3559@item G P m
3560@kindex G P m (Group)
3561@findex gnus-group-sort-selected-groups-by-method
3562Sort the groups alphabetically by back end name@*
3563(@code{gnus-group-sort-selected-groups-by-method}).
3564
3565@item G P n
3566@kindex G P n (Group)
3567@findex gnus-group-sort-selected-groups-by-real-name
3568Sort the groups alphabetically by real (unprefixed) group name
3569(@code{gnus-group-sort-selected-groups-by-real-name}).
3570
3571@item G P s
3572@kindex G P s (Group)
3573@findex gnus-group-sort-selected-groups
3574Sort the groups according to @code{gnus-group-sort-function}.
3575
3576@end table
3577
3578And finally, note that you can use @kbd{C-k} and @kbd{C-y} to manually
3579move groups around.
3580
3581
3582@node Group Maintenance
3583@section Group Maintenance
3584@cindex bogus groups
3585
3586@table @kbd
3587@item b
3588@kindex b (Group)
3589@findex gnus-group-check-bogus-groups
3590Find bogus groups and delete them
3591(@code{gnus-group-check-bogus-groups}).
3592
3593@item F
3594@kindex F (Group)
3595@findex gnus-group-find-new-groups
3596Find new groups and process them (@code{gnus-group-find-new-groups}).
3597With 1 @kbd{C-u}, use the @code{ask-server} method to query the server
3598for new groups. With 2 @kbd{C-u}'s, use most complete method possible
3599to query the server for new groups, and subscribe the new groups as
3600zombies.
3601
3602@item C-c C-x
3603@kindex C-c C-x (Group)
3604@findex gnus-group-expire-articles
3605@cindex expiring mail
3606Run all expirable articles in the current group through the expiry
3607process (if any) (@code{gnus-group-expire-articles}). That is, delete
3608all expirable articles in the group that have been around for a while.
3609(@pxref{Expiring Mail}).
3610
3611@item C-c C-M-x
3612@kindex C-c C-M-x (Group)
3613@findex gnus-group-expire-all-groups
3614@cindex expiring mail
3615Run all expirable articles in all groups through the expiry process
3616(@code{gnus-group-expire-all-groups}).
3617
3618@end table
3619
3620
3621@node Browse Foreign Server
3622@section Browse Foreign Server
3623@cindex foreign servers
3624@cindex browsing servers
3625
3626@table @kbd
3627@item B
3628@kindex B (Group)
3629@findex gnus-group-browse-foreign-server
3630You will be queried for a select method and a server name. Gnus will
3631then attempt to contact this server and let you browse the groups there
3632(@code{gnus-group-browse-foreign-server}).
3633@end table
3634
3635@findex gnus-browse-mode
3636A new buffer with a list of available groups will appear. This buffer
3637will use the @code{gnus-browse-mode}. This buffer looks a bit (well,
3638a lot) like a normal group buffer.
3639
3640Here's a list of keystrokes available in the browse mode:
3641
3642@table @kbd
3643@item n
3644@kindex n (Browse)
3645@findex gnus-group-next-group
3646Go to the next group (@code{gnus-group-next-group}).
3647
3648@item p
3649@kindex p (Browse)
3650@findex gnus-group-prev-group
3651Go to the previous group (@code{gnus-group-prev-group}).
3652
3653@item SPACE
3654@kindex SPACE (Browse)
3655@findex gnus-browse-read-group
3656Enter the current group and display the first article
3657(@code{gnus-browse-read-group}).
3658
3659@item RET
3660@kindex RET (Browse)
3661@findex gnus-browse-select-group
3662Enter the current group (@code{gnus-browse-select-group}).
3663
3664@item u
3665@kindex u (Browse)
3666@findex gnus-browse-unsubscribe-current-group
3667Unsubscribe to the current group, or, as will be the case here,
3668subscribe to it (@code{gnus-browse-unsubscribe-current-group}).
3669
3670@item l
3671@itemx q
3672@kindex q (Browse)
3673@kindex l (Browse)
3674@findex gnus-browse-exit
3675Exit browse mode (@code{gnus-browse-exit}).
3676
3677@item d
3678@kindex d (Browse)
3679@findex gnus-browse-describe-group
3680Describe the current group (@code{gnus-browse-describe-group}).
3681
3682@item ?
3683@kindex ? (Browse)
3684@findex gnus-browse-describe-briefly
3685Describe browse mode briefly (well, there's not much to describe, is
3686there) (@code{gnus-browse-describe-briefly}).
3687@end table
3688
3689
3690@node Exiting Gnus
3691@section Exiting Gnus
3692@cindex exiting Gnus
3693
3694Yes, Gnus is ex(c)iting.
3695
3696@table @kbd
3697@item z
3698@kindex z (Group)
3699@findex gnus-group-suspend
3700Suspend Gnus (@code{gnus-group-suspend}). This doesn't really exit Gnus,
3701but it kills all buffers except the Group buffer. I'm not sure why this
3702is a gain, but then who am I to judge?
3703
3704@item q
3705@kindex q (Group)
3706@findex gnus-group-exit
3707@c @icon{gnus-group-exit}
3708Quit Gnus (@code{gnus-group-exit}).
3709
3710@item Q
3711@kindex Q (Group)
3712@findex gnus-group-quit
3713Quit Gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}).
3714The dribble file will be saved, though (@pxref{Auto Save}).
3715@end table
3716
3717@vindex gnus-exit-gnus-hook
3718@vindex gnus-suspend-gnus-hook
3719@vindex gnus-after-exiting-gnus-hook
3720@code{gnus-suspend-gnus-hook} is called when you suspend Gnus and
3721@code{gnus-exit-gnus-hook} is called when you quit Gnus, while
3722@code{gnus-after-exiting-gnus-hook} is called as the final item when
3723exiting Gnus.
3724
3725Note:
3726
3727@quotation
3728Miss Lisa Cannifax, while sitting in English class, felt her feet go
3729numbly heavy and herself fall into a hazy trance as the boy sitting
3730behind her drew repeated lines with his pencil across the back of her
3731plastic chair.
3732@end quotation
3733
3734
3735@node Group Topics
3736@section Group Topics
3737@cindex topics
3738
3739If you read lots and lots of groups, it might be convenient to group
3740them hierarchically according to topics. You put your Emacs groups over
3741here, your sex groups over there, and the rest (what, two groups or so?)
3742you put in some misc section that you never bother with anyway. You can
3743even group the Emacs sex groups as a sub-topic to either the Emacs
3744groups or the sex groups---or both! Go wild!
3745
3746@iftex
3747@iflatex
3748\gnusfigure{Group Topics}{400}{
3749\put(75,50){\epsfig{figure=ps/group-topic,height=9cm}}
3750}
3751@end iflatex
3752@end iftex
3753
3754Here's an example:
3755
3756@example
3757Gnus
3758 Emacs -- I wuw it!
3759 3: comp.emacs
3760 2: alt.religion.emacs
3761 Naughty Emacs
3762 452: alt.sex.emacs
3763 0: comp.talk.emacs.recovery
3764 Misc
3765 8: comp.binaries.fractals
3766 13: comp.sources.unix
3767@end example
3768
3769@findex gnus-topic-mode
3770@kindex t (Group)
3771To get this @emph{fab} functionality you simply turn on (ooh!) the
3772@code{gnus-topic} minor mode---type @kbd{t} in the group buffer. (This
3773is a toggling command.)
3774
3775Go ahead, just try it. I'll still be here when you get back. La de
3776dum@dots{} Nice tune, that@dots{} la la la@dots{} What, you're back?
3777Yes, and now press @kbd{l}. There. All your groups are now listed
3778under @samp{misc}. Doesn't that make you feel all warm and fuzzy?
3779Hot and bothered?
3780
3781If you want this permanently enabled, you should add that minor mode to
3782the hook for the group mode. Put the following line in your
3783@file{~/.gnus.el} file:
3784
3785@lisp
3786(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
3787@end lisp
3788
3789@menu
3790* Topic Commands:: Interactive E-Z commands.
3791* Topic Variables:: How to customize the topics the Lisp Way.
3792* Topic Sorting:: Sorting each topic individually.
3793* Topic Topology:: A map of the world.
3794* Topic Parameters:: Parameters that apply to all groups in a topic.
3795@end menu
3796
3797
3798@node Topic Commands
3799@subsection Topic Commands
3800@cindex topic commands
3801
3802When the topic minor mode is turned on, a new @kbd{T} submap will be
3803available. In addition, a few of the standard keys change their
3804definitions slightly.
3805
3806In general, the following kinds of operations are possible on topics.
3807First of all, you want to create topics. Secondly, you want to put
3808groups in topics and to move them around until you have an order you
3809like. The third kind of operation is to show/hide parts of the whole
3810shebang. You might want to hide a topic including its subtopics and
3811groups, to get a better overview of the other groups.
3812
3813Here is a list of the basic keys that you might need to set up topics
3814the way you like.
3815
3816@table @kbd
3817
3818@item T n
3819@kindex T n (Topic)
3820@findex gnus-topic-create-topic
3821Prompt for a new topic name and create it
3822(@code{gnus-topic-create-topic}).
3823
3824@item T TAB
3825@itemx TAB
3826@kindex T TAB (Topic)
3827@kindex TAB (Topic)
3828@findex gnus-topic-indent
3829``Indent'' the current topic so that it becomes a sub-topic of the
3830previous topic (@code{gnus-topic-indent}). If given a prefix,
3831``un-indent'' the topic instead.
3832
3833@item M-TAB
3834@kindex M-TAB (Topic)
3835@findex gnus-topic-unindent
3836``Un-indent'' the current topic so that it becomes a sub-topic of the
3837parent of its current parent (@code{gnus-topic-unindent}).
3838
3839@end table
3840
3841The following two keys can be used to move groups and topics around.
3842They work like the well-known cut and paste. @kbd{C-k} is like cut and
3843@kbd{C-y} is like paste. Of course, this being Emacs, we use the terms
3844kill and yank rather than cut and paste.
3845
3846@table @kbd
3847
3848@item C-k
3849@kindex C-k (Topic)
3850@findex gnus-topic-kill-group
3851Kill a group or topic (@code{gnus-topic-kill-group}). All groups in the
3852topic will be removed along with the topic.
3853
3854@item C-y
3855@kindex C-y (Topic)
3856@findex gnus-topic-yank-group
3857Yank the previously killed group or topic
3858(@code{gnus-topic-yank-group}). Note that all topics will be yanked
3859before all groups.
3860
3861So, to move a topic to the beginning of the list of topics, just hit
3862@kbd{C-k} on it. This is like the ``cut'' part of cut and paste. Then,
3863move the cursor to the beginning of the buffer (just below the ``Gnus''
3864topic) and hit @kbd{C-y}. This is like the ``paste'' part of cut and
3865paste. Like I said -- E-Z.
3866
3867You can use @kbd{C-k} and @kbd{C-y} on groups as well as on topics. So
3868you can move topics around as well as groups.
3869
3870@end table
3871
3872After setting up the topics the way you like them, you might wish to
3873hide a topic, or to show it again. That's why we have the following
3874key.
3875
3876@table @kbd
3877
3878@item RET
3879@kindex RET (Topic)
3880@findex gnus-topic-select-group
3881@itemx SPACE
3882Either select a group or fold a topic (@code{gnus-topic-select-group}).
3883When you perform this command on a group, you'll enter the group, as
3884usual. When done on a topic line, the topic will be folded (if it was
3885visible) or unfolded (if it was folded already). So it's basically a
3886toggling command on topics. In addition, if you give a numerical
3887prefix, group on that level (and lower) will be displayed.
3888
3889@end table
3890
3891Now for a list of other commands, in no particular order.
3892
3893@table @kbd
3894
3895@item T m
3896@kindex T m (Topic)
3897@findex gnus-topic-move-group
3898Move the current group to some other topic
3899(@code{gnus-topic-move-group}). This command uses the process/prefix
3900convention (@pxref{Process/Prefix}).
3901
3902@item T j
3903@kindex T j (Topic)
3904@findex gnus-topic-jump-to-topic
3905Go to a topic (@code{gnus-topic-jump-to-topic}).
3906
3907@item T c
3908@kindex T c (Topic)
3909@findex gnus-topic-copy-group
3910Copy the current group to some other topic
3911(@code{gnus-topic-copy-group}). This command uses the process/prefix
3912convention (@pxref{Process/Prefix}).
3913
3914@item T h
3915@kindex T h (Topic)
3916@findex gnus-topic-hide-topic
3917Hide the current topic (@code{gnus-topic-hide-topic}). If given
3918a prefix, hide the topic permanently.
3919
3920@item T s
3921@kindex T s (Topic)
3922@findex gnus-topic-show-topic
3923Show the current topic (@code{gnus-topic-show-topic}). If given
3924a prefix, show the topic permanently.
3925
3926@item T D
3927@kindex T D (Topic)
3928@findex gnus-topic-remove-group
3929Remove a group from the current topic (@code{gnus-topic-remove-group}).
3930This command is mainly useful if you have the same group in several
3931topics and wish to remove it from one of the topics. You may also
3932remove a group from all topics, but in that case, Gnus will add it to
3933the root topic the next time you start Gnus. In fact, all new groups
3934(which, naturally, don't belong to any topic) will show up in the root
3935topic.
3936
3937This command uses the process/prefix convention
3938(@pxref{Process/Prefix}).
3939
3940@item T M
3941@kindex T M (Topic)
3942@findex gnus-topic-move-matching
3943Move all groups that match some regular expression to a topic
3944(@code{gnus-topic-move-matching}).
3945
3946@item T C
3947@kindex T C (Topic)
3948@findex gnus-topic-copy-matching
3949Copy all groups that match some regular expression to a topic
3950(@code{gnus-topic-copy-matching}).
3951
3952@item T H
3953@kindex T H (Topic)
3954@findex gnus-topic-toggle-display-empty-topics
3955Toggle hiding empty topics
3956(@code{gnus-topic-toggle-display-empty-topics}).
3957
3958@item T #
3959@kindex T # (Topic)
3960@findex gnus-topic-mark-topic
3961Mark all groups in the current topic with the process mark
3962(@code{gnus-topic-mark-topic}). This command works recursively on
3963sub-topics unless given a prefix.
3964
3965@item T M-#
3966@kindex T M-# (Topic)
3967@findex gnus-topic-unmark-topic
3968Remove the process mark from all groups in the current topic
3969(@code{gnus-topic-unmark-topic}). This command works recursively on
3970sub-topics unless given a prefix.
3971
3972@item C-c C-x
3973@kindex C-c C-x (Topic)
3974@findex gnus-topic-expire-articles
3975@cindex expiring mail
3976Run all expirable articles in the current group or topic through the
3977expiry process (if any)
3978(@code{gnus-topic-expire-articles}). (@pxref{Expiring Mail}).
3979
3980@item T r
3981@kindex T r (Topic)
3982@findex gnus-topic-rename
3983Rename a topic (@code{gnus-topic-rename}).
3984
3985@item T DEL
3986@kindex T DEL (Topic)
3987@findex gnus-topic-delete
3988Delete an empty topic (@code{gnus-topic-delete}).
3989
3990@item A T
3991@kindex A T (Topic)
3992@findex gnus-topic-list-active
3993List all groups that Gnus knows about in a topics-ified way
3994(@code{gnus-topic-list-active}).
3995
3996@item T M-n
3997@kindex T M-n (Topic)
3998@findex gnus-topic-goto-next-topic
3999Go to the next topic (@code{gnus-topic-goto-next-topic}).
4000
4001@item T M-p
4002@kindex T M-p (Topic)
4003@findex gnus-topic-goto-previous-topic
01c52d31 4004Go to the previous topic (@code{gnus-topic-goto-previous-topic}).
4009494e
GM
4005
4006@item G p
4007@kindex G p (Topic)
4008@findex gnus-topic-edit-parameters
4009@cindex group parameters
4010@cindex topic parameters
4011@cindex parameters
4012Edit the topic parameters (@code{gnus-topic-edit-parameters}).
4013@xref{Topic Parameters}.
4014
4015@end table
4016
4017
4018@node Topic Variables
4019@subsection Topic Variables
4020@cindex topic variables
4021
4022The previous section told you how to tell Gnus which topics to display.
4023This section explains how to tell Gnus what to display about each topic.
4024
4025@vindex gnus-topic-line-format
4026The topic lines themselves are created according to the
4027@code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
4028Valid elements are:
4029
4030@table @samp
4031@item i
4032Indentation.
4033@item n
4034Topic name.
4035@item v
4036Visibility.
4037@item l
4038Level.
4039@item g
4040Number of groups in the topic.
4041@item a
4042Number of unread articles in the topic.
4043@item A
4044Number of unread articles in the topic and all its subtopics.
4045@end table
4046
4047@vindex gnus-topic-indent-level
4048Each sub-topic (and the groups in the sub-topics) will be indented with
4049@code{gnus-topic-indent-level} times the topic level number of spaces.
4050The default is 2.
4051
4052@vindex gnus-topic-mode-hook
4053@code{gnus-topic-mode-hook} is called in topic minor mode buffers.
4054
4055@vindex gnus-topic-display-empty-topics
4056The @code{gnus-topic-display-empty-topics} says whether to display even
4057topics that have no unread articles in them. The default is @code{t}.
4058
4059
4060@node Topic Sorting
4061@subsection Topic Sorting
4062@cindex topic sorting
4063
4064You can sort the groups in each topic individually with the following
4065commands:
4066
4067
4068@table @kbd
4069@item T S a
4070@kindex T S a (Topic)
4071@findex gnus-topic-sort-groups-by-alphabet
4072Sort the current topic alphabetically by group name
4073(@code{gnus-topic-sort-groups-by-alphabet}).
4074
4075@item T S u
4076@kindex T S u (Topic)
4077@findex gnus-topic-sort-groups-by-unread
4078Sort the current topic by the number of unread articles
4079(@code{gnus-topic-sort-groups-by-unread}).
4080
4081@item T S l
4082@kindex T S l (Topic)
4083@findex gnus-topic-sort-groups-by-level
4084Sort the current topic by group level
4085(@code{gnus-topic-sort-groups-by-level}).
4086
4087@item T S v
4088@kindex T S v (Topic)
4089@findex gnus-topic-sort-groups-by-score
4090Sort the current topic by group score
4091(@code{gnus-topic-sort-groups-by-score}). @xref{Group Score}.
4092
4093@item T S r
4094@kindex T S r (Topic)
4095@findex gnus-topic-sort-groups-by-rank
4096Sort the current topic by group rank
4097(@code{gnus-topic-sort-groups-by-rank}). @xref{Group Score}.
4098
4099@item T S m
4100@kindex T S m (Topic)
4101@findex gnus-topic-sort-groups-by-method
4102Sort the current topic alphabetically by back end name
4103(@code{gnus-topic-sort-groups-by-method}).
4104
4105@item T S e
4106@kindex T S e (Topic)
4107@findex gnus-topic-sort-groups-by-server
4108Sort the current topic alphabetically by server name
4109(@code{gnus-topic-sort-groups-by-server}).
4110
4111@item T S s
4112@kindex T S s (Topic)
4113@findex gnus-topic-sort-groups
4114Sort the current topic according to the function(s) given by the
4115@code{gnus-group-sort-function} variable
4116(@code{gnus-topic-sort-groups}).
4117
4118@end table
4119
4120When given a prefix argument, all these commands will sort in reverse
4121order. @xref{Sorting Groups}, for more information about group
4122sorting.
4123
4124
4125@node Topic Topology
4126@subsection Topic Topology
4127@cindex topic topology
4128@cindex topology
4129
4130So, let's have a look at an example group buffer:
4131
4132@example
4133@group
4134Gnus
4135 Emacs -- I wuw it!
4136 3: comp.emacs
4137 2: alt.religion.emacs
4138 Naughty Emacs
4139 452: alt.sex.emacs
4140 0: comp.talk.emacs.recovery
4141 Misc
4142 8: comp.binaries.fractals
4143 13: comp.sources.unix
4144@end group
4145@end example
4146
4147So, here we have one top-level topic (@samp{Gnus}), two topics under
4148that, and one sub-topic under one of the sub-topics. (There is always
4149just one (1) top-level topic). This topology can be expressed as
4150follows:
4151
4152@lisp
4153(("Gnus" visible)
4154 (("Emacs -- I wuw it!" visible)
4155 (("Naughty Emacs" visible)))
4156 (("Misc" visible)))
4157@end lisp
4158
4159@vindex gnus-topic-topology
4160This is in fact how the variable @code{gnus-topic-topology} would look
4161for the display above. That variable is saved in the @file{.newsrc.eld}
4162file, and shouldn't be messed with manually---unless you really want
4163to. Since this variable is read from the @file{.newsrc.eld} file,
4164setting it in any other startup files will have no effect.
4165
4166This topology shows what topics are sub-topics of what topics (right),
4167and which topics are visible. Two settings are currently
4168allowed---@code{visible} and @code{invisible}.
4169
4170
4171@node Topic Parameters
4172@subsection Topic Parameters
4173@cindex topic parameters
4174
4175All groups in a topic will inherit group parameters from the parent
4176(and ancestor) topic parameters. All valid group parameters are valid
4177topic parameters (@pxref{Group Parameters}). When the agent is
4178enabled, all agent parameters (See Agent Parameters in @ref{Category
4179Syntax}) are also valid topic parameters.
4180
4181In addition, the following parameters are only valid as topic
4182parameters:
4183
4184@table @code
4185@item subscribe
4186When subscribing new groups by topic (@pxref{Subscription Methods}), the
4187@code{subscribe} topic parameter says what groups go in what topic. Its
4188value should be a regexp to match the groups that should go in that
4189topic.
4190
4191@item subscribe-level
4192When subscribing new groups by topic (see the @code{subscribe} parameter),
4193the group will be subscribed with the level specified in the
4194@code{subscribe-level} instead of @code{gnus-level-default-subscribed}.
4195
4196@end table
4197
4198Group parameters (of course) override topic parameters, and topic
4199parameters in sub-topics override topic parameters in super-topics. You
4200know. Normal inheritance rules. (@dfn{Rules} is here a noun, not a
4201verb, although you may feel free to disagree with me here.)
4202
4203@example
4204@group
4205Gnus
4206 Emacs
4207 3: comp.emacs
4208 2: alt.religion.emacs
4209 452: alt.sex.emacs
4210 Relief
4211 452: alt.sex.emacs
4212 0: comp.talk.emacs.recovery
4213 Misc
4214 8: comp.binaries.fractals
4215 13: comp.sources.unix
4216 452: alt.sex.emacs
4217@end group
4218@end example
4219
4220The @samp{Emacs} topic has the topic parameter @code{(score-file
4221. "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter
4222@code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has the
4223topic parameter @code{(score-file . "emacs.SCORE")}. In addition,
4224@* @samp{alt.religion.emacs} has the group parameter @code{(score-file
4225. "religion.SCORE")}.
4226
4227Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you
4228will get the @file{relief.SCORE} home score file. If you enter the same
4229group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home
4230score file. If you enter the group @samp{alt.religion.emacs}, you'll
4231get the @file{religion.SCORE} home score file.
4232
4233This seems rather simple and self-evident, doesn't it? Well, yes. But
4234there are some problems, especially with the @code{total-expiry}
4235parameter. Say you have a mail group in two topics; one with
4236@code{total-expiry} and one without. What happens when you do @kbd{M-x
4237gnus-expire-all-expirable-groups}? Gnus has no way of telling which one
4238of these topics you mean to expire articles from, so anything may
4239happen. In fact, I hereby declare that it is @dfn{undefined} what
4240happens. You just have to be careful if you do stuff like that.
4241
4242
01c52d31
MB
4243@node Non-ASCII Group Names
4244@section Accessing groups of non-English names
4245@cindex non-ascii group names
4246
4247There are some news servers that provide groups of which the names are
4248expressed with their native languages in the world. For instance, in a
4249certain news server there are some newsgroups of which the names are
4250spelled in Chinese, where people are talking in Chinese. You can, of
4251course, subscribe to such news groups using Gnus. Currently Gnus
4252supports non-@acronym{ASCII} group names not only with the @code{nntp}
4253back end but also with the @code{nnml} back end and the @code{nnrss}
4254back end.
4255
4256Every such group name is encoded by a certain charset in the server
4257side (in an @acronym{NNTP} server its administrator determines the
4258charset, but for groups in the other back ends it is determined by you).
4259Gnus has to display the decoded ones for you in the group buffer and the
4260article buffer, and needs to use the encoded ones when communicating
4261with servers. However, Gnus doesn't know what charset is used for each
4262non-@acronym{ASCII} group name. The following two variables are just
4263the ones for telling Gnus what charset should be used for each group:
4264
4265@table @code
4266@item gnus-group-name-charset-method-alist
4267@vindex gnus-group-name-charset-method-alist
4268An alist of select methods and charsets. The default value is
4269@code{nil}. The names of groups in the server specified by that select
4270method are all supposed to use the corresponding charset. For example:
4271
4272@lisp
4273(setq gnus-group-name-charset-method-alist
4274 '(((nntp "news.com.cn") . cn-gb-2312)))
4275@end lisp
4276
4277Charsets specified for groups with this variable are preferred to the
4278ones specified for the same groups with the
4279@code{gnus-group-name-charset-group-alist} variable (see below).
4280
4281A select method can be very long, like:
4282
4283@lisp
4284(nntp "gmane"
4285 (nntp-address "news.gmane.org")
4286 (nntp-end-of-line "\n")
4287 (nntp-open-connection-function
4288 nntp-open-via-rlogin-and-telnet)
4289 (nntp-via-rlogin-command "ssh")
4290 (nntp-via-rlogin-command-switches
4291 ("-C" "-t" "-e" "none"))
4292 (nntp-via-address @dots{}))
4293@end lisp
4294
4295In that case, you can truncate it into @code{(nntp "gmane")} in this
4296variable. That is, it is enough to contain only the back end name and
4297the server name.
4298
4299@item gnus-group-name-charset-group-alist
4300@cindex UTF-8 group names
4301@vindex gnus-group-name-charset-group-alist
4302An alist of regexp of group name and the charset for group names.
4303@code{((".*" . utf-8))} is the default value if UTF-8 is supported,
4304otherwise the default is @code{nil}. For example:
4305
4306@lisp
4307(setq gnus-group-name-charset-group-alist
4308 '(("\\.com\\.cn:" . cn-gb-2312)
4309 (".*" . utf-8)))
4310@end lisp
4311
4312Note that this variable is ignored if the match is made with
4313@code{gnus-group-name-charset-method-alist}.
4314@end table
4315
4316Those two variables are used also to determine the charset for encoding
4317and decoding non-@acronym{ASCII} group names that are in the back ends
4318other than @code{nntp}. It means that it is you who determine it. If
4319you do nothing, the charset used for group names in those back ends will
4320all be @code{utf-8} because of the last element of
4321@code{gnus-group-name-charset-group-alist}.
4322
4323There is one more important variable for non-@acronym{ASCII} group
26b9f88d 4324names:
01c52d31
MB
4325
4326@table @code
4327@item nnmail-pathname-coding-system
26b9f88d
MB
4328@vindex nnmail-pathname-coding-system
4329The value of this variable should be a coding system or @code{nil}. The
4330default is @code{nil} in Emacs, or is the aliasee of the coding system
4331named @code{file-name} (a certain coding system of which an alias is
4332@code{file-name}) in XEmacs.
4333
4334The @code{nnml} back end, the @code{nnrss} back end, the @acronym{NNTP}
4335marks feature (@pxref{NNTP marks}), the agent, and the cache use
4336non-@acronym{ASCII} group names in those files and directories. This
4337variable overrides the value of @code{file-name-coding-system} which
4338specifies the coding system used when encoding and decoding those file
4339names and directory names.
01c52d31
MB
4340
4341In XEmacs (with the @code{mule} feature), @code{file-name-coding-system}
4342is the only means to specify the coding system used to encode and decode
26b9f88d 4343file names. On the other hand, Emacs uses the value of
01c52d31 4344@code{default-file-name-coding-system} if @code{file-name-coding-system}
26b9f88d
MB
4345is @code{nil} or it is bound to the value of
4346@code{nnmail-pathname-coding-system} which is @code{nil}.
4347
4348Normally the value of @code{default-file-name-coding-system} in Emacs or
4349@code{nnmail-pathname-coding-system} in XEmacs is initialized according
4350to the locale, so you will need to do nothing if the value is suitable
4351to encode and decode non-@acronym{ASCII} group names.
01c52d31
MB
4352
4353The value of this variable (or @code{default-file-name-coding-system})
4354does not necessarily need to be the same value that is determined by
4355@code{gnus-group-name-charset-method-alist} and
4356@code{gnus-group-name-charset-group-alist}.
4357
26b9f88d
MB
4358If @code{default-file-name-coding-system} or this variable is
4359initialized by default to @code{iso-latin-1} for example, although you
4360want to subscribe to the groups spelled in Chinese, that is the most
4361typical case where you have to customize
4362@code{nnmail-pathname-coding-system}. The @code{utf-8} coding system is
4363a good candidate for it. Otherwise, you may change the locale in your
4364system so that @code{default-file-name-coding-system} or this variable
4365may be initialized to an appropriate value.
01c52d31
MB
4366@end table
4367
4368Note that when you copy or move articles from a non-@acronym{ASCII}
4369group to another group, the charset used to encode and decode group
4370names should be the same in both groups. Otherwise the Newsgroups
4371header will be displayed incorrectly in the article buffer.
4372
4373
e6d2d263
MB
4374@node Searching
4375@section Searching
4376
4377@menu
4378* nnir:: Searching on IMAP, with swish, namazu, etc.
4379* nnmairix:: Searching maildir, MH or mbox with Mairix.
4380@end menu
4381
4382@cindex Searching
4383
4384FIXME: This node is a stub.
4385
4386FIXME: Add a brief overview of Gnus search capabilities. A brief
4387comparison of nnir, nnmairix, contrib/gnus-namazu would be nice
4388as well.
4389
4390FIXME: Explain difference to @ref{Searching for Articles}, add reference
4391and back-reference.
4392
4393@node nnir
4394@subsection nnir
4395
4396FIXME: As a first step, convert the commentary of @file{nnir} to texi.
4397@cindex nnir
4398
4399@node nnmairix
4400@subsection nnmairix
4401
867d4bb3 4402@cindex mairix
e6d2d263
MB
4403@cindex nnmairix
4404This paragraph describes how to set up mairix and the back end
4405@code{nnmairix} for indexing and searching your mail from within
4406Gnus. Additionally, you can create permanent ``smart'' groups which are
4407bound to mairix searches and are automatically updated.
4408
4409@menu
4410* About mairix:: About the mairix mail search engine
4411* nnmairix requirements:: What you will need for using nnmairix
4412* What nnmairix does:: What does nnmairix actually do?
4413* Setting up mairix:: Set up your mairix installation
4414* Configuring nnmairix:: Set up the nnmairix back end
4415* nnmairix keyboard shortcuts:: List of available keyboard shortcuts
4416* Propagating marks:: How to propagate marks from nnmairix groups
4417* nnmairix tips and tricks:: Some tips, tricks and examples
4418* nnmairix caveats:: Some more stuff you might want to know
4419@end menu
4420
2b968687
MB
4421@c FIXME: The markup in this section might need improvement.
4422@c E.g. adding @samp, @var, @file, @command, etc.
4423@c Cf. (info "(texinfo)Indicating")
e6d2d263
MB
4424
4425@node About mairix
4426@subsubsection About mairix
4427
4428Mairix is a tool for indexing and searching words in locally stored
4429mail. It was written by Richard Curnow and is licensed under the
4430GPL. Mairix comes with most popular GNU/Linux distributions, but it also
4431runs under Windows (with cygwin), Mac OS X and Solaris. The homepage can
4432be found at
4433@uref{http://www.rpcurnow.force9.co.uk/mairix/index.html}
4434
4435Though mairix might not be as flexible as other search tools like
4436swish++ or namazu, which you can use via the @code{nnir} back end, it
4437has the prime advantage of being incredibly fast. On current systems, it
4438can easily search through headers and message bodies of thousands and
4439thousands of mails in well under a second. Building the database
4440necessary for searching might take a minute or two, but only has to be
4441done once fully. Afterwards, the updates are done incrementally and
4442therefore are really fast, too. Additionally, mairix is very easy to set
4443up.
4444
4445For maximum speed though, mairix should be used with mails stored in
4446@code{Maildir} or @code{MH} format (this includes the @code{nnml} back
4447end), although it also works with mbox. Mairix presents the search
4448results by populating a @emph{virtual} maildir/MH folder with symlinks
4449which point to the ``real'' message files (if mbox is used, copies are
4450made). Since mairix already presents search results in such a virtual
4451mail folder, it is very well suited for using it as an external program
4452for creating @emph{smart} mail folders, which represent certain mail
4453searches. This is similar to a Kiboze group (@pxref{Kibozed Groups}),
4454but much faster.
4455
4456@node nnmairix requirements
4457@subsubsection nnmairix requirements
4458
2b968687 4459Mairix searches local mail---that means, mairix absolutely must have
e6d2d263
MB
4460direct access to your mail folders. If your mail resides on another
4461server (e.g. an @acronym{IMAP} server) and you happen to have shell
4462access, @code{nnmairix} supports running mairix remotely, e.g. via ssh.
4463
4464Additionally, @code{nnmairix} only supports the following Gnus back
2b968687
MB
4465ends: @code{nnml}, @code{nnmaildir}, and @code{nnimap}. You must use
4466one of these back ends for using @code{nnmairix}. Other back ends, like
4467@code{nnmbox}, @code{nnfolder} or @code{nnmh}, won't work.
e6d2d263
MB
4468
4469If you absolutely must use mbox and still want to use @code{nnmairix},
4470you can set up a local @acronym{IMAP} server, which you then access via
4471@code{nnimap}. This is a rather massive setup for accessing some mbox
030cca00
MB
4472files, so just change to MH or Maildir already... However, if you're
4473really, really passionate about using mbox, you might want to look into
4474the package @file{mairix.el}, which comes with Emacs 23.
e6d2d263
MB
4475
4476@node What nnmairix does
4477@subsubsection What nnmairix does
4478
4479The back end @code{nnmairix} enables you to call mairix from within Gnus,
4480either to query mairix with a search term or to update the
4481database. While visiting a message in the summary buffer, you can use
4482several pre-defined shortcuts for calling mairix, e.g. to quickly
4483search for all mails from the sender of the current message or to
4484display the whole thread associated with the message, even if the
4485mails are in different folders.
4486
4487Additionally, you can create permanent @code{nnmairix} groups which are bound
4488to certain mairix searches. This way, you can easily create a group
4489containing mails from a certain sender, with a certain subject line or
4490even for one specific thread based on the Message-ID. If you check for
4491new mail in these folders (e.g. by pressing @kbd{g} or @kbd{M-g}), they
867d4bb3 4492automatically update themselves by calling mairix.
e6d2d263
MB
4493
4494You might ask why you need @code{nnmairix} at all, since mairix already
4495creates the group, populates it with links to the mails so that you can
030cca00 4496then access it with Gnus, right? Well, this @emph{might} work, but often
2b968687 4497does not---at least not without problems. Most probably you will get
e6d2d263
MB
4498strange article counts, and sometimes you might see mails which Gnus
4499claims have already been canceled and are inaccessible. This is due to
4500the fact that Gnus isn't really amused when things are happening behind
4501its back. Another problem can be the mail back end itself, e.g. if you
4502use mairix with an @acronym{IMAP} server (I had Dovecot complaining
4503about corrupt index files when mairix changed the contents of the search
4504group). Using @code{nnmairix} should circumvent these problems.
4505
030cca00
MB
4506@code{nnmairix} is not really a mail back end---it's actually more like
4507a wrapper, sitting between a ``real'' mail back end where mairix stores
4508the searches and the Gnus front end. You can choose between three
4509different mail back ends for the mairix folders: @code{nnml},
4510@code{nnmaildir} or @code{nnimap}. @code{nnmairix} will call the mairix
4511binary so that the search results are stored in folders named
e6d2d263 4512@code{zz_mairix-<NAME>-<NUMBER>} on this mail back end, but it will
030cca00
MB
4513present these folders in the Gnus front end only with @code{<NAME>}.
4514You can use an existing mail back end where you already store your mail,
4515but if you're uncomfortable with @code{nnmairix} creating new mail
4516groups alongside your other mail, you can also create e.g. a new
4517@code{nnmaildir} or @code{nnml} server exclusively for mairix, but then
4518make sure those servers do not accidentally receive your new mail
4519(@pxref{nnmairix caveats}). A special case exists if you want to use
4520mairix remotely on an IMAP server with @code{nnimap}---here the mairix
4521folders and your other mail must be on the same @code{nnimap} back end.
e6d2d263
MB
4522
4523@node Setting up mairix
4524@subsubsection Setting up mairix
4525
4526First: create a backup of your mail folders (@pxref{nnmairix caveats}).
4527
4528Setting up mairix is easy: simply create a @file{.mairixrc} file with
4529(at least) the following entries:
4530
4531@example
4532# Your Maildir/MH base folder
4533base=~/Maildir
4534@end example
4535
2b968687
MB
4536This is the base folder for your mails. All the following directories
4537are relative to this base folder. If you want to use @code{nnmairix}
4538with @code{nnimap}, this base directory has to point to the mail
4539directory where the @acronym{IMAP} server stores the mail folders!
e6d2d263 4540
e6d2d263
MB
4541@example
4542maildir= ... your maildir folders which should be indexed ...
4543mh= ... your nnml/mh folders which should be indexed ...
4544mbox = ... your mbox files which should be indexed ...
4545@end example
4546
9e601b8d
MB
4547This specifies all your mail folders and mbox files (relative to the
4548base directory!) you want to index with mairix. Note that the
4549@code{nnml} back end saves mails in MH format, so you have to put those
4550directories in the @code{mh} line. See the example at the end of this
4551section and mairixrc's man-page for further details.
e6d2d263
MB
4552
4553@example
4554omit=zz_mairix-*
4555@end example
4556
4557@vindex nnmairix-group-prefix
4558This should make sure that you don't accidentally index the mairix
4559search results. You can change the prefix of these folders with the
4560variable @code{nnmairix-group-prefix}.
4561
e6d2d263
MB
4562@example
4563mformat= ... 'maildir' or 'mh' ...
4564database= ... location of database file ...
4565@end example
4566
4567The @code{format} setting specifies the output format for the mairix
4568search folder. Set this to @code{mh} if you want to access search results
4569with @code{nnml}. Otherwise choose @code{maildir}.
4570
2b968687
MB
4571To summarize, here is my shortened @file{.mairixrc} file as an example:
4572
4573@example
4574base=~/Maildir
4575maildir=.personal:.work:.logcheck:.sent
4576mh=../Mail/nnml/*...
4577mbox=../mboxmail/mailarchive_year*
4578mformat=maildir
4579omit=zz_mairix-*
4580database=~/.mairixdatabase
4581@end example
4582
4583In this case, the base directory is @file{~/Maildir}, where all my Maildir
4584folders are stored. As you can see, the folders are separated by
4585colons. If you wonder why every folder begins with a dot: this is
4586because I use Dovecot as @acronym{IMAP} server, which again uses
4587@code{Maildir++} folders. For testing nnmairix, I also have some
4588@code{nnml} mail, which is saved in @file{~/Mail/nnml}. Since this has
4589to be specified relative to the @code{base} directory, the @code{../Mail}
4590notation is needed. Note that the line ends in @code{*...}, which means
4591to recursively scan all files under this directory. Without the three
4592dots, the wildcard @code{*} will not work recursively. I also have some
4593old mbox files with archived mail lying around in @file{~/mboxmail}.
4594The other lines should be obvious.
4595
4596See the man page for @code{mairixrc} for details and further options,
4597especially regarding wildcard usage, which may be a little different
4598than you are used to.
4599
4600Now simply call @code{mairix} to create the index for the first time.
4601Note that this may take a few minutes, but every following index will do
4602the updates incrementally and hence is very fast.
e6d2d263
MB
4603
4604@node Configuring nnmairix
4605@subsubsection Configuring nnmairix
4606
4607In group mode, type @kbd{G b c}
4608(@code{nnmairix-create-server-and-default-group}). This will ask you for all
4609necessary information and create a @code{nnmairix} server as a foreign
4610server. You will have to specify the following:
4611
4612@itemize @bullet
4613
4614@item
2b968687 4615The @strong{name} of the @code{nnmairix} server---choose whatever you
e6d2d263
MB
4616want.
4617
4618@item
9e601b8d
MB
4619The name of the @strong{back end server} where mairix should store its
4620searches. This must be a full server name, like @code{nnml:mymail}.
4621Just hit @kbd{TAB} to see the available servers. Currently, servers
4622which are accessed through @code{nnmaildir}, @code{nnimap} and
4623@code{nnml} are supported. As explained above, for locally stored
4624mails, this can be an existing server where you store your mails.
030cca00
MB
4625However, you can also create e.g. a new @code{nnmaildir} or @code{nnml}
4626server exclusively for @code{nnmairix} in your secondary select methods
4627(@pxref{Finding the News}). If you use a secondary @code{nnml} server
4628just for mairix, make sure that you explicitly set the server variable
4629@code{nnml-get-new-mail} to @code{nil}, or you might loose mail
4630(@pxref{nnmairix caveats}). If you want to use mairix remotely on an
9e601b8d
MB
4631@acronym{IMAP} server, you have to choose the corresponding
4632@code{nnimap} server here.
e6d2d263
MB
4633
4634@item
4635@vindex nnmairix-mairix-search-options
4636The @strong{command} to call the mairix binary. This will usually just
4637be @code{mairix}, but you can also choose something like @code{ssh
4638SERVER mairix} if you want to call mairix remotely, e.g. on your
4639@acronym{IMAP} server. If you want to add some default options to
4640mairix, you could do this here, but better use the variable
4641@code{nnmairix-mairix-search-options} instead.
4642
4643@item
4644The name of the @strong{default search group}. This will be the group
4645where all temporary mairix searches are stored, i.e. all searches which
4646are not bound to permanent @code{nnmairix} groups. Choose whatever you
4647like.
4648
4649@item
4650If the mail back end is @code{nnimap} or @code{nnmaildir}, you will be
4651asked if you work with @strong{Maildir++}, i.e. with hidden maildir
4652folders (=beginning with a dot). For example, you have to answer
4653@samp{yes} here if you work with the Dovecot @acronym{IMAP}
4654server. Otherwise, you should answer @samp{no} here.
4655
4656@end itemize
4657
4658@node nnmairix keyboard shortcuts
4659@subsubsection nnmairix keyboard shortcuts
4660
4661In group mode:
4662
4663@table @kbd
4664
4665@item G b c
4666@kindex G b c (Group)
4667@findex nnmairix-create-server-and-default-group
4668Creates @code{nnmairix} server and default search group for this server
4669(@code{nnmairix-create-server-and-default-group}). You should have done
4670this by now (@pxref{Configuring nnmairix}).
4671
4672@item G b s
4673@kindex G b s (Group)
4674@findex nnmairix-search
4675Prompts for query which is then sent to the mairix binary. Search
4676results are put into the default search group which is automatically
4677displayed (@code{nnmairix-search}).
4678
4679@item G b m
4680@kindex G b m (Group)
4681@findex nnmairix-widget-search
4682Allows you to create a mairix search or a permanent group more
4683comfortably using graphical widgets, similar to a customization
4684group. Just try it to see how it works (@code{nnmairix-widget-search}).
4685
4686@item G b i
4687@kindex G b i (Group)
4688@findex nnmairix-search-interactive
4689Another command for creating a mairix query more comfortably, but uses
4690only the minibuffer (@code{nnmairix-search-interactive}).
4691
4692@item G b g
4693@kindex G b g (Group)
4694@findex nnmairix-create-search-group
4695Creates a permanent group which is associated with a search query
4696(@code{nnmairix-create-search-group}). The @code{nnmairix} back end
4697automatically calls mairix when you update this group with @kbd{g} or
4698@kbd{M-g}.
4699
4700@item G b q
4701@kindex G b q (Group)
4702@findex nnmairix-group-change-query-this-group
4703Changes the search query for the @code{nnmairix} group under cursor
4704(@code{nnmairix-group-change-query-this-group}).
4705
4706@item G b t
4707@kindex G b t (Group)
4708@findex nnmairix-group-toggle-threads-this-group
4709Toggles the 'threads' parameter for the @code{nnmairix} group under cursor,
4710i.e. if you want see the whole threads of the found messages
4711(@code{nnmairix-group-toggle-threads-this-group}).
4712
4713@item G b u
4714@kindex G b u (Group)
4715@findex nnmairix-update-database
4716@vindex nnmairix-mairix-update-options
4717Calls mairix binary for updating the database
4718(@code{nnmairix-update-database}). The default parameters are @code{-F}
4719and @code{-Q} for making this as fast as possible (see variable
4720@code{nnmairix-mairix-update-options} for defining these default
4721options).
4722
4723@item G b r
4724@kindex G b r (Group)
4725@findex nnmairix-group-toggle-readmarks-this-group
4726Keep articles in this @code{nnmairix} group always read or unread, or leave the
4727marks unchanged (@code{nnmairix-group-toggle-readmarks-this-group}).
4728
4729@item G b d
4730@kindex G b d (Group)
4731@findex nnmairix-group-delete-recreate-this-group
4732Recreate @code{nnmairix} group on the ``real'' mail back end
4733(@code{nnmairix-group-delete-recreate-this-group}). You can do this if
4734you always get wrong article counts with a @code{nnmairix} group.
4735
4736@item G b a
4737@kindex G b a (Group)
4738@findex nnmairix-group-toggle-allowfast-this-group
4739Toggles the @code{allow-fast} parameters for group under cursor
4740(@code{nnmairix-group-toggle-allowfast-this-group}). The default
4741behavior of @code{nnmairix} is to do a mairix search every time you
4742update or enter the group. With the @code{allow-fast} parameter set,
4743mairix will only be called when you explicitly update the group, but not
4744upon entering. This makes entering the group faster, but it may also
4745lead to dangling symlinks if something changed between updating and
4746entering the group which is not yet in the mairix database.
4747
4748@item G b p
4749@kindex G b p (Group)
4750@findex nnmairix-group-toggle-propmarks-this-group
4751Toggle marks propagation for this group
4752(@code{nnmairix-group-toggle-propmarks-this-group}). (@pxref{Propagating
4753marks}).
4754
4755@item G b o
4756@kindex G b o (Group)
4757@findex nnmairix-propagate-marks
4758Manually propagate marks (@code{nnmairix-propagate-marks}); needed only when
4759@code{nnmairix-propagate-marks-upon-close} is set to @code{nil}.
4760
4761@end table
4762
4763In summary mode:
4764
4765@table @kbd
4766
4767@item $ m
4768@kindex $ m (Summary)
4769@findex nnmairix-widget-search-from-this-article
4770Allows you to create a mairix query or group based on the current
4771message using graphical widgets (same as @code{nnmairix-widget-search})
4772(@code{nnmairix-widget-search-from-this-article}).
4773
4774@item $ g
4775@kindex $ g (Summary)
4776@findex nnmairix-create-search-group-from-message
4777Interactively creates a new search group with query based on the current
4778message, but uses the minibuffer instead of graphical widgets
4779(@code{nnmairix-create-search-group-from-message}).
4780
4781@item $ t
4782@kindex $ t (Summary)
4783@findex nnmairix-search-thread-this-article
4784Searches thread for the current article
4785(@code{nnmairix-search-thread-this-article}). This is effectively a
4786shortcut for calling @code{nnmairix-search} with @samp{m:msgid} of the
4787current article and enabled threads.
4788
4789@item $ f
4790@kindex $ f (Summary)
4791@findex nnmairix-search-from-this-article
4792Searches all messages from sender of the current article
4793(@code{nnmairix-search-from-this-article}). This is a shortcut for
4794calling @code{nnmairix-search} with @samp{f:From}.
4795
4796@item $ o
4797@kindex $ o (Summary)
4798@findex nnmairix-goto-original-article
4799(Only in @code{nnmairix} groups!) Tries determine the group this article
4800originally came from and displays the article in this group, so that
4801e.g. replying to this article the correct posting styles/group
4802parameters are applied (@code{nnmairix-goto-original-article}). This
4803function will use the registry if available, but can also parse the
2b968687 4804article file name as a fallback method.
e6d2d263
MB
4805
4806@item $ u
4807@kindex $ u (Summary)
4808@findex nnmairix-remove-tick-mark-original-article
4809Remove possibly existing tick mark from original article
4810(@code{nnmairix-remove-tick-mark-original-article}). (@pxref{nnmairix
4811tips and tricks}).
4812
4813@end table
4814
4815@node Propagating marks
4816@subsubsection Propagating marks
4817
4818First of: you really need a patched mairix binary for using the marks
4819propagation feature efficiently. Otherwise, you would have to update
4820the mairix database all the time. You can get the patch at
4821
030cca00 4822@uref{http://www.randomsample.de/mairix-maildir-patch.tar}
e6d2d263
MB
4823
4824You need the mairix v0.21 source code for this patch; everything else
4825is explained in the accompanied readme file. If you don't want to use
4826marks propagation, you don't have to apply these patches, but they also
4827fix some annoyances regarding changing maildir flags, so it might still
4828be useful to you.
4829
4830With the patched mairix binary, you can use @code{nnmairix} as an
4831alternative to mail splitting (@pxref{Fancy Mail Splitting}). For
4832example, instead of splitting all mails from @samp{david@@foobar.com}
4833into a group, you can simply create a search group with the query
4834@samp{f:david@@foobar.com}. This is actually what ``smart folders'' are
4835all about: simply put everything in one mail folder and dynamically
4836create searches instead of splitting. This is more flexible, since you
4837can dynamically change your folders any time you want to. This also
4838implies that you will usually read your mails in the @code{nnmairix}
4839groups instead of your ``real'' mail groups.
4840
4841There is one problem, though: say you got a new mail from
2b968687 4842@samp{david@@foobar.com}; it will now show up in two groups, the
e6d2d263
MB
4843``real'' group (your INBOX, for example) and in the @code{nnmairix}
4844search group (provided you have updated the mairix database). Now you
4845enter the @code{nnmairix} group and read the mail. The mail will be
2b968687 4846marked as read, but only in the @code{nnmairix} group---in the ``real''
e6d2d263
MB
4847mail group it will be still shown as unread.
4848
4849You could now catch up the mail group (@pxref{Group Data}), but this is
4850tedious and error prone, since you may overlook mails you don't have
4851created @code{nnmairix} groups for. Of course, you could first use
4852@code{nnmairix-goto-original-article} (@pxref{nnmairix keyboard
4853shortcuts}) and then read the mail in the original group, but that's
4854even more cumbersome.
4855
4856Clearly, the easiest way would be if marks could somehow be
4857automatically set for the original article. This is exactly what
4858@emph{marks propagation} is about.
4859
4860Marks propagation is deactivated by default. You can activate it for a
4861certain @code{nnmairix} group with
4862@code{nnmairix-group-toggle-propmarks-this-group} (bound to @kbd{G b
4863p}). This function will warn you if you try to use it with your default
4864search group; the reason is that the default search group is used for
4865temporary searches, and it's easy to accidentally propagate marks from
4866this group. However, you can ignore this warning if you really want to.
4867
4868With marks propagation enabled, all the marks you set in a @code{nnmairix}
4869group should now be propagated to the original article. For example,
4870you can now tick an article (by default with @kbd{!}) and this mark should
4871magically be set for the original article, too.
4872
4873A few more remarks which you may or may not want to know:
4874
4875@vindex nnmairix-propagate-marks-upon-close
4876Marks will not be set immediately, but only upon closing a group. This
4877not only makes marks propagation faster, it also avoids problems with
4878dangling symlinks when dealing with maildir files (since changing flags
4879will change the file name). You can also control when to propagate marks
4880via @code{nnmairix-propagate-marks-upon-close} (see the doc-string for
4881details).
4882
4883Obviously, @code{nnmairix} will have to look up the original group for every
4884article you want to set marks for. If available, @code{nnmairix} will first use
4885the registry for determining the original group. The registry is very
4886fast, hence you should really, really enable the registry when using
4887marks propagation. If you don't have to worry about RAM and disc space,
4888set @code{gnus-registry-max-entries} to a large enough value; to be on
4889the safe side, choose roughly the amount of mails you index with mairix.
4890
4891@vindex nnmairix-only-use-registry
4892If you don't want to use the registry or the registry hasn't seen the
2b968687
MB
4893original article yet, @code{nnmairix} will use an additional mairix
4894search for determining the file name of the article. This, of course, is
4895way slower than the registry---if you set hundreds or even thousands of
4896marks this way, it might take some time. You can avoid this situation by
4897setting @code{nnmairix-only-use-registry} to t.
e6d2d263
MB
4898
4899Maybe you also want to propagate marks the other way round, i.e. if you
4900tick an article in a "real" mail group, you'd like to have the same
4901article in a @code{nnmairix} group ticked, too. For several good
4902reasons, this can only be done efficiently if you use maildir. To
4903immediately contradict myself, let me mention that it WON'T work with
4904@code{nnmaildir}, since @code{nnmaildir} stores the marks externally and
4905not in the file name. Therefore, propagating marks to @code{nnmairix}
4906groups will usually only work if you use an IMAP server which uses
4907maildir as its file format.
4908
4909@vindex nnmairix-propagate-marks-to-nnmairix-groups
4910If you work with this setup, just set
4911@code{nnmairix-propagate-marks-to-nnmairix-groups} to @code{t} and see what
4912happens. If you don't like what you see, just set it to @code{nil} again. One
4913problem might be that you get a wrong number of unread articles; this
4914usually happens when you delete or expire articles in the original
4915groups. When this happens, you can recreate the @code{nnmairix} group on the
4916back end using @kbd{G b d}.
4917
4918@node nnmairix tips and tricks
4919@subsubsection nnmairix tips and tricks
4920
4921@itemize
4922@item
4923Checking Mail
4924
4925@findex nnmairix-update-groups
4926I put all my important mail groups at group level 1. The mairix groups
4927have group level 5, so they do not get checked at start up (@pxref{Group
4928Levels}).
4929
4930I use the following to check for mails:
4931
4932@lisp
4933(defun my-check-mail-mairix-update (level)
4934 (interactive "P")
4935 ;; if no prefix given, set level=1
4936 (gnus-group-get-new-news (or level 1))
4937 (nnmairix-update-groups "mairixsearch" t t)
4938 (gnus-group-list-groups))
4939
4940(define-key gnus-group-mode-map "g" 'my-check-mail-mairix-update)
4941@end lisp
4942
4943Instead of @samp{"mairixsearch"} use the name of your @code{nnmairix}
4944server. See the doc string for @code{nnmairix-update-groups} for
4945details.
4946
4947@item
4948Example: search group for ticked articles
4949
4950For example, you can create a group for all ticked articles, where the
4951articles always stay unread:
4952
4953Hit @kbd{G b g}, enter group name (e.g. @samp{important}), use
4954@samp{F:f} as query and do not include threads.
4955
4956Now activate marks propagation for this group by using @kbd{G b p}. Then
4957activate the always-unread feature by using @kbd{G b r} twice.
4958
2b968687 4959So far so good---but how do you remove the tick marks in the @code{nnmairix}
e6d2d263
MB
4960group? There are two options: You may simply use
4961@code{nnmairix-remove-tick-mark-original-article} (bound to @kbd{$ u}) to remove
4962tick marks from the original article. The other possibility is to set
4963@code{nnmairix-propagate-marks-to-nnmairix-groups} to @code{t}, but see the above
4964comments about this option. If it works for you, the tick marks should
4965also exist in the @code{nnmairix} group and you can remove them as usual,
4966e.g. by marking an article as read.
4967
4968When you have removed a tick mark from the original article, this
4969article should vanish from the @code{nnmairix} group after you have updated the
4970mairix database and updated the group. Fortunately, there is a function
4971for doing exactly that: @code{nnmairix-update-groups}. See the previous code
4972snippet and the doc string for details.
4973
4974@item
4975Dealing with auto-subscription of mail groups
4976
4977As described before, all @code{nnmairix} groups are in fact stored on
4978the mail back end in the form @samp{zz_mairix-<NAME>-<NUMBER>}. You can
4979see them when you enter the back end server in the server buffer. You
4980should not subscribe these groups! Unfortunately, these groups will
2b968687 4981usually get @emph{auto-subscribed} when you use @code{nnmaildir} or
e6d2d263
MB
4982@code{nnml}, i.e. you will suddenly see groups of the form
4983@samp{zz_mairix*} pop up in your group buffer. If this happens to you,
4984simply kill these groups with C-k. For avoiding this, turn off
4985auto-subscription completely by setting the variable
4986@code{gnus-auto-subscribed-groups} to @code{nil} (@pxref{Filtering New
4987Groups}), or if you like to keep this feature use the following kludge
4988for turning it off for all groups beginning with @samp{zz_}:
4989
4990@lisp
4991(setq gnus-auto-subscribed-groups
4992 "^\\(nnml\\|nnfolder\\|nnmbox\\|nnmh\\|nnbabyl\\|nnmaildir\\).*:\\([^z]\\|z$\\|\\z[^z]\\|zz$\\|zz[^_]\\|zz_$\\).*")
4993@end lisp
4994
4995@end itemize
4996
4997@node nnmairix caveats
4998@subsubsection nnmairix caveats
4999
5000@itemize
5001@item
030cca00
MB
5002You can create a secondary @code{nnml} server just for nnmairix, but then
5003you have to explicitly set the corresponding server variable
5004@code{nnml-get-new-mail} to @code{nil}. Otherwise, new mail might get
5005put into this secondary server (and would never show up again). Here's
5006an example server definition:
5007
5008@lisp
5009(nnml "mairix" (nnml-directory "mairix") (nnml-get-new-mail nil))
5010@end lisp
5011
5012(The @code{nnmaildir} back end also has a server variabe
5013@code{get-new-mail}, but its default value is @code{nil}, so you don't
5014have to explicitly set it if you use a @code{nnmaildir} server just for
5015mairix.)
e6d2d263
MB
5016
5017@item
5018If you use the Gnus registry: don't use the registry with
5019@code{nnmairix} groups (put them in
2b968687
MB
5020@code{gnus-registry-unfollowed-groups}). Be @emph{extra careful} if
5021you use @code{gnus-registry-split-fancy-with-parent}; mails which are
e6d2d263
MB
5022split into @code{nnmairix} groups are usually gone for good as soon as
5023you check the group for new mail (yes, it has happened to me...).
5024
5025@item
2b968687 5026Therefore: @emph{Never ever} put ``real'' mails into @code{nnmairix}
e6d2d263
MB
5027groups (you shouldn't be able to, anyway).
5028
030cca00
MB
5029@item
5030If you use the Gnus agent (@pxref{Gnus Unplugged}): don't agentize
5031@code{nnmairix} groups (though I have no idea what happens if you do).
5032
e6d2d263
MB
5033@item
5034mairix does only support us-ascii characters.
5035
5036@item
5037@code{nnmairix} uses a rather brute force method to force Gnus to
5038completely reread the group on the mail back end after mairix was
2b968687 5039called---it simply deletes and re-creates the group on the mail
e6d2d263
MB
5040back end. So far, this has worked for me without any problems, and I
5041don't see how @code{nnmairix} could delete other mail groups than its
5042own, but anyway: you really should have a backup of your mail
5043folders.
5044
5045@item
5046All necessary information is stored in the group parameters
5047(@pxref{Group Parameters}). This has the advantage that no active file
5048is needed, but also implies that when you kill a @code{nnmairix} group,
5049it is gone for good.
5050
5051@item
5052@findex nnmairix-purge-old-groups
5053If you create and kill a lot of @code{nnmairix} groups, the
5054``zz_mairix-*'' groups will accumulate on the mail back end server. To
5055delete old groups which are no longer needed, call
5056@code{nnmairix-purge-old-groups}. Note that this assumes that you don't
5057save any ``real'' mail in folders of the form
5058@code{zz_mairix-<NAME>-<NUMBER>}. You can change the prefix of
5059@code{nnmairix} groups by changing the variable
5060@code{nnmairix-group-prefix}.
5061
5062@item
2b968687 5063The following only applies if you @emph{don't} use the mentioned patch
e6d2d263
MB
5064for mairix (@pxref{Propagating marks}):
5065
5066A problem can occur when using @code{nnmairix} with maildir folders and
5067comes with the fact that maildir stores mail flags like @samp{Seen} or
5068@samp{Replied} by appending chars @samp{S} and @samp{R} to the message
5069file name, respectively. This implies that currently you would have to
5070update the mairix database not only when new mail arrives, but also when
5071mail flags are changing. The same applies to new mails which are indexed
5072while they are still in the @samp{new} folder but then get moved to
5073@samp{cur} when Gnus has seen the mail. If you don't update the database
5074after this has happened, a mairix query can lead to symlinks pointing to
5075non-existing files. In Gnus, these messages will usually appear with
5076``(none)'' entries in the header and can't be accessed. If this happens
5077to you, using @kbd{G b u} and updating the group will usually fix this.
5078
5079@end itemize
5080
4009494e
GM
5081@node Misc Group Stuff
5082@section Misc Group Stuff
5083
5084@menu
5085* Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
5086* Group Information:: Information and help on groups and Gnus.
5087* Group Timestamp:: Making Gnus keep track of when you last read a group.
5088* File Commands:: Reading and writing the Gnus files.
5089* Sieve Commands:: Managing Sieve scripts.
5090@end menu
5091
5092@table @kbd
5093
5094@item v
5095@kindex v (Group)
5096@cindex keys, reserved for users (Group)
5097The key @kbd{v} is reserved for users. You can bind it to some
5098command or better use it as a prefix key. For example:
5099
5100@lisp
5101(define-key gnus-group-mode-map (kbd "v j d")
5102 (lambda ()
5103 (interactive)
5104 (gnus-group-jump-to-group "nndraft:drafts")))
5105@end lisp
5106
5107On keys reserved for users in Emacs and on keybindings in general
5108@xref{Keymaps, Keymaps, , emacs, The Emacs Editor}.
5109
5110@item ^
5111@kindex ^ (Group)
5112@findex gnus-group-enter-server-mode
5113Enter the server buffer (@code{gnus-group-enter-server-mode}).
5114@xref{Server Buffer}.
5115
5116@item a
5117@kindex a (Group)
5118@findex gnus-group-post-news
5119Start composing a message (a news by default)
5120(@code{gnus-group-post-news}). If given a prefix, post to the group
5121under the point. If the prefix is 1, prompt for a group to post to.
5122Contrary to what the name of this function suggests, the prepared
5123article might be a mail instead of a news, if a mail group is specified
5124with the prefix argument. @xref{Composing Messages}.
5125
5126@item m
5127@kindex m (Group)
5128@findex gnus-group-mail
5129Mail a message somewhere (@code{gnus-group-mail}). If given a prefix,
5130use the posting style of the group under the point. If the prefix is 1,
5131prompt for a group name to find the posting style.
5132@xref{Composing Messages}.
5133
5134@item i
5135@kindex i (Group)
5136@findex gnus-group-news
5137Start composing a news (@code{gnus-group-news}). If given a prefix,
5138post to the group under the point. If the prefix is 1, prompt
5139for group to post to. @xref{Composing Messages}.
5140
5141This function actually prepares a news even when using mail groups.
5142This is useful for ``posting'' messages to mail groups without actually
5143sending them over the network: they're just saved directly to the group
5144in question. The corresponding back end must have a request-post method
5145for this to work though.
5146
01c52d31
MB
5147@item G z
5148@kindex G z (Group)
5149@findex gnus-group-compact-group
5150
5151Compact the group under point (@code{gnus-group-compact-group}).
5152Currently implemented only in nnml (@pxref{Mail Spool}). This removes
5153gaps between article numbers, hence getting a correct total article
5154count.
5155
4009494e
GM
5156@end table
5157
5158Variables for the group buffer:
5159
5160@table @code
5161
5162@item gnus-group-mode-hook
5163@vindex gnus-group-mode-hook
5164is called after the group buffer has been
5165created.
5166
5167@item gnus-group-prepare-hook
5168@vindex gnus-group-prepare-hook
5169is called after the group buffer is
5170generated. It may be used to modify the buffer in some strange,
5171unnatural way.
5172
5173@item gnus-group-prepared-hook
5174@vindex gnus-group-prepare-hook
5175is called as the very last thing after the group buffer has been
5176generated. It may be used to move point around, for instance.
5177
5178@item gnus-permanently-visible-groups
5179@vindex gnus-permanently-visible-groups
5180Groups matching this regexp will always be listed in the group buffer,
5181whether they are empty or not.
5182
4009494e
GM
5183@end table
5184
5185@node Scanning New Messages
5186@subsection Scanning New Messages
5187@cindex new messages
5188@cindex scanning new news
5189
5190@table @kbd
5191
5192@item g
5193@kindex g (Group)
5194@findex gnus-group-get-new-news
5195@c @icon{gnus-group-get-new-news}
5196Check the server(s) for new articles. If the numerical prefix is used,
5197this command will check only groups of level @var{arg} and lower
5198(@code{gnus-group-get-new-news}). If given a non-numerical prefix, this
5199command will force a total re-reading of the active file(s) from the
5200back end(s).
5201
5202@item M-g
5203@kindex M-g (Group)
5204@findex gnus-group-get-new-news-this-group
5205@vindex gnus-goto-next-group-when-activating
5206@c @icon{gnus-group-get-new-news-this-group}
5207Check whether new articles have arrived in the current group
5208(@code{gnus-group-get-new-news-this-group}).
5209@code{gnus-goto-next-group-when-activating} says whether this command is
5210to move point to the next group or not. It is @code{t} by default.
5211
5212@findex gnus-activate-all-groups
5213@cindex activating groups
5214@item C-c M-g
5215@kindex C-c M-g (Group)
5216Activate absolutely all groups (@code{gnus-activate-all-groups}).
5217
5218@item R
5219@kindex R (Group)
5220@cindex restarting
5221@findex gnus-group-restart
5222Restart Gnus (@code{gnus-group-restart}). This saves the @file{.newsrc}
5223file(s), closes the connection to all servers, clears up all run-time
5224Gnus variables, and then starts Gnus all over again.
5225
5226@end table
5227
5228@vindex gnus-get-new-news-hook
5229@code{gnus-get-new-news-hook} is run just before checking for new news.
5230
5231@vindex gnus-after-getting-new-news-hook
5232@code{gnus-after-getting-new-news-hook} is run after checking for new
5233news.
5234
5235
5236@node Group Information
5237@subsection Group Information
5238@cindex group information
5239@cindex information on groups
5240
5241@table @kbd
5242
5243
5244@item H f
5245@kindex H f (Group)
5246@findex gnus-group-fetch-faq
5247@vindex gnus-group-faq-directory
5248@cindex FAQ
5249@cindex ange-ftp
5250Try to fetch the @acronym{FAQ} for the current group
5251(@code{gnus-group-fetch-faq}). Gnus will try to get the @acronym{FAQ}
5252from @code{gnus-group-faq-directory}, which is usually a directory on
5253a remote machine. This variable can also be a list of directories.
5254In that case, giving a prefix to this command will allow you to choose
5255between the various sites. @code{ange-ftp} (or @code{efs}) will be
5256used for fetching the file.
5257
5258If fetching from the first site is unsuccessful, Gnus will attempt to go
5259through @code{gnus-group-faq-directory} and try to open them one by one.
5260
5261@item H c
5262@kindex H c (Group)
5263@findex gnus-group-fetch-charter
5264@vindex gnus-group-charter-alist
5265@cindex charter
5266Try to open the charter for the current group in a web browser
5267(@code{gnus-group-fetch-charter}). Query for a group if given a
5268prefix argument.
5269
5270Gnus will use @code{gnus-group-charter-alist} to find the location of
5271the charter. If no location is known, Gnus will fetch the control
5272messages for the group, which in some cases includes the charter.
5273
5274@item H C
5275@kindex H C (Group)
5276@findex gnus-group-fetch-control
5277@vindex gnus-group-fetch-control-use-browse-url
5278@cindex control message
5279Fetch the control messages for the group from the archive at
5280@code{ftp.isc.org} (@code{gnus-group-fetch-control}). Query for a
5281group if given a prefix argument.
5282
5283If @code{gnus-group-fetch-control-use-browse-url} is non-@code{nil},
5284Gnus will open the control messages in a browser using
5285@code{browse-url}. Otherwise they are fetched using @code{ange-ftp}
5286and displayed in an ephemeral group.
5287
5288Note that the control messages are compressed. To use this command
5289you need to turn on @code{auto-compression-mode} (@pxref{Compressed
5290Files, ,Compressed Files, emacs, The Emacs Manual}).
5291
5292@item H d
5293@itemx C-c C-d
5294@c @icon{gnus-group-describe-group}
5295@kindex H d (Group)
5296@kindex C-c C-d (Group)
5297@cindex describing groups
5298@cindex group description
5299@findex gnus-group-describe-group
5300Describe the current group (@code{gnus-group-describe-group}). If given
5301a prefix, force Gnus to re-read the description from the server.
5302
5303@item M-d
5304@kindex M-d (Group)
5305@findex gnus-group-describe-all-groups
5306Describe all groups (@code{gnus-group-describe-all-groups}). If given a
5307prefix, force Gnus to re-read the description file from the server.
5308
5309@item H v
5310@itemx V
5311@kindex V (Group)
5312@kindex H v (Group)
5313@cindex version
5314@findex gnus-version
5315Display current Gnus version numbers (@code{gnus-version}).
5316
5317@item ?
5318@kindex ? (Group)
5319@findex gnus-group-describe-briefly
5320Give a very short help message (@code{gnus-group-describe-briefly}).
5321
5322@item C-c C-i
5323@kindex C-c C-i (Group)
5324@cindex info
5325@cindex manual
5326@findex gnus-info-find-node
5327Go to the Gnus info node (@code{gnus-info-find-node}).
5328@end table
5329
5330
5331@node Group Timestamp
5332@subsection Group Timestamp
5333@cindex timestamps
5334@cindex group timestamps
5335
5336It can be convenient to let Gnus keep track of when you last read a
5337group. To set the ball rolling, you should add
5338@code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}:
5339
5340@lisp
5341(add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
5342@end lisp
5343
5344After doing this, each time you enter a group, it'll be recorded.
5345
5346This information can be displayed in various ways---the easiest is to
5347use the @samp{%d} spec in the group line format:
5348
5349@lisp
5350(setq gnus-group-line-format
5351 "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n")
5352@end lisp
5353
5354This will result in lines looking like:
5355
5356@example
5357* 0: mail.ding 19961002T012943
5358 0: custom 19961002T012713
5359@end example
5360
5361As you can see, the date is displayed in compact ISO 8601 format. This
5362may be a bit too much, so to just display the date, you could say
5363something like:
5364
5365@lisp
5366(setq gnus-group-line-format
5367 "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n")
5368@end lisp
5369
5370If you would like greater control of the time format, you can use a
5371user-defined format spec. Something like the following should do the
5372trick:
5373
5374@lisp
5375(setq gnus-group-line-format
5376 "%M\%S\%p\%P\%5y: %(%-40,40g%) %ud\n")
5377(defun gnus-user-format-function-d (headers)
5378 (let ((time (gnus-group-timestamp gnus-tmp-group)))
5379 (if time
5380 (format-time-string "%b %d %H:%M" time)
5381 "")))
5382@end lisp
5383
5384
5385@node File Commands
5386@subsection File Commands
5387@cindex file commands
5388
5389@table @kbd
5390
5391@item r
5392@kindex r (Group)
5393@findex gnus-group-read-init-file
5394@vindex gnus-init-file
5395@cindex reading init file
5396Re-read the init file (@code{gnus-init-file}, which defaults to
5397@file{~/.gnus.el}) (@code{gnus-group-read-init-file}).
5398
5399@item s
5400@kindex s (Group)
5401@findex gnus-group-save-newsrc
5402@cindex saving .newsrc
5403Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted)
5404(@code{gnus-group-save-newsrc}). If given a prefix, force saving the
5405file(s) whether Gnus thinks it is necessary or not.
5406
5407@c @item Z
5408@c @kindex Z (Group)
5409@c @findex gnus-group-clear-dribble
5410@c Clear the dribble buffer (@code{gnus-group-clear-dribble}).
5411
5412@end table
5413
5414
5415@node Sieve Commands
5416@subsection Sieve Commands
5417@cindex group sieve commands
5418
5419Sieve is a server-side mail filtering language. In Gnus you can use
5420the @code{sieve} group parameter (@pxref{Group Parameters}) to specify
5421sieve rules that should apply to each group. Gnus provides two
5422commands to translate all these group parameters into a proper Sieve
5423script that can be transfered to the server somehow.
5424
5425@vindex gnus-sieve-file
5426@vindex gnus-sieve-region-start
5427@vindex gnus-sieve-region-end
5428The generated Sieve script is placed in @code{gnus-sieve-file} (by
5429default @file{~/.sieve}). The Sieve code that Gnus generate is placed
5430between two delimiters, @code{gnus-sieve-region-start} and
5431@code{gnus-sieve-region-end}, so you may write additional Sieve code
5432outside these delimiters that will not be removed the next time you
5433regenerate the Sieve script.
5434
5435@vindex gnus-sieve-crosspost
5436The variable @code{gnus-sieve-crosspost} controls how the Sieve script
5437is generated. If it is non-@code{nil} (the default) articles is
5438placed in all groups that have matching rules, otherwise the article
5439is only placed in the group with the first matching rule. For
5440example, the group parameter @samp{(sieve address "sender"
5441"owner-ding@@hpc.uh.edu")} will generate the following piece of Sieve
5442code if @code{gnus-sieve-crosspost} is @code{nil}. (When
5443@code{gnus-sieve-crosspost} is non-@code{nil}, it looks the same
5444except that the line containing the call to @code{stop} is removed.)
5445
5446@example
5447if address "sender" "owner-ding@@hpc.uh.edu" @{
5448 fileinto "INBOX.ding";
5449 stop;
5450@}
5451@end example
5452
5453@xref{Top, Emacs Sieve, Top, sieve, Emacs Sieve}.
5454
5455@table @kbd
5456
5457@item D g
5458@kindex D g (Group)
5459@findex gnus-sieve-generate
5460@vindex gnus-sieve-file
5461@cindex generating sieve script
5462Regenerate a Sieve script from the @code{sieve} group parameters and
5463put you into the @code{gnus-sieve-file} without saving it.
5464
5465@item D u
5466@kindex D u (Group)
5467@findex gnus-sieve-update
5468@vindex gnus-sieve-file
5469@cindex updating sieve script
5470Regenerates the Gnus managed part of @code{gnus-sieve-file} using the
5471@code{sieve} group parameters, save the file and upload it to the
5472server using the @code{sieveshell} program.
5473
5474@end table
5475
5476
5477@node Summary Buffer
5478@chapter Summary Buffer
5479@cindex summary buffer
5480
5481A line for each article is displayed in the summary buffer. You can
5482move around, read articles, post articles and reply to articles.
5483
5484The most common way to a summary buffer is to select a group from the
5485group buffer (@pxref{Selecting a Group}).
5486
5487You can have as many summary buffers open as you wish.
5488
5489You can customize the Summary Mode tool bar, see @kbd{M-x
5490customize-apropos RET gnus-summary-tool-bar}. This feature is only
5491available in Emacs.
5492
5493@kindex v (Summary)
5494@cindex keys, reserved for users (Summary)
5495The key @kbd{v} is reserved for users. You can bind it to some
5496command or better use it as a prefix key. For example:
5497@lisp
5498(define-key gnus-summary-mode-map (kbd "v -") "LrS") ;; lower subthread
5499@end lisp
5500
5501@menu
5502* Summary Buffer Format:: Deciding how the summary buffer is to look.
5503* Summary Maneuvering:: Moving around the summary buffer.
5504* Choosing Articles:: Reading articles.
5505* Paging the Article:: Scrolling the current article.
5506* Reply Followup and Post:: Posting articles.
5507* Delayed Articles:: Send articles at a later time.
5508* Marking Articles:: Marking articles as read, expirable, etc.
5509* Limiting:: You can limit the summary buffer.
5510* Threading:: How threads are made.
5511* Sorting the Summary Buffer:: How articles and threads are sorted.
5512* Asynchronous Fetching:: Gnus might be able to pre-fetch articles.
5513* Article Caching:: You may store articles in a cache.
5514* Persistent Articles:: Making articles expiry-resistant.
01c52d31 5515* Sticky Articles:: Article buffers that are not reused.
4009494e
GM
5516* Article Backlog:: Having already read articles hang around.
5517* Saving Articles:: Ways of customizing article saving.
5518* Decoding Articles:: Gnus can treat series of (uu)encoded articles.
5519* Article Treatment:: The article buffer can be mangled at will.
5520* MIME Commands:: Doing MIMEy things with the articles.
5521* Charsets:: Character set issues.
5522* Article Commands:: Doing various things with the article buffer.
5523* Summary Sorting:: Sorting the summary buffer in various ways.
5524* Finding the Parent:: No child support? Get the parent.
5525* Alternative Approaches:: Reading using non-default summaries.
5526* Tree Display:: A more visual display of threads.
5527* Mail Group Commands:: Some commands can only be used in mail groups.
5528* Various Summary Stuff:: What didn't fit anywhere else.
5529* Exiting the Summary Buffer:: Returning to the Group buffer,
5530 or reselecting the current group.
5531* Crosspost Handling:: How crossposted articles are dealt with.
5532* Duplicate Suppression:: An alternative when crosspost handling fails.
5533* Security:: Decrypt and Verify.
5534* Mailing List:: Mailing list minor mode.
5535@end menu
5536
5537
5538@node Summary Buffer Format
5539@section Summary Buffer Format
5540@cindex summary buffer format
5541
5542@iftex
5543@iflatex
5544\gnusfigure{The Summary Buffer}{180}{
5545\put(0,0){\epsfig{figure=ps/summary,width=7.5cm}}
5546\put(445,0){\makebox(0,0)[br]{\epsfig{figure=ps/summary-article,width=7.5cm}}}
5547}
5548@end iflatex
5549@end iftex
5550
5551@menu
5552* Summary Buffer Lines:: You can specify how summary lines should look.
5553* To From Newsgroups:: How to not display your own name.
5554* Summary Buffer Mode Line:: You can say how the mode line should look.
5555* Summary Highlighting:: Making the summary buffer all pretty and nice.
5556@end menu
5557
5558@findex mail-extract-address-components
5559@findex gnus-extract-address-components
5560@vindex gnus-extract-address-components
5561Gnus will use the value of the @code{gnus-extract-address-components}
5562variable as a function for getting the name and address parts of a
5563@code{From} header. Two pre-defined functions exist:
5564@code{gnus-extract-address-components}, which is the default, quite
5565fast, and too simplistic solution; and
5566@code{mail-extract-address-components}, which works very nicely, but is
5567slower. The default function will return the wrong answer in 5% of the
5568cases. If this is unacceptable to you, use the other function instead:
5569
5570@lisp
5571(setq gnus-extract-address-components
5572 'mail-extract-address-components)
5573@end lisp
5574
5575@vindex gnus-summary-same-subject
5576@code{gnus-summary-same-subject} is a string indicating that the current
5577article has the same subject as the previous. This string will be used
5578with those specs that require it. The default is @code{""}.
5579
5580
5581@node Summary Buffer Lines
5582@subsection Summary Buffer Lines
5583
5584@vindex gnus-summary-line-format
5585You can change the format of the lines in the summary buffer by changing
5586the @code{gnus-summary-line-format} variable. It works along the same
5587lines as a normal @code{format} string, with some extensions
5588(@pxref{Formatting Variables}).
5589
5590There should always be a colon or a point position marker on the line;
5591the cursor always moves to the point position marker or the colon after
5592performing an operation. (Of course, Gnus wouldn't be Gnus if it wasn't
5593possible to change this. Just write a new function
5594@code{gnus-goto-colon} which does whatever you like with the cursor.)
5595@xref{Positioning Point}.
5596
5597The default string is @samp{%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n}.
5598
5599The following format specification characters and extended format
5600specification(s) are understood:
5601
5602@table @samp
5603@item N
5604Article number.
5605@item S
5606Subject string. List identifiers stripped,
5607@code{gnus-list-identifiers}. @xref{Article Hiding}.
5608@item s
5609Subject if the article is the root of the thread or the previous article
5610had a different subject, @code{gnus-summary-same-subject} otherwise.
5611(@code{gnus-summary-same-subject} defaults to @code{""}.)
5612@item F
5613Full @code{From} header.
5614@item n
5615The name (from the @code{From} header).
5616@item f
5617The name, @code{To} header or the @code{Newsgroups} header (@pxref{To
5618From Newsgroups}).
5619@item a
5620The name (from the @code{From} header). This differs from the @code{n}
5621spec in that it uses the function designated by the
5622@code{gnus-extract-address-components} variable, which is slower, but
5623may be more thorough.
5624@item A
5625The address (from the @code{From} header). This works the same way as
5626the @code{a} spec.
5627@item L
5628Number of lines in the article.
5629@item c
5630Number of characters in the article. This specifier is not supported
5631in some methods (like nnfolder).
5632@item k
5633Pretty-printed version of the number of characters in the article;
5634for example, @samp{1.2k} or @samp{0.4M}.
5635@item I
5636Indentation based on thread level (@pxref{Customizing Threading}).
5637@item B
5638A complex trn-style thread tree, showing response-connecting trace
5639lines. A thread could be drawn like this:
5640
5641@example
5642>
5643+->
5644| +->
5645| | \->
5646| | \->
5647| \->
5648+->
5649\->
5650@end example
5651
5652You can customize the appearance with the following options. Note
5653that it is possible to make the thread display look really neat by
5654replacing the default @acronym{ASCII} characters with graphic
5655line-drawing glyphs.
5656@table @code
5657@item gnus-sum-thread-tree-root
5658@vindex gnus-sum-thread-tree-root
5659Used for the root of a thread. If @code{nil}, use subject
5660instead. The default is @samp{> }.
5661
5662@item gnus-sum-thread-tree-false-root
5663@vindex gnus-sum-thread-tree-false-root
5664Used for the false root of a thread (@pxref{Loose Threads}). If
5665@code{nil}, use subject instead. The default is @samp{> }.
5666
5667@item gnus-sum-thread-tree-single-indent
5668@vindex gnus-sum-thread-tree-single-indent
5669Used for a thread with just one message. If @code{nil}, use subject
5670instead. The default is @samp{}.
5671
5672@item gnus-sum-thread-tree-vertical
5673@vindex gnus-sum-thread-tree-vertical
5674Used for drawing a vertical line. The default is @samp{| }.
5675
5676@item gnus-sum-thread-tree-indent
5677@vindex gnus-sum-thread-tree-indent
5678Used for indenting. The default is @samp{ }.
5679
5680@item gnus-sum-thread-tree-leaf-with-other
5681@vindex gnus-sum-thread-tree-leaf-with-other
5682Used for a leaf with brothers. The default is @samp{+-> }.
5683
5684@item gnus-sum-thread-tree-single-leaf
5685@vindex gnus-sum-thread-tree-single-leaf
5686Used for a leaf without brothers. The default is @samp{\-> }
5687
5688@end table
5689
5690@item T
5691Nothing if the article is a root and lots of spaces if it isn't (it
5692pushes everything after it off the screen).
5693@item [
5694Opening bracket, which is normally @samp{[}, but can also be @samp{<}
5695for adopted articles (@pxref{Customizing Threading}).
5696@item ]
5697Closing bracket, which is normally @samp{]}, but can also be @samp{>}
5698for adopted articles.
5699@item >
5700One space for each thread level.
5701@item <
5702Twenty minus thread level spaces.
5703@item U
5704Unread. @xref{Read Articles}.
5705
5706@item R
5707This misleadingly named specifier is the @dfn{secondary mark}. This
5708mark will say whether the article has been replied to, has been cached,
5709or has been saved. @xref{Other Marks}.
5710
5711@item i
5712Score as a number (@pxref{Scoring}).
5713@item z
5714@vindex gnus-summary-zcore-fuzz
5715Zcore, @samp{+} if above the default level and @samp{-} if below the
5716default level. If the difference between
5717@code{gnus-summary-default-score} and the score is less than
5718@code{gnus-summary-zcore-fuzz}, this spec will not be used.
5719@item V
5720Total thread score.
5721@item x
5722@code{Xref}.
5723@item D
5724@code{Date}.
5725@item d
5726The @code{Date} in @code{DD-MMM} format.
5727@item o
5728The @code{Date} in @var{YYYYMMDD}@code{T}@var{HHMMSS} format.
5729@item M
5730@code{Message-ID}.
5731@item r
5732@code{References}.
5733@item t
5734Number of articles in the current sub-thread. Using this spec will slow
5735down summary buffer generation somewhat.
5736@item e
5737An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the
5738article has any children.
5739@item P
5740The line number.
5741@item O
5742Download mark.
5743@item *
5744Desired cursor position (instead of after first colon).
5745@item &user-date;
5746Age sensitive date format. Various date format is defined in
5747@code{gnus-user-date-format-alist}.
5748@item u
5749User defined specifier. The next character in the format string should
5750be a letter. Gnus will call the function
5751@code{gnus-user-format-function-@var{x}}, where @var{x} is the letter
5752following @samp{%u}. The function will be passed the current header as
5753argument. The function should return a string, which will be inserted
5754into the summary just like information from any other summary specifier.
5755@end table
5756
5757Text between @samp{%(} and @samp{%)} will be highlighted with
5758@code{gnus-mouse-face} when the mouse point is placed inside the area.
5759There can only be one such area.
5760
5761The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs
5762have to be handled with care. For reasons of efficiency, Gnus will
5763compute what column these characters will end up in, and ``hard-code''
5764that. This means that it is invalid to have these specs after a
5765variable-length spec. Well, you might not be arrested, but your summary
5766buffer will look strange, which is bad enough.
5767
5768The smart choice is to have these specs as far to the left as possible.
5769(Isn't that the case with everything, though? But I digress.)
5770
5771This restriction may disappear in later versions of Gnus.
5772
5773
5774@node To From Newsgroups
5775@subsection To From Newsgroups
5776@cindex To
5777@cindex Newsgroups
5778
5779In some groups (particularly in archive groups), the @code{From} header
5780isn't very interesting, since all the articles there are written by
5781you. To display the information in the @code{To} or @code{Newsgroups}
5782headers instead, you need to decide three things: What information to
5783gather; where to display it; and when to display it.
5784
5785@enumerate
5786@item
5787@vindex gnus-extra-headers
5788The reading of extra header information is controlled by the
5789@code{gnus-extra-headers}. This is a list of header symbols. For
5790instance:
5791
5792@lisp
5793(setq gnus-extra-headers
5794 '(To Newsgroups X-Newsreader))
5795@end lisp
5796
5797This will result in Gnus trying to obtain these three headers, and
5798storing it in header structures for later easy retrieval.
5799
5800@item
5801@findex gnus-extra-header
5802The value of these extra headers can be accessed via the
5803@code{gnus-extra-header} function. Here's a format line spec that will
5804access the @code{X-Newsreader} header:
5805
5806@example
5807"%~(form (gnus-extra-header 'X-Newsreader))@@"
5808@end example
5809
5810@item
5811@vindex gnus-ignored-from-addresses
5812The @code{gnus-ignored-from-addresses} variable says when the @samp{%f}
5813summary line spec returns the @code{To}, @code{Newsreader} or
5814@code{From} header. If this regexp matches the contents of the
5815@code{From} header, the value of the @code{To} or @code{Newsreader}
5816headers are used instead.
5817
01c52d31
MB
5818To distinguish regular articles from those where the @code{From} field
5819has been swapped, a string is prefixed to the @code{To} or
5820@code{Newsgroups} header in the summary line. By default the string is
5821@samp{-> } for @code{To} and @samp{=> } for @code{Newsgroups}, you can
5822customize these strings with @code{gnus-summary-to-prefix} and
5823@code{gnus-summary-newsgroup-prefix}.
5824
4009494e
GM
5825@end enumerate
5826
5827@vindex nnmail-extra-headers
5828A related variable is @code{nnmail-extra-headers}, which controls when
5829to include extra headers when generating overview (@acronym{NOV}) files.
5830If you have old overview files, you should regenerate them after
5831changing this variable, by entering the server buffer using @kbd{^},
5832and then @kbd{g} on the appropriate mail server (e.g. nnml) to cause
5833regeneration.
5834
5835@vindex gnus-summary-line-format
5836You also have to instruct Gnus to display the data by changing the
5837@code{%n} spec to the @code{%f} spec in the
5838@code{gnus-summary-line-format} variable.
5839
5840In summary, you'd typically put something like the following in
5841@file{~/.gnus.el}:
5842
5843@lisp
5844(setq gnus-extra-headers
5845 '(To Newsgroups))
5846(setq nnmail-extra-headers gnus-extra-headers)
5847(setq gnus-summary-line-format
5848 "%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n")
5849(setq gnus-ignored-from-addresses
5850 "Your Name Here")
5851@end lisp
5852
5853(The values listed above are the default values in Gnus. Alter them
5854to fit your needs.)
5855
5856A note for news server administrators, or for users who wish to try to
5857convince their news server administrator to provide some additional
5858support:
5859
5860The above is mostly useful for mail groups, where you have control over
5861the @acronym{NOV} files that are created. However, if you can persuade your
5862nntp admin to add (in the usual implementation, notably INN):
5863
5864@example
5865Newsgroups:full
5866@end example
5867
5868to the end of her @file{overview.fmt} file, then you can use that just
5869as you would the extra headers from the mail groups.
5870
5871
5872@node Summary Buffer Mode Line
5873@subsection Summary Buffer Mode Line
5874
5875@vindex gnus-summary-mode-line-format
5876You can also change the format of the summary mode bar (@pxref{Mode Line
5877Formatting}). Set @code{gnus-summary-mode-line-format} to whatever you
5878like. The default is @samp{Gnus: %%b [%A] %Z}.
5879
5880Here are the elements you can play with:
5881
5882@table @samp
5883@item G
5884Group name.
5885@item p
5886Unprefixed group name.
5887@item A
5888Current article number.
5889@item z
5890Current article score.
5891@item V
5892Gnus version.
5893@item U
5894Number of unread articles in this group.
5895@item e
5896Number of unread articles in this group that aren't displayed in the
5897summary buffer.
5898@item Z
5899A string with the number of unread and unselected articles represented
5900either as @samp{<%U(+%e) more>} if there are both unread and unselected
5901articles, and just as @samp{<%U more>} if there are just unread articles
5902and no unselected ones.
5903@item g
5904Shortish group name. For instance, @samp{rec.arts.anime} will be
5905shortened to @samp{r.a.anime}.
5906@item S
5907Subject of the current article.
5908@item u
5909User-defined spec (@pxref{User-Defined Specs}).
5910@item s
5911Name of the current score file (@pxref{Scoring}).
5912@item d
5913Number of dormant articles (@pxref{Unread Articles}).
5914@item t
5915Number of ticked articles (@pxref{Unread Articles}).
5916@item r
5917Number of articles that have been marked as read in this session.
5918@item E
5919Number of articles expunged by the score files.
5920@end table
5921
5922
5923@node Summary Highlighting
5924@subsection Summary Highlighting
5925
5926@table @code
5927
5928@item gnus-visual-mark-article-hook
5929@vindex gnus-visual-mark-article-hook
5930This hook is run after selecting an article. It is meant to be used for
5931highlighting the article in some way. It is not run if
5932@code{gnus-visual} is @code{nil}.
5933
5934@item gnus-summary-update-hook
5935@vindex gnus-summary-update-hook
5936This hook is called when a summary line is changed. It is not run if
5937@code{gnus-visual} is @code{nil}.
5938
5939@item gnus-summary-selected-face
5940@vindex gnus-summary-selected-face
5941This is the face (or @dfn{font} as some people call it) used to
5942highlight the current article in the summary buffer.
5943
5944@item gnus-summary-highlight
5945@vindex gnus-summary-highlight
5946Summary lines are highlighted according to this variable, which is a
5947list where the elements are of the format @code{(@var{form}
5948. @var{face})}. If you would, for instance, like ticked articles to be
5949italic and high-scored articles to be bold, you could set this variable
5950to something like
5951@lisp
5952(((eq mark gnus-ticked-mark) . italic)
5953 ((> score default) . bold))
5954@end lisp
5955As you may have guessed, if @var{form} returns a non-@code{nil} value,
5956@var{face} will be applied to the line.
5957@end table
5958
5959
5960@node Summary Maneuvering
5961@section Summary Maneuvering
5962@cindex summary movement
5963
5964All the straight movement commands understand the numeric prefix and
5965behave pretty much as you'd expect.
5966
5967None of these commands select articles.
5968
5969@table @kbd
5970@item G M-n
5971@itemx M-n
5972@kindex M-n (Summary)
5973@kindex G M-n (Summary)
5974@findex gnus-summary-next-unread-subject
5975Go to the next summary line of an unread article
5976(@code{gnus-summary-next-unread-subject}).
5977
5978@item G M-p
5979@itemx M-p
5980@kindex M-p (Summary)
5981@kindex G M-p (Summary)
5982@findex gnus-summary-prev-unread-subject
5983Go to the previous summary line of an unread article
5984(@code{gnus-summary-prev-unread-subject}).
5985
5986@item G g
5987@kindex G g (Summary)
5988@findex gnus-summary-goto-subject
5989Ask for an article number and then go to the summary line of that article
5990without displaying the article (@code{gnus-summary-goto-subject}).
5991@end table
5992
5993If Gnus asks you to press a key to confirm going to the next group, you
5994can use the @kbd{C-n} and @kbd{C-p} keys to move around the group
5995buffer, searching for the next group to read without actually returning
5996to the group buffer.
5997
5998Variables related to summary movement:
5999
6000@table @code
6001
6002@vindex gnus-auto-select-next
6003@item gnus-auto-select-next
6004If you issue one of the movement commands (like @kbd{n}) and there are
6005no more unread articles after the current one, Gnus will offer to go to
6006the next group. If this variable is @code{t} and the next group is
6007empty, Gnus will exit summary mode and return to the group buffer. If
6008this variable is neither @code{t} nor @code{nil}, Gnus will select the
6009next group with unread articles. As a special case, if this variable
6010is @code{quietly}, Gnus will select the next group without asking for
6011confirmation. If this variable is @code{almost-quietly}, the same
6012will happen only if you are located on the last article in the group.
6013Finally, if this variable is @code{slightly-quietly}, the @kbd{Z n}
6014command will go to the next group without confirmation. Also
6015@pxref{Group Levels}.
6016
6017@item gnus-auto-select-same
6018@vindex gnus-auto-select-same
6019If non-@code{nil}, all the movement commands will try to go to the next
6020article with the same subject as the current. (@dfn{Same} here might
6021mean @dfn{roughly equal}. See @code{gnus-summary-gather-subject-limit}
6022for details (@pxref{Customizing Threading}).) If there are no more
6023articles with the same subject, go to the first unread article.
6024
6025This variable is not particularly useful if you use a threaded display.
6026
6027@item gnus-summary-check-current
6028@vindex gnus-summary-check-current
6029If non-@code{nil}, all the ``unread'' movement commands will not proceed
6030to the next (or previous) article if the current article is unread.
6031Instead, they will choose the current article.
6032
6033@item gnus-auto-center-summary
6034@vindex gnus-auto-center-summary
6035If non-@code{nil}, Gnus will keep the point in the summary buffer
6036centered at all times. This makes things quite tidy, but if you have a
6037slow network connection, or simply do not like this un-Emacsism, you can
6038set this variable to @code{nil} to get the normal Emacs scrolling
6039action. This will also inhibit horizontal re-centering of the summary
6040buffer, which might make it more inconvenient to read extremely long
6041threads.
6042
6043This variable can also be a number. In that case, center the window at
6044the given number of lines from the top.
6045
85115796
KY
6046@item gnus-summary-stop-at-end-of-message
6047@vindex gnus-summary-stop-at-end-of-message
6048If non-@code{nil}, don't go to the next article when hitting
6049@kbd{SPC}, and you're at the end of the article.
6050
4009494e
GM
6051@end table
6052
6053
6054@node Choosing Articles
6055@section Choosing Articles
6056@cindex selecting articles
6057
6058@menu
6059* Choosing Commands:: Commands for choosing articles.
6060* Choosing Variables:: Variables that influence these commands.
6061@end menu
6062
6063
6064@node Choosing Commands
6065@subsection Choosing Commands
6066
6067None of the following movement commands understand the numeric prefix,
6068and they all select and display an article.
6069
6070If you want to fetch new articles or redisplay the group, see
6071@ref{Exiting the Summary Buffer}.
6072
6073@table @kbd
6074@item SPACE
6075@kindex SPACE (Summary)
6076@findex gnus-summary-next-page
6077Select the current article, or, if that one's read already, the next
6078unread article (@code{gnus-summary-next-page}).
6079
6080If you have an article window open already and you press @kbd{SPACE}
6081again, the article will be scrolled. This lets you conveniently
6082@kbd{SPACE} through an entire newsgroup. @xref{Paging the Article}.
6083
6084@item G n
6085@itemx n
6086@kindex n (Summary)
6087@kindex G n (Summary)
6088@findex gnus-summary-next-unread-article
6089@c @icon{gnus-summary-next-unread}
6090Go to next unread article (@code{gnus-summary-next-unread-article}).
6091
6092@item G p
6093@itemx p
6094@kindex p (Summary)
6095@findex gnus-summary-prev-unread-article
6096@c @icon{gnus-summary-prev-unread}
6097Go to previous unread article (@code{gnus-summary-prev-unread-article}).
6098
6099@item G N
6100@itemx N
6101@kindex N (Summary)
6102@kindex G N (Summary)
6103@findex gnus-summary-next-article
6104Go to the next article (@code{gnus-summary-next-article}).
6105
6106@item G P
6107@itemx P
6108@kindex P (Summary)
6109@kindex G P (Summary)
6110@findex gnus-summary-prev-article
6111Go to the previous article (@code{gnus-summary-prev-article}).
6112
6113@item G C-n
6114@kindex G C-n (Summary)
6115@findex gnus-summary-next-same-subject
6116Go to the next article with the same subject
6117(@code{gnus-summary-next-same-subject}).
6118
6119@item G C-p
6120@kindex G C-p (Summary)
6121@findex gnus-summary-prev-same-subject
6122Go to the previous article with the same subject
6123(@code{gnus-summary-prev-same-subject}).
6124
6125@item G f
6126@itemx .
6127@kindex G f (Summary)
6128@kindex . (Summary)
6129@findex gnus-summary-first-unread-article
6130Go to the first unread article
6131(@code{gnus-summary-first-unread-article}).
6132
6133@item G b
6134@itemx ,
6135@kindex G b (Summary)
6136@kindex , (Summary)
6137@findex gnus-summary-best-unread-article
6138Go to the unread article with the highest score
6139(@code{gnus-summary-best-unread-article}). If given a prefix argument,
6140go to the first unread article that has a score over the default score.
6141
6142@item G l
6143@itemx l
6144@kindex l (Summary)
6145@kindex G l (Summary)
6146@findex gnus-summary-goto-last-article
6147Go to the previous article read (@code{gnus-summary-goto-last-article}).
6148
6149@item G o
6150@kindex G o (Summary)
6151@findex gnus-summary-pop-article
6152@cindex history
6153@cindex article history
6154Pop an article off the summary history and go to this article
6155(@code{gnus-summary-pop-article}). This command differs from the
6156command above in that you can pop as many previous articles off the
6157history as you like, while @kbd{l} toggles the two last read articles.
6158For a somewhat related issue (if you use these commands a lot),
6159@pxref{Article Backlog}.
6160
6161@item G j
6162@itemx j
6163@kindex j (Summary)
6164@kindex G j (Summary)
6165@findex gnus-summary-goto-article
6166Ask for an article number or @code{Message-ID}, and then go to that
6167article (@code{gnus-summary-goto-article}).
6168
6169@end table
6170
6171
6172@node Choosing Variables
6173@subsection Choosing Variables
6174
6175Some variables relevant for moving and selecting articles:
6176
6177@table @code
6178@item gnus-auto-extend-newsgroup
6179@vindex gnus-auto-extend-newsgroup
6180All the movement commands will try to go to the previous (or next)
6181article, even if that article isn't displayed in the Summary buffer if
6182this variable is non-@code{nil}. Gnus will then fetch the article from
6183the server and display it in the article buffer.
6184
6185@item gnus-select-article-hook
6186@vindex gnus-select-article-hook
6187This hook is called whenever an article is selected. The default is
6188@code{nil}. If you would like each article to be saved in the Agent as
6189you read it, putting @code{gnus-agent-fetch-selected-article} on this
6190hook will do so.
6191
6192@item gnus-mark-article-hook
6193@vindex gnus-mark-article-hook
6194@findex gnus-summary-mark-unread-as-read
6195@findex gnus-summary-mark-read-and-unread-as-read
6196@findex gnus-unread-mark
6197This hook is called whenever an article is selected. It is intended to
6198be used for marking articles as read. The default value is
6199@code{gnus-summary-mark-read-and-unread-as-read}, and will change the
6200mark of almost any article you read to @code{gnus-read-mark}. The only
6201articles not affected by this function are ticked, dormant, and
6202expirable articles. If you'd instead like to just have unread articles
6203marked as read, you can use @code{gnus-summary-mark-unread-as-read}
6204instead. It will leave marks like @code{gnus-low-score-mark},
6205@code{gnus-del-mark} (and so on) alone.
6206
6207@end table
6208
6209
6210@node Paging the Article
6211@section Scrolling the Article
6212@cindex article scrolling
6213
6214@table @kbd
6215
6216@item SPACE
6217@kindex SPACE (Summary)
6218@findex gnus-summary-next-page
6219Pressing @kbd{SPACE} will scroll the current article forward one page,
6220or, if you have come to the end of the current article, will choose the
6221next article (@code{gnus-summary-next-page}).
6222
6223@vindex gnus-article-boring-faces
6224@vindex gnus-article-skip-boring
6225If @code{gnus-article-skip-boring} is non-@code{nil} and the rest of
6226the article consists only of citations and signature, then it will be
6227skipped; the next article will be shown instead. You can customize
6228what is considered uninteresting with
6229@code{gnus-article-boring-faces}. You can manually view the article's
6230pages, no matter how boring, using @kbd{C-M-v}.
6231
6232@item DEL
6233@kindex DEL (Summary)
6234@findex gnus-summary-prev-page
6235Scroll the current article back one page (@code{gnus-summary-prev-page}).
6236
6237@item RET
6238@kindex RET (Summary)
6239@findex gnus-summary-scroll-up
6240Scroll the current article one line forward
6241(@code{gnus-summary-scroll-up}).
6242
6243@item M-RET
6244@kindex M-RET (Summary)
6245@findex gnus-summary-scroll-down
6246Scroll the current article one line backward
6247(@code{gnus-summary-scroll-down}).
6248
6249@item A g
6250@itemx g
6251@kindex A g (Summary)
6252@kindex g (Summary)
6253@findex gnus-summary-show-article
6254@vindex gnus-summary-show-article-charset-alist
6255(Re)fetch the current article (@code{gnus-summary-show-article}). If
6256given a prefix, fetch the current article, but don't run any of the
6257article treatment functions. This will give you a ``raw'' article, just
6258the way it came from the server.
6259
e3e955fe 6260@cindex charset, view article with different charset
4009494e
GM
6261If given a numerical prefix, you can do semi-manual charset stuff.
6262@kbd{C-u 0 g cn-gb-2312 RET} will decode the message as if it were
6263encoded in the @code{cn-gb-2312} charset. If you have
6264
6265@lisp
6266(setq gnus-summary-show-article-charset-alist
6267 '((1 . cn-gb-2312)
6268 (2 . big5)))
6269@end lisp
6270
6271then you can say @kbd{C-u 1 g} to get the same effect.
6272
6273@item A <
6274@itemx <
6275@kindex < (Summary)
6276@kindex A < (Summary)
6277@findex gnus-summary-beginning-of-article
6278Scroll to the beginning of the article
6279(@code{gnus-summary-beginning-of-article}).
6280
6281@item A >
6282@itemx >
6283@kindex > (Summary)
6284@kindex A > (Summary)
6285@findex gnus-summary-end-of-article
6286Scroll to the end of the article (@code{gnus-summary-end-of-article}).
6287
6288@item A s
6289@itemx s
6290@kindex A s (Summary)
6291@kindex s (Summary)
6292@findex gnus-summary-isearch-article
6293Perform an isearch in the article buffer
6294(@code{gnus-summary-isearch-article}).
6295
6296@item h
6297@kindex h (Summary)
6298@findex gnus-summary-select-article-buffer
6299Select the article buffer (@code{gnus-summary-select-article-buffer}).
6300
6301@end table
6302
6303
6304@node Reply Followup and Post
6305@section Reply, Followup and Post
6306
6307@menu
6308* Summary Mail Commands:: Sending mail.
6309* Summary Post Commands:: Sending news.
6310* Summary Message Commands:: Other Message-related commands.
6311* Canceling and Superseding::
6312@end menu
6313
6314
6315@node Summary Mail Commands
6316@subsection Summary Mail Commands
6317@cindex mail
6318@cindex composing mail
6319
6320Commands for composing a mail message:
6321
6322@table @kbd
6323
6324@item S r
6325@itemx r
6326@kindex S r (Summary)
6327@kindex r (Summary)
6328@findex gnus-summary-reply
6329@c @icon{gnus-summary-mail-reply}
6330@c @icon{gnus-summary-reply}
6331Mail a reply to the author of the current article
6332(@code{gnus-summary-reply}).
6333
6334@item S R
6335@itemx R
6336@kindex R (Summary)
6337@kindex S R (Summary)
6338@findex gnus-summary-reply-with-original
6339@c @icon{gnus-summary-reply-with-original}
6340Mail a reply to the author of the current article and include the
6341original message (@code{gnus-summary-reply-with-original}). This
6342command uses the process/prefix convention.
6343
6344@item S w
6345@kindex S w (Summary)
6346@findex gnus-summary-wide-reply
6347Mail a wide reply to the author of the current article
6348(@code{gnus-summary-wide-reply}). A @dfn{wide reply} is a reply that
6349goes out to all people listed in the @code{To}, @code{From} (or
6350@code{Reply-to}) and @code{Cc} headers. If @code{Mail-Followup-To} is
6351present, that's used instead.
6352
6353@item S W
6354@kindex S W (Summary)
6355@findex gnus-summary-wide-reply-with-original
6356Mail a wide reply to the current article and include the original
6357message (@code{gnus-summary-wide-reply-with-original}). This command uses
6358the process/prefix convention.
6359
6360@item S v
6361@kindex S v (Summary)
6362@findex gnus-summary-very-wide-reply
6363Mail a very wide reply to the author of the current article
6364(@code{gnus-summary-wide-reply}). A @dfn{very wide reply} is a reply
6365that goes out to all people listed in the @code{To}, @code{From} (or
6366@code{Reply-to}) and @code{Cc} headers in all the process/prefixed
6367articles. This command uses the process/prefix convention.
6368
6369@item S V
6370@kindex S V (Summary)
6371@findex gnus-summary-very-wide-reply-with-original
6372Mail a very wide reply to the author of the current article and include the
6373original message (@code{gnus-summary-very-wide-reply-with-original}). This
6374command uses the process/prefix convention.
6375
6376@item S B r
6377@kindex S B r (Summary)
6378@findex gnus-summary-reply-broken-reply-to
6379Mail a reply to the author of the current article but ignore the
6380@code{Reply-To} field (@code{gnus-summary-reply-broken-reply-to}).
6381If you need this because a mailing list incorrectly sets a
6382@code{Reply-To} header pointing to the list, you probably want to set
6383the @code{broken-reply-to} group parameter instead, so things will work
6384correctly. @xref{Group Parameters}.
6385
6386@item S B R
6387@kindex S B R (Summary)
6388@findex gnus-summary-reply-broken-reply-to-with-original
6389Mail a reply to the author of the current article and include the
6390original message but ignore the @code{Reply-To} field
6391(@code{gnus-summary-reply-broken-reply-to-with-original}).
6392
6393@item S o m
6394@itemx C-c C-f
6395@kindex S o m (Summary)
6396@kindex C-c C-f (Summary)
6397@findex gnus-summary-mail-forward
6398@c @icon{gnus-summary-mail-forward}
6399Forward the current article to some other person
6400(@code{gnus-summary-mail-forward}). If no prefix is given, the message
6401is forwarded according to the value of (@code{message-forward-as-mime})
6402and (@code{message-forward-show-mml}); if the prefix is 1, decode the
6403message and forward directly inline; if the prefix is 2, forward message
6404as an rfc822 @acronym{MIME} section; if the prefix is 3, decode message and
6405forward as an rfc822 @acronym{MIME} section; if the prefix is 4, forward message
6406directly inline; otherwise, the message is forwarded as no prefix given
6407but use the flipped value of (@code{message-forward-as-mime}). By
6408default, the message is decoded and forwarded as an rfc822 @acronym{MIME}
6409section.
6410
6411@item S m
6412@itemx m
6413@kindex m (Summary)
6414@kindex S m (Summary)
6415@findex gnus-summary-mail-other-window
6416@c @icon{gnus-summary-mail-originate}
6417Prepare a mail (@code{gnus-summary-mail-other-window}). By default, use
6418the posting style of the current group. If given a prefix, disable that.
6419If the prefix is 1, prompt for a group name to find the posting style.
6420
6421@item S i
6422@itemx i
6423@kindex i (Summary)
6424@kindex S i (Summary)
6425@findex gnus-summary-news-other-window
6426Prepare a news (@code{gnus-summary-news-other-window}). By default,
6427post to the current group. If given a prefix, disable that. If the
6428prefix is 1, prompt for a group to post to.
6429
6430This function actually prepares a news even when using mail groups.
6431This is useful for ``posting'' messages to mail groups without actually
6432sending them over the network: they're just saved directly to the group
6433in question. The corresponding back end must have a request-post method
6434for this to work though.
6435
6436@item S D b
6437@kindex S D b (Summary)
6438@findex gnus-summary-resend-bounced-mail
6439@cindex bouncing mail
6440If you have sent a mail, but the mail was bounced back to you for some
6441reason (wrong address, transient failure), you can use this command to
6442resend that bounced mail (@code{gnus-summary-resend-bounced-mail}). You
6443will be popped into a mail buffer where you can edit the headers before
6444sending the mail off again. If you give a prefix to this command, and
6445the bounced mail is a reply to some other mail, Gnus will try to fetch
6446that mail and display it for easy perusal of its headers. This might
6447very well fail, though.
6448
6449@item S D r
6450@kindex S D r (Summary)
6451@findex gnus-summary-resend-message
6452Not to be confused with the previous command,
6453@code{gnus-summary-resend-message} will prompt you for an address to
6454send the current message off to, and then send it to that place. The
6455headers of the message won't be altered---but lots of headers that say
6456@code{Resent-To}, @code{Resent-From} and so on will be added. This
6457means that you actually send a mail to someone that has a @code{To}
6458header that (probably) points to yourself. This will confuse people.
6459So, natcherly you'll only do that if you're really eVIl.
6460
6461This command is mainly used if you have several accounts and want to
6462ship a mail to a different account of yours. (If you're both
6463@code{root} and @code{postmaster} and get a mail for @code{postmaster}
6464to the @code{root} account, you may want to resend it to
6465@code{postmaster}. Ordnung muss sein!
6466
6467This command understands the process/prefix convention
6468(@pxref{Process/Prefix}).
6469
6470@item S D e
6471@kindex S D e (Summary)
6472@findex gnus-summary-resend-message-edit
6473
6474Like the previous command, but will allow you to edit the message as
6475if it were a new message before resending.
6476
6477@item S O m
6478@kindex S O m (Summary)
6479@findex gnus-uu-digest-mail-forward
6480Digest the current series (@pxref{Decoding Articles}) and forward the
6481result using mail (@code{gnus-uu-digest-mail-forward}). This command
6482uses the process/prefix convention (@pxref{Process/Prefix}).
6483
6484@item S M-c
6485@kindex S M-c (Summary)
6486@findex gnus-summary-mail-crosspost-complaint
6487@cindex crossposting
6488@cindex excessive crossposting
6489Send a complaint about excessive crossposting to the author of the
6490current article (@code{gnus-summary-mail-crosspost-complaint}).
6491
6492@findex gnus-crosspost-complaint
6493This command is provided as a way to fight back against the current
6494crossposting pandemic that's sweeping Usenet. It will compose a reply
6495using the @code{gnus-crosspost-complaint} variable as a preamble. This
6496command understands the process/prefix convention
6497(@pxref{Process/Prefix}) and will prompt you before sending each mail.
6498
6499@end table
6500
6501Also @xref{Header Commands, ,Header Commands, message, The Message
6502Manual}, for more information.
6503
6504
6505@node Summary Post Commands
6506@subsection Summary Post Commands
6507@cindex post
6508@cindex composing news
6509
6510Commands for posting a news article:
6511
6512@table @kbd
6513@item S p
6514@itemx a
6515@kindex a (Summary)
6516@kindex S p (Summary)
6517@findex gnus-summary-post-news
6518@c @icon{gnus-summary-post-news}
6519Prepare for posting an article (@code{gnus-summary-post-news}). By
6520default, post to the current group. If given a prefix, disable that.
6521If the prefix is 1, prompt for another group instead.
6522
6523@item S f
6524@itemx f
6525@kindex f (Summary)
6526@kindex S f (Summary)
6527@findex gnus-summary-followup
6528@c @icon{gnus-summary-followup}
6529Post a followup to the current article (@code{gnus-summary-followup}).
6530
6531@item S F
6532@itemx F
6533@kindex S F (Summary)
6534@kindex F (Summary)
6535@c @icon{gnus-summary-followup-with-original}
6536@findex gnus-summary-followup-with-original
6537Post a followup to the current article and include the original message
6538(@code{gnus-summary-followup-with-original}). This command uses the
6539process/prefix convention.
6540
6541@item S n
6542@kindex S n (Summary)
6543@findex gnus-summary-followup-to-mail
6544Post a followup to the current article via news, even if you got the
6545message through mail (@code{gnus-summary-followup-to-mail}).
6546
6547@item S N
6548@kindex S N (Summary)
6549@findex gnus-summary-followup-to-mail-with-original
6550Post a followup to the current article via news, even if you got the
6551message through mail and include the original message
6552(@code{gnus-summary-followup-to-mail-with-original}). This command uses
6553the process/prefix convention.
6554
6555@item S o p
6556@kindex S o p (Summary)
6557@findex gnus-summary-post-forward
6558Forward the current article to a newsgroup
6559(@code{gnus-summary-post-forward}).
6560 If no prefix is given, the message is forwarded according to the value
6561of (@code{message-forward-as-mime}) and
6562(@code{message-forward-show-mml}); if the prefix is 1, decode the
6563message and forward directly inline; if the prefix is 2, forward message
6564as an rfc822 @acronym{MIME} section; if the prefix is 3, decode message and
6565forward as an rfc822 @acronym{MIME} section; if the prefix is 4, forward message
6566directly inline; otherwise, the message is forwarded as no prefix given
6567but use the flipped value of (@code{message-forward-as-mime}). By
6568default, the message is decoded and forwarded as an rfc822 @acronym{MIME} section.
6569
6570@item S O p
6571@kindex S O p (Summary)
6572@findex gnus-uu-digest-post-forward
6573@cindex digests
6574@cindex making digests
6575Digest the current series and forward the result to a newsgroup
6576(@code{gnus-uu-digest-post-forward}). This command uses the
6577process/prefix convention.
6578
6579@item S u
6580@kindex S u (Summary)
6581@findex gnus-uu-post-news
6582@c @icon{gnus-uu-post-news}
6583Uuencode a file, split it into parts, and post it as a series
6584(@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}).
6585@end table
6586
6587Also @xref{Header Commands, ,Header Commands, message, The Message
6588Manual}, for more information.
6589
6590
6591@node Summary Message Commands
6592@subsection Summary Message Commands
6593
6594@table @kbd
6595@item S y
6596@kindex S y (Summary)
6597@findex gnus-summary-yank-message
6598Yank the current article into an already existing Message composition
6599buffer (@code{gnus-summary-yank-message}). This command prompts for
6600what message buffer you want to yank into, and understands the
6601process/prefix convention (@pxref{Process/Prefix}).
6602
6603@end table
6604
6605
6606@node Canceling and Superseding
6607@subsection Canceling Articles
6608@cindex canceling articles
6609@cindex superseding articles
6610
6611Have you ever written something, and then decided that you really,
6612really, really wish you hadn't posted that?
6613
6614Well, you can't cancel mail, but you can cancel posts.
6615
6616@findex gnus-summary-cancel-article
6617@kindex C (Summary)
6618@c @icon{gnus-summary-cancel-article}
6619Find the article you wish to cancel (you can only cancel your own
6620articles, so don't try any funny stuff). Then press @kbd{C} or @kbd{S
6621c} (@code{gnus-summary-cancel-article}). Your article will be
6622canceled---machines all over the world will be deleting your article.
6623This command uses the process/prefix convention (@pxref{Process/Prefix}).
6624
6625Be aware, however, that not all sites honor cancels, so your article may
6626live on here and there, while most sites will delete the article in
6627question.
6628
6629Gnus will use the ``current'' select method when canceling. If you
6630want to use the standard posting method, use the @samp{a} symbolic
6631prefix (@pxref{Symbolic Prefixes}).
6632
6633Gnus ensures that only you can cancel your own messages using a
6634@code{Cancel-Lock} header (@pxref{Canceling News, Canceling News, ,
6635message, Message Manual}).
6636
6637If you discover that you have made some mistakes and want to do some
6638corrections, you can post a @dfn{superseding} article that will replace
6639your original article.
6640
6641@findex gnus-summary-supersede-article
6642@kindex S (Summary)
6643Go to the original article and press @kbd{S s}
6644(@code{gnus-summary-supersede-article}). You will be put in a buffer
6645where you can edit the article all you want before sending it off the
6646usual way.
6647
6648The same goes for superseding as for canceling, only more so: Some
6649sites do not honor superseding. On those sites, it will appear that you
6650have posted almost the same article twice.
6651
6652If you have just posted the article, and change your mind right away,
6653there is a trick you can use to cancel/supersede the article without
6654waiting for the article to appear on your site first. You simply return
6655to the post buffer (which is called @code{*sent ...*}). There you will
6656find the article you just posted, with all the headers intact. Change
6657the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes}
6658header by substituting one of those words for the word
6659@code{Message-ID}. Then just press @kbd{C-c C-c} to send the article as
6660you would do normally. The previous article will be
6661canceled/superseded.
6662
6663Just remember, kids: There is no 'c' in 'supersede'.
6664
6665@node Delayed Articles
6666@section Delayed Articles
6667@cindex delayed sending
6668@cindex send delayed
6669
6670Sometimes, you might wish to delay the sending of a message. For
6671example, you might wish to arrange for a message to turn up just in time
6672to remind your about the birthday of your Significant Other. For this,
6673there is the @code{gnus-delay} package. Setup is simple:
6674
6675@lisp
6676(gnus-delay-initialize)
6677@end lisp
6678
6679@findex gnus-delay-article
6680Normally, to send a message you use the @kbd{C-c C-c} command from
6681Message mode. To delay a message, use @kbd{C-c C-j}
6682(@code{gnus-delay-article}) instead. This will ask you for how long the
6683message should be delayed. Possible answers are:
6684
6685@itemize @bullet
6686@item
6687A time span. Consists of an integer and a letter. For example,
6688@code{42d} means to delay for 42 days. Available letters are @code{m}
6689(minutes), @code{h} (hours), @code{d} (days), @code{w} (weeks), @code{M}
6690(months) and @code{Y} (years).
6691
6692@item
6693A specific date. Looks like @code{YYYY-MM-DD}. The message will be
6694delayed until that day, at a specific time (eight o'clock by default).
6695See also @code{gnus-delay-default-hour}.
6696
6697@item
6698A specific time of day. Given in @code{hh:mm} format, 24h, no am/pm
6699stuff. The deadline will be at that time today, except if that time has
6700already passed, then it's at the given time tomorrow. So if it's ten
6701o'clock in the morning and you specify @code{11:15}, then the deadline
6702is one hour and fifteen minutes hence. But if you specify @code{9:20},
6703that means a time tomorrow.
6704@end itemize
6705
6706The action of the @code{gnus-delay-article} command is influenced by a
6707couple of variables:
6708
6709@table @code
6710@item gnus-delay-default-hour
6711@vindex gnus-delay-default-hour
6712When you specify a specific date, the message will be due on that hour
6713on the given date. Possible values are integers 0 through 23.
6714
6715@item gnus-delay-default-delay
6716@vindex gnus-delay-default-delay
6717This is a string and gives the default delay. It can be of any of the
6718formats described above.
6719
6720@item gnus-delay-group
6721@vindex gnus-delay-group
6722Delayed articles will be kept in this group on the drafts server until
6723they are due. You probably don't need to change this. The default
6724value is @code{"delayed"}.
6725
6726@item gnus-delay-header
6727@vindex gnus-delay-header
6728The deadline for each article will be stored in a header. This variable
6729is a string and gives the header name. You probably don't need to
6730change this. The default value is @code{"X-Gnus-Delayed"}.
6731@end table
6732
6733The way delaying works is like this: when you use the
6734@code{gnus-delay-article} command, you give a certain delay. Gnus
6735calculates the deadline of the message and stores it in the
6736@code{X-Gnus-Delayed} header and puts the message in the
6737@code{nndraft:delayed} group.
6738
6739@findex gnus-delay-send-queue
6740And whenever you get new news, Gnus looks through the group for articles
6741which are due and sends them. It uses the @code{gnus-delay-send-queue}
6742function for this. By default, this function is added to the hook
6743@code{gnus-get-new-news-hook}. But of course, you can change this.
6744Maybe you want to use the demon to send drafts? Just tell the demon to
6745execute the @code{gnus-delay-send-queue} function.
6746
6747@table @code
6748@item gnus-delay-initialize
6749@findex gnus-delay-initialize
6750By default, this function installs @code{gnus-delay-send-queue} in
6751@code{gnus-get-new-news-hook}. But it accepts the optional second
6752argument @code{no-check}. If it is non-@code{nil},
6753@code{gnus-get-new-news-hook} is not changed. The optional first
6754argument is ignored.
6755
6756For example, @code{(gnus-delay-initialize nil t)} means to do nothing.
6757Presumably, you want to use the demon for sending due delayed articles.
6758Just don't forget to set that up :-)
6759@end table
6760
e7842e69
KY
6761When delaying an article with @kbd{C-c C-j}, Message mode will
6762automatically add a @code{"Date"} header with the current time. In
6763many cases you probably want the @code{"Date"} header to reflect the
6764time the message is sent instead. To do this, you have to delete
6765@code{Date} from @code{message-draft-headers}.
6766
4009494e
GM
6767
6768@node Marking Articles
6769@section Marking Articles
6770@cindex article marking
6771@cindex article ticking
6772@cindex marks
6773
6774There are several marks you can set on an article.
6775
6776You have marks that decide the @dfn{readedness} (whoo, neato-keano
6777neologism ohoy!) of the article. Alphabetic marks generally mean
6778@dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.
6779
6780In addition, you also have marks that do not affect readedness.
6781
6782@ifinfo
6783There's a plethora of commands for manipulating these marks.
6784@end ifinfo
6785
6786@menu
6787* Unread Articles:: Marks for unread articles.
6788* Read Articles:: Marks for read articles.
6789* Other Marks:: Marks that do not affect readedness.
6790* Setting Marks:: How to set and remove marks.
6791* Generic Marking Commands:: How to customize the marking.
6792* Setting Process Marks:: How to mark articles for later processing.
6793@end menu
6794
6795
6796@node Unread Articles
6797@subsection Unread Articles
6798
6799The following marks mark articles as (kinda) unread, in one form or
6800other.
6801
6802@table @samp
6803@item !
6804@vindex gnus-ticked-mark
6805Marked as ticked (@code{gnus-ticked-mark}).
6806
6807@dfn{Ticked articles} are articles that will remain visible always. If
6808you see an article that you find interesting, or you want to put off
6809reading it, or replying to it, until sometime later, you'd typically
6810tick it. However, articles can be expired (from news servers by the
6811news server software, Gnus itself never expires ticked messages), so if
6812you want to keep an article forever, you'll have to make it persistent
6813(@pxref{Persistent Articles}).
6814
6815@item ?
6816@vindex gnus-dormant-mark
6817Marked as dormant (@code{gnus-dormant-mark}).
6818
6819@dfn{Dormant articles} will only appear in the summary buffer if there
6820are followups to it. If you want to see them even if they don't have
6821followups, you can use the @kbd{/ D} command (@pxref{Limiting}).
6822Otherwise (except for the visibility issue), they are just like ticked
6823messages.
6824
6825@item SPACE
6826@vindex gnus-unread-mark
6827Marked as unread (@code{gnus-unread-mark}).
6828
6829@dfn{Unread articles} are articles that haven't been read at all yet.
6830@end table
6831
6832
6833@node Read Articles
6834@subsection Read Articles
6835@cindex expirable mark
6836
6837All the following marks mark articles as read.
6838
6839@table @samp
6840
6841@item r
6842@vindex gnus-del-mark
6843These are articles that the user has marked as read with the @kbd{d}
6844command manually, more or less (@code{gnus-del-mark}).
6845
6846@item R
6847@vindex gnus-read-mark
6848Articles that have actually been read (@code{gnus-read-mark}).
6849
6850@item O
6851@vindex gnus-ancient-mark
6852Articles that were marked as read in previous sessions and are now
6853@dfn{old} (@code{gnus-ancient-mark}).
6854
6855@item K
6856@vindex gnus-killed-mark
6857Marked as killed (@code{gnus-killed-mark}).
6858
6859@item X
6860@vindex gnus-kill-file-mark
6861Marked as killed by kill files (@code{gnus-kill-file-mark}).
6862
6863@item Y
6864@vindex gnus-low-score-mark
6865Marked as read by having too low a score (@code{gnus-low-score-mark}).
6866
6867@item C
6868@vindex gnus-catchup-mark
6869Marked as read by a catchup (@code{gnus-catchup-mark}).
6870
6871@item G
6872@vindex gnus-canceled-mark
6873Canceled article (@code{gnus-canceled-mark})
6874
6875@item F
6876@vindex gnus-souped-mark
6877@sc{soup}ed article (@code{gnus-souped-mark}). @xref{SOUP}.
6878
6879@item Q
6880@vindex gnus-sparse-mark
6881Sparsely reffed article (@code{gnus-sparse-mark}). @xref{Customizing
6882Threading}.
6883
6884@item M
6885@vindex gnus-duplicate-mark
6886Article marked as read by duplicate suppression
6887(@code{gnus-duplicate-mark}). @xref{Duplicate Suppression}.
6888
6889@end table
6890
6891All these marks just mean that the article is marked as read, really.
6892They are interpreted differently when doing adaptive scoring, though.
6893
6894One more special mark, though:
6895
6896@table @samp
6897@item E
6898@vindex gnus-expirable-mark
6899Marked as expirable (@code{gnus-expirable-mark}).
6900
6901Marking articles as @dfn{expirable} (or have them marked as such
6902automatically) doesn't make much sense in normal groups---a user doesn't
6903control expiring of news articles, but in mail groups, for instance,
6904articles marked as @dfn{expirable} can be deleted by Gnus at
6905any time.
6906@end table
6907
6908
6909@node Other Marks
6910@subsection Other Marks
6911@cindex process mark
6912@cindex bookmarks
6913
6914There are some marks that have nothing to do with whether the article is
6915read or not.
6916
6917@itemize @bullet
6918
6919@item
6920You can set a bookmark in the current article. Say you are reading a
6921long thesis on cats' urinary tracts, and have to go home for dinner
6922before you've finished reading the thesis. You can then set a bookmark
6923in the article, and Gnus will jump to this bookmark the next time it
6924encounters the article. @xref{Setting Marks}.
6925
6926@item
6927@vindex gnus-replied-mark
6928All articles that you have replied to or made a followup to (i.e., have
6929answered) will be marked with an @samp{A} in the second column
6930(@code{gnus-replied-mark}).
6931
6932@item
6933@vindex gnus-forwarded-mark
6934All articles that you have forwarded will be marked with an @samp{F} in
6935the second column (@code{gnus-forwarded-mark}).
6936
6937@item
6938@vindex gnus-cached-mark
6939Articles stored in the article cache will be marked with an @samp{*} in
6940the second column (@code{gnus-cached-mark}). @xref{Article Caching}.
6941
6942@item
6943@vindex gnus-saved-mark
6944Articles ``saved'' (in some manner or other; not necessarily
6945religiously) are marked with an @samp{S} in the second column
6946(@code{gnus-saved-mark}).
6947
6948@item
6949@vindex gnus-recent-mark
6950Articles that according to the server haven't been shown to the user
6951before are marked with a @samp{N} in the second column
6952(@code{gnus-recent-mark}). Note that not all servers support this
6953mark, in which case it simply never appears. Compare with
6954@code{gnus-unseen-mark}.
6955
6956@item
6957@vindex gnus-unseen-mark
6958Articles that haven't been seen before in Gnus by the user are marked
6959with a @samp{.} in the second column (@code{gnus-unseen-mark}).
6960Compare with @code{gnus-recent-mark}.
6961
6962@item
6963@vindex gnus-downloaded-mark
6964When using the Gnus agent (@pxref{Agent Basics}), articles may be
6965downloaded for unplugged (offline) viewing. If you are using the
6966@samp{%O} spec, these articles get the @samp{+} mark in that spec.
6967(The variable @code{gnus-downloaded-mark} controls which character to
6968use.)
6969
6970@item
6971@vindex gnus-undownloaded-mark
6972When using the Gnus agent (@pxref{Agent Basics}), some articles might
6973not have been downloaded. Such articles cannot be viewed while you
6974are unplugged (offline). If you are using the @samp{%O} spec, these
6975articles get the @samp{-} mark in that spec. (The variable
6976@code{gnus-undownloaded-mark} controls which character to use.)
6977
6978@item
6979@vindex gnus-downloadable-mark
6980The Gnus agent (@pxref{Agent Basics}) downloads some articles
6981automatically, but it is also possible to explicitly mark articles for
6982download, even if they would not be downloaded automatically. Such
6983explicitly-marked articles get the @samp{%} mark in the first column.
6984(The variable @code{gnus-downloadable-mark} controls which character to
6985use.)
6986
6987@item
6988@vindex gnus-not-empty-thread-mark
6989@vindex gnus-empty-thread-mark
6990If the @samp{%e} spec is used, the presence of threads or not will be
6991marked with @code{gnus-not-empty-thread-mark} and
6992@code{gnus-empty-thread-mark} in the third column, respectively.
6993
6994@item
6995@vindex gnus-process-mark
6996Finally we have the @dfn{process mark} (@code{gnus-process-mark}). A
6997variety of commands react to the presence of the process mark. For
6998instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view
6999all articles that have been marked with the process mark. Articles
7000marked with the process mark have a @samp{#} in the second column.
7001
7002@end itemize
7003
7004You might have noticed that most of these ``non-readedness'' marks
7005appear in the second column by default. So if you have a cached, saved,
7006replied article that you have process-marked, what will that look like?
7007
7008Nothing much. The precedence rules go as follows: process -> cache ->
7009replied -> saved. So if the article is in the cache and is replied,
7010you'll only see the cache mark and not the replied mark.
7011
7012
7013@node Setting Marks
7014@subsection Setting Marks
7015@cindex setting marks
7016
7017All the marking commands understand the numeric prefix.
7018
7019@table @kbd
7020@item M c
7021@itemx M-u
7022@kindex M c (Summary)
7023@kindex M-u (Summary)
7024@findex gnus-summary-clear-mark-forward
7025@cindex mark as unread
7026Clear all readedness-marks from the current article
7027(@code{gnus-summary-clear-mark-forward}). In other words, mark the
7028article as unread.
7029
7030@item M t
7031@itemx !
7032@kindex ! (Summary)
7033@kindex M t (Summary)
7034@findex gnus-summary-tick-article-forward
7035Tick the current article (@code{gnus-summary-tick-article-forward}).
7036@xref{Article Caching}.
7037
7038@item M ?
7039@itemx ?
7040@kindex ? (Summary)
7041@kindex M ? (Summary)
7042@findex gnus-summary-mark-as-dormant
7043Mark the current article as dormant
7044(@code{gnus-summary-mark-as-dormant}). @xref{Article Caching}.
7045
7046@item M d
7047@itemx d
7048@kindex M d (Summary)
7049@kindex d (Summary)
7050@findex gnus-summary-mark-as-read-forward
7051Mark the current article as read
7052(@code{gnus-summary-mark-as-read-forward}).
7053
7054@item D
7055@kindex D (Summary)
7056@findex gnus-summary-mark-as-read-backward
7057Mark the current article as read and move point to the previous line
7058(@code{gnus-summary-mark-as-read-backward}).
7059
7060@item M k
7061@itemx k
7062@kindex k (Summary)
7063@kindex M k (Summary)
7064@findex gnus-summary-kill-same-subject-and-select
7065Mark all articles that have the same subject as the current one as read,
7066and then select the next unread article
7067(@code{gnus-summary-kill-same-subject-and-select}).
7068
7069@item M K
7070@itemx C-k
7071@kindex M K (Summary)
7072@kindex C-k (Summary)
7073@findex gnus-summary-kill-same-subject
7074Mark all articles that have the same subject as the current one as read
7075(@code{gnus-summary-kill-same-subject}).
7076
7077@item M C
7078@kindex M C (Summary)
7079@findex gnus-summary-catchup
7080@c @icon{gnus-summary-catchup}
7081Mark all unread articles as read (@code{gnus-summary-catchup}).
7082
7083@item M C-c
7084@kindex M C-c (Summary)
7085@findex gnus-summary-catchup-all
7086Mark all articles in the group as read---even the ticked and dormant
7087articles (@code{gnus-summary-catchup-all}).
7088
7089@item M H
7090@kindex M H (Summary)
7091@findex gnus-summary-catchup-to-here
7092Catchup the current group to point (before the point)
7093(@code{gnus-summary-catchup-to-here}).
7094
7095@item M h
7096@kindex M h (Summary)
7097@findex gnus-summary-catchup-from-here
7098Catchup the current group from point (after the point)
7099(@code{gnus-summary-catchup-from-here}).
7100
7101@item C-w
7102@kindex C-w (Summary)
7103@findex gnus-summary-mark-region-as-read
7104Mark all articles between point and mark as read
7105(@code{gnus-summary-mark-region-as-read}).
7106
7107@item M V k
7108@kindex M V k (Summary)
7109@findex gnus-summary-kill-below
7110Kill all articles with scores below the default score (or below the
7111numeric prefix) (@code{gnus-summary-kill-below}).
7112
7113@item M e
7114@itemx E
7115@kindex M e (Summary)
7116@kindex E (Summary)
7117@findex gnus-summary-mark-as-expirable
7118Mark the current article as expirable
7119(@code{gnus-summary-mark-as-expirable}).
7120
7121@item M b
7122@kindex M b (Summary)
7123@findex gnus-summary-set-bookmark
7124Set a bookmark in the current article
7125(@code{gnus-summary-set-bookmark}).
7126
7127@item M B
7128@kindex M B (Summary)
7129@findex gnus-summary-remove-bookmark
7130Remove the bookmark from the current article
7131(@code{gnus-summary-remove-bookmark}).
7132
7133@item M V c
7134@kindex M V c (Summary)
7135@findex gnus-summary-clear-above
7136Clear all marks from articles with scores over the default score (or
7137over the numeric prefix) (@code{gnus-summary-clear-above}).
7138
7139@item M V u
7140@kindex M V u (Summary)
7141@findex gnus-summary-tick-above
7142Tick all articles with scores over the default score (or over the
7143numeric prefix) (@code{gnus-summary-tick-above}).
7144
7145@item M V m
7146@kindex M V m (Summary)
7147@findex gnus-summary-mark-above
7148Prompt for a mark, and mark all articles with scores over the default
7149score (or over the numeric prefix) with this mark
7150(@code{gnus-summary-clear-above}).
7151@end table
7152
7153@vindex gnus-summary-goto-unread
7154The @code{gnus-summary-goto-unread} variable controls what action should
7155be taken after setting a mark. If non-@code{nil}, point will move to
7156the next/previous unread article. If @code{nil}, point will just move
7157one line up or down. As a special case, if this variable is
7158@code{never}, all the marking commands as well as other commands (like
7159@kbd{SPACE}) will move to the next article, whether it is unread or not.
7160The default is @code{t}.
7161
7162
7163@node Generic Marking Commands
7164@subsection Generic Marking Commands
7165
7166Some people would like the command that ticks an article (@kbd{!}) go to
7167the next article. Others would like it to go to the next unread
7168article. Yet others would like it to stay on the current article. And
7169even though I haven't heard of anybody wanting it to go to the
7170previous (unread) article, I'm sure there are people that want that as
7171well.
7172
7173Multiply these five behaviors with five different marking commands, and
7174you get a potentially complex set of variable to control what each
7175command should do.
7176
7177To sidestep that mess, Gnus provides commands that do all these
7178different things. They can be found on the @kbd{M M} map in the summary
7179buffer. Type @kbd{M M C-h} to see them all---there are too many of them
7180to list in this manual.
7181
7182While you can use these commands directly, most users would prefer
7183altering the summary mode keymap. For instance, if you would like the
7184@kbd{!} command to go to the next article instead of the next unread
7185article, you could say something like:
7186
7187@lisp
7188@group
7189(add-hook 'gnus-summary-mode-hook 'my-alter-summary-map)
7190(defun my-alter-summary-map ()
7191 (local-set-key "!" 'gnus-summary-put-mark-as-ticked-next))
7192@end group
7193@end lisp
7194
7195@noindent
7196or
7197
7198@lisp
7199(defun my-alter-summary-map ()
7200 (local-set-key "!" "MM!n"))
7201@end lisp
7202
7203
7204@node Setting Process Marks
7205@subsection Setting Process Marks
7206@cindex setting process marks
7207
7208Process marks are displayed as @code{#} in the summary buffer, and are
7209used for marking articles in such a way that other commands will
7210process these articles. For instance, if you process mark four
7211articles and then use the @kbd{*} command, Gnus will enter these four
7212articles into the cache. For more information,
7213@pxref{Process/Prefix}.
7214
7215@table @kbd
7216
7217@item M P p
7218@itemx #
7219@kindex # (Summary)
7220@kindex M P p (Summary)
7221@findex gnus-summary-mark-as-processable
7222Mark the current article with the process mark
7223(@code{gnus-summary-mark-as-processable}).
7224@findex gnus-summary-unmark-as-processable
7225
7226@item M P u
7227@itemx M-#
7228@kindex M P u (Summary)
7229@kindex M-# (Summary)
7230Remove the process mark, if any, from the current article
7231(@code{gnus-summary-unmark-as-processable}).
7232
7233@item M P U
7234@kindex M P U (Summary)
7235@findex gnus-summary-unmark-all-processable
7236Remove the process mark from all articles
7237(@code{gnus-summary-unmark-all-processable}).
7238
7239@item M P i
7240@kindex M P i (Summary)
7241@findex gnus-uu-invert-processable
7242Invert the list of process marked articles
7243(@code{gnus-uu-invert-processable}).
7244
7245@item M P R
7246@kindex M P R (Summary)
7247@findex gnus-uu-mark-by-regexp
7248Mark articles that have a @code{Subject} header that matches a regular
7249expression (@code{gnus-uu-mark-by-regexp}).
7250
7251@item M P G
7252@kindex M P G (Summary)
7253@findex gnus-uu-unmark-by-regexp
7254Unmark articles that have a @code{Subject} header that matches a regular
7255expression (@code{gnus-uu-unmark-by-regexp}).
7256
7257@item M P r
7258@kindex M P r (Summary)
7259@findex gnus-uu-mark-region
7260Mark articles in region (@code{gnus-uu-mark-region}).
7261
7262@item M P g
7263@kindex M P g (Summary)
7264@findex gnus-uu-unmark-region
7265Unmark articles in region (@code{gnus-uu-unmark-region}).
7266
7267@item M P t
7268@kindex M P t (Summary)
7269@findex gnus-uu-mark-thread
7270Mark all articles in the current (sub)thread
7271(@code{gnus-uu-mark-thread}).
7272
7273@item M P T
7274@kindex M P T (Summary)
7275@findex gnus-uu-unmark-thread
7276Unmark all articles in the current (sub)thread
7277(@code{gnus-uu-unmark-thread}).
7278
7279@item M P v
7280@kindex M P v (Summary)
7281@findex gnus-uu-mark-over
7282Mark all articles that have a score above the prefix argument
7283(@code{gnus-uu-mark-over}).
7284
7285@item M P s
7286@kindex M P s (Summary)
7287@findex gnus-uu-mark-series
7288Mark all articles in the current series (@code{gnus-uu-mark-series}).
7289
7290@item M P S
7291@kindex M P S (Summary)
7292@findex gnus-uu-mark-sparse
7293Mark all series that have already had some articles marked
7294(@code{gnus-uu-mark-sparse}).
7295
7296@item M P a
7297@kindex M P a (Summary)
7298@findex gnus-uu-mark-all
7299Mark all articles in series order (@code{gnus-uu-mark-all}).
7300
7301@item M P b
7302@kindex M P b (Summary)
7303@findex gnus-uu-mark-buffer
7304Mark all articles in the buffer in the order they appear
7305(@code{gnus-uu-mark-buffer}).
7306
7307@item M P k
7308@kindex M P k (Summary)
7309@findex gnus-summary-kill-process-mark
7310Push the current process mark set onto the stack and unmark all articles
7311(@code{gnus-summary-kill-process-mark}).
7312
7313@item M P y
7314@kindex M P y (Summary)
7315@findex gnus-summary-yank-process-mark
7316Pop the previous process mark set from the stack and restore it
7317(@code{gnus-summary-yank-process-mark}).
7318
7319@item M P w
7320@kindex M P w (Summary)
7321@findex gnus-summary-save-process-mark
7322Push the current process mark set onto the stack
7323(@code{gnus-summary-save-process-mark}).
7324
7325@end table
7326
7327Also see the @kbd{&} command in @ref{Searching for Articles}, for how to
7328set process marks based on article body contents.
7329
7330
7331@node Limiting
7332@section Limiting
7333@cindex limiting
7334
7335It can be convenient to limit the summary buffer to just show some
7336subset of the articles currently in the group. The effect most limit
7337commands have is to remove a few (or many) articles from the summary
7338buffer.
7339
26b9f88d
MB
7340Limiting commands work on subsets of the articles already fetched from
7341the servers. These commands don't query the server for additional
7342articles.
4009494e
GM
7343
7344@table @kbd
7345
7346@item / /
7347@itemx / s
7348@kindex / / (Summary)
7349@findex gnus-summary-limit-to-subject
7350Limit the summary buffer to articles that match some subject
7351(@code{gnus-summary-limit-to-subject}). If given a prefix, exclude
7352matching articles.
7353
7354@item / a
7355@kindex / a (Summary)
7356@findex gnus-summary-limit-to-author
7357Limit the summary buffer to articles that match some author
7358(@code{gnus-summary-limit-to-author}). If given a prefix, exclude
7359matching articles.
7360
01c52d31
MB
7361@item / R
7362@kindex / R (Summary)
7363@findex gnus-summary-limit-to-recipient
7364Limit the summary buffer to articles that match some recipient
7365(@code{gnus-summary-limit-to-recipient}). If given a prefix, exclude
7366matching articles.
7367
7368@item / A
7369@kindex / A (Summary)
7370@findex gnus-summary-limit-to-address
7371Limit the summary buffer to articles in which contents of From, To or Cc
7372header match a given address (@code{gnus-summary-limit-to-address}). If
7373given a prefix, exclude matching articles.
7374
7375@item / S
7376@kindex / S (Summary)
7377@findex gnus-summary-limit-to-singletons
7378Limit the summary buffer to articles that aren't part of any displayed
7379threads (@code{gnus-summary-limit-to-singletons}). If given a prefix,
7380limit to articles that are part of displayed threads.
7381
4009494e
GM
7382@item / x
7383@kindex / x (Summary)
7384@findex gnus-summary-limit-to-extra
7385Limit the summary buffer to articles that match one of the ``extra''
7386headers (@pxref{To From Newsgroups})
7387(@code{gnus-summary-limit-to-extra}). If given a prefix, exclude
7388matching articles.
7389
7390@item / u
7391@itemx x
7392@kindex / u (Summary)
7393@kindex x (Summary)
7394@findex gnus-summary-limit-to-unread
7395Limit the summary buffer to articles not marked as read
7396(@code{gnus-summary-limit-to-unread}). If given a prefix, limit the
7397buffer to articles strictly unread. This means that ticked and
7398dormant articles will also be excluded.
7399
7400@item / m
7401@kindex / m (Summary)
7402@findex gnus-summary-limit-to-marks
7403Ask for a mark and then limit to all articles that have been marked
7404with that mark (@code{gnus-summary-limit-to-marks}).
7405
7406@item / t
7407@kindex / t (Summary)
7408@findex gnus-summary-limit-to-age
7409Ask for a number and then limit the summary buffer to articles older than (or equal to) that number of days
7410(@code{gnus-summary-limit-to-age}). If given a prefix, limit to
7411articles younger than that number of days.
7412
7413@item / n
7414@kindex / n (Summary)
7415@findex gnus-summary-limit-to-articles
7416With prefix @samp{n}, limit the summary buffer to the next @samp{n}
7417articles. If not given a prefix, use the process marked articles
7418instead. (@code{gnus-summary-limit-to-articles}).
7419
7420@item / w
7421@kindex / w (Summary)
7422@findex gnus-summary-pop-limit
7423Pop the previous limit off the stack and restore it
7424(@code{gnus-summary-pop-limit}). If given a prefix, pop all limits off
7425the stack.
7426
7427@item / .
7428@kindex / . (Summary)
7429@findex gnus-summary-limit-to-unseen
7430Limit the summary buffer to the unseen articles
7431(@code{gnus-summary-limit-to-unseen}).
7432
7433@item / v
7434@kindex / v (Summary)
7435@findex gnus-summary-limit-to-score
7436Limit the summary buffer to articles that have a score at or above some
7437score (@code{gnus-summary-limit-to-score}).
7438
7439@item / p
7440@kindex / p (Summary)
7441@findex gnus-summary-limit-to-display-predicate
7442Limit the summary buffer to articles that satisfy the @code{display}
7443group parameter predicate
7444(@code{gnus-summary-limit-to-display-predicate}). @xref{Group
7445Parameters}, for more on this predicate.
7446
01c52d31
MB
7447@item / r
7448@kindex / r (Summary)
7449@findex gnus-summary-limit-to-replied
7450Limit the summary buffer to replied articles
7451(@code{gnus-summary-limit-to-replied}). If given a prefix, exclude
7452replied articles.
7453
4009494e
GM
7454@item / E
7455@itemx M S
7456@kindex M S (Summary)
7457@kindex / E (Summary)
7458@findex gnus-summary-limit-include-expunged
7459Include all expunged articles in the limit
7460(@code{gnus-summary-limit-include-expunged}).
7461
7462@item / D
7463@kindex / D (Summary)
7464@findex gnus-summary-limit-include-dormant
7465Include all dormant articles in the limit
7466(@code{gnus-summary-limit-include-dormant}).
7467
7468@item / *
7469@kindex / * (Summary)
7470@findex gnus-summary-limit-include-cached
7471Include all cached articles in the limit
7472(@code{gnus-summary-limit-include-cached}).
7473
7474@item / d
7475@kindex / d (Summary)
7476@findex gnus-summary-limit-exclude-dormant
7477Exclude all dormant articles from the limit
7478(@code{gnus-summary-limit-exclude-dormant}).
7479
7480@item / M
7481@kindex / M (Summary)
7482@findex gnus-summary-limit-exclude-marks
7483Exclude all marked articles (@code{gnus-summary-limit-exclude-marks}).
7484
7485@item / T
7486@kindex / T (Summary)
7487@findex gnus-summary-limit-include-thread
7488Include all the articles in the current thread in the limit.
7489
7490@item / c
7491@kindex / c (Summary)
7492@findex gnus-summary-limit-exclude-childless-dormant
7493Exclude all dormant articles that have no children from the limit@*
7494(@code{gnus-summary-limit-exclude-childless-dormant}).
7495
7496@item / C
7497@kindex / C (Summary)
7498@findex gnus-summary-limit-mark-excluded-as-read
7499Mark all excluded unread articles as read
7500(@code{gnus-summary-limit-mark-excluded-as-read}). If given a prefix,
7501also mark excluded ticked and dormant articles as read.
7502
01c52d31
MB
7503@item / b
7504@kindex / b (Summary)
7505@findex gnus-summary-limit-to-bodies
7506Limit the summary buffer to articles that have bodies that match a
7507certain regexp (@code{gnus-summary-limit-to-bodies}). If given a
7508prefix, reverse the limit. This command is quite slow since it
7509requires selecting each article to find the matches.
7510
7511@item / h
7512@kindex / h (Summary)
7513@findex gnus-summary-limit-to-headers
7514Like the previous command, only limit to headers instead
7515(@code{gnus-summary-limit-to-headers}).
7516
4009494e
GM
7517@end table
7518
7519
26b9f88d
MB
7520The following commands aren't limiting commands, but use the @kbd{/}
7521prefix as well.
7522
7523@table @kbd
7524@item / N
7525@kindex / N (Summary)
7526@findex gnus-summary-insert-new-articles
7527Insert all new articles in the summary buffer. It scans for new emails
7528if @var{back-end}@code{-get-new-mail} is non-@code{nil}.
7529
7530@item / o
7531@kindex / o (Summary)
7532@findex gnus-summary-insert-old-articles
7533Insert all old articles in the summary buffer. If given a numbered
7534prefix, fetch this number of articles.
7535
7536@end table
7537
7538
4009494e
GM
7539@node Threading
7540@section Threading
7541@cindex threading
7542@cindex article threading
7543
7544Gnus threads articles by default. @dfn{To thread} is to put responses
7545to articles directly after the articles they respond to---in a
7546hierarchical fashion.
7547
7548Threading is done by looking at the @code{References} headers of the
7549articles. In a perfect world, this would be enough to build pretty
7550trees, but unfortunately, the @code{References} header is often broken
7551or simply missing. Weird news propagation exacerbates the problem,
7552so one has to employ other heuristics to get pleasing results. A
7553plethora of approaches exists, as detailed in horrible detail in
7554@ref{Customizing Threading}.
7555
7556First, a quick overview of the concepts:
7557
7558@table @dfn
7559@item root
7560The top-most article in a thread; the first article in the thread.
7561
7562@item thread
7563A tree-like article structure.
7564
7565@item sub-thread
7566A small(er) section of this tree-like structure.
7567
7568@item loose threads
7569Threads often lose their roots due to article expiry, or due to the root
7570already having been read in a previous session, and not displayed in the
7571summary buffer. We then typically have many sub-threads that really
7572belong to one thread, but are without connecting roots. These are
7573called loose threads.
7574
7575@item thread gathering
7576An attempt to gather loose threads into bigger threads.
7577
7578@item sparse threads
7579A thread where the missing articles have been ``guessed'' at, and are
7580displayed as empty lines in the summary buffer.
7581
7582@end table
7583
7584
7585@menu
7586* Customizing Threading:: Variables you can change to affect the threading.
7587* Thread Commands:: Thread based commands in the summary buffer.
7588@end menu
7589
7590
7591@node Customizing Threading
7592@subsection Customizing Threading
7593@cindex customizing threading
7594
7595@menu
7596* Loose Threads:: How Gnus gathers loose threads into bigger threads.
7597* Filling In Threads:: Making the threads displayed look fuller.
7598* More Threading:: Even more variables for fiddling with threads.
7599* Low-Level Threading:: You thought it was over@dots{} but you were wrong!
7600@end menu
7601
7602
7603@node Loose Threads
7604@subsubsection Loose Threads
7605@cindex <
7606@cindex >
7607@cindex loose threads
7608
7609@table @code
7610@item gnus-summary-make-false-root
7611@vindex gnus-summary-make-false-root
7612If non-@code{nil}, Gnus will gather all loose subtrees into one big tree
7613and create a dummy root at the top. (Wait a minute. Root at the top?
7614Yup.) Loose subtrees occur when the real root has expired, or you've
7615read or killed the root in a previous session.
7616
7617When there is no real root of a thread, Gnus will have to fudge
7618something. This variable says what fudging method Gnus should use.
7619There are four possible values:
7620
7621@iftex
7622@iflatex
7623\gnusfigure{The Summary Buffer}{390}{
7624\put(0,0){\epsfig{figure=ps/summary-adopt,width=7.5cm}}
7625\put(445,0){\makebox(0,0)[br]{\epsfig{figure=ps/summary-empty,width=7.5cm}}}
7626\put(0,400){\makebox(0,0)[tl]{\epsfig{figure=ps/summary-none,width=7.5cm}}}
7627\put(445,400){\makebox(0,0)[tr]{\epsfig{figure=ps/summary-dummy,width=7.5cm}}}
7628}
7629@end iflatex
7630@end iftex
7631
7632@cindex adopting articles
7633
7634@table @code
7635
7636@item adopt
7637Gnus will make the first of the orphaned articles the parent. This
7638parent will adopt all the other articles. The adopted articles will be
7639marked as such by pointy brackets (@samp{<>}) instead of the standard
7640square brackets (@samp{[]}). This is the default method.
7641
7642@item dummy
7643@vindex gnus-summary-dummy-line-format
7644@vindex gnus-summary-make-false-root-always
7645Gnus will create a dummy summary line that will pretend to be the
7646parent. This dummy line does not correspond to any real article, so
7647selecting it will just select the first real article after the dummy
7648article. @code{gnus-summary-dummy-line-format} is used to specify the
7649format of the dummy roots. It accepts only one format spec: @samp{S},
7650which is the subject of the article. @xref{Formatting Variables}.
7651If you want all threads to have a dummy root, even the non-gathered
7652ones, set @code{gnus-summary-make-false-root-always} to @code{t}.
7653
7654@item empty
7655Gnus won't actually make any article the parent, but simply leave the
7656subject field of all orphans except the first empty. (Actually, it will
7657use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
7658Buffer Format}).)
7659
7660@item none
7661Don't make any article parent at all. Just gather the threads and
7662display them after one another.
7663
7664@item nil
7665Don't gather loose threads.
7666@end table
7667
7668@item gnus-summary-gather-subject-limit
7669@vindex gnus-summary-gather-subject-limit
7670Loose threads are gathered by comparing subjects of articles. If this
7671variable is @code{nil}, Gnus requires an exact match between the
7672subjects of the loose threads before gathering them into one big
7673super-thread. This might be too strict a requirement, what with the
7674presence of stupid newsreaders that chop off long subject lines. If
7675you think so, set this variable to, say, 20 to require that only the
7676first 20 characters of the subjects have to match. If you set this
7677variable to a really low number, you'll find that Gnus will gather
7678everything in sight into one thread, which isn't very helpful.
7679
7680@cindex fuzzy article gathering
7681If you set this variable to the special value @code{fuzzy}, Gnus will
7682use a fuzzy string comparison algorithm on the subjects (@pxref{Fuzzy
7683Matching}).
7684
7685@item gnus-simplify-subject-fuzzy-regexp
7686@vindex gnus-simplify-subject-fuzzy-regexp
7687This can either be a regular expression or list of regular expressions
7688that match strings that will be removed from subjects if fuzzy subject
7689simplification is used.
7690
7691@item gnus-simplify-ignored-prefixes
7692@vindex gnus-simplify-ignored-prefixes
7693If you set @code{gnus-summary-gather-subject-limit} to something as low
7694as 10, you might consider setting this variable to something sensible:
7695
7696@c Written by Michael Ernst <mernst@cs.rice.edu>
7697@lisp
7698(setq gnus-simplify-ignored-prefixes
7699 (concat
7700 "\\`\\[?\\("
7701 (mapconcat
7702 'identity
7703 '("looking"
7704 "wanted" "followup" "summary\\( of\\)?"
7705 "help" "query" "problem" "question"
7706 "answer" "reference" "announce"
7707 "How can I" "How to" "Comparison of"
7708 ;; ...
7709 )
7710 "\\|")
7711 "\\)\\s *\\("
7712 (mapconcat 'identity
7713 '("for" "for reference" "with" "about")
7714 "\\|")
7715 "\\)?\\]?:?[ \t]*"))
7716@end lisp
7717
7718All words that match this regexp will be removed before comparing two
7719subjects.
7720
7721@item gnus-simplify-subject-functions
7722@vindex gnus-simplify-subject-functions
7723If non-@code{nil}, this variable overrides
7724@code{gnus-summary-gather-subject-limit}. This variable should be a
7725list of functions to apply to the @code{Subject} string iteratively to
7726arrive at the simplified version of the string.
7727
7728Useful functions to put in this list include:
7729
7730@table @code
7731@item gnus-simplify-subject-re
7732@findex gnus-simplify-subject-re
7733Strip the leading @samp{Re:}.
7734
7735@item gnus-simplify-subject-fuzzy
7736@findex gnus-simplify-subject-fuzzy
7737Simplify fuzzily.
7738
7739@item gnus-simplify-whitespace
7740@findex gnus-simplify-whitespace
7741Remove excessive whitespace.
7742
7743@item gnus-simplify-all-whitespace
7744@findex gnus-simplify-all-whitespace
7745Remove all whitespace.
7746@end table
7747
7748You may also write your own functions, of course.
7749
7750
7751@item gnus-summary-gather-exclude-subject
7752@vindex gnus-summary-gather-exclude-subject
7753Since loose thread gathering is done on subjects only, that might lead
7754to many false hits, especially with certain common subjects like
7755@samp{} and @samp{(none)}. To make the situation slightly better,
7756you can use the regexp @code{gnus-summary-gather-exclude-subject} to say
7757what subjects should be excluded from the gathering process.@*
7758The default is @samp{^ *$\\|^(none)$}.
7759
7760@item gnus-summary-thread-gathering-function
7761@vindex gnus-summary-thread-gathering-function
7762Gnus gathers threads by looking at @code{Subject} headers. This means
7763that totally unrelated articles may end up in the same ``thread'', which
7764is confusing. An alternate approach is to look at all the
7765@code{Message-ID}s in all the @code{References} headers to find matches.
7766This will ensure that no gathered threads ever include unrelated
7767articles, but it also means that people who have posted with broken
7768newsreaders won't be gathered properly. The choice is yours---plague or
7769cholera:
7770
7771@table @code
7772@item gnus-gather-threads-by-subject
7773@findex gnus-gather-threads-by-subject
7774This function is the default gathering function and looks at
7775@code{Subject}s exclusively.
7776
7777@item gnus-gather-threads-by-references
7778@findex gnus-gather-threads-by-references
7779This function looks at @code{References} headers exclusively.
7780@end table
7781
7782If you want to test gathering by @code{References}, you could say
7783something like:
7784
7785@lisp
7786(setq gnus-summary-thread-gathering-function
7787 'gnus-gather-threads-by-references)
7788@end lisp
7789
7790@end table
7791
7792
7793@node Filling In Threads
7794@subsubsection Filling In Threads
7795
7796@table @code
7797@item gnus-fetch-old-headers
7798@vindex gnus-fetch-old-headers
7799If non-@code{nil}, Gnus will attempt to build old threads by fetching
7800more old headers---headers to articles marked as read. If you would
7801like to display as few summary lines as possible, but still connect as
7802many loose threads as possible, you should set this variable to
7803@code{some} or a number. If you set it to a number, no more than that
7804number of extra old headers will be fetched. In either case, fetching
7805old headers only works if the back end you are using carries overview
7806files---this would normally be @code{nntp}, @code{nnspool},
7807@code{nnml}, and @code{nnmaildir}. Also remember that if the root of
7808the thread has been expired by the server, there's not much Gnus can
7809do about that.
7810
7811This variable can also be set to @code{invisible}. This won't have any
7812visible effects, but is useful if you use the @kbd{A T} command a lot
7813(@pxref{Finding the Parent}).
7814
f394fa25
MB
7815The server has to support @acronym{NOV} for any of this to work.
7816
7817@cindex Gmane, gnus-fetch-old-headers
7818This feature can seriously impact performance it ignores all locally
7819cached header entries. Setting it to @code{t} for groups for a server
7820that doesn't expire articles (such as news.gmane.org), leads to very
7821slow summary generation.
7822
4009494e
GM
7823@item gnus-fetch-old-ephemeral-headers
7824@vindex gnus-fetch-old-ephemeral-headers
7825Same as @code{gnus-fetch-old-headers}, but only used for ephemeral
7826newsgroups.
7827
7828@item gnus-build-sparse-threads
7829@vindex gnus-build-sparse-threads
7830Fetching old headers can be slow. A low-rent similar effect can be
7831gotten by setting this variable to @code{some}. Gnus will then look at
7832the complete @code{References} headers of all articles and try to string
7833together articles that belong in the same thread. This will leave
7834@dfn{gaps} in the threading display where Gnus guesses that an article
7835is missing from the thread. (These gaps appear like normal summary
7836lines. If you select a gap, Gnus will try to fetch the article in
7837question.) If this variable is @code{t}, Gnus will display all these
7838``gaps'' without regard for whether they are useful for completing the
7839thread or not. Finally, if this variable is @code{more}, Gnus won't cut
7840off sparse leaf nodes that don't lead anywhere. This variable is
7841@code{nil} by default.
7842
7843@item gnus-read-all-available-headers
7844@vindex gnus-read-all-available-headers
7845This is a rather obscure variable that few will find useful. It's
7846intended for those non-news newsgroups where the back end has to fetch
7847quite a lot to present the summary buffer, and where it's impossible to
7848go back to parents of articles. This is mostly the case in the
7849web-based groups, like the @code{nnultimate} groups.
7850
7851If you don't use those, then it's safe to leave this as the default
7852@code{nil}. If you want to use this variable, it should be a regexp
7853that matches the group name, or @code{t} for all groups.
7854
7855@end table
7856
7857
7858@node More Threading
7859@subsubsection More Threading
7860
7861@table @code
7862@item gnus-show-threads
7863@vindex gnus-show-threads
7864If this variable is @code{nil}, no threading will be done, and all of
7865the rest of the variables here will have no effect. Turning threading
7866off will speed group selection up a bit, but it is sure to make reading
7867slower and more awkward.
7868
7869@item gnus-thread-hide-subtree
7870@vindex gnus-thread-hide-subtree
7871If non-@code{nil}, all threads will be hidden when the summary buffer is
7872generated.
7873
7874This can also be a predicate specifier (@pxref{Predicate Specifiers}).
7875Available predicates are @code{gnus-article-unread-p} and
7876@code{gnus-article-unseen-p}.
7877
7878Here's an example:
7879
7880@lisp
7881(setq gnus-thread-hide-subtree
7882 '(or gnus-article-unread-p
7883 gnus-article-unseen-p))
7884@end lisp
7885
7886(It's a pretty nonsensical example, since all unseen articles are also
7887unread, but you get my drift.)
7888
7889
7890@item gnus-thread-expunge-below
7891@vindex gnus-thread-expunge-below
7892All threads that have a total score (as defined by
7893@code{gnus-thread-score-function}) less than this number will be
7894expunged. This variable is @code{nil} by default, which means that no
7895threads are expunged.
7896
7897@item gnus-thread-hide-killed
7898@vindex gnus-thread-hide-killed
7899if you kill a thread and this variable is non-@code{nil}, the subtree
7900will be hidden.
7901
7902@item gnus-thread-ignore-subject
7903@vindex gnus-thread-ignore-subject
7904Sometimes somebody changes the subject in the middle of a thread. If
7905this variable is non-@code{nil}, which is the default, the subject
7906change is ignored. If it is @code{nil}, a change in the subject will
7907result in a new thread.
7908
7909@item gnus-thread-indent-level
7910@vindex gnus-thread-indent-level
7911This is a number that says how much each sub-thread should be indented.
7912The default is 4.
7913
7914@item gnus-sort-gathered-threads-function
7915@vindex gnus-sort-gathered-threads-function
7916Sometimes, particularly with mailing lists, the order in which mails
7917arrive locally is not necessarily the same as the order in which they
7918arrived on the mailing list. Consequently, when sorting sub-threads
7919using the default @code{gnus-thread-sort-by-number}, responses can end
7920up appearing before the article to which they are responding to.
7921Setting this variable to an alternate value
7922(e.g. @code{gnus-thread-sort-by-date}), in a group's parameters or in an
7923appropriate hook (e.g. @code{gnus-summary-generate-hook}) can produce a
7924more logical sub-thread ordering in such instances.
7925
7926@end table
7927
7928
7929@node Low-Level Threading
7930@subsubsection Low-Level Threading
7931
7932@table @code
7933
7934@item gnus-parse-headers-hook
7935@vindex gnus-parse-headers-hook
7936Hook run before parsing any headers.
7937
7938@item gnus-alter-header-function
7939@vindex gnus-alter-header-function
7940If non-@code{nil}, this function will be called to allow alteration of
7941article header structures. The function is called with one parameter,
7942the article header vector, which it may alter in any way. For instance,
7943if you have a mail-to-news gateway which alters the @code{Message-ID}s
7944in systematic ways (by adding prefixes and such), you can use this
7945variable to un-scramble the @code{Message-ID}s so that they are more
7946meaningful. Here's one example:
7947
7948@lisp
7949(setq gnus-alter-header-function 'my-alter-message-id)
7950
7951(defun my-alter-message-id (header)
7952 (let ((id (mail-header-id header)))
7953 (when (string-match
7954 "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id)
7955 (mail-header-set-id
7956 (concat (match-string 1 id) "@@" (match-string 2 id))
7957 header))))
7958@end lisp
7959
7960@end table
7961
7962
7963@node Thread Commands
7964@subsection Thread Commands
7965@cindex thread commands
7966
7967@table @kbd
7968
7969@item T k
7970@itemx C-M-k
7971@kindex T k (Summary)
7972@kindex C-M-k (Summary)
7973@findex gnus-summary-kill-thread
7974Mark all articles in the current (sub-)thread as read
7975(@code{gnus-summary-kill-thread}). If the prefix argument is positive,
7976remove all marks instead. If the prefix argument is negative, tick
7977articles instead.
7978
7979@item T l
7980@itemx C-M-l
7981@kindex T l (Summary)
7982@kindex C-M-l (Summary)
7983@findex gnus-summary-lower-thread
7984Lower the score of the current (sub-)thread
7985(@code{gnus-summary-lower-thread}).
7986
7987@item T i
7988@kindex T i (Summary)
7989@findex gnus-summary-raise-thread
7990Increase the score of the current (sub-)thread
7991(@code{gnus-summary-raise-thread}).
7992
7993@item T #
7994@kindex T # (Summary)
7995@findex gnus-uu-mark-thread
7996Set the process mark on the current (sub-)thread
7997(@code{gnus-uu-mark-thread}).
7998
7999@item T M-#
8000@kindex T M-# (Summary)
8001@findex gnus-uu-unmark-thread
8002Remove the process mark from the current (sub-)thread
8003(@code{gnus-uu-unmark-thread}).
8004
8005@item T T
8006@kindex T T (Summary)
8007@findex gnus-summary-toggle-threads
8008Toggle threading (@code{gnus-summary-toggle-threads}).
8009
8010@item T s
8011@kindex T s (Summary)
8012@findex gnus-summary-show-thread
8013Expose the (sub-)thread hidden under the current article, if any@*
8014(@code{gnus-summary-show-thread}).
8015
8016@item T h
8017@kindex T h (Summary)
8018@findex gnus-summary-hide-thread
8019Hide the current (sub-)thread (@code{gnus-summary-hide-thread}).
8020
8021@item T S
8022@kindex T S (Summary)
8023@findex gnus-summary-show-all-threads
8024Expose all hidden threads (@code{gnus-summary-show-all-threads}).
8025
8026@item T H
8027@kindex T H (Summary)
8028@findex gnus-summary-hide-all-threads
8029Hide all threads (@code{gnus-summary-hide-all-threads}).
8030
8031@item T t
8032@kindex T t (Summary)
8033@findex gnus-summary-rethread-current
8034Re-thread the current article's thread
8035(@code{gnus-summary-rethread-current}). This works even when the
8036summary buffer is otherwise unthreaded.
8037
8038@item T ^
8039@kindex T ^ (Summary)
8040@findex gnus-summary-reparent-thread
8041Make the current article the child of the marked (or previous) article
8042(@code{gnus-summary-reparent-thread}).
8043
01c52d31
MB
8044@item T M-^
8045@kindex T M-^ (Summary)
8046@findex gnus-summary-reparent-children
8047Make the current article the parent of the marked articles
8048(@code{gnus-summary-reparent-children}).
8049
4009494e
GM
8050@end table
8051
8052The following commands are thread movement commands. They all
8053understand the numeric prefix.
8054
8055@table @kbd
8056
8057@item T n
8058@kindex T n (Summary)
8059@itemx C-M-f
8060@kindex C-M-n (Summary)
8061@itemx M-down
8062@kindex M-down (Summary)
8063@findex gnus-summary-next-thread
8064Go to the next thread (@code{gnus-summary-next-thread}).
8065
8066@item T p
8067@kindex T p (Summary)
8068@itemx C-M-b
8069@kindex C-M-p (Summary)
8070@itemx M-up
8071@kindex M-up (Summary)
8072@findex gnus-summary-prev-thread
8073Go to the previous thread (@code{gnus-summary-prev-thread}).
8074
8075@item T d
8076@kindex T d (Summary)
8077@findex gnus-summary-down-thread
8078Descend the thread (@code{gnus-summary-down-thread}).
8079
8080@item T u
8081@kindex T u (Summary)
8082@findex gnus-summary-up-thread
8083Ascend the thread (@code{gnus-summary-up-thread}).
8084
8085@item T o
8086@kindex T o (Summary)
8087@findex gnus-summary-top-thread
8088Go to the top of the thread (@code{gnus-summary-top-thread}).
8089@end table
8090
8091@vindex gnus-thread-operation-ignore-subject
8092If you ignore subject while threading, you'll naturally end up with
8093threads that have several different subjects in them. If you then issue
8094a command like @kbd{T k} (@code{gnus-summary-kill-thread}) you might not
8095wish to kill the entire thread, but just those parts of the thread that
8096have the same subject as the current article. If you like this idea,
8097you can fiddle with @code{gnus-thread-operation-ignore-subject}. If it
8098is non-@code{nil} (which it is by default), subjects will be ignored
8099when doing thread commands. If this variable is @code{nil}, articles in
8100the same thread with different subjects will not be included in the
8101operation in question. If this variable is @code{fuzzy}, only articles
8102that have subjects fuzzily equal will be included (@pxref{Fuzzy
8103Matching}).
8104
8105
8106@node Sorting the Summary Buffer
8107@section Sorting the Summary Buffer
8108
8109@findex gnus-thread-sort-by-total-score
8110@findex gnus-thread-sort-by-date
8111@findex gnus-thread-sort-by-score
8112@findex gnus-thread-sort-by-subject
8113@findex gnus-thread-sort-by-author
01c52d31 8114@findex gnus-thread-sort-by-recipient
4009494e
GM
8115@findex gnus-thread-sort-by-number
8116@findex gnus-thread-sort-by-random
8117@vindex gnus-thread-sort-functions
8118@findex gnus-thread-sort-by-most-recent-number
8119@findex gnus-thread-sort-by-most-recent-date
8120If you are using a threaded summary display, you can sort the threads by
8121setting @code{gnus-thread-sort-functions}, which can be either a single
8122function, a list of functions, or a list containing functions and
8123@code{(not some-function)} elements.
8124
8125By default, sorting is done on article numbers. Ready-made sorting
8126predicate functions include @code{gnus-thread-sort-by-number},
01c52d31
MB
8127@code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-recipient},
8128@code{gnus-thread-sort-by-subject},
8129@code{gnus-thread-sort-by-date},
8130@code{gnus-thread-sort-by-score},
4009494e
GM
8131@code{gnus-thread-sort-by-most-recent-number},
8132@code{gnus-thread-sort-by-most-recent-date},
8133@code{gnus-thread-sort-by-random} and
8134@code{gnus-thread-sort-by-total-score}.
8135
8136Each function takes two threads and returns non-@code{nil} if the first
8137thread should be sorted before the other. Note that sorting really is
8138normally done by looking only at the roots of each thread.
8139
8140If you use more than one function, the primary sort key should be the
8141last function in the list. You should probably always include
8142@code{gnus-thread-sort-by-number} in the list of sorting
8143functions---preferably first. This will ensure that threads that are
8144equal with respect to the other sort criteria will be displayed in
8145ascending article order.
8146
8147If you would like to sort by reverse score, then by subject, and finally
8148by number, you could do something like:
8149
8150@lisp
8151(setq gnus-thread-sort-functions
8152 '(gnus-thread-sort-by-number
8153 gnus-thread-sort-by-subject
8154 (not gnus-thread-sort-by-total-score)))
8155@end lisp
8156
8157The threads that have highest score will be displayed first in the
8158summary buffer. When threads have the same score, they will be sorted
8159alphabetically. The threads that have the same score and the same
8160subject will be sorted by number, which is (normally) the sequence in
8161which the articles arrived.
8162
8163If you want to sort by score and then reverse arrival order, you could
8164say something like:
8165
8166@lisp
8167(setq gnus-thread-sort-functions
01c52d31 8168 '((not gnus-thread-sort-by-number)
4009494e
GM
8169 gnus-thread-sort-by-score))
8170@end lisp
8171
8172@vindex gnus-thread-score-function
8173The function in the @code{gnus-thread-score-function} variable (default
8174@code{+}) is used for calculating the total score of a thread. Useful
8175functions might be @code{max}, @code{min}, or squared means, or whatever
8176tickles your fancy.
8177
8178@findex gnus-article-sort-functions
8179@findex gnus-article-sort-by-date
6ecfe5c2 8180@findex gnus-article-sort-by-most-recent-date
4009494e
GM
8181@findex gnus-article-sort-by-score
8182@findex gnus-article-sort-by-subject
8183@findex gnus-article-sort-by-author
8184@findex gnus-article-sort-by-random
8185@findex gnus-article-sort-by-number
6ecfe5c2 8186@findex gnus-article-sort-by-most-recent-number
4009494e
GM
8187If you are using an unthreaded display for some strange reason or
8188other, you have to fiddle with the @code{gnus-article-sort-functions}
8189variable. It is very similar to the
8190@code{gnus-thread-sort-functions}, except that it uses slightly
8191different functions for article comparison. Available sorting
8192predicate functions are @code{gnus-article-sort-by-number},
8193@code{gnus-article-sort-by-author},
8194@code{gnus-article-sort-by-subject}, @code{gnus-article-sort-by-date},
8195@code{gnus-article-sort-by-random}, and
8196@code{gnus-article-sort-by-score}.
8197
8198If you want to sort an unthreaded summary display by subject, you could
8199say something like:
8200
8201@lisp
8202(setq gnus-article-sort-functions
8203 '(gnus-article-sort-by-number
8204 gnus-article-sort-by-subject))
8205@end lisp
8206
01c52d31
MB
8207You can define group specific sorting via @code{gnus-parameters},
8208@xref{Group Parameters}.
4009494e
GM
8209
8210
8211@node Asynchronous Fetching
8212@section Asynchronous Article Fetching
8213@cindex asynchronous article fetching
8214@cindex article pre-fetch
8215@cindex pre-fetch
8216
8217If you read your news from an @acronym{NNTP} server that's far away, the
8218network latencies may make reading articles a chore. You have to wait
8219for a while after pressing @kbd{n} to go to the next article before the
8220article appears. Why can't Gnus just go ahead and fetch the article
8221while you are reading the previous one? Why not, indeed.
8222
8223First, some caveats. There are some pitfalls to using asynchronous
8224article fetching, especially the way Gnus does it.
8225
8226Let's say you are reading article 1, which is short, and article 2 is
8227quite long, and you are not interested in reading that. Gnus does not
8228know this, so it goes ahead and fetches article 2. You decide to read
8229article 3, but since Gnus is in the process of fetching article 2, the
8230connection is blocked.
8231
8232To avoid these situations, Gnus will open two (count 'em two)
8233connections to the server. Some people may think this isn't a very nice
8234thing to do, but I don't see any real alternatives. Setting up that
8235extra connection takes some time, so Gnus startup will be slower.
8236
8237Gnus will fetch more articles than you will read. This will mean that
8238the link between your machine and the @acronym{NNTP} server will become more
8239loaded than if you didn't use article pre-fetch. The server itself will
8240also become more loaded---both with the extra article requests, and the
8241extra connection.
8242
8243Ok, so now you know that you shouldn't really use this thing@dots{} unless
8244you really want to.
8245
8246@vindex gnus-asynchronous
8247Here's how: Set @code{gnus-asynchronous} to @code{t}. The rest should
8248happen automatically.
8249
8250@vindex gnus-use-article-prefetch
8251You can control how many articles are to be pre-fetched by setting
8252@code{gnus-use-article-prefetch}. This is 30 by default, which means
8253that when you read an article in the group, the back end will pre-fetch
8254the next 30 articles. If this variable is @code{t}, the back end will
8255pre-fetch all the articles it can without bound. If it is
8256@code{nil}, no pre-fetching will be done.
8257
8258@vindex gnus-async-prefetch-article-p
8259@findex gnus-async-unread-p
8260There are probably some articles that you don't want to pre-fetch---read
8261articles, for instance. The @code{gnus-async-prefetch-article-p}
8262variable controls whether an article is to be pre-fetched. This
8263function should return non-@code{nil} when the article in question is
8264to be pre-fetched. The default is @code{gnus-async-unread-p}, which
8265returns @code{nil} on read articles. The function is called with an
8266article data structure as the only parameter.
8267
8268If, for instance, you wish to pre-fetch only unread articles shorter
8269than 100 lines, you could say something like:
8270
8271@lisp
8272(defun my-async-short-unread-p (data)
8273 "Return non-nil for short, unread articles."
8274 (and (gnus-data-unread-p data)
8275 (< (mail-header-lines (gnus-data-header data))
8276 100)))
8277
8278(setq gnus-async-prefetch-article-p 'my-async-short-unread-p)
8279@end lisp
8280
8281These functions will be called many, many times, so they should
8282preferably be short and sweet to avoid slowing down Gnus too much.
8283It's probably a good idea to byte-compile things like this.
8284
85115796
KY
8285@vindex gnus-async-post-fetch-function
8286@findex gnus-html-prefetch-images
8287After an article has been prefetched, this
8288@code{gnus-async-post-fetch-function} will be called. The buffer will
8289be narrowed to the region of the article that was fetched. A useful
8290value would be @code{gnus-html-prefetch-images}, which will prefetch
8291and store images referenced in the article, so that you don't have to
8292wait for them to be fetched when you read the article. This is useful
8293for @acronym{HTML} messages that have external images.
8294
4009494e
GM
8295@vindex gnus-prefetched-article-deletion-strategy
8296Articles have to be removed from the asynch buffer sooner or later. The
8297@code{gnus-prefetched-article-deletion-strategy} says when to remove
8298articles. This is a list that may contain the following elements:
8299
8300@table @code
8301@item read
8302Remove articles when they are read.
8303
8304@item exit
8305Remove articles when exiting the group.
8306@end table
8307
8308The default value is @code{(read exit)}.
8309
8310@c @vindex gnus-use-header-prefetch
8311@c If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles
8312@c from the next group.
8313
8314
8315@node Article Caching
8316@section Article Caching
8317@cindex article caching
8318@cindex caching
8319
8320If you have an @emph{extremely} slow @acronym{NNTP} connection, you may
8321consider turning article caching on. Each article will then be stored
8322locally under your home directory. As you may surmise, this could
8323potentially use @emph{huge} amounts of disk space, as well as eat up all
8324your inodes so fast it will make your head swim. In vodka.
8325
8326Used carefully, though, it could be just an easier way to save articles.
8327
8328@vindex gnus-use-long-file-name
8329@vindex gnus-cache-directory
8330@vindex gnus-use-cache
8331To turn caching on, set @code{gnus-use-cache} to @code{t}. By default,
8332all articles ticked or marked as dormant will then be copied
8333over to your local cache (@code{gnus-cache-directory}). Whether this
8334cache is flat or hierarchical is controlled by the
8335@code{gnus-use-long-file-name} variable, as usual.
8336
8337When re-selecting a ticked or dormant article, it will be fetched from the
8338cache instead of from the server. As articles in your cache will never
8339expire, this might serve as a method of saving articles while still
8340keeping them where they belong. Just mark all articles you want to save
8341as dormant, and don't worry.
8342
8343When an article is marked as read, is it removed from the cache.
8344
8345@vindex gnus-cache-remove-articles
8346@vindex gnus-cache-enter-articles
8347The entering/removal of articles from the cache is controlled by the
8348@code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}
8349variables. Both are lists of symbols. The first is @code{(ticked
8350dormant)} by default, meaning that ticked and dormant articles will be
8351put in the cache. The latter is @code{(read)} by default, meaning that
8352articles marked as read are removed from the cache. Possibly
8353symbols in these two lists are @code{ticked}, @code{dormant},
8354@code{unread} and @code{read}.
8355
8356@findex gnus-jog-cache
8357So where does the massive article-fetching and storing come into the
8358picture? The @code{gnus-jog-cache} command will go through all
8359subscribed newsgroups, request all unread articles, score them, and
8360store them in the cache. You should only ever, ever ever ever, use this
8361command if 1) your connection to the @acronym{NNTP} server is really, really,
8362really slow and 2) you have a really, really, really huge disk.
8363Seriously. One way to cut down on the number of articles downloaded is
8364to score unwanted articles down and have them marked as read. They will
8365not then be downloaded by this command.
8366
8367@vindex gnus-uncacheable-groups
8368@vindex gnus-cacheable-groups
8369It is likely that you do not want caching on all groups. For instance,
8370if your @code{nnml} mail is located under your home directory, it makes no
8371sense to cache it somewhere else under your home directory. Unless you
8372feel that it's neat to use twice as much space.
8373
8374To limit the caching, you could set @code{gnus-cacheable-groups} to a
8375regexp of groups to cache, @samp{^nntp} for instance, or set the
8376@code{gnus-uncacheable-groups} regexp to @samp{^nnml}, for instance.
8377Both variables are @code{nil} by default. If a group matches both
8378variables, the group is not cached.
8379
8380@findex gnus-cache-generate-nov-databases
8381@findex gnus-cache-generate-active
8382@vindex gnus-cache-active-file
8383The cache stores information on what articles it contains in its active
8384file (@code{gnus-cache-active-file}). If this file (or any other parts
8385of the cache) becomes all messed up for some reason or other, Gnus
8386offers two functions that will try to set things right. @kbd{M-x
8387gnus-cache-generate-nov-databases} will (re)build all the @acronym{NOV}
8388files, and @kbd{gnus-cache-generate-active} will (re)generate the active
8389file.
8390
8391@findex gnus-cache-move-cache
8392@code{gnus-cache-move-cache} will move your whole
8393@code{gnus-cache-directory} to some other location. You get asked to
8394where, isn't that cool?
8395
8396@node Persistent Articles
8397@section Persistent Articles
8398@cindex persistent articles
8399
8400Closely related to article caching, we have @dfn{persistent articles}.
8401In fact, it's just a different way of looking at caching, and much more
8402useful in my opinion.
8403
8404Say you're reading a newsgroup, and you happen on to some valuable gem
8405that you want to keep and treasure forever. You'd normally just save it
8406(using one of the many saving commands) in some file. The problem with
8407that is that it's just, well, yucky. Ideally you'd prefer just having
8408the article remain in the group where you found it forever; untouched by
8409the expiry going on at the news server.
8410
8411This is what a @dfn{persistent article} is---an article that just won't
8412be deleted. It's implemented using the normal cache functions, but
8413you use two explicit commands for managing persistent articles:
8414
8415@table @kbd
8416
8417@item *
8418@kindex * (Summary)
8419@findex gnus-cache-enter-article
8420Make the current article persistent (@code{gnus-cache-enter-article}).
8421
8422@item M-*
8423@kindex M-* (Summary)
8424@findex gnus-cache-remove-article
8425Remove the current article from the persistent articles
8426(@code{gnus-cache-remove-article}). This will normally delete the
8427article.
8428@end table
8429
8430Both these commands understand the process/prefix convention.
8431
8432To avoid having all ticked articles (and stuff) entered into the cache,
8433you should set @code{gnus-use-cache} to @code{passive} if you're just
8434interested in persistent articles:
8435
8436@lisp
8437(setq gnus-use-cache 'passive)
8438@end lisp
8439
01c52d31
MB
8440@node Sticky Articles
8441@section Sticky Articles
8442@cindex sticky articles
8443
8444When you select an article the current article buffer will be reused
8445according to the value of the variable
8446@code{gnus-single-article-buffer}. If its value is non-@code{nil} (the
8447default) all articles reuse the same article buffer. Else each group
8448has its own article buffer.
8449
8450This implies that it's not possible to have more than one article buffer
8451in a group at a time. But sometimes you might want to display all the
8452latest emails from your mother, your father, your aunt, your uncle and
8453your 17 cousins to coordinate the next christmas party.
8454
8455That's where sticky articles come in handy. A sticky article buffer
8456basically is a normal article buffer, but it won't be reused when you
8457select another article. You can make an article sticky with:
8458
8459@table @kbd
8460@item A S
8461@kindex A S (Summary)
8462@findex gnus-sticky-article
8463Make the current article sticky. If a prefix arg is given, ask for a
8464name for this sticky article buffer.
8465@end table
8466
8467To close a sticky article buffer you can use these commands:
8468
8469@table @kbd
8470@item q
8471@kindex q (Article)
8472@findex bury-buffer
8473Puts this sticky article buffer at the end of the list of all buffers.
8474
8475@item k
8476@kindex k (Article)
8477@findex gnus-kill-sticky-article-buffer
8478Kills this sticky article buffer.
8479@end table
8480
8481To kill all sticky article buffers you can use:
8482
8483@defun gnus-kill-sticky-article-buffers ARG
8484Kill all sticky article buffers.
8485If a prefix ARG is given, ask for confirmation.
8486@end defun
4009494e
GM
8487
8488@node Article Backlog
8489@section Article Backlog
8490@cindex backlog
8491@cindex article backlog
8492
8493If you have a slow connection, but the idea of using caching seems
8494unappealing to you (and it is, really), you can help the situation some
8495by switching on the @dfn{backlog}. This is where Gnus will buffer
8496already read articles so that it doesn't have to re-fetch articles
8497you've already read. This only helps if you are in the habit of
8498re-selecting articles you've recently read, of course. If you never do
8499that, turning the backlog on will slow Gnus down a little bit, and
8500increase memory usage some.
8501
8502@vindex gnus-keep-backlog
8503If you set @code{gnus-keep-backlog} to a number @var{n}, Gnus will store
8504at most @var{n} old articles in a buffer for later re-fetching. If this
8505variable is non-@code{nil} and is not a number, Gnus will store
8506@emph{all} read articles, which means that your Emacs will grow without
8507bound before exploding and taking your machine down with you. I put
8508that in there just to keep y'all on your toes.
8509
8510The default value is 20.
8511
8512
8513@node Saving Articles
8514@section Saving Articles
8515@cindex saving articles
8516
8517Gnus can save articles in a number of ways. Below is the documentation
8518for saving articles in a fairly straight-forward fashion (i.e., little
8519processing of the article is done before it is saved). For a different
8520approach (uudecoding, unsharing) you should use @code{gnus-uu}
8521(@pxref{Decoding Articles}).
8522
8523For the commands listed here, the target is a file. If you want to
8524save to a group, see the @kbd{B c} (@code{gnus-summary-copy-article})
8525command (@pxref{Mail Group Commands}).
8526
8527@vindex gnus-save-all-headers
8528If @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not delete
8529unwanted headers before saving the article.
8530
8531@vindex gnus-saved-headers
8532If the preceding variable is @code{nil}, all headers that match the
8533@code{gnus-saved-headers} regexp will be kept, while the rest will be
8534deleted before saving.
8535
8536@table @kbd
8537
8538@item O o
8539@itemx o
8540@kindex O o (Summary)
8541@kindex o (Summary)
8542@findex gnus-summary-save-article
8543@c @icon{gnus-summary-save-article}
8544Save the current article using the default article saver
8545(@code{gnus-summary-save-article}).
8546
8547@item O m
8548@kindex O m (Summary)
8549@findex gnus-summary-save-article-mail
8550Save the current article in a Unix mail box (mbox) file
8551(@code{gnus-summary-save-article-mail}).
8552
8553@item O r
8554@kindex O r (Summary)
8555@findex gnus-summary-save-article-rmail
8556Save the current article in Rmail format
bc79f9ab
GM
8557(@code{gnus-summary-save-article-rmail}). This is mbox since Emacs 23,
8558Babyl in older versions.
4009494e
GM
8559
8560@item O f
8561@kindex O f (Summary)
8562@findex gnus-summary-save-article-file
8563@c @icon{gnus-summary-save-article-file}
8564Save the current article in plain file format
8565(@code{gnus-summary-save-article-file}).
8566
8567@item O F
8568@kindex O F (Summary)
8569@findex gnus-summary-write-article-file
8570Write the current article in plain file format, overwriting any previous
8571file contents (@code{gnus-summary-write-article-file}).
8572
8573@item O b
8574@kindex O b (Summary)
8575@findex gnus-summary-save-article-body-file
8576Save the current article body in plain file format
8577(@code{gnus-summary-save-article-body-file}).
8578
8579@item O h
8580@kindex O h (Summary)
8581@findex gnus-summary-save-article-folder
8582Save the current article in mh folder format
8583(@code{gnus-summary-save-article-folder}).
8584
8585@item O v
8586@kindex O v (Summary)
8587@findex gnus-summary-save-article-vm
8588Save the current article in a VM folder
8589(@code{gnus-summary-save-article-vm}).
8590
8591@item O p
8592@itemx |
8593@kindex O p (Summary)
8594@kindex | (Summary)
8595@findex gnus-summary-pipe-output
89167438 8596@vindex gnus-summary-pipe-output-default-command
4009494e
GM
8597Save the current article in a pipe. Uhm, like, what I mean is---Pipe
8598the current article to a process (@code{gnus-summary-pipe-output}).
8599If given a symbolic prefix (@pxref{Symbolic Prefixes}), include the
6ecfe5c2
MB
8600complete headers in the piped output. The symbolic prefix @code{r} is
8601special; it lets this command pipe a raw article including all headers.
8602The @code{gnus-summary-pipe-output-default-command} variable can be set
8603to a string containing the default command and options (default
8604@code{nil}).
4009494e
GM
8605
8606@item O P
8607@kindex O P (Summary)
8608@findex gnus-summary-muttprint
8609@vindex gnus-summary-muttprint-program
8610Save the current article into muttprint. That is, print it using the
8611external program @uref{http://muttprint.sourceforge.net/,
8612Muttprint}. The program name and options to use is controlled by the
8613variable @code{gnus-summary-muttprint-program}.
8614(@code{gnus-summary-muttprint}).
8615
8616@end table
8617
8618@vindex gnus-prompt-before-saving
8619All these commands use the process/prefix convention
8620(@pxref{Process/Prefix}). If you save bunches of articles using these
8621functions, you might get tired of being prompted for files to save each
8622and every article in. The prompting action is controlled by
8623the @code{gnus-prompt-before-saving} variable, which is @code{always} by
8624default, giving you that excessive prompting action you know and
8625loathe. If you set this variable to @code{t} instead, you'll be prompted
8626just once for each series of articles you save. If you like to really
8627have Gnus do all your thinking for you, you can even set this variable
8628to @code{nil}, which means that you will never be prompted for files to
8629save articles in. Gnus will simply save all the articles in the default
8630files.
8631
8632
8633@vindex gnus-default-article-saver
8634You can customize the @code{gnus-default-article-saver} variable to make
8635Gnus do what you want it to. You can use any of the eight ready-made
8636functions below, or you can create your own.
8637
8638@table @code
8639
8640@item gnus-summary-save-in-rmail
8641@findex gnus-summary-save-in-rmail
8642@vindex gnus-rmail-save-name
8643@findex gnus-plain-save-name
bc79f9ab
GM
8644This is the default format, that used by the Rmail package. Since Emacs
864523, Rmail uses standard mbox format. Before this, it used the
8646@dfn{Babyl} format. Accordingly, this command writes mbox format since
8647Emacs 23, unless appending to an existing Babyl file. In older versions
8648of Emacs, it always uses Babyl format. Uses the function in the
4009494e
GM
8649@code{gnus-rmail-save-name} variable to get a file name to save the
8650article in. The default is @code{gnus-plain-save-name}.
8651
8652@item gnus-summary-save-in-mail
8653@findex gnus-summary-save-in-mail
8654@vindex gnus-mail-save-name
8655Save in a Unix mail (mbox) file. Uses the function in the
8656@code{gnus-mail-save-name} variable to get a file name to save the
8657article in. The default is @code{gnus-plain-save-name}.
8658
8659@item gnus-summary-save-in-file
8660@findex gnus-summary-save-in-file
8661@vindex gnus-file-save-name
8662@findex gnus-numeric-save-name
8663Append the article straight to an ordinary file. Uses the function in
8664the @code{gnus-file-save-name} variable to get a file name to save the
8665article in. The default is @code{gnus-numeric-save-name}.
8666
8667@item gnus-summary-write-to-file
8668@findex gnus-summary-write-to-file
8669Write the article straight to an ordinary file. The file is
8670overwritten if it exists. Uses the function in the
8671@code{gnus-file-save-name} variable to get a file name to save the
8672article in. The default is @code{gnus-numeric-save-name}.
8673
8674@item gnus-summary-save-body-in-file
8675@findex gnus-summary-save-body-in-file
8676Append the article body to an ordinary file. Uses the function in the
8677@code{gnus-file-save-name} variable to get a file name to save the
8678article in. The default is @code{gnus-numeric-save-name}.
8679
8680@item gnus-summary-write-body-to-file
8681@findex gnus-summary-write-body-to-file
8682Write the article body straight to an ordinary file. The file is
8683overwritten if it exists. Uses the function in the
8684@code{gnus-file-save-name} variable to get a file name to save the
8685article in. The default is @code{gnus-numeric-save-name}.
8686
8687@item gnus-summary-save-in-folder
8688@findex gnus-summary-save-in-folder
8689@findex gnus-folder-save-name
8690@findex gnus-Folder-save-name
8691@vindex gnus-folder-save-name
8692@cindex rcvstore
8693@cindex MH folders
8694Save the article to an MH folder using @code{rcvstore} from the MH
8695library. Uses the function in the @code{gnus-folder-save-name} variable
8696to get a file name to save the article in. The default is
8697@code{gnus-folder-save-name}, but you can also use
8698@code{gnus-Folder-save-name}, which creates capitalized names.
8699
8700@item gnus-summary-save-in-vm
8701@findex gnus-summary-save-in-vm
8702Save the article in a VM folder. You have to have the VM mail
8703reader to use this setting.
89167438
MB
8704
8705@item gnus-summary-save-in-pipe
8706@findex gnus-summary-save-in-pipe
d62672f3
MB
8707Pipe the article to a shell command. This function takes optional two
8708arguments COMMAND and RAW. Valid values for COMMAND include:
8709
8710@itemize @bullet
8711@item a string@*
8712The executable command name and possibly arguments.
8713@item @code{nil}@*
8714You will be prompted for the command in the minibuffer.
8715@item the symbol @code{default}@*
8716It will be replaced with the command which the variable
8717@code{gnus-summary-pipe-output-default-command} holds or the command
8718last used for saving.
8719@end itemize
8720
8721Non-@code{nil} value for RAW overrides @code{:decode} and
8722@code{:headers} properties (see below) and the raw article including all
8723headers will be piped.
4009494e
GM
8724@end table
8725
8726The symbol of each function may have the following properties:
8727
8728@table @code
8729@item :decode
8730The value non-@code{nil} means save decoded articles. This is
8731meaningful only with @code{gnus-summary-save-in-file},
8732@code{gnus-summary-save-body-in-file},
89167438
MB
8733@code{gnus-summary-write-to-file},
8734@code{gnus-summary-write-body-to-file}, and
8735@code{gnus-summary-save-in-pipe}.
4009494e
GM
8736
8737@item :function
8738The value specifies an alternative function which appends, not
8739overwrites, articles to a file. This implies that when saving many
8740articles at a time, @code{gnus-prompt-before-saving} is bound to
8741@code{t} and all articles are saved in a single file. This is
8742meaningful only with @code{gnus-summary-write-to-file} and
8743@code{gnus-summary-write-body-to-file}.
8744
8745@item :headers
8746The value specifies the symbol of a variable of which the value
8747specifies headers to be saved. If it is omitted,
8748@code{gnus-save-all-headers} and @code{gnus-saved-headers} control what
8749headers should be saved.
8750@end table
8751
8752@vindex gnus-article-save-directory
8753All of these functions, except for the last one, will save the article
8754in the @code{gnus-article-save-directory}, which is initialized from the
8755@env{SAVEDIR} environment variable. This is @file{~/News/} by
8756default.
8757
8758As you can see above, the functions use different functions to find a
8759suitable name of a file to save the article in. Below is a list of
8760available functions that generate names:
8761
8762@table @code
8763
8764@item gnus-Numeric-save-name
8765@findex gnus-Numeric-save-name
8766File names like @file{~/News/Alt.andrea-dworkin/45}.
8767
8768@item gnus-numeric-save-name
8769@findex gnus-numeric-save-name
8770File names like @file{~/News/alt.andrea-dworkin/45}.
8771
8772@item gnus-Plain-save-name
8773@findex gnus-Plain-save-name
8774File names like @file{~/News/Alt.andrea-dworkin}.
8775
8776@item gnus-plain-save-name
8777@findex gnus-plain-save-name
8778File names like @file{~/News/alt.andrea-dworkin}.
8779
8780@item gnus-sender-save-name
8781@findex gnus-sender-save-name
8782File names like @file{~/News/larsi}.
8783@end table
8784
8785@vindex gnus-split-methods
8786You can have Gnus suggest where to save articles by plonking a regexp into
8787the @code{gnus-split-methods} alist. For instance, if you would like to
8788save articles related to Gnus in the file @file{gnus-stuff}, and articles
8789related to VM in @file{vm-stuff}, you could set this variable to something
8790like:
8791
8792@lisp
8793(("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff")
8794 ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff")
8795 (my-choosing-function "../other-dir/my-stuff")
8796 ((equal gnus-newsgroup-name "mail.misc") "mail-stuff"))
8797@end lisp
8798
8799We see that this is a list where each element is a list that has two
8800elements---the @dfn{match} and the @dfn{file}. The match can either be
8801a string (in which case it is used as a regexp to match on the article
8802head); it can be a symbol (which will be called as a function with the
8803group name as a parameter); or it can be a list (which will be
8804@code{eval}ed). If any of these actions have a non-@code{nil} result,
8805the @dfn{file} will be used as a default prompt. In addition, the
8806result of the operation itself will be used if the function or form
8807called returns a string or a list of strings.
8808
8809You basically end up with a list of file names that might be used when
8810saving the current article. (All ``matches'' will be used.) You will
8811then be prompted for what you really want to use as a name, with file
8812name completion over the results from applying this variable.
8813
8814This variable is @code{((gnus-article-archive-name))} by default, which
8815means that Gnus will look at the articles it saves for an
8816@code{Archive-name} line and use that as a suggestion for the file
8817name.
8818
8819Here's an example function to clean up file names somewhat. If you have
8820lots of mail groups called things like
8821@samp{nnml:mail.whatever}, you may want to chop off the beginning of
8822these group names before creating the file name to save to. The
8823following will do just that:
8824
8825@lisp
8826(defun my-save-name (group)
8827 (when (string-match "^nnml:mail." group)
8828 (substring group (match-end 0))))
8829
8830(setq gnus-split-methods
8831 '((gnus-article-archive-name)
8832 (my-save-name)))
8833@end lisp
8834
8835
8836@vindex gnus-use-long-file-name
8837Finally, you have the @code{gnus-use-long-file-name} variable. If it is
8838@code{nil}, all the preceding functions will replace all periods
8839(@samp{.}) in the group names with slashes (@samp{/})---which means that
8840the functions will generate hierarchies of directories instead of having
8841all the files in the top level directory
8842(@file{~/News/alt/andrea-dworkin} instead of
8843@file{~/News/alt.andrea-dworkin}.) This variable is @code{t} by default
8844on most systems. However, for historical reasons, this is @code{nil} on
8845Xenix and usg-unix-v machines by default.
8846
8847This function also affects kill and score file names. If this variable
8848is a list, and the list contains the element @code{not-score}, long file
8849names will not be used for score files, if it contains the element
8850@code{not-save}, long file names will not be used for saving, and if it
8851contains the element @code{not-kill}, long file names will not be used
8852for kill files.
8853
8854If you'd like to save articles in a hierarchy that looks something like
8855a spool, you could
8856
8857@lisp
8858(setq gnus-use-long-file-name '(not-save)) ; @r{to get a hierarchy}
8859(setq gnus-default-article-saver
8860 'gnus-summary-save-in-file) ; @r{no encoding}
8861@end lisp
8862
8863Then just save with @kbd{o}. You'd then read this hierarchy with
8864ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and
8865the top level directory as the argument (@file{~/News/}). Then just walk
8866around to the groups/directories with @code{nneething}.
8867
8868
8869@node Decoding Articles
8870@section Decoding Articles
8871@cindex decoding articles
8872
8873Sometime users post articles (or series of articles) that have been
8874encoded in some way or other. Gnus can decode them for you.
8875
8876@menu
8877* Uuencoded Articles:: Uudecode articles.
8878* Shell Archives:: Unshar articles.
8879* PostScript Files:: Split PostScript.
8880* Other Files:: Plain save and binhex.
8881* Decoding Variables:: Variables for a happy decoding.
8882* Viewing Files:: You want to look at the result of the decoding?
8883@end menu
8884
8885@cindex series
8886@cindex article series
8887All these functions use the process/prefix convention
8888(@pxref{Process/Prefix}) for finding out what articles to work on, with
8889the extension that a ``single article'' means ``a single series''. Gnus
8890can find out by itself what articles belong to a series, decode all the
8891articles and unpack/view/save the resulting file(s).
8892
8893Gnus guesses what articles are in the series according to the following
8894simplish rule: The subjects must be (nearly) identical, except for the
8895last two numbers of the line. (Spaces are largely ignored, however.)
8896
8897For example: If you choose a subject called @samp{cat.gif (2/3)}, Gnus
8898will find all the articles that match the regexp @samp{^cat.gif
8899([0-9]+/[0-9]+).*$}.
8900
8901Subjects that are non-standard, like @samp{cat.gif (2/3) Part 6 of a
8902series}, will not be properly recognized by any of the automatic viewing
8903commands, and you have to mark the articles manually with @kbd{#}.
8904
8905
8906@node Uuencoded Articles
8907@subsection Uuencoded Articles
8908@cindex uudecode
8909@cindex uuencoded articles
8910
8911@table @kbd
8912
8913@item X u
8914@kindex X u (Summary)
8915@findex gnus-uu-decode-uu
8916@c @icon{gnus-uu-decode-uu}
8917Uudecodes the current series (@code{gnus-uu-decode-uu}).
8918
8919@item X U
8920@kindex X U (Summary)
8921@findex gnus-uu-decode-uu-and-save
8922Uudecodes and saves the current series
8923(@code{gnus-uu-decode-uu-and-save}).
8924
8925@item X v u
8926@kindex X v u (Summary)
8927@findex gnus-uu-decode-uu-view
8928Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}).
8929
8930@item X v U
8931@kindex X v U (Summary)
8932@findex gnus-uu-decode-uu-and-save-view
8933Uudecodes, views and saves the current series
8934(@code{gnus-uu-decode-uu-and-save-view}).
8935
8936@end table
8937
8938Remember that these all react to the presence of articles marked with
8939the process mark. If, for instance, you'd like to decode and save an
8940entire newsgroup, you'd typically do @kbd{M P a}
8941(@code{gnus-uu-mark-all}) and then @kbd{X U}
8942(@code{gnus-uu-decode-uu-and-save}).
8943
8944All this is very much different from how @code{gnus-uu} worked with
8945@sc{gnus 4.1}, where you had explicit keystrokes for everything under
8946the sun. This version of @code{gnus-uu} generally assumes that you mark
8947articles in some way (@pxref{Setting Process Marks}) and then press
8948@kbd{X u}.
8949
8950@vindex gnus-uu-notify-files
8951Note: When trying to decode articles that have names matching
8952@code{gnus-uu-notify-files}, which is hard-coded to
8953@samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will
8954automatically post an article on @samp{comp.unix.wizards} saying that
8955you have just viewed the file in question. This feature can't be turned
8956off.
8957
8958
8959@node Shell Archives
8960@subsection Shell Archives
8961@cindex unshar
8962@cindex shell archives
8963@cindex shared articles
8964
8965Shell archives (``shar files'') used to be a popular way to distribute
8966sources, but it isn't used all that much today. In any case, we have
8967some commands to deal with these:
8968
8969@table @kbd
8970
8971@item X s
8972@kindex X s (Summary)
8973@findex gnus-uu-decode-unshar
8974Unshars the current series (@code{gnus-uu-decode-unshar}).
8975
8976@item X S
8977@kindex X S (Summary)
8978@findex gnus-uu-decode-unshar-and-save
8979Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}).
8980
8981@item X v s
8982@kindex X v s (Summary)
8983@findex gnus-uu-decode-unshar-view
8984Unshars and views the current series (@code{gnus-uu-decode-unshar-view}).
8985
8986@item X v S
8987@kindex X v S (Summary)
8988@findex gnus-uu-decode-unshar-and-save-view
8989Unshars, views and saves the current series
8990(@code{gnus-uu-decode-unshar-and-save-view}).
8991@end table
8992
8993
8994@node PostScript Files
8995@subsection PostScript Files
8996@cindex PostScript
8997
8998@table @kbd
8999
9000@item X p
9001@kindex X p (Summary)
9002@findex gnus-uu-decode-postscript
9003Unpack the current PostScript series (@code{gnus-uu-decode-postscript}).
9004
9005@item X P
9006@kindex X P (Summary)
9007@findex gnus-uu-decode-postscript-and-save
9008Unpack and save the current PostScript series
9009(@code{gnus-uu-decode-postscript-and-save}).
9010
9011@item X v p
9012@kindex X v p (Summary)
9013@findex gnus-uu-decode-postscript-view
9014View the current PostScript series
9015(@code{gnus-uu-decode-postscript-view}).
9016
9017@item X v P
9018@kindex X v P (Summary)
9019@findex gnus-uu-decode-postscript-and-save-view
9020View and save the current PostScript series
9021(@code{gnus-uu-decode-postscript-and-save-view}).
9022@end table
9023
9024
9025@node Other Files
9026@subsection Other Files
9027
9028@table @kbd
9029@item X o
9030@kindex X o (Summary)
9031@findex gnus-uu-decode-save
9032Save the current series
9033(@code{gnus-uu-decode-save}).
9034
9035@item X b
9036@kindex X b (Summary)
9037@findex gnus-uu-decode-binhex
9038Unbinhex the current series (@code{gnus-uu-decode-binhex}). This
9039doesn't really work yet.
b890d447
MB
9040
9041@item X Y
9042@kindex X Y (Summary)
9043@findex gnus-uu-decode-yenc
9044yEnc-decode the current series and save it (@code{gnus-uu-decode-yenc}).
4009494e
GM
9045@end table
9046
9047
9048@node Decoding Variables
9049@subsection Decoding Variables
9050
9051Adjective, not verb.
9052
9053@menu
9054* Rule Variables:: Variables that say how a file is to be viewed.
9055* Other Decode Variables:: Other decode variables.
9056* Uuencoding and Posting:: Variables for customizing uuencoding.
9057@end menu
9058
9059
9060@node Rule Variables
9061@subsubsection Rule Variables
9062@cindex rule variables
9063
9064Gnus uses @dfn{rule variables} to decide how to view a file. All these
9065variables are of the form
9066
9067@lisp
9068 (list '(regexp1 command2)
9069 '(regexp2 command2)
9070 ...)
9071@end lisp
9072
9073@table @code
9074
9075@item gnus-uu-user-view-rules
9076@vindex gnus-uu-user-view-rules
9077@cindex sox
9078This variable is consulted first when viewing files. If you wish to use,
9079for instance, @code{sox} to convert an @file{.au} sound file, you could
9080say something like:
9081@lisp
9082(setq gnus-uu-user-view-rules
9083 (list '("\\\\.au$" "sox %s -t .aiff > /dev/audio")))
9084@end lisp
9085
9086@item gnus-uu-user-view-rules-end
9087@vindex gnus-uu-user-view-rules-end
9088This variable is consulted if Gnus couldn't make any matches from the
9089user and default view rules.
9090
9091@item gnus-uu-user-archive-rules
9092@vindex gnus-uu-user-archive-rules
9093This variable can be used to say what commands should be used to unpack
9094archives.
9095@end table
9096
9097
9098@node Other Decode Variables
9099@subsubsection Other Decode Variables
9100
9101@table @code
9102@vindex gnus-uu-grabbed-file-functions
9103
9104@item gnus-uu-grabbed-file-functions
9105All functions in this list will be called right after each file has been
9106successfully decoded---so that you can move or view files right away,
9107and don't have to wait for all files to be decoded before you can do
9108anything. Ready-made functions you can put in this list are:
9109
9110@table @code
9111
9112@item gnus-uu-grab-view
9113@findex gnus-uu-grab-view
9114View the file.
9115
9116@item gnus-uu-grab-move
9117@findex gnus-uu-grab-move
9118Move the file (if you're using a saving function.)
9119@end table
9120
9121@item gnus-uu-be-dangerous
9122@vindex gnus-uu-be-dangerous
9123Specifies what to do if unusual situations arise during decoding. If
9124@code{nil}, be as conservative as possible. If @code{t}, ignore things
9125that didn't work, and overwrite existing files. Otherwise, ask each
9126time.
9127
9128@item gnus-uu-ignore-files-by-name
9129@vindex gnus-uu-ignore-files-by-name
9130Files with name matching this regular expression won't be viewed.
9131
9132@item gnus-uu-ignore-files-by-type
9133@vindex gnus-uu-ignore-files-by-type
9134Files with a @acronym{MIME} type matching this variable won't be viewed.
9135Note that Gnus tries to guess what type the file is based on the name.
9136@code{gnus-uu} is not a @acronym{MIME} package (yet), so this is slightly
9137kludgey.
9138
9139@item gnus-uu-tmp-dir
9140@vindex gnus-uu-tmp-dir
9141Where @code{gnus-uu} does its work.
9142
9143@item gnus-uu-do-not-unpack-archives
9144@vindex gnus-uu-do-not-unpack-archives
9145Non-@code{nil} means that @code{gnus-uu} won't peek inside archives
9146looking for files to display.
9147
9148@item gnus-uu-view-and-save
9149@vindex gnus-uu-view-and-save
9150Non-@code{nil} means that the user will always be asked to save a file
9151after viewing it.
9152
9153@item gnus-uu-ignore-default-view-rules
9154@vindex gnus-uu-ignore-default-view-rules
9155Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing
9156rules.
9157
9158@item gnus-uu-ignore-default-archive-rules
9159@vindex gnus-uu-ignore-default-archive-rules
9160Non-@code{nil} means that @code{gnus-uu} will ignore the default archive
9161unpacking commands.
9162
9163@item gnus-uu-kill-carriage-return
9164@vindex gnus-uu-kill-carriage-return
9165Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns
9166from articles.
9167
9168@item gnus-uu-unmark-articles-not-decoded
9169@vindex gnus-uu-unmark-articles-not-decoded
9170Non-@code{nil} means that @code{gnus-uu} will mark unsuccessfully
9171decoded articles as unread.
9172
9173@item gnus-uu-correct-stripped-uucode
9174@vindex gnus-uu-correct-stripped-uucode
9175Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix
9176uuencoded files that have had trailing spaces deleted.
9177
9178@item gnus-uu-pre-uudecode-hook
9179@vindex gnus-uu-pre-uudecode-hook
9180Hook run before sending a message to @code{uudecode}.
9181
9182@item gnus-uu-view-with-metamail
9183@vindex gnus-uu-view-with-metamail
9184@cindex metamail
9185Non-@code{nil} means that @code{gnus-uu} will ignore the viewing
9186commands defined by the rule variables and just fudge a @acronym{MIME}
9187content type based on the file name. The result will be fed to
9188@code{metamail} for viewing.
9189
9190@item gnus-uu-save-in-digest
9191@vindex gnus-uu-save-in-digest
9192Non-@code{nil} means that @code{gnus-uu}, when asked to save without
9193decoding, will save in digests. If this variable is @code{nil},
9194@code{gnus-uu} will just save everything in a file without any
9195embellishments. The digesting almost conforms to RFC 1153---no easy way
9196to specify any meaningful volume and issue numbers were found, so I
9197simply dropped them.
9198
9199@end table
9200
9201
9202@node Uuencoding and Posting
9203@subsubsection Uuencoding and Posting
9204
9205@table @code
9206
9207@item gnus-uu-post-include-before-composing
9208@vindex gnus-uu-post-include-before-composing
9209Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode
9210before you compose the article. If this variable is @code{t}, you can
9211either include an encoded file with @kbd{C-c C-i} or have one included
9212for you when you post the article.
9213
9214@item gnus-uu-post-length
9215@vindex gnus-uu-post-length
9216Maximum length of an article. The encoded file will be split into how
9217many articles it takes to post the entire file.
9218
9219@item gnus-uu-post-threaded
9220@vindex gnus-uu-post-threaded
9221Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a
9222thread. This may not be smart, as no other decoder I have seen is able
9223to follow threads when collecting uuencoded articles. (Well, I have
9224seen one package that does that---@code{gnus-uu}, but somehow, I don't
9225think that counts@dots{}) Default is @code{nil}.
9226
9227@item gnus-uu-post-separate-description
9228@vindex gnus-uu-post-separate-description
9229Non-@code{nil} means that the description will be posted in a separate
9230article. The first article will typically be numbered (0/x). If this
9231variable is @code{nil}, the description the user enters will be included
9232at the beginning of the first article, which will be numbered (1/x).
9233Default is @code{t}.
9234
9235@end table
9236
9237
9238@node Viewing Files
9239@subsection Viewing Files
9240@cindex viewing files
9241@cindex pseudo-articles
9242
9243After decoding, if the file is some sort of archive, Gnus will attempt
9244to unpack the archive and see if any of the files in the archive can be
9245viewed. For instance, if you have a gzipped tar file @file{pics.tar.gz}
9246containing the files @file{pic1.jpg} and @file{pic2.gif}, Gnus will
9247uncompress and de-tar the main file, and then view the two pictures.
9248This unpacking process is recursive, so if the archive contains archives
9249of archives, it'll all be unpacked.
9250
9251Finally, Gnus will normally insert a @dfn{pseudo-article} for each
9252extracted file into the summary buffer. If you go to these
9253``articles'', you will be prompted for a command to run (usually Gnus
9254will make a suggestion), and then the command will be run.
9255
9256@vindex gnus-view-pseudo-asynchronously
9257If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait
9258until the viewing is done before proceeding.
9259
9260@vindex gnus-view-pseudos
9261If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert
9262the pseudo-articles into the summary buffer, but view them
9263immediately. If this variable is @code{not-confirm}, the user won't even
9264be asked for a confirmation before viewing is done.
9265
9266@vindex gnus-view-pseudos-separately
9267If @code{gnus-view-pseudos-separately} is non-@code{nil}, one
9268pseudo-article will be created for each file to be viewed. If
9269@code{nil}, all files that use the same viewing command will be given as
9270a list of parameters to that command.
9271
9272@vindex gnus-insert-pseudo-articles
9273If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert
9274pseudo-articles when decoding. It is @code{t} by default.
9275
9276So; there you are, reading your @emph{pseudo-articles} in your
9277@emph{virtual newsgroup} from the @emph{virtual server}; and you think:
9278Why isn't anything real anymore? How did we get here?
9279
9280
9281@node Article Treatment
9282@section Article Treatment
9283
9284Reading through this huge manual, you may have quite forgotten that the
9285object of newsreaders is to actually, like, read what people have
9286written. Reading articles. Unfortunately, people are quite bad at
9287writing, so there are tons of functions and variables to make reading
9288these articles easier.
9289
9290@menu
9291* Article Highlighting:: You want to make the article look like fruit salad.
9292* Article Fontisizing:: Making emphasized text look nice.
9293* Article Hiding:: You also want to make certain info go away.
9294* Article Washing:: Lots of way-neat functions to make life better.
9295* Article Header:: Doing various header transformations.
9296* Article Buttons:: Click on URLs, Message-IDs, addresses and the like.
9297* Article Button Levels:: Controlling appearance of buttons.
9298* Article Date:: Grumble, UT!
9299* Article Display:: Display various stuff---X-Face, Picons, Smileys
9300* Article Signature:: What is a signature?
9301* Article Miscellanea:: Various other stuff.
9302@end menu
9303
9304
9305@node Article Highlighting
9306@subsection Article Highlighting
9307@cindex highlighting
9308
9309Not only do you want your article buffer to look like fruit salad, but
9310you want it to look like technicolor fruit salad.
9311
9312@table @kbd
9313
9314@item W H a
9315@kindex W H a (Summary)
9316@findex gnus-article-highlight
9317@findex gnus-article-maybe-highlight
9318Do much highlighting of the current article
9319(@code{gnus-article-highlight}). This function highlights header, cited
9320text, the signature, and adds buttons to the body and the head.
9321
9322@item W H h
9323@kindex W H h (Summary)
9324@findex gnus-article-highlight-headers
9325@vindex gnus-header-face-alist
9326Highlight the headers (@code{gnus-article-highlight-headers}). The
9327highlighting will be done according to the @code{gnus-header-face-alist}
9328variable, which is a list where each element has the form
9329@code{(@var{regexp} @var{name} @var{content})}.
9330@var{regexp} is a regular expression for matching the
9331header, @var{name} is the face used for highlighting the header name
9332(@pxref{Faces and Fonts}) and @var{content} is the face for highlighting
9333the header value. The first match made will be used. Note that
9334@var{regexp} shouldn't have @samp{^} prepended---Gnus will add one.
9335
9336@item W H c
9337@kindex W H c (Summary)
9338@findex gnus-article-highlight-citation
9339Highlight cited text (@code{gnus-article-highlight-citation}).
9340
9341Some variables to customize the citation highlights:
9342
9343@table @code
9344@vindex gnus-cite-parse-max-size
9345
9346@item gnus-cite-parse-max-size
9347If the article size in bytes is bigger than this variable (which is
934825000 by default), no citation highlighting will be performed.
9349
9350@item gnus-cite-max-prefix
9351@vindex gnus-cite-max-prefix
9352Maximum possible length for a citation prefix (default 20).
9353
9354@item gnus-cite-face-list
9355@vindex gnus-cite-face-list
9356List of faces used for highlighting citations (@pxref{Faces and Fonts}).
9357When there are citations from multiple articles in the same message,
9358Gnus will try to give each citation from each article its own face.
9359This should make it easier to see who wrote what.
9360
9361@item gnus-supercite-regexp
9362@vindex gnus-supercite-regexp
9363Regexp matching normal Supercite attribution lines.
9364
9365@item gnus-supercite-secondary-regexp
9366@vindex gnus-supercite-secondary-regexp
9367Regexp matching mangled Supercite attribution lines.
9368
9369@item gnus-cite-minimum-match-count
9370@vindex gnus-cite-minimum-match-count
9371Minimum number of identical prefixes we have to see before we believe
9372that it's a citation.
9373
9374@item gnus-cite-attribution-prefix
9375@vindex gnus-cite-attribution-prefix
9376Regexp matching the beginning of an attribution line.
9377
9378@item gnus-cite-attribution-suffix
9379@vindex gnus-cite-attribution-suffix
9380Regexp matching the end of an attribution line.
9381
9382@item gnus-cite-attribution-face
9383@vindex gnus-cite-attribution-face
9384Face used for attribution lines. It is merged with the face for the
9385cited text belonging to the attribution.
9386
9387@item gnus-cite-ignore-quoted-from
9388@vindex gnus-cite-ignore-quoted-from
9389If non-@code{nil}, no citation highlighting will be performed on lines
9390beginning with @samp{>From }. Those lines may have been quoted by MTAs
9391in order not to mix up with the envelope From line. The default value
9392is @code{t}.
9393
9394@end table
9395
9396
9397@item W H s
9398@kindex W H s (Summary)
9399@vindex gnus-signature-separator
9400@vindex gnus-signature-face
9401@findex gnus-article-highlight-signature
9402Highlight the signature (@code{gnus-article-highlight-signature}).
9403Everything after @code{gnus-signature-separator} (@pxref{Article
9404Signature}) in an article will be considered a signature and will be
9405highlighted with @code{gnus-signature-face}, which is @code{italic} by
9406default.
9407
9408@end table
9409
9410@xref{Customizing Articles}, for how to highlight articles automatically.
9411
9412
9413@node Article Fontisizing
9414@subsection Article Fontisizing
9415@cindex emphasis
9416@cindex article emphasis
9417
9418@findex gnus-article-emphasize
9419@kindex W e (Summary)
9420People commonly add emphasis to words in news articles by writing things
9421like @samp{_this_} or @samp{*this*} or @samp{/this/}. Gnus can make
9422this look nicer by running the article through the @kbd{W e}
9423(@code{gnus-article-emphasize}) command.
9424
9425@vindex gnus-emphasis-alist
9426How the emphasis is computed is controlled by the
9427@code{gnus-emphasis-alist} variable. This is an alist where the first
9428element is a regular expression to be matched. The second is a number
9429that says what regular expression grouping is used to find the entire
9430emphasized word. The third is a number that says what regexp grouping
9431should be displayed and highlighted. (The text between these two
9432groupings will be hidden.) The fourth is the face used for
9433highlighting.
9434
9435@lisp
9436(setq gnus-emphasis-alist
9437 '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline)
9438 ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold)))
9439@end lisp
9440
9441@cindex slash
9442@cindex asterisk
9443@cindex underline
9444@cindex /
9445@cindex *
9446
9447@vindex gnus-emphasis-underline
9448@vindex gnus-emphasis-bold
9449@vindex gnus-emphasis-italic
9450@vindex gnus-emphasis-underline-bold
9451@vindex gnus-emphasis-underline-italic
9452@vindex gnus-emphasis-bold-italic
9453@vindex gnus-emphasis-underline-bold-italic
9454By default, there are seven rules, and they use the following faces:
9455@code{gnus-emphasis-bold}, @code{gnus-emphasis-italic},
9456@code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic},
9457@code{gnus-emphasis-underline-italic},
9458@code{gnus-emphasis-underline-bold}, and
9459@code{gnus-emphasis-underline-bold-italic}.
9460
9461If you want to change these faces, you can either use @kbd{M-x
9462customize}, or you can use @code{copy-face}. For instance, if you want
9463to make @code{gnus-emphasis-italic} use a red face instead, you could
9464say something like:
9465
9466@lisp
9467(copy-face 'red 'gnus-emphasis-italic)
9468@end lisp
9469
9470@vindex gnus-group-highlight-words-alist
9471
9472If you want to highlight arbitrary words, you can use the
9473@code{gnus-group-highlight-words-alist} variable, which uses the same
9474syntax as @code{gnus-emphasis-alist}. The @code{highlight-words} group
9475parameter (@pxref{Group Parameters}) can also be used.
9476
9477@xref{Customizing Articles}, for how to fontize articles automatically.
9478
9479
9480@node Article Hiding
9481@subsection Article Hiding
9482@cindex article hiding
9483
9484Or rather, hiding certain things in each article. There usually is much
9485too much cruft in most articles.
9486
9487@table @kbd
9488
9489@item W W a
9490@kindex W W a (Summary)
9491@findex gnus-article-hide
9492Do quite a lot of hiding on the article buffer
9493(@kbd{gnus-article-hide}). In particular, this function will hide
9494headers, @acronym{PGP}, cited text and the signature.
9495
9496@item W W h
9497@kindex W W h (Summary)
9498@findex gnus-article-hide-headers
9499Hide headers (@code{gnus-article-hide-headers}). @xref{Hiding
9500Headers}.
9501
9502@item W W b
9503@kindex W W b (Summary)
9504@findex gnus-article-hide-boring-headers
9505Hide headers that aren't particularly interesting
9506(@code{gnus-article-hide-boring-headers}). @xref{Hiding Headers}.
9507
9508@item W W s
9509@kindex W W s (Summary)
9510@findex gnus-article-hide-signature
9511Hide signature (@code{gnus-article-hide-signature}). @xref{Article
9512Signature}.
9513
9514@item W W l
9515@kindex W W l (Summary)
9516@findex gnus-article-hide-list-identifiers
9517@vindex gnus-list-identifiers
9518Strip list identifiers specified in @code{gnus-list-identifiers}. These
9519are strings some mailing list servers add to the beginning of all
9520@code{Subject} headers---for example, @samp{[zebra 4711]}. Any leading
9521@samp{Re: } is skipped before stripping. @code{gnus-list-identifiers}
9522may not contain @code{\\(..\\)}.
9523
9524@table @code
9525
9526@item gnus-list-identifiers
9527@vindex gnus-list-identifiers
9528A regular expression that matches list identifiers to be removed from
9529subject. This can also be a list of regular expressions.
9530
9531@end table
9532
9533@item W W P
9534@kindex W W P (Summary)
9535@findex gnus-article-hide-pem
9536Hide @acronym{PEM} (privacy enhanced messages) cruft
9537(@code{gnus-article-hide-pem}).
9538
9539@item W W B
9540@kindex W W B (Summary)
9541@findex gnus-article-strip-banner
9542@vindex gnus-article-banner-alist
9543@vindex gnus-article-address-banner-alist
9544@cindex banner
9545@cindex OneList
9546@cindex stripping advertisements
9547@cindex advertisements
9548Strip the banner specified by the @code{banner} group parameter
9549(@code{gnus-article-strip-banner}). This is mainly used to hide those
9550annoying banners and/or signatures that some mailing lists and moderated
9551groups adds to all the messages. The way to use this function is to add
9552the @code{banner} group parameter (@pxref{Group Parameters}) to the
9553group you want banners stripped from. The parameter either be a string,
9554which will be interpreted as a regular expression matching text to be
9555removed, or the symbol @code{signature}, meaning that the (last)
9556signature should be removed, or other symbol, meaning that the
9557corresponding regular expression in @code{gnus-article-banner-alist} is
9558used.
9559
9560Regardless of a group, you can hide things like advertisements only when
9561the sender of an article has a certain mail address specified in
9562@code{gnus-article-address-banner-alist}.
9563
9564@table @code
9565
9566@item gnus-article-address-banner-alist
9567@vindex gnus-article-address-banner-alist
9568Alist of mail addresses and banners. Each element has the form
9569@code{(@var{address} . @var{banner})}, where @var{address} is a regexp
9570matching a mail address in the From header, @var{banner} is one of a
9571symbol @code{signature}, an item in @code{gnus-article-banner-alist},
9572a regexp and @code{nil}. If @var{address} matches author's mail
9573address, it will remove things like advertisements. For example, if a
9574sender has the mail address @samp{hail@@yoo-hoo.co.jp} and there is a
9575banner something like @samp{Do You Yoo-hoo!?} in all articles he
9576sends, you can use the following element to remove them:
9577
9578@lisp
9579("@@yoo-hoo\\.co\\.jp\\'" .
9580 "\n_+\nDo You Yoo-hoo!\\?\n.*\n.*\n")
9581@end lisp
9582
9583@end table
9584
9585@item W W c
9586@kindex W W c (Summary)
9587@findex gnus-article-hide-citation
9588Hide citation (@code{gnus-article-hide-citation}). Some variables for
9589customizing the hiding:
9590
9591@table @code
9592
9593@item gnus-cited-opened-text-button-line-format
9594@itemx gnus-cited-closed-text-button-line-format
9595@vindex gnus-cited-closed-text-button-line-format
9596@vindex gnus-cited-opened-text-button-line-format
9597Gnus adds buttons to show where the cited text has been hidden, and to
9598allow toggle hiding the text. The format of the variable is specified
9599by these format-like variable (@pxref{Formatting Variables}). These
9600specs are valid:
9601
9602@table @samp
9603@item b
9604Starting point of the hidden text.
9605@item e
9606Ending point of the hidden text.
9607@item l
9608Number of characters in the hidden region.
9609@item n
9610Number of lines of hidden text.
9611@end table
9612
9613@item gnus-cited-lines-visible
9614@vindex gnus-cited-lines-visible
9615The number of lines at the beginning of the cited text to leave
9616shown. This can also be a cons cell with the number of lines at the top
9617and bottom of the text, respectively, to remain visible.
9618
9619@end table
9620
9621@item W W C-c
9622@kindex W W C-c (Summary)
9623@findex gnus-article-hide-citation-maybe
9624
9625Hide citation (@code{gnus-article-hide-citation-maybe}) depending on the
9626following two variables:
9627
9628@table @code
9629@item gnus-cite-hide-percentage
9630@vindex gnus-cite-hide-percentage
9631If the cited text is of a bigger percentage than this variable (default
963250), hide the cited text.
9633
9634@item gnus-cite-hide-absolute
9635@vindex gnus-cite-hide-absolute
9636The cited text must have at least this length (default 10) before it
9637is hidden.
9638@end table
9639
9640@item W W C
9641@kindex W W C (Summary)
9642@findex gnus-article-hide-citation-in-followups
9643Hide cited text in articles that aren't roots
9644(@code{gnus-article-hide-citation-in-followups}). This isn't very
9645useful as an interactive command, but might be a handy function to stick
9646have happen automatically (@pxref{Customizing Articles}).
9647
9648@end table
9649
9650All these ``hiding'' commands are toggles, but if you give a negative
9651prefix to these commands, they will show what they have previously
9652hidden. If you give a positive prefix, they will always hide.
9653
9654Also @pxref{Article Highlighting} for further variables for
9655citation customization.
9656
9657@xref{Customizing Articles}, for how to hide article elements
9658automatically.
9659
9660
9661@node Article Washing
9662@subsection Article Washing
9663@cindex washing
9664@cindex article washing
9665
9666We call this ``article washing'' for a really good reason. Namely, the
9667@kbd{A} key was taken, so we had to use the @kbd{W} key instead.
9668
9669@dfn{Washing} is defined by us as ``changing something from something to
9670something else'', but normally results in something looking better.
9671Cleaner, perhaps.
9672
9673@xref{Customizing Articles}, if you want to change how Gnus displays
9674articles by default.
9675
9676@table @kbd
9677
9678@item C-u g
9679This is not really washing, it's sort of the opposite of washing. If
9680you type this, you see the article exactly as it exists on disk or on
9681the server.
9682
9683@item g
9684Force redisplaying of the current article
9685(@code{gnus-summary-show-article}). This is also not really washing.
9686If you type this, you see the article without any previously applied
9687interactive Washing functions but with all default treatments
9688(@pxref{Customizing Articles}).
9689
9690@item W l
9691@kindex W l (Summary)
9692@findex gnus-summary-stop-page-breaking
9693Remove page breaks from the current article
9694(@code{gnus-summary-stop-page-breaking}). @xref{Misc Article}, for page
9695delimiters.
9696
9697@item W r
9698@kindex W r (Summary)
9699@findex gnus-summary-caesar-message
9700@c @icon{gnus-summary-caesar-message}
9701Do a Caesar rotate (rot13) on the article buffer
9702(@code{gnus-summary-caesar-message}).
9703Unreadable articles that tell you to read them with Caesar rotate or rot13.
9704(Typically offensive jokes and such.)
9705
9706It's commonly called ``rot13'' because each letter is rotated 13
9707positions in the alphabet, e. g. @samp{B} (letter #2) -> @samp{O} (letter
9708#15). It is sometimes referred to as ``Caesar rotate'' because Caesar
9709is rumored to have employed this form of, uh, somewhat weak encryption.
9710
9711@item W m
9712@kindex W m (Summary)
9713@findex gnus-summary-morse-message
9714Morse decode the article buffer (@code{gnus-summary-morse-message}).
9715
01c52d31
MB
9716@item W i
9717@kindex W i (Summary)
9718@findex gnus-summary-idna-message
9719Decode IDNA encoded domain names in the current articles. IDNA
9720encoded domain names looks like @samp{xn--bar}. If a string remain
9721unencoded after running invoking this, it is likely an invalid IDNA
9722string (@samp{xn--bar} is invalid). You must have GNU Libidn
9723(@url{http://www.gnu.org/software/libidn/}) installed for this command
9724to work.
9725
4009494e
GM
9726@item W t
9727@item t
9728@kindex W t (Summary)
9729@kindex t (Summary)
9730@findex gnus-summary-toggle-header
9731Toggle whether to display all headers in the article buffer
9732(@code{gnus-summary-toggle-header}).
9733
9734@item W v
9735@kindex W v (Summary)
9736@findex gnus-summary-verbose-headers
9737Toggle whether to display all headers in the article buffer permanently
9738(@code{gnus-summary-verbose-headers}).
9739
9740@item W o
9741@kindex W o (Summary)
9742@findex gnus-article-treat-overstrike
9743Treat overstrike (@code{gnus-article-treat-overstrike}).
9744
9745@item W d
9746@kindex W d (Summary)
9747@findex gnus-article-treat-dumbquotes
9748@vindex gnus-article-dumbquotes-map
9749@cindex Smartquotes
9750@cindex M****s*** sm*rtq**t*s
9751@cindex Latin 1
9752Treat M****s*** sm*rtq**t*s according to
9753@code{gnus-article-dumbquotes-map}
9754(@code{gnus-article-treat-dumbquotes}). Note that this function guesses
9755whether a character is a sm*rtq**t* or not, so it should only be used
9756interactively.
9757
9758Sm*rtq**t*s are M****s***'s unilateral extension to the character map in
9759an attempt to provide more quoting characters. If you see something
9760like @code{\222} or @code{\264} where you're expecting some kind of
9761apostrophe or quotation mark, then try this wash.
9762
9763@item W Y f
9764@kindex W Y f (Summary)
9765@findex gnus-article-outlook-deuglify-article
9766@cindex Outlook Express
9767Full deuglify of broken Outlook (Express) articles: Treat dumbquotes,
9768unwrap lines, repair attribution and rearrange citation.
9769(@code{gnus-article-outlook-deuglify-article}).
9770
9771@item W Y u
9772@kindex W Y u (Summary)
9773@findex gnus-article-outlook-unwrap-lines
9774@vindex gnus-outlook-deuglify-unwrap-min
9775@vindex gnus-outlook-deuglify-unwrap-max
9776Unwrap lines that appear to be wrapped citation lines. You can control
9777what lines will be unwrapped by frobbing
9778@code{gnus-outlook-deuglify-unwrap-min} and
9779@code{gnus-outlook-deuglify-unwrap-max}, indicating the minimum and
9780maximum length of an unwrapped citation line.
9781(@code{gnus-article-outlook-unwrap-lines}).
9782
9783@item W Y a
9784@kindex W Y a (Summary)
9785@findex gnus-article-outlook-repair-attribution
9786Repair a broken attribution line.@*
9787(@code{gnus-article-outlook-repair-attribution}).
9788
9789@item W Y c
9790@kindex W Y c (Summary)
9791@findex gnus-article-outlook-rearrange-citation
9792Repair broken citations by rearranging the text.
9793(@code{gnus-article-outlook-rearrange-citation}).
9794
9795@item W w
9796@kindex W w (Summary)
9797@findex gnus-article-fill-cited-article
9798Do word wrap (@code{gnus-article-fill-cited-article}).
9799
9800You can give the command a numerical prefix to specify the width to use
9801when filling.
9802
9803@item W Q
9804@kindex W Q (Summary)
9805@findex gnus-article-fill-long-lines
9806Fill long lines (@code{gnus-article-fill-long-lines}).
9807
9808@item W C
9809@kindex W C (Summary)
9810@findex gnus-article-capitalize-sentences
9811Capitalize the first word in each sentence
9812(@code{gnus-article-capitalize-sentences}).
9813
9814@item W c
9815@kindex W c (Summary)
9816@findex gnus-article-remove-cr
9817Translate CRLF pairs (i. e., @samp{^M}s on the end of the lines) into LF
9818(this takes care of DOS line endings), and then translate any remaining
9819CRs into LF (this takes care of Mac line endings)
9820(@code{gnus-article-remove-cr}).
9821
9822@item W q
9823@kindex W q (Summary)
9824@findex gnus-article-de-quoted-unreadable
9825Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}).
9826Quoted-Printable is one common @acronym{MIME} encoding employed when
9827sending non-@acronym{ASCII} (i.e., 8-bit) articles. It typically
01c52d31
MB
9828makes strings like @samp{d@'ej@`a vu} look like @samp{d=E9j=E0 vu},
9829which doesn't look very readable to me. Note that this is usually
9830done automatically by Gnus if the message in question has a
4009494e
GM
9831@code{Content-Transfer-Encoding} header that says that this encoding
9832has been done. If a prefix is given, a charset will be asked for.
9833
9834@item W 6
9835@kindex W 6 (Summary)
9836@findex gnus-article-de-base64-unreadable
9837Treat base64 (@code{gnus-article-de-base64-unreadable}). Base64 is
9838one common @acronym{MIME} encoding employed when sending
9839non-@acronym{ASCII} (i.e., 8-bit) articles. Note that this is
9840usually done automatically by Gnus if the message in question has a
9841@code{Content-Transfer-Encoding} header that says that this encoding
9842has been done. If a prefix is given, a charset will be asked for.
9843
9844@item W Z
9845@kindex W Z (Summary)
9846@findex gnus-article-decode-HZ
9847Treat HZ or HZP (@code{gnus-article-decode-HZ}). HZ (or HZP) is one
9848common encoding employed when sending Chinese articles. It typically
9849makes strings look like @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}}.
9850
01c52d31
MB
9851@item W A
9852@kindex W A (Summary)
9853@findex gnus-article-treat-ansi-sequences
9854@cindex @acronym{ANSI} control sequences
9855Translate @acronym{ANSI} SGR control sequences into overlays or
9856extents (@code{gnus-article-treat-ansi-sequences}). @acronym{ANSI}
9857sequences are used in some Chinese hierarchies for highlighting.
9858
4009494e
GM
9859@item W u
9860@kindex W u (Summary)
9861@findex gnus-article-unsplit-urls
9862Remove newlines from within URLs. Some mailers insert newlines into
9863outgoing email messages to keep lines short. This reformatting can
9864split long URLs onto multiple lines. Repair those URLs by removing
9865the newlines (@code{gnus-article-unsplit-urls}).
9866
9867@item W h
9868@kindex W h (Summary)
9869@findex gnus-article-wash-html
9870Treat @acronym{HTML} (@code{gnus-article-wash-html}). Note that this is
9871usually done automatically by Gnus if the message in question has a
9872@code{Content-Type} header that says that the message is @acronym{HTML}.
9873
9874If a prefix is given, a charset will be asked for. If it is a number,
9875the charset defined in @code{gnus-summary-show-article-charset-alist}
9876(@pxref{Paging the Article}) will be used.
9877
9878@vindex gnus-article-wash-function
9879The default is to use the function specified by
9880@code{mm-text-html-renderer} (@pxref{Display Customization, ,Display
9881Customization, emacs-mime, The Emacs MIME Manual}) to convert the
9882@acronym{HTML}, but this is controlled by the
9883@code{gnus-article-wash-function} variable. Pre-defined functions you
9884can use include:
9885
9886@table @code
9887@item w3
9888Use Emacs/W3.
9889
9890@item w3m
9891Use @uref{http://emacs-w3m.namazu.org/, emacs-w3m}.
9892
9893@item w3m-standalone
9894Use @uref{http://w3m.sourceforge.net/, w3m}.
9895
9896@item links
9897Use @uref{http://links.sf.net/, Links}.
9898
9899@item lynx
9900Use @uref{http://lynx.isc.org/, Lynx}.
9901
9902@item html2text
9903Use html2text---a simple @acronym{HTML} converter included with Gnus.
9904
9905@end table
9906
9907@item W b
9908@kindex W b (Summary)
9909@findex gnus-article-add-buttons
9910Add clickable buttons to the article (@code{gnus-article-add-buttons}).
9911@xref{Article Buttons}.
9912
9913@item W B
9914@kindex W B (Summary)
9915@findex gnus-article-add-buttons-to-head
9916Add clickable buttons to the article headers
9917(@code{gnus-article-add-buttons-to-head}).
9918
9919@item W p
9920@kindex W p (Summary)
9921@findex gnus-article-verify-x-pgp-sig
9922Verify a signed control message
9923(@code{gnus-article-verify-x-pgp-sig}). Control messages such as
9924@code{newgroup} and @code{checkgroups} are usually signed by the
9925hierarchy maintainer. You need to add the @acronym{PGP} public key of
9926the maintainer to your keyring to verify the
9927message.@footnote{@acronym{PGP} keys for many hierarchies are
9928available at @uref{ftp://ftp.isc.org/pub/pgpcontrol/README.html}}
9929
9930@item W s
9931@kindex W s (Summary)
9932@findex gnus-summary-force-verify-and-decrypt
9933Verify a signed (@acronym{PGP}, @acronym{PGP/MIME} or
9934@acronym{S/MIME}) message
9935(@code{gnus-summary-force-verify-and-decrypt}). @xref{Security}.
9936
9937@item W a
9938@kindex W a (Summary)
9939@findex gnus-article-strip-headers-in-body
9940Strip headers like the @code{X-No-Archive} header from the beginning of
9941article bodies (@code{gnus-article-strip-headers-in-body}).
9942
9943@item W E l
9944@kindex W E l (Summary)
9945@findex gnus-article-strip-leading-blank-lines
9946Remove all blank lines from the beginning of the article
9947(@code{gnus-article-strip-leading-blank-lines}).
9948
9949@item W E m
9950@kindex W E m (Summary)
9951@findex gnus-article-strip-multiple-blank-lines
9952Replace all blank lines with empty lines and then all multiple empty
9953lines with a single empty line.
9954(@code{gnus-article-strip-multiple-blank-lines}).
9955
9956@item W E t
9957@kindex W E t (Summary)
9958@findex gnus-article-remove-trailing-blank-lines
9959Remove all blank lines at the end of the article
9960(@code{gnus-article-remove-trailing-blank-lines}).
9961
9962@item W E a
9963@kindex W E a (Summary)
9964@findex gnus-article-strip-blank-lines
9965Do all the three commands above
9966(@code{gnus-article-strip-blank-lines}).
9967
9968@item W E A
9969@kindex W E A (Summary)
9970@findex gnus-article-strip-all-blank-lines
9971Remove all blank lines
9972(@code{gnus-article-strip-all-blank-lines}).
9973
9974@item W E s
9975@kindex W E s (Summary)
9976@findex gnus-article-strip-leading-space
9977Remove all white space from the beginning of all lines of the article
9978body (@code{gnus-article-strip-leading-space}).
9979
9980@item W E e
9981@kindex W E e (Summary)
9982@findex gnus-article-strip-trailing-space
9983Remove all white space from the end of all lines of the article
9984body (@code{gnus-article-strip-trailing-space}).
9985
9986@end table
9987
9988@xref{Customizing Articles}, for how to wash articles automatically.
9989
9990
9991@node Article Header
9992@subsection Article Header
9993
9994These commands perform various transformations of article header.
9995
9996@table @kbd
9997
9998@item W G u
9999@kindex W G u (Summary)
10000@findex gnus-article-treat-unfold-headers
10001Unfold folded header lines (@code{gnus-article-treat-unfold-headers}).
10002
10003@item W G n
10004@kindex W G n (Summary)
10005@findex gnus-article-treat-fold-newsgroups
10006Fold the @code{Newsgroups} and @code{Followup-To} headers
10007(@code{gnus-article-treat-fold-newsgroups}).
10008
10009@item W G f
10010@kindex W G f (Summary)
10011@findex gnus-article-treat-fold-headers
10012Fold all the message headers
10013(@code{gnus-article-treat-fold-headers}).
10014
10015@item W E w
10016@kindex W E w (Summary)
10017@findex gnus-article-remove-leading-whitespace
10018Remove excessive whitespace from all headers
10019(@code{gnus-article-remove-leading-whitespace}).
10020
10021@end table
10022
10023
10024@node Article Buttons
10025@subsection Article Buttons
10026@cindex buttons
10027
10028People often include references to other stuff in articles, and it would
10029be nice if Gnus could just fetch whatever it is that people talk about
10030with the minimum of fuzz when you hit @kbd{RET} or use the middle mouse
10031button on these references.
10032
10033@vindex gnus-button-man-handler
10034Gnus adds @dfn{buttons} to certain standard references by default:
10035Well-formed URLs, mail addresses, Message-IDs, Info links, man pages and
10036Emacs or Gnus related references. This is controlled by two variables,
10037one that handles article bodies and one that handles article heads:
10038
10039@table @code
10040
10041@item gnus-button-alist
10042@vindex gnus-button-alist
10043This is an alist where each entry has this form:
10044
10045@lisp
10046(@var{regexp} @var{button-par} @var{use-p} @var{function} @var{data-par})
10047@end lisp
10048
10049@table @var
10050
10051@item regexp
10052All text that match this regular expression (case insensitive) will be
10053considered an external reference. Here's a typical regexp that matches
10054embedded URLs: @samp{<URL:\\([^\n\r>]*\\)>}. This can also be a
10055variable containing a regexp, useful variables to use include
10056@code{gnus-button-url-regexp} and @code{gnus-button-mid-or-mail-regexp}.
10057
10058@item button-par
10059Gnus has to know which parts of the matches is to be highlighted. This
10060is a number that says what sub-expression of the regexp is to be
10061highlighted. If you want it all highlighted, you use 0 here.
10062
10063@item use-p
10064This form will be @code{eval}ed, and if the result is non-@code{nil},
10065this is considered a match. This is useful if you want extra sifting to
10066avoid false matches. Often variables named
10067@code{gnus-button-@var{*}-level} are used here, @xref{Article Button
10068Levels}, but any other form may be used too.
10069
10070@c @code{use-p} is @code{eval}ed only if @code{regexp} matches.
10071
10072@item function
10073This function will be called when you click on this button.
10074
10075@item data-par
10076As with @var{button-par}, this is a sub-expression number, but this one
10077says which part of the match is to be sent as data to @var{function}.
10078
10079@end table
10080
10081So the full entry for buttonizing URLs is then
10082
10083@lisp
10084("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)
10085@end lisp
10086
10087@item gnus-header-button-alist
10088@vindex gnus-header-button-alist
10089This is just like the other alist, except that it is applied to the
10090article head only, and that each entry has an additional element that is
10091used to say what headers to apply the buttonize coding to:
10092
10093@lisp
10094(@var{header} @var{regexp} @var{button-par} @var{use-p} @var{function} @var{data-par})
10095@end lisp
10096
10097@var{header} is a regular expression.
10098@end table
10099
10100@subsubsection Related variables and functions
10101
10102@table @code
10103@item gnus-button-@var{*}-level
10104@xref{Article Button Levels}.
10105
10106@c Stuff related to gnus-button-browse-level
10107
10108@item gnus-button-url-regexp
10109@vindex gnus-button-url-regexp
10110A regular expression that matches embedded URLs. It is used in the
10111default values of the variables above.
10112
10113@c Stuff related to gnus-button-man-level
10114
10115@item gnus-button-man-handler
10116@vindex gnus-button-man-handler
10117The function to use for displaying man pages. It must take at least one
10118argument with a string naming the man page.
10119
10120@c Stuff related to gnus-button-message-level
10121
10122@item gnus-button-mid-or-mail-regexp
10123@vindex gnus-button-mid-or-mail-regexp
10124Regular expression that matches a message ID or a mail address.
10125
10126@item gnus-button-prefer-mid-or-mail
10127@vindex gnus-button-prefer-mid-or-mail
10128This variable determines what to do when the button on a string as
10129@samp{foo123@@bar.invalid} is pushed. Strings like this can be either a
10130message ID or a mail address. If it is one of the symbols @code{mid} or
10131@code{mail}, Gnus will always assume that the string is a message ID or
10132a mail address, respectively. If this variable is set to the symbol
10133@code{ask}, always query the user what to do. If it is a function, this
10134function will be called with the string as its only argument. The
10135function must return @code{mid}, @code{mail}, @code{invalid} or
10136@code{ask}. The default value is the function
10137@code{gnus-button-mid-or-mail-heuristic}.
10138
10139@item gnus-button-mid-or-mail-heuristic
10140@findex gnus-button-mid-or-mail-heuristic
10141Function that guesses whether its argument is a message ID or a mail
10142address. Returns @code{mid} if it's a message IDs, @code{mail} if
10143it's a mail address, @code{ask} if unsure and @code{invalid} if the
10144string is invalid.
10145
10146@item gnus-button-mid-or-mail-heuristic-alist
10147@vindex gnus-button-mid-or-mail-heuristic-alist
10148An alist of @code{(RATE . REGEXP)} pairs used by the function
10149@code{gnus-button-mid-or-mail-heuristic}.
10150
10151@c Stuff related to gnus-button-tex-level
10152
10153@item gnus-button-ctan-handler
10154@findex gnus-button-ctan-handler
10155The function to use for displaying CTAN links. It must take one
10156argument, the string naming the URL.
10157
10158@item gnus-ctan-url
10159@vindex gnus-ctan-url
10160Top directory of a CTAN (Comprehensive TeX Archive Network) archive used
10161by @code{gnus-button-ctan-handler}.
10162
10163@c Misc stuff
10164
10165@item gnus-article-button-face
10166@vindex gnus-article-button-face
10167Face used on buttons.
10168
10169@item gnus-article-mouse-face
10170@vindex gnus-article-mouse-face
10171Face used when the mouse cursor is over a button.
10172
10173@end table
10174
10175@xref{Customizing Articles}, for how to buttonize articles automatically.
10176
10177
10178@node Article Button Levels
10179@subsection Article button levels
10180@cindex button levels
10181The higher the value of the variables @code{gnus-button-@var{*}-level},
10182the more buttons will appear. If the level is zero, no corresponding
10183buttons are displayed. With the default value (which is 5) you should
10184already see quite a lot of buttons. With higher levels, you will see
10185more buttons, but you may also get more false positives. To avoid them,
10186you can set the variables @code{gnus-button-@var{*}-level} local to
10187specific groups (@pxref{Group Parameters}). Here's an example for the
10188variable @code{gnus-parameters}:
10189
10190@lisp
10191;; @r{increase @code{gnus-button-*-level} in some groups:}
10192(setq gnus-parameters
10193 '(("\\<\\(emacs\\|gnus\\)\\>" (gnus-button-emacs-level 10))
10194 ("\\<unix\\>" (gnus-button-man-level 10))
10195 ("\\<tex\\>" (gnus-button-tex-level 10))))
10196@end lisp
10197
10198@table @code
10199
10200@item gnus-button-browse-level
10201@vindex gnus-button-browse-level
10202Controls the display of references to message IDs, mail addresses and
10203news URLs. Related variables and functions include
10204@code{gnus-button-url-regexp}, @code{browse-url}, and
10205@code{browse-url-browser-function}.
10206
10207@item gnus-button-emacs-level
10208@vindex gnus-button-emacs-level
10209Controls the display of Emacs or Gnus references. Related functions are
10210@code{gnus-button-handle-custom},
10211@code{gnus-button-handle-describe-function},
10212@code{gnus-button-handle-describe-variable},
10213@code{gnus-button-handle-symbol},
10214@code{gnus-button-handle-describe-key},
10215@code{gnus-button-handle-apropos},
10216@code{gnus-button-handle-apropos-command},
10217@code{gnus-button-handle-apropos-variable},
10218@code{gnus-button-handle-apropos-documentation}, and
10219@code{gnus-button-handle-library}.
10220
10221@item gnus-button-man-level
10222@vindex gnus-button-man-level
10223Controls the display of references to (Unix) man pages.
10224See @code{gnus-button-man-handler}.
10225
10226@item gnus-button-message-level
10227@vindex gnus-button-message-level
10228Controls the display of message IDs, mail addresses and news URLs.
10229Related variables and functions include
10230@code{gnus-button-mid-or-mail-regexp},
10231@code{gnus-button-prefer-mid-or-mail},
10232@code{gnus-button-mid-or-mail-heuristic}, and
10233@code{gnus-button-mid-or-mail-heuristic-alist}.
10234
10235@item gnus-button-tex-level
10236@vindex gnus-button-tex-level
10237Controls the display of references to @TeX{} or LaTeX stuff, e.g. for CTAN
10238URLs. See the variables @code{gnus-ctan-url},
10239@code{gnus-button-ctan-handler},
10240@code{gnus-button-ctan-directory-regexp}, and
10241@code{gnus-button-handle-ctan-bogus-regexp}.
10242
10243@end table
10244
10245
10246@node Article Date
10247@subsection Article Date
10248
10249The date is most likely generated in some obscure timezone you've never
10250heard of, so it's quite nice to be able to find out what the time was
10251when the article was sent.
10252
10253@table @kbd
10254
10255@item W T u
10256@kindex W T u (Summary)
10257@findex gnus-article-date-ut
10258Display the date in UT (aka. GMT, aka ZULU)
10259(@code{gnus-article-date-ut}).
10260
10261@item W T i
10262@kindex W T i (Summary)
10263@findex gnus-article-date-iso8601
10264@cindex ISO 8601
10265Display the date in international format, aka. ISO 8601
10266(@code{gnus-article-date-iso8601}).
10267
10268@item W T l
10269@kindex W T l (Summary)
10270@findex gnus-article-date-local
10271Display the date in the local timezone (@code{gnus-article-date-local}).
10272
10273@item W T p
10274@kindex W T p (Summary)
10275@findex gnus-article-date-english
10276Display the date in a format that's easily pronounceable in English
10277(@code{gnus-article-date-english}).
10278
10279@item W T s
10280@kindex W T s (Summary)
10281@vindex gnus-article-time-format
10282@findex gnus-article-date-user
10283@findex format-time-string
10284Display the date using a user-defined format
10285(@code{gnus-article-date-user}). The format is specified by the
10286@code{gnus-article-time-format} variable, and is a string that's passed
10287to @code{format-time-string}. See the documentation of that variable
10288for a list of possible format specs.
10289
10290@item W T e
10291@kindex W T e (Summary)
10292@findex gnus-article-date-lapsed
10293@findex gnus-start-date-timer
10294@findex gnus-stop-date-timer
10295Say how much time has elapsed between the article was posted and now
10296(@code{gnus-article-date-lapsed}). It looks something like:
10297
10298@example
10299X-Sent: 6 weeks, 4 days, 1 hour, 3 minutes, 8 seconds ago
10300@end example
10301
10302@vindex gnus-article-date-lapsed-new-header
10303The value of @code{gnus-article-date-lapsed-new-header} determines
10304whether this header will just be added below the old Date one, or will
10305replace it.
10306
10307An advantage of using Gnus to read mail is that it converts simple bugs
10308into wonderful absurdities.
10309
10310If you want to have this line updated continually, you can put
10311
10312@lisp
10313(gnus-start-date-timer)
10314@end lisp
10315
10316in your @file{~/.gnus.el} file, or you can run it off of some hook. If
10317you want to stop the timer, you can use the @code{gnus-stop-date-timer}
10318command.
10319
10320@item W T o
10321@kindex W T o (Summary)
10322@findex gnus-article-date-original
10323Display the original date (@code{gnus-article-date-original}). This can
10324be useful if you normally use some other conversion function and are
10325worried that it might be doing something totally wrong. Say, claiming
10326that the article was posted in 1854. Although something like that is
10327@emph{totally} impossible. Don't you trust me? *titter*
10328
10329@end table
10330
10331@xref{Customizing Articles}, for how to display the date in your
10332preferred format automatically.
10333
10334
10335@node Article Display
10336@subsection Article Display
10337@cindex picons
10338@cindex x-face
10339@cindex smileys
10340
10341These commands add various frivolous display gimmicks to the article
10342buffer in Emacs versions that support them.
10343
10344@code{X-Face} headers are small black-and-white images supplied by the
10345message headers (@pxref{X-Face}).
10346
10347@code{Face} headers are small colored images supplied by the message
10348headers (@pxref{Face}).
10349
10350Smileys are those little @samp{:-)} symbols that people like to litter
10351their messages with (@pxref{Smileys}).
10352
10353Picons, on the other hand, reside on your own system, and Gnus will
10354try to match the headers to what you have (@pxref{Picons}).
10355
10356All these functions are toggles---if the elements already exist,
10357they'll be removed.
10358
10359@table @kbd
10360@item W D x
10361@kindex W D x (Summary)
10362@findex gnus-article-display-x-face
10363Display an @code{X-Face} in the @code{From} header.
10364(@code{gnus-article-display-x-face}).
10365
10366@item W D d
10367@kindex W D d (Summary)
10368@findex gnus-article-display-face
10369Display a @code{Face} in the @code{From} header.
10370(@code{gnus-article-display-face}).
10371
10372@item W D s
10373@kindex W D s (Summary)
10374@findex gnus-treat-smiley
10375Display smileys (@code{gnus-treat-smiley}).
10376
10377@item W D f
10378@kindex W D f (Summary)
10379@findex gnus-treat-from-picon
10380Piconify the @code{From} header (@code{gnus-treat-from-picon}).
10381
10382@item W D m
10383@kindex W D m (Summary)
10384@findex gnus-treat-mail-picon
10385Piconify all mail headers (i. e., @code{Cc}, @code{To})
10386(@code{gnus-treat-mail-picon}).
10387
10388@item W D n
10389@kindex W D n (Summary)
10390@findex gnus-treat-newsgroups-picon
10391Piconify all news headers (i. e., @code{Newsgroups} and
10392@code{Followup-To}) (@code{gnus-treat-newsgroups-picon}).
10393
10394@item W D D
10395@kindex W D D (Summary)
10396@findex gnus-article-remove-images
10397Remove all images from the article buffer
10398(@code{gnus-article-remove-images}).
10399
10400@end table
10401
10402
10403
10404@node Article Signature
10405@subsection Article Signature
10406@cindex signatures
10407@cindex article signature
10408
10409@vindex gnus-signature-separator
10410Each article is divided into two parts---the head and the body. The
10411body can be divided into a signature part and a text part. The variable
10412that says what is to be considered a signature is
10413@code{gnus-signature-separator}. This is normally the standard
10414@samp{^-- $} as mandated by son-of-RFC 1036. However, many people use
10415non-standard signature separators, so this variable can also be a list
10416of regular expressions to be tested, one by one. (Searches are done
10417from the end of the body towards the beginning.) One likely value is:
10418
10419@lisp
10420(setq gnus-signature-separator
10421 '("^-- $" ; @r{The standard}
10422 "^-- *$" ; @r{A common mangling}
10423 "^-------*$" ; @r{Many people just use a looong}
10424 ; @r{line of dashes. Shame!}
10425 "^ *--------*$" ; @r{Double-shame!}
10426 "^________*$" ; @r{Underscores are also popular}
10427 "^========*$")) ; @r{Pervert!}
10428@end lisp
10429
10430The more permissive you are, the more likely it is that you'll get false
10431positives.
10432
10433@vindex gnus-signature-limit
10434@code{gnus-signature-limit} provides a limit to what is considered a
10435signature when displaying articles.
10436
10437@enumerate
10438@item
10439If it is an integer, no signature may be longer (in characters) than
10440that integer.
10441@item
10442If it is a floating point number, no signature may be longer (in lines)
10443than that number.
10444@item
10445If it is a function, the function will be called without any parameters,
10446and if it returns @code{nil}, there is no signature in the buffer.
10447@item
10448If it is a string, it will be used as a regexp. If it matches, the text
10449in question is not a signature.
10450@end enumerate
10451
10452This variable can also be a list where the elements may be of the types
10453listed above. Here's an example:
10454
10455@lisp
10456(setq gnus-signature-limit
10457 '(200.0 "^---*Forwarded article"))
10458@end lisp
10459
10460This means that if there are more than 200 lines after the signature
10461separator, or the text after the signature separator is matched by
10462the regular expression @samp{^---*Forwarded article}, then it isn't a
10463signature after all.
10464
10465
10466@node Article Miscellanea
10467@subsection Article Miscellanea
10468
10469@table @kbd
10470@item A t
10471@kindex A t (Summary)
10472@findex gnus-article-babel
10473Translate the article from one language to another
10474(@code{gnus-article-babel}).
10475
10476@end table
10477
10478
10479@node MIME Commands
10480@section MIME Commands
10481@cindex MIME decoding
10482@cindex attachments
10483@cindex viewing attachments
10484
10485The following commands all understand the numerical prefix. For
01c52d31 10486instance, @kbd{3 K v} means ``view the third @acronym{MIME} part''.
4009494e
GM
10487
10488@table @kbd
10489@item b
10490@itemx K v
10491@kindex b (Summary)
10492@kindex K v (Summary)
10493View the @acronym{MIME} part.
10494
10495@item K o
10496@kindex K o (Summary)
10497Save the @acronym{MIME} part.
10498
01c52d31
MB
10499@item K O
10500@kindex K O (Summary)
10501Prompt for a file name, then save the @acronym{MIME} part and strip it
10502from the article. The stripped @acronym{MIME} object will be referred
10503via the message/external-body @acronym{MIME} type.
10504
10505@item K r
10506@kindex K r (Summary)
10507Replace the @acronym{MIME} part with an external body.
10508
10509@item K d
10510@kindex K d (Summary)
10511Delete the @acronym{MIME} part and add some information about the
10512removed part.
10513
4009494e
GM
10514@item K c
10515@kindex K c (Summary)
10516Copy the @acronym{MIME} part.
10517
10518@item K e
10519@kindex K e (Summary)
10520View the @acronym{MIME} part externally.
10521
10522@item K i
10523@kindex K i (Summary)
10524View the @acronym{MIME} part internally.
10525
10526@item K |
10527@kindex K | (Summary)
10528Pipe the @acronym{MIME} part to an external command.
10529@end table
10530
10531The rest of these @acronym{MIME} commands do not use the numerical prefix in
10532the same manner:
10533
10534@table @kbd
9b3ebcb6
MB
10535@item K H
10536@kindex K H (Summary)
10537@findex gnus-article-browse-html-article
10538View @samp{text/html} parts of the current article with a WWW browser.
1d4d7664
KY
10539Inline images embedded in a message using the @code{cid} scheme, as they
10540are generally considered to be safe, will be processed properly. The
10541message header is added to the beginning of every @acronym{HTML} part
10542unless the prefix argument is given.
9b3ebcb6 10543
1d4d7664
KY
10544Warning: Spammers use links to images (using the @code{http} scheme) in
10545@acronym{HTML} articles to verify whether you have read the message. As
10546this command passes the @acronym{HTML} content to the browser without
10547eliminating these ``web bugs'' you should only use it for mails from
10548trusted senders.
9b3ebcb6
MB
10549
10550If you always want to display @acronym{HTML} parts in the browser, set
10551@code{mm-text-html-renderer} to @code{nil}.
10552
1d4d7664
KY
10553This command creates temporary files to pass @acronym{HTML} contents
10554including images if any to the browser, and deletes them when exiting
10555the group (if you want).
10556
4009494e
GM
10557@item K b
10558@kindex K b (Summary)
10559Make all the @acronym{MIME} parts have buttons in front of them. This is
10560mostly useful if you wish to save (or perform other actions) on inlined
10561parts.
10562
10563@item K m
10564@kindex K m (Summary)
10565@findex gnus-summary-repair-multipart
10566Some multipart messages are transmitted with missing or faulty headers.
10567This command will attempt to ``repair'' these messages so that they can
10568be viewed in a more pleasant manner
10569(@code{gnus-summary-repair-multipart}).
10570
10571@item X m
10572@kindex X m (Summary)
10573@findex gnus-summary-save-parts
10574Save all parts matching a @acronym{MIME} type to a directory
10575(@code{gnus-summary-save-parts}). Understands the process/prefix
10576convention (@pxref{Process/Prefix}).
10577
10578@item M-t
10579@kindex M-t (Summary)
10580@findex gnus-summary-toggle-display-buttonized
10581Toggle the buttonized display of the article buffer
10582(@code{gnus-summary-toggle-display-buttonized}).
10583
10584@item W M w
10585@kindex W M w (Summary)
10586@findex gnus-article-decode-mime-words
10587Decode RFC 2047-encoded words in the article headers
10588(@code{gnus-article-decode-mime-words}).
10589
10590@item W M c
10591@kindex W M c (Summary)
10592@findex gnus-article-decode-charset
10593Decode encoded article bodies as well as charsets
10594(@code{gnus-article-decode-charset}).
10595
10596This command looks in the @code{Content-Type} header to determine the
10597charset. If there is no such header in the article, you can give it a
10598prefix, which will prompt for the charset to decode as. In regional
10599groups where people post using some common encoding (but do not
10600include @acronym{MIME} headers), you can set the @code{charset} group/topic
10601parameter to the required charset (@pxref{Group Parameters}).
10602
10603@item W M v
10604@kindex W M v (Summary)
10605@findex gnus-mime-view-all-parts
10606View all the @acronym{MIME} parts in the current article
10607(@code{gnus-mime-view-all-parts}).
10608
10609@end table
10610
10611Relevant variables:
10612
10613@table @code
10614@item gnus-ignored-mime-types
10615@vindex gnus-ignored-mime-types
10616This is a list of regexps. @acronym{MIME} types that match a regexp from
10617this list will be completely ignored by Gnus. The default value is
10618@code{nil}.
10619
10620To have all Vcards be ignored, you'd say something like this:
10621
10622@lisp
10623(setq gnus-ignored-mime-types
10624 '("text/x-vcard"))
10625@end lisp
10626
10627@item gnus-article-loose-mime
10628@vindex gnus-article-loose-mime
10629If non-@code{nil}, Gnus won't require the @samp{MIME-Version} header
10630before interpreting the message as a @acronym{MIME} message. This helps
10631when reading messages from certain broken mail user agents. The
b890d447 10632default is @code{t}.
4009494e
GM
10633
10634@item gnus-article-emulate-mime
10635@vindex gnus-article-emulate-mime
10636@cindex uuencode
10637@cindex yEnc
10638There are other, non-@acronym{MIME} encoding methods used. The most common
10639is @samp{uuencode}, but yEncode is also getting to be popular. If
10640this variable is non-@code{nil}, Gnus will look in message bodies to
10641see if it finds these encodings, and if so, it'll run them through the
10642Gnus @acronym{MIME} machinery. The default is @code{t}. Only
10643single-part yEnc encoded attachments can be decoded. There's no support
10644for encoding in Gnus.
10645
10646@item gnus-unbuttonized-mime-types
10647@vindex gnus-unbuttonized-mime-types
10648This is a list of regexps. @acronym{MIME} types that match a regexp from
10649this list won't have @acronym{MIME} buttons inserted unless they aren't
10650displayed or this variable is overridden by
10651@code{gnus-buttonized-mime-types}. The default value is
10652@code{(".*/.*")}. This variable is only used when
10653@code{gnus-inhibit-mime-unbuttonizing} is @code{nil}.
10654
10655@item gnus-buttonized-mime-types
10656@vindex gnus-buttonized-mime-types
10657This is a list of regexps. @acronym{MIME} types that match a regexp from
10658this list will have @acronym{MIME} buttons inserted unless they aren't
10659displayed. This variable overrides
10660@code{gnus-unbuttonized-mime-types}. The default value is @code{nil}.
10661This variable is only used when @code{gnus-inhibit-mime-unbuttonizing}
10662is @code{nil}.
10663
10664To see e.g. security buttons but no other buttons, you could set this
10665variable to @code{("multipart/signed")} and leave
10666@code{gnus-unbuttonized-mime-types} at the default value.
10667
10668You could also add @code{"multipart/alternative"} to this list to
10669display radio buttons that allow you to choose one of two media types
10670those mails include. See also @code{mm-discouraged-alternatives}
10671(@pxref{Display Customization, ,Display Customization, emacs-mime, The
10672Emacs MIME Manual}).
10673
10674@item gnus-inhibit-mime-unbuttonizing
10675@vindex gnus-inhibit-mime-unbuttonizing
10676If this is non-@code{nil}, then all @acronym{MIME} parts get buttons. The
10677default value is @code{nil}.
10678
10679@item gnus-article-mime-part-function
10680@vindex gnus-article-mime-part-function
10681For each @acronym{MIME} part, this function will be called with the @acronym{MIME}
10682handle as the parameter. The function is meant to be used to allow
10683users to gather information from the article (e. g., add Vcard info to
10684the bbdb database) or to do actions based on parts (e. g., automatically
10685save all jpegs into some directory).
10686
10687Here's an example function the does the latter:
10688
10689@lisp
10690(defun my-save-all-jpeg-parts (handle)
10691 (when (equal (car (mm-handle-type handle)) "image/jpeg")
10692 (with-temp-buffer
10693 (insert (mm-get-part handle))
10694 (write-region (point-min) (point-max)
10695 (read-file-name "Save jpeg to: ")))))
10696(setq gnus-article-mime-part-function
10697 'my-save-all-jpeg-parts)
10698@end lisp
10699
10700@vindex gnus-mime-multipart-functions
10701@item gnus-mime-multipart-functions
10702Alist of @acronym{MIME} multipart types and functions to handle them.
10703
10704@vindex gnus-mime-display-multipart-alternative-as-mixed
10705@item gnus-mime-display-multipart-alternative-as-mixed
10706Display "multipart/alternative" parts as "multipart/mixed".
10707
10708@vindex gnus-mime-display-multipart-related-as-mixed
10709@item gnus-mime-display-multipart-related-as-mixed
10710Display "multipart/related" parts as "multipart/mixed".
10711
9b3ebcb6 10712If displaying @samp{text/html} is discouraged, see
4009494e
GM
10713@code{mm-discouraged-alternatives}, images or other material inside a
10714"multipart/related" part might be overlooked when this variable is
10715@code{nil}. @ref{Display Customization, Display Customization, ,
10716emacs-mime, Emacs-Mime Manual}.
10717
10718@vindex gnus-mime-display-multipart-as-mixed
10719@item gnus-mime-display-multipart-as-mixed
10720Display "multipart" parts as "multipart/mixed". If @code{t}, it
10721overrides @code{nil} values of
10722@code{gnus-mime-display-multipart-alternative-as-mixed} and
10723@code{gnus-mime-display-multipart-related-as-mixed}.
10724
10725@vindex mm-file-name-rewrite-functions
10726@item mm-file-name-rewrite-functions
10727List of functions used for rewriting file names of @acronym{MIME} parts.
10728Each function takes a file name as input and returns a file name.
10729
10730Ready-made functions include@*
10731@code{mm-file-name-delete-whitespace},
10732@code{mm-file-name-trim-whitespace},
10733@code{mm-file-name-collapse-whitespace}, and
10734@code{mm-file-name-replace-whitespace}. The later uses the value of
10735the variable @code{mm-file-name-replace-whitespace} to replace each
10736whitespace character in a file name with that string; default value
10737is @code{"_"} (a single underscore).
10738@findex mm-file-name-delete-whitespace
10739@findex mm-file-name-trim-whitespace
10740@findex mm-file-name-collapse-whitespace
10741@findex mm-file-name-replace-whitespace
10742@vindex mm-file-name-replace-whitespace
10743
10744The standard functions @code{capitalize}, @code{downcase},
10745@code{upcase}, and @code{upcase-initials} may be useful, too.
10746
10747Everybody knows that whitespace characters in file names are evil,
10748except those who don't know. If you receive lots of attachments from
10749such unenlightened users, you can make live easier by adding
10750
10751@lisp
10752(setq mm-file-name-rewrite-functions
10753 '(mm-file-name-trim-whitespace
10754 mm-file-name-collapse-whitespace
10755 mm-file-name-replace-whitespace))
10756@end lisp
10757
10758@noindent
10759to your @file{~/.gnus.el} file.
10760
10761@end table
10762
10763
10764@node Charsets
10765@section Charsets
10766@cindex charsets
10767
10768People use different charsets, and we have @acronym{MIME} to let us know what
10769charsets they use. Or rather, we wish we had. Many people use
10770newsreaders and mailers that do not understand or use @acronym{MIME}, and
10771just send out messages without saying what character sets they use. To
10772help a bit with this, some local news hierarchies have policies that say
10773what character set is the default. For instance, the @samp{fj}
10774hierarchy uses @code{iso-2022-jp}.
10775
10776@vindex gnus-group-charset-alist
10777This knowledge is encoded in the @code{gnus-group-charset-alist}
10778variable, which is an alist of regexps (use the first item to match full
10779group names) and default charsets to be used when reading these groups.
10780
10781@vindex gnus-newsgroup-ignored-charsets
10782In addition, some people do use soi-disant @acronym{MIME}-aware agents that
10783aren't. These blithely mark messages as being in @code{iso-8859-1}
10784even if they really are in @code{koi-8}. To help here, the
10785@code{gnus-newsgroup-ignored-charsets} variable can be used. The
10786charsets that are listed here will be ignored. The variable can be
10787set on a group-by-group basis using the group parameters (@pxref{Group
10788Parameters}). The default value is @code{(unknown-8bit x-unknown)},
10789which includes values some agents insist on having in there.
10790
10791@vindex gnus-group-posting-charset-alist
10792When posting, @code{gnus-group-posting-charset-alist} is used to
10793determine which charsets should not be encoded using the @acronym{MIME}
10794encodings. For instance, some hierarchies discourage using
10795quoted-printable header encoding.
10796
10797This variable is an alist of regexps and permitted unencoded charsets
10798for posting. Each element of the alist has the form @code{(}@var{test
10799header body-list}@code{)}, where:
10800
10801@table @var
10802@item test
10803is either a regular expression matching the newsgroup header or a
10804variable to query,
10805@item header
10806is the charset which may be left unencoded in the header (@code{nil}
10807means encode all charsets),
10808@item body-list
10809is a list of charsets which may be encoded using 8bit content-transfer
10810encoding in the body, or one of the special values @code{nil} (always
10811encode using quoted-printable) or @code{t} (always use 8bit).
10812@end table
10813
10814@cindex Russian
10815@cindex koi8-r
10816@cindex koi8-u
10817@cindex iso-8859-5
10818@cindex coding system aliases
10819@cindex preferred charset
10820
10821@xref{Encoding Customization, , Encoding Customization, emacs-mime,
10822The Emacs MIME Manual}, for additional variables that control which
10823MIME charsets are used when sending messages.
10824
10825Other charset tricks that may be useful, although not Gnus-specific:
10826
10827If there are several @acronym{MIME} charsets that encode the same Emacs
10828charset, you can choose what charset to use by saying the following:
10829
10830@lisp
10831(put-charset-property 'cyrillic-iso8859-5
10832 'preferred-coding-system 'koi8-r)
10833@end lisp
10834
10835This means that Russian will be encoded using @code{koi8-r} instead of
10836the default @code{iso-8859-5} @acronym{MIME} charset.
10837
10838If you want to read messages in @code{koi8-u}, you can cheat and say
10839
10840@lisp
10841(define-coding-system-alias 'koi8-u 'koi8-r)
10842@end lisp
10843
10844This will almost do the right thing.
10845
10846And finally, to read charsets like @code{windows-1251}, you can say
10847something like
10848
10849@lisp
10850(codepage-setup 1251)
10851(define-coding-system-alias 'windows-1251 'cp1251)
10852@end lisp
10853
10854
10855@node Article Commands
10856@section Article Commands
10857
10858@table @kbd
10859
10860@item A P
10861@cindex PostScript
10862@cindex printing
10863@kindex A P (Summary)
10864@vindex gnus-ps-print-hook
10865@findex gnus-summary-print-article
10866Generate and print a PostScript image of the article buffer
10867(@code{gnus-summary-print-article}). @code{gnus-ps-print-hook} will
10868be run just before printing the buffer. An alternative way to print
10869article is to use Muttprint (@pxref{Saving Articles}).
10870
10871@end table
10872
10873
10874@node Summary Sorting
10875@section Summary Sorting
10876@cindex summary sorting
10877
10878You can have the summary buffer sorted in various ways, even though I
10879can't really see why you'd want that.
10880
10881@table @kbd
10882
10883@item C-c C-s C-n
10884@kindex C-c C-s C-n (Summary)
10885@findex gnus-summary-sort-by-number
10886Sort by article number (@code{gnus-summary-sort-by-number}).
10887
6ecfe5c2
MB
10888@item C-c C-s C-m C-n
10889@kindex C-c C-s C-n (Summary)
10890@findex gnus-summary-sort-by-most-recent-number
10891Sort by most recent article number
10892(@code{gnus-summary-sort-by-most-recent-number}).
10893
4009494e
GM
10894@item C-c C-s C-a
10895@kindex C-c C-s C-a (Summary)
10896@findex gnus-summary-sort-by-author
10897Sort by author (@code{gnus-summary-sort-by-author}).
10898
01c52d31
MB
10899@item C-c C-s C-t
10900@kindex C-c C-s C-t (Summary)
10901@findex gnus-summary-sort-by-recipient
10902Sort by recipient (@code{gnus-summary-sort-by-recipient}).
10903
4009494e
GM
10904@item C-c C-s C-s
10905@kindex C-c C-s C-s (Summary)
10906@findex gnus-summary-sort-by-subject
10907Sort by subject (@code{gnus-summary-sort-by-subject}).
10908
10909@item C-c C-s C-d
10910@kindex C-c C-s C-d (Summary)
10911@findex gnus-summary-sort-by-date
10912Sort by date (@code{gnus-summary-sort-by-date}).
10913
6ecfe5c2
MB
10914@item C-c C-s C-m C-d
10915@kindex C-c C-s C-m C-d (Summary)
10916@findex gnus-summary-sort-by-most-recent-date
10917Sort by most recent date (@code{gnus-summary-sort-by-most-recent-date}).
10918
4009494e
GM
10919@item C-c C-s C-l
10920@kindex C-c C-s C-l (Summary)
10921@findex gnus-summary-sort-by-lines
10922Sort by lines (@code{gnus-summary-sort-by-lines}).
10923
10924@item C-c C-s C-c
10925@kindex C-c C-s C-c (Summary)
10926@findex gnus-summary-sort-by-chars
10927Sort by article length (@code{gnus-summary-sort-by-chars}).
10928
10929@item C-c C-s C-i
10930@kindex C-c C-s C-i (Summary)
10931@findex gnus-summary-sort-by-score
10932Sort by score (@code{gnus-summary-sort-by-score}).
10933
10934@item C-c C-s C-r
10935@kindex C-c C-s C-r (Summary)
10936@findex gnus-summary-sort-by-random
10937Randomize (@code{gnus-summary-sort-by-random}).
10938
10939@item C-c C-s C-o
10940@kindex C-c C-s C-o (Summary)
10941@findex gnus-summary-sort-by-original
10942Sort using the default sorting method
10943(@code{gnus-summary-sort-by-original}).
10944@end table
10945
10946These functions will work both when you use threading and when you don't
10947use threading. In the latter case, all summary lines will be sorted,
10948line by line. In the former case, sorting will be done on a
10949root-by-root basis, which might not be what you were looking for. To
10950toggle whether to use threading, type @kbd{T T} (@pxref{Thread
10951Commands}).
10952
6ecfe5c2
MB
10953If a prefix argument if given, the sort order is reversed.
10954
4009494e
GM
10955
10956@node Finding the Parent
10957@section Finding the Parent
10958@cindex parent articles
10959@cindex referring articles
10960
10961@table @kbd
10962@item ^
10963@kindex ^ (Summary)
10964@findex gnus-summary-refer-parent-article
10965If you'd like to read the parent of the current article, and it is not
10966displayed in the summary buffer, you might still be able to. That is,
10967if the current group is fetched by @acronym{NNTP}, the parent hasn't expired
10968and the @code{References} in the current article are not mangled, you
10969can just press @kbd{^} or @kbd{A r}
10970(@code{gnus-summary-refer-parent-article}). If everything goes well,
10971you'll get the parent. If the parent is already displayed in the
10972summary buffer, point will just move to this article.
10973
10974If given a positive numerical prefix, fetch that many articles back into
10975the ancestry. If given a negative numerical prefix, fetch just that
10976ancestor. So if you say @kbd{3 ^}, Gnus will fetch the parent, the
10977grandparent and the grandgrandparent of the current article. If you say
10978@kbd{-3 ^}, Gnus will only fetch the grandgrandparent of the current
10979article.
10980
10981@item A R (Summary)
10982@findex gnus-summary-refer-references
10983@kindex A R (Summary)
10984Fetch all articles mentioned in the @code{References} header of the
10985article (@code{gnus-summary-refer-references}).
10986
10987@item A T (Summary)
10988@findex gnus-summary-refer-thread
10989@kindex A T (Summary)
10990Display the full thread where the current article appears
10991(@code{gnus-summary-refer-thread}). This command has to fetch all the
10992headers in the current group to work, so it usually takes a while. If
10993you do it often, you may consider setting @code{gnus-fetch-old-headers}
10994to @code{invisible} (@pxref{Filling In Threads}). This won't have any
10995visible effects normally, but it'll make this command work a whole lot
10996faster. Of course, it'll make group entry somewhat slow.
10997
10998@vindex gnus-refer-thread-limit
10999The @code{gnus-refer-thread-limit} variable says how many old (i. e.,
11000articles before the first displayed in the current group) headers to
11001fetch when doing this command. The default is 200. If @code{t}, all
11002the available headers will be fetched. This variable can be overridden
11003by giving the @kbd{A T} command a numerical prefix.
11004
11005@item M-^ (Summary)
11006@findex gnus-summary-refer-article
11007@kindex M-^ (Summary)
11008@cindex Message-ID
11009@cindex fetching by Message-ID
11010You can also ask Gnus for an arbitrary article, no matter what group it
11011belongs to. @kbd{M-^} (@code{gnus-summary-refer-article}) will ask you
11012for a @code{Message-ID}, which is one of those long, hard-to-read
11013thingies that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}.
11014You have to get it all exactly right. No fuzzy searches, I'm afraid.
11015
11016Gnus looks for the @code{Message-ID} in the headers that have already
11017been fetched, but also tries all the select methods specified by
11018@code{gnus-refer-article-method} if it is not found.
11019@end table
11020
11021@vindex gnus-refer-article-method
11022If the group you are reading is located on a back end that does not
11023support fetching by @code{Message-ID} very well (like @code{nnspool}),
11024you can set @code{gnus-refer-article-method} to an @acronym{NNTP} method. It
11025would, perhaps, be best if the @acronym{NNTP} server you consult is the one
11026updating the spool you are reading from, but that's not really
11027necessary.
11028
11029It can also be a list of select methods, as well as the special symbol
11030@code{current}, which means to use the current select method. If it
11031is a list, Gnus will try all the methods in the list until it finds a
11032match.
11033
11034Here's an example setting that will first try the current method, and
11035then ask Google if that fails:
11036
11037@lisp
11038(setq gnus-refer-article-method
11039 '(current
11040 (nnweb "google" (nnweb-type google))))
11041@end lisp
11042
11043Most of the mail back ends support fetching by @code{Message-ID}, but
11044do not do a particularly excellent job at it. That is, @code{nnmbox},
11045@code{nnbabyl}, @code{nnmaildir}, @code{nnml}, are able to locate
11046articles from any groups, while @code{nnfolder}, and @code{nnimap} are
11047only able to locate articles that have been posted to the current
11048group. (Anything else would be too time consuming.) @code{nnmh} does
11049not support this at all.
11050
11051
11052@node Alternative Approaches
11053@section Alternative Approaches
11054
11055Different people like to read news using different methods. This being
11056Gnus, we offer a small selection of minor modes for the summary buffers.
11057
11058@menu
11059* Pick and Read:: First mark articles and then read them.
11060* Binary Groups:: Auto-decode all articles.
11061@end menu
11062
11063
11064@node Pick and Read
11065@subsection Pick and Read
11066@cindex pick and read
11067
11068Some newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) use
11069a two-phased reading interface. The user first marks in a summary
11070buffer the articles she wants to read. Then she starts reading the
11071articles with just an article buffer displayed.
11072
11073@findex gnus-pick-mode
11074@kindex M-x gnus-pick-mode
11075Gnus provides a summary buffer minor mode that allows
11076this---@code{gnus-pick-mode}. This basically means that a few process
11077mark commands become one-keystroke commands to allow easy marking, and
11078it provides one additional command for switching to the summary buffer.
11079
11080Here are the available keystrokes when using pick mode:
11081
11082@table @kbd
11083@item .
11084@kindex . (Pick)
11085@findex gnus-pick-article-or-thread
11086Pick the article or thread on the current line
11087(@code{gnus-pick-article-or-thread}). If the variable
11088@code{gnus-thread-hide-subtree} is true, then this key selects the
11089entire thread when used at the first article of the thread. Otherwise,
11090it selects just the article. If given a numerical prefix, go to that
11091thread or article and pick it. (The line number is normally displayed
11092at the beginning of the summary pick lines.)
11093
11094@item SPACE
11095@kindex SPACE (Pick)
11096@findex gnus-pick-next-page
11097Scroll the summary buffer up one page (@code{gnus-pick-next-page}). If
11098at the end of the buffer, start reading the picked articles.
11099
11100@item u
11101@kindex u (Pick)
11102@findex gnus-pick-unmark-article-or-thread.
11103Unpick the thread or article
11104(@code{gnus-pick-unmark-article-or-thread}). If the variable
11105@code{gnus-thread-hide-subtree} is true, then this key unpicks the
11106thread if used at the first article of the thread. Otherwise it unpicks
11107just the article. You can give this key a numerical prefix to unpick
11108the thread or article at that line.
11109
11110@item RET
11111@kindex RET (Pick)
11112@findex gnus-pick-start-reading
11113@vindex gnus-pick-display-summary
11114Start reading the picked articles (@code{gnus-pick-start-reading}). If
11115given a prefix, mark all unpicked articles as read first. If
11116@code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer
11117will still be visible when you are reading.
11118
11119@end table
11120
11121All the normal summary mode commands are still available in the
11122pick-mode, with the exception of @kbd{u}. However @kbd{!} is available
11123which is mapped to the same function
11124@code{gnus-summary-tick-article-forward}.
11125
11126If this sounds like a good idea to you, you could say:
11127
11128@lisp
11129(add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
11130@end lisp
11131
11132@vindex gnus-pick-mode-hook
11133@code{gnus-pick-mode-hook} is run in pick minor mode buffers.
11134
11135@vindex gnus-mark-unpicked-articles-as-read
11136If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark
11137all unpicked articles as read. The default is @code{nil}.
11138
11139@vindex gnus-summary-pick-line-format
11140The summary line format in pick mode is slightly different from the
11141standard format. At the beginning of each line the line number is
11142displayed. The pick mode line format is controlled by the
11143@code{gnus-summary-pick-line-format} variable (@pxref{Formatting
11144Variables}). It accepts the same format specs that
11145@code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}).
11146
11147
11148@node Binary Groups
11149@subsection Binary Groups
11150@cindex binary groups
11151
11152@findex gnus-binary-mode
11153@kindex M-x gnus-binary-mode
11154If you spend much time in binary groups, you may grow tired of hitting
11155@kbd{X u}, @kbd{n}, @kbd{RET} all the time. @kbd{M-x gnus-binary-mode}
11156is a minor mode for summary buffers that makes all ordinary Gnus article
11157selection functions uudecode series of articles and display the result
11158instead of just displaying the articles the normal way.
11159
11160@kindex g (Binary)
11161@findex gnus-binary-show-article
11162The only way, in fact, to see the actual articles is the @kbd{g}
11163command, when you have turned on this mode
11164(@code{gnus-binary-show-article}).
11165
11166@vindex gnus-binary-mode-hook
11167@code{gnus-binary-mode-hook} is called in binary minor mode buffers.
11168
11169
11170@node Tree Display
11171@section Tree Display
11172@cindex trees
11173
11174@vindex gnus-use-trees
11175If you don't like the normal Gnus summary display, you might try setting
11176@code{gnus-use-trees} to @code{t}. This will create (by default) an
11177additional @dfn{tree buffer}. You can execute all summary mode commands
11178in the tree buffer.
11179
11180There are a few variables to customize the tree display, of course:
11181
11182@table @code
11183@item gnus-tree-mode-hook
11184@vindex gnus-tree-mode-hook
11185A hook called in all tree mode buffers.
11186
11187@item gnus-tree-mode-line-format
11188@vindex gnus-tree-mode-line-format
11189A format string for the mode bar in the tree mode buffers (@pxref{Mode
11190Line Formatting}). The default is @samp{Gnus: %%b %S %Z}. For a list
11191of valid specs, @pxref{Summary Buffer Mode Line}.
11192
11193@item gnus-selected-tree-face
11194@vindex gnus-selected-tree-face
11195Face used for highlighting the selected article in the tree buffer. The
11196default is @code{modeline}.
11197
11198@item gnus-tree-line-format
11199@vindex gnus-tree-line-format
11200A format string for the tree nodes. The name is a bit of a misnomer,
11201though---it doesn't define a line, but just the node. The default value
11202is @samp{%(%[%3,3n%]%)}, which displays the first three characters of
11203the name of the poster. It is vital that all nodes are of the same
11204length, so you @emph{must} use @samp{%4,4n}-like specifiers.
11205
11206Valid specs are:
11207
11208@table @samp
11209@item n
11210The name of the poster.
11211@item f
11212The @code{From} header.
11213@item N
11214The number of the article.
11215@item [
11216The opening bracket.
11217@item ]
11218The closing bracket.
11219@item s
11220The subject.
11221@end table
11222
11223@xref{Formatting Variables}.
11224
11225Variables related to the display are:
11226
11227@table @code
11228@item gnus-tree-brackets
11229@vindex gnus-tree-brackets
11230This is used for differentiating between ``real'' articles and
11231``sparse'' articles. The format is
11232@example
11233((@var{real-open} . @var{real-close})
11234 (@var{sparse-open} . @var{sparse-close})
11235 (@var{dummy-open} . @var{dummy-close}))
11236@end example
11237and the default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))}.
11238
11239@item gnus-tree-parent-child-edges
11240@vindex gnus-tree-parent-child-edges
11241This is a list that contains the characters used for connecting parent
11242nodes to their children. The default is @code{(?- ?\\ ?|)}.
11243
11244@end table
11245
11246@item gnus-tree-minimize-window
11247@vindex gnus-tree-minimize-window
11248If this variable is non-@code{nil}, Gnus will try to keep the tree
11249buffer as small as possible to allow more room for the other Gnus
11250windows. If this variable is a number, the tree buffer will never be
11251higher than that number. The default is @code{t}. Note that if you
11252have several windows displayed side-by-side in a frame and the tree
11253buffer is one of these, minimizing the tree window will also resize all
11254other windows displayed next to it.
11255
11256You may also wish to add the following hook to keep the window minimized
11257at all times:
11258
11259@lisp
11260(add-hook 'gnus-configure-windows-hook
11261 'gnus-tree-perhaps-minimize)
11262@end lisp
11263
11264@item gnus-generate-tree-function
11265@vindex gnus-generate-tree-function
11266@findex gnus-generate-horizontal-tree
11267@findex gnus-generate-vertical-tree
11268The function that actually generates the thread tree. Two predefined
11269functions are available: @code{gnus-generate-horizontal-tree} and
11270@code{gnus-generate-vertical-tree} (which is the default).
11271
11272@end table
11273
11274Here's an example from a horizontal tree buffer:
11275
11276@example
11277@{***@}-(***)-[odd]-[Gun]
11278 | \[Jan]
11279 | \[odd]-[Eri]
11280 | \(***)-[Eri]
11281 | \[odd]-[Paa]
11282 \[Bjo]
11283 \[Gun]
11284 \[Gun]-[Jor]
11285@end example
11286
11287Here's the same thread displayed in a vertical tree buffer:
11288
11289@example
11290@group
11291@{***@}
11292 |--------------------------\-----\-----\
11293(***) [Bjo] [Gun] [Gun]
11294 |--\-----\-----\ |
11295[odd] [Jan] [odd] (***) [Jor]
11296 | | |--\
11297[Gun] [Eri] [Eri] [odd]
11298 |
11299 [Paa]
11300@end group
11301@end example
11302
11303If you're using horizontal trees, it might be nice to display the trees
11304side-by-side with the summary buffer. You could add something like the
11305following to your @file{~/.gnus.el} file:
11306
11307@lisp
11308(setq gnus-use-trees t
11309 gnus-generate-tree-function 'gnus-generate-horizontal-tree
11310 gnus-tree-minimize-window nil)
11311(gnus-add-configuration
11312 '(article
11313 (vertical 1.0
11314 (horizontal 0.25
11315 (summary 0.75 point)
11316 (tree 1.0))
11317 (article 1.0))))
11318@end lisp
11319
11320@xref{Window Layout}.
11321
11322
11323@node Mail Group Commands
11324@section Mail Group Commands
11325@cindex mail group commands
11326
11327Some commands only make sense in mail groups. If these commands are
11328invalid in the current group, they will raise a hell and let you know.
11329
11330All these commands (except the expiry and edit commands) use the
11331process/prefix convention (@pxref{Process/Prefix}).
11332
11333@table @kbd
11334
11335@item B e
11336@kindex B e (Summary)
11337@findex gnus-summary-expire-articles
11338@cindex expiring mail
11339Run all expirable articles in the current group through the expiry
11340process (@code{gnus-summary-expire-articles}). That is, delete all
11341expirable articles in the group that have been around for a while.
11342(@pxref{Expiring Mail}).
11343
11344@item B C-M-e
11345@kindex B C-M-e (Summary)
11346@findex gnus-summary-expire-articles-now
11347@cindex expiring mail
11348Delete all the expirable articles in the group
11349(@code{gnus-summary-expire-articles-now}). This means that @strong{all}
11350articles eligible for expiry in the current group will
11351disappear forever into that big @file{/dev/null} in the sky.
11352
11353@item B DEL
11354@kindex B DEL (Summary)
b1519d85 11355@cindex deleting mail
4009494e
GM
11356@findex gnus-summary-delete-article
11357@c @icon{gnus-summary-mail-delete}
11358Delete the mail article. This is ``delete'' as in ``delete it from your
11359disk forever and ever, never to return again.'' Use with caution.
11360(@code{gnus-summary-delete-article}).
11361
11362@item B m
11363@kindex B m (Summary)
11364@cindex move mail
11365@findex gnus-summary-move-article
11366@vindex gnus-preserve-marks
11367Move the article from one mail group to another
11368(@code{gnus-summary-move-article}). Marks will be preserved if
11369@code{gnus-preserve-marks} is non-@code{nil} (which is the default).
11370
11371@item B c
11372@kindex B c (Summary)
11373@cindex copy mail
11374@findex gnus-summary-copy-article
11375@c @icon{gnus-summary-mail-copy}
11376Copy the article from one group (mail group or not) to a mail group
11377(@code{gnus-summary-copy-article}). Marks will be preserved if
11378@code{gnus-preserve-marks} is non-@code{nil} (which is the default).
11379
11380@item B B
11381@kindex B B (Summary)
11382@cindex crosspost mail
11383@findex gnus-summary-crosspost-article
11384Crosspost the current article to some other group
11385(@code{gnus-summary-crosspost-article}). This will create a new copy of
11386the article in the other group, and the Xref headers of the article will
11387be properly updated.
11388
11389@item B i
11390@kindex B i (Summary)
11391@findex gnus-summary-import-article
11392Import an arbitrary file into the current mail newsgroup
11393(@code{gnus-summary-import-article}). You will be prompted for a file
11394name, a @code{From} header and a @code{Subject} header.
11395
11396@item B I
11397@kindex B I (Summary)
11398@findex gnus-summary-create-article
11399Create an empty article in the current mail newsgroups
11400(@code{gnus-summary-create-article}). You will be prompted for a
11401@code{From} header and a @code{Subject} header.
11402
11403@item B r
11404@kindex B r (Summary)
11405@findex gnus-summary-respool-article
11406@vindex gnus-summary-respool-default-method
11407Respool the mail article (@code{gnus-summary-respool-article}).
11408@code{gnus-summary-respool-default-method} will be used as the default
11409select method when respooling. This variable is @code{nil} by default,
11410which means that the current group select method will be used instead.
11411Marks will be preserved if @code{gnus-preserve-marks} is non-@code{nil}
11412(which is the default).
11413
11414@item B w
11415@itemx e
11416@kindex B w (Summary)
11417@kindex e (Summary)
11418@findex gnus-summary-edit-article
11419@kindex C-c C-c (Article)
11420@findex gnus-summary-edit-article-done
11421Edit the current article (@code{gnus-summary-edit-article}). To finish
11422editing and make the changes permanent, type @kbd{C-c C-c}
11423(@code{gnus-summary-edit-article-done}). If you give a prefix to the
11424@kbd{C-c C-c} command, Gnus won't re-highlight the article.
11425
11426@item B q
11427@kindex B q (Summary)
11428@findex gnus-summary-respool-query
11429If you want to re-spool an article, you might be curious as to what group
11430the article will end up in before you do the re-spooling. This command
11431will tell you (@code{gnus-summary-respool-query}).
11432
11433@item B t
11434@kindex B t (Summary)
11435@findex gnus-summary-respool-trace
11436Similarly, this command will display all fancy splitting patterns used
11437when respooling, if any (@code{gnus-summary-respool-trace}).
11438
11439@item B p
11440@kindex B p (Summary)
11441@findex gnus-summary-article-posted-p
11442Some people have a tendency to send you ``courtesy'' copies when they
11443follow up to articles you have posted. These usually have a
11444@code{Newsgroups} header in them, but not always. This command
11445(@code{gnus-summary-article-posted-p}) will try to fetch the current
11446article from your news server (or rather, from
11447@code{gnus-refer-article-method} or @code{gnus-select-method}) and will
11448report back whether it found the article or not. Even if it says that
11449it didn't find the article, it may have been posted anyway---mail
11450propagation is much faster than news propagation, and the news copy may
11451just not have arrived yet.
11452
11453@item K E
11454@kindex K E (Summary)
11455@findex gnus-article-encrypt-body
11456@vindex gnus-article-encrypt-protocol
11457Encrypt the body of an article (@code{gnus-article-encrypt-body}).
11458The body is encrypted with the encryption protocol specified by the
11459variable @code{gnus-article-encrypt-protocol}.
11460
11461@end table
11462
11463@vindex gnus-move-split-methods
11464@cindex moving articles
11465If you move (or copy) articles regularly, you might wish to have Gnus
11466suggest where to put the articles. @code{gnus-move-split-methods} is a
11467variable that uses the same syntax as @code{gnus-split-methods}
11468(@pxref{Saving Articles}). You may customize that variable to create
11469suggestions you find reasonable. (Note that
11470@code{gnus-move-split-methods} uses group names where
11471@code{gnus-split-methods} uses file names.)
11472
11473@lisp
11474(setq gnus-move-split-methods
11475 '(("^From:.*Lars Magne" "nnml:junk")
11476 ("^Subject:.*gnus" "nnfolder:important")
11477 (".*" "nnml:misc")))
11478@end lisp
11479
11480
11481@node Various Summary Stuff
11482@section Various Summary Stuff
11483
11484@menu
11485* Summary Group Information:: Information oriented commands.
11486* Searching for Articles:: Multiple article commands.
11487* Summary Generation Commands::
11488* Really Various Summary Commands:: Those pesky non-conformant commands.
11489@end menu
11490
11491@table @code
11492@vindex gnus-summary-display-while-building
11493@item gnus-summary-display-while-building
11494If non-@code{nil}, show and update the summary buffer as it's being
11495built. If @code{t}, update the buffer after every line is inserted.
11496If the value is an integer, @var{n}, update the display every @var{n}
11497lines. The default is @code{nil}.
11498
11499@vindex gnus-summary-display-arrow
11500@item gnus-summary-display-arrow
11501If non-@code{nil}, display an arrow in the fringe to indicate the
11502current article.
11503
11504@vindex gnus-summary-mode-hook
11505@item gnus-summary-mode-hook
11506This hook is called when creating a summary mode buffer.
11507
11508@vindex gnus-summary-generate-hook
11509@item gnus-summary-generate-hook
11510This is called as the last thing before doing the threading and the
11511generation of the summary buffer. It's quite convenient for customizing
11512the threading variables based on what data the newsgroup has. This hook
11513is called from the summary buffer after most summary buffer variables
11514have been set.
11515
11516@vindex gnus-summary-prepare-hook
11517@item gnus-summary-prepare-hook
11518It is called after the summary buffer has been generated. You might use
11519it to, for instance, highlight lines or modify the look of the buffer in
11520some other ungodly manner. I don't care.
11521
11522@vindex gnus-summary-prepared-hook
11523@item gnus-summary-prepared-hook
11524A hook called as the very last thing after the summary buffer has been
11525generated.
11526
11527@vindex gnus-summary-ignore-duplicates
11528@item gnus-summary-ignore-duplicates
11529When Gnus discovers two articles that have the same @code{Message-ID},
11530it has to do something drastic. No articles are allowed to have the
11531same @code{Message-ID}, but this may happen when reading mail from some
11532sources. Gnus allows you to customize what happens with this variable.
11533If it is @code{nil} (which is the default), Gnus will rename the
11534@code{Message-ID} (for display purposes only) and display the article as
11535any other article. If this variable is @code{t}, it won't display the
11536article---it'll be as if it never existed.
11537
11538@vindex gnus-alter-articles-to-read-function
11539@item gnus-alter-articles-to-read-function
11540This function, which takes two parameters (the group name and the list
11541of articles to be selected), is called to allow the user to alter the
11542list of articles to be selected.
11543
11544For instance, the following function adds the list of cached articles to
11545the list in one particular group:
11546
11547@lisp
11548(defun my-add-cached-articles (group articles)
11549 (if (string= group "some.group")
11550 (append gnus-newsgroup-cached articles)
11551 articles))
11552@end lisp
11553
11554@vindex gnus-newsgroup-variables
11555@item gnus-newsgroup-variables
11556A list of newsgroup (summary buffer) local variables, or cons of
11557variables and their default expressions to be evalled (when the default
11558values are not @code{nil}), that should be made global while the summary
11559buffer is active.
11560
11561Note: The default expressions will be evaluated (using function
11562@code{eval}) before assignment to the local variable rather than just
11563assigned to it. If the default expression is the symbol @code{global},
11564that symbol will not be evaluated but the global value of the local
11565variable will be used instead.
11566
11567These variables can be used to set variables in the group parameters
11568while still allowing them to affect operations done in other
11569buffers. For example:
11570
11571@lisp
11572(setq gnus-newsgroup-variables
11573 '(message-use-followup-to
11574 (gnus-visible-headers .
11575 "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^To:")))
11576@end lisp
11577
11578Also @pxref{Group Parameters}.
3a23a519
MB
11579
11580@vindex gnus-propagate-marks
11581@item gnus-propagate-marks
11582If non-@code{nil}, propagate marks to the backends for possible
11583storing. @xref{NNTP marks}, and friends, for a more fine-grained
11584sieve.
11585
4009494e
GM
11586@end table
11587
11588
11589@node Summary Group Information
11590@subsection Summary Group Information
11591
11592@table @kbd
11593
11594@item H f
11595@kindex H f (Summary)
11596@findex gnus-summary-fetch-faq
11597@vindex gnus-group-faq-directory
11598Try to fetch the @acronym{FAQ} (list of frequently asked questions)
11599for the current group (@code{gnus-summary-fetch-faq}). Gnus will try
11600to get the @acronym{FAQ} from @code{gnus-group-faq-directory}, which
11601is usually a directory on a remote machine. This variable can also be
11602a list of directories. In that case, giving a prefix to this command
11603will allow you to choose between the various sites. @code{ange-ftp}
11604or @code{efs} will probably be used for fetching the file.
11605
11606@item H d
11607@kindex H d (Summary)
11608@findex gnus-summary-describe-group
11609Give a brief description of the current group
11610(@code{gnus-summary-describe-group}). If given a prefix, force
11611rereading the description from the server.
11612
11613@item H h
11614@kindex H h (Summary)
11615@findex gnus-summary-describe-briefly
11616Give an extremely brief description of the most important summary
11617keystrokes (@code{gnus-summary-describe-briefly}).
11618
11619@item H i
11620@kindex H i (Summary)
11621@findex gnus-info-find-node
11622Go to the Gnus info node (@code{gnus-info-find-node}).
11623@end table
11624
11625
11626@node Searching for Articles
11627@subsection Searching for Articles
11628
11629@table @kbd
11630
11631@item M-s
11632@kindex M-s (Summary)
11633@findex gnus-summary-search-article-forward
11634Search through all subsequent (raw) articles for a regexp
11635(@code{gnus-summary-search-article-forward}).
11636
11637@item M-r
11638@kindex M-r (Summary)
11639@findex gnus-summary-search-article-backward
11640Search through all previous (raw) articles for a regexp
11641(@code{gnus-summary-search-article-backward}).
11642
01c52d31
MB
11643@item M-S
11644@kindex M-S (Summary)
11645@findex gnus-summary-repeat-search-article-forward
11646Repeat the previous search forwards
11647(@code{gnus-summary-repeat-search-article-forward}).
11648
11649@item M-R
11650@kindex M-R (Summary)
11651@findex gnus-summary-repeat-search-article-backward
11652Repeat the previous search backwards
11653(@code{gnus-summary-repeat-search-article-backward}).
11654
4009494e
GM
11655@item &
11656@kindex & (Summary)
11657@findex gnus-summary-execute-command
11658This command will prompt you for a header, a regular expression to match
11659on this field, and a command to be executed if the match is made
11660(@code{gnus-summary-execute-command}). If the header is an empty
11661string, the match is done on the entire article. If given a prefix,
11662search backward instead.
11663
11664For instance, @kbd{& RET some.*string RET #} will put the process mark on
11665all articles that have heads or bodies that match @samp{some.*string}.
11666
11667@item M-&
11668@kindex M-& (Summary)
11669@findex gnus-summary-universal-argument
11670Perform any operation on all articles that have been marked with
11671the process mark (@code{gnus-summary-universal-argument}).
11672@end table
11673
11674@node Summary Generation Commands
11675@subsection Summary Generation Commands
11676
11677@table @kbd
11678
11679@item Y g
11680@kindex Y g (Summary)
11681@findex gnus-summary-prepare
11682Regenerate the current summary buffer (@code{gnus-summary-prepare}).
11683
11684@item Y c
11685@kindex Y c (Summary)
11686@findex gnus-summary-insert-cached-articles
11687Pull all cached articles (for the current group) into the summary buffer
11688(@code{gnus-summary-insert-cached-articles}).
11689
11690@item Y d
11691@kindex Y d (Summary)
11692@findex gnus-summary-insert-dormant-articles
11693Pull all dormant articles (for the current group) into the summary buffer
11694(@code{gnus-summary-insert-dormant-articles}).
11695
01c52d31
MB
11696@item Y t
11697@kindex Y t (Summary)
11698@findex gnus-summary-insert-ticked-articles
11699Pull all ticked articles (for the current group) into the summary buffer
11700(@code{gnus-summary-insert-ticked-articles}).
11701
4009494e
GM
11702@end table
11703
11704
11705@node Really Various Summary Commands
11706@subsection Really Various Summary Commands
11707
11708@table @kbd
11709
11710@item A D
11711@itemx C-d
11712@kindex C-d (Summary)
11713@kindex A D (Summary)
11714@findex gnus-summary-enter-digest-group
11715If the current article is a collection of other articles (for instance,
11716a digest), you might use this command to enter a group based on the that
11717article (@code{gnus-summary-enter-digest-group}). Gnus will try to
11718guess what article type is currently displayed unless you give a prefix
11719to this command, which forces a ``digest'' interpretation. Basically,
11720whenever you see a message that is a collection of other messages of
11721some format, you @kbd{C-d} and read these messages in a more convenient
11722fashion.
11723
01c52d31
MB
11724@vindex gnus-auto-select-on-ephemeral-exit
11725The variable @code{gnus-auto-select-on-ephemeral-exit} controls what
11726article should be selected after exiting a digest group. Valid values
11727include:
11728
11729@table @code
11730@item next
11731Select the next article.
11732
11733@item next-unread
11734Select the next unread article.
11735
11736@item next-noselect
11737Move the cursor to the next article. This is the default.
11738
11739@item next-unread-noselect
11740Move the cursor to the next unread article.
11741@end table
11742
11743If it has any other value or there is no next (unread) article, the
11744article selected before entering to the digest group will appear.
11745
4009494e
GM
11746@item C-M-d
11747@kindex C-M-d (Summary)
11748@findex gnus-summary-read-document
11749This command is very similar to the one above, but lets you gather
11750several documents into one biiig group
11751(@code{gnus-summary-read-document}). It does this by opening several
11752@code{nndoc} groups for each document, and then opening an
11753@code{nnvirtual} group on top of these @code{nndoc} groups. This
11754command understands the process/prefix convention
11755(@pxref{Process/Prefix}).
11756
11757@item C-t
11758@kindex C-t (Summary)
11759@findex gnus-summary-toggle-truncation
11760Toggle truncation of summary lines
11761(@code{gnus-summary-toggle-truncation}). This will probably confuse the
11762line centering function in the summary buffer, so it's not a good idea
11763to have truncation switched off while reading articles.
11764
11765@item =
11766@kindex = (Summary)
11767@findex gnus-summary-expand-window
11768Expand the summary buffer window (@code{gnus-summary-expand-window}).
11769If given a prefix, force an @code{article} window configuration.
11770
11771@item C-M-e
11772@kindex C-M-e (Summary)
11773@findex gnus-summary-edit-parameters
11774Edit the group parameters (@pxref{Group Parameters}) of the current
11775group (@code{gnus-summary-edit-parameters}).
11776
11777@item C-M-a
11778@kindex C-M-a (Summary)
11779@findex gnus-summary-customize-parameters
11780Customize the group parameters (@pxref{Group Parameters}) of the current
11781group (@code{gnus-summary-customize-parameters}).
11782
11783@end table
11784
11785
11786@node Exiting the Summary Buffer
11787@section Exiting the Summary Buffer
11788@cindex summary exit
11789@cindex exiting groups
11790
11791Exiting from the summary buffer will normally update all info on the
11792group and return you to the group buffer.
11793
11794@table @kbd
11795
11796@item Z Z
11797@itemx Z Q
11798@itemx q
11799@kindex Z Z (Summary)
11800@kindex Z Q (Summary)
11801@kindex q (Summary)
11802@findex gnus-summary-exit
11803@vindex gnus-summary-exit-hook
11804@vindex gnus-summary-prepare-exit-hook
11805@vindex gnus-group-no-more-groups-hook
11806@c @icon{gnus-summary-exit}
11807Exit the current group and update all information on the group
11808(@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} is
11809called before doing much of the exiting, which calls
11810@code{gnus-summary-expire-articles} by default.
11811@code{gnus-summary-exit-hook} is called after finishing the exit
11812process. @code{gnus-group-no-more-groups-hook} is run when returning to
11813group mode having no more (unread) groups.
11814
11815@item Z E
11816@itemx Q
11817@kindex Z E (Summary)
11818@kindex Q (Summary)
11819@findex gnus-summary-exit-no-update
11820Exit the current group without updating any information on the group
11821(@code{gnus-summary-exit-no-update}).
11822
11823@item Z c
11824@itemx c
11825@kindex Z c (Summary)
11826@kindex c (Summary)
11827@findex gnus-summary-catchup-and-exit
11828@c @icon{gnus-summary-catchup-and-exit}
11829Mark all unticked articles in the group as read and then exit
11830(@code{gnus-summary-catchup-and-exit}).
11831
11832@item Z C
11833@kindex Z C (Summary)
11834@findex gnus-summary-catchup-all-and-exit
11835Mark all articles, even the ticked ones, as read and then exit
11836(@code{gnus-summary-catchup-all-and-exit}).
11837
11838@item Z n
11839@kindex Z n (Summary)
11840@findex gnus-summary-catchup-and-goto-next-group
11841Mark all articles as read and go to the next group
11842(@code{gnus-summary-catchup-and-goto-next-group}).
11843
01c52d31
MB
11844@item Z p
11845@kindex Z p (Summary)
11846@findex gnus-summary-catchup-and-goto-prev-group
11847Mark all articles as read and go to the previous group
11848(@code{gnus-summary-catchup-and-goto-prev-group}).
11849
4009494e
GM
11850@item Z R
11851@itemx C-x C-s
11852@kindex Z R (Summary)
11853@kindex C-x C-s (Summary)
11854@findex gnus-summary-reselect-current-group
11855Exit this group, and then enter it again
11856(@code{gnus-summary-reselect-current-group}). If given a prefix, select
11857all articles, both read and unread.
11858
11859@item Z G
11860@itemx M-g
11861@kindex Z G (Summary)
11862@kindex M-g (Summary)
11863@findex gnus-summary-rescan-group
11864@c @icon{gnus-summary-mail-get}
11865Exit the group, check for new articles in the group, and select the
11866group (@code{gnus-summary-rescan-group}). If given a prefix, select all
11867articles, both read and unread.
11868
11869@item Z N
11870@kindex Z N (Summary)
11871@findex gnus-summary-next-group
11872Exit the group and go to the next group
11873(@code{gnus-summary-next-group}).
11874
11875@item Z P
11876@kindex Z P (Summary)
11877@findex gnus-summary-prev-group
11878Exit the group and go to the previous group
11879(@code{gnus-summary-prev-group}).
11880
11881@item Z s
11882@kindex Z s (Summary)
11883@findex gnus-summary-save-newsrc
11884Save the current number of read/marked articles in the dribble buffer
11885and then save the dribble buffer (@code{gnus-summary-save-newsrc}). If
11886given a prefix, also save the @file{.newsrc} file(s). Using this
11887command will make exit without updating (the @kbd{Q} command) worthless.
11888@end table
11889
11890@vindex gnus-exit-group-hook
11891@code{gnus-exit-group-hook} is called when you exit the current group
11892with an ``updating'' exit. For instance @kbd{Q}
11893(@code{gnus-summary-exit-no-update}) does not call this hook.
11894
11895@findex gnus-summary-wake-up-the-dead
11896@findex gnus-dead-summary-mode
11897@vindex gnus-kill-summary-on-exit
11898If you're in the habit of exiting groups, and then changing your mind
11899about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}.
11900If you do that, Gnus won't kill the summary buffer when you exit it.
11901(Quelle surprise!) Instead it will change the name of the buffer to
11902something like @samp{*Dead Summary ... *} and install a minor mode
11903called @code{gnus-dead-summary-mode}. Now, if you switch back to this
11904buffer, you'll find that all keys are mapped to a function called
11905@code{gnus-summary-wake-up-the-dead}. So tapping any keys in a dead
11906summary buffer will result in a live, normal summary buffer.
11907
11908There will never be more than one dead summary buffer at any one time.
11909
11910@vindex gnus-use-cross-reference
11911The data on the current group will be updated (which articles you have
11912read, which articles you have replied to, etc.) when you exit the
11913summary buffer. If the @code{gnus-use-cross-reference} variable is
11914@code{t} (which is the default), articles that are cross-referenced to
11915this group and are marked as read, will also be marked as read in the
11916other subscribed groups they were cross-posted to. If this variable is
11917neither @code{nil} nor @code{t}, the article will be marked as read in
11918both subscribed and unsubscribed groups (@pxref{Crosspost Handling}).
11919
11920
11921@node Crosspost Handling
11922@section Crosspost Handling
11923
11924@cindex velveeta
11925@cindex spamming
11926Marking cross-posted articles as read ensures that you'll never have to
11927read the same article more than once. Unless, of course, somebody has
11928posted it to several groups separately. Posting the same article to
11929several groups (not cross-posting) is called @dfn{spamming}, and you are
11930by law required to send nasty-grams to anyone who perpetrates such a
11931heinous crime. You may want to try NoCeM handling to filter out spam
11932(@pxref{NoCeM}).
11933
11934Remember: Cross-posting is kinda ok, but posting the same article
11935separately to several groups is not. Massive cross-posting (aka.
11936@dfn{velveeta}) is to be avoided at all costs, and you can even use the
11937@code{gnus-summary-mail-crosspost-complaint} command to complain about
11938excessive crossposting (@pxref{Summary Mail Commands}).
11939
11940@cindex cross-posting
11941@cindex Xref
11942@cindex @acronym{NOV}
11943One thing that may cause Gnus to not do the cross-posting thing
11944correctly is if you use an @acronym{NNTP} server that supports @sc{xover}
11945(which is very nice, because it speeds things up considerably) which
11946does not include the @code{Xref} header in its @acronym{NOV} lines. This is
11947Evil, but all too common, alas, alack. Gnus tries to Do The Right Thing
11948even with @sc{xover} by registering the @code{Xref} lines of all
11949articles you actually read, but if you kill the articles, or just mark
11950them as read without reading them, Gnus will not get a chance to snoop
11951the @code{Xref} lines out of these articles, and will be unable to use
11952the cross reference mechanism.
11953
11954@cindex LIST overview.fmt
11955@cindex overview.fmt
11956To check whether your @acronym{NNTP} server includes the @code{Xref} header
11957in its overview files, try @samp{telnet your.nntp.server nntp},
11958@samp{MODE READER} on @code{inn} servers, and then say @samp{LIST
11959overview.fmt}. This may not work, but if it does, and the last line you
11960get does not read @samp{Xref:full}, then you should shout and whine at
11961your news admin until she includes the @code{Xref} header in the
11962overview files.
11963
4009494e 11964If you want Gnus to get the @code{Xref}s right all the time, you have to
4b70e299
MB
11965set @code{nntp-nov-is-evil} to @code{t}, which slows things down
11966considerably. Also @pxref{Slow/Expensive Connection}.
4009494e
GM
11967
11968C'est la vie.
11969
11970For an alternative approach, @pxref{Duplicate Suppression}.
11971
11972
11973@node Duplicate Suppression
11974@section Duplicate Suppression
11975
11976By default, Gnus tries to make sure that you don't have to read the same
11977article more than once by utilizing the crossposting mechanism
11978(@pxref{Crosspost Handling}). However, that simple and efficient
11979approach may not work satisfactory for some users for various
11980reasons.
11981
11982@enumerate
11983@item
11984The @acronym{NNTP} server may fail to generate the @code{Xref} header. This
11985is evil and not very common.
11986
11987@item
11988The @acronym{NNTP} server may fail to include the @code{Xref} header in the
11989@file{.overview} data bases. This is evil and all too common, alas.
11990
11991@item
11992You may be reading the same group (or several related groups) from
11993different @acronym{NNTP} servers.
11994
11995@item
11996You may be getting mail that duplicates articles posted to groups.
11997@end enumerate
11998
11999I'm sure there are other situations where @code{Xref} handling fails as
12000well, but these four are the most common situations.
12001
12002If, and only if, @code{Xref} handling fails for you, then you may
12003consider switching on @dfn{duplicate suppression}. If you do so, Gnus
12004will remember the @code{Message-ID}s of all articles you have read or
12005otherwise marked as read, and then, as if by magic, mark them as read
12006all subsequent times you see them---in @emph{all} groups. Using this
12007mechanism is quite likely to be somewhat inefficient, but not overly
12008so. It's certainly preferable to reading the same articles more than
12009once.
12010
12011Duplicate suppression is not a very subtle instrument. It's more like a
12012sledge hammer than anything else. It works in a very simple
12013fashion---if you have marked an article as read, it adds this Message-ID
12014to a cache. The next time it sees this Message-ID, it will mark the
12015article as read with the @samp{M} mark. It doesn't care what group it
12016saw the article in.
12017
12018@table @code
12019@item gnus-suppress-duplicates
12020@vindex gnus-suppress-duplicates
12021If non-@code{nil}, suppress duplicates.
12022
12023@item gnus-save-duplicate-list
12024@vindex gnus-save-duplicate-list
12025If non-@code{nil}, save the list of duplicates to a file. This will
12026make startup and shutdown take longer, so the default is @code{nil}.
12027However, this means that only duplicate articles read in a single Gnus
12028session are suppressed.
12029
12030@item gnus-duplicate-list-length
12031@vindex gnus-duplicate-list-length
12032This variable says how many @code{Message-ID}s to keep in the duplicate
12033suppression list. The default is 10000.
12034
12035@item gnus-duplicate-file
12036@vindex gnus-duplicate-file
12037The name of the file to store the duplicate suppression list in. The
12038default is @file{~/News/suppression}.
12039@end table
12040
12041If you have a tendency to stop and start Gnus often, setting
12042@code{gnus-save-duplicate-list} to @code{t} is probably a good idea. If
12043you leave Gnus running for weeks on end, you may have it @code{nil}. On
12044the other hand, saving the list makes startup and shutdown much slower,
12045so that means that if you stop and start Gnus often, you should set
12046@code{gnus-save-duplicate-list} to @code{nil}. Uhm. I'll leave this up
12047to you to figure out, I think.
12048
12049@node Security
12050@section Security
12051
12052Gnus is able to verify signed messages or decrypt encrypted messages.
12053The formats that are supported are @acronym{PGP}, @acronym{PGP/MIME}
12054and @acronym{S/MIME}, however you need some external programs to get
12055things to work:
12056
12057@enumerate
12058@item
12059To handle @acronym{PGP} and @acronym{PGP/MIME} messages, you have to
12060install an OpenPGP implementation such as GnuPG. The Lisp interface
8c9bb6f5
DU
12061to GnuPG included with Emacs is called EasyPG (@pxref{Top, ,EasyPG,
12062epa, EasyPG Assistant user's manual}), but PGG (@pxref{Top, ,PGG, pgg,
12063PGG Manual}), Mailcrypt, and gpg.el are also supported.
4009494e
GM
12064
12065@item
12066To handle @acronym{S/MIME} message, you need to install OpenSSL. OpenSSL 0.9.6
12067or newer is recommended.
12068
12069@end enumerate
12070
4146636e
KY
12071The variables that control security functionality on reading/composing
12072messages include:
4009494e
GM
12073
12074@table @code
12075@item mm-verify-option
12076@vindex mm-verify-option
12077Option of verifying signed parts. @code{never}, not verify;
12078@code{always}, always verify; @code{known}, only verify known
12079protocols. Otherwise, ask user.
12080
12081@item mm-decrypt-option
12082@vindex mm-decrypt-option
12083Option of decrypting encrypted parts. @code{never}, no decryption;
12084@code{always}, always decrypt; @code{known}, only decrypt known
12085protocols. Otherwise, ask user.
12086
4146636e
KY
12087@item mm-sign-option
12088@vindex mm-sign-option
12089Option of creating signed parts. @code{nil}, use default signing
12090keys; @code{guided}, ask user to select signing keys from the menu.
12091
12092@item mm-encrypt-option
12093@vindex mm-encrypt-option
12094Option of creating encrypted parts. @code{nil}, use the first
12095public-key matching the @samp{From:} header as the recipient;
12096@code{guided}, ask user to select recipient keys from the menu.
12097
4009494e
GM
12098@item mml1991-use
12099@vindex mml1991-use
12100Symbol indicating elisp interface to OpenPGP implementation for
7f3bc720
DU
12101@acronym{PGP} messages. The default is @code{epg}, but @code{pgg},
12102@code{mailcrypt}, and @code{gpg} are also supported although
8c9bb6f5 12103deprecated. By default, Gnus uses the first available interface in
71fbd643 12104this order.
4009494e
GM
12105
12106@item mml2015-use
12107@vindex mml2015-use
12108Symbol indicating elisp interface to OpenPGP implementation for
7f3bc720
DU
12109@acronym{PGP/MIME} messages. The default is @code{epg}, but
12110@code{pgg}, @code{mailcrypt}, and @code{gpg} are also supported
71fbd643 12111although deprecated. By default, Gnus uses the first available
8c9bb6f5 12112interface in this order.
4009494e
GM
12113
12114@end table
12115
12116By default the buttons that display security information are not
12117shown, because they clutter reading the actual e-mail. You can type
12118@kbd{K b} manually to display the information. Use the
12119@code{gnus-buttonized-mime-types} and
12120@code{gnus-unbuttonized-mime-types} variables to control this
12121permanently. @ref{MIME Commands} for further details, and hints on
12122how to customize these variables to always display security
12123information.
12124
12125@cindex snarfing keys
12126@cindex importing PGP keys
12127@cindex PGP key ring import
12128Snarfing OpenPGP keys (i.e., importing keys from articles into your
12129key ring) is not supported explicitly through a menu item or command,
12130rather Gnus do detect and label keys as @samp{application/pgp-keys},
12131allowing you to specify whatever action you think is appropriate
12132through the usual @acronym{MIME} infrastructure. You can use a
12133@file{~/.mailcap} entry (@pxref{mailcap, , mailcap, emacs-mime, The
12134Emacs MIME Manual}) such as the following to import keys using GNU
12135Privacy Guard when you click on the @acronym{MIME} button
12136(@pxref{Using MIME}).
12137
12138@example
12139application/pgp-keys; gpg --import --interactive --verbose; needsterminal
12140@end example
12141@noindent
12142This happens to also be the default action defined in
12143@code{mailcap-mime-data}.
12144
12145More information on how to set things for sending outgoing signed and
12146encrypted messages up can be found in the message manual
12147(@pxref{Security, ,Security, message, Message Manual}).
12148
12149@node Mailing List
12150@section Mailing List
12151@cindex mailing list
12152@cindex RFC 2396
12153
12154@kindex A M (summary)
12155@findex gnus-mailing-list-insinuate
12156Gnus understands some mailing list fields of RFC 2369. To enable it,
12157add a @code{to-list} group parameter (@pxref{Group Parameters}),
12158possibly using @kbd{A M} (@code{gnus-mailing-list-insinuate}) in the
12159summary buffer.
12160
12161That enables the following commands to the summary buffer:
12162
12163@table @kbd
12164
12165@item C-c C-n h
12166@kindex C-c C-n h (Summary)
12167@findex gnus-mailing-list-help
12168Send a message to fetch mailing list help, if List-Help field exists.
12169
12170@item C-c C-n s
12171@kindex C-c C-n s (Summary)
12172@findex gnus-mailing-list-subscribe
12173Send a message to subscribe the mailing list, if List-Subscribe field exists.
12174
12175@item C-c C-n u
12176@kindex C-c C-n u (Summary)
12177@findex gnus-mailing-list-unsubscribe
12178Send a message to unsubscribe the mailing list, if List-Unsubscribe
12179field exists.
12180
12181@item C-c C-n p
12182@kindex C-c C-n p (Summary)
12183@findex gnus-mailing-list-post
12184Post to the mailing list, if List-Post field exists.
12185
12186@item C-c C-n o
12187@kindex C-c C-n o (Summary)
12188@findex gnus-mailing-list-owner
12189Send a message to the mailing list owner, if List-Owner field exists.
12190
12191@item C-c C-n a
12192@kindex C-c C-n a (Summary)
01c52d31 12193@findex gnus-mailing-list-archive
4009494e
GM
12194Browse the mailing list archive, if List-Archive field exists.
12195
12196@end table
12197
12198
12199@node Article Buffer
12200@chapter Article Buffer
12201@cindex article buffer
12202
12203The articles are displayed in the article buffer, of which there is only
12204one. All the summary buffers share the same article buffer unless you
12205tell Gnus otherwise.
12206
12207@menu
12208* Hiding Headers:: Deciding what headers should be displayed.
12209* Using MIME:: Pushing articles through @acronym{MIME} before reading them.
85115796 12210* HTML:: Reading @acronym{HTML} messages.
4009494e
GM
12211* Customizing Articles:: Tailoring the look of the articles.
12212* Article Keymap:: Keystrokes available in the article buffer.
12213* Misc Article:: Other stuff.
12214@end menu
12215
12216
12217@node Hiding Headers
12218@section Hiding Headers
12219@cindex hiding headers
12220@cindex deleting headers
12221
12222The top section of each article is the @dfn{head}. (The rest is the
12223@dfn{body}, but you may have guessed that already.)
12224
12225@vindex gnus-show-all-headers
12226There is a lot of useful information in the head: the name of the person
12227who wrote the article, the date it was written and the subject of the
12228article. That's well and nice, but there's also lots of information
12229most people do not want to see---what systems the article has passed
12230through before reaching you, the @code{Message-ID}, the
12231@code{References}, etc. ad nauseam---and you'll probably want to get rid
12232of some of those lines. If you want to keep all those lines in the
12233article buffer, you can set @code{gnus-show-all-headers} to @code{t}.
12234
12235Gnus provides you with two variables for sifting headers:
12236
12237@table @code
12238
12239@item gnus-visible-headers
12240@vindex gnus-visible-headers
12241If this variable is non-@code{nil}, it should be a regular expression
12242that says what headers you wish to keep in the article buffer. All
12243headers that do not match this variable will be hidden.
12244
12245For instance, if you only want to see the name of the person who wrote
12246the article and the subject, you'd say:
12247
12248@lisp
12249(setq gnus-visible-headers "^From:\\|^Subject:")
12250@end lisp
12251
12252This variable can also be a list of regexps to match headers to
12253remain visible.
12254
12255@item gnus-ignored-headers
12256@vindex gnus-ignored-headers
12257This variable is the reverse of @code{gnus-visible-headers}. If this
12258variable is set (and @code{gnus-visible-headers} is @code{nil}), it
12259should be a regular expression that matches all lines that you want to
12260hide. All lines that do not match this variable will remain visible.
12261
12262For instance, if you just want to get rid of the @code{References} line
12263and the @code{Xref} line, you might say:
12264
12265@lisp
12266(setq gnus-ignored-headers "^References:\\|^Xref:")
12267@end lisp
12268
12269This variable can also be a list of regexps to match headers to
12270be removed.
12271
12272Note that if @code{gnus-visible-headers} is non-@code{nil}, this
12273variable will have no effect.
12274
12275@end table
12276
12277@vindex gnus-sorted-header-list
12278Gnus can also sort the headers for you. (It does this by default.) You
12279can control the sorting by setting the @code{gnus-sorted-header-list}
12280variable. It is a list of regular expressions that says in what order
12281the headers are to be displayed.
12282
12283For instance, if you want the name of the author of the article first,
12284and then the subject, you might say something like:
12285
12286@lisp
12287(setq gnus-sorted-header-list '("^From:" "^Subject:"))
12288@end lisp
12289
12290Any headers that are to remain visible, but are not listed in this
12291variable, will be displayed in random order after all the headers listed in this variable.
12292
12293@findex gnus-article-hide-boring-headers
12294@vindex gnus-boring-article-headers
12295You can hide further boring headers by setting
12296@code{gnus-treat-hide-boring-headers} to @code{head}. What this function
12297does depends on the @code{gnus-boring-article-headers} variable. It's a
12298list, but this list doesn't actually contain header names. Instead it
12299lists various @dfn{boring conditions} that Gnus can check and remove
12300from sight.
12301
12302These conditions are:
12303@table @code
12304@item empty
12305Remove all empty headers.
12306@item followup-to
12307Remove the @code{Followup-To} header if it is identical to the
12308@code{Newsgroups} header.
12309@item reply-to
12310Remove the @code{Reply-To} header if it lists the same addresses as
12311the @code{From} header, or if the @code{broken-reply-to} group
12312parameter is set.
12313@item newsgroups
12314Remove the @code{Newsgroups} header if it only contains the current group
12315name.
12316@item to-address
12317Remove the @code{To} header if it only contains the address identical to
12318the current group's @code{to-address} parameter.
12319@item to-list
12320Remove the @code{To} header if it only contains the address identical to
12321the current group's @code{to-list} parameter.
12322@item cc-list
12323Remove the @code{Cc} header if it only contains the address identical to
12324the current group's @code{to-list} parameter.
12325@item date
12326Remove the @code{Date} header if the article is less than three days
12327old.
12328@item long-to
12329Remove the @code{To} and/or @code{Cc} header if it is very long.
12330@item many-to
12331Remove all @code{To} and/or @code{Cc} headers if there are more than one.
12332@end table
12333
12334To include these three elements, you could say something like:
12335
12336@lisp
12337(setq gnus-boring-article-headers
12338 '(empty followup-to reply-to))
12339@end lisp
12340
12341This is also the default value for this variable.
12342
12343
12344@node Using MIME
12345@section Using MIME
12346@cindex @acronym{MIME}
12347
12348Mime is a standard for waving your hands through the air, aimlessly,
12349while people stand around yawning.
12350
12351@acronym{MIME}, however, is a standard for encoding your articles, aimlessly,
12352while all newsreaders die of fear.
12353
12354@acronym{MIME} may specify what character set the article uses, the encoding
12355of the characters, and it also makes it possible to embed pictures and
12356other naughty stuff in innocent-looking articles.
12357
12358@vindex gnus-display-mime-function
12359@findex gnus-display-mime
12360Gnus pushes @acronym{MIME} articles through @code{gnus-display-mime-function}
12361to display the @acronym{MIME} parts. This is @code{gnus-display-mime} by
12362default, which creates a bundle of clickable buttons that can be used to
12363display, save and manipulate the @acronym{MIME} objects.
12364
12365The following commands are available when you have placed point over a
12366@acronym{MIME} button:
12367
12368@table @kbd
12369@findex gnus-article-press-button
12370@item RET (Article)
12371@kindex RET (Article)
12372@itemx BUTTON-2 (Article)
12373Toggle displaying of the @acronym{MIME} object
12374(@code{gnus-article-press-button}). If built-in viewers can not display
12375the object, Gnus resorts to external viewers in the @file{mailcap}
12376files. If a viewer has the @samp{copiousoutput} specification, the
12377object is displayed inline.
12378
12379@findex gnus-mime-view-part
12380@item M-RET (Article)
12381@kindex M-RET (Article)
12382@itemx v (Article)
12383Prompt for a method, and then view the @acronym{MIME} object using this
12384method (@code{gnus-mime-view-part}).
12385
12386@findex gnus-mime-view-part-as-type
12387@item t (Article)
12388@kindex t (Article)
12389View the @acronym{MIME} object as if it were a different @acronym{MIME} media type
12390(@code{gnus-mime-view-part-as-type}).
12391
12392@findex gnus-mime-view-part-as-charset
12393@item C (Article)
12394@kindex C (Article)
12395Prompt for a charset, and then view the @acronym{MIME} object using this
12396charset (@code{gnus-mime-view-part-as-charset}).
12397
12398@findex gnus-mime-save-part
12399@item o (Article)
12400@kindex o (Article)
12401Prompt for a file name, and then save the @acronym{MIME} object
12402(@code{gnus-mime-save-part}).
12403
12404@findex gnus-mime-save-part-and-strip
12405@item C-o (Article)
12406@kindex C-o (Article)
12407Prompt for a file name, then save the @acronym{MIME} object and strip it from
12408the article. Then proceed to article editing, where a reasonable
12409suggestion is being made on how the altered article should look
12410like. The stripped @acronym{MIME} object will be referred via the
12411message/external-body @acronym{MIME} type.
12412(@code{gnus-mime-save-part-and-strip}).
12413
01c52d31
MB
12414@findex gnus-mime-replace-part
12415@item r (Article)
12416@kindex r (Article)
12417Prompt for a file name, replace the @acronym{MIME} object with an
12418external body refering to the file via the message/external-body
12419@acronym{MIME} type. (@code{gnus-mime-replace-part}).
12420
4009494e
GM
12421@findex gnus-mime-delete-part
12422@item d (Article)
12423@kindex d (Article)
12424Delete the @acronym{MIME} object from the article and replace it with some
12425information about the removed @acronym{MIME} object
12426(@code{gnus-mime-delete-part}).
12427
01c52d31
MB
12428@c FIXME: gnus-auto-select-part should be documented here
12429
4009494e
GM
12430@findex gnus-mime-copy-part
12431@item c (Article)
12432@kindex c (Article)
12433Copy the @acronym{MIME} object to a fresh buffer and display this buffer
01c52d31
MB
12434(@code{gnus-mime-copy-part}). If given a prefix, copy the raw contents
12435without decoding. If given a numerical prefix, you can do semi-manual
12436charset stuff (see @code{gnus-summary-show-article-charset-alist} in
12437@ref{Paging the Article}). Compressed files like @file{.gz} and
4009494e
GM
12438@file{.bz2} are automatically decompressed if
12439@code{auto-compression-mode} is enabled (@pxref{Compressed Files,,
12440Accessing Compressed Files, emacs, The Emacs Editor}).
12441
12442@findex gnus-mime-print-part
12443@item p (Article)
12444@kindex p (Article)
12445Print the @acronym{MIME} object (@code{gnus-mime-print-part}). This
12446command respects the @samp{print=} specifications in the
12447@file{.mailcap} file.
12448
12449@findex gnus-mime-inline-part
12450@item i (Article)
12451@kindex i (Article)
12452Insert the contents of the @acronym{MIME} object into the buffer
9b3ebcb6 12453(@code{gnus-mime-inline-part}) as @samp{text/plain}. If given a prefix, insert
4009494e
GM
12454the raw contents without decoding. If given a numerical prefix, you can
12455do semi-manual charset stuff (see
12456@code{gnus-summary-show-article-charset-alist} in @ref{Paging the
01c52d31
MB
12457Article}). Compressed files like @file{.gz} and @file{.bz2} are
12458automatically decompressed depending on @code{jka-compr} regardless of
12459@code{auto-compression-mode} (@pxref{Compressed Files,, Accessing
12460Compressed Files, emacs, The Emacs Editor}).
4009494e
GM
12461
12462@findex gnus-mime-view-part-internally
12463@item E (Article)
12464@kindex E (Article)
12465View the @acronym{MIME} object with an internal viewer. If no internal
12466viewer is available, use an external viewer
12467(@code{gnus-mime-view-part-internally}).
12468
12469@findex gnus-mime-view-part-externally
12470@item e (Article)
12471@kindex e (Article)
12472View the @acronym{MIME} object with an external viewer.
12473(@code{gnus-mime-view-part-externally}).
12474
12475@findex gnus-mime-pipe-part
12476@item | (Article)
12477@kindex | (Article)
12478Output the @acronym{MIME} object to a process (@code{gnus-mime-pipe-part}).
12479
12480@findex gnus-mime-action-on-part
12481@item . (Article)
12482@kindex . (Article)
12483Interactively run an action on the @acronym{MIME} object
12484(@code{gnus-mime-action-on-part}).
12485
12486@end table
12487
12488Gnus will display some @acronym{MIME} objects automatically. The way Gnus
12489determines which parts to do this with is described in the Emacs
12490@acronym{MIME} manual.
12491
12492It might be best to just use the toggling functions from the article
12493buffer to avoid getting nasty surprises. (For instance, you enter the
12494group @samp{alt.sing-a-long} and, before you know it, @acronym{MIME} has
12495decoded the sound file in the article and some horrible sing-a-long song
12496comes screaming out your speakers, and you can't find the volume button,
12497because there isn't one, and people are starting to look at you, and you
12498try to stop the program, but you can't, and you can't find the program
12499to control the volume, and everybody else in the room suddenly decides
12500to look at you disdainfully, and you'll feel rather stupid.)
12501
12502Any similarity to real events and people is purely coincidental. Ahem.
12503
12504Also @pxref{MIME Commands}.
12505
12506
85115796
KY
12507@node HTML
12508@section @acronym{HTML}
12509@cindex @acronym{HTML}
12510
12511If you have @code{w3m} installed on your system, Gnus can display
12512@acronym{HTML} articles in the article buffer. There are many Gnus
12513add-ons for doing this, using various approaches, but there's one
12514(sort of) built-in method that's used by default.
12515
12516For a complete overview, consult @xref{Display Customization,
12517,Display Customization, emacs-mime, The Emacs MIME Manual}. This
12518section only describes the default method.
12519
12520@table @code
12521@item mm-text-html-renderer
12522@vindex mm-text-html-renderer
12523If set to @code{gnus-article-html}, Gnus will use the built-in method,
12524that's based on @code{curl} and @code{w3m}.
12525
12526@item gnus-html-cache-directory
12527@vindex gnus-html-cache-directory
12528Gnus will download and cache images according to how
12529@code{mm-w3m-safe-url-regexp} is set. These images will be stored in
12530this directory.
12531
12532@item gnus-html-cache-size
12533@vindex gnus-html-cache-size
12534When @code{gnus-html-cache-size} bytes have been used in that
12535directory, the oldest files will be deleted. The default is 500MB.
12536
12537@item gnus-html-frame-width
12538@vindex gnus-html-frame-width
12539The width to use when rendering HTML. The default is 70.
12540
12541@end table
12542
12543To use this, make sure that you have @code{w3m} and @code{curl}
12544installed. If you have, then Gnus should display @acronym{HTML}
12545automatically.
12546
12547
12548
4009494e
GM
12549@node Customizing Articles
12550@section Customizing Articles
12551@cindex article customization
12552
12553A slew of functions for customizing how the articles are to look like
12554exist. You can call these functions interactively
12555(@pxref{Article Washing}), or you can have them
12556called automatically when you select the articles.
12557
12558To have them called automatically, you should set the corresponding
12559``treatment'' variable. For instance, to have headers hidden, you'd set
12560@code{gnus-treat-hide-headers}. Below is a list of variables that can
12561be set, but first we discuss the values these variables can have.
12562
12563Note: Some values, while valid, make little sense. Check the list below
12564for sensible values.
12565
12566@enumerate
12567@item
12568@code{nil}: Don't do this treatment.
12569
12570@item
12571@code{t}: Do this treatment on all body parts.
12572
12573@item
12574@code{head}: Do the treatment on the headers.
12575
12576@item
01c52d31
MB
12577@code{first}: Do this treatment on the first body part.
12578
12579@item
12580@code{last}: Do this treatment on the last body part.
4009494e
GM
12581
12582@item
12583An integer: Do this treatment on all body parts that have a length less
12584than this number.
12585
12586@item
12587A list of strings: Do this treatment on all body parts that are in
12588articles that are read in groups that have names that match one of the
12589regexps in the list.
12590
12591@item
12592A list where the first element is not a string:
12593
12594The list is evaluated recursively. The first element of the list is a
12595predicate. The following predicates are recognized: @code{or},
12596@code{and}, @code{not} and @code{typep}. Here's an example:
12597
12598@lisp
12599(or last
12600 (typep "text/x-vcard"))
12601@end lisp
12602
12603@end enumerate
12604
12605You may have noticed that the word @dfn{part} is used here. This refers
12606to the fact that some messages are @acronym{MIME} multipart articles that may
12607be divided into several parts. Articles that are not multiparts are
12608considered to contain just a single part.
12609
12610@vindex gnus-article-treat-types
12611Are the treatments applied to all sorts of multipart parts? Yes, if you
12612want to, but by default, only @samp{text/plain} parts are given the
12613treatment. This is controlled by the @code{gnus-article-treat-types}
12614variable, which is a list of regular expressions that are matched to the
12615type of the part. This variable is ignored if the value of the
12616controlling variable is a predicate list, as described above.
12617
12618@ifinfo
12619@c Avoid sort of redundant entries in the same section for the printed
12620@c manual, but add them in info to allow `i gnus-treat-foo-bar RET' or
12621@c `i foo-bar'.
12622@vindex gnus-treat-buttonize
12623@vindex gnus-treat-buttonize-head
12624@vindex gnus-treat-capitalize-sentences
12625@vindex gnus-treat-overstrike
12626@vindex gnus-treat-strip-cr
12627@vindex gnus-treat-strip-headers-in-body
12628@vindex gnus-treat-strip-leading-blank-lines
12629@vindex gnus-treat-strip-multiple-blank-lines
12630@vindex gnus-treat-strip-pem
12631@vindex gnus-treat-strip-trailing-blank-lines
12632@vindex gnus-treat-unsplit-urls
12633@vindex gnus-treat-wash-html
12634@vindex gnus-treat-date-english
12635@vindex gnus-treat-date-iso8601
12636@vindex gnus-treat-date-lapsed
12637@vindex gnus-treat-date-local
12638@vindex gnus-treat-date-original
12639@vindex gnus-treat-date-user-defined
12640@vindex gnus-treat-date-ut
12641@vindex gnus-treat-from-picon
12642@vindex gnus-treat-mail-picon
12643@vindex gnus-treat-newsgroups-picon
12644@vindex gnus-treat-display-smileys
12645@vindex gnus-treat-body-boundary
12646@vindex gnus-treat-display-x-face
12647@vindex gnus-treat-display-face
12648@vindex gnus-treat-emphasize
12649@vindex gnus-treat-fill-article
12650@vindex gnus-treat-fill-long-lines
12651@vindex gnus-treat-hide-boring-headers
12652@vindex gnus-treat-hide-citation
12653@vindex gnus-treat-hide-citation-maybe
12654@vindex gnus-treat-hide-headers
12655@vindex gnus-treat-hide-signature
12656@vindex gnus-treat-strip-banner
12657@vindex gnus-treat-strip-list-identifiers
12658@vindex gnus-treat-highlight-citation
12659@vindex gnus-treat-highlight-headers
12660@vindex gnus-treat-highlight-signature
12661@vindex gnus-treat-play-sounds
12662@vindex gnus-treat-translate
12663@vindex gnus-treat-x-pgp-sig
12664@vindex gnus-treat-unfold-headers
12665@vindex gnus-treat-fold-headers
12666@vindex gnus-treat-fold-newsgroups
12667@vindex gnus-treat-leading-whitespace
12668@end ifinfo
12669
12670The following treatment options are available. The easiest way to
12671customize this is to examine the @code{gnus-article-treat} customization
12672group. Values in parenthesis are suggested sensible values. Others are
12673possible but those listed are probably sufficient for most people.
12674
12675@table @code
12676@item gnus-treat-buttonize (t, integer)
12677@item gnus-treat-buttonize-head (head)
12678
12679@xref{Article Buttons}.
12680
12681@item gnus-treat-capitalize-sentences (t, integer)
12682@item gnus-treat-overstrike (t, integer)
12683@item gnus-treat-strip-cr (t, integer)
12684@item gnus-treat-strip-headers-in-body (t, integer)
01c52d31 12685@item gnus-treat-strip-leading-blank-lines (t, first, integer)
4009494e
GM
12686@item gnus-treat-strip-multiple-blank-lines (t, integer)
12687@item gnus-treat-strip-pem (t, last, integer)
12688@item gnus-treat-strip-trailing-blank-lines (t, last, integer)
12689@item gnus-treat-unsplit-urls (t, integer)
12690@item gnus-treat-wash-html (t, integer)
12691
12692@xref{Article Washing}.
12693
12694@item gnus-treat-date-english (head)
12695@item gnus-treat-date-iso8601 (head)
12696@item gnus-treat-date-lapsed (head)
12697@item gnus-treat-date-local (head)
12698@item gnus-treat-date-original (head)
12699@item gnus-treat-date-user-defined (head)
12700@item gnus-treat-date-ut (head)
12701
12702@xref{Article Date}.
12703
12704@item gnus-treat-from-picon (head)
12705@item gnus-treat-mail-picon (head)
12706@item gnus-treat-newsgroups-picon (head)
12707
12708@xref{Picons}.
12709
12710@item gnus-treat-display-smileys (t, integer)
12711
12712@item gnus-treat-body-boundary (head)
12713
12714@vindex gnus-body-boundary-delimiter
12715Adds a delimiter between header and body, the string used as delimiter
12716is controlled by @code{gnus-body-boundary-delimiter}.
12717
12718@xref{Smileys}.
12719
12720@vindex gnus-treat-display-x-face
12721@item gnus-treat-display-x-face (head)
12722
12723@xref{X-Face}.
12724
12725@vindex gnus-treat-display-face
12726@item gnus-treat-display-face (head)
12727
12728@xref{Face}.
12729
12730@vindex gnus-treat-emphasize
12731@item gnus-treat-emphasize (t, head, integer)
12732@vindex gnus-treat-fill-article
12733@item gnus-treat-fill-article (t, integer)
12734@vindex gnus-treat-fill-long-lines
12735@item gnus-treat-fill-long-lines (t, integer)
12736@vindex gnus-treat-hide-boring-headers
12737@item gnus-treat-hide-boring-headers (head)
12738@vindex gnus-treat-hide-citation
12739@item gnus-treat-hide-citation (t, integer)
12740@vindex gnus-treat-hide-citation-maybe
12741@item gnus-treat-hide-citation-maybe (t, integer)
12742@vindex gnus-treat-hide-headers
12743@item gnus-treat-hide-headers (head)
12744@vindex gnus-treat-hide-signature
12745@item gnus-treat-hide-signature (t, last)
12746@vindex gnus-treat-strip-banner
12747@item gnus-treat-strip-banner (t, last)
12748@vindex gnus-treat-strip-list-identifiers
12749@item gnus-treat-strip-list-identifiers (head)
12750
12751@xref{Article Hiding}.
12752
12753@vindex gnus-treat-highlight-citation
12754@item gnus-treat-highlight-citation (t, integer)
12755@vindex gnus-treat-highlight-headers
12756@item gnus-treat-highlight-headers (head)
12757@vindex gnus-treat-highlight-signature
12758@item gnus-treat-highlight-signature (t, last, integer)
12759
12760@xref{Article Highlighting}.
12761
12762@vindex gnus-treat-play-sounds
12763@item gnus-treat-play-sounds
12764@vindex gnus-treat-translate
12765@item gnus-treat-translate
01c52d31 12766@item gnus-treat-ansi-sequences (t)
4009494e
GM
12767@vindex gnus-treat-x-pgp-sig
12768@item gnus-treat-x-pgp-sig (head)
12769
12770@vindex gnus-treat-unfold-headers
12771@item gnus-treat-unfold-headers (head)
12772@vindex gnus-treat-fold-headers
12773@item gnus-treat-fold-headers (head)
12774@vindex gnus-treat-fold-newsgroups
12775@item gnus-treat-fold-newsgroups (head)
12776@vindex gnus-treat-leading-whitespace
12777@item gnus-treat-leading-whitespace (head)
12778
12779@xref{Article Header}.
12780
12781
12782@end table
12783
12784@vindex gnus-part-display-hook
12785You can, of course, write your own functions to be called from
12786@code{gnus-part-display-hook}. The functions are called narrowed to the
12787part, and you can do anything you like, pretty much. There is no
12788information that you have to keep in the buffer---you can change
12789everything.
12790
12791
12792@node Article Keymap
12793@section Article Keymap
12794
12795Most of the keystrokes in the summary buffer can also be used in the
12796article buffer. They should behave as if you typed them in the summary
12797buffer, which means that you don't actually have to have a summary
12798buffer displayed while reading. You can do it all from the article
12799buffer.
12800
12801@kindex v (Article)
12802@cindex keys, reserved for users (Article)
12803The key @kbd{v} is reserved for users. You can bind it to some
12804command or better use it as a prefix key.
12805
12806A few additional keystrokes are available:
12807
12808@table @kbd
12809
12810@item SPACE
12811@kindex SPACE (Article)
12812@findex gnus-article-next-page
12813Scroll forwards one page (@code{gnus-article-next-page}).
12814This is exactly the same as @kbd{h SPACE h}.
12815
12816@item DEL
12817@kindex DEL (Article)
12818@findex gnus-article-prev-page
12819Scroll backwards one page (@code{gnus-article-prev-page}).
12820This is exactly the same as @kbd{h DEL h}.
12821
12822@item C-c ^
12823@kindex C-c ^ (Article)
12824@findex gnus-article-refer-article
12825If point is in the neighborhood of a @code{Message-ID} and you press
12826@kbd{C-c ^}, Gnus will try to get that article from the server
12827(@code{gnus-article-refer-article}).
12828
12829@item C-c C-m
12830@kindex C-c C-m (Article)
12831@findex gnus-article-mail
12832Send a reply to the address near point (@code{gnus-article-mail}). If
12833given a prefix, include the mail.
12834
12835@item s
12836@kindex s (Article)
12837@findex gnus-article-show-summary
12838Reconfigure the buffers so that the summary buffer becomes visible
12839(@code{gnus-article-show-summary}).
12840
12841@item ?
12842@kindex ? (Article)
12843@findex gnus-article-describe-briefly
12844Give a very brief description of the available keystrokes
12845(@code{gnus-article-describe-briefly}).
12846
12847@item TAB
12848@kindex TAB (Article)
12849@findex gnus-article-next-button
12850Go to the next button, if any (@code{gnus-article-next-button}). This
12851only makes sense if you have buttonizing turned on.
12852
12853@item M-TAB
12854@kindex M-TAB (Article)
12855@findex gnus-article-prev-button
12856Go to the previous button, if any (@code{gnus-article-prev-button}).
12857
12858@item R
12859@kindex R (Article)
12860@findex gnus-article-reply-with-original
12861Send a reply to the current article and yank the current article
95838435
MB
12862(@code{gnus-article-reply-with-original}). If the region is active,
12863only yank the text in the region.
12864
12865@item S W
12866@kindex S W (Article)
12867@findex gnus-article-wide-reply-with-original
12868Send a wide reply to the current article and yank the current article
12869(@code{gnus-article-wide-reply-with-original}). If the region is
12870active, only yank the text in the region.
4009494e
GM
12871
12872@item F
12873@kindex F (Article)
12874@findex gnus-article-followup-with-original
12875Send a followup to the current article and yank the current article
95838435
MB
12876(@code{gnus-article-followup-with-original}). If the region is active,
12877only yank the text in the region.
4009494e
GM
12878
12879
12880@end table
12881
12882
12883@node Misc Article
12884@section Misc Article
12885
12886@table @code
12887
12888@item gnus-single-article-buffer
12889@vindex gnus-single-article-buffer
12890@cindex article buffers, several
12891If non-@code{nil}, use the same article buffer for all the groups.
12892(This is the default.) If @code{nil}, each group will have its own
12893article buffer.
12894
12895@vindex gnus-article-decode-hook
12896@item gnus-article-decode-hook
12897@cindex @acronym{MIME}
12898Hook used to decode @acronym{MIME} articles. The default value is
12899@code{(article-decode-charset article-decode-encoded-words)}
12900
12901@vindex gnus-article-prepare-hook
12902@item gnus-article-prepare-hook
12903This hook is called right after the article has been inserted into the
12904article buffer. It is mainly intended for functions that do something
12905depending on the contents; it should probably not be used for changing
12906the contents of the article buffer.
12907
12908@item gnus-article-mode-hook
12909@vindex gnus-article-mode-hook
12910Hook called in article mode buffers.
12911
12912@item gnus-article-mode-syntax-table
12913@vindex gnus-article-mode-syntax-table
12914Syntax table used in article buffers. It is initialized from
12915@code{text-mode-syntax-table}.
12916
12917@vindex gnus-article-over-scroll
12918@item gnus-article-over-scroll
12919If non-@code{nil}, allow scrolling the article buffer even when there
12920no more new text to scroll in. The default is @code{nil}.
12921
12922@vindex gnus-article-mode-line-format
12923@item gnus-article-mode-line-format
12924This variable is a format string along the same lines as
12925@code{gnus-summary-mode-line-format} (@pxref{Summary Buffer Mode
12926Line}). It accepts the same format specifications as that variable,
12927with two extensions:
12928
12929@table @samp
12930
12931@item w
12932The @dfn{wash status} of the article. This is a short string with one
12933character for each possible article wash operation that may have been
12934performed. The characters and their meaning:
12935
12936@table @samp
12937
12938@item c
12939Displayed when cited text may be hidden in the article buffer.
12940
12941@item h
12942Displayed when headers are hidden in the article buffer.
12943
12944@item p
12945Displayed when article is digitally signed or encrypted, and Gnus has
12946hidden the security headers. (N.B. does not tell anything about
12947security status, i.e. good or bad signature.)
12948
12949@item s
12950Displayed when the signature has been hidden in the Article buffer.
12951
12952@item o
12953Displayed when Gnus has treated overstrike characters in the article buffer.
12954
12955@item e
6772c8e1 12956Displayed when Gnus has treated emphasized strings in the article buffer.
4009494e
GM
12957
12958@end table
12959
12960@item m
12961The number of @acronym{MIME} parts in the article.
12962
12963@end table
12964
12965@vindex gnus-break-pages
12966
12967@item gnus-break-pages
12968Controls whether @dfn{page breaking} is to take place. If this variable
12969is non-@code{nil}, the articles will be divided into pages whenever a
12970page delimiter appears in the article. If this variable is @code{nil},
12971paging will not be done.
12972
12973@item gnus-page-delimiter
12974@vindex gnus-page-delimiter
12975This is the delimiter mentioned above. By default, it is @samp{^L}
12976(formfeed).
12977
12978@cindex IDNA
12979@cindex internationalized domain names
12980@vindex gnus-use-idna
12981@item gnus-use-idna
12982This variable controls whether Gnus performs IDNA decoding of
12983internationalized domain names inside @samp{From}, @samp{To} and
01c52d31
MB
12984@samp{Cc} headers. @xref{IDNA, ,IDNA,message, The Message Manual},
12985for how to compose such messages. This requires
4009494e
GM
12986@uref{http://www.gnu.org/software/libidn/, GNU Libidn}, and this
12987variable is only enabled if you have installed it.
12988
12989@end table
12990
12991
12992@node Composing Messages
12993@chapter Composing Messages
12994@cindex composing messages
12995@cindex messages
12996@cindex mail
12997@cindex sending mail
12998@cindex reply
12999@cindex followup
13000@cindex post
13001@cindex using gpg
13002@cindex using s/mime
13003@cindex using smime
13004
13005@kindex C-c C-c (Post)
13006All commands for posting and mailing will put you in a message buffer
13007where you can edit the article all you like, before you send the
13008article by pressing @kbd{C-c C-c}. @xref{Top, , Overview, message,
13009Message Manual}. Where the message will be posted/mailed to depends
13010on your setup (@pxref{Posting Server}).
13011
13012@menu
13013* Mail:: Mailing and replying.
13014* Posting Server:: What server should you post and mail via?
13015* POP before SMTP:: You cannot send a mail unless you read a mail.
13016* Mail and Post:: Mailing and posting at the same time.
13017* Archived Messages:: Where Gnus stores the messages you've sent.
13018* Posting Styles:: An easier way to specify who you are.
13019* Drafts:: Postponing messages and rejected messages.
13020* Rejected Articles:: What happens if the server doesn't like your article?
13021* Signing and encrypting:: How to compose secure messages.
13022@end menu
13023
13024Also @pxref{Canceling and Superseding} for information on how to
13025remove articles you shouldn't have posted.
13026
13027
13028@node Mail
13029@section Mail
13030
13031Variables for customizing outgoing mail:
13032
13033@table @code
13034@item gnus-uu-digest-headers
13035@vindex gnus-uu-digest-headers
13036List of regexps to match headers included in digested messages. The
13037headers will be included in the sequence they are matched. If
13038@code{nil} include all headers.
13039
13040@item gnus-add-to-list
13041@vindex gnus-add-to-list
13042If non-@code{nil}, add a @code{to-list} group parameter to mail groups
13043that have none when you do a @kbd{a}.
13044
13045@item gnus-confirm-mail-reply-to-news
13046@vindex gnus-confirm-mail-reply-to-news
13047If non-@code{nil}, Gnus will ask you for a confirmation when you are
13048about to reply to news articles by mail. If it is @code{nil}, nothing
13049interferes in what you want to do. This can also be a function
13050receiving the group name as the only parameter which should return
13051non-@code{nil} if a confirmation is needed, or a regular expression
13052matching group names, where confirmation should be asked for.
13053
13054If you find yourself never wanting to reply to mail, but occasionally
13055press @kbd{R} anyway, this variable might be for you.
13056
13057@item gnus-confirm-treat-mail-like-news
13058@vindex gnus-confirm-treat-mail-like-news
13059If non-@code{nil}, Gnus also requests confirmation according to
13060@code{gnus-confirm-mail-reply-to-news} when replying to mail. This is
13061useful for treating mailing lists like newsgroups.
13062
13063@end table
13064
13065
13066@node Posting Server
13067@section Posting Server
13068
13069When you press those magical @kbd{C-c C-c} keys to ship off your latest
13070(extremely intelligent, of course) article, where does it go?
13071
13072Thank you for asking. I hate you.
13073
13074It can be quite complicated.
13075
13076@vindex gnus-post-method
13077When posting news, Message usually invokes @code{message-send-news}
13078(@pxref{News Variables, , News Variables, message, Message Manual}).
13079Normally, Gnus will post using the same select method as you're
13080reading from (which might be convenient if you're reading lots of
13081groups from different private servers). However. If the server
13082you're reading from doesn't allow posting, just reading, you probably
13083want to use some other server to post your (extremely intelligent and
13084fabulously interesting) articles. You can then set the
13085@code{gnus-post-method} to some other method:
13086
13087@lisp
13088(setq gnus-post-method '(nnspool ""))
13089@end lisp
13090
13091Now, if you've done this, and then this server rejects your article, or
13092this server is down, what do you do then? To override this variable you
13093can use a non-zero prefix to the @kbd{C-c C-c} command to force using
13094the ``current'' server, to get back the default behavior, for posting.
13095
13096If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command,
13097Gnus will prompt you for what method to use for posting.
13098
13099You can also set @code{gnus-post-method} to a list of select methods.
13100If that's the case, Gnus will always prompt you for what method to use
13101for posting.
13102
13103Finally, if you want to always post using the native select method,
13104you can set this variable to @code{native}.
13105
d82cf70b
MB
13106@vindex message-send-mail-function
13107When sending mail, Message invokes the function specified by the
13108variable @code{message-send-mail-function}. Gnus tries to set it to a
13109value suitable for your system.
13110@xref{Mail Variables, ,Mail Variables,message,Message manual}, for more
13111information.
4009494e
GM
13112
13113@node POP before SMTP
13114@section POP before SMTP
13115@cindex pop before smtp
13116@findex message-smtpmail-send-it
13117@findex mail-source-touch-pop
13118
13119Does your @acronym{ISP} require the @acronym{POP}-before-@acronym{SMTP}
13120authentication? It is whether you need to connect to the @acronym{POP}
13121mail server within a certain time before sending mails. If so, there is
13122a convenient way. To do that, put the following lines in your
13123@file{~/.gnus.el} file:
13124
13125@lisp
13126(setq message-send-mail-function 'message-smtpmail-send-it)
13127(add-hook 'message-send-mail-hook 'mail-source-touch-pop)
13128@end lisp
13129
13130@noindent
13131It means to let Gnus connect to the @acronym{POP} mail server in advance
13132whenever you send a mail. The @code{mail-source-touch-pop} function
13133does only a @acronym{POP} authentication according to the value of
13134@code{mail-sources} without fetching mails, just before sending a mail.
13135Note that you have to use @code{message-smtpmail-send-it} which runs
13136@code{message-send-mail-hook} rather than @code{smtpmail-send-it} and
13137set the value of @code{mail-sources} for a @acronym{POP} connection
13138correctly. @xref{Mail Sources}.
13139
13140If you have two or more @acronym{POP} mail servers set in
13141@code{mail-sources}, you may want to specify one of them to
13142@code{mail-source-primary-source} as the @acronym{POP} mail server to be
13143used for the @acronym{POP}-before-@acronym{SMTP} authentication. If it
13144is your primary @acronym{POP} mail server (i.e., you are fetching mails
13145mainly from that server), you can set it permanently as follows:
13146
13147@lisp
13148(setq mail-source-primary-source
13149 '(pop :server "pop3.mail.server"
13150 :password "secret"))
13151@end lisp
13152
13153@noindent
13154Otherwise, bind it dynamically only when performing the
13155@acronym{POP}-before-@acronym{SMTP} authentication as follows:
13156
13157@lisp
13158(add-hook 'message-send-mail-hook
13159 (lambda ()
13160 (let ((mail-source-primary-source
13161 '(pop :server "pop3.mail.server"
13162 :password "secret")))
13163 (mail-source-touch-pop))))
13164@end lisp
13165
13166@node Mail and Post
13167@section Mail and Post
13168
13169Here's a list of variables relevant to both mailing and
13170posting:
13171
13172@table @code
13173@item gnus-mailing-list-groups
13174@findex gnus-mailing-list-groups
13175@cindex mailing lists
13176
13177If your news server offers groups that are really mailing lists
13178gatewayed to the @acronym{NNTP} server, you can read those groups without
13179problems, but you can't post/followup to them without some difficulty.
13180One solution is to add a @code{to-address} to the group parameters
13181(@pxref{Group Parameters}). An easier thing to do is set the
13182@code{gnus-mailing-list-groups} to a regexp that matches the groups that
13183really are mailing lists. Then, at least, followups to the mailing
13184lists will work most of the time. Posting to these groups (@kbd{a}) is
13185still a pain, though.
13186
13187@item gnus-user-agent
13188@vindex gnus-user-agent
13189@cindex User-Agent
13190
13191This variable controls which information should be exposed in the
13192User-Agent header. It can be a list of symbols or a string. Valid
13193symbols are @code{gnus} (show Gnus version) and @code{emacs} (show Emacs
13194version). In addition to the Emacs version, you can add @code{codename}
13195(show (S)XEmacs codename) or either @code{config} (show system
13196configuration) or @code{type} (show system type). If you set it to a
13197string, be sure to use a valid format, see RFC 2616.
13198
13199@end table
13200
13201You may want to do spell-checking on messages that you send out. Or, if
13202you don't want to spell-check by hand, you could add automatic
13203spell-checking via the @code{ispell} package:
13204
13205@cindex ispell
13206@findex ispell-message
13207@lisp
13208(add-hook 'message-send-hook 'ispell-message)
13209@end lisp
13210
13211If you want to change the @code{ispell} dictionary based on what group
13212you're in, you could say something like the following:
13213
13214@lisp
13215(add-hook 'gnus-select-group-hook
13216 (lambda ()
13217 (cond
13218 ((string-match
13219 "^de\\." (gnus-group-real-name gnus-newsgroup-name))
13220 (ispell-change-dictionary "deutsch"))
13221 (t
13222 (ispell-change-dictionary "english")))))
13223@end lisp
13224
13225Modify to suit your needs.
13226
01c52d31
MB
13227@vindex gnus-message-highlight-citation
13228If @code{gnus-message-highlight-citation} is t, different levels of
13229citations are highlighted like in Gnus article buffers also in message
13230mode buffers.
4009494e
GM
13231
13232@node Archived Messages
13233@section Archived Messages
13234@cindex archived messages
13235@cindex sent messages
13236
13237Gnus provides a few different methods for storing the mail and news you
13238send. The default method is to use the @dfn{archive virtual server} to
13239store the messages. If you want to disable this completely, the
13240@code{gnus-message-archive-group} variable should be @code{nil}, which
13241is the default.
13242
13243For archiving interesting messages in a group you read, see the
13244@kbd{B c} (@code{gnus-summary-copy-article}) command (@pxref{Mail
13245Group Commands}).
13246
13247@vindex gnus-message-archive-method
13248@code{gnus-message-archive-method} says what virtual server Gnus is to
01c52d31
MB
13249use to store sent messages. The default is @code{"archive"}, and when
13250actually being used it is expanded into:
4009494e
GM
13251
13252@lisp
13253(nnfolder "archive"
13254 (nnfolder-directory "~/Mail/archive")
13255 (nnfolder-active-file "~/Mail/archive/active")
13256 (nnfolder-get-new-mail nil)
13257 (nnfolder-inhibit-expiry t))
13258@end lisp
13259
01c52d31
MB
13260@quotation
13261@vindex gnus-update-message-archive-method
13262Note: a server like this is saved in the @file{~/.newsrc.eld} file first
13263so that it may be used as a real method of the server which is named
13264@code{"archive"} (that is, for the case where
13265@code{gnus-message-archive-method} is set to @code{"archive"}) ever
13266since. If it once has been saved, it will never be updated by default
13267even if you change the value of @code{gnus-message-archive-method}
13268afterward. Therefore, the server @code{"archive"} doesn't necessarily
13269mean the @code{nnfolder} server like this at all times. If you want the
13270saved method to reflect always the value of
13271@code{gnus-message-archive-method}, set the
13272@code{gnus-update-message-archive-method} variable to a non-@code{nil}
13273value. The default value of this variable is @code{nil}.
13274@end quotation
13275
4009494e
GM
13276You can, however, use any mail select method (@code{nnml},
13277@code{nnmbox}, etc.). @code{nnfolder} is a quite likable select method
13278for doing this sort of thing, though. If you don't like the default
13279directory chosen, you could say something like:
13280
13281@lisp
13282(setq gnus-message-archive-method
13283 '(nnfolder "archive"
13284 (nnfolder-inhibit-expiry t)
13285 (nnfolder-active-file "~/News/sent-mail/active")
13286 (nnfolder-directory "~/News/sent-mail/")))
13287@end lisp
13288
13289@vindex gnus-message-archive-group
13290@cindex Gcc
13291Gnus will insert @code{Gcc} headers in all outgoing messages that point
13292to one or more group(s) on that server. Which group to use is
13293determined by the @code{gnus-message-archive-group} variable.
13294
13295This variable can be used to do the following:
13296
13297@table @asis
13298@item a string
13299Messages will be saved in that group.
13300
13301Note that you can include a select method in the group name, then the
13302message will not be stored in the select method given by
13303@code{gnus-message-archive-method}, but in the select method specified
13304by the group name, instead. Suppose @code{gnus-message-archive-method}
13305has the default value shown above. Then setting
13306@code{gnus-message-archive-group} to @code{"foo"} means that outgoing
13307messages are stored in @samp{nnfolder+archive:foo}, but if you use the
13308value @code{"nnml:foo"}, then outgoing messages will be stored in
13309@samp{nnml:foo}.
13310
13311@item a list of strings
13312Messages will be saved in all those groups.
13313
13314@item an alist of regexps, functions and forms
13315When a key ``matches'', the result is used.
13316
13317@item @code{nil}
13318No message archiving will take place. This is the default.
13319@end table
13320
13321Let's illustrate:
13322
13323Just saving to a single group called @samp{MisK}:
13324@lisp
13325(setq gnus-message-archive-group "MisK")
13326@end lisp
13327
13328Saving to two groups, @samp{MisK} and @samp{safe}:
13329@lisp
13330(setq gnus-message-archive-group '("MisK" "safe"))
13331@end lisp
13332
13333Save to different groups based on what group you are in:
13334@lisp
13335(setq gnus-message-archive-group
13336 '(("^alt" "sent-to-alt")
13337 ("mail" "sent-to-mail")
13338 (".*" "sent-to-misc")))
13339@end lisp
13340
13341More complex stuff:
13342@lisp
13343(setq gnus-message-archive-group
13344 '((if (message-news-p)
13345 "misc-news"
13346 "misc-mail")))
13347@end lisp
13348
13349How about storing all news messages in one file, but storing all mail
13350messages in one file per month:
13351
13352@lisp
13353(setq gnus-message-archive-group
13354 '((if (message-news-p)
13355 "misc-news"
13356 (concat "mail." (format-time-string "%Y-%m")))))
13357@end lisp
13358
13359@c (XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to
13360@c use a different value for @code{gnus-message-archive-group} there.)
13361
13362Now, when you send a message off, it will be stored in the appropriate
13363group. (If you want to disable storing for just one particular message,
13364you can just remove the @code{Gcc} header that has been inserted.) The
13365archive group will appear in the group buffer the next time you start
13366Gnus, or the next time you press @kbd{F} in the group buffer. You can
13367enter it and read the articles in it just like you'd read any other
13368group. If the group gets really big and annoying, you can simply rename
13369if (using @kbd{G r} in the group buffer) to something
13370nice---@samp{misc-mail-september-1995}, or whatever. New messages will
13371continue to be stored in the old (now empty) group.
13372
13373That's the default method of archiving sent messages. Gnus offers a
13374different way for the people who don't like the default method. In that
13375case you should set @code{gnus-message-archive-group} to @code{nil};
13376this will disable archiving.
13377
13378@table @code
13379@item gnus-outgoing-message-group
13380@vindex gnus-outgoing-message-group
13381All outgoing messages will be put in this group. If you want to store
13382all your outgoing mail and articles in the group @samp{nnml:archive},
13383you set this variable to that value. This variable can also be a list of
13384group names.
13385
13386If you want to have greater control over what group to put each
13387message in, you can set this variable to a function that checks the
13388current newsgroup name and then returns a suitable group name (or list
13389of names).
13390
13391This variable can be used instead of @code{gnus-message-archive-group},
13392but the latter is the preferred method.
13393
13394@item gnus-gcc-mark-as-read
13395@vindex gnus-gcc-mark-as-read
13396If non-@code{nil}, automatically mark @code{Gcc} articles as read.
13397
13398@item gnus-gcc-externalize-attachments
13399@vindex gnus-gcc-externalize-attachments
13400If @code{nil}, attach files as normal parts in Gcc copies; if a regexp
13401and matches the Gcc group name, attach files as external parts; if it is
13402@code{all}, attach local files as external parts; if it is other
13403non-@code{nil}, the behavior is the same as @code{all}, but it may be
13404changed in the future.
13405
13406@end table
13407
13408
13409@node Posting Styles
13410@section Posting Styles
13411@cindex posting styles
13412@cindex styles
13413
13414All them variables, they make my head swim.
13415
13416So what if you want a different @code{Organization} and signature based
13417on what groups you post to? And you post both from your home machine
13418and your work machine, and you want different @code{From} lines, and so
13419on?
13420
13421@vindex gnus-posting-styles
13422One way to do stuff like that is to write clever hooks that change the
13423variables you need to have changed. That's a bit boring, so somebody
13424came up with the bright idea of letting the user specify these things in
13425a handy alist. Here's an example of a @code{gnus-posting-styles}
13426variable:
13427
13428@lisp
13429((".*"
13430 (signature "Peace and happiness")
13431 (organization "What me?"))
13432 ("^comp"
13433 (signature "Death to everybody"))
13434 ("comp.emacs.i-love-it"
13435 (organization "Emacs is it")))
13436@end lisp
13437
13438As you might surmise from this example, this alist consists of several
13439@dfn{styles}. Each style will be applicable if the first element
13440``matches'', in some form or other. The entire alist will be iterated
13441over, from the beginning towards the end, and each match will be
13442applied, which means that attributes in later styles that match override
13443the same attributes in earlier matching styles. So
13444@samp{comp.programming.literate} will have the @samp{Death to everybody}
13445signature and the @samp{What me?} @code{Organization} header.
13446
13447The first element in each style is called the @code{match}. If it's a
13448string, then Gnus will try to regexp match it against the group name.
13449If it is the form @code{(header @var{match} @var{regexp})}, then Gnus
13450will look in the original article for a header whose name is
13451@var{match} and compare that @var{regexp}. @var{match} and
13452@var{regexp} are strings. (The original article is the one you are
13453replying or following up to. If you are not composing a reply or a
13454followup, then there is nothing to match against.) If the
13455@code{match} is a function symbol, that function will be called with
13456no arguments. If it's a variable symbol, then the variable will be
13457referenced. If it's a list, then that list will be @code{eval}ed. In
13458any case, if this returns a non-@code{nil} value, then the style is
13459said to @dfn{match}.
13460
13461Each style may contain an arbitrary amount of @dfn{attributes}. Each
13462attribute consists of a @code{(@var{name} @var{value})} pair. In
13463addition, you can also use the @code{(@var{name} :file @var{value})}
13464form or the @code{(@var{name} :value @var{value})} form. Where
13465@code{:file} signifies @var{value} represents a file name and its
13466contents should be used as the attribute value, @code{:value} signifies
13467@var{value} does not represent a file name explicitly. The attribute
13468name can be one of:
13469
13470@itemize @bullet
13471@item @code{signature}
13472@item @code{signature-file}
13473@item @code{x-face-file}
13474@item @code{address}, overriding @code{user-mail-address}
13475@item @code{name}, overriding @code{(user-full-name)}
13476@item @code{body}
13477@end itemize
13478
01c52d31
MB
13479Note that the @code{signature-file} attribute honors the variable
13480@code{message-signature-directory}.
13481
4009494e
GM
13482The attribute name can also be a string or a symbol. In that case,
13483this will be used as a header name, and the value will be inserted in
13484the headers of the article; if the value is @code{nil}, the header
13485name will be removed. If the attribute name is @code{eval}, the form
13486is evaluated, and the result is thrown away.
13487
13488The attribute value can be a string (used verbatim), a function with
13489zero arguments (the return value will be used), a variable (its value
13490will be used) or a list (it will be @code{eval}ed and the return value
13491will be used). The functions and sexps are called/@code{eval}ed in the
13492message buffer that is being set up. The headers of the current article
13493are available through the @code{message-reply-headers} variable, which
13494is a vector of the following headers: number subject from date id
13495references chars lines xref extra.
13496
13497@vindex message-reply-headers
13498
13499If you wish to check whether the message you are about to compose is
13500meant to be a news article or a mail message, you can check the values
13501of the @code{message-news-p} and @code{message-mail-p} functions.
13502
13503@findex message-mail-p
13504@findex message-news-p
13505
13506So here's a new example:
13507
13508@lisp
13509(setq gnus-posting-styles
13510 '((".*"
13511 (signature-file "~/.signature")
13512 (name "User Name")
13513 (x-face-file "~/.xface")
13514 (x-url (getenv "WWW_HOME"))
13515 (organization "People's Front Against MWM"))
13516 ("^rec.humor"
13517 (signature my-funny-signature-randomizer))
13518 ((equal (system-name) "gnarly") ;; @r{A form}
13519 (signature my-quote-randomizer))
13520 (message-news-p ;; @r{A function symbol}
13521 (signature my-news-signature))
13522 (window-system ;; @r{A value symbol}
13523 ("X-Window-System" (format "%s" window-system)))
13524 ;; @r{If I'm replying to Larsi, set the Organization header.}
13525 ((header "from" "larsi.*org")
13526 (Organization "Somewhere, Inc."))
13527 ((posting-from-work-p) ;; @r{A user defined function}
13528 (signature-file "~/.work-signature")
13529 (address "user@@bar.foo")
13530 (body "You are fired.\n\nSincerely, your boss.")
13531 (organization "Important Work, Inc"))
13532 ("nnml:.*"
c57008f6 13533 (From (with-current-buffer gnus-article-buffer
4009494e
GM
13534 (message-fetch-field "to"))))
13535 ("^nn.+:"
13536 (signature-file "~/.mail-signature"))))
13537@end lisp
13538
13539The @samp{nnml:.*} rule means that you use the @code{To} address as the
13540@code{From} address in all your outgoing replies, which might be handy
13541if you fill many roles.
13542You may also use @code{message-alternative-emails} instead.
13543@xref{Message Headers, ,Message Headers, message, Message Manual}.
13544
13545@node Drafts
13546@section Drafts
13547@cindex drafts
13548
13549If you are writing a message (mail or news) and suddenly remember that
13550you have a steak in the oven (or some pesto in the food processor, you
13551craaazy vegetarians), you'll probably wish there was a method to save
13552the message you are writing so that you can continue editing it some
13553other day, and send it when you feel its finished.
13554
13555Well, don't worry about it. Whenever you start composing a message of
13556some sort using the Gnus mail and post commands, the buffer you get will
13557automatically associate to an article in a special @dfn{draft} group.
13558If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the
13559article will be saved there. (Auto-save files also go to the draft
13560group.)
13561
13562@cindex nndraft
13563@vindex nndraft-directory
13564The draft group is a special group (which is implemented as an
13565@code{nndraft} group, if you absolutely have to know) called
13566@samp{nndraft:drafts}. The variable @code{nndraft-directory} says where
13567@code{nndraft} is to store its files. What makes this group special is
13568that you can't tick any articles in it or mark any articles as
13569read---all articles in the group are permanently unread.
13570
13571If the group doesn't exist, it will be created and you'll be subscribed
13572to it. The only way to make it disappear from the Group buffer is to
13573unsubscribe it. The special properties of the draft group comes from
13574a group property (@pxref{Group Parameters}), and if lost the group
13575behaves like any other group. This means the commands below will not
13576be available. To restore the special properties of the group, the
13577simplest way is to kill the group, using @kbd{C-k}, and restart
13578Gnus. The group is automatically created again with the
13579correct parameters. The content of the group is not lost.
13580
13581@c @findex gnus-dissociate-buffer-from-draft
13582@c @kindex C-c M-d (Mail)
13583@c @kindex C-c M-d (Post)
13584@c @findex gnus-associate-buffer-with-draft
13585@c @kindex C-c C-d (Mail)
13586@c @kindex C-c C-d (Post)
13587@c If you're writing some super-secret message that you later want to
13588@c encode with PGP before sending, you may wish to turn the auto-saving
13589@c (and association with the draft group) off. You never know who might be
13590@c interested in reading all your extremely valuable and terribly horrible
13591@c and interesting secrets. The @kbd{C-c M-d}
13592@c (@code{gnus-dissociate-buffer-from-draft}) command does that for you.
13593@c If you change your mind and want to turn the auto-saving back on again,
13594@c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that.
13595@c
13596@c @vindex gnus-use-draft
13597@c To leave association with the draft group off by default, set
13598@c @code{gnus-use-draft} to @code{nil}. It is @code{t} by default.
13599
13600@findex gnus-draft-edit-message
13601@kindex D e (Draft)
13602When you want to continue editing the article, you simply enter the
13603draft group and push @kbd{D e} (@code{gnus-draft-edit-message}) to do
13604that. You will be placed in a buffer where you left off.
13605
13606Rejected articles will also be put in this draft group (@pxref{Rejected
13607Articles}).
13608
13609@findex gnus-draft-send-all-messages
13610@kindex D s (Draft)
13611@findex gnus-draft-send-message
13612@kindex D S (Draft)
13613If you have lots of rejected messages you want to post (or mail) without
13614doing further editing, you can use the @kbd{D s} command
13615(@code{gnus-draft-send-message}). This command understands the
13616process/prefix convention (@pxref{Process/Prefix}). The @kbd{D S}
13617command (@code{gnus-draft-send-all-messages}) will ship off all messages
13618in the buffer.
13619
13620@findex gnus-draft-toggle-sending
13621@kindex D t (Draft)
13622If you have some messages that you wish not to send, you can use the
13623@kbd{D t} (@code{gnus-draft-toggle-sending}) command to mark the message
13624as unsendable. This is a toggling command.
13625
13626
13627@node Rejected Articles
13628@section Rejected Articles
13629@cindex rejected articles
13630
13631Sometimes a news server will reject an article. Perhaps the server
13632doesn't like your face. Perhaps it just feels miserable. Perhaps
13633@emph{there be demons}. Perhaps you have included too much cited text.
13634Perhaps the disk is full. Perhaps the server is down.
13635
13636These situations are, of course, totally beyond the control of Gnus.
13637(Gnus, of course, loves the way you look, always feels great, has angels
13638fluttering around inside of it, doesn't care about how much cited text
13639you include, never runs full and never goes down.) So Gnus saves these
13640articles until some later time when the server feels better.
13641
13642The rejected articles will automatically be put in a special draft group
13643(@pxref{Drafts}). When the server comes back up again, you'd then
13644typically enter that group and send all the articles off.
13645
13646@node Signing and encrypting
13647@section Signing and encrypting
13648@cindex using gpg
13649@cindex using s/mime
13650@cindex using smime
13651
13652Gnus can digitally sign and encrypt your messages, using vanilla
13653@acronym{PGP} format or @acronym{PGP/MIME} or @acronym{S/MIME}. For
13654decoding such messages, see the @code{mm-verify-option} and
13655@code{mm-decrypt-option} options (@pxref{Security}).
13656
13657@vindex gnus-message-replysign
13658@vindex gnus-message-replyencrypt
13659@vindex gnus-message-replysignencrypted
13660Often, you would like to sign replies to people who send you signed
13661messages. Even more often, you might want to encrypt messages which
13662are in reply to encrypted messages. Gnus offers
13663@code{gnus-message-replysign} to enable the former, and
13664@code{gnus-message-replyencrypt} for the latter. In addition, setting
13665@code{gnus-message-replysignencrypted} (on by default) will sign
13666automatically encrypted messages.
13667
13668Instructing @acronym{MML} to perform security operations on a
13669@acronym{MIME} part is done using the @kbd{C-c C-m s} key map for
13670signing and the @kbd{C-c C-m c} key map for encryption, as follows.
13671
13672@table @kbd
13673
13674@item C-c C-m s s
13675@kindex C-c C-m s s (Message)
13676@findex mml-secure-message-sign-smime
13677
13678Digitally sign current message using @acronym{S/MIME}.
13679
13680@item C-c C-m s o
13681@kindex C-c C-m s o (Message)
13682@findex mml-secure-message-sign-pgp
13683
13684Digitally sign current message using @acronym{PGP}.
13685
13686@item C-c C-m s p
13687@kindex C-c C-m s p (Message)
13688@findex mml-secure-message-sign-pgp
13689
13690Digitally sign current message using @acronym{PGP/MIME}.
13691
13692@item C-c C-m c s
13693@kindex C-c C-m c s (Message)
13694@findex mml-secure-message-encrypt-smime
13695
13696Digitally encrypt current message using @acronym{S/MIME}.
13697
13698@item C-c C-m c o
13699@kindex C-c C-m c o (Message)
13700@findex mml-secure-message-encrypt-pgp
13701
13702Digitally encrypt current message using @acronym{PGP}.
13703
13704@item C-c C-m c p
13705@kindex C-c C-m c p (Message)
13706@findex mml-secure-message-encrypt-pgpmime
13707
13708Digitally encrypt current message using @acronym{PGP/MIME}.
13709
13710@item C-c C-m C-n
13711@kindex C-c C-m C-n (Message)
13712@findex mml-unsecure-message
13713Remove security related @acronym{MML} tags from message.
13714
13715@end table
13716
13717@xref{Security, ,Security, message, Message Manual}, for more information.
13718
13719@node Select Methods
13720@chapter Select Methods
13721@cindex foreign groups
13722@cindex select methods
13723
13724A @dfn{foreign group} is a group not read by the usual (or
13725default) means. It could be, for instance, a group from a different
13726@acronym{NNTP} server, it could be a virtual group, or it could be your own
13727personal mail group.
13728
13729A foreign group (or any group, really) is specified by a @dfn{name} and
13730a @dfn{select method}. To take the latter first, a select method is a
13731list where the first element says what back end to use (e.g. @code{nntp},
13732@code{nnspool}, @code{nnml}) and the second element is the @dfn{server
13733name}. There may be additional elements in the select method, where the
13734value may have special meaning for the back end in question.
13735
13736One could say that a select method defines a @dfn{virtual server}---so
13737we do just that (@pxref{Server Buffer}).
13738
13739The @dfn{name} of the group is the name the back end will recognize the
13740group as.
13741
13742For instance, the group @samp{soc.motss} on the @acronym{NNTP} server
13743@samp{some.where.edu} will have the name @samp{soc.motss} and select
13744method @code{(nntp "some.where.edu")}. Gnus will call this group
13745@samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp}
13746back end just knows this group as @samp{soc.motss}.
13747
13748The different methods all have their peculiarities, of course.
13749
13750@menu
13751* Server Buffer:: Making and editing virtual servers.
13752* Getting News:: Reading USENET news with Gnus.
13753* Getting Mail:: Reading your personal mail with Gnus.
13754* Browsing the Web:: Getting messages from a plethora of Web sources.
13755* IMAP:: Using Gnus as a @acronym{IMAP} client.
13756* Other Sources:: Reading directories, files, SOUP packets.
13757* Combined Groups:: Combining groups into one group.
13758* Email Based Diary:: Using mails to manage diary events in Gnus.
13759* Gnus Unplugged:: Reading news and mail offline.
13760@end menu
13761
13762
13763@node Server Buffer
13764@section Server Buffer
13765
13766Traditionally, a @dfn{server} is a machine or a piece of software that
13767one connects to, and then requests information from. Gnus does not
13768connect directly to any real servers, but does all transactions through
13769one back end or other. But that's just putting one layer more between
13770the actual media and Gnus, so we might just as well say that each
13771back end represents a virtual server.
13772
13773For instance, the @code{nntp} back end may be used to connect to several
13774different actual @acronym{NNTP} servers, or, perhaps, to many different ports
13775on the same actual @acronym{NNTP} server. You tell Gnus which back end to
13776use, and what parameters to set by specifying a @dfn{select method}.
13777
13778These select method specifications can sometimes become quite
13779complicated---say, for instance, that you want to read from the
13780@acronym{NNTP} server @samp{news.funet.fi} on port number 13, which
13781hangs if queried for @acronym{NOV} headers and has a buggy select. Ahem.
13782Anyway, if you had to specify that for each group that used this
13783server, that would be too much work, so Gnus offers a way of naming
13784select methods, which is what you do in the server buffer.
13785
13786To enter the server buffer, use the @kbd{^}
13787(@code{gnus-group-enter-server-mode}) command in the group buffer.
13788
13789@menu
13790* Server Buffer Format:: You can customize the look of this buffer.
13791* Server Commands:: Commands to manipulate servers.
13792* Example Methods:: Examples server specifications.
13793* Creating a Virtual Server:: An example session.
13794* Server Variables:: Which variables to set.
13795* Servers and Methods:: You can use server names as select methods.
13796* Unavailable Servers:: Some servers you try to contact may be down.
13797@end menu
13798
13799@vindex gnus-server-mode-hook
13800@code{gnus-server-mode-hook} is run when creating the server buffer.
13801
13802
13803@node Server Buffer Format
13804@subsection Server Buffer Format
13805@cindex server buffer format
13806
13807@vindex gnus-server-line-format
13808You can change the look of the server buffer lines by changing the
13809@code{gnus-server-line-format} variable. This is a @code{format}-like
13810variable, with some simple extensions:
13811
13812@table @samp
13813
13814@item h
13815How the news is fetched---the back end name.
13816
13817@item n
13818The name of this server.
13819
13820@item w
13821Where the news is to be fetched from---the address.
13822
13823@item s
13824The opened/closed/denied status of the server.
13825
13826@item a
13827Whether this server is agentized.
13828@end table
13829
13830@vindex gnus-server-mode-line-format
13831The mode line can also be customized by using the
13832@code{gnus-server-mode-line-format} variable (@pxref{Mode Line
13833Formatting}). The following specs are understood:
13834
13835@table @samp
13836@item S
13837Server name.
13838
13839@item M
13840Server method.
13841@end table
13842
13843Also @pxref{Formatting Variables}.
13844
13845
13846@node Server Commands
13847@subsection Server Commands
13848@cindex server commands
13849
13850@table @kbd
13851
13852@item v
13853@kindex v (Server)
13854@cindex keys, reserved for users (Server)
13855The key @kbd{v} is reserved for users. You can bind it to some
13856command or better use it as a prefix key.
13857
13858@item a
13859@kindex a (Server)
13860@findex gnus-server-add-server
13861Add a new server (@code{gnus-server-add-server}).
13862
13863@item e
13864@kindex e (Server)
13865@findex gnus-server-edit-server
13866Edit a server (@code{gnus-server-edit-server}).
13867
13868@item SPACE
13869@kindex SPACE (Server)
13870@findex gnus-server-read-server
13871Browse the current server (@code{gnus-server-read-server}).
13872
13873@item q
13874@kindex q (Server)
13875@findex gnus-server-exit
13876Return to the group buffer (@code{gnus-server-exit}).
13877
13878@item k
13879@kindex k (Server)
13880@findex gnus-server-kill-server
13881Kill the current server (@code{gnus-server-kill-server}).
13882
13883@item y
13884@kindex y (Server)
13885@findex gnus-server-yank-server
13886Yank the previously killed server (@code{gnus-server-yank-server}).
13887
13888@item c
13889@kindex c (Server)
13890@findex gnus-server-copy-server
13891Copy the current server (@code{gnus-server-copy-server}).
13892
13893@item l
13894@kindex l (Server)
13895@findex gnus-server-list-servers
13896List all servers (@code{gnus-server-list-servers}).
13897
13898@item s
13899@kindex s (Server)
13900@findex gnus-server-scan-server
13901Request that the server scan its sources for new articles
13902(@code{gnus-server-scan-server}). This is mainly sensible with mail
13903servers.
13904
13905@item g
13906@kindex g (Server)
13907@findex gnus-server-regenerate-server
13908Request that the server regenerate all its data structures
13909(@code{gnus-server-regenerate-server}). This can be useful if you have
13910a mail back end that has gotten out of sync.
13911
01c52d31
MB
13912@item z
13913@kindex z (Server)
13914@findex gnus-server-compact-server
13915
13916Compact all groups in the server under point
13917(@code{gnus-server-compact-server}). Currently implemented only in
13918nnml (@pxref{Mail Spool}). This removes gaps between article numbers,
13919hence getting a correct total article count.
13920
4009494e
GM
13921@end table
13922
13923
13924@node Example Methods
13925@subsection Example Methods
13926
13927Most select methods are pretty simple and self-explanatory:
13928
13929@lisp
13930(nntp "news.funet.fi")
13931@end lisp
13932
13933Reading directly from the spool is even simpler:
13934
13935@lisp
13936(nnspool "")
13937@end lisp
13938
13939As you can see, the first element in a select method is the name of the
13940back end, and the second is the @dfn{address}, or @dfn{name}, if you
13941will.
13942
13943After these two elements, there may be an arbitrary number of
13944@code{(@var{variable} @var{form})} pairs.
13945
13946To go back to the first example---imagine that you want to read from
13947port 15 on that machine. This is what the select method should
13948look like then:
13949
13950@lisp
13951(nntp "news.funet.fi" (nntp-port-number 15))
13952@end lisp
13953
13954You should read the documentation to each back end to find out what
13955variables are relevant, but here's an @code{nnmh} example:
13956
13957@code{nnmh} is a mail back end that reads a spool-like structure. Say
13958you have two structures that you wish to access: One is your private
13959mail spool, and the other is a public one. Here's the possible spec for
13960your private mail:
13961
13962@lisp
13963(nnmh "private" (nnmh-directory "~/private/mail/"))
13964@end lisp
13965
13966(This server is then called @samp{private}, but you may have guessed
13967that.)
13968
13969Here's the method for a public spool:
13970
13971@lisp
13972(nnmh "public"
13973 (nnmh-directory "/usr/information/spool/")
13974 (nnmh-get-new-mail nil))
13975@end lisp
13976
13977@cindex proxy
13978@cindex firewall
13979
13980If you are behind a firewall and only have access to the @acronym{NNTP}
13981server from the firewall machine, you can instruct Gnus to @code{rlogin}
31fe2b00
SM
13982on the firewall machine and connect with
13983@uref{http://netcat.sourceforge.net/, netcat} from there to the
13984@acronym{NNTP} server.
4009494e
GM
13985Doing this can be rather fiddly, but your virtual server definition
13986should probably look something like this:
13987
13988@lisp
13989(nntp "firewall"
31fe2b00 13990 (nntp-open-connection-function nntp-open-via-rlogin-and-netcat)
4009494e 13991 (nntp-via-address "the.firewall.machine")
31fe2b00 13992 (nntp-address "the.real.nntp.host"))
4009494e
GM
13993@end lisp
13994
13995If you want to use the wonderful @code{ssh} program to provide a
13996compressed connection over the modem line, you could add the following
13997configuration to the example above:
13998
13999@lisp
14000 (nntp-via-rlogin-command "ssh")
14001@end lisp
14002
01c52d31
MB
14003See also @code{nntp-via-rlogin-command-switches}. Here's an example for
14004an indirect connection:
fbcbb58c 14005
01c52d31
MB
14006@lisp
14007(setq gnus-select-method
14008 '(nntp "indirect"
14009 (nntp-address "news.server.example")
14010 (nntp-via-user-name "intermediate_user_name")
14011 (nntp-via-address "intermediate.host.example")
14012 (nntp-via-rlogin-command "ssh")
31fe2b00
SM
14013 (nntp-via-rlogin-command-switches ("-C"))
14014 (nntp-open-connection-function nntp-open-via-rlogin-and-netcat)))
01c52d31 14015@end lisp
4009494e 14016
fbcbb58c
KY
14017This means that you have to have set up @code{ssh-agent} correctly to
14018provide automatic authorization, of course.
14019
4009494e
GM
14020If you're behind a firewall, but have direct access to the outside world
14021through a wrapper command like "runsocks", you could open a socksified
31fe2b00 14022netcat connection to the news server as follows:
4009494e
GM
14023
14024@lisp
14025(nntp "outside"
14026 (nntp-pre-command "runsocks")
990e2c2f 14027 (nntp-open-connection-function nntp-open-netcat-stream)
31fe2b00 14028 (nntp-address "the.news.server"))
4009494e
GM
14029@end lisp
14030
4009494e
GM
14031
14032@node Creating a Virtual Server
14033@subsection Creating a Virtual Server
14034
14035If you're saving lots of articles in the cache by using persistent
14036articles, you may want to create a virtual server to read the cache.
14037
14038First you need to add a new server. The @kbd{a} command does that. It
14039would probably be best to use @code{nnml} to read the cache. You
14040could also use @code{nnspool} or @code{nnmh}, though.
14041
14042Type @kbd{a nnml RET cache RET}.
14043
14044You should now have a brand new @code{nnml} virtual server called
14045@samp{cache}. You now need to edit it to have the right definitions.
14046Type @kbd{e} to edit the server. You'll be entered into a buffer that
14047will contain the following:
14048
14049@lisp
14050(nnml "cache")
14051@end lisp
14052
14053Change that to:
14054
14055@lisp
14056(nnml "cache"
14057 (nnml-directory "~/News/cache/")
14058 (nnml-active-file "~/News/cache/active"))
14059@end lisp
14060
14061Type @kbd{C-c C-c} to return to the server buffer. If you now press
14062@kbd{RET} over this virtual server, you should be entered into a browse
14063buffer, and you should be able to enter any of the groups displayed.
14064
14065
14066@node Server Variables
14067@subsection Server Variables
14068@cindex server variables
14069@cindex server parameters
14070
14071One sticky point when defining variables (both on back ends and in Emacs
14072in general) is that some variables are typically initialized from other
14073variables when the definition of the variables is being loaded. If you
14074change the ``base'' variable after the variables have been loaded, you
14075won't change the ``derived'' variables.
14076
14077This typically affects directory and file variables. For instance,
14078@code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml}
14079directory variables are initialized from that variable, so
14080@code{nnml-active-file} will be @file{~/Mail/active}. If you define a
14081new virtual @code{nnml} server, it will @emph{not} suffice to set just
14082@code{nnml-directory}---you have to explicitly set all the file
14083variables to be what you want them to be. For a complete list of
14084variables for each back end, see each back end's section later in this
14085manual, but here's an example @code{nnml} definition:
14086
14087@lisp
14088(nnml "public"
14089 (nnml-directory "~/my-mail/")
14090 (nnml-active-file "~/my-mail/active")
14091 (nnml-newsgroups-file "~/my-mail/newsgroups"))
14092@end lisp
14093
14094Server variables are often called @dfn{server parameters}.
14095
14096@node Servers and Methods
14097@subsection Servers and Methods
14098
14099Wherever you would normally use a select method
14100(e.g. @code{gnus-secondary-select-method}, in the group select method,
14101when browsing a foreign server) you can use a virtual server name
14102instead. This could potentially save lots of typing. And it's nice all
14103over.
14104
14105
14106@node Unavailable Servers
14107@subsection Unavailable Servers
14108
14109If a server seems to be unreachable, Gnus will mark that server as
14110@code{denied}. That means that any subsequent attempt to make contact
14111with that server will just be ignored. ``It can't be opened,'' Gnus
14112will tell you, without making the least effort to see whether that is
14113actually the case or not.
14114
14115That might seem quite naughty, but it does make sense most of the time.
14116Let's say you have 10 groups subscribed to on server
14117@samp{nephelococcygia.com}. This server is located somewhere quite far
14118away from you and the machine is quite slow, so it takes 1 minute just
14119to find out that it refuses connection to you today. If Gnus were to
14120attempt to do that 10 times, you'd be quite annoyed, so Gnus won't
14121attempt to do that. Once it has gotten a single ``connection refused'',
14122it will regard that server as ``down''.
14123
14124So, what happens if the machine was only feeling unwell temporarily?
14125How do you test to see whether the machine has come up again?
14126
14127You jump to the server buffer (@pxref{Server Buffer}) and poke it
14128with the following commands:
14129
14130@table @kbd
14131
14132@item O
14133@kindex O (Server)
14134@findex gnus-server-open-server
14135Try to establish connection to the server on the current line
14136(@code{gnus-server-open-server}).
14137
14138@item C
14139@kindex C (Server)
14140@findex gnus-server-close-server
14141Close the connection (if any) to the server
14142(@code{gnus-server-close-server}).
14143
14144@item D
14145@kindex D (Server)
14146@findex gnus-server-deny-server
14147Mark the current server as unreachable
14148(@code{gnus-server-deny-server}).
14149
14150@item M-o
14151@kindex M-o (Server)
14152@findex gnus-server-open-all-servers
14153Open the connections to all servers in the buffer
14154(@code{gnus-server-open-all-servers}).
14155
14156@item M-c
14157@kindex M-c (Server)
14158@findex gnus-server-close-all-servers
14159Close the connections to all servers in the buffer
14160(@code{gnus-server-close-all-servers}).
14161
14162@item R
14163@kindex R (Server)
14164@findex gnus-server-remove-denials
14165Remove all marks to whether Gnus was denied connection from any servers
14166(@code{gnus-server-remove-denials}).
14167
14168@item L
14169@kindex L (Server)
14170@findex gnus-server-offline-server
14171Set server status to offline (@code{gnus-server-offline-server}).
14172
14173@end table
14174
14175
14176@node Getting News
14177@section Getting News
14178@cindex reading news
14179@cindex news back ends
14180
14181A newsreader is normally used for reading news. Gnus currently provides
14182only two methods of getting news---it can read from an @acronym{NNTP} server,
14183or it can read from a local spool.
14184
14185@menu
14186* NNTP:: Reading news from an @acronym{NNTP} server.
14187* News Spool:: Reading news from the local spool.
14188@end menu
14189
14190
14191@node NNTP
14192@subsection NNTP
14193@cindex nntp
14194
14195Subscribing to a foreign group from an @acronym{NNTP} server is rather easy.
14196You just specify @code{nntp} as method and the address of the @acronym{NNTP}
14197server as the, uhm, address.
14198
14199If the @acronym{NNTP} server is located at a non-standard port, setting the
14200third element of the select method to this port number should allow you
14201to connect to the right port. You'll have to edit the group info for
14202that (@pxref{Foreign Groups}).
14203
14204The name of the foreign group can be the same as a native group. In
14205fact, you can subscribe to the same group from as many different servers
14206you feel like. There will be no name collisions.
14207
14208The following variables can be used to create a virtual @code{nntp}
14209server:
14210
14211@table @code
14212
14213@item nntp-server-opened-hook
14214@vindex nntp-server-opened-hook
14215@cindex @sc{mode reader}
14216@cindex authinfo
14217@cindex authentication
14218@cindex nntp authentication
14219@findex nntp-send-authinfo
14220@findex nntp-send-mode-reader
14221is run after a connection has been made. It can be used to send
14222commands to the @acronym{NNTP} server after it has been contacted. By
14223default it sends the command @code{MODE READER} to the server with the
14224@code{nntp-send-mode-reader} function. This function should always be
14225present in this hook.
14226
14227@item nntp-authinfo-function
14228@vindex nntp-authinfo-function
14229@findex nntp-send-authinfo
14230@vindex nntp-authinfo-file
14231This function will be used to send @samp{AUTHINFO} to the @acronym{NNTP}
14232server. The default function is @code{nntp-send-authinfo}, which looks
14233through your @file{~/.authinfo} (or whatever you've set the
14234@code{nntp-authinfo-file} variable to) for applicable entries. If none
14235are found, it will prompt you for a login name and a password. The
14236format of the @file{~/.authinfo} file is (almost) the same as the
14237@code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp}
14238manual page, but here are the salient facts:
14239
14240@enumerate
14241@item
14242The file contains one or more line, each of which define one server.
14243
14244@item
14245Each line may contain an arbitrary number of token/value pairs.
14246
14247The valid tokens include @samp{machine}, @samp{login}, @samp{password},
14248@samp{default}. In addition Gnus introduces two new tokens, not present
14249in the original @file{.netrc}/@code{ftp} syntax, namely @samp{port} and
14250@samp{force}. (This is the only way the @file{.authinfo} file format
14251deviates from the @file{.netrc} file format.) @samp{port} is used to
14252indicate what port on the server the credentials apply to and
14253@samp{force} is explained below.
14254
14255@end enumerate
14256
14257Here's an example file:
14258
14259@example
14260machine news.uio.no login larsi password geheimnis
14261machine nntp.ifi.uio.no login larsi force yes
14262@end example
14263
14264The token/value pairs may appear in any order; @samp{machine} doesn't
14265have to be first, for instance.
14266
14267In this example, both login name and password have been supplied for the
14268former server, while the latter has only the login name listed, and the
14269user will be prompted for the password. The latter also has the
14270@samp{force} tag, which means that the authinfo will be sent to the
14271@var{nntp} server upon connection; the default (i.e., when there is not
14272@samp{force} tag) is to not send authinfo to the @var{nntp} server
14273until the @var{nntp} server asks for it.
14274
14275You can also add @samp{default} lines that will apply to all servers
14276that don't have matching @samp{machine} lines.
14277
14278@example
14279default force yes
14280@end example
14281
14282This will force sending @samp{AUTHINFO} commands to all servers not
14283previously mentioned.
14284
14285Remember to not leave the @file{~/.authinfo} file world-readable.
14286
14287@item nntp-server-action-alist
14288@vindex nntp-server-action-alist
14289This is a list of regexps to match on server types and actions to be
14290taken when matches are made. For instance, if you want Gnus to beep
14291every time you connect to innd, you could say something like:
14292
14293@lisp
14294(setq nntp-server-action-alist
14295 '(("innd" (ding))))
14296@end lisp
14297
14298You probably don't want to do that, though.
14299
14300The default value is
14301
14302@lisp
14303'(("nntpd 1\\.5\\.11t"
14304 (remove-hook 'nntp-server-opened-hook
14305 'nntp-send-mode-reader)))
14306@end lisp
14307
14308This ensures that Gnus doesn't send the @code{MODE READER} command to
14309nntpd 1.5.11t, since that command chokes that server, I've been told.
14310
14311@item nntp-maximum-request
14312@vindex nntp-maximum-request
14313If the @acronym{NNTP} server doesn't support @acronym{NOV} headers, this back end
14314will collect headers by sending a series of @code{head} commands. To
14315speed things up, the back end sends lots of these commands without
14316waiting for reply, and then reads all the replies. This is controlled
14317by the @code{nntp-maximum-request} variable, and is 400 by default. If
14318your network is buggy, you should set this to 1.
14319
14320@item nntp-connection-timeout
14321@vindex nntp-connection-timeout
14322If you have lots of foreign @code{nntp} groups that you connect to
14323regularly, you're sure to have problems with @acronym{NNTP} servers not
14324responding properly, or being too loaded to reply within reasonable
14325time. This is can lead to awkward problems, which can be helped
14326somewhat by setting @code{nntp-connection-timeout}. This is an integer
14327that says how many seconds the @code{nntp} back end should wait for a
14328connection before giving up. If it is @code{nil}, which is the default,
14329no timeouts are done.
14330
14331@item nntp-nov-is-evil
14332@vindex nntp-nov-is-evil
14333If the @acronym{NNTP} server does not support @acronym{NOV}, you could set this
14334variable to @code{t}, but @code{nntp} usually checks automatically whether @acronym{NOV}
14335can be used.
14336
14337@item nntp-xover-commands
14338@vindex nntp-xover-commands
14339@cindex @acronym{NOV}
14340@cindex XOVER
14341List of strings used as commands to fetch @acronym{NOV} lines from a
14342server. The default value of this variable is @code{("XOVER"
14343"XOVERVIEW")}.
14344
14345@item nntp-nov-gap
14346@vindex nntp-nov-gap
14347@code{nntp} normally sends just one big request for @acronym{NOV} lines to
14348the server. The server responds with one huge list of lines. However,
14349if you have read articles 2-5000 in the group, and only want to read
14350article 1 and 5001, that means that @code{nntp} will fetch 4999 @acronym{NOV}
14351lines that you will not need. This variable says how
14352big a gap between two consecutive articles is allowed to be before the
14353@code{XOVER} request is split into several request. Note that if your
14354network is fast, setting this variable to a really small number means
14355that fetching will probably be slower. If this variable is @code{nil},
14356@code{nntp} will never split requests. The default is 5.
14357
14358@item nntp-xref-number-is-evil
14359@vindex nntp-xref-number-is-evil
14360When Gnus refers to an article having the @code{Message-ID} that a user
14361specifies or having the @code{Message-ID} of the parent article of the
14362current one (@pxref{Finding the Parent}), Gnus sends a @code{HEAD}
14363command to the @acronym{NNTP} server to know where it is, and the server
14364returns the data containing the pairs of a group and an article number
14365in the @code{Xref} header. Gnus normally uses the article number to
14366refer to the article if the data shows that that article is in the
14367current group, while it uses the @code{Message-ID} otherwise. However,
14368some news servers, e.g., ones running Diablo, run multiple engines
14369having the same articles but article numbers are not kept synchronized
14370between them. In that case, the article number that appears in the
14371@code{Xref} header varies by which engine is chosen, so you cannot refer
14372to the parent article that is in the current group, for instance. If
14373you connect to such a server, set this variable to a non-@code{nil}
14374value, and Gnus never uses article numbers. For example:
14375
14376@lisp
14377(setq gnus-select-method
14378 '(nntp "newszilla"
14379 (nntp-address "newszilla.example.com")
14380 (nntp-xref-number-is-evil t)
14381 @dots{}))
14382@end lisp
14383
14384The default value of this server variable is @code{nil}.
14385
14386@item nntp-prepare-server-hook
14387@vindex nntp-prepare-server-hook
14388A hook run before attempting to connect to an @acronym{NNTP} server.
14389
14390@item nntp-record-commands
14391@vindex nntp-record-commands
14392If non-@code{nil}, @code{nntp} will log all commands it sends to the
14393@acronym{NNTP} server (along with a timestamp) in the @samp{*nntp-log*}
14394buffer. This is useful if you are debugging a Gnus/@acronym{NNTP} connection
14395that doesn't seem to work.
14396
14397@item nntp-open-connection-function
14398@vindex nntp-open-connection-function
14399It is possible to customize how the connection to the nntp server will
14400be opened. If you specify an @code{nntp-open-connection-function}
14401parameter, Gnus will use that function to establish the connection.
01c52d31
MB
14402Seven pre-made functions are supplied. These functions can be grouped
14403in two categories: direct connection functions (four pre-made), and
14404indirect ones (three pre-made).
4009494e
GM
14405
14406@item nntp-never-echoes-commands
14407@vindex nntp-never-echoes-commands
14408Non-@code{nil} means the nntp server never echoes commands. It is
14409reported that some nntps server doesn't echo commands. So, you may want
14410to set this to non-@code{nil} in the method for such a server setting
14411@code{nntp-open-connection-function} to @code{nntp-open-ssl-stream} for
14412example. The default value is @code{nil}. Note that the
14413@code{nntp-open-connection-functions-never-echo-commands} variable
14414overrides the @code{nil} value of this variable.
14415
14416@item nntp-open-connection-functions-never-echo-commands
14417@vindex nntp-open-connection-functions-never-echo-commands
14418List of functions that never echo commands. Add or set a function which
14419you set to @code{nntp-open-connection-function} to this list if it does
14420not echo commands. Note that a non-@code{nil} value of the
14421@code{nntp-never-echoes-commands} variable overrides this variable. The
14422default value is @code{(nntp-open-network-stream)}.
14423
14424@item nntp-prepare-post-hook
14425@vindex nntp-prepare-post-hook
14426A hook run just before posting an article. If there is no
14427@code{Message-ID} header in the article and the news server provides the
14428recommended ID, it will be added to the article before running this
14429hook. It is useful to make @code{Cancel-Lock} headers even if you
14430inhibit Gnus to add a @code{Message-ID} header, you could say:
14431
14432@lisp
14433(add-hook 'nntp-prepare-post-hook 'canlock-insert-header)
14434@end lisp
14435
14436Note that not all servers support the recommended ID. This works for
14437INN versions 2.3.0 and later, for instance.
14438
14439@end table
14440
14441@menu
14442* Direct Functions:: Connecting directly to the server.
14443* Indirect Functions:: Connecting indirectly to the server.
14444* Common Variables:: Understood by several connection functions.
01c52d31 14445* NNTP marks:: Storing marks for @acronym{NNTP} servers.
4009494e
GM
14446@end menu
14447
14448
14449@node Direct Functions
14450@subsubsection Direct Functions
14451@cindex direct connection functions
14452
14453These functions are called direct because they open a direct connection
14454between your machine and the @acronym{NNTP} server. The behavior of these
14455functions is also affected by commonly understood variables
14456(@pxref{Common Variables}).
14457
14458@table @code
14459@findex nntp-open-network-stream
14460@item nntp-open-network-stream
14461This is the default, and simply connects to some port or other on the
14462remote system.
14463
14464@findex nntp-open-tls-stream
14465@item nntp-open-tls-stream
14466Opens a connection to a server over a @dfn{secure} channel. To use
14467this you must have @uref{http://www.gnu.org/software/gnutls/, GNUTLS}
14468installed. You then define a server as follows:
14469
14470@lisp
14471;; @r{"nntps" is port 563 and is predefined in our @file{/etc/services}}
14472;; @r{however, @samp{gnutls-cli -p} doesn't like named ports.}
14473;;
14474(nntp "snews.bar.com"
14475 (nntp-open-connection-function nntp-open-tls-stream)
83828b06 14476 (nntp-port-number 563)
4009494e
GM
14477 (nntp-address "snews.bar.com"))
14478@end lisp
14479
14480@findex nntp-open-ssl-stream
14481@item nntp-open-ssl-stream
14482Opens a connection to a server over a @dfn{secure} channel. To use
14483this you must have @uref{http://www.openssl.org, OpenSSL} or
14484@uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL, SSLeay} installed. You
14485then define a server as follows:
14486
14487@lisp
14488;; @r{"snews" is port 563 and is predefined in our @file{/etc/services}}
14489;; @r{however, @samp{openssl s_client -port} doesn't like named ports.}
14490;;
14491(nntp "snews.bar.com"
14492 (nntp-open-connection-function nntp-open-ssl-stream)
14493 (nntp-port-number 563)
14494 (nntp-address "snews.bar.com"))
14495@end lisp
14496
990e2c2f
SM
14497@findex nntp-open-netcat-stream
14498@item nntp-open-netcat-stream
31fe2b00
SM
14499Opens a connection to an @acronym{NNTP} server using the @code{netcat}
14500program. You might wonder why this function exists, since we have
14501the default @code{nntp-open-network-stream} which would do the job. (One
4009494e
GM
14502of) the reason(s) is that if you are behind a firewall but have direct
14503connections to the outside world thanks to a command wrapper like
14504@code{runsocks}, you can use it like this:
14505
14506@lisp
14507(nntp "socksified"
14508 (nntp-pre-command "runsocks")
990e2c2f 14509 (nntp-open-connection-function nntp-open-netcat-stream)
4009494e
GM
14510 (nntp-address "the.news.server"))
14511@end lisp
14512
14513With the default method, you would need to wrap your whole Emacs
14514session, which is not a good idea.
31fe2b00
SM
14515
14516@findex nntp-open-telnet-stream
14517@item nntp-open-telnet-stream
990e2c2f 14518Like @code{nntp-open-netcat-stream}, but uses @code{telnet} rather than
31fe2b00
SM
14519@code{netcat}. @code{telnet} is a bit less robust because of things
14520like line-end-conversion, but sometimes netcat is simply
14521not available. The previous example would turn into:
14522
14523@lisp
14524(nntp "socksified"
14525 (nntp-pre-command "runsocks")
14526 (nntp-open-connection-function nntp-open-telnet-stream)
14527 (nntp-address "the.news.server")
14528 (nntp-end-of-line "\n"))
14529@end lisp
4009494e
GM
14530@end table
14531
14532
14533@node Indirect Functions
14534@subsubsection Indirect Functions
14535@cindex indirect connection functions
14536
14537These functions are called indirect because they connect to an
14538intermediate host before actually connecting to the @acronym{NNTP} server.
14539All of these functions and related variables are also said to belong to
14540the ``via'' family of connection: they're all prefixed with ``via'' to make
14541things cleaner. The behavior of these functions is also affected by
14542commonly understood variables (@pxref{Common Variables}).
14543
14544@table @code
31fe2b00
SM
14545@item nntp-open-via-rlogin-and-netcat
14546@findex nntp-open-via-rlogin-and-netcat
14547Does an @samp{rlogin} on a remote system, and then uses @code{netcat} to connect
4009494e
GM
14548to the real @acronym{NNTP} server from there. This is useful for instance if
14549you need to connect to a firewall machine first.
14550
31fe2b00 14551@code{nntp-open-via-rlogin-and-netcat}-specific variables:
4009494e
GM
14552
14553@table @code
14554@item nntp-via-rlogin-command
14555@vindex nntp-via-rlogin-command
14556Command used to log in on the intermediate host. The default is
14557@samp{rsh}, but @samp{ssh} is a popular alternative.
14558
14559@item nntp-via-rlogin-command-switches
14560@vindex nntp-via-rlogin-command-switches
14561List of strings to be used as the switches to
14562@code{nntp-via-rlogin-command}. The default is @code{nil}. If you use
14563@samp{ssh} for @code{nntp-via-rlogin-command}, you may set this to
31fe2b00 14564@samp{("-C")} in order to compress all data connections.
4009494e
GM
14565@end table
14566
31fe2b00
SM
14567@item nntp-open-via-rlogin-and-telnet
14568@findex nntp-open-via-rlogin-and-telnet
14569Does essentially the same, but uses @code{telnet} instead of @samp{netcat}
01c52d31 14570to connect to the real @acronym{NNTP} server from the intermediate host.
31fe2b00 14571@code{telnet} is a bit less robust because of things like
867d4bb3 14572line-end-conversion, but sometimes @code{netcat} is simply not available.
01c52d31 14573
31fe2b00 14574@code{nntp-open-via-rlogin-and-telnet}-specific variables:
01c52d31
MB
14575
14576@table @code
31fe2b00
SM
14577@item nntp-telnet-command
14578@vindex nntp-telnet-command
01c52d31 14579Command used to connect to the real @acronym{NNTP} server from the
fbcbb58c 14580intermediate host. The default is @samp{telnet}.
01c52d31 14581
31fe2b00
SM
14582@item nntp-telnet-switches
14583@vindex nntp-telnet-switches
01c52d31 14584List of strings to be used as the switches to the
31fe2b00 14585@code{nntp-telnet-command} command. The default is @code{("-8")}.
01c52d31
MB
14586
14587@item nntp-via-rlogin-command
14588@vindex nntp-via-rlogin-command
14589Command used to log in on the intermediate host. The default is
14590@samp{rsh}, but @samp{ssh} is a popular alternative.
14591
14592@item nntp-via-rlogin-command-switches
14593@vindex nntp-via-rlogin-command-switches
14594List of strings to be used as the switches to
31fe2b00
SM
14595@code{nntp-via-rlogin-command}. If you use @samp{ssh}, you may need to set
14596this to @samp{("-t" "-e" "none")} or @samp{("-C" "-t" "-e" "none")} if
14597the telnet command requires a pseudo-tty allocation on an intermediate
14598host. The default is @code{nil}.
01c52d31
MB
14599@end table
14600
31fe2b00
SM
14601Note that you may want to change the value for @code{nntp-end-of-line}
14602to @samp{\n} (@pxref{Common Variables}).
14603
4009494e
GM
14604@item nntp-open-via-telnet-and-telnet
14605@findex nntp-open-via-telnet-and-telnet
14606Does essentially the same, but uses @samp{telnet} instead of
14607@samp{rlogin} to connect to the intermediate host.
14608
14609@code{nntp-open-via-telnet-and-telnet}-specific variables:
14610
14611@table @code
14612@item nntp-via-telnet-command
14613@vindex nntp-via-telnet-command
14614Command used to @code{telnet} the intermediate host. The default is
14615@samp{telnet}.
14616
14617@item nntp-via-telnet-switches
14618@vindex nntp-via-telnet-switches
14619List of strings to be used as the switches to the
14620@code{nntp-via-telnet-command} command. The default is @samp{("-8")}.
14621
14622@item nntp-via-user-password
14623@vindex nntp-via-user-password
14624Password to use when logging in on the intermediate host.
14625
14626@item nntp-via-envuser
14627@vindex nntp-via-envuser
14628If non-@code{nil}, the intermediate @code{telnet} session (client and
14629server both) will support the @code{ENVIRON} option and not prompt for
14630login name. This works for Solaris @code{telnet}, for instance.
14631
14632@item nntp-via-shell-prompt
14633@vindex nntp-via-shell-prompt
14634Regexp matching the shell prompt on the intermediate host. The default
14635is @samp{bash\\|\$ *\r?$\\|> *\r?}.
14636
14637@end table
14638
01c52d31
MB
14639Note that you may want to change the value for @code{nntp-end-of-line}
14640to @samp{\n} (@pxref{Common Variables}).
4009494e
GM
14641@end table
14642
14643
14644Here are some additional variables that are understood by all the above
14645functions:
14646
14647@table @code
14648
14649@item nntp-via-user-name
14650@vindex nntp-via-user-name
14651User name to use when connecting to the intermediate host.
14652
14653@item nntp-via-address
14654@vindex nntp-via-address
14655Address of the intermediate host to connect to.
14656
14657@end table
14658
14659
14660@node Common Variables
14661@subsubsection Common Variables
14662
14663The following variables affect the behavior of all, or several of the
14664pre-made connection functions. When not specified, all functions are
14665affected (the values of the following variables will be used as the
14666default if each virtual @code{nntp} server doesn't specify those server
14667variables individually).
14668
14669@table @code
14670
14671@item nntp-pre-command
14672@vindex nntp-pre-command
14673A command wrapper to use when connecting through a non native
14674connection function (all except @code{nntp-open-network-stream},
14675@code{nntp-open-tls-stream}, and @code{nntp-open-ssl-stream}). This is
14676where you would put a @samp{SOCKS} wrapper for instance.
14677
14678@item nntp-address
14679@vindex nntp-address
14680The address of the @acronym{NNTP} server.
14681
14682@item nntp-port-number
14683@vindex nntp-port-number
14684Port number to connect to the @acronym{NNTP} server. The default is
14685@samp{nntp}. If you use @acronym{NNTP} over
14686@acronym{TLS}/@acronym{SSL}, you may want to use integer ports rather
14687than named ports (i.e, use @samp{563} instead of @samp{snews} or
14688@samp{nntps}), because external @acronym{TLS}/@acronym{SSL} tools may
14689not work with named ports.
14690
14691@item nntp-end-of-line
14692@vindex nntp-end-of-line
14693String to use as end-of-line marker when talking to the @acronym{NNTP}
14694server. This is @samp{\r\n} by default, but should be @samp{\n} when
01c52d31 14695using a non native telnet connection function.
4009494e 14696
990e2c2f
SM
14697@item nntp-netcat-command
14698@vindex nntp-netcat-command
4009494e 14699Command to use when connecting to the @acronym{NNTP} server through
31fe2b00 14700@samp{netcat}. This is @emph{not} for an intermediate host. This is
4009494e 14701just for the real @acronym{NNTP} server. The default is
31fe2b00 14702@samp{nc}.
4009494e 14703
990e2c2f
SM
14704@item nntp-netcat-switches
14705@vindex nntp-netcat-switches
14706A list of switches to pass to @code{nntp-netcat-command}. The default
31fe2b00 14707is @samp{()}.
4009494e
GM
14708
14709@end table
14710
01c52d31
MB
14711@node NNTP marks
14712@subsubsection NNTP marks
14713@cindex storing NNTP marks
14714
14715Gnus stores marks (@pxref{Marking Articles}) for @acronym{NNTP}
14716servers in marks files. A marks file records what marks you have set
14717in a group and each file is specific to the corresponding server.
14718Marks files are stored in @file{~/News/marks}
14719(@code{nntp-marks-directory}) under a classic hierarchy resembling
14720that of a news server, for example marks for the group
14721@samp{gmane.discuss} on the news.gmane.org server will be stored in
14722the file @file{~/News/marks/news.gmane.org/gmane/discuss/.marks}.
14723
14724Marks files are useful because you can copy the @file{~/News/marks}
14725directory (using rsync, scp or whatever) to another Gnus installation,
14726and it will realize what articles you have read and marked. The data
14727in @file{~/News/marks} has priority over the same data in
14728@file{~/.newsrc.eld}.
14729
14730Note that marks files are very much server-specific: Gnus remembers
14731the article numbers so if you don't use the same servers on both
14732installations things are most likely to break (most @acronym{NNTP}
14733servers do not use the same article numbers as any other server).
14734However, if you use servers A, B, C on one installation and servers A,
14735D, E on the other, you can sync the marks files for A and then you'll
14736get synchronization for that server between the two installations.
14737
14738Using @acronym{NNTP} marks can possibly incur a performance penalty so
14739if Gnus feels sluggish, try setting the @code{nntp-marks-is-evil}
14740variable to @code{t}. Marks will then be stored in @file{~/.newsrc.eld}.
14741
14742Related variables:
14743
14744@table @code
14745
14746@item nntp-marks-is-evil
14747@vindex nntp-marks-is-evil
14748If non-@code{nil}, this back end will ignore any marks files. The
14749default is @code{nil}.
14750
14751@item nntp-marks-directory
14752@vindex nntp-marks-directory
14753The directory where marks for nntp groups will be stored.
14754
14755@end table
14756
4009494e
GM
14757
14758@node News Spool
14759@subsection News Spool
14760@cindex nnspool
14761@cindex news spool
14762
14763Subscribing to a foreign group from the local spool is extremely easy,
14764and might be useful, for instance, to speed up reading groups that
14765contain very big articles---@samp{alt.binaries.pictures.furniture}, for
14766instance.
14767
14768Anyway, you just specify @code{nnspool} as the method and @code{""} (or
14769anything else) as the address.
14770
14771If you have access to a local spool, you should probably use that as the
14772native select method (@pxref{Finding the News}). It is normally faster
14773than using an @code{nntp} select method, but might not be. It depends.
14774You just have to try to find out what's best at your site.
14775
14776@table @code
14777
14778@item nnspool-inews-program
14779@vindex nnspool-inews-program
14780Program used to post an article.
14781
14782@item nnspool-inews-switches
14783@vindex nnspool-inews-switches
14784Parameters given to the inews program when posting an article.
14785
14786@item nnspool-spool-directory
14787@vindex nnspool-spool-directory
14788Where @code{nnspool} looks for the articles. This is normally
14789@file{/usr/spool/news/}.
14790
14791@item nnspool-nov-directory
14792@vindex nnspool-nov-directory
14793Where @code{nnspool} will look for @acronym{NOV} files. This is normally@*
14794@file{/usr/spool/news/over.view/}.
14795
14796@item nnspool-lib-dir
14797@vindex nnspool-lib-dir
14798Where the news lib dir is (@file{/usr/lib/news/} by default).
14799
14800@item nnspool-active-file
14801@vindex nnspool-active-file
14802The name of the active file.
14803
14804@item nnspool-newsgroups-file
14805@vindex nnspool-newsgroups-file
14806The name of the group descriptions file.
14807
14808@item nnspool-history-file
14809@vindex nnspool-history-file
14810The name of the news history file.
14811
14812@item nnspool-active-times-file
14813@vindex nnspool-active-times-file
14814The name of the active date file.
14815
14816@item nnspool-nov-is-evil
14817@vindex nnspool-nov-is-evil
14818If non-@code{nil}, @code{nnspool} won't try to use any @acronym{NOV} files
14819that it finds.
14820
14821@item nnspool-sift-nov-with-sed
14822@vindex nnspool-sift-nov-with-sed
14823@cindex sed
14824If non-@code{nil}, which is the default, use @code{sed} to get the
14825relevant portion from the overview file. If @code{nil},
14826@code{nnspool} will load the entire file into a buffer and process it
14827there.
14828
14829@end table
14830
14831
14832@node Getting Mail
14833@section Getting Mail
14834@cindex reading mail
14835@cindex mail
14836
14837Reading mail with a newsreader---isn't that just plain WeIrD? But of
14838course.
14839
14840@menu
14841* Mail in a Newsreader:: Important introductory notes.
14842* Getting Started Reading Mail:: A simple cookbook example.
14843* Splitting Mail:: How to create mail groups.
14844* Mail Sources:: How to tell Gnus where to get mail from.
14845* Mail Back End Variables:: Variables for customizing mail handling.
14846* Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.
14847* Group Mail Splitting:: Use group customize to drive mail splitting.
14848* Incorporating Old Mail:: What about the old mail you have?
14849* Expiring Mail:: Getting rid of unwanted mail.
14850* Washing Mail:: Removing cruft from the mail you get.
14851* Duplicates:: Dealing with duplicated mail.
14852* Not Reading Mail:: Using mail back ends for reading other files.
14853* Choosing a Mail Back End:: Gnus can read a variety of mail formats.
14854@end menu
14855
14856
14857@node Mail in a Newsreader
14858@subsection Mail in a Newsreader
14859
14860If you are used to traditional mail readers, but have decided to switch
14861to reading mail with Gnus, you may find yourself experiencing something
14862of a culture shock.
14863
14864Gnus does not behave like traditional mail readers. If you want to make
14865it behave that way, you can, but it's an uphill battle.
14866
14867Gnus, by default, handles all its groups using the same approach. This
14868approach is very newsreaderly---you enter a group, see the new/unread
14869messages, and when you read the messages, they get marked as read, and
14870you don't see them any more. (Unless you explicitly ask for them.)
14871
14872In particular, you do not do anything explicitly to delete messages.
14873
14874Does this mean that all the messages that have been marked as read are
14875deleted? How awful!
14876
14877But, no, it means that old messages are @dfn{expired} according to some
14878scheme or other. For news messages, the expire process is controlled by
14879the news administrator; for mail, the expire process is controlled by
14880you. The expire process for mail is covered in depth in @ref{Expiring
14881Mail}.
14882
14883What many Gnus users find, after using it a while for both news and
14884mail, is that the transport mechanism has very little to do with how
14885they want to treat a message.
14886
14887Many people subscribe to several mailing lists. These are transported
14888via @acronym{SMTP}, and are therefore mail. But we might go for weeks without
14889answering, or even reading these messages very carefully. We may not
14890need to save them because if we should need to read one again, they are
14891archived somewhere else.
14892
14893Some people have local news groups which have only a handful of readers.
14894These are transported via @acronym{NNTP}, and are therefore news. But we may need
14895to read and answer a large fraction of the messages very carefully in
14896order to do our work. And there may not be an archive, so we may need
14897to save the interesting messages the same way we would personal mail.
14898
14899The important distinction turns out to be not the transport mechanism,
14900but other factors such as how interested we are in the subject matter,
14901or how easy it is to retrieve the message if we need to read it again.
14902
14903Gnus provides many options for sorting mail into ``groups'' which behave
14904like newsgroups, and for treating each group (whether mail or news)
14905differently.
14906
14907Some users never get comfortable using the Gnus (ahem) paradigm and wish
14908that Gnus should grow up and be a male, er, mail reader. It is possible
14909to whip Gnus into a more mailreaderly being, but, as said before, it's
14910not easy. People who prefer proper mail readers should try @sc{vm}
14911instead, which is an excellent, and proper, mail reader.
14912
14913I don't mean to scare anybody off, but I want to make it clear that you
14914may be required to learn a new way of thinking about messages. After
14915you've been subjected to The Gnus Way, you will come to love it. I can
14916guarantee it. (At least the guy who sold me the Emacs Subliminal
14917Brain-Washing Functions that I've put into Gnus did guarantee it. You
14918Will Be Assimilated. You Love Gnus. You Love The Gnus Mail Way.
14919You Do.)
14920
14921
14922@node Getting Started Reading Mail
14923@subsection Getting Started Reading Mail
14924
14925It's quite easy to use Gnus to read your new mail. You just plonk the
14926mail back end of your choice into @code{gnus-secondary-select-methods},
14927and things will happen automatically.
14928
14929For instance, if you want to use @code{nnml} (which is a ``one file per
14930mail'' back end), you could put the following in your @file{~/.gnus.el} file:
14931
14932@lisp
14933(setq gnus-secondary-select-methods '((nnml "")))
14934@end lisp
14935
14936Now, the next time you start Gnus, this back end will be queried for new
14937articles, and it will move all the messages in your spool file to its
14938directory, which is @file{~/Mail/} by default. The new group that will
14939be created (@samp{mail.misc}) will be subscribed, and you can read it
14940like any other group.
14941
14942You will probably want to split the mail into several groups, though:
14943
14944@lisp
14945(setq nnmail-split-methods
14946 '(("junk" "^From:.*Lars Ingebrigtsen")
14947 ("crazy" "^Subject:.*die\\|^Organization:.*flabby")
14948 ("other" "")))
14949@end lisp
14950
14951This will result in three new @code{nnml} mail groups being created:
14952@samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}. All the
14953mail that doesn't fit into the first two groups will be placed in the
14954last group.
14955
14956This should be sufficient for reading mail with Gnus. You might want to
14957give the other sections in this part of the manual a perusal, though.
14958Especially @pxref{Choosing a Mail Back End} and @pxref{Expiring Mail}.
14959
14960
14961@node Splitting Mail
14962@subsection Splitting Mail
14963@cindex splitting mail
14964@cindex mail splitting
14965@cindex mail filtering (splitting)
14966
14967@vindex nnmail-split-methods
14968The @code{nnmail-split-methods} variable says how the incoming mail is
14969to be split into groups.
14970
14971@lisp
14972(setq nnmail-split-methods
14973 '(("mail.junk" "^From:.*Lars Ingebrigtsen")
14974 ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby")
14975 ("mail.other" "")))
14976@end lisp
14977
14978This variable is a list of lists, where the first element of each of
14979these lists is the name of the mail group (they do not have to be called
14980something beginning with @samp{mail}, by the way), and the second
14981element is a regular expression used on the header of each mail to
14982determine if it belongs in this mail group. The first string may
14983contain @samp{\\1} forms, like the ones used by @code{replace-match} to
14984insert sub-expressions from the matched text. For instance:
14985
14986@lisp
14987("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com")
14988@end lisp
14989
14990@noindent
14991In that case, @code{nnmail-split-lowercase-expanded} controls whether
14992the inserted text should be made lowercase. @xref{Fancy Mail Splitting}.
14993
14994The second element can also be a function. In that case, it will be
14995called narrowed to the headers with the first element of the rule as the
14996argument. It should return a non-@code{nil} value if it thinks that the
14997mail belongs in that group.
14998
14999@cindex @samp{bogus} group
15000The last of these groups should always be a general one, and the regular
15001expression should @emph{always} be @samp{""} so that it matches any mails
15002that haven't been matched by any of the other regexps. (These rules are
15003processed from the beginning of the alist toward the end. The first rule
15004to make a match will ``win'', unless you have crossposting enabled. In
15005that case, all matching rules will ``win''.) If no rule matched, the mail
15006will end up in the @samp{bogus} group. When new groups are created by
15007splitting mail, you may want to run @code{gnus-group-find-new-groups} to
15008see the new groups. This also applies to the @samp{bogus} group.
15009
15010If you like to tinker with this yourself, you can set this variable to a
15011function of your choice. This function will be called without any
15012arguments in a buffer narrowed to the headers of an incoming mail
15013message. The function should return a list of group names that it
15014thinks should carry this mail message.
15015
15016Note that the mail back ends are free to maul the poor, innocent,
15017incoming headers all they want to. They all add @code{Lines} headers;
15018some add @code{X-Gnus-Group} headers; most rename the Unix mbox
15019@code{From<SPACE>} line to something else.
15020
15021@vindex nnmail-crosspost
15022The mail back ends all support cross-posting. If several regexps match,
15023the mail will be ``cross-posted'' to all those groups.
15024@code{nnmail-crosspost} says whether to use this mechanism or not. Note
15025that no articles are crossposted to the general (@samp{""}) group.
15026
15027@vindex nnmail-crosspost-link-function
15028@cindex crosspost
15029@cindex links
15030@code{nnmh} and @code{nnml} makes crossposts by creating hard links to
15031the crossposted articles. However, not all file systems support hard
15032links. If that's the case for you, set
15033@code{nnmail-crosspost-link-function} to @code{copy-file}. (This
15034variable is @code{add-name-to-file} by default.)
15035
15036@kindex M-x nnmail-split-history
15037@findex nnmail-split-history
15038If you wish to see where the previous mail split put the messages, you
15039can use the @kbd{M-x nnmail-split-history} command. If you wish to see
15040where re-spooling messages would put the messages, you can use
15041@code{gnus-summary-respool-trace} and related commands (@pxref{Mail
15042Group Commands}).
15043
15044@vindex nnmail-split-header-length-limit
15045Header lines longer than the value of
15046@code{nnmail-split-header-length-limit} are excluded from the split
15047function.
15048
15049@vindex nnmail-mail-splitting-decodes
15050@vindex nnmail-mail-splitting-charset
15051By default, splitting does not decode headers, so you can not match on
15052non-@acronym{ASCII} strings. But it is useful if you want to match
15053articles based on the raw header data. To enable it, set the
15054@code{nnmail-mail-splitting-decodes} variable to a non-@code{nil} value.
15055In addition, the value of the @code{nnmail-mail-splitting-charset}
15056variable is used for decoding non-@acronym{MIME} encoded string when
15057@code{nnmail-mail-splitting-decodes} is non-@code{nil}. The default
15058value is @code{nil} which means not to decode non-@acronym{MIME} encoded
15059string. A suitable value for you will be @code{undecided} or be the
15060charset used normally in mails you are interested in.
15061
15062@vindex nnmail-resplit-incoming
15063By default, splitting is performed on all incoming messages. If you
15064specify a @code{directory} entry for the variable @code{mail-sources}
15065(@pxref{Mail Source Specifiers}), however, then splitting does
15066@emph{not} happen by default. You can set the variable
15067@code{nnmail-resplit-incoming} to a non-@code{nil} value to make
15068splitting happen even in this case. (This variable has no effect on
15069other kinds of entries.)
15070
15071Gnus gives you all the opportunity you could possibly want for shooting
15072yourself in the foot. Let's say you create a group that will contain
15073all the mail you get from your boss. And then you accidentally
15074unsubscribe from the group. Gnus will still put all the mail from your
15075boss in the unsubscribed group, and so, when your boss mails you ``Have
15076that report ready by Monday or you're fired!'', you'll never see it and,
15077come Tuesday, you'll still believe that you're gainfully employed while
15078you really should be out collecting empty bottles to save up for next
15079month's rent money.
15080
15081
15082@node Mail Sources
15083@subsection Mail Sources
15084
15085Mail can be gotten from many different sources---the mail spool, from
15086a @acronym{POP} mail server, from a procmail directory, or from a
15087maildir, for instance.
15088
15089@menu
15090* Mail Source Specifiers:: How to specify what a mail source is.
15091* Mail Source Customization:: Some variables that influence things.
15092* Fetching Mail:: Using the mail source specifiers.
15093@end menu
15094
15095
15096@node Mail Source Specifiers
15097@subsubsection Mail Source Specifiers
15098@cindex POP
15099@cindex mail server
15100@cindex procmail
15101@cindex mail spool
15102@cindex mail source
15103
15104You tell Gnus how to fetch mail by setting @code{mail-sources}
15105(@pxref{Fetching Mail}) to a @dfn{mail source specifier}.
15106
15107Here's an example:
15108
15109@lisp
15110(pop :server "pop3.mailserver.com" :user "myname")
15111@end lisp
15112
15113As can be observed, a mail source specifier is a list where the first
15114element is a @dfn{mail source type}, followed by an arbitrary number of
15115@dfn{keywords}. Keywords that are not explicitly specified are given
15116default values.
15117
a1da1e37
MB
15118The @code{mail-sources} is global for all mail groups. You can specify
15119an additional mail source for a particular group by including the
15120@code{group} mail specifier in @code{mail-sources}, and setting a
15121@code{mail-source} group parameter (@pxref{Group Parameters}) specifying
15122a single mail source. When this is used, @code{mail-sources} is
15123typically just @code{(group)}; the @code{mail-source} parameter for a
15124group might look like this:
15125
15126@lisp
15127(mail-source . (file :path "home/user/spools/foo.spool"))
15128@end lisp
15129
15130This means that the group's (and only this group's) messages will be
15131fetched from the spool file @samp{/user/spools/foo.spool}.
15132
4009494e
GM
15133The following mail source types are available:
15134
15135@table @code
15136@item file
15137Get mail from a single file; typically from the mail spool.
15138
15139Keywords:
15140
15141@table @code
15142@item :path
15143The file name. Defaults to the value of the @env{MAIL}
15144environment variable or the value of @code{rmail-spool-directory}
15145(usually something like @file{/usr/mail/spool/user-name}).
15146
15147@item :prescript
15148@itemx :postscript
15149Script run before/after fetching mail.
15150@end table
15151
15152An example file mail source:
15153
15154@lisp
15155(file :path "/usr/spool/mail/user-name")
15156@end lisp
15157
15158Or using the default file name:
15159
15160@lisp
15161(file)
15162@end lisp
15163
15164If the mail spool file is not located on the local machine, it's best
15165to use @acronym{POP} or @acronym{IMAP} or the like to fetch the mail.
15166You can not use ange-ftp file names here---it has no way to lock the
15167mail spool while moving the mail.
15168
15169If it's impossible to set up a proper server, you can use ssh instead.
15170
15171@lisp
15172(setq mail-sources
15173 '((file :prescript "ssh host bin/getmail >%t")))
15174@end lisp
15175
15176The @samp{getmail} script would look something like the following:
15177
15178@example
15179#!/bin/sh
15180# getmail - move mail from spool to stdout
15181# flu@@iki.fi
15182
15183MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail
15184TMP=$HOME/Mail/tmp
15185rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP
15186@end example
15187
15188Alter this script to fit the @samp{movemail} and temporary
15189file you want to use.
15190
15191
15192@item directory
15193@vindex nnmail-scan-directory-mail-source-once
15194Get mail from several files in a directory. This is typically used
15195when you have procmail split the incoming mail into several files.
15196That is, there is a one-to-one correspondence between files in that
15197directory and groups, so that mail from the file @file{foo.bar.spool}
15198will be put in the group @code{foo.bar}. (You can change the suffix
15199to be used instead of @code{.spool}.) Setting
15200@code{nnmail-scan-directory-mail-source-once} to non-@code{nil} forces
15201Gnus to scan the mail source only once. This is particularly useful
15202if you want to scan mail groups at a specified level.
15203
15204@vindex nnmail-resplit-incoming
15205There is also the variable @code{nnmail-resplit-incoming}, if you set
15206that to a non-@code{nil} value, then the normal splitting process is
15207applied to all the files from the directory, @ref{Splitting Mail}.
15208
15209Keywords:
15210
15211@table @code
15212@item :path
15213The name of the directory where the files are. There is no default
15214value.
15215
15216@item :suffix
15217Only files ending with this suffix are used. The default is
15218@samp{.spool}.
15219
15220@item :predicate
15221Only files that have this predicate return non-@code{nil} are returned.
15222The default is @code{identity}. This is used as an additional
15223filter---only files that have the right suffix @emph{and} satisfy this
15224predicate are considered.
15225
15226@item :prescript
15227@itemx :postscript
15228Script run before/after fetching mail.
15229
15230@end table
15231
15232An example directory mail source:
15233
15234@lisp
15235(directory :path "/home/user-name/procmail-dir/"
15236 :suffix ".prcml")
15237@end lisp
15238
15239@item pop
15240Get mail from a @acronym{POP} server.
15241
15242Keywords:
15243
15244@table @code
15245@item :server
15246The name of the @acronym{POP} server. The default is taken from the
15247@env{MAILHOST} environment variable.
15248
15249@item :port
15250The port number of the @acronym{POP} server. This can be a number (eg,
15251@samp{:port 1234}) or a string (eg, @samp{:port "pop3"}). If it is a
15252string, it should be a service name as listed in @file{/etc/services} on
15253Unix systems. The default is @samp{"pop3"}. On some systems you might
15254need to specify it as @samp{"pop-3"} instead.
15255
15256@item :user
15257The user name to give to the @acronym{POP} server. The default is the login
15258name.
15259
15260@item :password
15261The password to give to the @acronym{POP} server. If not specified,
15262the user is prompted.
15263
15264@item :program
15265The program to use to fetch mail from the @acronym{POP} server. This
15266should be a @code{format}-like string. Here's an example:
15267
15268@example
15269fetchmail %u@@%s -P %p %t
15270@end example
15271
15272The valid format specifier characters are:
15273
15274@table @samp
15275@item t
15276The name of the file the mail is to be moved to. This must always be
15277included in this string.
15278
15279@item s
15280The name of the server.
15281
15282@item P
15283The port number of the server.
15284
15285@item u
15286The user name to use.
15287
15288@item p
15289The password to use.
15290@end table
15291
15292The values used for these specs are taken from the values you give the
15293corresponding keywords.
15294
15295@item :prescript
15296A script to be run before fetching the mail. The syntax is the same as
15297the @code{:program} keyword. This can also be a function to be run.
15298
15299@item :postscript
15300A script to be run after fetching the mail. The syntax is the same as
15301the @code{:program} keyword. This can also be a function to be run.
15302
15303@item :function
15304The function to use to fetch mail from the @acronym{POP} server. The
15305function is called with one parameter---the name of the file where the
15306mail should be moved to.
15307
15308@item :authentication
15309This can be either the symbol @code{password} or the symbol @code{apop}
15310and says what authentication scheme to use. The default is
15311@code{password}.
15312
15313@end table
15314
15315@vindex pop3-movemail
15316@vindex pop3-leave-mail-on-server
15317If the @code{:program} and @code{:function} keywords aren't specified,
15318@code{pop3-movemail} will be used. If @code{pop3-leave-mail-on-server}
15319is non-@code{nil} the mail is to be left on the @acronym{POP} server
15320after fetching when using @code{pop3-movemail}. Note that POP servers
15321maintain no state information between sessions, so what the client
15322believes is there and what is actually there may not match up. If they
15323do not, then you may get duplicate mails or the whole thing can fall
15324apart and leave you with a corrupt mailbox.
15325
15326Here are some examples for getting mail from a @acronym{POP} server.
15327Fetch from the default @acronym{POP} server, using the default user
15328name, and default fetcher:
15329
15330@lisp
15331(pop)
15332@end lisp
15333
15334Fetch from a named server with a named user and password:
15335
15336@lisp
15337(pop :server "my.pop.server"
15338 :user "user-name" :password "secret")
15339@end lisp
15340
15341Use @samp{movemail} to move the mail:
15342
15343@lisp
15344(pop :program "movemail po:%u %t %p")
15345@end lisp
15346
15347@item maildir
15348Get mail from a maildir. This is a type of mailbox that is supported by
15349at least qmail and postfix, where each file in a special directory
15350contains exactly one mail.
15351
15352Keywords:
15353
15354@table @code
15355@item :path
15356The name of the directory where the mails are stored. The default is
15357taken from the @env{MAILDIR} environment variable or
15358@file{~/Maildir/}.
15359@item :subdirs
15360The subdirectories of the Maildir. The default is
15361@samp{("new" "cur")}.
15362
15363@c If you sometimes look at your mail through a pop3 daemon before fetching
15364@c them with Gnus, you may also have to fetch your mails from the
15365@c @code{cur} directory inside the maildir, like in the first example
15366@c below.
15367
15368You can also get mails from remote hosts (because maildirs don't suffer
15369from locking problems).
15370
15371@end table
15372
15373Two example maildir mail sources:
15374
15375@lisp
15376(maildir :path "/home/user-name/Maildir/"
15377 :subdirs ("cur" "new"))
15378@end lisp
15379
15380@lisp
15381(maildir :path "/user@@remotehost.org:~/Maildir/"
15382 :subdirs ("new"))
15383@end lisp
15384
15385@item imap
15386Get mail from a @acronym{IMAP} server. If you don't want to use
15387@acronym{IMAP} as intended, as a network mail reading protocol (ie
15388with nnimap), for some reason or other, Gnus let you treat it similar
15389to a @acronym{POP} server and fetches articles from a given
15390@acronym{IMAP} mailbox. @xref{IMAP}, for more information.
15391
15392Note that for the Kerberos, GSSAPI, @acronym{TLS}/@acronym{SSL} and STARTTLS support you
15393may need external programs and libraries, @xref{IMAP}.
15394
15395Keywords:
15396
15397@table @code
15398@item :server
15399The name of the @acronym{IMAP} server. The default is taken from the
15400@env{MAILHOST} environment variable.
15401
15402@item :port
15403The port number of the @acronym{IMAP} server. The default is @samp{143}, or
15404@samp{993} for @acronym{TLS}/@acronym{SSL} connections.
15405
15406@item :user
15407The user name to give to the @acronym{IMAP} server. The default is the login
15408name.
15409
15410@item :password
15411The password to give to the @acronym{IMAP} server. If not specified, the user is
15412prompted.
15413
15414@item :stream
15415What stream to use for connecting to the server, this is one of the
15416symbols in @code{imap-stream-alist}. Right now, this means
15417@samp{gssapi}, @samp{kerberos4}, @samp{starttls}, @samp{tls},
15418@samp{ssl}, @samp{shell} or the default @samp{network}.
15419
15420@item :authentication
15421Which authenticator to use for authenticating to the server, this is
15422one of the symbols in @code{imap-authenticator-alist}. Right now,
15423this means @samp{gssapi}, @samp{kerberos4}, @samp{digest-md5},
15424@samp{cram-md5}, @samp{anonymous} or the default @samp{login}.
15425
15426@item :program
15427When using the `shell' :stream, the contents of this variable is
15428mapped into the @code{imap-shell-program} variable. This should be a
15429@code{format}-like string (or list of strings). Here's an example:
15430
15431@example
15432ssh %s imapd
15433@end example
15434
01c52d31
MB
15435Make sure nothing is interfering with the output of the program, e.g.,
15436don't forget to redirect the error output to the void. The valid format
15437specifier characters are:
4009494e
GM
15438
15439@table @samp
15440@item s
15441The name of the server.
15442
15443@item l
15444User name from @code{imap-default-user}.
15445
15446@item p
15447The port number of the server.
15448@end table
15449
15450The values used for these specs are taken from the values you give the
15451corresponding keywords.
15452
15453@item :mailbox
15454The name of the mailbox to get mail from. The default is @samp{INBOX}
d55fe5bb 15455which normally is the mailbox which receives incoming mail.
4009494e
GM
15456
15457@item :predicate
15458The predicate used to find articles to fetch. The default, @samp{UNSEEN
15459UNDELETED}, is probably the best choice for most people, but if you
15460sometimes peek in your mailbox with a @acronym{IMAP} client and mark some
15461articles as read (or; SEEN) you might want to set this to @samp{1:*}.
15462Then all articles in the mailbox is fetched, no matter what. For a
15463complete list of predicates, see RFC 2060 section 6.4.4.
15464
15465@item :fetchflag
15466How to flag fetched articles on the server, the default @samp{\Deleted}
15467will mark them as deleted, an alternative would be @samp{\Seen} which
15468would simply mark them as read. These are the two most likely choices,
15469but more flags are defined in RFC 2060 section 2.3.2.
15470
15471@item :dontexpunge
15472If non-@code{nil}, don't remove all articles marked as deleted in the
15473mailbox after finishing the fetch.
15474
15475@end table
15476
15477An example @acronym{IMAP} mail source:
15478
15479@lisp
15480(imap :server "mail.mycorp.com"
15481 :stream kerberos4
15482 :fetchflag "\\Seen")
15483@end lisp
15484
15485@item webmail
15486Get mail from a webmail server, such as @uref{http://www.hotmail.com/},
15487@uref{http://webmail.netscape.com/}, @uref{http://www.netaddress.com/},
15488@uref{http://mail.yahoo.com/}.
15489
15490NOTE: Webmail largely depends on cookies. A "one-line-cookie" patch is
15491required for url "4.0pre.46".
15492
15493WARNING: Mails may be lost. NO WARRANTY.
15494
15495Keywords:
15496
15497@table @code
15498@item :subtype
15499The type of the webmail server. The default is @code{hotmail}. The
15500alternatives are @code{netscape}, @code{netaddress}, @code{my-deja}.
15501
15502@item :user
15503The user name to give to the webmail server. The default is the login
15504name.
15505
15506@item :password
15507The password to give to the webmail server. If not specified, the user is
15508prompted.
15509
15510@item :dontexpunge
15511If non-@code{nil}, only fetch unread articles and don't move them to
15512trash folder after finishing the fetch.
15513
15514@end table
15515
15516An example webmail source:
15517
15518@lisp
15519(webmail :subtype 'hotmail
15520 :user "user-name"
15521 :password "secret")
15522@end lisp
a1da1e37
MB
15523
15524@item group
15525Get the actual mail source from the @code{mail-source} group parameter,
15526@xref{Group Parameters}.
15527
4009494e
GM
15528@end table
15529
15530@table @dfn
15531@item Common Keywords
15532Common keywords can be used in any type of mail source.
15533
15534Keywords:
15535
15536@table @code
15537@item :plugged
15538If non-@code{nil}, fetch the mail even when Gnus is unplugged. If you
15539use directory source to get mail, you can specify it as in this
15540example:
15541
15542@lisp
15543(setq mail-sources
15544 '((directory :path "/home/pavel/.Spool/"
15545 :suffix ""
15546 :plugged t)))
15547@end lisp
15548
15549Gnus will then fetch your mail even when you are unplugged. This is
15550useful when you use local mail and news.
15551
15552@end table
15553@end table
15554
15555@subsubsection Function Interface
15556
15557Some of the above keywords specify a Lisp function to be executed.
15558For each keyword @code{:foo}, the Lisp variable @code{foo} is bound to
15559the value of the keyword while the function is executing. For example,
15560consider the following mail-source setting:
15561
15562@lisp
15563(setq mail-sources '((pop :user "jrl"
15564 :server "pophost" :function fetchfunc)))
15565@end lisp
15566
15567While the function @code{fetchfunc} is executing, the symbol @code{user}
15568is bound to @code{"jrl"}, and the symbol @code{server} is bound to
15569@code{"pophost"}. The symbols @code{port}, @code{password},
15570@code{program}, @code{prescript}, @code{postscript}, @code{function},
15571and @code{authentication} are also bound (to their default values).
15572
15573See above for a list of keywords for each type of mail source.
15574
15575
15576@node Mail Source Customization
15577@subsubsection Mail Source Customization
15578
15579The following is a list of variables that influence how the mail is
15580fetched. You would normally not need to set or change any of these
15581variables.
15582
15583@table @code
15584@item mail-source-crash-box
15585@vindex mail-source-crash-box
15586File where mail will be stored while processing it. The default is@*
15587@file{~/.emacs-mail-crash-box}.
15588
37a68866 15589@cindex Incoming*
4009494e
GM
15590@item mail-source-delete-incoming
15591@vindex mail-source-delete-incoming
15592If non-@code{nil}, delete incoming files after handling them. If
15593@code{t}, delete the files immediately, if @code{nil}, never delete any
15594files. If a positive number, delete files older than number of days
37a68866
MB
15595(the deletion will only happen when receiving new mail). You may also
15596set @code{mail-source-delete-incoming} to @code{nil} and call
4009494e 15597@code{mail-source-delete-old-incoming} from a hook or interactively.
2b968687
MB
15598@code{mail-source-delete-incoming} defaults to @code{10} in alpha Gnusae
15599and @code{2} in released Gnusae. @xref{Gnus Development}.
4009494e
GM
15600
15601@item mail-source-delete-old-incoming-confirm
15602@vindex mail-source-delete-old-incoming-confirm
15603If non-@code{nil}, ask for confirmation before deleting old incoming
15604files. This variable only applies when
15605@code{mail-source-delete-incoming} is a positive number.
15606
15607@item mail-source-ignore-errors
15608@vindex mail-source-ignore-errors
15609If non-@code{nil}, ignore errors when reading mail from a mail source.
15610
15611@item mail-source-directory
15612@vindex mail-source-directory
15613Directory where incoming mail source files (if any) will be stored. The
15614default is @file{~/Mail/}. At present, the only thing this is used for
15615is to say where the incoming files will be stored if the variable
15616@code{mail-source-delete-incoming} is @code{nil} or a number.
15617
15618@item mail-source-incoming-file-prefix
15619@vindex mail-source-incoming-file-prefix
15620Prefix for file name for storing incoming mail. The default is
15621@file{Incoming}, in which case files will end up with names like
15622@file{Incoming30630D_} or @file{Incoming298602ZD}. This is really only
15623relevant if @code{mail-source-delete-incoming} is @code{nil} or a
15624number.
15625
15626@item mail-source-default-file-modes
15627@vindex mail-source-default-file-modes
15628All new mail files will get this file mode. The default is 384.
15629
15630@item mail-source-movemail-program
15631@vindex mail-source-movemail-program
15632If non-@code{nil}, name of program for fetching new mail. If
15633@code{nil}, @code{movemail} in @var{exec-directory}.
15634
15635@end table
15636
15637
15638@node Fetching Mail
15639@subsubsection Fetching Mail
15640
15641@vindex mail-sources
4009494e
GM
15642The way to actually tell Gnus where to get new mail from is to set
15643@code{mail-sources} to a list of mail source specifiers
15644(@pxref{Mail Source Specifiers}).
15645
b890d447
MB
15646If this variable is @code{nil}, the mail back ends will never attempt to
15647fetch mail by themselves.
4009494e
GM
15648
15649If you want to fetch mail both from your local spool as well as a
15650@acronym{POP} mail server, you'd say something like:
15651
15652@lisp
15653(setq mail-sources
15654 '((file)
15655 (pop :server "pop3.mail.server"
15656 :password "secret")))
15657@end lisp
15658
15659Or, if you don't want to use any of the keyword defaults:
15660
15661@lisp
15662(setq mail-sources
15663 '((file :path "/var/spool/mail/user-name")
15664 (pop :server "pop3.mail.server"
15665 :user "user-name"
15666 :port "pop3"
15667 :password "secret")))
15668@end lisp
15669
15670
15671When you use a mail back end, Gnus will slurp all your mail from your
15672inbox and plonk it down in your home directory. Gnus doesn't move any
15673mail if you're not using a mail back end---you have to do a lot of magic
15674invocations first. At the time when you have finished drawing the
15675pentagram, lightened the candles, and sacrificed the goat, you really
15676shouldn't be too surprised when Gnus moves your mail.
15677
15678
15679
15680@node Mail Back End Variables
15681@subsection Mail Back End Variables
15682
15683These variables are (for the most part) pertinent to all the various
15684mail back ends.
15685
15686@table @code
15687@vindex nnmail-read-incoming-hook
15688@item nnmail-read-incoming-hook
15689The mail back ends all call this hook after reading new mail. You can
15690use this hook to notify any mail watch programs, if you want to.
15691
15692@vindex nnmail-split-hook
15693@item nnmail-split-hook
15694@findex gnus-article-decode-encoded-words
15695@cindex RFC 1522 decoding
15696@cindex RFC 2047 decoding
15697Hook run in the buffer where the mail headers of each message is kept
15698just before the splitting based on these headers is done. The hook is
15699free to modify the buffer contents in any way it sees fit---the buffer
15700is discarded after the splitting has been done, and no changes performed
15701in the buffer will show up in any files.
15702@code{gnus-article-decode-encoded-words} is one likely function to add
15703to this hook.
15704
15705@vindex nnmail-pre-get-new-mail-hook
15706@vindex nnmail-post-get-new-mail-hook
15707@item nnmail-pre-get-new-mail-hook
15708@itemx nnmail-post-get-new-mail-hook
15709These are two useful hooks executed when treating new incoming
15710mail---@code{nnmail-pre-get-new-mail-hook} (is called just before
15711starting to handle the new mail) and
15712@code{nnmail-post-get-new-mail-hook} (is called when the mail handling
15713is done). Here's and example of using these two hooks to change the
15714default file modes the new mail files get:
15715
15716@lisp
15717(add-hook 'nnmail-pre-get-new-mail-hook
15718 (lambda () (set-default-file-modes 511)))
15719
15720(add-hook 'nnmail-post-get-new-mail-hook
15721 (lambda () (set-default-file-modes 551)))
15722@end lisp
15723
15724@item nnmail-use-long-file-names
15725@vindex nnmail-use-long-file-names
15726If non-@code{nil}, the mail back ends will use long file and directory
15727names. Groups like @samp{mail.misc} will end up in directories
15728(assuming use of @code{nnml} back end) or files (assuming use of
15729@code{nnfolder} back end) like @file{mail.misc}. If it is @code{nil},
15730the same group will end up in @file{mail/misc}.
15731
15732@item nnmail-delete-file-function
15733@vindex nnmail-delete-file-function
15734@findex delete-file
15735Function called to delete files. It is @code{delete-file} by default.
15736
15737@item nnmail-cache-accepted-message-ids
15738@vindex nnmail-cache-accepted-message-ids
15739If non-@code{nil}, put the @code{Message-ID}s of articles imported into
15740the back end (via @code{Gcc}, for instance) into the mail duplication
15741discovery cache. The default is @code{nil}.
15742
15743@item nnmail-cache-ignore-groups
15744@vindex nnmail-cache-ignore-groups
15745This can be a regular expression or a list of regular expressions.
15746Group names that match any of the regular expressions will never be
15747recorded in the @code{Message-ID} cache.
15748
15749This can be useful, for example, when using Fancy Splitting
15750(@pxref{Fancy Mail Splitting}) together with the function
15751@code{nnmail-split-fancy-with-parent}.
15752
15753@end table
15754
15755
15756@node Fancy Mail Splitting
15757@subsection Fancy Mail Splitting
15758@cindex mail splitting
15759@cindex fancy mail splitting
15760
15761@vindex nnmail-split-fancy
15762@findex nnmail-split-fancy
15763If the rather simple, standard method for specifying how to split mail
15764doesn't allow you to do what you want, you can set
15765@code{nnmail-split-methods} to @code{nnmail-split-fancy}. Then you can
15766play with the @code{nnmail-split-fancy} variable.
15767
15768Let's look at an example value of this variable first:
15769
15770@lisp
15771;; @r{Messages from the mailer daemon are not crossposted to any of}
15772;; @r{the ordinary groups. Warnings are put in a separate group}
15773;; @r{from real errors.}
15774(| ("from" mail (| ("subject" "warn.*" "mail.warning")
15775 "mail.misc"))
15776 ;; @r{Non-error messages are crossposted to all relevant}
15777 ;; @r{groups, but we don't crosspost between the group for the}
15778 ;; @r{(ding) list and the group for other (ding) related mail.}
15779 (& (| (any "ding@@ifi\\.uio\\.no" "ding.list")
15780 ("subject" "ding" "ding.misc"))
15781 ;; @r{Other mailing lists@dots{}}
15782 (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list")
15783 (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list")
15784 ;; @r{Both lists below have the same suffix, so prevent}
15785 ;; @r{cross-posting to mkpkg.list of messages posted only to}
15786 ;; @r{the bugs- list, but allow cross-posting when the}
15787 ;; @r{message was really cross-posted.}
15788 (any "bugs-mypackage@@somewhere" "mypkg.bugs")
15789 (any "mypackage@@somewhere" - "bugs-mypackage" "mypkg.list")
15790 ;; @r{People@dots{}}
15791 (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen"))
15792 ;; @r{Unmatched mail goes to the catch all group.}
15793 "misc.misc")
15794@end lisp
15795
15796This variable has the format of a @dfn{split}. A split is a
15797(possibly) recursive structure where each split may contain other
15798splits. Here are the possible split syntaxes:
15799
15800@table @code
15801
15802@item group
15803If the split is a string, that will be taken as a group name. Normal
15804regexp match expansion will be done. See below for examples.
15805
15806@c Don't fold this line.
15807@item (@var{field} @var{value} [- @var{restrict} [@dots{}] ] @var{split} [@var{invert-partial}])
15808The split can be a list containing at least three elements. If the
15809first element @var{field} (a regexp matching a header) contains
15810@var{value} (also a regexp) then store the message as specified by
15811@var{split}.
15812
15813If @var{restrict} (yet another regexp) matches some string after
15814@var{field} and before the end of the matched @var{value}, the
15815@var{split} is ignored. If none of the @var{restrict} clauses match,
15816@var{split} is processed.
15817
15818The last element @var{invert-partial} is optional. If it is
15819non-@code{nil}, the match-partial-words behavior controlled by the
15820variable @code{nnmail-split-fancy-match-partial-words} (see below) is
15821be inverted. (New in Gnus 5.10.7)
15822
15823@item (| @var{split} @dots{})
15824If the split is a list, and the first element is @code{|} (vertical
15825bar), then process each @var{split} until one of them matches. A
15826@var{split} is said to match if it will cause the mail message to be
15827stored in one or more groups.
15828
15829@item (& @var{split} @dots{})
15830If the split is a list, and the first element is @code{&}, then
15831process all @var{split}s in the list.
15832
15833@item junk
15834If the split is the symbol @code{junk}, then don't save (i.e., delete)
15835this message. Use with extreme caution.
15836
15837@item (: @var{function} @var{arg1} @var{arg2} @dots{})
15838If the split is a list, and the first element is @samp{:}, then the
15839second element will be called as a function with @var{args} given as
15840arguments. The function should return a @var{split}.
15841
15842@cindex body split
15843For instance, the following function could be used to split based on the
15844body of the messages:
15845
15846@lisp
15847(defun split-on-body ()
15848 (save-excursion
15849 (save-restriction
15850 (widen)
15851 (goto-char (point-min))
15852 (when (re-search-forward "Some.*string" nil t)
15853 "string.group"))))
15854@end lisp
15855
b890d447
MB
15856The buffer is narrowed to the header of the message in question when
15857@var{function} is run. That's why @code{(widen)} needs to be called
15858after @code{save-excursion} and @code{save-restriction} in the example
23f87bed 15859above. Also note that with the nnimap backend, message bodies will
4009494e
GM
15860not be downloaded by default. You need to set
15861@code{nnimap-split-download-body} to @code{t} to do that
15862(@pxref{Splitting in IMAP}).
15863
15864@item (! @var{func} @var{split})
15865If the split is a list, and the first element is @code{!}, then
15866@var{split} will be processed, and @var{func} will be called as a
15867function with the result of @var{split} as argument. @var{func}
15868should return a split.
15869
15870@item nil
15871If the split is @code{nil}, it is ignored.
15872
15873@end table
15874
15875In these splits, @var{field} must match a complete field name.
15876
15877Normally, @var{value} in these splits must match a complete @emph{word}
15878according to the fundamental mode syntax table. In other words, all
15879@var{value}'s will be implicitly surrounded by @code{\<...\>} markers,
15880which are word delimiters. Therefore, if you use the following split,
15881for example,
15882
15883@example
15884(any "joe" "joemail")
15885@end example
15886
15887@noindent
15888messages sent from @samp{joedavis@@foo.org} will normally not be filed
15889in @samp{joemail}. If you want to alter this behavior, you can use any
15890of the following three ways:
15891
15892@enumerate
15893@item
15894@vindex nnmail-split-fancy-match-partial-words
15895You can set the @code{nnmail-split-fancy-match-partial-words} variable
15896to non-@code{nil} in order to ignore word boundaries and instead the
15897match becomes more like a grep. This variable controls whether partial
15898words are matched during fancy splitting. The default value is
15899@code{nil}.
15900
15901Note that it influences all @var{value}'s in your split rules.
15902
15903@item
15904@var{value} beginning with @code{.*} ignores word boundaries in front of
15905a word. Similarly, if @var{value} ends with @code{.*}, word boundaries
15906in the rear of a word will be ignored. For example, the @var{value}
15907@code{"@@example\\.com"} does not match @samp{foo@@example.com} but
15908@code{".*@@example\\.com"} does.
15909
15910@item
15911You can set the @var{invert-partial} flag in your split rules of the
15912@samp{(@var{field} @var{value} @dots{})} types, aforementioned in this
15913section. If the flag is set, word boundaries on both sides of a word
15914are ignored even if @code{nnmail-split-fancy-match-partial-words} is
15915@code{nil}. Contrarily, if the flag is set, word boundaries are not
15916ignored even if @code{nnmail-split-fancy-match-partial-words} is
15917non-@code{nil}. (New in Gnus 5.10.7)
15918@end enumerate
15919
15920@vindex nnmail-split-abbrev-alist
15921@var{field} and @var{value} can also be Lisp symbols, in that case
15922they are expanded as specified by the variable
15923@code{nnmail-split-abbrev-alist}. This is an alist of cons cells,
15924where the @sc{car} of a cell contains the key, and the @sc{cdr}
15925contains the associated value. Predefined entries in
15926@code{nnmail-split-abbrev-alist} include:
15927
15928@table @code
15929@item from
15930Matches the @samp{From}, @samp{Sender} and @samp{Resent-From} fields.
15931@item to
15932Matches the @samp{To}, @samp{Cc}, @samp{Apparently-To},
15933@samp{Resent-To} and @samp{Resent-Cc} fields.
15934@item any
15935Is the union of the @code{from} and @code{to} entries.
15936@end table
15937
15938@vindex nnmail-split-fancy-syntax-table
15939@code{nnmail-split-fancy-syntax-table} is the syntax table in effect
15940when all this splitting is performed.
15941
15942If you want to have Gnus create groups dynamically based on some
15943information in the headers (i.e., do @code{replace-match}-like
15944substitutions in the group names), you can say things like:
15945
15946@example
15947(any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1")
15948@end example
15949
15950In this example, messages sent to @samp{debian-foo@@lists.debian.org}
15951will be filed in @samp{mail.debian.foo}.
15952
15953If the string contains the element @samp{\&}, then the previously
15954matched string will be substituted. Similarly, the elements @samp{\\1}
15955up to @samp{\\9} will be substituted with the text matched by the
15956groupings 1 through 9.
15957
15958@vindex nnmail-split-lowercase-expanded
15959Where @code{nnmail-split-lowercase-expanded} controls whether the
15960lowercase of the matched string should be used for the substitution.
15961Setting it as non-@code{nil} is useful to avoid the creation of multiple
15962groups when users send to an address using different case
15963(i.e. mailing-list@@domain vs Mailing-List@@Domain). The default value
15964is @code{t}.
15965
15966@findex nnmail-split-fancy-with-parent
15967@code{nnmail-split-fancy-with-parent} is a function which allows you to
15968split followups into the same groups their parents are in. Sometimes
15969you can't make splitting rules for all your mail. For example, your
15970boss might send you personal mail regarding different projects you are
15971working on, and as you can't tell your boss to put a distinguishing
15972string into the subject line, you have to resort to manually moving the
15973messages into the right group. With this function, you only have to do
15974it once per thread.
15975
15976To use this feature, you have to set @code{nnmail-treat-duplicates}
15977and @code{nnmail-cache-accepted-message-ids} to a non-@code{nil}
15978value. And then you can include @code{nnmail-split-fancy-with-parent}
15979using the colon feature, like so:
15980@lisp
15981(setq nnmail-treat-duplicates 'warn ; @r{or @code{delete}}
15982 nnmail-cache-accepted-message-ids t
15983 nnmail-split-fancy
15984 '(| (: nnmail-split-fancy-with-parent)
15985 ;; @r{other splits go here}
15986 ))
15987@end lisp
15988
15989This feature works as follows: when @code{nnmail-treat-duplicates} is
15990non-@code{nil}, Gnus records the message id of every message it sees
15991in the file specified by the variable
15992@code{nnmail-message-id-cache-file}, together with the group it is in
15993(the group is omitted for non-mail messages). When mail splitting is
15994invoked, the function @code{nnmail-split-fancy-with-parent} then looks
15995at the References (and In-Reply-To) header of each message to split
15996and searches the file specified by @code{nnmail-message-id-cache-file}
15997for the message ids. When it has found a parent, it returns the
15998corresponding group name unless the group name matches the regexp
15999@code{nnmail-split-fancy-with-parent-ignore-groups}. It is
16000recommended that you set @code{nnmail-message-id-cache-length} to a
16001somewhat higher number than the default so that the message ids are
16002still in the cache. (A value of 5000 appears to create a file some
16003300 kBytes in size.)
16004@vindex nnmail-cache-accepted-message-ids
16005When @code{nnmail-cache-accepted-message-ids} is non-@code{nil}, Gnus
16006also records the message ids of moved articles, so that the followup
16007messages goes into the new group.
16008
16009Also see the variable @code{nnmail-cache-ignore-groups} if you don't
16010want certain groups to be recorded in the cache. For example, if all
16011outgoing messages are written to an ``outgoing'' group, you could set
16012@code{nnmail-cache-ignore-groups} to match that group name.
16013Otherwise, answers to all your messages would end up in the
16014``outgoing'' group.
16015
16016
16017@node Group Mail Splitting
16018@subsection Group Mail Splitting
16019@cindex mail splitting
16020@cindex group mail splitting
16021
16022@findex gnus-group-split
16023If you subscribe to dozens of mailing lists but you don't want to
16024maintain mail splitting rules manually, group mail splitting is for you.
16025You just have to set @code{to-list} and/or @code{to-address} in group
16026parameters or group customization and set @code{nnmail-split-methods} to
16027@code{gnus-group-split}. This splitting function will scan all groups
16028for those parameters and split mail accordingly, i.e., messages posted
16029from or to the addresses specified in the parameters @code{to-list} or
16030@code{to-address} of a mail group will be stored in that group.
16031
16032Sometimes, mailing lists have multiple addresses, and you may want mail
16033splitting to recognize them all: just set the @code{extra-aliases} group
16034parameter to the list of additional addresses and it's done. If you'd
16035rather use a regular expression, set @code{split-regexp}.
16036
16037All these parameters in a group will be used to create an
16038@code{nnmail-split-fancy} split, in which the @var{field} is @samp{any},
16039the @var{value} is a single regular expression that matches
16040@code{to-list}, @code{to-address}, all of @code{extra-aliases} and all
16041matches of @code{split-regexp}, and the @var{split} is the name of the
16042group. @var{restrict}s are also supported: just set the
16043@code{split-exclude} parameter to a list of regular expressions.
16044
16045If you can't get the right split to be generated using all these
16046parameters, or you just need something fancier, you can set the
16047parameter @code{split-spec} to an @code{nnmail-split-fancy} split. In
16048this case, all other aforementioned parameters will be ignored by
16049@code{gnus-group-split}. In particular, @code{split-spec} may be set to
16050@code{nil}, in which case the group will be ignored by
16051@code{gnus-group-split}.
16052
16053@vindex gnus-group-split-default-catch-all-group
16054@code{gnus-group-split} will do cross-posting on all groups that match,
16055by defining a single @code{&} fancy split containing one split for each
16056group. If a message doesn't match any split, it will be stored in the
16057group named in @code{gnus-group-split-default-catch-all-group}, unless
16058some group has @code{split-spec} set to @code{catch-all}, in which case
16059that group is used as the catch-all group. Even though this variable is
16060often used just to name a group, it may also be set to an arbitrarily
16061complex fancy split (after all, a group name is a fancy split), and this
16062may be useful to split mail that doesn't go to any mailing list to
16063personal mail folders. Note that this fancy split is added as the last
16064element of a @code{|} split list that also contains a @code{&} split
16065with the rules extracted from group parameters.
16066
16067It's time for an example. Assume the following group parameters have
16068been defined:
16069
16070@example
16071nnml:mail.bar:
16072((to-address . "bar@@femail.com")
16073 (split-regexp . ".*@@femail\\.com"))
16074nnml:mail.foo:
16075((to-list . "foo@@nowhere.gov")
16076 (extra-aliases "foo@@localhost" "foo-redist@@home")
16077 (split-exclude "bugs-foo" "rambling-foo")
16078 (admin-address . "foo-request@@nowhere.gov"))
16079nnml:mail.others:
16080((split-spec . catch-all))
16081@end example
16082
16083Setting @code{nnmail-split-methods} to @code{gnus-group-split} will
16084behave as if @code{nnmail-split-fancy} had been selected and variable
16085@code{nnmail-split-fancy} had been set as follows:
16086
16087@lisp
16088(| (& (any "\\(bar@@femail\\.com\\|.*@@femail\\.com\\)" "mail.bar")
16089 (any "\\(foo@@nowhere\\.gov\\|foo@@localhost\\|foo-redist@@home\\)"
16090 - "bugs-foo" - "rambling-foo" "mail.foo"))
16091 "mail.others")
16092@end lisp
16093
16094@findex gnus-group-split-fancy
16095If you'd rather not use group splitting for all your mail groups, you
16096may use it for only some of them, by using @code{nnmail-split-fancy}
16097splits like this:
16098
16099@lisp
16100(: gnus-group-split-fancy @var{groups} @var{no-crosspost} @var{catch-all})
16101@end lisp
16102
16103@var{groups} may be a regular expression or a list of group names whose
16104parameters will be scanned to generate the output split.
16105@var{no-crosspost} can be used to disable cross-posting; in this case, a
16106single @code{|} split will be output. @var{catch-all} is the fall back
16107fancy split, used like @code{gnus-group-split-default-catch-all-group}.
16108If @var{catch-all} is @code{nil}, or if @code{split-regexp} matches the
16109empty string in any selected group, no catch-all split will be issued.
16110Otherwise, if some group has @code{split-spec} set to @code{catch-all},
16111this group will override the value of the @var{catch-all} argument.
16112
16113@findex gnus-group-split-setup
16114Unfortunately, scanning all groups and their parameters can be quite
16115slow, especially considering that it has to be done for every message.
16116But don't despair! The function @code{gnus-group-split-setup} can be
16117used to enable @code{gnus-group-split} in a much more efficient way. It
16118sets @code{nnmail-split-methods} to @code{nnmail-split-fancy} and sets
16119@code{nnmail-split-fancy} to the split produced by
16120@code{gnus-group-split-fancy}. Thus, the group parameters are only
16121scanned once, no matter how many messages are split.
16122
16123@findex gnus-group-split-update
16124However, if you change group parameters, you'd have to update
16125@code{nnmail-split-fancy} manually. You can do it by running
16126@code{gnus-group-split-update}. If you'd rather have it updated
16127automatically, just tell @code{gnus-group-split-setup} to do it for
16128you. For example, add to your @file{~/.gnus.el}:
16129
16130@lisp
16131(gnus-group-split-setup @var{auto-update} @var{catch-all})
16132@end lisp
16133
16134If @var{auto-update} is non-@code{nil}, @code{gnus-group-split-update}
16135will be added to @code{nnmail-pre-get-new-mail-hook}, so you won't ever
16136have to worry about updating @code{nnmail-split-fancy} again. If you
16137don't omit @var{catch-all} (it's optional, equivalent to @code{nil}),
16138@code{gnus-group-split-default-catch-all-group} will be set to its
16139value.
16140
16141@vindex gnus-group-split-updated-hook
16142Because you may want to change @code{nnmail-split-fancy} after it is set
16143by @code{gnus-group-split-update}, this function will run
16144@code{gnus-group-split-updated-hook} just before finishing.
16145
16146@node Incorporating Old Mail
16147@subsection Incorporating Old Mail
16148@cindex incorporating old mail
16149@cindex import old mail
16150
16151Most people have lots of old mail stored in various file formats. If
16152you have set up Gnus to read mail using one of the spiffy Gnus mail
16153back ends, you'll probably wish to have that old mail incorporated into
16154your mail groups.
16155
16156Doing so can be quite easy.
16157
16158To take an example: You're reading mail using @code{nnml}
16159(@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a
16160satisfactory value (@pxref{Splitting Mail}). You have an old Unix mbox
16161file filled with important, but old, mail. You want to move it into
16162your @code{nnml} groups.
16163
16164Here's how:
16165
16166@enumerate
16167@item
16168Go to the group buffer.
16169
16170@item
16171Type @kbd{G f} and give the file name to the mbox file when prompted to create an
16172@code{nndoc} group from the mbox file (@pxref{Foreign Groups}).
16173
16174@item
16175Type @kbd{SPACE} to enter the newly created group.
16176
16177@item
16178Type @kbd{M P b} to process-mark all articles in this group's buffer
16179(@pxref{Setting Process Marks}).
16180
16181@item
16182Type @kbd{B r} to respool all the process-marked articles, and answer
16183@samp{nnml} when prompted (@pxref{Mail Group Commands}).
16184@end enumerate
16185
16186All the mail messages in the mbox file will now also be spread out over
16187all your @code{nnml} groups. Try entering them and check whether things
16188have gone without a glitch. If things look ok, you may consider
16189deleting the mbox file, but I wouldn't do that unless I was absolutely
16190sure that all the mail has ended up where it should be.
16191
16192Respooling is also a handy thing to do if you're switching from one mail
16193back end to another. Just respool all the mail in the old mail groups
16194using the new mail back end.
16195
16196
16197@node Expiring Mail
16198@subsection Expiring Mail
16199@cindex article expiry
16200@cindex expiring mail
16201
16202Traditional mail readers have a tendency to remove mail articles when
16203you mark them as read, in some way. Gnus takes a fundamentally
16204different approach to mail reading.
16205
16206Gnus basically considers mail just to be news that has been received in
16207a rather peculiar manner. It does not think that it has the power to
16208actually change the mail, or delete any mail messages. If you enter a
16209mail group, and mark articles as ``read'', or kill them in some other
16210fashion, the mail articles will still exist on the system. I repeat:
16211Gnus will not delete your old, read mail. Unless you ask it to, of
16212course.
16213
16214To make Gnus get rid of your unwanted mail, you have to mark the
16215articles as @dfn{expirable}. (With the default key bindings, this means
16216that you have to type @kbd{E}.) This does not mean that the articles
16217will disappear right away, however. In general, a mail article will be
16218deleted from your system if, 1) it is marked as expirable, AND 2) it is
16219more than one week old. If you do not mark an article as expirable, it
16220will remain on your system until hell freezes over. This bears
16221repeating one more time, with some spurious capitalizations: IF you do
16222NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES.
16223
16224You do not have to mark articles as expirable by hand. Gnus provides
16225two features, called ``auto-expire'' and ``total-expire'', that can help you
16226with this. In a nutshell, ``auto-expire'' means that Gnus hits @kbd{E}
16227for you when you select an article. And ``total-expire'' means that Gnus
16228considers all articles as expirable that are read. So, in addition to
16229the articles marked @samp{E}, also the articles marked @samp{r},
16230@samp{R}, @samp{O}, @samp{K}, @samp{Y} and so on are considered
16231expirable.
16232
16233When should either auto-expire or total-expire be used? Most people
16234who are subscribed to mailing lists split each list into its own group
16235and then turn on auto-expire or total-expire for those groups.
16236(@xref{Splitting Mail}, for more information on splitting each list
16237into its own group.)
16238
16239Which one is better, auto-expire or total-expire? It's not easy to
16240answer. Generally speaking, auto-expire is probably faster. Another
16241advantage of auto-expire is that you get more marks to work with: for
16242the articles that are supposed to stick around, you can still choose
16243between tick and dormant and read marks. But with total-expire, you
16244only have dormant and ticked to choose from. The advantage of
16245total-expire is that it works well with adaptive scoring (@pxref{Adaptive
16246Scoring}). Auto-expire works with normal scoring but not with adaptive
16247scoring.
16248
16249@vindex gnus-auto-expirable-newsgroups
16250Groups that match the regular expression
16251@code{gnus-auto-expirable-newsgroups} will have all articles that you
16252read marked as expirable automatically. All articles marked as
16253expirable have an @samp{E} in the first column in the summary buffer.
16254
16255By default, if you have auto expiry switched on, Gnus will mark all the
16256articles you read as expirable, no matter if they were read or unread
16257before. To avoid having articles marked as read marked as expirable
16258automatically, you can put something like the following in your
16259@file{~/.gnus.el} file:
16260
16261@vindex gnus-mark-article-hook
16262@lisp
16263(remove-hook 'gnus-mark-article-hook
16264 'gnus-summary-mark-read-and-unread-as-read)
16265(add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read)
16266@end lisp
16267
16268Note that making a group auto-expirable doesn't mean that all read
16269articles are expired---only the articles marked as expirable
16270will be expired. Also note that using the @kbd{d} command won't make
16271articles expirable---only semi-automatic marking of articles as read will
16272mark the articles as expirable in auto-expirable groups.
16273
16274Let's say you subscribe to a couple of mailing lists, and you want the
16275articles you have read to disappear after a while:
16276
16277@lisp
16278(setq gnus-auto-expirable-newsgroups
16279 "mail.nonsense-list\\|mail.nice-list")
16280@end lisp
16281
16282Another way to have auto-expiry happen is to have the element
16283@code{auto-expire} in the group parameters of the group.
16284
16285If you use adaptive scoring (@pxref{Adaptive Scoring}) and
16286auto-expiring, you'll have problems. Auto-expiring and adaptive scoring
16287don't really mix very well.
16288
16289@vindex nnmail-expiry-wait
16290The @code{nnmail-expiry-wait} variable supplies the default time an
16291expirable article has to live. Gnus starts counting days from when the
16292message @emph{arrived}, not from when it was sent. The default is seven
16293days.
16294
16295Gnus also supplies a function that lets you fine-tune how long articles
16296are to live, based on what group they are in. Let's say you want to
16297have one month expiry period in the @samp{mail.private} group, a one day
16298expiry period in the @samp{mail.junk} group, and a six day expiry period
16299everywhere else:
16300
16301@vindex nnmail-expiry-wait-function
16302@lisp
16303(setq nnmail-expiry-wait-function
16304 (lambda (group)
16305 (cond ((string= group "mail.private")
16306 31)
16307 ((string= group "mail.junk")
16308 1)
16309 ((string= group "important")
16310 'never)
16311 (t
16312 6))))
16313@end lisp
16314
16315The group names this function is fed are ``unadorned'' group
16316names---no @samp{nnml:} prefixes and the like.
16317
16318The @code{nnmail-expiry-wait} variable and
16319@code{nnmail-expiry-wait-function} function can either be a number (not
16320necessarily an integer) or one of the symbols @code{immediate} or
16321@code{never}.
16322
16323You can also use the @code{expiry-wait} group parameter to selectively
16324change the expiry period (@pxref{Group Parameters}).
16325
16326@vindex nnmail-expiry-target
16327The normal action taken when expiring articles is to delete them.
16328However, in some circumstances it might make more sense to move them
16329to other groups instead of deleting them. The variable
16330@code{nnmail-expiry-target} (and the @code{expiry-target} group
16331parameter) controls this. The variable supplies a default value for
16332all groups, which can be overridden for specific groups by the group
16333parameter. default value is @code{delete}, but this can also be a
16334string (which should be the name of the group the message should be
16335moved to), or a function (which will be called in a buffer narrowed to
16336the message in question, and with the name of the group being moved
16337from as its parameter) which should return a target---either a group
16338name or @code{delete}.
16339
16340Here's an example for specifying a group name:
16341@lisp
16342(setq nnmail-expiry-target "nnml:expired")
16343@end lisp
16344
16345@findex nnmail-fancy-expiry-target
16346@vindex nnmail-fancy-expiry-targets
16347Gnus provides a function @code{nnmail-fancy-expiry-target} which will
16348expire mail to groups according to the variable
16349@code{nnmail-fancy-expiry-targets}. Here's an example:
16350
16351@lisp
16352 (setq nnmail-expiry-target 'nnmail-fancy-expiry-target
16353 nnmail-fancy-expiry-targets
16354 '((to-from "boss" "nnfolder:Work")
16355 ("subject" "IMPORTANT" "nnfolder:IMPORTANT.%Y.%b")
16356 ("from" ".*" "nnfolder:Archive-%Y")))
16357@end lisp
16358
16359With this setup, any mail that has @code{IMPORTANT} in its Subject
16360header and was sent in the year @code{YYYY} and month @code{MMM}, will
16361get expired to the group @code{nnfolder:IMPORTANT.YYYY.MMM}. If its
16362From or To header contains the string @code{boss}, it will get expired
16363to @code{nnfolder:Work}. All other mail will get expired to
16364@code{nnfolder:Archive-YYYY}.
16365
16366@vindex nnmail-keep-last-article
16367If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never
16368expire the final article in a mail newsgroup. This is to make life
16369easier for procmail users.
16370
16371@vindex gnus-total-expirable-newsgroups
16372By the way: That line up there, about Gnus never expiring non-expirable
16373articles, is a lie. If you put @code{total-expire} in the group
16374parameters, articles will not be marked as expirable, but all read
16375articles will be put through the expiry process. Use with extreme
16376caution. Even more dangerous is the
16377@code{gnus-total-expirable-newsgroups} variable. All groups that match
16378this regexp will have all read articles put through the expiry process,
16379which means that @emph{all} old mail articles in the groups in question
16380will be deleted after a while. Use with extreme caution, and don't come
16381crying to me when you discover that the regexp you used matched the
16382wrong group and all your important mail has disappeared. Be a
16383@emph{man}! Or a @emph{woman}! Whatever you feel more comfortable
16384with! So there!
16385
16386Most people make most of their mail groups total-expirable, though.
16387
16388@vindex gnus-inhibit-user-auto-expire
16389If @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user marking
16390commands will not mark an article as expirable, even if the group has
16391auto-expire turned on.
16392
b0b63450
MB
16393@vindex gnus-mark-copied-or-moved-articles-as-expirable
16394The expirable marks of articles will be removed when copying or moving
16395them to a group in which auto-expire is not turned on. This is for
16396preventing articles from being expired unintentionally. On the other
16397hand, to a group that has turned auto-expire on, the expirable marks of
16398articles that are copied or moved will not be changed by default. I.e.,
16399when copying or moving to such a group, articles that were expirable
16400will be left expirable and ones that were not expirable will not be
16401marked as expirable. So, even though in auto-expire groups, some
16402articles will never get expired (unless you read them again). If you
16403don't side with that behavior that unexpirable articles may be mixed
16404into auto-expire groups, you can set
16405@code{gnus-mark-copied-or-moved-articles-as-expirable} to a
16406non-@code{nil} value. In that case, articles that have been read will
16407be marked as expirable automatically when being copied or moved to a
16408group that has auto-expire turned on. The default value is @code{nil}.
16409
4009494e
GM
16410
16411@node Washing Mail
16412@subsection Washing Mail
16413@cindex mail washing
16414@cindex list server brain damage
16415@cindex incoming mail treatment
16416
16417Mailers and list servers are notorious for doing all sorts of really,
16418really stupid things with mail. ``Hey, RFC 822 doesn't explicitly
16419prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the
16420end of all lines passing through our server, so let's do that!!!!1!''
16421Yes, but RFC 822 wasn't designed to be read by morons. Things that were
16422considered to be self-evident were not discussed. So. Here we are.
16423
16424Case in point: The German version of Microsoft Exchange adds @samp{AW:
16425} to the subjects of replies instead of @samp{Re: }. I could pretend to
16426be shocked and dismayed by this, but I haven't got the energy. It is to
16427laugh.
16428
16429Gnus provides a plethora of functions for washing articles while
16430displaying them, but it might be nicer to do the filtering before
16431storing the mail to disk. For that purpose, we have three hooks and
16432various functions that can be put in these hooks.
16433
16434@table @code
16435@item nnmail-prepare-incoming-hook
16436@vindex nnmail-prepare-incoming-hook
16437This hook is called before doing anything with the mail and is meant for
16438grand, sweeping gestures. It is called in a buffer that contains all
16439the new, incoming mail. Functions to be used include:
16440
16441@table @code
16442@item nnheader-ms-strip-cr
16443@findex nnheader-ms-strip-cr
16444Remove trailing carriage returns from each line. This is default on
16445Emacs running on MS machines.
16446
16447@end table
16448
16449@item nnmail-prepare-incoming-header-hook
16450@vindex nnmail-prepare-incoming-header-hook
16451This hook is called narrowed to each header. It can be used when
16452cleaning up the headers. Functions that can be used include:
16453
16454@table @code
16455@item nnmail-remove-leading-whitespace
16456@findex nnmail-remove-leading-whitespace
16457Clear leading white space that ``helpful'' listservs have added to the
16458headers to make them look nice. Aaah.
16459
16460(Note that this function works on both the header on the body of all
16461messages, so it is a potentially dangerous function to use (if a body
16462of a message contains something that looks like a header line). So
16463rather than fix the bug, it is of course the right solution to make it
16464into a feature by documenting it.)
16465
16466@item nnmail-remove-list-identifiers
16467@findex nnmail-remove-list-identifiers
16468Some list servers add an identifier---for example, @samp{(idm)}---to the
16469beginning of all @code{Subject} headers. I'm sure that's nice for
16470people who use stone age mail readers. This function will remove
16471strings that match the @code{nnmail-list-identifiers} regexp, which can
16472also be a list of regexp. @code{nnmail-list-identifiers} may not contain
16473@code{\\(..\\)}.
16474
16475For instance, if you want to remove the @samp{(idm)} and the
16476@samp{nagnagnag} identifiers:
16477
16478@lisp
16479(setq nnmail-list-identifiers
16480 '("(idm)" "nagnagnag"))
16481@end lisp
16482
16483This can also be done non-destructively with
16484@code{gnus-list-identifiers}, @xref{Article Hiding}.
16485
16486@item nnmail-remove-tabs
16487@findex nnmail-remove-tabs
16488Translate all @samp{TAB} characters into @samp{SPACE} characters.
16489
01c52d31
MB
16490@item nnmail-ignore-broken-references
16491@findex nnmail-ignore-broken-references
16492@c @findex nnmail-fix-eudora-headers
4009494e 16493@cindex Eudora
01c52d31
MB
16494@cindex Pegasus
16495Some mail user agents (e.g. Eudora and Pegasus) produce broken
16496@code{References} headers, but correct @code{In-Reply-To} headers. This
16497function will get rid of the @code{References} header if the headers
16498contain a line matching the regular expression
16499@code{nnmail-broken-references-mailers}.
4009494e
GM
16500
16501@end table
16502
16503@item nnmail-prepare-incoming-message-hook
16504@vindex nnmail-prepare-incoming-message-hook
16505This hook is called narrowed to each message. Functions to be used
16506include:
16507
16508@table @code
16509@item article-de-quoted-unreadable
16510@findex article-de-quoted-unreadable
16511Decode Quoted Readable encoding.
16512
16513@end table
16514@end table
16515
16516
16517@node Duplicates
16518@subsection Duplicates
16519
16520@vindex nnmail-treat-duplicates
16521@vindex nnmail-message-id-cache-length
16522@vindex nnmail-message-id-cache-file
16523@cindex duplicate mails
16524If you are a member of a couple of mailing lists, you will sometimes
16525receive two copies of the same mail. This can be quite annoying, so
16526@code{nnmail} checks for and treats any duplicates it might find. To do
16527this, it keeps a cache of old @code{Message-ID}s---
16528@code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by
16529default. The approximate maximum number of @code{Message-ID}s stored
16530there is controlled by the @code{nnmail-message-id-cache-length}
16531variable, which is 1000 by default. (So 1000 @code{Message-ID}s will be
16532stored.) If all this sounds scary to you, you can set
16533@code{nnmail-treat-duplicates} to @code{warn} (which is what it is by
16534default), and @code{nnmail} won't delete duplicate mails. Instead it
16535will insert a warning into the head of the mail saying that it thinks
16536that this is a duplicate of a different message.
16537
16538This variable can also be a function. If that's the case, the function
16539will be called from a buffer narrowed to the message in question with
16540the @code{Message-ID} as a parameter. The function must return either
16541@code{nil}, @code{warn}, or @code{delete}.
16542
16543You can turn this feature off completely by setting the variable to
16544@code{nil}.
16545
16546If you want all the duplicate mails to be put into a special
16547@dfn{duplicates} group, you could do that using the normal mail split
16548methods:
16549
16550@lisp
16551(setq nnmail-split-fancy
16552 '(| ;; @r{Messages duplicates go to a separate group.}
16553 ("gnus-warning" "duplicat\\(e\\|ion\\) of message" "duplicate")
16554 ;; @r{Message from daemons, postmaster, and the like to another.}
16555 (any mail "mail.misc")
16556 ;; @r{Other rules.}
16557 [...] ))
16558@end lisp
16559@noindent
16560Or something like:
16561@lisp
16562(setq nnmail-split-methods
16563 '(("duplicates" "^Gnus-Warning:.*duplicate")
16564 ;; @r{Other rules.}
16565 [...]))
16566@end lisp
16567
16568Here's a neat feature: If you know that the recipient reads her mail
16569with Gnus, and that she has @code{nnmail-treat-duplicates} set to
16570@code{delete}, you can send her as many insults as you like, just by
16571using a @code{Message-ID} of a mail that you know that she's already
16572received. Think of all the fun! She'll never see any of it! Whee!
16573
16574
16575@node Not Reading Mail
16576@subsection Not Reading Mail
16577
16578If you start using any of the mail back ends, they have the annoying
16579habit of assuming that you want to read mail with them. This might not
16580be unreasonable, but it might not be what you want.
16581
16582If you set @code{mail-sources} and @code{nnmail-spool-file} to
16583@code{nil}, none of the back ends will ever attempt to read incoming
16584mail, which should help.
16585
16586@vindex nnbabyl-get-new-mail
16587@vindex nnmbox-get-new-mail
16588@vindex nnml-get-new-mail
16589@vindex nnmh-get-new-mail
16590@vindex nnfolder-get-new-mail
16591This might be too much, if, for instance, you are reading mail quite
bc79f9ab
GM
16592happily with @code{nnml} and just want to peek at some old (pre-Emacs
1659323) Rmail file you have stashed away with @code{nnbabyl}. All back ends have
4009494e
GM
16594variables called back-end-@code{get-new-mail}. If you want to disable
16595the @code{nnbabyl} mail reading, you edit the virtual server for the
16596group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}.
16597
16598All the mail back ends will call @code{nn}*@code{-prepare-save-mail-hook}
16599narrowed to the article to be saved before saving it when reading
16600incoming mail.
16601
16602
16603@node Choosing a Mail Back End
16604@subsection Choosing a Mail Back End
16605
16606Gnus will read the mail spool when you activate a mail group. The mail
16607file is first copied to your home directory. What happens after that
16608depends on what format you want to store your mail in.
16609
16610There are six different mail back ends in the standard Gnus, and more
16611back ends are available separately. The mail back end most people use
16612(because it is possibly the fastest) is @code{nnml} (@pxref{Mail
16613Spool}).
16614
16615@menu
16616* Unix Mail Box:: Using the (quite) standard Un*x mbox.
bc79f9ab 16617* Babyl:: Babyl was used by older versions of Rmail.
4009494e
GM
16618* Mail Spool:: Store your mail in a private spool?
16619* MH Spool:: An mhspool-like back end.
16620* Maildir:: Another one-file-per-message format.
16621* Mail Folders:: Having one file for each group.
16622* Comparing Mail Back Ends:: An in-depth looks at pros and cons.
16623@end menu
16624
16625
16626@node Unix Mail Box
16627@subsubsection Unix Mail Box
16628@cindex nnmbox
16629@cindex unix mail box
16630
16631@vindex nnmbox-active-file
16632@vindex nnmbox-mbox-file
16633The @dfn{nnmbox} back end will use the standard Un*x mbox file to store
16634mail. @code{nnmbox} will add extra headers to each mail article to say
16635which group it belongs in.
16636
16637Virtual server settings:
16638
16639@table @code
16640@item nnmbox-mbox-file
16641@vindex nnmbox-mbox-file
16642The name of the mail box in the user's home directory. Default is
16643@file{~/mbox}.
16644
16645@item nnmbox-active-file
16646@vindex nnmbox-active-file
16647The name of the active file for the mail box. Default is
16648@file{~/.mbox-active}.
16649
16650@item nnmbox-get-new-mail
16651@vindex nnmbox-get-new-mail
16652If non-@code{nil}, @code{nnmbox} will read incoming mail and split it
16653into groups. Default is @code{t}.
16654@end table
16655
16656
bc79f9ab
GM
16657@node Babyl
16658@subsubsection Babyl
4009494e 16659@cindex nnbabyl
4009494e
GM
16660
16661@vindex nnbabyl-active-file
16662@vindex nnbabyl-mbox-file
bc79f9ab
GM
16663The @dfn{nnbabyl} back end will use a Babyl mail box to store mail.
16664@code{nnbabyl} will add extra headers to each mail article to say which
16665group it belongs in.
4009494e
GM
16666
16667Virtual server settings:
16668
16669@table @code
16670@item nnbabyl-mbox-file
16671@vindex nnbabyl-mbox-file
bc79f9ab 16672The name of the Babyl file. The default is @file{~/RMAIL}
4009494e
GM
16673
16674@item nnbabyl-active-file
16675@vindex nnbabyl-active-file
bc79f9ab 16676The name of the active file for the Babyl file. The default is
4009494e
GM
16677@file{~/.rmail-active}
16678
16679@item nnbabyl-get-new-mail
16680@vindex nnbabyl-get-new-mail
16681If non-@code{nil}, @code{nnbabyl} will read incoming mail. Default is
16682@code{t}
16683@end table
16684
16685
16686@node Mail Spool
16687@subsubsection Mail Spool
16688@cindex nnml
16689@cindex mail @acronym{NOV} spool
16690
16691The @dfn{nnml} spool mail format isn't compatible with any other known
16692format. It should be used with some caution.
16693
16694@vindex nnml-directory
16695If you use this back end, Gnus will split all incoming mail into files,
16696one file for each mail, and put the articles into the corresponding
16697directories under the directory specified by the @code{nnml-directory}
16698variable. The default value is @file{~/Mail/}.
16699
16700You do not have to create any directories beforehand; Gnus will take
16701care of all that.
16702
16703If you have a strict limit as to how many files you are allowed to store
16704in your account, you should not use this back end. As each mail gets its
16705own file, you might very well occupy thousands of inodes within a few
16706weeks. If this is no problem for you, and it isn't a problem for you
16707having your friendly systems administrator walking around, madly,
16708shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should
16709know that this is probably the fastest format to use. You do not have
16710to trudge through a big mbox file just to read your new mail.
16711
16712@code{nnml} is probably the slowest back end when it comes to article
16713splitting. It has to create lots of files, and it also generates
16714@acronym{NOV} databases for the incoming mails. This makes it possibly the
16715fastest back end when it comes to reading mail.
16716
16717@cindex self contained nnml servers
16718@cindex marks
16719When the marks file is used (which it is by default), @code{nnml}
16720servers have the property that you may backup them using @code{tar} or
16721similar, and later be able to restore them into Gnus (by adding the
16722proper @code{nnml} server) and have all your marks be preserved. Marks
01c52d31 16723for a group are usually stored in the @code{.marks} file (but see
4009494e
GM
16724@code{nnml-marks-file-name}) within each @code{nnml} group's directory.
16725Individual @code{nnml} groups are also possible to backup, use @kbd{G m}
16726to restore the group (after restoring the backup into the nnml
16727directory).
16728
16729If for some reason you believe your @file{.marks} files are screwed
16730up, you can just delete them all. Gnus will then correctly regenerate
16731them next time it starts.
16732
16733Virtual server settings:
16734
16735@table @code
16736@item nnml-directory
16737@vindex nnml-directory
16738All @code{nnml} directories will be placed under this directory. The
16739default is the value of @code{message-directory} (whose default value
16740is @file{~/Mail}).
16741
16742@item nnml-active-file
16743@vindex nnml-active-file
16744The active file for the @code{nnml} server. The default is
16745@file{~/Mail/active}.
16746
16747@item nnml-newsgroups-file
16748@vindex nnml-newsgroups-file
16749The @code{nnml} group descriptions file. @xref{Newsgroups File
16750Format}. The default is @file{~/Mail/newsgroups}.
16751
16752@item nnml-get-new-mail
16753@vindex nnml-get-new-mail
16754If non-@code{nil}, @code{nnml} will read incoming mail. The default is
16755@code{t}.
16756
16757@item nnml-nov-is-evil
16758@vindex nnml-nov-is-evil
16759If non-@code{nil}, this back end will ignore any @acronym{NOV} files. The
16760default is @code{nil}.
16761
16762@item nnml-nov-file-name
16763@vindex nnml-nov-file-name
16764The name of the @acronym{NOV} files. The default is @file{.overview}.
16765
16766@item nnml-prepare-save-mail-hook
16767@vindex nnml-prepare-save-mail-hook
16768Hook run narrowed to an article before saving.
16769
16770@item nnml-marks-is-evil
16771@vindex nnml-marks-is-evil
16772If non-@code{nil}, this back end will ignore any @sc{marks} files. The
16773default is @code{nil}.
16774
16775@item nnml-marks-file-name
16776@vindex nnml-marks-file-name
16777The name of the @dfn{marks} files. The default is @file{.marks}.
16778
16779@item nnml-use-compressed-files
16780@vindex nnml-use-compressed-files
16781If non-@code{nil}, @code{nnml} will allow using compressed message
01c52d31
MB
16782files. This requires @code{auto-compression-mode} to be enabled
16783(@pxref{Compressed Files, ,Compressed Files, emacs, The Emacs Manual}).
16784If the value of @code{nnml-use-compressed-files} is a string, it is used
16785as the file extension specifying the compression program. You can set it
16786to @samp{.bz2} if your Emacs supports it. A value of @code{t} is
16787equivalent to @samp{.gz}.
16788
16789@item nnml-compressed-files-size-threshold
16790@vindex nnml-compressed-files-size-threshold
16791Default size threshold for compressed message files. Message files with
16792bodies larger than that many characters will be automatically compressed
16793if @code{nnml-use-compressed-files} is non-@code{nil}.
4009494e
GM
16794
16795@end table
16796
16797@findex nnml-generate-nov-databases
16798If your @code{nnml} groups and @acronym{NOV} files get totally out of
16799whack, you can do a complete update by typing @kbd{M-x
16800nnml-generate-nov-databases}. This command will trawl through the
16801entire @code{nnml} hierarchy, looking at each and every article, so it
16802might take a while to complete. A better interface to this
16803functionality can be found in the server buffer (@pxref{Server
16804Commands}).
16805
16806
16807@node MH Spool
16808@subsubsection MH Spool
16809@cindex nnmh
16810@cindex mh-e mail spool
16811
16812@code{nnmh} is just like @code{nnml}, except that is doesn't generate
16813@acronym{NOV} databases and it doesn't keep an active file or marks
16814file. This makes @code{nnmh} a @emph{much} slower back end than
16815@code{nnml}, but it also makes it easier to write procmail scripts
16816for.
16817
16818Virtual server settings:
16819
16820@table @code
16821@item nnmh-directory
16822@vindex nnmh-directory
16823All @code{nnmh} directories will be located under this directory. The
16824default is the value of @code{message-directory} (whose default is
16825@file{~/Mail})
16826
16827@item nnmh-get-new-mail
16828@vindex nnmh-get-new-mail
16829If non-@code{nil}, @code{nnmh} will read incoming mail. The default is
16830@code{t}.
16831
16832@item nnmh-be-safe
16833@vindex nnmh-be-safe
16834If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make
16835sure that the articles in the folder are actually what Gnus thinks
16836they are. It will check date stamps and stat everything in sight, so
16837setting this to @code{t} will mean a serious slow-down. If you never
16838use anything but Gnus to read the @code{nnmh} articles, you do not
16839have to set this variable to @code{t}. The default is @code{nil}.
16840@end table
16841
16842
16843@node Maildir
16844@subsubsection Maildir
16845@cindex nnmaildir
16846@cindex maildir
16847
16848@code{nnmaildir} stores mail in the maildir format, with each maildir
16849corresponding to a group in Gnus. This format is documented here:
16850@uref{http://cr.yp.to/proto/maildir.html} and here:
16851@uref{http://www.qmail.org/man/man5/maildir.html}. @code{nnmaildir}
16852also stores extra information in the @file{.nnmaildir/} directory
16853within a maildir.
16854
16855Maildir format was designed to allow concurrent deliveries and
16856reading, without needing locks. With other back ends, you would have
16857your mail delivered to a spool of some kind, and then you would
16858configure Gnus to split mail from that spool into your groups. You
16859can still do that with @code{nnmaildir}, but the more common
16860configuration is to have your mail delivered directly to the maildirs
16861that appear as group in Gnus.
16862
16863@code{nnmaildir} is designed to be perfectly reliable: @kbd{C-g} will
16864never corrupt its data in memory, and @code{SIGKILL} will never
16865corrupt its data in the filesystem.
16866
16867@code{nnmaildir} stores article marks and @acronym{NOV} data in each
16868maildir. So you can copy a whole maildir from one Gnus setup to
16869another, and you will keep your marks.
16870
16871Virtual server settings:
16872
16873@table @code
16874@item directory
16875For each of your @code{nnmaildir} servers (it's very unlikely that
16876you'd need more than one), you need to create a directory and populate
16877it with maildirs or symlinks to maildirs (and nothing else; do not
16878choose a directory already used for other purposes). Each maildir
16879will be represented in Gnus as a newsgroup on that server; the
16880filename of the symlink will be the name of the group. Any filenames
16881in the directory starting with @samp{.} are ignored. The directory is
16882scanned when you first start Gnus, and each time you type @kbd{g} in
16883the group buffer; if any maildirs have been removed or added,
16884@code{nnmaildir} notices at these times.
16885
16886The value of the @code{directory} parameter should be a Lisp form
16887which is processed by @code{eval} and @code{expand-file-name} to get
16888the path of the directory for this server. The form is @code{eval}ed
16889only when the server is opened; the resulting string is used until the
16890server is closed. (If you don't know about forms and @code{eval},
16891don't worry---a simple string will work.) This parameter is not
16892optional; you must specify it. I don't recommend using
16893@code{"~/Mail"} or a subdirectory of it; several other parts of Gnus
16894use that directory by default for various things, and may get confused
16895if @code{nnmaildir} uses it too. @code{"~/.nnmaildir"} is a typical
16896value.
16897
16898@item target-prefix
16899This should be a Lisp form which is processed by @code{eval} and
16900@code{expand-file-name}. The form is @code{eval}ed only when the
16901server is opened; the resulting string is used until the server is
16902closed.
16903
16904When you create a group on an @code{nnmaildir} server, the maildir is
16905created with @code{target-prefix} prepended to its name, and a symlink
16906pointing to that maildir is created, named with the plain group name.
16907So if @code{directory} is @code{"~/.nnmaildir"} and
16908@code{target-prefix} is @code{"../maildirs/"}, then when you create
16909the group @code{foo}, @code{nnmaildir} will create
16910@file{~/.nnmaildir/../maildirs/foo} as a maildir, and will create
16911@file{~/.nnmaildir/foo} as a symlink pointing to
16912@file{../maildirs/foo}.
16913
16914You can set @code{target-prefix} to a string without any slashes to
16915create both maildirs and symlinks in the same @code{directory}; in
16916this case, any maildirs found in @code{directory} whose names start
16917with @code{target-prefix} will not be listed as groups (but the
16918symlinks pointing to them will be).
16919
16920As a special case, if @code{target-prefix} is @code{""} (the default),
16921then when you create a group, the maildir will be created in
16922@code{directory} without a corresponding symlink. Beware that you
16923cannot use @code{gnus-group-delete-group} on such groups without the
16924@code{force} argument.
16925
16926@item directory-files
16927This should be a function with the same interface as
16928@code{directory-files} (such as @code{directory-files} itself). It is
16929used to scan the server's @code{directory} for maildirs. This
16930parameter is optional; the default is
16931@code{nnheader-directory-files-safe} if
16932@code{nnheader-directory-files-is-safe} is @code{nil}, and
16933@code{directory-files} otherwise.
16934(@code{nnheader-directory-files-is-safe} is checked only once when the
16935server is opened; if you want to check it each time the directory is
16936scanned, you'll have to provide your own function that does that.)
16937
16938@item get-new-mail
16939If non-@code{nil}, then after scanning for new mail in the group
16940maildirs themselves as usual, this server will also incorporate mail
16941the conventional Gnus way, from @code{mail-sources} according to
16942@code{nnmail-split-methods} or @code{nnmail-split-fancy}. The default
16943value is @code{nil}.
16944
16945Do @emph{not} use the same maildir both in @code{mail-sources} and as
16946an @code{nnmaildir} group. The results might happen to be useful, but
16947that would be by chance, not by design, and the results might be
16948different in the future. If your split rules create new groups,
16949remember to supply a @code{create-directory} server parameter.
16950@end table
16951
16952@subsubsection Group parameters
16953
16954@code{nnmaildir} uses several group parameters. It's safe to ignore
16955all this; the default behavior for @code{nnmaildir} is the same as the
16956default behavior for other mail back ends: articles are deleted after
16957one week, etc. Except for the expiry parameters, all this
16958functionality is unique to @code{nnmaildir}, so you can ignore it if
16959you're just trying to duplicate the behavior you already have with
16960another back end.
16961
16962If the value of any of these parameters is a vector, the first element
16963is evaluated as a Lisp form and the result is used, rather than the
16964original value. If the value is not a vector, the value itself is
16965evaluated as a Lisp form. (This is why these parameters use names
16966different from those of other, similar parameters supported by other
16967back ends: they have different, though similar, meanings.) (For
16968numbers, strings, @code{nil}, and @code{t}, you can ignore the
16969@code{eval} business again; for other values, remember to use an extra
16970quote and wrap the value in a vector when appropriate.)
16971
16972@table @code
16973@item expire-age
16974An integer specifying the minimum age, in seconds, of an article
16975before it will be expired, or the symbol @code{never} to specify that
16976articles should never be expired. If this parameter is not set,
16977@code{nnmaildir} falls back to the usual
16978@code{nnmail-expiry-wait}(@code{-function}) variables (the
16979@code{expiry-wait} group parameter overrides @code{nnmail-expiry-wait}
16980and makes @code{nnmail-expiry-wait-function} ineffective). If you
16981wanted a value of 3 days, you could use something like @code{[(* 3 24
1698260 60)]}; @code{nnmaildir} will evaluate the form and use the result.
16983An article's age is measured starting from the article file's
16984modification time. Normally, this is the same as the article's
16985delivery time, but editing an article makes it younger. Moving an
16986article (other than via expiry) may also make an article younger.
16987
16988@item expire-group
16989If this is set to a string such as a full Gnus group name, like
16990@example
16991"backend+server.address.string:group.name"
16992@end example
16993and if it is not the name of the same group that the parameter belongs
16994to, then articles will be moved to the specified group during expiry
16995before being deleted. @emph{If this is set to an @code{nnmaildir}
16996group, the article will be just as old in the destination group as it
16997was in the source group.} So be careful with @code{expire-age} in the
16998destination group. If this is set to the name of the same group that
16999the parameter belongs to, then the article is not expired at all. If
17000you use the vector form, the first element is evaluated once for each
17001article. So that form can refer to
17002@code{nnmaildir-article-file-name}, etc., to decide where to put the
17003article. @emph{Even if this parameter is not set, @code{nnmaildir}
17004does not fall back to the @code{expiry-target} group parameter or the
17005@code{nnmail-expiry-target} variable.}
17006
17007@item read-only
17008If this is set to @code{t}, @code{nnmaildir} will treat the articles
17009in this maildir as read-only. This means: articles are not renamed
17010from @file{new/} into @file{cur/}; articles are only found in
17011@file{new/}, not @file{cur/}; articles are never deleted; articles
17012cannot be edited. @file{new/} is expected to be a symlink to the
17013@file{new/} directory of another maildir---e.g., a system-wide mailbox
17014containing a mailing list of common interest. Everything in the
17015maildir outside @file{new/} is @emph{not} treated as read-only, so for
17016a shared mailbox, you do still need to set up your own maildir (or
17017have write permission to the shared mailbox); your maildir just won't
17018contain extra copies of the articles.
17019
17020@item directory-files
17021A function with the same interface as @code{directory-files}. It is
17022used to scan the directories in the maildir corresponding to this
17023group to find articles. The default is the function specified by the
17024server's @code{directory-files} parameter.
17025
17026@item distrust-Lines:
17027If non-@code{nil}, @code{nnmaildir} will always count the lines of an
17028article, rather than use the @code{Lines:} header field. If
17029@code{nil}, the header field will be used if present.
17030
17031@item always-marks
17032A list of mark symbols, such as @code{['(read expire)]}. Whenever
17033Gnus asks @code{nnmaildir} for article marks, @code{nnmaildir} will
17034say that all articles have these marks, regardless of whether the
17035marks stored in the filesystem say so. This is a proof-of-concept
17036feature that will probably be removed eventually; it ought to be done
17037in Gnus proper, or abandoned if it's not worthwhile.
17038
17039@item never-marks
17040A list of mark symbols, such as @code{['(tick expire)]}. Whenever
17041Gnus asks @code{nnmaildir} for article marks, @code{nnmaildir} will
17042say that no articles have these marks, regardless of whether the marks
17043stored in the filesystem say so. @code{never-marks} overrides
17044@code{always-marks}. This is a proof-of-concept feature that will
17045probably be removed eventually; it ought to be done in Gnus proper, or
17046abandoned if it's not worthwhile.
17047
17048@item nov-cache-size
17049An integer specifying the size of the @acronym{NOV} memory cache. To
17050speed things up, @code{nnmaildir} keeps @acronym{NOV} data in memory
17051for a limited number of articles in each group. (This is probably not
17052worthwhile, and will probably be removed in the future.) This
17053parameter's value is noticed only the first time a group is seen after
17054the server is opened---i.e., when you first start Gnus, typically.
17055The @acronym{NOV} cache is never resized until the server is closed
17056and reopened. The default is an estimate of the number of articles
17057that would be displayed in the summary buffer: a count of articles
17058that are either marked with @code{tick} or not marked with
17059@code{read}, plus a little extra.
17060@end table
17061
17062@subsubsection Article identification
17063Articles are stored in the @file{cur/} subdirectory of each maildir.
17064Each article file is named like @code{uniq:info}, where @code{uniq}
17065contains no colons. @code{nnmaildir} ignores, but preserves, the
17066@code{:info} part. (Other maildir readers typically use this part of
17067the filename to store marks.) The @code{uniq} part uniquely
17068identifies the article, and is used in various places in the
17069@file{.nnmaildir/} subdirectory of the maildir to store information
17070about the corresponding article. The full pathname of an article is
17071available in the variable @code{nnmaildir-article-file-name} after you
17072request the article in the summary buffer.
17073
17074@subsubsection NOV data
17075An article identified by @code{uniq} has its @acronym{NOV} data (used
17076to generate lines in the summary buffer) stored in
17077@code{.nnmaildir/nov/uniq}. There is no
17078@code{nnmaildir-generate-nov-databases} function. (There isn't much
17079need for it---an article's @acronym{NOV} data is updated automatically
17080when the article or @code{nnmail-extra-headers} has changed.) You can
17081force @code{nnmaildir} to regenerate the @acronym{NOV} data for a
17082single article simply by deleting the corresponding @acronym{NOV}
17083file, but @emph{beware}: this will also cause @code{nnmaildir} to
17084assign a new article number for this article, which may cause trouble
17085with @code{seen} marks, the Agent, and the cache.
17086
17087@subsubsection Article marks
17088An article identified by @code{uniq} is considered to have the mark
17089@code{flag} when the file @file{.nnmaildir/marks/flag/uniq} exists.
17090When Gnus asks @code{nnmaildir} for a group's marks, @code{nnmaildir}
17091looks for such files and reports the set of marks it finds. When Gnus
17092asks @code{nnmaildir} to store a new set of marks, @code{nnmaildir}
17093creates and deletes the corresponding files as needed. (Actually,
17094rather than create a new file for each mark, it just creates hard
17095links to @file{.nnmaildir/markfile}, to save inodes.)
17096
17097You can invent new marks by creating a new directory in
17098@file{.nnmaildir/marks/}. You can tar up a maildir and remove it from
17099your server, untar it later, and keep your marks. You can add and
17100remove marks yourself by creating and deleting mark files. If you do
17101this while Gnus is running and your @code{nnmaildir} server is open,
17102it's best to exit all summary buffers for @code{nnmaildir} groups and
17103type @kbd{s} in the group buffer first, and to type @kbd{g} or
17104@kbd{M-g} in the group buffer afterwards. Otherwise, Gnus might not
17105pick up the changes, and might undo them.
17106
17107
17108@node Mail Folders
17109@subsubsection Mail Folders
17110@cindex nnfolder
17111@cindex mbox folders
17112@cindex mail folders
17113
17114@code{nnfolder} is a back end for storing each mail group in a
17115separate file. Each file is in the standard Un*x mbox format.
17116@code{nnfolder} will add extra headers to keep track of article
17117numbers and arrival dates.
17118
17119@cindex self contained nnfolder servers
17120@cindex marks
17121When the marks file is used (which it is by default), @code{nnfolder}
17122servers have the property that you may backup them using @code{tar} or
17123similar, and later be able to restore them into Gnus (by adding the
17124proper @code{nnfolder} server) and have all your marks be preserved.
17125Marks for a group are usually stored in a file named as the mbox file
17126with @code{.mrk} concatenated to it (but see
17127@code{nnfolder-marks-file-suffix}) within the @code{nnfolder}
17128directory. Individual @code{nnfolder} groups are also possible to
17129backup, use @kbd{G m} to restore the group (after restoring the backup
17130into the @code{nnfolder} directory).
17131
17132Virtual server settings:
17133
17134@table @code
17135@item nnfolder-directory
17136@vindex nnfolder-directory
17137All the @code{nnfolder} mail boxes will be stored under this
17138directory. The default is the value of @code{message-directory}
17139(whose default is @file{~/Mail})
17140
17141@item nnfolder-active-file
17142@vindex nnfolder-active-file
17143The name of the active file. The default is @file{~/Mail/active}.
17144
17145@item nnfolder-newsgroups-file
17146@vindex nnfolder-newsgroups-file
17147The name of the group descriptions file. @xref{Newsgroups File
17148Format}. The default is @file{~/Mail/newsgroups}
17149
17150@item nnfolder-get-new-mail
17151@vindex nnfolder-get-new-mail
17152If non-@code{nil}, @code{nnfolder} will read incoming mail. The
17153default is @code{t}
17154
17155@item nnfolder-save-buffer-hook
17156@vindex nnfolder-save-buffer-hook
17157@cindex backup files
17158Hook run before saving the folders. Note that Emacs does the normal
17159backup renaming of files even with the @code{nnfolder} buffers. If
17160you wish to switch this off, you could say something like the
17161following in your @file{.emacs} file:
17162
17163@lisp
17164(defun turn-off-backup ()
17165 (set (make-local-variable 'backup-inhibited) t))
17166
17167(add-hook 'nnfolder-save-buffer-hook 'turn-off-backup)
17168@end lisp
17169
17170@item nnfolder-delete-mail-hook
17171@vindex nnfolder-delete-mail-hook
17172Hook run in a buffer narrowed to the message that is to be deleted.
17173This function can be used to copy the message to somewhere else, or to
17174extract some information from it before removing it.
17175
17176@item nnfolder-nov-is-evil
17177@vindex nnfolder-nov-is-evil
17178If non-@code{nil}, this back end will ignore any @acronym{NOV} files. The
17179default is @code{nil}.
17180
17181@item nnfolder-nov-file-suffix
17182@vindex nnfolder-nov-file-suffix
17183The extension for @acronym{NOV} files. The default is @file{.nov}.
17184
17185@item nnfolder-nov-directory
17186@vindex nnfolder-nov-directory
17187The directory where the @acronym{NOV} files should be stored. If
17188@code{nil}, @code{nnfolder-directory} is used.
17189
17190@item nnfolder-marks-is-evil
17191@vindex nnfolder-marks-is-evil
17192If non-@code{nil}, this back end will ignore any @sc{marks} files. The
17193default is @code{nil}.
17194
17195@item nnfolder-marks-file-suffix
17196@vindex nnfolder-marks-file-suffix
17197The extension for @sc{marks} files. The default is @file{.mrk}.
17198
17199@item nnfolder-marks-directory
17200@vindex nnfolder-marks-directory
17201The directory where the @sc{marks} files should be stored. If
17202@code{nil}, @code{nnfolder-directory} is used.
17203
17204@end table
17205
17206
17207@findex nnfolder-generate-active-file
17208@kindex M-x nnfolder-generate-active-file
17209If you have lots of @code{nnfolder}-like files you'd like to read with
17210@code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file}
17211command to make @code{nnfolder} aware of all likely files in
17212@code{nnfolder-directory}. This only works if you use long file names,
17213though.
17214
17215@node Comparing Mail Back Ends
17216@subsubsection Comparing Mail Back Ends
17217
17218First, just for terminology, the @dfn{back end} is the common word for a
17219low-level access method---a transport, if you will, by which something
17220is acquired. The sense is that one's mail has to come from somewhere,
17221and so selection of a suitable back end is required in order to get that
17222mail within spitting distance of Gnus.
17223
17224The same concept exists for Usenet itself: Though access to articles is
17225typically done by @acronym{NNTP} these days, once upon a midnight dreary, everyone
17226in the world got at Usenet by running a reader on the machine where the
17227articles lay (the machine which today we call an @acronym{NNTP} server), and
17228access was by the reader stepping into the articles' directory spool
17229area directly. One can still select between either the @code{nntp} or
17230@code{nnspool} back ends, to select between these methods, if one happens
17231actually to live on the server (or can see its spool directly, anyway,
17232via NFS).
17233
17234The goal in selecting a mail back end is to pick one which
17235simultaneously represents a suitable way of dealing with the original
17236format plus leaving mail in a form that is convenient to use in the
17237future. Here are some high and low points on each:
17238
17239@table @code
17240@item nnmbox
17241
17242UNIX systems have historically had a single, very common, and well-
17243defined format. All messages arrive in a single @dfn{spool file}, and
17244they are delineated by a line whose regular expression matches
17245@samp{^From_}. (My notational use of @samp{_} is to indicate a space,
17246to make it clear in this instance that this is not the RFC-specified
17247@samp{From:} header.) Because Emacs and therefore Gnus emanate
17248historically from the Unix environment, it is simplest if one does not
17249mess a great deal with the original mailbox format, so if one chooses
17250this back end, Gnus' primary activity in getting mail from the real spool
17251area to Gnus' preferred directory is simply to copy it, with no
17252(appreciable) format change in the process. It is the ``dumbest'' way
17253to move mail into availability in the Gnus environment. This makes it
17254fast to move into place, but slow to parse, when Gnus has to look at
17255what's where.
17256
17257@item nnbabyl
17258
17259Once upon a time, there was the DEC-10 and DEC-20, running operating
17260systems called TOPS and related things, and the usual (only?) mail
17261reading environment was a thing called Babyl. I don't know what format
17262was used for mail landing on the system, but Babyl had its own internal
17263format to which mail was converted, primarily involving creating a
17264spool-file-like entity with a scheme for inserting Babyl-specific
17265headers and status bits above the top of each message in the file.
17266Rmail was Emacs' first mail reader, it was written by Richard Stallman,
17267and Stallman came out of that TOPS/Babyl environment, so he wrote Rmail
17268to understand the mail files folks already had in existence. Gnus (and
17269VM, for that matter) continue to support this format because it's
17270perceived as having some good qualities in those mailer-specific
17271headers/status bits stuff. Rmail itself still exists as well, of
bc79f9ab
GM
17272course, and is still maintained within Emacs. Since Emacs 23, it
17273uses standard mbox format rather than Babyl.
4009494e
GM
17274
17275Both of the above forms leave your mail in a single file on your
17276file system, and they must parse that entire file each time you take a
17277look at your mail.
17278
17279@item nnml
17280
17281@code{nnml} is the back end which smells the most as though you were
17282actually operating with an @code{nnspool}-accessed Usenet system. (In
17283fact, I believe @code{nnml} actually derived from @code{nnspool} code,
17284lo these years ago.) One's mail is taken from the original spool file,
17285and is then cut up into individual message files, 1:1. It maintains a
17286Usenet-style active file (analogous to what one finds in an INN- or
17287CNews-based news system in (for instance) @file{/var/lib/news/active},
17288or what is returned via the @samp{NNTP LIST} verb) and also creates
17289@dfn{overview} files for efficient group entry, as has been defined for
17290@acronym{NNTP} servers for some years now. It is slower in mail-splitting,
17291due to the creation of lots of files, updates to the @code{nnml} active
17292file, and additions to overview files on a per-message basis, but it is
17293extremely fast on access because of what amounts to the indexing support
17294provided by the active file and overviews.
17295
17296@code{nnml} costs @dfn{inodes} in a big way; that is, it soaks up the
17297resource which defines available places in the file system to put new
17298files. Sysadmins take a dim view of heavy inode occupation within
17299tight, shared file systems. But if you live on a personal machine where
17300the file system is your own and space is not at a premium, @code{nnml}
17301wins big.
17302
17303It is also problematic using this back end if you are living in a
17304FAT16-based Windows world, since much space will be wasted on all these
17305tiny files.
17306
17307@item nnmh
17308
17309The Rand MH mail-reading system has been around UNIX systems for a very
17310long time; it operates by splitting one's spool file of messages into
17311individual files, but with little or no indexing support---@code{nnmh}
17312is considered to be semantically equivalent to ``@code{nnml} without
17313active file or overviews''. This is arguably the worst choice, because
17314one gets the slowness of individual file creation married to the
17315slowness of access parsing when learning what's new in one's groups.
17316
17317@item nnfolder
17318
17319Basically the effect of @code{nnfolder} is @code{nnmbox} (the first
17320method described above) on a per-group basis. That is, @code{nnmbox}
17321itself puts @emph{all} one's mail in one file; @code{nnfolder} provides a
17322little bit of optimization to this so that each of one's mail groups has
17323a Unix mail box file. It's faster than @code{nnmbox} because each group
17324can be parsed separately, and still provides the simple Unix mail box
17325format requiring minimal effort in moving the mail around. In addition,
17326it maintains an ``active'' file making it much faster for Gnus to figure
17327out how many messages there are in each separate group.
17328
17329If you have groups that are expected to have a massive amount of
17330messages, @code{nnfolder} is not the best choice, but if you receive
17331only a moderate amount of mail, @code{nnfolder} is probably the most
17332friendly mail back end all over.
17333
17334@item nnmaildir
17335
17336For configuring expiry and other things, @code{nnmaildir} uses
17337incompatible group parameters, slightly different from those of other
17338mail back ends.
17339
17340@code{nnmaildir} is largely similar to @code{nnml}, with some notable
17341differences. Each message is stored in a separate file, but the
17342filename is unrelated to the article number in Gnus. @code{nnmaildir}
17343also stores the equivalent of @code{nnml}'s overview files in one file
17344per article, so it uses about twice as many inodes as @code{nnml}. (Use
17345@code{df -i} to see how plentiful your inode supply is.) If this slows
17346you down or takes up very much space, consider switching to
17347@uref{http://www.namesys.com/, ReiserFS} or another non-block-structured
17348file system.
17349
17350Since maildirs don't require locking for delivery, the maildirs you use
17351as groups can also be the maildirs your mail is directly delivered to.
17352This means you can skip Gnus' mail splitting if your mail is already
17353organized into different mailboxes during delivery. A @code{directory}
17354entry in @code{mail-sources} would have a similar effect, but would
17355require one set of mailboxes for spooling deliveries (in mbox format,
17356thus damaging message bodies), and another set to be used as groups (in
17357whatever format you like). A maildir has a built-in spool, in the
17358@code{new/} subdirectory. Beware that currently, mail moved from
17359@code{new/} to @code{cur/} instead of via mail splitting will not
17360undergo treatment such as duplicate checking.
17361
17362@code{nnmaildir} stores article marks for a given group in the
17363corresponding maildir, in a way designed so that it's easy to manipulate
17364them from outside Gnus. You can tar up a maildir, unpack it somewhere
17365else, and still have your marks. @code{nnml} also stores marks, but
17366it's not as easy to work with them from outside Gnus as with
17367@code{nnmaildir}.
17368
17369@code{nnmaildir} uses a significant amount of memory to speed things up.
17370(It keeps in memory some of the things that @code{nnml} stores in files
17371and that @code{nnmh} repeatedly parses out of message files.) If this
17372is a problem for you, you can set the @code{nov-cache-size} group
17373parameter to something small (0 would probably not work, but 1 probably
17374would) to make it use less memory. This caching will probably be
17375removed in the future.
17376
17377Startup is likely to be slower with @code{nnmaildir} than with other
17378back ends. Everything else is likely to be faster, depending in part
17379on your file system.
17380
17381@code{nnmaildir} does not use @code{nnoo}, so you cannot use @code{nnoo}
17382to write an @code{nnmaildir}-derived back end.
17383
17384@end table
17385
17386
17387@node Browsing the Web
17388@section Browsing the Web
17389@cindex web
17390@cindex browsing the web
17391@cindex www
17392@cindex http
17393
17394Web-based discussion forums are getting more and more popular. On many
17395subjects, the web-based forums have become the most important forums,
17396eclipsing the importance of mailing lists and news groups. The reason
17397is easy to understand---they are friendly to new users; you just point
17398and click, and there's the discussion. With mailing lists, you have to
17399go through a cumbersome subscription procedure, and most people don't
17400even know what a news group is.
17401
17402The problem with this scenario is that web browsers are not very good at
17403being newsreaders. They do not keep track of what articles you've read;
17404they do not allow you to score on subjects you're interested in; they do
17405not allow off-line browsing; they require you to click around and drive
17406you mad in the end.
17407
17408So---if web browsers suck at reading discussion forums, why not use Gnus
17409to do it instead?
17410
17411Gnus has been getting a bit of a collection of back ends for providing
17412interfaces to these sources.
17413
17414@menu
17415* Archiving Mail::
17416* Web Searches:: Creating groups from articles that match a string.
17417* Slashdot:: Reading the Slashdot comments.
17418* Ultimate:: The Ultimate Bulletin Board systems.
17419* Web Archive:: Reading mailing list archived on web.
17420* RSS:: Reading RDF site summary.
17421* Customizing W3:: Doing stuff to Emacs/W3 from Gnus.
17422@end menu
17423
17424All the web sources require Emacs/W3 and the url library or those
17425alternatives to work.
17426
17427The main caveat with all these web sources is that they probably won't
17428work for a very long time. Gleaning information from the @acronym{HTML} data
17429is guesswork at best, and when the layout is altered, the Gnus back end
17430will fail. If you have reasonably new versions of these back ends,
17431though, you should be ok.
17432
17433One thing all these Web methods have in common is that the Web sources
17434are often down, unavailable or just plain too slow to be fun. In those
17435cases, it makes a lot of sense to let the Gnus Agent (@pxref{Gnus
17436Unplugged}) handle downloading articles, and then you can read them at
17437leisure from your local disk. No more World Wide Wait for you.
17438
17439@node Archiving Mail
17440@subsection Archiving Mail
17441@cindex archiving mail
17442@cindex backup of mail
17443
17444Some of the back ends, notably @code{nnml}, @code{nnfolder}, and
17445@code{nnmaildir}, now actually store the article marks with each group.
17446For these servers, archiving and restoring a group while preserving
17447marks is fairly simple.
17448
17449(Preserving the group level and group parameters as well still
17450requires ritual dancing and sacrifices to the @file{.newsrc.eld} deity
17451though.)
17452
17453To archive an entire @code{nnml}, @code{nnfolder}, or @code{nnmaildir}
17454server, take a recursive copy of the server directory. There is no need
17455to shut down Gnus, so archiving may be invoked by @code{cron} or
17456similar. You restore the data by restoring the directory tree, and
17457adding a server definition pointing to that directory in Gnus. The
17458@ref{Article Backlog}, @ref{Asynchronous Fetching} and other things
17459might interfere with overwriting data, so you may want to shut down Gnus
17460before you restore the data.
17461
17462It is also possible to archive individual @code{nnml},
17463@code{nnfolder}, or @code{nnmaildir} groups, while preserving marks.
17464For @code{nnml} or @code{nnmaildir}, you copy all files in the group's
17465directory. For @code{nnfolder} you need to copy both the base folder
17466file itself (@file{FOO}, say), and the marks file (@file{FOO.mrk} in
17467this example). Restoring the group is done with @kbd{G m} from the Group
17468buffer. The last step makes Gnus notice the new directory.
17469@code{nnmaildir} notices the new directory automatically, so @kbd{G m}
17470is unnecessary in that case.
17471
17472@node Web Searches
17473@subsection Web Searches
17474@cindex nnweb
17475@cindex Google
17476@cindex dejanews
17477@cindex gmane
17478@cindex Usenet searches
17479@cindex searching the Usenet
17480
17481It's, like, too neat to search the Usenet for articles that match a
17482string, but it, like, totally @emph{sucks}, like, totally, to use one of
17483those, like, Web browsers, and you, like, have to, rilly, like, look at
17484the commercials, so, like, with Gnus you can do @emph{rad}, rilly,
17485searches without having to use a browser.
17486
17487The @code{nnweb} back end allows an easy interface to the mighty search
17488engine. You create an @code{nnweb} group, enter a search pattern, and
17489then enter the group and read the articles like you would any normal
17490group. The @kbd{G w} command in the group buffer (@pxref{Foreign
17491Groups}) will do this in an easy-to-use fashion.
17492
17493@code{nnweb} groups don't really lend themselves to being solid
17494groups---they have a very fleeting idea of article numbers. In fact,
17495each time you enter an @code{nnweb} group (not even changing the search
17496pattern), you are likely to get the articles ordered in a different
17497manner. Not even using duplicate suppression (@pxref{Duplicate
17498Suppression}) will help, since @code{nnweb} doesn't even know the
17499@code{Message-ID} of the articles before reading them using some search
17500engines (Google, for instance). The only possible way to keep track
17501of which articles you've read is by scoring on the @code{Date}
17502header---mark all articles posted before the last date you read the
17503group as read.
17504
17505If the search engine changes its output substantially, @code{nnweb}
17506won't be able to parse it and will fail. One could hardly fault the Web
01c52d31 17507providers if they were to do this---their @emph{raison d'@^etre} is to
4009494e
GM
17508make money off of advertisements, not to provide services to the
17509community. Since @code{nnweb} washes the ads off all the articles, one
17510might think that the providers might be somewhat miffed. We'll see.
17511
17512You must have the @code{url} and @code{W3} package or those alternatives
17513(try @code{customize-group} on the @samp{mm-url} variable group)
17514installed to be able to use @code{nnweb}.
17515
17516Virtual server variables:
17517
17518@table @code
17519@item nnweb-type
17520@vindex nnweb-type
17521What search engine type is being used. The currently supported types
17522are @code{google}, @code{dejanews}, and @code{gmane}. Note that
17523@code{dejanews} is an alias to @code{google}.
17524
17525@item nnweb-search
17526@vindex nnweb-search
17527The search string to feed to the search engine.
17528
17529@item nnweb-max-hits
17530@vindex nnweb-max-hits
17531Advisory maximum number of hits per search to display. The default is
17532999.
17533
17534@item nnweb-type-definition
17535@vindex nnweb-type-definition
17536Type-to-definition alist. This alist says what @code{nnweb} should do
17537with the various search engine types. The following elements must be
17538present:
17539
17540@table @code
17541@item article
17542Function to decode the article and provide something that Gnus
17543understands.
17544
17545@item map
17546Function to create an article number to message header and URL alist.
17547
17548@item search
17549Function to send the search string to the search engine.
17550
17551@item address
17552The address the aforementioned function should send the search string
17553to.
17554
17555@item id
17556Format string URL to fetch an article by @code{Message-ID}.
17557@end table
17558
17559@end table
17560
17561
17562@node Slashdot
17563@subsection Slashdot
17564@cindex Slashdot
17565@cindex nnslashdot
17566
17567@uref{http://slashdot.org/, Slashdot} is a popular news site, with
17568lively discussion following the news articles. @code{nnslashdot} will
17569let you read this forum in a convenient manner.
17570
17571The easiest way to read this source is to put something like the
17572following in your @file{~/.gnus.el} file:
17573
17574@lisp
17575(setq gnus-secondary-select-methods
17576 '((nnslashdot "")))
17577@end lisp
17578
17579This will make Gnus query the @code{nnslashdot} back end for new comments
17580and groups. The @kbd{F} command will subscribe each new news article as
17581a new Gnus group, and you can read the comments by entering these
17582groups. (Note that the default subscription method is to subscribe new
17583groups as zombies. Other methods are available (@pxref{Subscription
17584Methods}).
17585
17586If you want to remove an old @code{nnslashdot} group, the @kbd{G DEL}
17587command is the most handy tool (@pxref{Foreign Groups}).
17588
17589When following up to @code{nnslashdot} comments (or posting new
17590comments), some light @acronym{HTML}izations will be performed. In
17591particular, text quoted with @samp{> } will be quoted with
17592@samp{blockquote} instead, and signatures will have @samp{br} added to
17593the end of each line. Other than that, you can just write @acronym{HTML}
17594directly into the message buffer. Note that Slashdot filters out some
17595@acronym{HTML} forms.
17596
17597The following variables can be altered to change its behavior:
17598
17599@table @code
17600@item nnslashdot-threaded
17601Whether @code{nnslashdot} should display threaded groups or not. The
17602default is @code{t}. To be able to display threads, @code{nnslashdot}
17603has to retrieve absolutely all comments in a group upon entry. If a
17604threaded display is not required, @code{nnslashdot} will only retrieve
17605the comments that are actually wanted by the user. Threading is nicer,
17606but much, much slower than unthreaded.
17607
17608@item nnslashdot-login-name
17609@vindex nnslashdot-login-name
17610The login name to use when posting.
17611
17612@item nnslashdot-password
17613@vindex nnslashdot-password
17614The password to use when posting.
17615
17616@item nnslashdot-directory
17617@vindex nnslashdot-directory
17618Where @code{nnslashdot} will store its files. The default is
17619@file{~/News/slashdot/}.
17620
17621@item nnslashdot-active-url
17622@vindex nnslashdot-active-url
17623The @acronym{URL} format string that will be used to fetch the
17624information on news articles and comments. The default is@*
17625@samp{http://slashdot.org/search.pl?section=&min=%d}.
17626
17627@item nnslashdot-comments-url
17628@vindex nnslashdot-comments-url
17629The @acronym{URL} format string that will be used to fetch comments.
17630
17631@item nnslashdot-article-url
17632@vindex nnslashdot-article-url
17633The @acronym{URL} format string that will be used to fetch the news
17634article. The default is
17635@samp{http://slashdot.org/article.pl?sid=%s&mode=nocomment}.
17636
17637@item nnslashdot-threshold
17638@vindex nnslashdot-threshold
17639The score threshold. The default is -1.
17640
17641@item nnslashdot-group-number
17642@vindex nnslashdot-group-number
17643The number of old groups, in addition to the ten latest, to keep
17644updated. The default is 0.
17645
17646@end table
17647
17648
17649
17650@node Ultimate
17651@subsection Ultimate
17652@cindex nnultimate
17653@cindex Ultimate Bulletin Board
17654
17655@uref{http://www.ultimatebb.com/, The Ultimate Bulletin Board} is
17656probably the most popular Web bulletin board system used. It has a
17657quite regular and nice interface, and it's possible to get the
17658information Gnus needs to keep groups updated.
17659
17660The easiest way to get started with @code{nnultimate} is to say
17661something like the following in the group buffer: @kbd{B nnultimate RET
17662http://www.tcj.com/messboard/ubbcgi/ RET}. (Substitute the @acronym{URL}
17663(not including @samp{Ultimate.cgi} or the like at the end) for a forum
17664you're interested in; there's quite a list of them on the Ultimate web
17665site.) Then subscribe to the groups you're interested in from the
17666server buffer, and read them from the group buffer.
17667
17668The following @code{nnultimate} variables can be altered:
17669
17670@table @code
17671@item nnultimate-directory
17672@vindex nnultimate-directory
17673The directory where @code{nnultimate} stores its files. The default is@*
17674@file{~/News/ultimate/}.
17675@end table
17676
17677
17678@node Web Archive
17679@subsection Web Archive
17680@cindex nnwarchive
17681@cindex Web Archive
17682
17683Some mailing lists only have archives on Web servers, such as
17684@uref{http://www.egroups.com/} and
17685@uref{http://www.mail-archive.com/}. It has a quite regular and nice
17686interface, and it's possible to get the information Gnus needs to keep
17687groups updated.
17688
17689@findex gnus-group-make-warchive-group
17690The easiest way to get started with @code{nnwarchive} is to say
17691something like the following in the group buffer: @kbd{M-x
17692gnus-group-make-warchive-group RET @var{an_egroup} RET egroups RET
17693www.egroups.com RET @var{your@@email.address} RET}. (Substitute the
17694@var{an_egroup} with the mailing list you subscribed, the
17695@var{your@@email.address} with your email address.), or to browse the
17696back end by @kbd{B nnwarchive RET mail-archive RET}.
17697
17698The following @code{nnwarchive} variables can be altered:
17699
17700@table @code
17701@item nnwarchive-directory
17702@vindex nnwarchive-directory
17703The directory where @code{nnwarchive} stores its files. The default is@*
17704@file{~/News/warchive/}.
17705
17706@item nnwarchive-login
17707@vindex nnwarchive-login
17708The account name on the web server.
17709
17710@item nnwarchive-passwd
17711@vindex nnwarchive-passwd
17712The password for your account on the web server.
17713@end table
17714
17715@node RSS
17716@subsection RSS
17717@cindex nnrss
17718@cindex RSS
17719
17720Some web sites have an RDF Site Summary (@acronym{RSS}).
17721@acronym{RSS} is a format for summarizing headlines from news related
17722sites (such as BBC or CNN). But basically anything list-like can be
17723presented as an @acronym{RSS} feed: weblogs, changelogs or recent
17724changes to a wiki (e.g. @url{http://cliki.net/recent-changes.rdf}).
17725
17726@acronym{RSS} has a quite regular and nice interface, and it's
17727possible to get the information Gnus needs to keep groups updated.
17728
17729Note: you had better use Emacs which supports the @code{utf-8} coding
17730system because @acronym{RSS} uses UTF-8 for encoding non-@acronym{ASCII}
17731text by default. It is also used by default for non-@acronym{ASCII}
17732group names.
17733
17734@kindex G R (Group)
17735Use @kbd{G R} from the group buffer to subscribe to a feed---you will be
17736prompted for the location, the title and the description of the feed.
17737The title, which allows any characters, will be used for the group name
17738and the name of the group data file. The description can be omitted.
17739
17740An easy way to get started with @code{nnrss} is to say something like
17741the following in the group buffer: @kbd{B nnrss RET RET y}, then
17742subscribe to groups.
17743
17744The @code{nnrss} back end saves the group data file in
17745@code{nnrss-directory} (see below) for each @code{nnrss} group. File
17746names containing non-@acronym{ASCII} characters will be encoded by the
17747coding system specified with the @code{nnmail-pathname-coding-system}
26b9f88d
MB
17748variable or other. Also @xref{Non-ASCII Group Names}, for more
17749information.
4009494e
GM
17750
17751The @code{nnrss} back end generates @samp{multipart/alternative}
17752@acronym{MIME} articles in which each contains a @samp{text/plain} part
17753and a @samp{text/html} part.
17754
17755@cindex OPML
17756You can also use the following commands to import and export your
17757subscriptions from a file in @acronym{OPML} format (Outline Processor
17758Markup Language).
17759
17760@defun nnrss-opml-import file
17761Prompt for an @acronym{OPML} file, and subscribe to each feed in the
17762file.
17763@end defun
17764
17765@defun nnrss-opml-export
17766Write your current @acronym{RSS} subscriptions to a buffer in
17767@acronym{OPML} format.
17768@end defun
17769
17770The following @code{nnrss} variables can be altered:
17771
17772@table @code
17773@item nnrss-directory
17774@vindex nnrss-directory
17775The directory where @code{nnrss} stores its files. The default is
17776@file{~/News/rss/}.
17777
17778@item nnrss-file-coding-system
17779@vindex nnrss-file-coding-system
17780The coding system used when reading and writing the @code{nnrss} groups
17781data files. The default is the value of
17782@code{mm-universal-coding-system} (which defaults to @code{emacs-mule}
17783in Emacs or @code{escape-quoted} in XEmacs).
17784
01c52d31
MB
17785@item nnrss-ignore-article-fields
17786@vindex nnrss-ignore-article-fields
17787Some feeds update constantly article fields during their publications,
17788e.g. to indicate the number of comments. However, if there is
17789a difference between the local article and the distant one, the latter
17790is considered to be new. To avoid this and discard some fields, set this
17791variable to the list of fields to be ignored. The default is
17792@code{'(slash:comments)}.
17793
4009494e
GM
17794@item nnrss-use-local
17795@vindex nnrss-use-local
17796@findex nnrss-generate-download-script
17797If you set @code{nnrss-use-local} to @code{t}, @code{nnrss} will read
17798the feeds from local files in @code{nnrss-directory}. You can use
17799the command @code{nnrss-generate-download-script} to generate a
17800download script using @command{wget}.
17801
17802@item nnrss-wash-html-in-text-plain-parts
17803Non-@code{nil} means that @code{nnrss} renders text in @samp{text/plain}
17804parts as @acronym{HTML}. The function specified by the
17805@code{mm-text-html-renderer} variable (@pxref{Display Customization,
17806,Display Customization, emacs-mime, The Emacs MIME Manual}) will be used
17807to render text. If it is @code{nil}, which is the default, text will
17808simply be folded. Leave it @code{nil} if you prefer to see
17809@samp{text/html} parts.
17810@end table
17811
17812The following code may be helpful, if you want to show the description in
17813the summary buffer.
17814
17815@lisp
17816(add-to-list 'nnmail-extra-headers nnrss-description-field)
17817(setq gnus-summary-line-format "%U%R%z%I%(%[%4L: %-15,15f%]%) %s%uX\n")
17818
17819(defun gnus-user-format-function-X (header)
17820 (let ((descr
17821 (assq nnrss-description-field (mail-header-extra header))))
17822 (if descr (concat "\n\t" (cdr descr)) "")))
17823@end lisp
17824
17825The following code may be useful to open an nnrss url directly from the
17826summary buffer.
17827
17828@lisp
17829(require 'browse-url)
17830
01c52d31 17831(defun browse-nnrss-url (arg)
4009494e
GM
17832 (interactive "p")
17833 (let ((url (assq nnrss-url-field
17834 (mail-header-extra
17835 (gnus-data-header
17836 (assq (gnus-summary-article-number)
17837 gnus-newsgroup-data))))))
17838 (if url
17839 (progn
17840 (browse-url (cdr url))
17841 (gnus-summary-mark-as-read-forward 1))
17842 (gnus-summary-scroll-up arg))))
17843
17844(eval-after-load "gnus"
17845 #'(define-key gnus-summary-mode-map
17846 (kbd "<RET>") 'browse-nnrss-url))
17847(add-to-list 'nnmail-extra-headers nnrss-url-field)
17848@end lisp
17849
9b3ebcb6 17850Even if you have added @samp{text/html} to the
4009494e
GM
17851@code{mm-discouraged-alternatives} variable (@pxref{Display
17852Customization, ,Display Customization, emacs-mime, The Emacs MIME
17853Manual}) since you don't want to see @acronym{HTML} parts, it might be
17854more useful especially in @code{nnrss} groups to display
17855@samp{text/html} parts. Here's an example of setting
17856@code{mm-discouraged-alternatives} as a group parameter (@pxref{Group
17857Parameters}) in order to display @samp{text/html} parts only in
17858@code{nnrss} groups:
17859
17860@lisp
17861;; @r{Set the default value of @code{mm-discouraged-alternatives}.}
17862(eval-after-load "gnus-sum"
17863 '(add-to-list
17864 'gnus-newsgroup-variables
17865 '(mm-discouraged-alternatives
17866 . '("text/html" "image/.*"))))
17867
17868;; @r{Display @samp{text/html} parts in @code{nnrss} groups.}
17869(add-to-list
17870 'gnus-parameters
17871 '("\\`nnrss:" (mm-discouraged-alternatives nil)))
17872@end lisp
17873
17874
17875@node Customizing W3
17876@subsection Customizing W3
17877@cindex W3
17878@cindex html
17879@cindex url
17880@cindex Netscape
17881
17882Gnus uses the url library to fetch web pages and Emacs/W3 (or those
17883alternatives) to display web pages. Emacs/W3 is documented in its own
17884manual, but there are some things that may be more relevant for Gnus
17885users.
17886
17887For instance, a common question is how to make Emacs/W3 follow links
17888using the @code{browse-url} functions (which will call some external web
17889browser like Netscape). Here's one way:
17890
17891@lisp
17892(eval-after-load "w3"
17893 '(progn
17894 (fset 'w3-fetch-orig (symbol-function 'w3-fetch))
17895 (defun w3-fetch (&optional url target)
17896 (interactive (list (w3-read-url-with-default)))
17897 (if (eq major-mode 'gnus-article-mode)
17898 (browse-url url)
17899 (w3-fetch-orig url target)))))
17900@end lisp
17901
17902Put that in your @file{.emacs} file, and hitting links in W3-rendered
17903@acronym{HTML} in the Gnus article buffers will use @code{browse-url} to
17904follow the link.
17905
17906
17907@node IMAP
17908@section IMAP
17909@cindex nnimap
17910@cindex @acronym{IMAP}
17911
17912@acronym{IMAP} is a network protocol for reading mail (or news, or @dots{}),
17913think of it as a modernized @acronym{NNTP}. Connecting to a @acronym{IMAP}
17914server is much similar to connecting to a news server, you just
17915specify the network address of the server.
17916
17917@acronym{IMAP} has two properties. First, @acronym{IMAP} can do
17918everything that @acronym{POP} can, it can hence be viewed as a
17919@acronym{POP++}. Secondly, @acronym{IMAP} is a mail storage protocol,
17920similar to @acronym{NNTP} being a news storage protocol---however,
17921@acronym{IMAP} offers more features than @acronym{NNTP} because news
17922is more or less read-only whereas mail is read-write.
17923
17924If you want to use @acronym{IMAP} as a @acronym{POP++}, use an imap
17925entry in @code{mail-sources}. With this, Gnus will fetch mails from
17926the @acronym{IMAP} server and store them on the local disk. This is
17927not the usage described in this section---@xref{Mail Sources}.
17928
17929If you want to use @acronym{IMAP} as a mail storage protocol, use an nnimap
17930entry in @code{gnus-secondary-select-methods}. With this, Gnus will
17931manipulate mails stored on the @acronym{IMAP} server. This is the kind of
17932usage explained in this section.
17933
17934A server configuration in @file{~/.gnus.el} with a few @acronym{IMAP}
17935servers might look something like the following. (Note that for
17936@acronym{TLS}/@acronym{SSL}, you need external programs and libraries,
17937see below.)
17938
17939@lisp
17940(setq gnus-secondary-select-methods
17941 '((nnimap "simpleserver") ; @r{no special configuration}
17942 ; @r{perhaps a ssh port forwarded server:}
17943 (nnimap "dolk"
17944 (nnimap-address "localhost")
17945 (nnimap-server-port 1430))
17946 ; @r{a UW server running on localhost}
17947 (nnimap "barbar"
17948 (nnimap-server-port 143)
17949 (nnimap-address "localhost")
17950 (nnimap-list-pattern ("INBOX" "mail/*")))
17951 ; @r{anonymous public cyrus server:}
17952 (nnimap "cyrus.andrew.cmu.edu"
17953 (nnimap-authenticator anonymous)
17954 (nnimap-list-pattern "archive.*")
17955 (nnimap-stream network))
17956 ; @r{a ssl server on a non-standard port:}
17957 (nnimap "vic20"
17958 (nnimap-address "vic20.somewhere.com")
17959 (nnimap-server-port 9930)
17960 (nnimap-stream ssl))))
17961@end lisp
17962
17963After defining the new server, you can subscribe to groups on the
17964server using normal Gnus commands such as @kbd{U} in the Group Buffer
17965(@pxref{Subscription Commands}) or via the Server Buffer
17966(@pxref{Server Buffer}).
17967
17968The following variables can be used to create a virtual @code{nnimap}
17969server:
17970
17971@table @code
17972
17973@item nnimap-address
17974@vindex nnimap-address
17975
17976The address of the remote @acronym{IMAP} server. Defaults to the virtual
17977server name if not specified.
17978
17979@item nnimap-server-port
17980@vindex nnimap-server-port
17981Port on server to contact. Defaults to port 143, or 993 for @acronym{TLS}/@acronym{SSL}.
17982
17983Note that this should be an integer, example server specification:
17984
17985@lisp
17986(nnimap "mail.server.com"
17987 (nnimap-server-port 4711))
17988@end lisp
17989
17990@item nnimap-list-pattern
17991@vindex nnimap-list-pattern
17992String or list of strings of mailboxes to limit available groups to.
17993This is used when the server has very many mailboxes and you're only
17994interested in a few---some servers export your home directory via
17995@acronym{IMAP}, you'll probably want to limit the mailboxes to those in
17996@file{~/Mail/*} then.
17997
17998The string can also be a cons of REFERENCE and the string as above, what
17999REFERENCE is used for is server specific, but on the University of
18000Washington server it's a directory that will be concatenated with the
18001mailbox.
18002
18003Example server specification:
18004
18005@lisp
18006(nnimap "mail.server.com"
18007 (nnimap-list-pattern ("INBOX" "Mail/*" "alt.sex.*"
18008 ("~friend/Mail/" . "list/*"))))
18009@end lisp
18010
18011@item nnimap-stream
18012@vindex nnimap-stream
18013The type of stream used to connect to your server. By default, nnimap
18014will detect and automatically use all of the below, with the exception
18015of @acronym{TLS}/@acronym{SSL}. (@acronym{IMAP} over
18016@acronym{TLS}/@acronym{SSL} is being replaced by STARTTLS, which can
18017be automatically detected, but it's not widely deployed yet.)
18018
18019Example server specification:
18020
18021@lisp
18022(nnimap "mail.server.com"
18023 (nnimap-stream ssl))
18024@end lisp
18025
18026Please note that the value of @code{nnimap-stream} is a symbol!
18027
18028@itemize @bullet
18029@item
18030@dfn{gssapi:} Connect with GSSAPI (usually Kerberos 5). Requires the
18031@samp{gsasl} or @samp{imtest} program.
18032@item
18033@dfn{kerberos4:} Connect with Kerberos 4. Requires the @samp{imtest} program.
18034@item
18035@dfn{starttls:} Connect via the STARTTLS extension (similar to
18036@acronym{TLS}/@acronym{SSL}). Requires the external library @samp{starttls.el} and program
18037@samp{starttls}.
18038@item
18039@dfn{tls:} Connect through @acronym{TLS}. Requires GNUTLS (the program
18040@samp{gnutls-cli}).
18041@item
18042@dfn{ssl:} Connect through @acronym{SSL}. Requires OpenSSL (the program
18043@samp{openssl}) or SSLeay (@samp{s_client}).
18044@item
18045@dfn{shell:} Use a shell command to start @acronym{IMAP} connection.
18046@item
18047@dfn{network:} Plain, TCP/IP network connection.
18048@end itemize
18049
18050@vindex imap-kerberos4-program
18051The @samp{imtest} program is shipped with Cyrus IMAPD. If you're
18052using @samp{imtest} from Cyrus IMAPD < 2.0.14 (which includes version
180531.5.x and 1.6.x) you need to frob @code{imap-process-connection-type}
18054to make @code{imap.el} use a pty instead of a pipe when communicating
18055with @samp{imtest}. You will then suffer from a line length
18056restrictions on @acronym{IMAP} commands, which might make Gnus seem to hang
18057indefinitely if you have many articles in a mailbox. The variable
18058@code{imap-kerberos4-program} contain parameters to pass to the imtest
18059program.
18060
18061For @acronym{TLS} connection, the @code{gnutls-cli} program from GNUTLS is
18062needed. It is available from
18063@uref{http://www.gnu.org/software/gnutls/}.
18064
18065@vindex imap-gssapi-program
18066This parameter specifies a list of command lines that invoke a GSSAPI
18067authenticated @acronym{IMAP} stream in a subshell. They are tried
18068sequentially until a connection is made, or the list has been
18069exhausted. By default, @samp{gsasl} from GNU SASL, available from
18070@uref{http://www.gnu.org/software/gsasl/}, and the @samp{imtest}
18071program from Cyrus IMAPD (see @code{imap-kerberos4-program}), are
18072tried.
18073
18074@vindex imap-ssl-program
18075For @acronym{SSL} connections, the OpenSSL program is available from
18076@uref{http://www.openssl.org/}. OpenSSL was formerly known as SSLeay,
18077and nnimap support it too---although the most recent versions of
18078SSLeay, 0.9.x, are known to have serious bugs making it
18079useless. Earlier versions, especially 0.8.x, of SSLeay are known to
18080work. The variable @code{imap-ssl-program} contain parameters to pass
18081to OpenSSL/SSLeay.
18082
18083@vindex imap-shell-program
18084@vindex imap-shell-host
01c52d31
MB
18085For @acronym{IMAP} connections using the @code{shell} stream, the
18086variable @code{imap-shell-program} specify what program to call. Make
18087sure nothing is interfering with the output of the program, e.g., don't
18088forget to redirect the error output to the void.
4009494e
GM
18089
18090@item nnimap-authenticator
18091@vindex nnimap-authenticator
18092
18093The authenticator used to connect to the server. By default, nnimap
18094will use the most secure authenticator your server is capable of.
18095
18096Example server specification:
18097
18098@lisp
18099(nnimap "mail.server.com"
18100 (nnimap-authenticator anonymous))
18101@end lisp
18102
18103Please note that the value of @code{nnimap-authenticator} is a symbol!
18104
18105@itemize @bullet
18106@item
18107@dfn{gssapi:} GSSAPI (usually kerberos 5) authentication. Requires
18108external program @code{gsasl} or @code{imtest}.
18109@item
18110@dfn{kerberos4:} Kerberos 4 authentication. Requires external program
18111@code{imtest}.
18112@item
18113@dfn{digest-md5:} Encrypted username/password via DIGEST-MD5. Requires
18114external library @code{digest-md5.el}.
18115@item
18116@dfn{cram-md5:} Encrypted username/password via CRAM-MD5.
18117@item
18118@dfn{login:} Plain-text username/password via LOGIN.
18119@item
18120@dfn{anonymous:} Login as ``anonymous'', supplying your email address as password.
18121@end itemize
18122
18123@item nnimap-expunge-on-close
18124@cindex expunging
18125@vindex nnimap-expunge-on-close
18126Unlike Parmenides the @acronym{IMAP} designers have decided things that
18127don't exist actually do exist. More specifically, @acronym{IMAP} has
18128this concept of marking articles @code{Deleted} which doesn't actually
18129delete them, and this (marking them @code{Deleted}, that is) is what
18130nnimap does when you delete an article in Gnus (with @kbd{B DEL} or
18131similar).
18132
18133Since the articles aren't really removed when we mark them with the
18134@code{Deleted} flag we'll need a way to actually delete them. Feel like
18135running in circles yet?
18136
18137Traditionally, nnimap has removed all articles marked as @code{Deleted}
18138when closing a mailbox but this is now configurable by this server
18139variable.
18140
18141The possible options are:
18142
18143@table @code
18144
18145@item always
18146The default behavior, delete all articles marked as ``Deleted'' when
18147closing a mailbox.
18148@item never
18149Never actually delete articles. Currently there is no way of showing
18150the articles marked for deletion in nnimap, but other @acronym{IMAP} clients
18151may allow you to do this. If you ever want to run the EXPUNGE command
18152manually, @xref{Expunging mailboxes}.
18153@item ask
18154When closing mailboxes, nnimap will ask if you wish to expunge deleted
18155articles or not.
18156
18157@end table
18158
18159@item nnimap-importantize-dormant
18160@vindex nnimap-importantize-dormant
18161
18162If non-@code{nil} (the default), marks dormant articles as ticked (as
18163well), for other @acronym{IMAP} clients. Within Gnus, dormant articles will
18164naturally still (only) be marked as dormant. This is to make dormant
18165articles stand out, just like ticked articles, in other @acronym{IMAP}
18166clients. (In other words, Gnus has two ``Tick'' marks and @acronym{IMAP}
18167has only one.)
18168
18169Probably the only reason for frobbing this would be if you're trying
18170enable per-user persistent dormant flags, using something like:
18171
18172@lisp
18173(setcdr (assq 'dormant nnimap-mark-to-flag-alist)
18174 (format "gnus-dormant-%s" (user-login-name)))
18175(setcdr (assq 'dormant nnimap-mark-to-predicate-alist)
18176 (format "KEYWORD gnus-dormant-%s" (user-login-name)))
18177@end lisp
18178
18179In this case, you would not want the per-user dormant flag showing up
18180as ticked for other users.
18181
18182@item nnimap-expunge-search-string
18183@cindex expunging
18184@vindex nnimap-expunge-search-string
18185@cindex expiring @acronym{IMAP} mail
18186
18187This variable contain the @acronym{IMAP} search command sent to server when
18188searching for articles eligible for expiring. The default is
18189@code{"UID %s NOT SINCE %s"}, where the first @code{%s} is replaced by
18190UID set and the second @code{%s} is replaced by a date.
18191
18192Probably the only useful value to change this to is
18193@code{"UID %s NOT SENTSINCE %s"}, which makes nnimap use the Date: in
18194messages instead of the internal article date. See section 6.4.4 of
18195RFC 2060 for more information on valid strings.
18196
18197However, if @code{nnimap-search-uids-not-since-is-evil}
18198is true, this variable has no effect since the search logic
18199is reversed, as described below.
18200
18201@item nnimap-authinfo-file
18202@vindex nnimap-authinfo-file
18203
18204A file containing credentials used to log in on servers. The format is
18205(almost) the same as the @code{ftp} @file{~/.netrc} file. See the
18206variable @code{nntp-authinfo-file} for exact syntax; also see
18207@ref{NNTP}. An example of an .authinfo line for an IMAP server, is:
18208
18209@example
18210machine students.uio.no login larsi password geheimnis port imap
18211@end example
18212
18213Note that it should be @code{port imap}, or @code{port 143}, if you
18214use a @code{nnimap-stream} of @code{tls} or @code{ssl}, even if the
18215actual port number used is port 993 for secured IMAP. For
18216convenience, Gnus will accept @code{port imaps} as a synonym of
18217@code{port imap}.
18218
18219@item nnimap-need-unselect-to-notice-new-mail
18220@vindex nnimap-need-unselect-to-notice-new-mail
18221
18222Unselect mailboxes before looking for new mail in them. Some servers
18223seem to need this under some circumstances; it was reported that
18224Courier 1.7.1 did.
18225
18226@item nnimap-nov-is-evil
18227@vindex nnimap-nov-is-evil
18228@cindex Courier @acronym{IMAP} server
18229@cindex @acronym{NOV}
18230
18231Never generate or use a local @acronym{NOV} database. Defaults to the
18232value of @code{gnus-agent}.
18233
18234Using a @acronym{NOV} database usually makes header fetching much
18235faster, but it uses the @code{UID SEARCH UID} command, which is very
18236slow on some servers (notably some versions of Courier). Since the Gnus
18237Agent caches the information in the @acronym{NOV} database without using
18238the slow command, this variable defaults to true if the Agent is in use,
18239and false otherwise.
18240
18241@item nnimap-search-uids-not-since-is-evil
18242@vindex nnimap-search-uids-not-since-is-evil
18243@cindex Courier @acronym{IMAP} server
18244@cindex expiring @acronym{IMAP} mail
18245
18246Avoid the @code{UID SEARCH UID @var{message numbers} NOT SINCE
18247@var{date}} command, which is slow on some @acronym{IMAP} servers
18248(notably, some versions of Courier). Instead, use @code{UID SEARCH SINCE
18249@var{date}} and prune the list of expirable articles within Gnus.
18250
18251When Gnus expires your mail (@pxref{Expiring Mail}), it starts with a
18252list of expirable articles and asks the IMAP server questions like ``Of
18253these articles, which ones are older than a week?'' While this seems
18254like a perfectly reasonable question, some IMAP servers take a long time
18255to answer it, since they seemingly go looking into every old article to
18256see if it is one of the expirable ones. Curiously, the question ``Of
18257@emph{all} articles, which ones are newer than a week?'' seems to be
18258much faster to answer, so setting this variable causes Gnus to ask this
18259question and figure out the answer to the real question itself.
18260
18261This problem can really sneak up on you: when you first configure Gnus,
18262everything works fine, but once you accumulate a couple thousand
18263messages, you start cursing Gnus for being so slow. On the other hand,
18264if you get a lot of email within a week, setting this variable will
18265cause a lot of network traffic between Gnus and the IMAP server.
18266
01c52d31
MB
18267@item nnimap-logout-timeout
18268@vindex nnimap-logout-timeout
18269
18270There is a case where a connection to a @acronym{IMAP} server is unable
18271to close, when connecting to the server via a certain kind of network,
18272e.g. @acronym{VPN}. In that case, it will be observed that a connection
18273between Emacs and the local network looks alive even if the server has
18274closed a connection for some reason (typically, a timeout).
18275Consequently, Emacs continues waiting for a response from the server for
18276the @code{LOGOUT} command that Emacs sent, or hangs in other words. If
18277you are in such a network, setting this variable to a number of seconds
18278will be helpful. If it is set, a hung connection will be closed
18279forcibly, after this number of seconds from the time Emacs sends the
18280@code{LOGOUT} command. It should not be too small value but too large
18281value will be inconvenient too. Perhaps the value 1.0 will be a good
18282candidate but it might be worth trying some other values.
18283
18284Example server specification:
18285
18286@lisp
18287(nnimap "mail.server.com"
18288 (nnimap-logout-timeout 1.0))
18289@end lisp
18290
4009494e
GM
18291@end table
18292
18293@menu
18294* Splitting in IMAP:: Splitting mail with nnimap.
18295* Expiring in IMAP:: Expiring mail with nnimap.
18296* Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox.
18297* Expunging mailboxes:: Equivalent of a ``compress mailbox'' button.
18298* A note on namespaces:: How to (not) use @acronym{IMAP} namespace in Gnus.
18299* Debugging IMAP:: What to do when things don't work.
18300@end menu
18301
18302
18303
18304@node Splitting in IMAP
18305@subsection Splitting in IMAP
18306@cindex splitting imap mail
18307
18308Splitting is something Gnus users have loved and used for years, and now
18309the rest of the world is catching up. Yeah, dream on, not many
18310@acronym{IMAP} servers have server side splitting and those that have
18311splitting seem to use some non-standard protocol. This means that
18312@acronym{IMAP} support for Gnus has to do its own splitting.
18313
18314And it does.
18315
18316(Incidentally, people seem to have been dreaming on, and Sieve has
18317gaining a market share and is supported by several IMAP servers.
18318Fortunately, Gnus support it too, @xref{Sieve Commands}.)
18319
18320Here are the variables of interest:
18321
18322@table @code
18323
18324@item nnimap-split-crosspost
18325@cindex splitting, crosspost
18326@cindex crosspost
18327@vindex nnimap-split-crosspost
18328
18329If non-@code{nil}, do crossposting if several split methods match the
18330mail. If @code{nil}, the first match in @code{nnimap-split-rule}
18331found will be used.
18332
18333Nnmail equivalent: @code{nnmail-crosspost}.
18334
18335@item nnimap-split-inbox
18336@cindex splitting, inbox
18337@cindex inbox
18338@vindex nnimap-split-inbox
18339
18340A string or a list of strings that gives the name(s) of @acronym{IMAP}
18341mailboxes to split from. Defaults to @code{nil}, which means that
18342splitting is disabled!
18343
18344@lisp
18345(setq nnimap-split-inbox
18346 '("INBOX" ("~/friend/Mail" . "lists/*") "lists.imap"))
18347@end lisp
18348
18349No nnmail equivalent.
18350
18351@item nnimap-split-rule
18352@cindex splitting, rules
18353@vindex nnimap-split-rule
18354
18355New mail found in @code{nnimap-split-inbox} will be split according to
18356this variable.
18357
18358This variable contains a list of lists, where the first element in the
18359sublist gives the name of the @acronym{IMAP} mailbox to move articles
18360matching the regexp in the second element in the sublist. Got that?
18361Neither did I, we need examples.
18362
18363@lisp
18364(setq nnimap-split-rule
18365 '(("INBOX.nnimap"
18366 "^Sender: owner-nnimap@@vic20.globalcom.se")
18367 ("INBOX.junk" "^Subject:.*MAKE MONEY")
18368 ("INBOX.private" "")))
18369@end lisp
18370
18371This will put all articles from the nnimap mailing list into mailbox
18372INBOX.nnimap, all articles containing MAKE MONEY in the Subject: line
18373into INBOX.junk and everything else in INBOX.private.
18374
18375The first string may contain @samp{\\1} forms, like the ones used by
18376replace-match to insert sub-expressions from the matched text. For
18377instance:
18378
18379@lisp
18380("INBOX.lists.\\1" "^Sender: owner-\\([a-z-]+\\)@@")
18381@end lisp
18382
18383The first element can also be the symbol @code{junk} to indicate that
18384matching messages should simply be deleted. Use with care.
18385
18386The second element can also be a function. In that case, it will be
18387called with the first element of the rule as the argument, in a buffer
18388containing the headers of the article. It should return a
18389non-@code{nil} value if it thinks that the mail belongs in that group.
18390
18391Nnmail users might recollect that the last regexp had to be empty to
18392match all articles (like in the example above). This is not required in
18393nnimap. Articles not matching any of the regexps will not be moved out
18394of your inbox. (This might affect performance if you keep lots of
18395unread articles in your inbox, since the splitting code would go over
18396them every time you fetch new mail.)
18397
18398These rules are processed from the beginning of the alist toward the
18399end. The first rule to make a match will ``win'', unless you have
18400crossposting enabled. In that case, all matching rules will ``win''.
18401
18402This variable can also have a function as its value, the function will
18403be called with the headers narrowed and should return a group where it
18404thinks the article should be split to. See @code{nnimap-split-fancy}.
18405
18406The splitting code tries to create mailboxes if it needs to.
18407
18408To allow for different split rules on different virtual servers, and
18409even different split rules in different inboxes on the same server,
18410the syntax of this variable have been extended along the lines of:
18411
18412@lisp
18413(setq nnimap-split-rule
18414 '(("my1server" (".*" (("ding" "ding@@gnus.org")
18415 ("junk" "From:.*Simon"))))
18416 ("my2server" ("INBOX" nnimap-split-fancy))
18417 ("my[34]server" (".*" (("private" "To:.*Simon")
18418 ("junk" my-junk-func))))))
18419@end lisp
18420
18421The virtual server name is in fact a regexp, so that the same rules
18422may apply to several servers. In the example, the servers
18423@code{my3server} and @code{my4server} both use the same rules.
18424Similarly, the inbox string is also a regexp. The actual splitting
18425rules are as before, either a function, or a list with group/regexp or
18426group/function elements.
18427
18428Nnmail equivalent: @code{nnmail-split-methods}.
18429
18430@item nnimap-split-predicate
18431@cindex splitting
18432@vindex nnimap-split-predicate
18433
18434Mail matching this predicate in @code{nnimap-split-inbox} will be
18435split, it is a string and the default is @samp{UNSEEN UNDELETED}.
18436
18437This might be useful if you use another @acronym{IMAP} client to read mail in
18438your inbox but would like Gnus to split all articles in the inbox
18439regardless of readedness. Then you might change this to
18440@samp{UNDELETED}.
18441
18442@item nnimap-split-fancy
18443@cindex splitting, fancy
18444@findex nnimap-split-fancy
18445@vindex nnimap-split-fancy
18446
18447It's possible to set @code{nnimap-split-rule} to
18448@code{nnmail-split-fancy} if you want to use fancy
18449splitting. @xref{Fancy Mail Splitting}.
18450
18451However, to be able to have different fancy split rules for nnmail and
18452nnimap back ends you can set @code{nnimap-split-rule} to
18453@code{nnimap-split-fancy} and define the nnimap specific fancy split
18454rule in @code{nnimap-split-fancy}.
18455
18456Example:
18457
18458@lisp
18459(setq nnimap-split-rule 'nnimap-split-fancy
18460 nnimap-split-fancy ...)
18461@end lisp
18462
18463Nnmail equivalent: @code{nnmail-split-fancy}.
18464
18465@item nnimap-split-download-body
18466@findex nnimap-split-download-body
18467@vindex nnimap-split-download-body
18468
18469Set to non-@code{nil} to download entire articles during splitting.
18470This is generally not required, and will slow things down
18471considerably. You may need it if you want to use an advanced
18472splitting function that analyzes the body to split the article.
18473
18474@end table
18475
18476@node Expiring in IMAP
18477@subsection Expiring in IMAP
18478@cindex expiring @acronym{IMAP} mail
18479
18480Even though @code{nnimap} is not a proper @code{nnmail} derived back
18481end, it supports most features in regular expiring (@pxref{Expiring
18482Mail}). Unlike splitting in @acronym{IMAP} (@pxref{Splitting in
18483IMAP}) it does not clone the @code{nnmail} variables (i.e., creating
18484@var{nnimap-expiry-wait}) but reuse the @code{nnmail} variables. What
18485follows below are the variables used by the @code{nnimap} expiry
18486process.
18487
18488A note on how the expire mark is stored on the @acronym{IMAP} server is
18489appropriate here as well. The expire mark is translated into a
18490@code{imap} client specific mark, @code{gnus-expire}, and stored on the
18491message. This means that likely only Gnus will understand and treat
18492the @code{gnus-expire} mark properly, although other clients may allow
18493you to view client specific flags on the message. It also means that
18494your server must support permanent storage of client specific flags on
18495messages. Most do, fortunately.
18496
18497If expiring @acronym{IMAP} mail seems very slow, try setting the server
18498variable @code{nnimap-search-uids-not-since-is-evil}.
18499
18500@table @code
18501
18502@item nnmail-expiry-wait
18503@item nnmail-expiry-wait-function
18504
18505These variables are fully supported. The expire value can be a
18506number, the symbol @code{immediate} or @code{never}.
18507
18508@item nnmail-expiry-target
18509
18510This variable is supported, and internally implemented by calling the
18511@code{nnmail} functions that handle this. It contains an optimization
18512that if the destination is a @acronym{IMAP} group on the same server, the
18513article is copied instead of appended (that is, uploaded again).
18514
18515@end table
18516
18517@node Editing IMAP ACLs
18518@subsection Editing IMAP ACLs
18519@cindex editing imap acls
18520@cindex Access Control Lists
18521@cindex Editing @acronym{IMAP} ACLs
18522@kindex G l (Group)
18523@findex gnus-group-nnimap-edit-acl
18524
18525ACL stands for Access Control List. ACLs are used in @acronym{IMAP} for
18526limiting (or enabling) other users access to your mail boxes. Not all
18527@acronym{IMAP} servers support this, this function will give an error if it
18528doesn't.
18529
18530To edit an ACL for a mailbox, type @kbd{G l}
18531(@code{gnus-group-edit-nnimap-acl}) and you'll be presented with an ACL
18532editing window with detailed instructions.
18533
18534Some possible uses:
18535
18536@itemize @bullet
18537@item
18538Giving ``anyone'' the ``lrs'' rights (lookup, read, keep seen/unseen flags)
18539on your mailing list mailboxes enables other users on the same server to
18540follow the list without subscribing to it.
18541@item
18542At least with the Cyrus server, you are required to give the user
18543``anyone'' posting ("p") capabilities to have ``plussing'' work (that is,
18544mail sent to user+mailbox@@domain ending up in the @acronym{IMAP} mailbox
18545INBOX.mailbox).
18546@end itemize
18547
18548@node Expunging mailboxes
18549@subsection Expunging mailboxes
18550@cindex expunging
18551
18552@cindex expunge
18553@cindex manual expunging
18554@kindex G x (Group)
18555@findex gnus-group-nnimap-expunge
18556
18557If you're using the @code{never} setting of @code{nnimap-expunge-on-close},
18558you may want the option of expunging all deleted articles in a mailbox
18559manually. This is exactly what @kbd{G x} does.
18560
18561Currently there is no way of showing deleted articles, you can just
18562delete them.
18563
18564@node A note on namespaces
18565@subsection A note on namespaces
18566@cindex IMAP namespace
18567@cindex namespaces
18568
18569The @acronym{IMAP} protocol has a concept called namespaces, described
18570by the following text in the RFC2060:
18571
18572@display
185735.1.2. Mailbox Namespace Naming Convention
18574
18575 By convention, the first hierarchical element of any mailbox name
18576 which begins with "#" identifies the "namespace" of the remainder of
18577 the name. This makes it possible to disambiguate between different
18578 types of mailbox stores, each of which have their own namespaces.
18579
18580 For example, implementations which offer access to USENET
18581 newsgroups MAY use the "#news" namespace to partition the USENET
18582 newsgroup namespace from that of other mailboxes. Thus, the
18583 comp.mail.misc newsgroup would have an mailbox name of
18584 "#news.comp.mail.misc", and the name "comp.mail.misc" could refer
18585 to a different object (e.g. a user's private mailbox).
18586@end display
18587
18588While there is nothing in this text that warrants concern for the
18589@acronym{IMAP} implementation in Gnus, some servers use namespace
18590prefixes in a way that does not work with how Gnus uses mailbox names.
18591
18592Specifically, University of Washington's @acronym{IMAP} server uses
18593mailbox names like @code{#driver.mbx/read-mail} which are valid only
18594in the @sc{create} and @sc{append} commands. After the mailbox is
18595created (or a messages is appended to a mailbox), it must be accessed
18596without the namespace prefix, i.e. @code{read-mail}. Since Gnus do
18597not make it possible for the user to guarantee that user entered
18598mailbox names will only be used with the CREATE and APPEND commands,
18599you should simply not use the namespace prefixed mailbox names in
18600Gnus.
18601
18602See the UoW IMAPD documentation for the @code{#driver.*/} prefix
18603for more information on how to use the prefixes. They are a power
18604tool and should be used only if you are sure what the effects are.
18605
18606@node Debugging IMAP
18607@subsection Debugging IMAP
18608@cindex IMAP debugging
18609@cindex protocol dump (IMAP)
18610
18611@acronym{IMAP} is a complex protocol, more so than @acronym{NNTP} or
18612@acronym{POP3}. Implementation bugs are not unlikely, and we do our
18613best to fix them right away. If you encounter odd behavior, chances
18614are that either the server or Gnus is buggy.
18615
18616If you are familiar with network protocols in general, you will
18617probably be able to extract some clues from the protocol dump of the
18618exchanges between Gnus and the server. Even if you are not familiar
18619with network protocols, when you include the protocol dump in
18620@acronym{IMAP}-related bug reports you are helping us with data
18621critical to solving the problem. Therefore, we strongly encourage you
18622to include the protocol dump when reporting IMAP bugs in Gnus.
18623
18624
18625@vindex imap-log
18626Because the protocol dump, when enabled, generates lots of data, it is
18627disabled by default. You can enable it by setting @code{imap-log} as
18628follows:
18629
18630@lisp
18631(setq imap-log t)
18632@end lisp
18633
18634This instructs the @code{imap.el} package to log any exchanges with
18635the server. The log is stored in the buffer @samp{*imap-log*}. Look
18636for error messages, which sometimes are tagged with the keyword
18637@code{BAD}---but when submitting a bug, make sure to include all the
18638data.
18639
18640@node Other Sources
18641@section Other Sources
18642
18643Gnus can do more than just read news or mail. The methods described
18644below allow Gnus to view directories and files as if they were
18645newsgroups.
18646
18647@menu
18648* Directory Groups:: You can read a directory as if it was a newsgroup.
18649* Anything Groups:: Dired? Who needs dired?
18650* Document Groups:: Single files can be the basis of a group.
18651* SOUP:: Reading @sc{soup} packets ``offline''.
18652* Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
18653@end menu
18654
18655
18656@node Directory Groups
18657@subsection Directory Groups
18658@cindex nndir
18659@cindex directory groups
18660
18661If you have a directory that has lots of articles in separate files in
18662it, you might treat it as a newsgroup. The files have to have numerical
18663names, of course.
18664
18665This might be an opportune moment to mention @code{ange-ftp} (and its
18666successor @code{efs}), that most wonderful of all wonderful Emacs
18667packages. When I wrote @code{nndir}, I didn't think much about it---a
18668back end to read directories. Big deal.
18669
18670@code{ange-ftp} changes that picture dramatically. For instance, if you
18671enter the @code{ange-ftp} file name
18672@file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the directory name,
18673@code{ange-ftp} or @code{efs} will actually allow you to read this
18674directory over at @samp{sina} as a newsgroup. Distributed news ahoy!
18675
18676@code{nndir} will use @acronym{NOV} files if they are present.
18677
18678@code{nndir} is a ``read-only'' back end---you can't delete or expire
18679articles with this method. You can use @code{nnmh} or @code{nnml} for
18680whatever you use @code{nndir} for, so you could switch to any of those
18681methods if you feel the need to have a non-read-only @code{nndir}.
18682
18683
18684@node Anything Groups
18685@subsection Anything Groups
18686@cindex nneething
18687
18688From the @code{nndir} back end (which reads a single spool-like
18689directory), it's just a hop and a skip to @code{nneething}, which
18690pretends that any arbitrary directory is a newsgroup. Strange, but
18691true.
18692
18693When @code{nneething} is presented with a directory, it will scan this
18694directory and assign article numbers to each file. When you enter such
18695a group, @code{nneething} must create ``headers'' that Gnus can use.
18696After all, Gnus is a newsreader, in case you're forgetting.
18697@code{nneething} does this in a two-step process. First, it snoops each
18698file in question. If the file looks like an article (i.e., the first
18699few lines look like headers), it will use this as the head. If this is
18700just some arbitrary file without a head (e.g. a C source file),
18701@code{nneething} will cobble up a header out of thin air. It will use
18702file ownership, name and date and do whatever it can with these
18703elements.
18704
18705All this should happen automatically for you, and you will be presented
18706with something that looks very much like a newsgroup. Totally like a
18707newsgroup, to be precise. If you select an article, it will be displayed
18708in the article buffer, just as usual.
18709
18710If you select a line that represents a directory, Gnus will pop you into
18711a new summary buffer for this @code{nneething} group. And so on. You can
18712traverse the entire disk this way, if you feel like, but remember that
18713Gnus is not dired, really, and does not intend to be, either.
18714
18715There are two overall modes to this action---ephemeral or solid. When
18716doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus
18717will not store information on what files you have read, and what files
18718are new, and so on. If you create a solid @code{nneething} group the
18719normal way with @kbd{G m}, Gnus will store a mapping table between
18720article numbers and file names, and you can treat this group like any
18721other groups. When you activate a solid @code{nneething} group, you will
18722be told how many unread articles it contains, etc., etc.
18723
18724Some variables:
18725
18726@table @code
18727@item nneething-map-file-directory
18728@vindex nneething-map-file-directory
18729All the mapping files for solid @code{nneething} groups will be stored
18730in this directory, which defaults to @file{~/.nneething/}.
18731
18732@item nneething-exclude-files
18733@vindex nneething-exclude-files
18734All files that match this regexp will be ignored. Nice to use to exclude
18735auto-save files and the like, which is what it does by default.
18736
18737@item nneething-include-files
18738@vindex nneething-include-files
18739Regexp saying what files to include in the group. If this variable is
18740non-@code{nil}, only files matching this regexp will be included.
18741
18742@item nneething-map-file
18743@vindex nneething-map-file
18744Name of the map files.
18745@end table
18746
18747
18748@node Document Groups
18749@subsection Document Groups
18750@cindex nndoc
18751@cindex documentation group
18752@cindex help group
18753
18754@code{nndoc} is a cute little thing that will let you read a single file
18755as a newsgroup. Several files types are supported:
18756
18757@table @code
18758@cindex Babyl
4009494e 18759@item babyl
bc79f9ab 18760The Babyl format.
4009494e
GM
18761
18762@cindex mbox
18763@cindex Unix mbox
18764@item mbox
18765The standard Unix mbox file.
18766
18767@cindex MMDF mail box
18768@item mmdf
18769The MMDF mail box format.
18770
18771@item news
18772Several news articles appended into a file.
18773
18774@cindex rnews batch files
18775@item rnews
18776The rnews batch transport format.
18777
18778@item nsmail
18779Netscape mail boxes.
18780
18781@item mime-parts
18782@acronym{MIME} multipart messages.
18783
18784@item standard-digest
18785The standard (RFC 1153) digest format.
18786
18787@item mime-digest
18788A @acronym{MIME} digest of messages.
18789
18790@item lanl-gov-announce
18791Announcement messages from LANL Gov Announce.
18792
18793@cindex forwarded messages
18794@item rfc822-forward
18795A message forwarded according to RFC822.
18796
18797@item outlook
18798The Outlook mail box.
18799
18800@item oe-dbx
18801The Outlook Express dbx mail box.
18802
18803@item exim-bounce
18804A bounce message from the Exim MTA.
18805
18806@item forward
18807A message forwarded according to informal rules.
18808
18809@item rfc934
18810An RFC934-forwarded message.
18811
18812@item mailman
18813A mailman digest.
18814
18815@item clari-briefs
18816A digest of Clarinet brief news items.
18817
18818@item slack-digest
18819Non-standard digest format---matches most things, but does it badly.
18820
18821@item mail-in-mail
18822The last resort.
18823@end table
18824
18825You can also use the special ``file type'' @code{guess}, which means
18826that @code{nndoc} will try to guess what file type it is looking at.
18827@code{digest} means that @code{nndoc} should guess what digest type the
18828file is.
18829
18830@code{nndoc} will not try to change the file or insert any extra headers into
18831it---it will simply, like, let you use the file as the basis for a
18832group. And that's it.
18833
18834If you have some old archived articles that you want to insert into your
18835new & spiffy Gnus mail back end, @code{nndoc} can probably help you with
18836that. Say you have an old @file{RMAIL} file with mail that you now want
18837to split into your new @code{nnml} groups. You look at that file using
18838@code{nndoc} (using the @kbd{G f} command in the group buffer
18839(@pxref{Foreign Groups})), set the process mark on all the articles in
18840the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r})
18841using @code{nnml}. If all goes well, all the mail in the @file{RMAIL}
18842file is now also stored in lots of @code{nnml} directories, and you can
18843delete that pesky @file{RMAIL} file. If you have the guts!
18844
18845Virtual server variables:
18846
18847@table @code
18848@item nndoc-article-type
18849@vindex nndoc-article-type
18850This should be one of @code{mbox}, @code{babyl}, @code{digest},
18851@code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
18852@code{rfc822-forward}, @code{mime-parts}, @code{standard-digest},
18853@code{slack-digest}, @code{clari-briefs}, @code{nsmail}, @code{outlook},
18854@code{oe-dbx}, @code{mailman}, and @code{mail-in-mail} or @code{guess}.
18855
18856@item nndoc-post-type
18857@vindex nndoc-post-type
18858This variable says whether Gnus is to consider the group a news group or
18859a mail group. There are two valid values: @code{mail} (the default)
18860and @code{news}.
18861@end table
18862
18863@menu
18864* Document Server Internals:: How to add your own document types.
18865@end menu
18866
18867
18868@node Document Server Internals
18869@subsubsection Document Server Internals
18870
18871Adding new document types to be recognized by @code{nndoc} isn't
18872difficult. You just have to whip up a definition of what the document
18873looks like, write a predicate function to recognize that document type,
18874and then hook into @code{nndoc}.
18875
18876First, here's an example document type definition:
18877
18878@example
18879(mmdf
18880 (article-begin . "^\^A\^A\^A\^A\n")
18881 (body-end . "^\^A\^A\^A\^A\n"))
18882@end example
18883
18884The definition is simply a unique @dfn{name} followed by a series of
18885regexp pseudo-variable settings. Below are the possible
18886variables---don't be daunted by the number of variables; most document
18887types can be defined with very few settings:
18888
18889@table @code
18890@item first-article
18891If present, @code{nndoc} will skip past all text until it finds
18892something that match this regexp. All text before this will be
18893totally ignored.
18894
18895@item article-begin
18896This setting has to be present in all document type definitions. It
18897says what the beginning of each article looks like. To do more
18898complicated things that cannot be dealt with a simple regexp, you can
18899use @code{article-begin-function} instead of this.
18900
18901@item article-begin-function
18902If present, this should be a function that moves point to the beginning
18903of each article. This setting overrides @code{article-begin}.
18904
18905@item head-begin
18906If present, this should be a regexp that matches the head of the
18907article. To do more complicated things that cannot be dealt with a
18908simple regexp, you can use @code{head-begin-function} instead of this.
18909
18910@item head-begin-function
18911If present, this should be a function that moves point to the head of
18912the article. This setting overrides @code{head-begin}.
18913
18914@item head-end
18915This should match the end of the head of the article. It defaults to
18916@samp{^$}---the empty line.
18917
18918@item body-begin
18919This should match the beginning of the body of the article. It defaults
18920to @samp{^\n}. To do more complicated things that cannot be dealt with
18921a simple regexp, you can use @code{body-begin-function} instead of this.
18922
18923@item body-begin-function
18924If present, this function should move point to the beginning of the body
18925of the article. This setting overrides @code{body-begin}.
18926
18927@item body-end
18928If present, this should match the end of the body of the article. To do
18929more complicated things that cannot be dealt with a simple regexp, you
18930can use @code{body-end-function} instead of this.
18931
18932@item body-end-function
18933If present, this function should move point to the end of the body of
18934the article. This setting overrides @code{body-end}.
18935
18936@item file-begin
18937If present, this should match the beginning of the file. All text
18938before this regexp will be totally ignored.
18939
18940@item file-end
18941If present, this should match the end of the file. All text after this
18942regexp will be totally ignored.
18943
18944@end table
18945
18946So, using these variables @code{nndoc} is able to dissect a document
18947file into a series of articles, each with a head and a body. However, a
18948few more variables are needed since not all document types are all that
18949news-like---variables needed to transform the head or the body into
18950something that's palatable for Gnus:
18951
18952@table @code
18953@item prepare-body-function
18954If present, this function will be called when requesting an article. It
18955will be called with point at the start of the body, and is useful if the
18956document has encoded some parts of its contents.
18957
18958@item article-transform-function
18959If present, this function is called when requesting an article. It's
18960meant to be used for more wide-ranging transformation of both head and
18961body of the article.
18962
18963@item generate-head-function
18964If present, this function is called to generate a head that Gnus can
18965understand. It is called with the article number as a parameter, and is
18966expected to generate a nice head for the article in question. It is
18967called when requesting the headers of all articles.
18968
18969@item generate-article-function
18970If present, this function is called to generate an entire article that
18971Gnus can understand. It is called with the article number as a
18972parameter when requesting all articles.
18973
18974@item dissection-function
18975If present, this function is called to dissect a document by itself,
18976overriding @code{first-article}, @code{article-begin},
18977@code{article-begin-function}, @code{head-begin},
18978@code{head-begin-function}, @code{head-end}, @code{body-begin},
18979@code{body-begin-function}, @code{body-end}, @code{body-end-function},
18980@code{file-begin}, and @code{file-end}.
18981
18982@end table
18983
18984Let's look at the most complicated example I can come up with---standard
18985digests:
18986
18987@example
18988(standard-digest
18989 (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+"))
18990 (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+"))
18991 (prepare-body-function . nndoc-unquote-dashes)
18992 (body-end-function . nndoc-digest-body-end)
18993 (head-end . "^ ?$")
18994 (body-begin . "^ ?\n")
18995 (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
18996 (subtype digest guess))
18997@end example
18998
18999We see that all text before a 70-width line of dashes is ignored; all
19000text after a line that starts with that @samp{^End of} is also ignored;
19001each article begins with a 30-width line of dashes; the line separating
19002the head from the body may contain a single space; and that the body is
19003run through @code{nndoc-unquote-dashes} before being delivered.
19004
19005To hook your own document definition into @code{nndoc}, use the
19006@code{nndoc-add-type} function. It takes two parameters---the first
19007is the definition itself and the second (optional) parameter says
19008where in the document type definition alist to put this definition.
19009The alist is traversed sequentially, and
19010@code{nndoc-@var{type}-type-p} is called for a given type @var{type}.
19011So @code{nndoc-mmdf-type-p} is called to see whether a document is of
19012@code{mmdf} type, and so on. These type predicates should return
19013@code{nil} if the document is not of the correct type; @code{t} if it
19014is of the correct type; and a number if the document might be of the
19015correct type. A high number means high probability; a low number
19016means low probability with @samp{0} being the lowest valid number.
19017
19018
19019@node SOUP
19020@subsection SOUP
19021@cindex SOUP
19022@cindex offline
19023
19024In the PC world people often talk about ``offline'' newsreaders. These
19025are thingies that are combined reader/news transport monstrosities.
19026With built-in modem programs. Yecchh!
19027
19028Of course, us Unix Weenie types of human beans use things like
19029@code{uucp} and, like, @code{nntpd} and set up proper news and mail
19030transport things like Ghod intended. And then we just use normal
19031newsreaders.
19032
19033However, it can sometimes be convenient to do something that's a bit
19034easier on the brain if you have a very slow modem, and you're not really
19035that interested in doing things properly.
19036
19037A file format called @sc{soup} has been developed for transporting news
19038and mail from servers to home machines and back again. It can be a bit
19039fiddly.
19040
19041First some terminology:
19042
19043@table @dfn
19044
19045@item server
19046This is the machine that is connected to the outside world and where you
19047get news and/or mail from.
19048
19049@item home machine
19050This is the machine that you want to do the actual reading and responding
19051on. It is typically not connected to the rest of the world in any way.
19052
19053@item packet
19054Something that contains messages and/or commands. There are two kinds
19055of packets:
19056
19057@table @dfn
19058@item message packets
19059These are packets made at the server, and typically contain lots of
19060messages for you to read. These are called @file{SoupoutX.tgz} by
19061default, where @var{x} is a number.
19062
19063@item response packets
19064These are packets made at the home machine, and typically contains
19065replies that you've written. These are called @file{SoupinX.tgz} by
19066default, where @var{x} is a number.
19067
19068@end table
19069
19070@end table
19071
19072
19073@enumerate
19074
19075@item
19076You log in on the server and create a @sc{soup} packet. You can either
19077use a dedicated @sc{soup} thingie (like the @code{awk} program), or you
19078can use Gnus to create the packet with its @sc{soup} commands (@kbd{O
19079s} and/or @kbd{G s b}; and then @kbd{G s p}) (@pxref{SOUP Commands}).
19080
19081@item
19082You transfer the packet home. Rail, boat, car or modem will do fine.
19083
19084@item
19085You put the packet in your home directory.
19086
19087@item
19088You fire up Gnus on your home machine using the @code{nnsoup} back end as
19089the native or secondary server.
19090
19091@item
19092You read articles and mail and answer and followup to the things you
19093want (@pxref{SOUP Replies}).
19094
19095@item
19096You do the @kbd{G s r} command to pack these replies into a @sc{soup}
19097packet.
19098
19099@item
19100You transfer this packet to the server.
19101
19102@item
19103You use Gnus to mail this packet out with the @kbd{G s s} command.
19104
19105@item
19106You then repeat until you die.
19107
19108@end enumerate
19109
19110So you basically have a bipartite system---you use @code{nnsoup} for
19111reading and Gnus for packing/sending these @sc{soup} packets.
19112
19113@menu
19114* SOUP Commands:: Commands for creating and sending @sc{soup} packets
19115* SOUP Groups:: A back end for reading @sc{soup} packets.
19116* SOUP Replies:: How to enable @code{nnsoup} to take over mail and news.
19117@end menu
19118
19119
19120@node SOUP Commands
19121@subsubsection SOUP Commands
19122
19123These are commands for creating and manipulating @sc{soup} packets.
19124
19125@table @kbd
19126@item G s b
19127@kindex G s b (Group)
19128@findex gnus-group-brew-soup
19129Pack all unread articles in the current group
19130(@code{gnus-group-brew-soup}). This command understands the
19131process/prefix convention.
19132
19133@item G s w
19134@kindex G s w (Group)
19135@findex gnus-soup-save-areas
19136Save all @sc{soup} data files (@code{gnus-soup-save-areas}).
19137
19138@item G s s
19139@kindex G s s (Group)
19140@findex gnus-soup-send-replies
19141Send all replies from the replies packet
19142(@code{gnus-soup-send-replies}).
19143
19144@item G s p
19145@kindex G s p (Group)
19146@findex gnus-soup-pack-packet
19147Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}).
19148
19149@item G s r
19150@kindex G s r (Group)
19151@findex nnsoup-pack-replies
19152Pack all replies into a replies packet (@code{nnsoup-pack-replies}).
19153
19154@item O s
19155@kindex O s (Summary)
19156@findex gnus-soup-add-article
19157This summary-mode command adds the current article to a @sc{soup} packet
19158(@code{gnus-soup-add-article}). It understands the process/prefix
19159convention (@pxref{Process/Prefix}).
19160
19161@end table
19162
19163
19164There are a few variables to customize where Gnus will put all these
19165thingies:
19166
19167@table @code
19168
19169@item gnus-soup-directory
19170@vindex gnus-soup-directory
19171Directory where Gnus will save intermediate files while composing
19172@sc{soup} packets. The default is @file{~/SoupBrew/}.
19173
19174@item gnus-soup-replies-directory
19175@vindex gnus-soup-replies-directory
19176This is what Gnus will use as a temporary directory while sending our
19177reply packets. @file{~/SoupBrew/SoupReplies/} is the default.
19178
19179@item gnus-soup-prefix-file
19180@vindex gnus-soup-prefix-file
19181Name of the file where Gnus stores the last used prefix. The default is
19182@samp{gnus-prefix}.
19183
19184@item gnus-soup-packer
19185@vindex gnus-soup-packer
19186A format string command for packing a @sc{soup} packet. The default is
19187@samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}.
19188
19189@item gnus-soup-unpacker
19190@vindex gnus-soup-unpacker
19191Format string command for unpacking a @sc{soup} packet. The default is
19192@samp{gunzip -c %s | tar xvf -}.
19193
19194@item gnus-soup-packet-directory
19195@vindex gnus-soup-packet-directory
19196Where Gnus will look for reply packets. The default is @file{~/}.
19197
19198@item gnus-soup-packet-regexp
19199@vindex gnus-soup-packet-regexp
19200Regular expression matching @sc{soup} reply packets in
19201@code{gnus-soup-packet-directory}.
19202
19203@end table
19204
19205
19206@node SOUP Groups
19207@subsubsection SOUP Groups
19208@cindex nnsoup
19209
19210@code{nnsoup} is the back end for reading @sc{soup} packets. It will
19211read incoming packets, unpack them, and put them in a directory where
19212you can read them at leisure.
19213
19214These are the variables you can use to customize its behavior:
19215
19216@table @code
19217
19218@item nnsoup-tmp-directory
19219@vindex nnsoup-tmp-directory
19220When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this
19221directory. (@file{/tmp/} by default.)
19222
19223@item nnsoup-directory
19224@vindex nnsoup-directory
19225@code{nnsoup} then moves each message and index file to this directory.
19226The default is @file{~/SOUP/}.
19227
19228@item nnsoup-replies-directory
19229@vindex nnsoup-replies-directory
19230All replies will be stored in this directory before being packed into a
19231reply packet. The default is @file{~/SOUP/replies/}.
19232
19233@item nnsoup-replies-format-type
19234@vindex nnsoup-replies-format-type
19235The @sc{soup} format of the replies packets. The default is @samp{?n}
19236(rnews), and I don't think you should touch that variable. I probably
19237shouldn't even have documented it. Drats! Too late!
19238
19239@item nnsoup-replies-index-type
19240@vindex nnsoup-replies-index-type
19241The index type of the replies packet. The default is @samp{?n}, which
19242means ``none''. Don't fiddle with this one either!
19243
19244@item nnsoup-active-file
19245@vindex nnsoup-active-file
19246Where @code{nnsoup} stores lots of information. This is not an ``active
19247file'' in the @code{nntp} sense; it's an Emacs Lisp file. If you lose
19248this file or mess it up in any way, you're dead. The default is
19249@file{~/SOUP/active}.
19250
19251@item nnsoup-packer
19252@vindex nnsoup-packer
19253Format string command for packing a reply @sc{soup} packet. The default
19254is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}.
19255
19256@item nnsoup-unpacker
19257@vindex nnsoup-unpacker
19258Format string command for unpacking incoming @sc{soup} packets. The
19259default is @samp{gunzip -c %s | tar xvf -}.
19260
19261@item nnsoup-packet-directory
19262@vindex nnsoup-packet-directory
19263Where @code{nnsoup} will look for incoming packets. The default is
19264@file{~/}.
19265
19266@item nnsoup-packet-regexp
19267@vindex nnsoup-packet-regexp
19268Regular expression matching incoming @sc{soup} packets. The default is
19269@samp{Soupout}.
19270
19271@item nnsoup-always-save
19272@vindex nnsoup-always-save
19273If non-@code{nil}, save the replies buffer after each posted message.
19274
19275@end table
19276
19277
19278@node SOUP Replies
19279@subsubsection SOUP Replies
19280
19281Just using @code{nnsoup} won't mean that your postings and mailings end
19282up in @sc{soup} reply packets automagically. You have to work a bit
19283more for that to happen.
19284
19285@findex nnsoup-set-variables
19286The @code{nnsoup-set-variables} command will set the appropriate
19287variables to ensure that all your followups and replies end up in the
19288@sc{soup} system.
19289
19290In specific, this is what it does:
19291
19292@lisp
19293(setq message-send-news-function 'nnsoup-request-post)
19294(setq message-send-mail-function 'nnsoup-request-mail)
19295@end lisp
19296
19297And that's it, really. If you only want news to go into the @sc{soup}
19298system you just use the first line. If you only want mail to be
19299@sc{soup}ed you use the second.
19300
19301
19302@node Mail-To-News Gateways
19303@subsection Mail-To-News Gateways
19304@cindex mail-to-news gateways
19305@cindex gateways
19306
19307If your local @code{nntp} server doesn't allow posting, for some reason
19308or other, you can post using one of the numerous mail-to-news gateways.
19309The @code{nngateway} back end provides the interface.
19310
19311Note that you can't read anything from this back end---it can only be
19312used to post with.
19313
19314Server variables:
19315
19316@table @code
19317@item nngateway-address
19318@vindex nngateway-address
19319This is the address of the mail-to-news gateway.
19320
19321@item nngateway-header-transformation
19322@vindex nngateway-header-transformation
19323News headers often have to be transformed in some odd way or other
19324for the mail-to-news gateway to accept it. This variable says what
19325transformation should be called, and defaults to
19326@code{nngateway-simple-header-transformation}. The function is called
19327narrowed to the headers to be transformed and with one parameter---the
19328gateway address.
19329
19330This default function just inserts a new @code{To} header based on the
19331@code{Newsgroups} header and the gateway address.
19332For instance, an article with this @code{Newsgroups} header:
19333
19334@example
19335Newsgroups: alt.religion.emacs
19336@end example
19337
19338will get this @code{To} header inserted:
19339
19340@example
19341To: alt-religion-emacs@@GATEWAY
19342@end example
19343
19344The following pre-defined functions exist:
19345
19346@findex nngateway-simple-header-transformation
19347@table @code
19348
19349@item nngateway-simple-header-transformation
19350Creates a @code{To} header that looks like
19351@var{newsgroup}@@@code{nngateway-address}.
19352
19353@findex nngateway-mail2news-header-transformation
19354
19355@item nngateway-mail2news-header-transformation
19356Creates a @code{To} header that looks like
19357@code{nngateway-address}.
19358@end table
19359
19360@end table
19361
19362Here's an example:
19363
19364@lisp
19365(setq gnus-post-method
19366 '(nngateway
19367 "mail2news@@replay.com"
19368 (nngateway-header-transformation
19369 nngateway-mail2news-header-transformation)))
19370@end lisp
19371
19372So, to use this, simply say something like:
19373
19374@lisp
19375(setq gnus-post-method '(nngateway "GATEWAY.ADDRESS"))
19376@end lisp
19377
19378
19379
19380@node Combined Groups
19381@section Combined Groups
19382
19383Gnus allows combining a mixture of all the other group types into bigger
19384groups.
19385
19386@menu
19387* Virtual Groups:: Combining articles from many groups.
19388* Kibozed Groups:: Looking through parts of the newsfeed for articles.
19389@end menu
19390
19391
19392@node Virtual Groups
19393@subsection Virtual Groups
19394@cindex nnvirtual
19395@cindex virtual groups
19396@cindex merging groups
19397
19398An @dfn{nnvirtual group} is really nothing more than a collection of
19399other groups.
19400
19401For instance, if you are tired of reading many small groups, you can
19402put them all in one big group, and then grow tired of reading one
19403big, unwieldy group. The joys of computing!
19404
19405You specify @code{nnvirtual} as the method. The address should be a
19406regexp to match component groups.
19407
19408All marks in the virtual group will stick to the articles in the
19409component groups. So if you tick an article in a virtual group, the
19410article will also be ticked in the component group from whence it
19411came. (And vice versa---marks from the component groups will also be
19412shown in the virtual group.). To create an empty virtual group, run
19413@kbd{G V} (@code{gnus-group-make-empty-virtual}) in the group buffer
19414and edit the method regexp with @kbd{M-e}
19415(@code{gnus-group-edit-group-method})
19416
19417Here's an example @code{nnvirtual} method that collects all Andrea Dworkin
19418newsgroups into one, big, happy newsgroup:
19419
19420@lisp
19421(nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*")
19422@end lisp
19423
19424The component groups can be native or foreign; everything should work
19425smoothly, but if your computer explodes, it was probably my fault.
19426
19427Collecting the same group from several servers might actually be a good
19428idea if users have set the Distribution header to limit distribution.
19429If you would like to read @samp{soc.motss} both from a server in Japan
19430and a server in Norway, you could use the following as the group regexp:
19431
19432@example
19433"^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$"
19434@end example
19435
19436(Remember, though, that if you're creating the group with @kbd{G m}, you
19437shouldn't double the backslashes, and you should leave off the quote
19438characters at the beginning and the end of the string.)
19439
19440This should work kinda smoothly---all articles from both groups should
19441end up in this one, and there should be no duplicates. Threading (and
19442the rest) will still work as usual, but there might be problems with the
19443sequence of articles. Sorting on date might be an option here
19444(@pxref{Selecting a Group}).
19445
19446One limitation, however---all groups included in a virtual
19447group have to be alive (i.e., subscribed or unsubscribed). Killed or
19448zombie groups can't be component groups for @code{nnvirtual} groups.
19449
19450@vindex nnvirtual-always-rescan
19451If the @code{nnvirtual-always-rescan} variable is non-@code{nil} (which
19452is the default), @code{nnvirtual} will always scan groups for unread
19453articles when entering a virtual group. If this variable is @code{nil}
19454and you read articles in a component group after the virtual group has
19455been activated, the read articles from the component group will show up
19456when you enter the virtual group. You'll also see this effect if you
19457have two virtual groups that have a component group in common. If
19458that's the case, you should set this variable to @code{t}. Or you can
19459just tap @code{M-g} on the virtual group every time before you enter
19460it---it'll have much the same effect.
19461
19462@code{nnvirtual} can have both mail and news groups as component groups.
19463When responding to articles in @code{nnvirtual} groups, @code{nnvirtual}
19464has to ask the back end of the component group the article comes from
19465whether it is a news or mail back end. However, when you do a @kbd{^},
19466there is typically no sure way for the component back end to know this,
19467and in that case @code{nnvirtual} tells Gnus that the article came from a
19468not-news back end. (Just to be on the safe side.)
19469
19470@kbd{C-c C-n} in the message buffer will insert the @code{Newsgroups}
19471line from the article you respond to in these cases.
19472
19473@code{nnvirtual} groups do not inherit anything but articles and marks
19474from component groups---group parameters, for instance, are not
19475inherited.
19476
19477
19478@node Kibozed Groups
19479@subsection Kibozed Groups
19480@cindex nnkiboze
19481@cindex kibozing
19482
19483@dfn{Kibozing} is defined by the @acronym{OED} as ``grepping through
19484(parts of) the news feed''. @code{nnkiboze} is a back end that will
19485do this for you. Oh joy! Now you can grind any @acronym{NNTP} server
19486down to a halt with useless requests! Oh happiness!
19487
19488@kindex G k (Group)
19489To create a kibozed group, use the @kbd{G k} command in the group
19490buffer.
19491
19492The address field of the @code{nnkiboze} method is, as with
19493@code{nnvirtual}, a regexp to match groups to be ``included'' in the
19494@code{nnkiboze} group. That's where most similarities between
19495@code{nnkiboze} and @code{nnvirtual} end.
19496
19497In addition to this regexp detailing component groups, an
19498@code{nnkiboze} group must have a score file to say what articles are
19499to be included in the group (@pxref{Scoring}).
19500
19501@kindex M-x nnkiboze-generate-groups
19502@findex nnkiboze-generate-groups
19503You must run @kbd{M-x nnkiboze-generate-groups} after creating the
19504@code{nnkiboze} groups you want to have. This command will take time.
19505Lots of time. Oodles and oodles of time. Gnus has to fetch the
19506headers from all the articles in all the component groups and run them
19507through the scoring process to determine if there are any articles in
19508the groups that are to be part of the @code{nnkiboze} groups.
19509
19510Please limit the number of component groups by using restrictive
19511regexps. Otherwise your sysadmin may become annoyed with you, and the
19512@acronym{NNTP} site may throw you off and never let you back in again.
19513Stranger things have happened.
19514
19515@code{nnkiboze} component groups do not have to be alive---they can be dead,
19516and they can be foreign. No restrictions.
19517
19518@vindex nnkiboze-directory
19519The generation of an @code{nnkiboze} group means writing two files in
19520@code{nnkiboze-directory}, which is @file{~/News/kiboze/} by default.
19521One contains the @acronym{NOV} header lines for all the articles in
19522the group, and the other is an additional @file{.newsrc} file to store
19523information on what groups have been searched through to find
19524component articles.
19525
19526Articles marked as read in the @code{nnkiboze} group will have
19527their @acronym{NOV} lines removed from the @acronym{NOV} file.
19528
19529
19530@node Email Based Diary
19531@section Email Based Diary
19532@cindex diary
19533@cindex email based diary
19534@cindex calendar
19535
19536This section describes a special mail back end called @code{nndiary},
19537and its companion library @code{gnus-diary}. It is ``special'' in the
19538sense that it is not meant to be one of the standard alternatives for
19539reading mail with Gnus. See @ref{Choosing a Mail Back End} for that.
19540Instead, it is used to treat @emph{some} of your mails in a special way,
19541namely, as event reminders.
19542
19543Here is a typical scenario:
19544
19545@itemize @bullet
19546@item
19547You've got a date with Andy Mc Dowell or Bruce Willis (select according
19548to your sexual preference) in one month. You don't want to forget it.
19549@item
19550So you send a ``reminder'' message (actually, a diary one) to yourself.
19551@item
19552You forget all about it and keep on getting and reading new mail, as usual.
19553@item
19554From time to time, as you type `g' in the group buffer and as the date
19555is getting closer, the message will pop up again to remind you of your
19556appointment, just as if it were new and unread.
19557@item
19558Read your ``new'' messages, this one included, and start dreaming again
19559of the night you're gonna have.
19560@item
19561Once the date is over (you actually fell asleep just after dinner), the
19562message will be automatically deleted if it is marked as expirable.
19563@end itemize
19564
19565The Gnus Diary back end has the ability to handle regular appointments
19566(that wouldn't ever be deleted) as well as punctual ones, operates as a
19567real mail back end and is configurable in many ways. All of this is
19568explained in the sections below.
19569
19570@menu
19571* The NNDiary Back End:: Basic setup and usage.
19572* The Gnus Diary Library:: Utility toolkit on top of nndiary.
19573* Sending or Not Sending:: A final note on sending diary messages.
19574@end menu
19575
19576
19577@node The NNDiary Back End
19578@subsection The NNDiary Back End
19579@cindex nndiary
19580@cindex the nndiary back end
19581
19582@code{nndiary} is a back end very similar to @code{nnml} (@pxref{Mail
19583Spool}). Actually, it could appear as a mix of @code{nnml} and
19584@code{nndraft}. If you know @code{nnml}, you're already familiar with
19585the message storing scheme of @code{nndiary}: one file per message, one
19586directory per group.
19587
19588 Before anything, there is one requirement to be able to run
19589@code{nndiary} properly: you @emph{must} use the group timestamp feature
19590of Gnus. This adds a timestamp to each group's parameters. @ref{Group
19591Timestamp} to see how it's done.
19592
19593@menu
19594* Diary Messages:: What makes a message valid for nndiary.
19595* Running NNDiary:: NNDiary has two modes of operation.
19596* Customizing NNDiary:: Bells and whistles.
19597@end menu
19598
19599@node Diary Messages
19600@subsubsection Diary Messages
19601@cindex nndiary messages
19602@cindex nndiary mails
19603
19604@code{nndiary} messages are just normal ones, except for the mandatory
19605presence of 7 special headers. These headers are of the form
19606@code{X-Diary-<something>}, @code{<something>} being one of
19607@code{Minute}, @code{Hour}, @code{Dom}, @code{Month}, @code{Year},
19608@code{Time-Zone} and @code{Dow}. @code{Dom} means ``Day of Month'', and
19609@code{dow} means ``Day of Week''. These headers actually behave like
19610crontab specifications and define the event date(s):
19611
19612@itemize @bullet
19613@item
19614For all headers except the @code{Time-Zone} one, a header value is
19615either a star (meaning all possible values), or a list of fields
19616(separated by a comma).
19617@item
19618A field is either an integer, or a range.
19619@item
19620A range is two integers separated by a dash.
19621@item
19622Possible integer values are 0--59 for @code{Minute}, 0--23 for
19623@code{Hour}, 1--31 for @code{Dom}, 1--12 for @code{Month}, above 1971
19624for @code{Year} and 0--6 for @code{Dow} (0 meaning Sunday).
19625@item
19626As a special case, a star in either @code{Dom} or @code{Dow} doesn't
19627mean ``all possible values'', but ``use only the other field''. Note
19628that if both are star'ed, the use of either one gives the same result.
19629@item
19630The @code{Time-Zone} header is special in that it can only have one
19631value (@code{GMT}, for instance). A star doesn't mean ``all possible
19632values'' (because it makes no sense), but ``the current local time
19633zone''. Most of the time, you'll be using a star here. However, for a
19634list of available time zone values, see the variable
19635@code{nndiary-headers}.
19636@end itemize
19637
19638As a concrete example, here are the diary headers to add to your message
19639for specifying ``Each Monday and each 1st of month, at 12:00, 20:00,
1964021:00, 22:00, 23:00 and 24:00, from 1999 to 2010'' (I'll let you find
19641what to do then):
19642
19643@example
19644X-Diary-Minute: 0
19645X-Diary-Hour: 12, 20-24
19646X-Diary-Dom: 1
19647X-Diary-Month: *
19648X-Diary-Year: 1999-2010
19649X-Diary-Dow: 1
19650X-Diary-Time-Zone: *
19651@end example
19652
19653@node Running NNDiary
19654@subsubsection Running NNDiary
19655@cindex running nndiary
19656@cindex nndiary operation modes
19657
19658@code{nndiary} has two modes of operation: ``traditional'' (the default)
19659and ``autonomous''. In traditional mode, @code{nndiary} does not get new
19660mail by itself. You have to move (@kbd{B m}) or copy (@kbd{B c}) mails
19661from your primary mail back end to nndiary groups in order to handle them
19662as diary messages. In autonomous mode, @code{nndiary} retrieves its own
19663mail and handles it independently from your primary mail back end.
19664
19665One should note that Gnus is not inherently designed to allow several
19666``master'' mail back ends at the same time. However, this does make
19667sense with @code{nndiary}: you really want to send and receive diary
19668messages to your diary groups directly. So, @code{nndiary} supports
19669being sort of a ``second primary mail back end'' (to my knowledge, it is
19670the only back end offering this feature). However, there is a limitation
19671(which I hope to fix some day): respooling doesn't work in autonomous
19672mode.
19673
19674In order to use @code{nndiary} in autonomous mode, you have several
19675things to do:
19676
19677@itemize @bullet
19678@item
19679Allow @code{nndiary} to retrieve new mail by itself. Put the following
19680line in your @file{~/.gnus.el} file:
19681
19682@lisp
19683(setq nndiary-get-new-mail t)
19684@end lisp
19685@item
19686You must arrange for diary messages (those containing @code{X-Diary-*}
19687headers) to be split in a private folder @emph{before} Gnus treat them.
19688Again, this is needed because Gnus cannot (yet ?) properly handle
19689multiple primary mail back ends. Getting those messages from a separate
19690source will compensate this misfeature to some extent.
19691
19692As an example, here's my procmailrc entry to store diary files in
19693@file{~/.nndiary} (the default @code{nndiary} mail source file):
19694
19695@example
19696:0 HD :
19697* ^X-Diary
19698.nndiary
19699@end example
19700@end itemize
19701
19702Once this is done, you might want to customize the following two options
19703that affect the diary mail retrieval and splitting processes:
19704
19705@defvar nndiary-mail-sources
19706This is the diary-specific replacement for the standard
19707@code{mail-sources} variable. It obeys the same syntax, and defaults to
19708@code{(file :path "~/.nndiary")}.
19709@end defvar
19710
19711@defvar nndiary-split-methods
19712This is the diary-specific replacement for the standard
19713@code{nnmail-split-methods} variable. It obeys the same syntax.
19714@end defvar
19715
19716 Finally, you may add a permanent @code{nndiary} virtual server
19717(something like @code{(nndiary "diary")} should do) to your
19718@code{gnus-secondary-select-methods}.
19719
19720 Hopefully, almost everything (see the TODO section in
19721@file{nndiary.el}) will work as expected when you restart Gnus: in
19722autonomous mode, typing @kbd{g} and @kbd{M-g} in the group buffer, will
19723also get your new diary mails and split them according to your
19724diary-specific rules, @kbd{F} will find your new diary groups etc.
19725
19726@node Customizing NNDiary
19727@subsubsection Customizing NNDiary
19728@cindex customizing nndiary
19729@cindex nndiary customization
19730
19731Now that @code{nndiary} is up and running, it's time to customize it.
19732The custom group is called @code{nndiary} (no, really ?!). You should
19733browse it to figure out which options you'd like to tweak. The following
19734two variables are probably the only ones you will want to change:
19735
19736@defvar nndiary-reminders
19737This is the list of times when you want to be reminded of your
19738appointments (e.g. 3 weeks before, then 2 days before, then 1 hour
19739before and that's it). Remember that ``being reminded'' means that the
19740diary message will pop up as brand new and unread again when you get new
19741mail.
19742@end defvar
19743
19744@defvar nndiary-week-starts-on-monday
19745Rather self-explanatory. Otherwise, Sunday is assumed (this is the
19746default).
19747@end defvar
19748
19749
19750@node The Gnus Diary Library
19751@subsection The Gnus Diary Library
19752@cindex gnus-diary
19753@cindex the gnus diary library
19754
19755Using @code{nndiary} manually (I mean, writing the headers by hand and
19756so on) would be rather boring. Fortunately, there is a library called
19757@code{gnus-diary} written on top of @code{nndiary}, that does many
19758useful things for you.
19759
19760 In order to use it, add the following line to your @file{~/.gnus.el} file:
19761
19762@lisp
19763(require 'gnus-diary)
19764@end lisp
19765
19766 Also, you shouldn't use any @code{gnus-user-format-function-[d|D]}
19767(@pxref{Summary Buffer Lines}). @code{gnus-diary} provides both of these
19768(sorry if you used them before).
19769
19770
19771@menu
19772* Diary Summary Line Format:: A nicer summary buffer line format.
19773* Diary Articles Sorting:: A nicer way to sort messages.
19774* Diary Headers Generation:: Not doing it manually.
19775* Diary Group Parameters:: Not handling them manually.
19776@end menu
19777
19778@node Diary Summary Line Format
19779@subsubsection Diary Summary Line Format
19780@cindex diary summary buffer line
19781@cindex diary summary line format
19782
19783Displaying diary messages in standard summary line format (usually
19784something like @samp{From Joe: Subject}) is pretty useless. Most of
19785the time, you're the one who wrote the message, and you mostly want to
19786see the event's date.
19787
19788 @code{gnus-diary} provides two supplemental user formats to be used in
19789summary line formats. @code{D} corresponds to a formatted time string
19790for the next occurrence of the event (e.g. ``Sat, Sep 22 01, 12:00''),
19791while @code{d} corresponds to an approximative remaining time until the
19792next occurrence of the event (e.g. ``in 6 months, 1 week'').
19793
19794 For example, here's how Joe's birthday is displayed in my
19795@code{nndiary+diary:birthdays} summary buffer (note that the message is
19796expirable, but will never be deleted, as it specifies a periodic event):
19797
19798@example
19799 E Sat, Sep 22 01, 12:00: Joe's birthday (in 6 months, 1 week)
19800@end example
19801
19802In order to get something like the above, you would normally add the
19803following line to your diary groups'parameters:
19804
19805@lisp
19806(gnus-summary-line-format "%U%R%z %uD: %(%s%) (%ud)\n")
19807@end lisp
19808
19809However, @code{gnus-diary} does it automatically (@pxref{Diary Group
19810Parameters}). You can however customize the provided summary line format
19811with the following user options:
19812
19813@defvar gnus-diary-summary-line-format
19814Defines the summary line format used for diary groups (@pxref{Summary
19815Buffer Lines}). @code{gnus-diary} uses it to automatically update the
19816diary groups'parameters.
19817@end defvar
19818
19819@defvar gnus-diary-time-format
19820Defines the format to display dates in diary summary buffers. This is
19821used by the @code{D} user format. See the docstring for details.
19822@end defvar
19823
19824@defvar gnus-diary-delay-format-function
19825Defines the format function to use for displaying delays (remaining
19826times) in diary summary buffers. This is used by the @code{d} user
19827format. There are currently built-in functions for English and French;
19828you can also define your own. See the docstring for details.
19829@end defvar
19830
19831@node Diary Articles Sorting
19832@subsubsection Diary Articles Sorting
19833@cindex diary articles sorting
19834@cindex diary summary lines sorting
19835@findex gnus-summary-sort-by-schedule
19836@findex gnus-thread-sort-by-schedule
19837@findex gnus-article-sort-by-schedule
19838
19839@code{gnus-diary} provides new sorting functions (@pxref{Sorting the
19840Summary Buffer} ) called @code{gnus-summary-sort-by-schedule},
19841@code{gnus-thread-sort-by-schedule} and
19842@code{gnus-article-sort-by-schedule}. These functions let you organize
19843your diary summary buffers from the closest event to the farthest one.
19844
19845@code{gnus-diary} automatically installs
19846@code{gnus-summary-sort-by-schedule} as a menu item in the summary
19847buffer's ``sort'' menu, and the two others as the primary (hence
19848default) sorting functions in the group parameters (@pxref{Diary Group
19849Parameters}).
19850
19851@node Diary Headers Generation
19852@subsubsection Diary Headers Generation
19853@cindex diary headers generation
19854@findex gnus-diary-check-message
19855
19856@code{gnus-diary} provides a function called
19857@code{gnus-diary-check-message} to help you handle the @code{X-Diary-*}
19858headers. This function ensures that the current message contains all the
19859required diary headers, and prompts you for values or corrections if
19860needed.
19861
19862 This function is hooked into the @code{nndiary} back end, so that
19863moving or copying an article to a diary group will trigger it
d55fe5bb
MB
19864automatically. It is also bound to @kbd{C-c C-f d} in
19865@code{message-mode} and @code{article-edit-mode} in order to ease the
19866process of converting a usual mail to a diary one.
4009494e
GM
19867
19868 This function takes a prefix argument which will force prompting of
19869all diary headers, regardless of their presence or validity. That way,
19870you can very easily reschedule an already valid diary message, for
19871instance.
19872
19873@node Diary Group Parameters
19874@subsubsection Diary Group Parameters
19875@cindex diary group parameters
19876
19877When you create a new diary group, or visit one, @code{gnus-diary}
19878automatically checks your group parameters and if needed, sets the
19879summary line format to the diary-specific value, installs the
19880diary-specific sorting functions, and also adds the different
19881@code{X-Diary-*} headers to the group's posting-style. It is then easier
19882to send a diary message, because if you use @kbd{C-u a} or @kbd{C-u m}
19883on a diary group to prepare a message, these headers will be inserted
19884automatically (although not filled with proper values yet).
19885
19886@node Sending or Not Sending
19887@subsection Sending or Not Sending
19888
19889Well, assuming you've read all of the above, here are two final notes on
19890mail sending with @code{nndiary}:
19891
19892@itemize @bullet
19893@item
19894@code{nndiary} is a @emph{real} mail back end. You really send real diary
19895messsages for real. This means for instance that you can give
19896appointments to anybody (provided they use Gnus and @code{nndiary}) by
19897sending the diary message to them as well.
19898@item
19899However, since @code{nndiary} also has a @code{request-post} method, you
19900can also use @kbd{C-u a} instead of @kbd{C-u m} on a diary group and the
19901message won't actually be sent; just stored locally in the group. This
19902comes in very handy for private appointments.
19903@end itemize
19904
19905@node Gnus Unplugged
19906@section Gnus Unplugged
19907@cindex offline
19908@cindex unplugged
19909@cindex agent
19910@cindex Gnus agent
19911@cindex Gnus unplugged
19912
19913In olden times (ca. February '88), people used to run their newsreaders
19914on big machines with permanent connections to the net. News transport
19915was dealt with by news servers, and all the newsreaders had to do was to
19916read news. Believe it or not.
19917
19918Nowadays most people read news and mail at home, and use some sort of
19919modem to connect to the net. To avoid running up huge phone bills, it
19920would be nice to have a way to slurp down all the news and mail, hang up
19921the phone, read for several hours, and then upload any responses you
19922have to make. And then you repeat the procedure.
19923
19924Of course, you can use news servers for doing this as well. I've used
19925@code{inn} together with @code{slurp}, @code{pop} and @code{sendmail}
19926for some years, but doing that's a bore. Moving the news server
19927functionality up to the newsreader makes sense if you're the only person
19928reading news on a machine.
19929
19930Setting up Gnus as an ``offline'' newsreader is quite simple. In
01c52d31
MB
19931fact, you don't have to configure anything as the agent is now enabled
19932by default (@pxref{Agent Variables, gnus-agent}).
4009494e
GM
19933
19934Of course, to use it as such, you have to learn a few new commands.
19935
19936@menu
19937* Agent Basics:: How it all is supposed to work.
19938* Agent Categories:: How to tell the Gnus Agent what to download.
19939* Agent Commands:: New commands for all the buffers.
19940* Agent Visuals:: Ways that the agent may effect your summary buffer.
19941* Agent as Cache:: The Agent is a big cache too.
19942* Agent Expiry:: How to make old articles go away.
19943* Agent Regeneration:: How to recover from lost connections and other accidents.
01c52d31 19944* Agent and flags:: How the Agent maintains flags.
4009494e
GM
19945* Agent and IMAP:: How to use the Agent with @acronym{IMAP}.
19946* Outgoing Messages:: What happens when you post/mail something?
19947* Agent Variables:: Customizing is fun.
19948* Example Setup:: An example @file{~/.gnus.el} file for offline people.
19949* Batching Agents:: How to fetch news from a @code{cron} job.
19950* Agent Caveats:: What you think it'll do and what it does.
19951@end menu
19952
19953
19954@node Agent Basics
19955@subsection Agent Basics
19956
19957First, let's get some terminology out of the way.
19958
19959The Gnus Agent is said to be @dfn{unplugged} when you have severed the
19960connection to the net (and notified the Agent that this is the case).
19961When the connection to the net is up again (and Gnus knows this), the
19962Agent is @dfn{plugged}.
19963
19964The @dfn{local} machine is the one you're running on, and which isn't
19965connected to the net continuously.
19966
19967@dfn{Downloading} means fetching things from the net to your local
19968machine. @dfn{Uploading} is doing the opposite.
19969
19970You know that Gnus gives you all the opportunity you'd ever want for
19971shooting yourself in the foot. Some people call it flexibility. Gnus
19972is also customizable to a great extent, which means that the user has a
19973say on how Gnus behaves. Other newsreaders might unconditionally shoot
19974you in your foot, but with Gnus, you have a choice!
19975
19976Gnus is never really in plugged or unplugged state. Rather, it applies
19977that state to each server individually. This means that some servers
19978can be plugged while others can be unplugged. Additionally, some
19979servers can be ignored by the Agent altogether (which means that
19980they're kinda like plugged always).
19981
19982So when you unplug the Agent and then wonder why is Gnus opening a
19983connection to the Net, the next step to do is to look whether all
19984servers are agentized. If there is an unagentized server, you found
19985the culprit.
19986
19987Another thing is the @dfn{offline} state. Sometimes, servers aren't
19988reachable. When Gnus notices this, it asks you whether you want the
19989server to be switched to offline state. If you say yes, then the
19990server will behave somewhat as if it was unplugged, except that Gnus
19991will ask you whether you want to switch it back online again.
19992
19993Let's take a typical Gnus session using the Agent.
19994
19995@itemize @bullet
19996
19997@item
19998@findex gnus-unplugged
19999You start Gnus with @code{gnus-unplugged}. This brings up the Gnus
20000Agent in a disconnected state. You can read all the news that you have
20001already fetched while in this mode.
20002
20003@item
20004You then decide to see whether any new news has arrived. You connect
20005your machine to the net (using PPP or whatever), and then hit @kbd{J j}
20006to make Gnus become @dfn{plugged} and use @kbd{g} to check for new mail
20007as usual. To check for new mail in unplugged mode (@pxref{Mail
20008Source Specifiers}).
20009
20010@item
20011You can then read the new news immediately, or you can download the
20012news onto your local machine. If you want to do the latter, you press
20013@kbd{g} to check if there are any new news and then @kbd{J s} to fetch
20014all the eligible articles in all the groups. (To let Gnus know which
20015articles you want to download, @pxref{Agent Categories}).
20016
20017@item
20018After fetching the articles, you press @kbd{J j} to make Gnus become
20019unplugged again, and you shut down the PPP thing (or whatever). And
20020then you read the news offline.
20021
20022@item
20023And then you go to step 2.
20024@end itemize
20025
20026Here are some things you should do the first time (or so) that you use
20027the Agent.
20028
20029@itemize @bullet
20030
20031@item
20032Decide which servers should be covered by the Agent. If you have a mail
20033back end, it would probably be nonsensical to have it covered by the
20034Agent. Go to the server buffer (@kbd{^} in the group buffer) and press
20035@kbd{J a} on the server (or servers) that you wish to have covered by the
20036Agent (@pxref{Server Agent Commands}), or @kbd{J r} on automatically
20037added servers you do not wish to have covered by the Agent. By default,
20038all @code{nntp} and @code{nnimap} servers in @code{gnus-select-method} and
20039@code{gnus-secondary-select-methods} are agentized.
20040
20041@item
20042Decide on download policy. It's fairly simple once you decide whether
20043you are going to use agent categories, topic parameters, and/or group
20044parameters to implement your policy. If you're new to gnus, it
20045is probably best to start with a category, @xref{Agent Categories}.
20046
20047Both topic parameters (@pxref{Topic Parameters}) and agent categories
20048(@pxref{Agent Categories}) provide for setting a policy that applies
20049to multiple groups. Which you use is entirely up to you. Topic
20050parameters do override categories so, if you mix the two, you'll have
20051to take that into account. If you have a few groups that deviate from
20052your policy, you can use group parameters (@pxref{Group Parameters}) to
20053configure them.
20054
20055@item
20056Uhm@dots{} that's it.
20057@end itemize
20058
20059
20060@node Agent Categories
20061@subsection Agent Categories
20062
20063One of the main reasons to integrate the news transport layer into the
20064newsreader is to allow greater control over what articles to download.
20065There's not much point in downloading huge amounts of articles, just to
20066find out that you're not interested in reading any of them. It's better
20067to be somewhat more conservative in choosing what to download, and then
20068mark the articles for downloading manually if it should turn out that
20069you're interested in the articles anyway.
20070
20071One of the more effective methods for controlling what is to be
20072downloaded is to create a @dfn{category} and then assign some (or all)
20073groups to this category. Groups that do not belong in any other
20074category belong to the @code{default} category. Gnus has its own
20075buffer for creating and managing categories.
20076
20077If you prefer, you can also use group parameters (@pxref{Group
20078Parameters}) and topic parameters (@pxref{Topic Parameters}) for an
20079alternative approach to controlling the agent. The only real
20080difference is that categories are specific to the agent (so there is
20081less to learn) while group and topic parameters include the kitchen
20082sink.
20083
20084Since you can set agent parameters in several different places we have
20085a rule to decide which source to believe. This rule specifies that
20086the parameter sources are checked in the following order: group
20087parameters, topic parameters, agent category, and finally customizable
20088variables. So you can mix all of these sources to produce a wide range
20089of behavior, just don't blame me if you don't remember where you put
20090your settings.
20091
20092@menu
20093* Category Syntax:: What a category looks like.
20094* Category Buffer:: A buffer for maintaining categories.
20095* Category Variables:: Customize'r'Us.
20096@end menu
20097
20098
20099@node Category Syntax
20100@subsubsection Category Syntax
20101
20102A category consists of a name, the list of groups belonging to the
20103category, and a number of optional parameters that override the
20104customizable variables. The complete list of agent parameters are
20105listed below.
20106
20107@cindex Agent Parameters
20108@table @code
01c52d31 20109@item agent-groups
4009494e
GM
20110The list of groups that are in this category.
20111
01c52d31 20112@item agent-predicate
4009494e
GM
20113A predicate which (generally) gives a rough outline of which articles
20114are eligible for downloading; and
20115
01c52d31 20116@item agent-score
4009494e
GM
20117a score rule which (generally) gives you a finer granularity when
20118deciding what articles to download. (Note that this @dfn{download
20119score} is not necessarily related to normal scores.)
20120
01c52d31 20121@item agent-enable-expiration
4009494e
GM
20122a boolean indicating whether the agent should expire old articles in
20123this group. Most groups should be expired to conserve disk space. In
20124fact, its probably safe to say that the gnus.* hierarchy contains the
20125only groups that should not be expired.
20126
01c52d31 20127@item agent-days-until-old
4009494e
GM
20128an integer indicating the number of days that the agent should wait
20129before deciding that a read article is safe to expire.
20130
01c52d31 20131@item agent-low-score
4009494e
GM
20132an integer that overrides the value of @code{gnus-agent-low-score}.
20133
01c52d31 20134@item agent-high-score
4009494e
GM
20135an integer that overrides the value of @code{gnus-agent-high-score}.
20136
01c52d31 20137@item agent-short-article
4009494e
GM
20138an integer that overrides the value of
20139@code{gnus-agent-short-article}.
20140
01c52d31 20141@item agent-long-article
4009494e
GM
20142an integer that overrides the value of @code{gnus-agent-long-article}.
20143
01c52d31 20144@item agent-enable-undownloaded-faces
4009494e 20145a symbol indicating whether the summary buffer should display
01c52d31
MB
20146undownloaded articles using the @code{gnus-summary-*-undownloaded-face}
20147faces. Any symbol other than @code{nil} will enable the use of
20148undownloaded faces.
4009494e
GM
20149@end table
20150
20151The name of a category can not be changed once the category has been
20152created.
20153
20154Each category maintains a list of groups that are exclusive members of
20155that category. The exclusivity rule is automatically enforced, add a
20156group to a new category and it is automatically removed from its old
20157category.
20158
20159A predicate in its simplest form can be a single predicate such as
20160@code{true} or @code{false}. These two will download every available
20161article or nothing respectively. In the case of these two special
20162predicates an additional score rule is superfluous.
20163
20164Predicates of @code{high} or @code{low} download articles in respect of
20165their scores in relationship to @code{gnus-agent-high-score} and
20166@code{gnus-agent-low-score} as described below.
20167
20168To gain even finer control of what is to be regarded eligible for
20169download a predicate can consist of a number of predicates with logical
20170operators sprinkled in between.
20171
20172Perhaps some examples are in order.
20173
20174Here's a simple predicate. (It's the default predicate, in fact, used
20175for all groups that don't belong to any other category.)
20176
20177@lisp
20178short
20179@end lisp
20180
20181Quite simple, eh? This predicate is true if and only if the article is
20182short (for some value of ``short'').
20183
20184Here's a more complex predicate:
20185
20186@lisp
20187(or high
20188 (and
20189 (not low)
20190 (not long)))
20191@end lisp
20192
20193This means that an article should be downloaded if it has a high score,
20194or if the score is not low and the article is not long. You get the
20195drift.
20196
20197The available logical operators are @code{or}, @code{and} and
20198@code{not}. (If you prefer, you can use the more ``C''-ish operators
20199@samp{|}, @code{&} and @code{!} instead.)
20200
20201The following predicates are pre-defined, but if none of these fit what
20202you want to do, you can write your own.
20203
20204When evaluating each of these predicates, the named constant will be
20205bound to the value determined by calling
20206@code{gnus-agent-find-parameter} on the appropriate parameter. For
20207example, gnus-agent-short-article will be bound to
20208@code{(gnus-agent-find-parameter group 'agent-short-article)}. This
20209means that you can specify a predicate in your category then tune that
20210predicate to individual groups.
20211
20212@table @code
20213@item short
20214True if the article is shorter than @code{gnus-agent-short-article}
20215lines; default 100.
20216
20217@item long
20218True if the article is longer than @code{gnus-agent-long-article}
20219lines; default 200.
20220
20221@item low
20222True if the article has a download score less than
20223@code{gnus-agent-low-score}; default 0.
20224
20225@item high
20226True if the article has a download score greater than
20227@code{gnus-agent-high-score}; default 0.
20228
20229@item spam
20230True if the Gnus Agent guesses that the article is spam. The
20231heuristics may change over time, but at present it just computes a
20232checksum and sees whether articles match.
20233
20234@item true
20235Always true.
20236
20237@item false
20238Always false.
20239@end table
20240
20241If you want to create your own predicate function, here's what you have
20242to know: The functions are called with no parameters, but the
20243@code{gnus-headers} and @code{gnus-score} dynamic variables are bound to
20244useful values.
20245
20246For example, you could decide that you don't want to download articles
20247that were posted more than a certain number of days ago (e.g. posted
20248more than @code{gnus-agent-expire-days} ago) you might write a function
20249something along the lines of the following:
20250
20251@lisp
20252(defun my-article-old-p ()
20253 "Say whether an article is old."
20254 (< (time-to-days (date-to-time (mail-header-date gnus-headers)))
20255 (- (time-to-days (current-time)) gnus-agent-expire-days)))
20256@end lisp
20257
20258with the predicate then defined as:
20259
20260@lisp
20261(not my-article-old-p)
20262@end lisp
20263
20264or you could append your predicate to the predefined
20265@code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or
20266wherever.
20267
20268@lisp
20269(require 'gnus-agent)
20270(setq gnus-category-predicate-alist
20271 (append gnus-category-predicate-alist
20272 '((old . my-article-old-p))))
20273@end lisp
20274
20275and simply specify your predicate as:
20276
20277@lisp
20278(not old)
20279@end lisp
20280
20281If/when using something like the above, be aware that there are many
20282misconfigured systems/mailers out there and so an article's date is not
20283always a reliable indication of when it was posted. Hell, some people
20284just don't give a damn.
20285
20286The above predicates apply to @emph{all} the groups which belong to the
20287category. However, if you wish to have a specific predicate for an
20288individual group within a category, or you're just too lazy to set up a
20289new category, you can enter a group's individual predicate in its group
20290parameters like so:
20291
20292@lisp
20293(agent-predicate . short)
20294@end lisp
20295
20296This is the group/topic parameter equivalent of the agent category default.
20297Note that when specifying a single word predicate like this, the
20298@code{agent-predicate} specification must be in dotted pair notation.
20299
20300The equivalent of the longer example from above would be:
20301
20302@lisp
20303(agent-predicate or high (and (not low) (not long)))
20304@end lisp
20305
20306The outer parenthesis required in the category specification are not
20307entered here as, not being in dotted pair notation, the value of the
20308predicate is assumed to be a list.
20309
20310
20311Now, the syntax of the download score is the same as the syntax of
20312normal score files, except that all elements that require actually
20313seeing the article itself are verboten. This means that only the
20314following headers can be scored on: @code{Subject}, @code{From},
20315@code{Date}, @code{Message-ID}, @code{References}, @code{Chars},
20316@code{Lines}, and @code{Xref}.
20317
20318As with predicates, the specification of the @code{download score rule}
20319to use in respect of a group can be in either the category definition if
20320it's to be applicable to all groups in therein, or a group's parameters
20321if it's to be specific to that group.
20322
20323In both of these places the @code{download score rule} can take one of
20324three forms:
20325
20326@enumerate
20327@item
20328Score rule
20329
20330This has the same syntax as a normal Gnus score file except only a
20331subset of scoring keywords are available as mentioned above.
20332
20333example:
20334
20335@itemize @bullet
20336@item
20337Category specification
20338
20339@lisp
20340(("from"
20341 ("Lars Ingebrigtsen" 1000000 nil s))
20342("lines"
20343 (500 -100 nil <)))
20344@end lisp
20345
20346@item
20347Group/Topic Parameter specification
20348
20349@lisp
20350(agent-score ("from"
20351 ("Lars Ingebrigtsen" 1000000 nil s))
20352 ("lines"
20353 (500 -100 nil <)))
20354@end lisp
20355
20356Again, note the omission of the outermost parenthesis here.
20357@end itemize
20358
20359@item
20360Agent score file
20361
20362These score files must @emph{only} contain the permitted scoring
20363keywords stated above.
20364
20365example:
20366
20367@itemize @bullet
20368@item
20369Category specification
20370
20371@lisp
20372("~/News/agent.SCORE")
20373@end lisp
20374
20375or perhaps
20376
20377@lisp
20378("~/News/agent.SCORE" "~/News/agent.group.SCORE")
20379@end lisp
20380
20381@item
20382Group Parameter specification
20383
20384@lisp
20385(agent-score "~/News/agent.SCORE")
20386@end lisp
20387
20388Additional score files can be specified as above. Need I say anything
20389about parenthesis?
20390@end itemize
20391
20392@item
20393Use @code{normal} score files
20394
20395If you don't want to maintain two sets of scoring rules for a group, and
20396your desired @code{downloading} criteria for a group are the same as your
20397@code{reading} criteria then you can tell the agent to refer to your
20398@code{normal} score files when deciding what to download.
20399
20400These directives in either the category definition or a group's
20401parameters will cause the agent to read in all the applicable score
20402files for a group, @emph{filtering out} those sections that do not
20403relate to one of the permitted subset of scoring keywords.
20404
20405@itemize @bullet
20406@item
20407Category Specification
20408
20409@lisp
20410file
20411@end lisp
20412
20413@item
20414Group Parameter specification
20415
20416@lisp
20417(agent-score . file)
20418@end lisp
20419@end itemize
20420@end enumerate
20421
20422@node Category Buffer
20423@subsubsection Category Buffer
20424
20425You'd normally do all category maintenance from the category buffer.
20426When you enter it for the first time (with the @kbd{J c} command from
20427the group buffer), you'll only see the @code{default} category.
20428
20429The following commands are available in this buffer:
20430
20431@table @kbd
20432@item q
20433@kindex q (Category)
20434@findex gnus-category-exit
20435Return to the group buffer (@code{gnus-category-exit}).
20436
20437@item e
20438@kindex e (Category)
20439@findex gnus-category-customize-category
20440Use a customization buffer to set all of the selected category's
20441parameters at one time (@code{gnus-category-customize-category}).
20442
20443@item k
20444@kindex k (Category)
20445@findex gnus-category-kill
20446Kill the current category (@code{gnus-category-kill}).
20447
20448@item c
20449@kindex c (Category)
20450@findex gnus-category-copy
20451Copy the current category (@code{gnus-category-copy}).
20452
20453@item a
20454@kindex a (Category)
20455@findex gnus-category-add
20456Add a new category (@code{gnus-category-add}).
20457
20458@item p
20459@kindex p (Category)
20460@findex gnus-category-edit-predicate
20461Edit the predicate of the current category
20462(@code{gnus-category-edit-predicate}).
20463
20464@item g
20465@kindex g (Category)
20466@findex gnus-category-edit-groups
20467Edit the list of groups belonging to the current category
20468(@code{gnus-category-edit-groups}).
20469
20470@item s
20471@kindex s (Category)
20472@findex gnus-category-edit-score
20473Edit the download score rule of the current category
20474(@code{gnus-category-edit-score}).
20475
20476@item l
20477@kindex l (Category)
20478@findex gnus-category-list
20479List all the categories (@code{gnus-category-list}).
20480@end table
20481
20482
20483@node Category Variables
20484@subsubsection Category Variables
20485
20486@table @code
20487@item gnus-category-mode-hook
20488@vindex gnus-category-mode-hook
20489Hook run in category buffers.
20490
20491@item gnus-category-line-format
20492@vindex gnus-category-line-format
20493Format of the lines in the category buffer (@pxref{Formatting
20494Variables}). Valid elements are:
20495
20496@table @samp
20497@item c
20498The name of the category.
20499
20500@item g
20501The number of groups in the category.
20502@end table
20503
20504@item gnus-category-mode-line-format
20505@vindex gnus-category-mode-line-format
20506Format of the category mode line (@pxref{Mode Line Formatting}).
20507
20508@item gnus-agent-short-article
20509@vindex gnus-agent-short-article
20510Articles that have fewer lines than this are short. Default 100.
20511
20512@item gnus-agent-long-article
20513@vindex gnus-agent-long-article
20514Articles that have more lines than this are long. Default 200.
20515
20516@item gnus-agent-low-score
20517@vindex gnus-agent-low-score
20518Articles that have a score lower than this have a low score. Default
205190.
20520
20521@item gnus-agent-high-score
20522@vindex gnus-agent-high-score
20523Articles that have a score higher than this have a high score. Default
205240.
20525
20526@item gnus-agent-expire-days
20527@vindex gnus-agent-expire-days
20528The number of days that a @samp{read} article must stay in the agent's
20529local disk before becoming eligible for expiration (While the name is
20530the same, this doesn't mean expiring the article on the server. It
20531just means deleting the local copy of the article). What is also
20532important to understand is that the counter starts with the time the
20533article was written to the local disk and not the time the article was
20534read.
20535Default 7.
20536
20537@item gnus-agent-enable-expiration
20538@vindex gnus-agent-enable-expiration
20539Determines whether articles in a group are, by default, expired or
20540retained indefinitely. The default is @code{ENABLE} which means that
20541you'll have to disable expiration when desired. On the other hand,
20542you could set this to @code{DISABLE}. In that case, you would then
20543have to enable expiration in selected groups.
20544
20545@end table
20546
20547
20548@node Agent Commands
20549@subsection Agent Commands
20550@findex gnus-agent-toggle-plugged
20551@kindex J j (Agent)
20552
20553All the Gnus Agent commands are on the @kbd{J} submap. The @kbd{J j}
20554(@code{gnus-agent-toggle-plugged}) command works in all modes, and
20555toggles the plugged/unplugged state of the Gnus Agent.
20556
20557
20558@menu
20559* Group Agent Commands:: Configure groups and fetch their contents.
20560* Summary Agent Commands:: Manually select then fetch specific articles.
20561* Server Agent Commands:: Select the servers that are supported by the agent.
20562@end menu
20563
20564
20565
20566
20567@node Group Agent Commands
20568@subsubsection Group Agent Commands
20569
20570@table @kbd
20571@item J u
20572@kindex J u (Agent Group)
20573@findex gnus-agent-fetch-groups
20574Fetch all eligible articles in the current group
20575(@code{gnus-agent-fetch-groups}).
20576
20577@item J c
20578@kindex J c (Agent Group)
20579@findex gnus-enter-category-buffer
20580Enter the Agent category buffer (@code{gnus-enter-category-buffer}).
20581
20582@item J s
20583@kindex J s (Agent Group)
20584@findex gnus-agent-fetch-session
20585Fetch all eligible articles in all groups
20586(@code{gnus-agent-fetch-session}).
20587
20588@item J S
20589@kindex J S (Agent Group)
20590@findex gnus-group-send-queue
20591Send all sendable messages in the queue group
20592(@code{gnus-group-send-queue}). @xref{Drafts}.
20593
20594@item J a
20595@kindex J a (Agent Group)
20596@findex gnus-agent-add-group
20597Add the current group to an Agent category
20598(@code{gnus-agent-add-group}). This command understands the
20599process/prefix convention (@pxref{Process/Prefix}).
20600
20601@item J r
20602@kindex J r (Agent Group)
20603@findex gnus-agent-remove-group
20604Remove the current group from its category, if any
20605(@code{gnus-agent-remove-group}). This command understands the
20606process/prefix convention (@pxref{Process/Prefix}).
20607
20608@item J Y
20609@kindex J Y (Agent Group)
20610@findex gnus-agent-synchronize-flags
20611Synchronize flags changed while unplugged with remote server, if any.
20612
20613
20614@end table
20615
20616
20617@node Summary Agent Commands
20618@subsubsection Summary Agent Commands
20619
20620@table @kbd
20621@item J #
20622@kindex J # (Agent Summary)
20623@findex gnus-agent-mark-article
20624Mark the article for downloading (@code{gnus-agent-mark-article}).
20625
20626@item J M-#
20627@kindex J M-# (Agent Summary)
20628@findex gnus-agent-unmark-article
20629Remove the downloading mark from the article
20630(@code{gnus-agent-unmark-article}).
20631
20632@cindex %
20633@item @@
20634@kindex @@ (Agent Summary)
20635@findex gnus-agent-toggle-mark
20636Toggle whether to download the article
20637(@code{gnus-agent-toggle-mark}). The download mark is @samp{%} by
20638default.
20639
20640@item J c
20641@kindex J c (Agent Summary)
20642@findex gnus-agent-catchup
20643Mark all articles as read (@code{gnus-agent-catchup}) that are neither cached, downloaded, nor downloadable.
20644
20645@item J S
20646@kindex J S (Agent Summary)
20647@findex gnus-agent-fetch-group
20648Download all eligible (@pxref{Agent Categories}) articles in this group.
20649(@code{gnus-agent-fetch-group}).
20650
20651@item J s
20652@kindex J s (Agent Summary)
01c52d31 20653@findex gnus-agent-summary-fetch-series
4009494e 20654Download all processable articles in this group.
01c52d31 20655(@code{gnus-agent-summary-fetch-series}).
4009494e
GM
20656
20657@item J u
20658@kindex J u (Agent Summary)
20659@findex gnus-agent-summary-fetch-group
20660Download all downloadable articles in the current group
20661(@code{gnus-agent-summary-fetch-group}).
20662
20663@end table
20664
20665
20666@node Server Agent Commands
20667@subsubsection Server Agent Commands
20668
20669@table @kbd
20670@item J a
20671@kindex J a (Agent Server)
20672@findex gnus-agent-add-server
20673Add the current server to the list of servers covered by the Gnus Agent
20674(@code{gnus-agent-add-server}).
20675
20676@item J r
20677@kindex J r (Agent Server)
20678@findex gnus-agent-remove-server
20679Remove the current server from the list of servers covered by the Gnus
20680Agent (@code{gnus-agent-remove-server}).
20681
20682@end table
20683
20684
20685@node Agent Visuals
20686@subsection Agent Visuals
20687
20688If you open a summary while unplugged and, Gnus knows from the group's
20689active range that there are more articles than the headers currently
20690stored in the Agent, you may see some articles whose subject looks
20691something like @samp{[Undownloaded article #####]}. These are
20692placeholders for the missing headers. Aside from setting a mark,
20693there is not much that can be done with one of these placeholders.
20694When Gnus finally gets a chance to fetch the group's headers, the
20695placeholders will automatically be replaced by the actual headers.
20696You can configure the summary buffer's maneuvering to skip over the
20697placeholders if you care (See @code{gnus-auto-goto-ignores}).
20698
20699While it may be obvious to all, the only headers and articles
20700available while unplugged are those headers and articles that were
20701fetched into the Agent while previously plugged. To put it another
20702way, ``If you forget to fetch something while plugged, you might have a
20703less than satisfying unplugged session''. For this reason, the Agent
20704adds two visual effects to your summary buffer. These effects display
20705the download status of each article so that you always know which
20706articles will be available when unplugged.
20707
20708The first visual effect is the @samp{%O} spec. If you customize
20709@code{gnus-summary-line-format} to include this specifier, you will add
20710a single character field that indicates an article's download status.
20711Articles that have been fetched into either the Agent or the Cache,
20712will display @code{gnus-downloaded-mark} (defaults to @samp{+}). All
20713other articles will display @code{gnus-undownloaded-mark} (defaults to
20714@samp{-}). If you open a group that has not been agentized, a space
20715(@samp{ }) will be displayed.
20716
20717The second visual effect are the undownloaded faces. The faces, there
20718are three indicating the article's score (low, normal, high), seem to
20719result in a love/hate response from many Gnus users. The problem is
20720that the face selection is controlled by a list of condition tests and
20721face names (See @code{gnus-summary-highlight}). Each condition is
20722tested in the order in which it appears in the list so early
20723conditions have precedence over later conditions. All of this means
20724that, if you tick an undownloaded article, the article will continue
20725to be displayed in the undownloaded face rather than the ticked face.
20726
20727If you use the Agent as a cache (to avoid downloading the same article
20728each time you visit it or to minimize your connection time), the
20729undownloaded face will probably seem like a good idea. The reason
20730being that you do all of our work (marking, reading, deleting) with
01c52d31
MB
20731downloaded articles so the normal faces always appear. For those
20732users using the agent to improve online performance by caching the NOV
20733database (most users since 5.10.2), the undownloaded faces may appear
20734to be an absolutely horrible idea. The issue being that, since none
20735of their articles have been fetched into the Agent, all of the
20736normal faces will be obscured by the undownloaded faces.
20737
20738If you would like to use the undownloaded faces, you must enable the
20739undownloaded faces by setting the @code{agent-enable-undownloaded-faces}
20740group parameter to @code{t}. This parameter, like all other agent
20741parameters, may be set on an Agent Category (@pxref{Agent Categories}),
20742a Group Topic (@pxref{Topic Parameters}), or an individual group
20743(@pxref{Group Parameters}).
20744
20745The one problem common to all users using the agent is how quickly it
20746can consume disk space. If you using the agent on many groups, it is
20747even more difficult to effectively recover disk space. One solution
20748is the @samp{%F} format available in @code{gnus-group-line-format}.
20749This format will display the actual disk space used by articles
20750fetched into both the agent and cache. By knowing which groups use
20751the most space, users know where to focus their efforts when ``agent
20752expiring'' articles.
4009494e
GM
20753
20754@node Agent as Cache
20755@subsection Agent as Cache
20756
20757When Gnus is plugged, it is not efficient to download headers or
20758articles from the server again, if they are already stored in the
20759Agent. So, Gnus normally only downloads headers once, and stores them
20760in the Agent. These headers are later used when generating the summary
20761buffer, regardless of whether you are plugged or unplugged. Articles
20762are not cached in the Agent by default though (that would potentially
20763consume lots of disk space), but if you have already downloaded an
20764article into the Agent, Gnus will not download the article from the
20765server again but use the locally stored copy instead.
20766
20767If you so desire, you can configure the agent (see @code{gnus-agent-cache}
20768@pxref{Agent Variables}) to always download headers and articles while
20769plugged. Gnus will almost certainly be slower, but it will be kept
20770synchronized with the server. That last point probably won't make any
20771sense if you are using a nntp or nnimap back end.
20772
20773@node Agent Expiry
20774@subsection Agent Expiry
20775
20776@vindex gnus-agent-expire-days
20777@findex gnus-agent-expire
20778@kindex M-x gnus-agent-expire
20779@kindex M-x gnus-agent-expire-group
20780@findex gnus-agent-expire-group
20781@cindex agent expiry
20782@cindex Gnus agent expiry
20783@cindex expiry, in Gnus agent
20784
20785The Agent back end, @code{nnagent}, doesn't handle expiry. Well, at
20786least it doesn't handle it like other back ends. Instead, there are
20787special @code{gnus-agent-expire} and @code{gnus-agent-expire-group}
20788commands that will expire all read articles that are older than
20789@code{gnus-agent-expire-days} days. They can be run whenever you feel
20790that you're running out of space. Neither are particularly fast or
20791efficient, and it's not a particularly good idea to interrupt them (with
20792@kbd{C-g} or anything else) once you've started one of them.
20793
20794Note that other functions, e.g. @code{gnus-request-expire-articles},
20795might run @code{gnus-agent-expire} for you to keep the agent
20796synchronized with the group.
20797
20798The agent parameter @code{agent-enable-expiration} may be used to
20799prevent expiration in selected groups.
20800
20801@vindex gnus-agent-expire-all
20802If @code{gnus-agent-expire-all} is non-@code{nil}, the agent
20803expiration commands will expire all articles---unread, read, ticked
20804and dormant. If @code{nil} (which is the default), only read articles
20805are eligible for expiry, and unread, ticked and dormant articles will
20806be kept indefinitely.
20807
20808If you find that some articles eligible for expiry are never expired,
20809perhaps some Gnus Agent files are corrupted. There's are special
20810commands, @code{gnus-agent-regenerate} and
20811@code{gnus-agent-regenerate-group}, to fix possible problems.
20812
20813@node Agent Regeneration
20814@subsection Agent Regeneration
20815
20816@cindex agent regeneration
20817@cindex Gnus agent regeneration
20818@cindex regeneration
20819
20820The local data structures used by @code{nnagent} may become corrupted
20821due to certain exceptional conditions. When this happens,
20822@code{nnagent} functionality may degrade or even fail. The solution
20823to this problem is to repair the local data structures by removing all
20824internal inconsistencies.
20825
20826For example, if your connection to your server is lost while
20827downloaded articles into the agent, the local data structures will not
20828know about articles successfully downloaded prior to the connection
20829failure. Running @code{gnus-agent-regenerate} or
20830@code{gnus-agent-regenerate-group} will update the data structures
20831such that you don't need to download these articles a second time.
20832
20833@findex gnus-agent-regenerate
20834@kindex M-x gnus-agent-regenerate
20835The command @code{gnus-agent-regenerate} will perform
20836@code{gnus-agent-regenerate-group} on every agentized group. While
20837you can run @code{gnus-agent-regenerate} in any buffer, it is strongly
20838recommended that you first close all summary buffers.
20839
20840@findex gnus-agent-regenerate-group
20841@kindex M-x gnus-agent-regenerate-group
20842The command @code{gnus-agent-regenerate-group} uses the local copies
20843of individual articles to repair the local @acronym{NOV}(header) database. It
20844then updates the internal data structures that document which articles
20845are stored locally. An optional argument will mark articles in the
20846agent as unread.
20847
01c52d31
MB
20848@node Agent and flags
20849@subsection Agent and flags
4009494e 20850
01c52d31
MB
20851The Agent works with any Gnus back end including those, such as
20852nnimap, that store flags (read, ticked, etc) on the server. Sadly,
20853the Agent does not actually know which backends keep their flags in
20854the backend server rather than in @file{.newsrc}. This means that the
20855Agent, while unplugged or disconnected, will always record all changes
20856to the flags in its own files.
4009494e 20857
01c52d31
MB
20858When you plug back in, Gnus will then check to see if you have any
20859changed any flags and ask if you wish to synchronize these with the
20860server. This behavior is customizable by @code{gnus-agent-synchronize-flags}.
4009494e
GM
20861
20862@vindex gnus-agent-synchronize-flags
20863If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
20864never automatically synchronize flags. If it is @code{ask}, which is
20865the default, the Agent will check if you made any changes and if so
20866ask if you wish to synchronize these when you re-connect. If it has
20867any other value, all flags will be synchronized automatically.
20868
20869If you do not wish to synchronize flags automatically when you
20870re-connect, you can do it manually with the
20871@code{gnus-agent-synchronize-flags} command that is bound to @kbd{J Y}
20872in the group buffer.
20873
01c52d31
MB
20874Technical note: the synchronization algorithm does not work by ``pushing''
20875all local flags to the server, but rather by incrementally updated the
20876server view of flags by changing only those flags that were changed by
20877the user. Thus, if you set one flag on an article, quit the group then
20878re-select the group and remove the flag; the flag will be set and
20879removed from the server when you ``synchronize''. The queued flag
20880operations can be found in the per-server @code{flags} file in the Agent
20881directory. It's emptied when you synchronize flags.
20882
20883@node Agent and IMAP
20884@subsection Agent and IMAP
20885
20886The Agent works with any Gnus back end, including nnimap. However,
20887since there are some conceptual differences between @acronym{NNTP} and
20888@acronym{IMAP}, this section (should) provide you with some information to
20889make Gnus Agent work smoother as a @acronym{IMAP} Disconnected Mode client.
20890
4009494e
GM
20891Some things are currently not implemented in the Agent that you'd might
20892expect from a disconnected @acronym{IMAP} client, including:
20893
20894@itemize @bullet
20895
20896@item
20897Copying/moving articles into nnimap groups when unplugged.
20898
20899@item
20900Creating/deleting nnimap groups when unplugged.
20901
20902@end itemize
20903
4009494e
GM
20904@node Outgoing Messages
20905@subsection Outgoing Messages
20906
01c52d31
MB
20907By default, when Gnus is unplugged, all outgoing messages (both mail
20908and news) are stored in the draft group ``queue'' (@pxref{Drafts}).
20909You can view them there after posting, and edit them at will.
4009494e 20910
01c52d31
MB
20911You can control the circumstances under which outgoing mail is queued
20912(see @code{gnus-agent-queue-mail}, @pxref{Agent Variables}). Outgoing
20913news is always queued when Gnus is unplugged, and never otherwise.
4009494e 20914
01c52d31
MB
20915You can send the messages either from the draft group with the special
20916commands available there, or you can use the @kbd{J S} command in the
20917group buffer to send all the sendable messages in the draft group.
20918Posting news will only work when Gnus is plugged, but you can send
20919mail at any time.
4009494e 20920
01c52d31
MB
20921If sending mail while unplugged does not work for you and you worry
20922about hitting @kbd{J S} by accident when unplugged, you can have Gnus
20923ask you to confirm your action (see
20924@code{gnus-agent-prompt-send-queue}, @pxref{Agent Variables}).
4009494e
GM
20925
20926@node Agent Variables
20927@subsection Agent Variables
20928
20929@table @code
01c52d31
MB
20930@item gnus-agent
20931@vindex gnus-agent
20932Is the agent enabled? The default is @code{t}. When first enabled,
20933the agent will use @code{gnus-agent-auto-agentize-methods} to
20934automatically mark some back ends as agentized. You may change which
20935back ends are agentized using the agent commands in the server buffer.
20936
20937To enter the server buffer, use the @kbd{^}
20938(@code{gnus-group-enter-server-mode}) command in the group buffer.
20939
20940
4009494e
GM
20941@item gnus-agent-directory
20942@vindex gnus-agent-directory
20943Where the Gnus Agent will store its files. The default is
20944@file{~/News/agent/}.
20945
20946@item gnus-agent-handle-level
20947@vindex gnus-agent-handle-level
20948Groups on levels (@pxref{Group Levels}) higher than this variable will
20949be ignored by the Agent. The default is @code{gnus-level-subscribed},
20950which means that only subscribed group will be considered by the Agent
20951by default.
20952
20953@item gnus-agent-plugged-hook
20954@vindex gnus-agent-plugged-hook
20955Hook run when connecting to the network.
20956
20957@item gnus-agent-unplugged-hook
20958@vindex gnus-agent-unplugged-hook
20959Hook run when disconnecting from the network.
20960
20961@item gnus-agent-fetched-hook
20962@vindex gnus-agent-fetched-hook
20963Hook run when finished fetching articles.
20964
20965@item gnus-agent-cache
20966@vindex gnus-agent-cache
20967Variable to control whether use the locally stored @acronym{NOV} and
20968articles when plugged, e.g. essentially using the Agent as a cache.
20969The default is non-@code{nil}, which means to use the Agent as a cache.
20970
20971@item gnus-agent-go-online
20972@vindex gnus-agent-go-online
20973If @code{gnus-agent-go-online} is @code{nil}, the Agent will never
20974automatically switch offline servers into online status. If it is
20975@code{ask}, the default, the Agent will ask if you wish to switch
20976offline servers into online status when you re-connect. If it has any
20977other value, all offline servers will be automatically switched into
20978online status.
20979
20980@item gnus-agent-mark-unread-after-downloaded
20981@vindex gnus-agent-mark-unread-after-downloaded
20982If @code{gnus-agent-mark-unread-after-downloaded} is non-@code{nil},
20983mark articles as unread after downloading. This is usually a safe
20984thing to do as the newly downloaded article has obviously not been
20985read. The default is @code{t}.
20986
01c52d31
MB
20987@item gnus-agent-synchronize-flags
20988@vindex gnus-agent-synchronize-flags
20989If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
20990never automatically synchronize flags. If it is @code{ask}, which is
20991the default, the Agent will check if you made any changes and if so
20992ask if you wish to synchronize these when you re-connect. If it has
20993any other value, all flags will be synchronized automatically.
20994
4009494e
GM
20995@item gnus-agent-consider-all-articles
20996@vindex gnus-agent-consider-all-articles
20997If @code{gnus-agent-consider-all-articles} is non-@code{nil}, the
20998agent will let the agent predicate decide whether articles need to be
20999downloaded or not, for all articles. When @code{nil}, the default,
21000the agent will only let the predicate decide whether unread articles
21001are downloaded or not. If you enable this, you may also want to look
21002into the agent expiry settings (@pxref{Category Variables}), so that
21003the agent doesn't download articles which the agent will later expire,
21004over and over again.
21005
21006@item gnus-agent-max-fetch-size
21007@vindex gnus-agent-max-fetch-size
21008The agent fetches articles into a temporary buffer prior to parsing
21009them into individual files. To avoid exceeding the max. buffer size,
21010the agent alternates between fetching and parsing until all articles
21011have been fetched. @code{gnus-agent-max-fetch-size} provides a size
21012limit to control how often the cycling occurs. A large value improves
21013performance. A small value minimizes the time lost should the
21014connection be lost while fetching (You may need to run
21015@code{gnus-agent-regenerate-group} to update the group's state.
21016However, all articles parsed prior to loosing the connection will be
21017available while unplugged). The default is 10M so it is unusual to
21018see any cycling.
21019
21020@item gnus-server-unopen-status
21021@vindex gnus-server-unopen-status
21022Perhaps not an Agent variable, but closely related to the Agent, this
21023variable says what will happen if Gnus cannot open a server. If the
21024Agent is enabled, the default, @code{nil}, makes Gnus ask the user
21025whether to deny the server or whether to unplug the agent. If the
21026Agent is disabled, Gnus always simply deny the server. Other choices
21027for this variable include @code{denied} and @code{offline} the latter
21028is only valid if the Agent is used.
21029
21030@item gnus-auto-goto-ignores
21031@vindex gnus-auto-goto-ignores
21032Another variable that isn't an Agent variable, yet so closely related
21033that most will look for it here, this variable tells the summary
21034buffer how to maneuver around undownloaded (only headers stored in the
21035agent) and unfetched (neither article nor headers stored) articles.
21036
21037The valid values are @code{nil} (maneuver to any article),
21038@code{undownloaded} (maneuvering while unplugged ignores articles that
21039have not been fetched), @code{always-undownloaded} (maneuvering always
21040ignores articles that have not been fetched), @code{unfetched}
21041(maneuvering ignores articles whose headers have not been fetched).
21042
01c52d31
MB
21043@item gnus-agent-queue-mail
21044@vindex gnus-agent-queue-mail
21045When @code{gnus-agent-queue-mail} is @code{always}, Gnus will always
21046queue mail rather than sending it straight away. When @code{t}, Gnus
21047will queue mail when unplugged only. When @code{nil}, never queue
21048mail. The default is @code{t}.
21049
21050@item gnus-agent-prompt-send-queue
21051@vindex gnus-agent-prompt-send-queue
21052When @code{gnus-agent-prompt-send-queue} is non-@code{nil} Gnus will
21053prompt you to confirm that you really wish to proceed if you hit
21054@kbd{J S} while unplugged. The default is @code{nil}.
21055
4009494e
GM
21056@item gnus-agent-auto-agentize-methods
21057@vindex gnus-agent-auto-agentize-methods
21058If you have never used the Agent before (or more technically, if
21059@file{~/News/agent/lib/servers} does not exist), Gnus will
21060automatically agentize a few servers for you. This variable control
01c52d31
MB
21061which back ends should be auto-agentized. It is typically only useful
21062to agentize remote back ends. The auto-agentizing has the same effect
4009494e
GM
21063as running @kbd{J a} on the servers (@pxref{Server Agent Commands}).
21064If the file exist, you must manage the servers manually by adding or
21065removing them, this variable is only applicable the first time you
21066start Gnus. The default is @samp{(nntp nnimap)}.
21067
21068@end table
21069
21070
21071@node Example Setup
21072@subsection Example Setup
21073
21074If you don't want to read this manual, and you have a fairly standard
21075setup, you may be able to use something like the following as your
21076@file{~/.gnus.el} file to get started.
21077
21078@lisp
21079;; @r{Define how Gnus is to fetch news. We do this over @acronym{NNTP}}
21080;; @r{from your ISP's server.}
21081(setq gnus-select-method '(nntp "news.your-isp.com"))
21082
21083;; @r{Define how Gnus is to read your mail. We read mail from}
21084;; @r{your ISP's @acronym{POP} server.}
21085(setq mail-sources '((pop :server "pop.your-isp.com")))
21086
21087;; @r{Say how Gnus is to store the mail. We use nnml groups.}
21088(setq gnus-secondary-select-methods '((nnml "")))
21089
21090;; @r{Make Gnus into an offline newsreader.}
21091;; (gnus-agentize) ; @r{The obsolete setting.}
21092;; (setq gnus-agent t) ; @r{Now the default.}
21093@end lisp
21094
21095That should be it, basically. Put that in your @file{~/.gnus.el} file,
21096edit to suit your needs, start up PPP (or whatever), and type @kbd{M-x
21097gnus}.
21098
21099If this is the first time you've run Gnus, you will be subscribed
21100automatically to a few default newsgroups. You'll probably want to
21101subscribe to more groups, and to do that, you have to query the
21102@acronym{NNTP} server for a complete list of groups with the @kbd{A A}
21103command. This usually takes quite a while, but you only have to do it
21104once.
21105
21106After reading and parsing a while, you'll be presented with a list of
21107groups. Subscribe to the ones you want to read with the @kbd{u}
21108command. @kbd{l} to make all the killed groups disappear after you've
21109subscribe to all the groups you want to read. (@kbd{A k} will bring
21110back all the killed groups.)
21111
21112You can now read the groups at once, or you can download the articles
21113with the @kbd{J s} command. And then read the rest of this manual to
21114find out which of the other gazillion things you want to customize.
21115
21116
21117@node Batching Agents
21118@subsection Batching Agents
21119@findex gnus-agent-batch
21120
21121Having the Gnus Agent fetch articles (and post whatever messages you've
21122written) is quite easy once you've gotten things set up properly. The
21123following shell script will do everything that is necessary:
21124
21125You can run a complete batch command from the command line with the
21126following incantation:
21127
21128@example
21129#!/bin/sh
21130emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-agent-batch >/dev/null 2>&1
21131@end example
21132
21133
21134@node Agent Caveats
21135@subsection Agent Caveats
21136
21137The Gnus Agent doesn't seem to work like most other offline
21138newsreaders. Here are some common questions that some imaginary people
21139may ask:
21140
21141@table @dfn
21142@item If I read an article while plugged, do they get entered into the Agent?
21143
21144@strong{No}. If you want this behavior, add
21145@code{gnus-agent-fetch-selected-article} to
21146@code{gnus-select-article-hook}.
21147
21148@item If I read an article while plugged, and the article already exists in
21149the Agent, will it get downloaded once more?
21150
21151@strong{No}, unless @code{gnus-agent-cache} is @code{nil}.
21152
21153@end table
21154
21155In short, when Gnus is unplugged, it only looks into the locally stored
21156articles; when it's plugged, it talks to your ISP and may also use the
21157locally stored articles.
21158
21159
21160@node Scoring
21161@chapter Scoring
21162@cindex scoring
21163
21164Other people use @dfn{kill files}, but we here at Gnus Towers like
21165scoring better than killing, so we'd rather switch than fight. They do
21166something completely different as well, so sit up straight and pay
21167attention!
21168
21169@vindex gnus-summary-mark-below
21170All articles have a default score (@code{gnus-summary-default-score}),
21171which is 0 by default. This score may be raised or lowered either
21172interactively or by score files. Articles that have a score lower than
21173@code{gnus-summary-mark-below} are marked as read.
21174
21175Gnus will read any @dfn{score files} that apply to the current group
21176before generating the summary buffer.
21177
21178There are several commands in the summary buffer that insert score
21179entries based on the current article. You can, for instance, ask Gnus to
21180lower or increase the score of all articles with a certain subject.
21181
21182There are two sorts of scoring entries: Permanent and temporary.
21183Temporary score entries are self-expiring entries. Any entries that are
21184temporary and have not been used for, say, a week, will be removed
21185silently to help keep the sizes of the score files down.
21186
21187@menu
21188* Summary Score Commands:: Adding score entries for the current group.
21189* Group Score Commands:: General score commands.
21190* Score Variables:: Customize your scoring. (My, what terminology).
21191* Score File Format:: What a score file may contain.
21192* Score File Editing:: You can edit score files by hand as well.
21193* Adaptive Scoring:: Big Sister Gnus knows what you read.
21194* Home Score File:: How to say where new score entries are to go.
21195* Followups To Yourself:: Having Gnus notice when people answer you.
21196* Scoring On Other Headers:: Scoring on non-standard headers.
21197* Scoring Tips:: How to score effectively.
21198* Reverse Scoring:: That problem child of old is not problem.
21199* Global Score Files:: Earth-spanning, ear-splitting score files.
21200* Kill Files:: They are still here, but they can be ignored.
21201* Converting Kill Files:: Translating kill files to score files.
4009494e
GM
21202* Advanced Scoring:: Using logical expressions to build score rules.
21203* Score Decays:: It can be useful to let scores wither away.
21204@end menu
21205
21206
21207@node Summary Score Commands
21208@section Summary Score Commands
21209@cindex score commands
21210
21211The score commands that alter score entries do not actually modify real
21212score files. That would be too inefficient. Gnus maintains a cache of
21213previously loaded score files, one of which is considered the
21214@dfn{current score file alist}. The score commands simply insert
21215entries into this list, and upon group exit, this list is saved.
21216
21217The current score file is by default the group's local score file, even
21218if no such score file actually exists. To insert score commands into
21219some other score file (e.g. @file{all.SCORE}), you must first make this
21220score file the current one.
21221
21222General score commands that don't actually change the score file:
21223
21224@table @kbd
21225
21226@item V s
21227@kindex V s (Summary)
21228@findex gnus-summary-set-score
21229Set the score of the current article (@code{gnus-summary-set-score}).
21230
21231@item V S
21232@kindex V S (Summary)
21233@findex gnus-summary-current-score
21234Display the score of the current article
21235(@code{gnus-summary-current-score}).
21236
21237@item V t
21238@kindex V t (Summary)
21239@findex gnus-score-find-trace
21240Display all score rules that have been used on the current article
21241(@code{gnus-score-find-trace}). In the @code{*Score Trace*} buffer, you
21242may type @kbd{e} to edit score file corresponding to the score rule on
21243current line and @kbd{f} to format (@code{gnus-score-pretty-print}) the
21244score file and edit it.
21245
21246@item V w
21247@kindex V w (Summary)
21248@findex gnus-score-find-favourite-words
21249List words used in scoring (@code{gnus-score-find-favourite-words}).
21250
21251@item V R
21252@kindex V R (Summary)
21253@findex gnus-summary-rescore
21254Run the current summary through the scoring process
21255(@code{gnus-summary-rescore}). This might be useful if you're playing
21256around with your score files behind Gnus' back and want to see the
21257effect you're having.
21258
21259@item V c
21260@kindex V c (Summary)
21261@findex gnus-score-change-score-file
21262Make a different score file the current
21263(@code{gnus-score-change-score-file}).
21264
21265@item V e
21266@kindex V e (Summary)
21267@findex gnus-score-edit-current-scores
21268Edit the current score file (@code{gnus-score-edit-current-scores}).
21269You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score
21270File Editing}).
21271
21272@item V f
21273@kindex V f (Summary)
21274@findex gnus-score-edit-file
21275Edit a score file and make this score file the current one
21276(@code{gnus-score-edit-file}).
21277
21278@item V F
21279@kindex V F (Summary)
21280@findex gnus-score-flush-cache
21281Flush the score cache (@code{gnus-score-flush-cache}). This is useful
21282after editing score files.
21283
21284@item V C
21285@kindex V C (Summary)
21286@findex gnus-score-customize
21287Customize a score file in a visually pleasing manner
21288(@code{gnus-score-customize}).
21289
21290@end table
21291
21292The rest of these commands modify the local score file.
21293
21294@table @kbd
21295
21296@item V m
21297@kindex V m (Summary)
21298@findex gnus-score-set-mark-below
21299Prompt for a score, and mark all articles with a score below this as
21300read (@code{gnus-score-set-mark-below}).
21301
21302@item V x
21303@kindex V x (Summary)
21304@findex gnus-score-set-expunge-below
21305Prompt for a score, and add a score rule to the current score file to
21306expunge all articles below this score
21307(@code{gnus-score-set-expunge-below}).
21308@end table
21309
21310The keystrokes for actually making score entries follow a very regular
21311pattern, so there's no need to list all the commands. (Hundreds of
21312them.)
21313
21314@findex gnus-summary-increase-score
21315@findex gnus-summary-lower-score
21316
21317@enumerate
21318@item
21319The first key is either @kbd{I} (upper case i) for increasing the score
21320or @kbd{L} for lowering the score.
21321@item
21322The second key says what header you want to score on. The following
21323keys are available:
21324@table @kbd
21325
21326@item a
21327Score on the author name.
21328
21329@item s
21330Score on the subject line.
21331
21332@item x
21333Score on the @code{Xref} line---i.e., the cross-posting line.
21334
21335@item r
21336Score on the @code{References} line.
21337
21338@item d
21339Score on the date.
21340
21341@item l
21342Score on the number of lines.
21343
21344@item i
21345Score on the @code{Message-ID} header.
21346
21347@item e
21348Score on an ``extra'' header, that is, one of those in gnus-extra-headers,
21349if your @acronym{NNTP} server tracks additional header data in overviews.
21350
21351@item f
21352Score on followups---this matches the author name, and adds scores to
21353the followups to this author. (Using this key leads to the creation of
21354@file{ADAPT} files.)
21355
21356@item b
21357Score on the body.
21358
21359@item h
21360Score on the head.
21361
21362@item t
21363Score on thread. (Using this key leads to the creation of @file{ADAPT}
21364files.)
21365
21366@end table
21367
21368@item
21369The third key is the match type. Which match types are valid depends on
21370what headers you are scoring on.
21371
21372@table @code
21373
21374@item strings
21375
21376@table @kbd
21377
21378@item e
21379Exact matching.
21380
21381@item s
21382Substring matching.
21383
21384@item f
21385Fuzzy matching (@pxref{Fuzzy Matching}).
21386
21387@item r
21388Regexp matching
21389@end table
21390
21391@item date
21392@table @kbd
21393
21394@item b
21395Before date.
21396
21397@item a
21398After date.
21399
21400@item n
21401This date.
21402@end table
21403
21404@item number
21405@table @kbd
21406
21407@item <
21408Less than number.
21409
21410@item =
21411Equal to number.
21412
21413@item >
21414Greater than number.
21415@end table
21416@end table
21417
21418@item
21419The fourth and usually final key says whether this is a temporary (i.e.,
21420expiring) score entry, or a permanent (i.e., non-expiring) score entry,
21421or whether it is to be done immediately, without adding to the score
21422file.
21423@table @kbd
21424
21425@item t
21426Temporary score entry.
21427
21428@item p
21429Permanent score entry.
21430
21431@item i
21432Immediately scoring.
21433@end table
21434
21435@item
21436If you are scoring on `e' (extra) headers, you will then be prompted for
21437the header name on which you wish to score. This must be a header named
21438in gnus-extra-headers, and @samp{TAB} completion is available.
21439
21440@end enumerate
21441
21442So, let's say you want to increase the score on the current author with
21443exact matching permanently: @kbd{I a e p}. If you want to lower the
21444score based on the subject line, using substring matching, and make a
21445temporary score entry: @kbd{L s s t}. Pretty easy.
21446
21447To make things a bit more complicated, there are shortcuts. If you use
21448a capital letter on either the second or third keys, Gnus will use
21449defaults for the remaining one or two keystrokes. The defaults are
21450``substring'' and ``temporary''. So @kbd{I A} is the same as @kbd{I a s
21451t}, and @kbd{I a R} is the same as @kbd{I a r t}.
21452
21453These functions take both the numerical prefix and the symbolic prefix
21454(@pxref{Symbolic Prefixes}). A numerical prefix says how much to lower
21455(or increase) the score of the article. A symbolic prefix of @code{a}
21456says to use the @file{all.SCORE} file for the command instead of the
21457current score file.
21458
21459@vindex gnus-score-mimic-keymap
21460The @code{gnus-score-mimic-keymap} says whether these commands will
21461pretend they are keymaps or not.
21462
21463
21464@node Group Score Commands
21465@section Group Score Commands
21466@cindex group score commands
21467
21468There aren't many of these as yet, I'm afraid.
21469
21470@table @kbd
21471
01c52d31
MB
21472@item W e
21473@kindex W e (Group)
21474@findex gnus-score-edit-all-score
21475Edit the apply-to-all-groups all.SCORE file. You will be popped into
21476a @code{gnus-score-mode} buffer (@pxref{Score File Editing}).
21477
4009494e
GM
21478@item W f
21479@kindex W f (Group)
21480@findex gnus-score-flush-cache
21481Gnus maintains a cache of score alists to avoid having to reload them
21482all the time. This command will flush the cache
21483(@code{gnus-score-flush-cache}).
21484
21485@end table
21486
21487You can do scoring from the command line by saying something like:
21488
21489@findex gnus-batch-score
21490@cindex batch scoring
21491@example
21492$ emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score
21493@end example
21494
21495
21496@node Score Variables
21497@section Score Variables
21498@cindex score variables
21499
21500@table @code
21501
21502@item gnus-use-scoring
21503@vindex gnus-use-scoring
21504If @code{nil}, Gnus will not check for score files, and will not, in
21505general, do any score-related work. This is @code{t} by default.
21506
21507@item gnus-kill-killed
21508@vindex gnus-kill-killed
21509If this variable is @code{nil}, Gnus will never apply score files to
21510articles that have already been through the kill process. While this
21511may save you lots of time, it also means that if you apply a kill file
21512to a group, and then change the kill file and want to run it over you
21513group again to kill more articles, it won't work. You have to set this
21514variable to @code{t} to do that. (It is @code{t} by default.)
21515
21516@item gnus-kill-files-directory
21517@vindex gnus-kill-files-directory
21518All kill and score files will be stored in this directory, which is
21519initialized from the @env{SAVEDIR} environment variable by default.
21520This is @file{~/News/} by default.
21521
21522@item gnus-score-file-suffix
21523@vindex gnus-score-file-suffix
21524Suffix to add to the group name to arrive at the score file name
21525(@file{SCORE} by default.)
21526
21527@item gnus-score-uncacheable-files
21528@vindex gnus-score-uncacheable-files
21529@cindex score cache
21530All score files are normally cached to avoid excessive re-loading of
bbbe940b 21531score files. However, this might make your Emacs grow big and
4009494e
GM
21532bloated, so this regexp can be used to weed out score files unlikely
21533to be needed again. It would be a bad idea to deny caching of
21534@file{all.SCORE}, while it might be a good idea to not cache
21535@file{comp.infosystems.www.authoring.misc.ADAPT}. In fact, this
21536variable is @samp{ADAPT$} by default, so no adaptive score files will
21537be cached.
21538
21539@item gnus-save-score
21540@vindex gnus-save-score
21541If you have really complicated score files, and do lots of batch
21542scoring, then you might set this variable to @code{t}. This will make
21543Gnus save the scores into the @file{.newsrc.eld} file.
21544
21545If you do not set this to @code{t}, then manual scores (like those set
21546with @kbd{V s} (@code{gnus-summary-set-score})) will not be preserved
21547across group visits.
21548
21549@item gnus-score-interactive-default-score
21550@vindex gnus-score-interactive-default-score
21551Score used by all the interactive raise/lower commands to raise/lower
21552score with. Default is 1000, which may seem excessive, but this is to
21553ensure that the adaptive scoring scheme gets enough room to play with.
21554We don't want the small changes from the adaptive scoring to overwrite
21555manually entered data.
21556
21557@item gnus-summary-default-score
21558@vindex gnus-summary-default-score
21559Default score of an article, which is 0 by default.
21560
21561@item gnus-summary-expunge-below
21562@vindex gnus-summary-expunge-below
21563Don't display the summary lines of articles that have scores lower than
21564this variable. This is @code{nil} by default, which means that no
21565articles will be hidden. This variable is local to the summary buffers,
21566and has to be set from @code{gnus-summary-mode-hook}.
21567
21568@item gnus-score-over-mark
21569@vindex gnus-score-over-mark
21570Mark (in the third column) used for articles with a score over the
21571default. Default is @samp{+}.
21572
21573@item gnus-score-below-mark
21574@vindex gnus-score-below-mark
21575Mark (in the third column) used for articles with a score below the
21576default. Default is @samp{-}.
21577
21578@item gnus-score-find-score-files-function
21579@vindex gnus-score-find-score-files-function
21580Function used to find score files for the current group. This function
21581is called with the name of the group as the argument.
21582
21583Predefined functions available are:
21584@table @code
21585
21586@item gnus-score-find-single
21587@findex gnus-score-find-single
21588Only apply the group's own score file.
21589
21590@item gnus-score-find-bnews
21591@findex gnus-score-find-bnews
21592Apply all score files that match, using bnews syntax. This is the
21593default. If the current group is @samp{gnu.emacs.gnus}, for instance,
21594@file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and
21595@file{gnu.all.SCORE} would all apply. In short, the instances of
21596@samp{all} in the score file names are translated into @samp{.*}, and
21597then a regexp match is done.
21598
21599This means that if you have some score entries that you want to apply to
21600all groups, then you put those entries in the @file{all.SCORE} file.
21601
21602The score files are applied in a semi-random order, although Gnus will
21603try to apply the more general score files before the more specific score
21604files. It does this by looking at the number of elements in the score
21605file names---discarding the @samp{all} elements.
21606
21607@item gnus-score-find-hierarchical
21608@findex gnus-score-find-hierarchical
21609Apply all score files from all the parent groups. This means that you
21610can't have score files like @file{all.SCORE}, but you can have
21611@file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE} for each
21612server.
21613
21614@end table
21615This variable can also be a list of functions. In that case, all
21616these functions will be called with the group name as argument, and
21617all the returned lists of score files will be applied. These
21618functions can also return lists of lists of score alists directly. In
21619that case, the functions that return these non-file score alists
21620should probably be placed before the ``real'' score file functions, to
21621ensure that the last score file returned is the local score file.
21622Phu.
21623
21624For example, to do hierarchical scoring but use a non-server-specific
21625overall score file, you could use the value
21626@example
21627(list (lambda (group) ("all.SCORE"))
21628 'gnus-score-find-hierarchical)
21629@end example
21630
21631@item gnus-score-expiry-days
21632@vindex gnus-score-expiry-days
21633This variable says how many days should pass before an unused score file
21634entry is expired. If this variable is @code{nil}, no score file entries
21635are expired. It's 7 by default.
21636
21637@item gnus-update-score-entry-dates
21638@vindex gnus-update-score-entry-dates
21639If this variable is non-@code{nil}, temporary score entries that have
21640been triggered (matched) will have their dates updated. (This is how Gnus
21641controls expiry---all non-matched-entries will become too old while
21642matched entries will stay fresh and young.) However, if you set this
21643variable to @code{nil}, even matched entries will grow old and will
21644have to face that oh-so grim reaper.
21645
21646@item gnus-score-after-write-file-function
21647@vindex gnus-score-after-write-file-function
21648Function called with the name of the score file just written.
21649
21650@item gnus-score-thread-simplify
21651@vindex gnus-score-thread-simplify
21652If this variable is non-@code{nil}, article subjects will be
21653simplified for subject scoring purposes in the same manner as with
21654threading---according to the current value of
21655@code{gnus-simplify-subject-functions}. If the scoring entry uses
21656@code{substring} or @code{exact} matching, the match will also be
21657simplified in this manner.
21658
21659@end table
21660
21661
21662@node Score File Format
21663@section Score File Format
21664@cindex score file format
21665
21666A score file is an @code{emacs-lisp} file that normally contains just a
21667single form. Casual users are not expected to edit these files;
21668everything can be changed from the summary buffer.
21669
21670Anyway, if you'd like to dig into it yourself, here's an example:
21671
21672@lisp
21673(("from"
21674 ("Lars Ingebrigtsen" -10000)
21675 ("Per Abrahamsen")
21676 ("larsi\\|lmi" -50000 nil R))
21677 ("subject"
21678 ("Ding is Badd" nil 728373))
21679 ("xref"
21680 ("alt.politics" -1000 728372 s))
21681 ("lines"
21682 (2 -100 nil <))
21683 (mark 0)
21684 (expunge -1000)
21685 (mark-and-expunge -10)
21686 (read-only nil)
21687 (orphan -10)
21688 (adapt t)
21689 (files "/hom/larsi/News/gnu.SCORE")
21690 (exclude-files "all.SCORE")
21691 (local (gnus-newsgroup-auto-expire t)
21692 (gnus-summary-make-false-root empty))
21693 (eval (ding)))
21694@end lisp
21695
21696This example demonstrates most score file elements. @xref{Advanced
21697Scoring}, for a different approach.
21698
21699Even though this looks much like Lisp code, nothing here is actually
21700@code{eval}ed. The Lisp reader is used to read this form, though, so it
21701has to be valid syntactically, if not semantically.
21702
21703Six keys are supported by this alist:
21704
21705@table @code
21706
21707@item STRING
21708If the key is a string, it is the name of the header to perform the
21709match on. Scoring can only be performed on these eight headers:
21710@code{From}, @code{Subject}, @code{References}, @code{Message-ID},
21711@code{Xref}, @code{Lines}, @code{Chars} and @code{Date}. In addition to
21712these headers, there are three strings to tell Gnus to fetch the entire
21713article and do the match on larger parts of the article: @code{Body}
21714will perform the match on the body of the article, @code{Head} will
21715perform the match on the head of the article, and @code{All} will
21716perform the match on the entire article. Note that using any of these
21717last three keys will slow down group entry @emph{considerably}. The
21718final ``header'' you can score on is @code{Followup}. These score
21719entries will result in new score entries being added for all follow-ups
21720to articles that matches these score entries.
21721
21722Following this key is an arbitrary number of score entries, where each
21723score entry has one to four elements.
21724@enumerate
21725
21726@item
21727The first element is the @dfn{match element}. On most headers this will
21728be a string, but on the Lines and Chars headers, this must be an
21729integer.
21730
21731@item
21732If the second element is present, it should be a number---the @dfn{score
21733element}. This number should be an integer in the neginf to posinf
21734interval. This number is added to the score of the article if the match
21735is successful. If this element is not present, the
21736@code{gnus-score-interactive-default-score} number will be used
21737instead. This is 1000 by default.
21738
21739@item
21740If the third element is present, it should be a number---the @dfn{date
21741element}. This date says when the last time this score entry matched,
21742which provides a mechanism for expiring the score entries. It this
21743element is not present, the score entry is permanent. The date is
21744represented by the number of days since December 31, 1 BCE.
21745
21746@item
21747If the fourth element is present, it should be a symbol---the @dfn{type
21748element}. This element specifies what function should be used to see
21749whether this score entry matches the article. What match types that can
21750be used depends on what header you wish to perform the match on.
21751@table @dfn
21752
21753@item From, Subject, References, Xref, Message-ID
21754For most header types, there are the @code{r} and @code{R} (regexp), as
21755well as @code{s} and @code{S} (substring) types, and @code{e} and
21756@code{E} (exact match), and @code{w} (word match) types. If this
21757element is not present, Gnus will assume that substring matching should
21758be used. @code{R}, @code{S}, and @code{E} differ from the others in
21759that the matches will be done in a case-sensitive manner. All these
21760one-letter types are really just abbreviations for the @code{regexp},
21761@code{string}, @code{exact}, and @code{word} types, which you can use
21762instead, if you feel like.
21763
21764@item Extra
21765Just as for the standard string overview headers, if you are using
21766gnus-extra-headers, you can score on these headers' values. In this
21767case, there is a 5th element in the score entry, being the name of the
21768header to be scored. The following entry is useful in your
21769@file{all.SCORE} file in case of spam attacks from a single origin
21770host, if your @acronym{NNTP} server tracks @samp{NNTP-Posting-Host} in
21771overviews:
21772
21773@lisp
21774("111.222.333.444" -1000 nil s
21775 "NNTP-Posting-Host")
21776@end lisp
21777
21778@item Lines, Chars
21779These two headers use different match types: @code{<}, @code{>},
21780@code{=}, @code{>=} and @code{<=}.
21781
21782These predicates are true if
21783
21784@example
21785(PREDICATE HEADER MATCH)
21786@end example
21787
21788evaluates to non-@code{nil}. For instance, the advanced match
21789@code{("lines" 4 <)} (@pxref{Advanced Scoring}) will result in the
21790following form:
21791
21792@lisp
21793(< header-value 4)
21794@end lisp
21795
21796Or to put it another way: When using @code{<} on @code{Lines} with 4 as
21797the match, we get the score added if the article has less than 4 lines.
21798(It's easy to get confused and think it's the other way around. But
21799it's not. I think.)
21800
21801When matching on @code{Lines}, be careful because some back ends (like
21802@code{nndir}) do not generate @code{Lines} header, so every article ends
21803up being marked as having 0 lines. This can lead to strange results if
21804you happen to lower score of the articles with few lines.
21805
21806@item Date
21807For the Date header we have three kinda silly match types:
21808@code{before}, @code{at} and @code{after}. I can't really imagine this
21809ever being useful, but, like, it would feel kinda silly not to provide
21810this function. Just in case. You never know. Better safe than sorry.
21811Once burnt, twice shy. Don't judge a book by its cover. Never not have
21812sex on a first date. (I have been told that at least one person, and I
21813quote, ``found this function indispensable'', however.)
21814
21815@cindex ISO8601
21816@cindex date
21817A more useful match type is @code{regexp}. With it, you can match the
21818date string using a regular expression. The date is normalized to
21819ISO8601 compact format first---@var{YYYYMMDD}@code{T}@var{HHMMSS}. If
21820you want to match all articles that have been posted on April 1st in
21821every year, you could use @samp{....0401.........} as a match string,
21822for instance. (Note that the date is kept in its original time zone, so
21823this will match articles that were posted when it was April 1st where
21824the article was posted from. Time zones are such wholesome fun for the
21825whole family, eh?)
21826
21827@item Head, Body, All
21828These three match keys use the same match types as the @code{From} (etc)
21829header uses.
21830
21831@item Followup
21832This match key is somewhat special, in that it will match the
21833@code{From} header, and affect the score of not only the matching
21834articles, but also all followups to the matching articles. This allows
21835you e.g. increase the score of followups to your own articles, or
21836decrease the score of followups to the articles of some known
21837trouble-maker. Uses the same match types as the @code{From} header
21838uses. (Using this match key will lead to creation of @file{ADAPT}
21839files.)
21840
21841@item Thread
21842This match key works along the same lines as the @code{Followup} match
21843key. If you say that you want to score on a (sub-)thread started by an
21844article with a @code{Message-ID} @var{x}, then you add a @samp{thread}
21845match. This will add a new @samp{thread} match for each article that
21846has @var{x} in its @code{References} header. (These new @samp{thread}
21847matches will use the @code{Message-ID}s of these matching articles.)
21848This will ensure that you can raise/lower the score of an entire thread,
21849even though some articles in the thread may not have complete
21850@code{References} headers. Note that using this may lead to
21851undeterministic scores of the articles in the thread. (Using this match
21852key will lead to creation of @file{ADAPT} files.)
21853@end table
21854@end enumerate
21855
21856@cindex score file atoms
21857@item mark
21858The value of this entry should be a number. Any articles with a score
21859lower than this number will be marked as read.
21860
21861@item expunge
21862The value of this entry should be a number. Any articles with a score
21863lower than this number will be removed from the summary buffer.
21864
21865@item mark-and-expunge
21866The value of this entry should be a number. Any articles with a score
21867lower than this number will be marked as read and removed from the
21868summary buffer.
21869
21870@item thread-mark-and-expunge
21871The value of this entry should be a number. All articles that belong to
21872a thread that has a total score below this number will be marked as read
21873and removed from the summary buffer. @code{gnus-thread-score-function}
21874says how to compute the total score for a thread.
21875
21876@item files
21877The value of this entry should be any number of file names. These files
21878are assumed to be score files as well, and will be loaded the same way
21879this one was.
21880
21881@item exclude-files
21882The clue of this entry should be any number of files. These files will
21883not be loaded, even though they would normally be so, for some reason or
21884other.
21885
21886@item eval
994ff697 21887The value of this entry will be @code{eval}ed. This element will be
4009494e
GM
21888ignored when handling global score files.
21889
21890@item read-only
21891Read-only score files will not be updated or saved. Global score files
21892should feature this atom (@pxref{Global Score Files}). (Note:
21893@dfn{Global} here really means @dfn{global}; not your personal
21894apply-to-all-groups score files.)
21895
21896@item orphan
21897The value of this entry should be a number. Articles that do not have
21898parents will get this number added to their scores. Imagine you follow
21899some high-volume newsgroup, like @samp{comp.lang.c}. Most likely you
21900will only follow a few of the threads, also want to see any new threads.
21901
21902You can do this with the following two score file entries:
21903
21904@example
21905 (orphan -500)
21906 (mark-and-expunge -100)
21907@end example
21908
21909When you enter the group the first time, you will only see the new
21910threads. You then raise the score of the threads that you find
b1519d85 21911interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{c y}) the
4009494e
GM
21912rest. Next time you enter the group, you will see new articles in the
21913interesting threads, plus any new threads.
21914
21915I.e.---the orphan score atom is for high-volume groups where a few
21916interesting threads which can't be found automatically by ordinary
21917scoring rules exist.
21918
21919@item adapt
21920This entry controls the adaptive scoring. If it is @code{t}, the
21921default adaptive scoring rules will be used. If it is @code{ignore}, no
21922adaptive scoring will be performed on this group. If it is a list, this
21923list will be used as the adaptive scoring rules. If it isn't present,
21924or is something other than @code{t} or @code{ignore}, the default
21925adaptive scoring rules will be used. If you want to use adaptive
21926scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to
21927@code{t}, and insert an @code{(adapt ignore)} in the groups where you do
21928not want adaptive scoring. If you only want adaptive scoring in a few
21929groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and
21930insert @code{(adapt t)} in the score files of the groups where you want
21931it.
21932
21933@item adapt-file
21934All adaptive score entries will go to the file named by this entry. It
21935will also be applied when entering the group. This atom might be handy
21936if you want to adapt on several groups at once, using the same adaptive
21937file for a number of groups.
21938
21939@item local
21940@cindex local variables
21941The value of this entry should be a list of @code{(@var{var}
21942@var{value})} pairs. Each @var{var} will be made buffer-local to the
21943current summary buffer, and set to the value specified. This is a
21944convenient, if somewhat strange, way of setting variables in some
21945groups if you don't like hooks much. Note that the @var{value} won't
21946be evaluated.
21947@end table
21948
21949
21950@node Score File Editing
21951@section Score File Editing
21952
21953You normally enter all scoring commands from the summary buffer, but you
21954might feel the urge to edit them by hand as well, so we've supplied you
21955with a mode for that.
21956
21957It's simply a slightly customized @code{emacs-lisp} mode, with these
21958additional commands:
21959
21960@table @kbd
21961
21962@item C-c C-c
21963@kindex C-c C-c (Score)
87035689 21964@findex gnus-score-edit-exit
4009494e 21965Save the changes you have made and return to the summary buffer
87035689 21966(@code{gnus-score-edit-exit}).
4009494e
GM
21967
21968@item C-c C-d
21969@kindex C-c C-d (Score)
21970@findex gnus-score-edit-insert-date
21971Insert the current date in numerical format
21972(@code{gnus-score-edit-insert-date}). This is really the day number, if
21973you were wondering.
21974
21975@item C-c C-p
21976@kindex C-c C-p (Score)
21977@findex gnus-score-pretty-print
21978The adaptive score files are saved in an unformatted fashion. If you
21979intend to read one of these files, you want to @dfn{pretty print} it
21980first. This command (@code{gnus-score-pretty-print}) does that for
21981you.
21982
21983@end table
21984
21985Type @kbd{M-x gnus-score-mode} to use this mode.
21986
21987@vindex gnus-score-mode-hook
21988@code{gnus-score-menu-hook} is run in score mode buffers.
21989
21990In the summary buffer you can use commands like @kbd{V f}, @kbd{V e} and
21991@kbd{V t} to begin editing score files.
21992
21993
21994@node Adaptive Scoring
21995@section Adaptive Scoring
21996@cindex adaptive scoring
21997
21998If all this scoring is getting you down, Gnus has a way of making it all
21999happen automatically---as if by magic. Or rather, as if by artificial
22000stupidity, to be precise.
22001
22002@vindex gnus-use-adaptive-scoring
22003When you read an article, or mark an article as read, or kill an
22004article, you leave marks behind. On exit from the group, Gnus can sniff
22005these marks and add score elements depending on what marks it finds.
22006You turn on this ability by setting @code{gnus-use-adaptive-scoring} to
22007@code{t} or @code{(line)}. If you want score adaptively on separate
22008words appearing in the subjects, you should set this variable to
22009@code{(word)}. If you want to use both adaptive methods, set this
22010variable to @code{(word line)}.
22011
22012@vindex gnus-default-adaptive-score-alist
22013To give you complete control over the scoring process, you can customize
22014the @code{gnus-default-adaptive-score-alist} variable. For instance, it
22015might look something like this:
22016
22017@lisp
22018(setq gnus-default-adaptive-score-alist
22019 '((gnus-unread-mark)
22020 (gnus-ticked-mark (from 4))
22021 (gnus-dormant-mark (from 5))
22022 (gnus-del-mark (from -4) (subject -1))
22023 (gnus-read-mark (from 4) (subject 2))
22024 (gnus-expirable-mark (from -1) (subject -1))
22025 (gnus-killed-mark (from -1) (subject -3))
22026 (gnus-kill-file-mark)
22027 (gnus-ancient-mark)
22028 (gnus-low-score-mark)
22029 (gnus-catchup-mark (from -1) (subject -1))))
22030@end lisp
22031
22032As you see, each element in this alist has a mark as a key (either a
22033variable name or a ``real'' mark---a character). Following this key is
22034a arbitrary number of header/score pairs. If there are no header/score
22035pairs following the key, no adaptive scoring will be done on articles
22036that have that key as the article mark. For instance, articles with
22037@code{gnus-unread-mark} in the example above will not get adaptive score
22038entries.
22039
22040Each article can have only one mark, so just a single of these rules
22041will be applied to each article.
22042
22043To take @code{gnus-del-mark} as an example---this alist says that all
22044articles that have that mark (i.e., are marked with @samp{e}) will have a
22045score entry added to lower based on the @code{From} header by -4, and
22046lowered by @code{Subject} by -1. Change this to fit your prejudices.
22047
22048If you have marked 10 articles with the same subject with
22049@code{gnus-del-mark}, the rule for that mark will be applied ten times.
22050That means that that subject will get a score of ten times -1, which
22051should be, unless I'm much mistaken, -10.
22052
22053If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), all
22054the read articles will be marked with the @samp{E} mark. This'll
22055probably make adaptive scoring slightly impossible, so auto-expiring and
22056adaptive scoring doesn't really mix very well.
22057
22058The headers you can score on are @code{from}, @code{subject},
22059@code{message-id}, @code{references}, @code{xref}, @code{lines},
22060@code{chars} and @code{date}. In addition, you can score on
22061@code{followup}, which will create an adaptive score entry that matches
22062on the @code{References} header using the @code{Message-ID} of the
22063current article, thereby matching the following thread.
22064
22065If you use this scheme, you should set the score file atom @code{mark}
22066to something small---like -300, perhaps, to avoid having small random
22067changes result in articles getting marked as read.
22068
22069After using adaptive scoring for a week or so, Gnus should start to
22070become properly trained and enhance the authors you like best, and kill
22071the authors you like least, without you having to say so explicitly.
22072
22073You can control what groups the adaptive scoring is to be performed on
22074by using the score files (@pxref{Score File Format}). This will also
22075let you use different rules in different groups.
22076
22077@vindex gnus-adaptive-file-suffix
22078The adaptive score entries will be put into a file where the name is the
22079group name with @code{gnus-adaptive-file-suffix} appended. The default
22080is @file{ADAPT}.
22081
01c52d31
MB
22082@vindex gnus-adaptive-pretty-print
22083Adaptive score files can get huge and are not meant to be edited by
22084human hands. If @code{gnus-adaptive-pretty-print} is @code{nil} (the
22085deafult) those files will not be written in a human readable way.
22086
4009494e
GM
22087@vindex gnus-score-exact-adapt-limit
22088When doing adaptive scoring, substring or fuzzy matching would probably
22089give you the best results in most cases. However, if the header one
22090matches is short, the possibility for false positives is great, so if
22091the length of the match is less than
22092@code{gnus-score-exact-adapt-limit}, exact matching will be used. If
22093this variable is @code{nil}, exact matching will always be used to avoid
22094this problem.
22095
22096@vindex gnus-default-adaptive-word-score-alist
22097As mentioned above, you can adapt either on individual words or entire
22098headers. If you adapt on words, the
22099@code{gnus-default-adaptive-word-score-alist} variable says what score
22100each instance of a word should add given a mark.
22101
22102@lisp
22103(setq gnus-default-adaptive-word-score-alist
22104 `((,gnus-read-mark . 30)
22105 (,gnus-catchup-mark . -10)
22106 (,gnus-killed-mark . -20)
22107 (,gnus-del-mark . -15)))
22108@end lisp
22109
22110This is the default value. If you have adaption on words enabled, every
22111word that appears in subjects of articles marked with
22112@code{gnus-read-mark} will result in a score rule that increase the
22113score with 30 points.
22114
22115@vindex gnus-default-ignored-adaptive-words
22116@vindex gnus-ignored-adaptive-words
22117Words that appear in the @code{gnus-default-ignored-adaptive-words} list
22118will be ignored. If you wish to add more words to be ignored, use the
22119@code{gnus-ignored-adaptive-words} list instead.
22120
22121@vindex gnus-adaptive-word-length-limit
22122Some may feel that short words shouldn't count when doing adaptive
22123scoring. If so, you may set @code{gnus-adaptive-word-length-limit} to
22124an integer. Words shorter than this number will be ignored. This
22125variable defaults to @code{nil}.
22126
22127@vindex gnus-adaptive-word-syntax-table
22128When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the
22129syntax table in effect. It is similar to the standard syntax table, but
22130it considers numbers to be non-word-constituent characters.
22131
22132@vindex gnus-adaptive-word-minimum
22133If @code{gnus-adaptive-word-minimum} is set to a number, the adaptive
22134word scoring process will never bring down the score of an article to
22135below this number. The default is @code{nil}.
22136
22137@vindex gnus-adaptive-word-no-group-words
22138If @code{gnus-adaptive-word-no-group-words} is set to @code{t}, gnus
22139won't adaptively word score any of the words in the group name. Useful
22140for groups like @samp{comp.editors.emacs}, where most of the subject
22141lines contain the word @samp{emacs}.
22142
22143After using this scheme for a while, it might be nice to write a
22144@code{gnus-psychoanalyze-user} command to go through the rules and see
22145what words you like and what words you don't like. Or perhaps not.
22146
22147Note that the adaptive word scoring thing is highly experimental and is
22148likely to change in the future. Initial impressions seem to indicate
22149that it's totally useless as it stands. Some more work (involving more
22150rigorous statistical methods) will have to be done to make this useful.
22151
22152
22153@node Home Score File
22154@section Home Score File
22155
22156The score file where new score file entries will go is called the
22157@dfn{home score file}. This is normally (and by default) the score file
22158for the group itself. For instance, the home score file for
22159@samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}.
22160
22161However, this may not be what you want. It is often convenient to share
22162a common home score file among many groups---all @samp{emacs} groups
22163could perhaps use the same home score file.
22164
22165@vindex gnus-home-score-file
22166The variable that controls this is @code{gnus-home-score-file}. It can
22167be:
22168
22169@enumerate
22170@item
22171A string. Then this file will be used as the home score file for all
22172groups.
22173
22174@item
22175A function. The result of this function will be used as the home score
22176file. The function will be called with the name of the group as the
22177parameter.
22178
22179@item
22180A list. The elements in this list can be:
22181
22182@enumerate
22183@item
22184@code{(@var{regexp} @var{file-name})}. If the @var{regexp} matches the
22185group name, the @var{file-name} will be used as the home score file.
22186
22187@item
22188A function. If the function returns non-@code{nil}, the result will
22189be used as the home score file. The function will be called with the
22190name of the group as the parameter.
22191
22192@item
22193A string. Use the string as the home score file.
22194@end enumerate
22195
22196The list will be traversed from the beginning towards the end looking
22197for matches.
22198
22199@end enumerate
22200
22201So, if you want to use just a single score file, you could say:
22202
22203@lisp
22204(setq gnus-home-score-file
22205 "my-total-score-file.SCORE")
22206@end lisp
22207
22208If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and
22209@file{rec.SCORE} for all @samp{rec} groups (and so on), you can say:
22210
22211@findex gnus-hierarchial-home-score-file
22212@lisp
22213(setq gnus-home-score-file
22214 'gnus-hierarchial-home-score-file)
22215@end lisp
22216
22217This is a ready-made function provided for your convenience.
22218Other functions include
22219
22220@table @code
22221@item gnus-current-home-score-file
22222@findex gnus-current-home-score-file
22223Return the ``current'' regular score file. This will make scoring
22224commands add entry to the ``innermost'' matching score file.
22225
22226@end table
22227
22228If you want to have one score file for the @samp{emacs} groups and
22229another for the @samp{comp} groups, while letting all other groups use
22230their own home score files:
22231
22232@lisp
22233(setq gnus-home-score-file
22234 ;; @r{All groups that match the regexp @code{"\\.emacs"}}
22235 '(("\\.emacs" "emacs.SCORE")
22236 ;; @r{All the comp groups in one score file}
22237 ("^comp" "comp.SCORE")))
22238@end lisp
22239
22240@vindex gnus-home-adapt-file
22241@code{gnus-home-adapt-file} works exactly the same way as
22242@code{gnus-home-score-file}, but says what the home adaptive score file
22243is instead. All new adaptive file entries will go into the file
22244specified by this variable, and the same syntax is allowed.
22245
22246In addition to using @code{gnus-home-score-file} and
22247@code{gnus-home-adapt-file}, you can also use group parameters
22248(@pxref{Group Parameters}) and topic parameters (@pxref{Topic
22249Parameters}) to achieve much the same. Group and topic parameters take
22250precedence over this variable.
22251
22252
22253@node Followups To Yourself
22254@section Followups To Yourself
22255
22256Gnus offers two commands for picking out the @code{Message-ID} header in
22257the current buffer. Gnus will then add a score rule that scores using
22258this @code{Message-ID} on the @code{References} header of other
22259articles. This will, in effect, increase the score of all articles that
22260respond to the article in the current buffer. Quite useful if you want
22261to easily note when people answer what you've said.
22262
22263@table @code
22264
22265@item gnus-score-followup-article
22266@findex gnus-score-followup-article
22267This will add a score to articles that directly follow up your own
22268article.
22269
22270@item gnus-score-followup-thread
22271@findex gnus-score-followup-thread
22272This will add a score to all articles that appear in a thread ``below''
22273your own article.
22274@end table
22275
22276@vindex message-sent-hook
22277These two functions are both primarily meant to be used in hooks like
22278@code{message-sent-hook}, like this:
22279@lisp
22280(add-hook 'message-sent-hook 'gnus-score-followup-thread)
22281@end lisp
22282
22283
22284If you look closely at your own @code{Message-ID}, you'll notice that
22285the first two or three characters are always the same. Here's two of
22286mine:
22287
22288@example
22289<x6u3u47icf.fsf@@eyesore.no>
22290<x6sp9o7ibw.fsf@@eyesore.no>
22291@end example
22292
22293So ``my'' ident on this machine is @samp{x6}. This can be
22294exploited---the following rule will raise the score on all followups to
22295myself:
22296
22297@lisp
22298("references"
22299 ("<x6[0-9a-z]+\\.fsf\\(_-_\\)?@@.*eyesore\\.no>"
22300 1000 nil r))
22301@end lisp
22302
22303Whether it's the first two or first three characters that are ``yours''
22304is system-dependent.
22305
22306
22307@node Scoring On Other Headers
22308@section Scoring On Other Headers
22309@cindex scoring on other headers
22310
22311Gnus is quite fast when scoring the ``traditional''
22312headers---@samp{From}, @samp{Subject} and so on. However, scoring
22313other headers requires writing a @code{head} scoring rule, which means
22314that Gnus has to request every single article from the back end to find
22315matches. This takes a long time in big groups.
22316
58333467
MB
22317@vindex gnus-inhibit-slow-scoring
22318You can inhibit this slow scoring on headers or body by setting the
22319variable @code{gnus-inhibit-slow-scoring}. If
22320@code{gnus-inhibit-slow-scoring} is regexp, slow scoring is inhibited if
22321the group matches the regexp. If it is t, slow scoring on it is
22322inhibited for all groups.
22323
22324Now, there's not much you can do about the slowness for news groups, but for
4009494e
GM
22325mail groups, you have greater control. In @ref{To From Newsgroups},
22326it's explained in greater detail what this mechanism does, but here's
22327a cookbook example for @code{nnml} on how to allow scoring on the
22328@samp{To} and @samp{Cc} headers.
22329
22330Put the following in your @file{~/.gnus.el} file.
22331
22332@lisp
22333(setq gnus-extra-headers '(To Cc Newsgroups Keywords)
22334 nnmail-extra-headers gnus-extra-headers)
22335@end lisp
22336
22337Restart Gnus and rebuild your @code{nnml} overview files with the
22338@kbd{M-x nnml-generate-nov-databases} command. This will take a long
22339time if you have much mail.
22340
22341Now you can score on @samp{To} and @samp{Cc} as ``extra headers'' like
22342so: @kbd{I e s p To RET <your name> RET}.
22343
22344See? Simple.
22345
22346
22347@node Scoring Tips
22348@section Scoring Tips
22349@cindex scoring tips
22350
22351@table @dfn
22352
22353@item Crossposts
22354@cindex crossposts
22355@cindex scoring crossposts
22356If you want to lower the score of crossposts, the line to match on is
22357the @code{Xref} header.
22358@lisp
22359("xref" (" talk.politics.misc:" -1000))
22360@end lisp
22361
22362@item Multiple crossposts
22363If you want to lower the score of articles that have been crossposted to
22364more than, say, 3 groups:
22365@lisp
22366("xref"
22367 ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+"
22368 -1000 nil r))
22369@end lisp
22370
22371@item Matching on the body
22372This is generally not a very good idea---it takes a very long time.
22373Gnus actually has to fetch each individual article from the server. But
22374you might want to anyway, I guess. Even though there are three match
22375keys (@code{Head}, @code{Body} and @code{All}), you should choose one
22376and stick with it in each score file. If you use any two, each article
22377will be fetched @emph{twice}. If you want to match a bit on the
22378@code{Head} and a bit on the @code{Body}, just use @code{All} for all
22379the matches.
22380
22381@item Marking as read
22382You will probably want to mark articles that have scores below a certain
22383number as read. This is most easily achieved by putting the following
22384in your @file{all.SCORE} file:
22385@lisp
22386((mark -100))
22387@end lisp
22388You may also consider doing something similar with @code{expunge}.
22389
22390@item Negated character classes
22391If you say stuff like @code{[^abcd]*}, you may get unexpected results.
22392That will match newlines, which might lead to, well, The Unknown. Say
22393@code{[^abcd\n]*} instead.
22394@end table
22395
22396
22397@node Reverse Scoring
22398@section Reverse Scoring
22399@cindex reverse scoring
22400
22401If you want to keep just articles that have @samp{Sex with Emacs} in the
22402subject header, and expunge all other articles, you could put something
22403like this in your score file:
22404
22405@lisp
22406(("subject"
22407 ("Sex with Emacs" 2))
22408 (mark 1)
22409 (expunge 1))
22410@end lisp
22411
22412So, you raise all articles that match @samp{Sex with Emacs} and mark the
22413rest as read, and expunge them to boot.
22414
22415
22416@node Global Score Files
22417@section Global Score Files
22418@cindex global score files
22419
22420Sure, other newsreaders have ``global kill files''. These are usually
22421nothing more than a single kill file that applies to all groups, stored
22422in the user's home directory. Bah! Puny, weak newsreaders!
22423
22424What I'm talking about here are Global Score Files. Score files from
22425all over the world, from users everywhere, uniting all nations in one
22426big, happy score file union! Ange-score! New and untested!
22427
22428@vindex gnus-global-score-files
22429All you have to do to use other people's score files is to set the
22430@code{gnus-global-score-files} variable. One entry for each score file,
22431or each score file directory. Gnus will decide by itself what score
22432files are applicable to which group.
22433
22434To use the score file
22435@file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} and
22436all score files in the @file{/ftp@@ftp.some-where:/pub/score} directory,
22437say this:
22438
22439@lisp
22440(setq gnus-global-score-files
22441 '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE"
22442 "/ftp@@ftp.some-where:/pub/score/"))
22443@end lisp
22444
22445@findex gnus-score-search-global-directories
22446@noindent
22447Simple, eh? Directory names must end with a @samp{/}. These
22448directories are typically scanned only once during each Gnus session.
22449If you feel the need to manually re-scan the remote directories, you can
22450use the @code{gnus-score-search-global-directories} command.
22451
22452Note that, at present, using this option will slow down group entry
22453somewhat. (That is---a lot.)
22454
22455If you want to start maintaining score files for other people to use,
22456just put your score file up for anonymous ftp and announce it to the
22457world. Become a retro-moderator! Participate in the retro-moderator
22458wars sure to ensue, where retro-moderators battle it out for the
22459sympathy of the people, luring them to use their score files on false
22460premises! Yay! The net is saved!
22461
22462Here are some tips for the would-be retro-moderator, off the top of my
22463head:
22464
22465@itemize @bullet
22466
22467@item
22468Articles heavily crossposted are probably junk.
22469@item
22470To lower a single inappropriate article, lower by @code{Message-ID}.
22471@item
22472Particularly brilliant authors can be raised on a permanent basis.
22473@item
22474Authors that repeatedly post off-charter for the group can safely be
22475lowered out of existence.
22476@item
22477Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest
22478articles completely.
22479
22480@item
22481Use expiring score entries to keep the size of the file down. You
22482should probably have a long expiry period, though, as some sites keep
22483old articles for a long time.
22484@end itemize
22485
22486@dots{} I wonder whether other newsreaders will support global score files
22487in the future. @emph{Snicker}. Yup, any day now, newsreaders like Blue
22488Wave, xrn and 1stReader are bound to implement scoring. Should we start
22489holding our breath yet?
22490
22491
22492@node Kill Files
22493@section Kill Files
22494@cindex kill files
22495
22496Gnus still supports those pesky old kill files. In fact, the kill file
22497entries can now be expiring, which is something I wrote before Daniel
22498Quinlan thought of doing score files, so I've left the code in there.
22499
22500In short, kill processing is a lot slower (and I do mean @emph{a lot})
22501than score processing, so it might be a good idea to rewrite your kill
22502files into score files.
22503
22504Anyway, a kill file is a normal @code{emacs-lisp} file. You can put any
22505forms into this file, which means that you can use kill files as some
22506sort of primitive hook function to be run on group entry, even though
22507that isn't a very good idea.
22508
22509Normal kill files look like this:
22510
22511@lisp
22512(gnus-kill "From" "Lars Ingebrigtsen")
22513(gnus-kill "Subject" "ding")
22514(gnus-expunge "X")
22515@end lisp
22516
22517This will mark every article written by me as read, and remove the
22518marked articles from the summary buffer. Very useful, you'll agree.
22519
22520Other programs use a totally different kill file syntax. If Gnus
22521encounters what looks like a @code{rn} kill file, it will take a stab at
22522interpreting it.
22523
22524Two summary functions for editing a @sc{gnus} kill file:
22525
22526@table @kbd
22527
22528@item M-k
22529@kindex M-k (Summary)
22530@findex gnus-summary-edit-local-kill
22531Edit this group's kill file (@code{gnus-summary-edit-local-kill}).
22532
22533@item M-K
22534@kindex M-K (Summary)
22535@findex gnus-summary-edit-global-kill
22536Edit the general kill file (@code{gnus-summary-edit-global-kill}).
22537@end table
22538
22539Two group mode functions for editing the kill files:
22540
22541@table @kbd
22542
22543@item M-k
22544@kindex M-k (Group)
22545@findex gnus-group-edit-local-kill
22546Edit this group's kill file (@code{gnus-group-edit-local-kill}).
22547
22548@item M-K
22549@kindex M-K (Group)
22550@findex gnus-group-edit-global-kill
22551Edit the general kill file (@code{gnus-group-edit-global-kill}).
22552@end table
22553
22554Kill file variables:
22555
22556@table @code
22557@item gnus-kill-file-name
22558@vindex gnus-kill-file-name
22559A kill file for the group @samp{soc.motss} is normally called
22560@file{soc.motss.KILL}. The suffix appended to the group name to get
22561this file name is detailed by the @code{gnus-kill-file-name} variable.
22562The ``global'' kill file (not in the score file sense of ``global'', of
22563course) is just called @file{KILL}.
22564
22565@vindex gnus-kill-save-kill-file
22566@item gnus-kill-save-kill-file
22567If this variable is non-@code{nil}, Gnus will save the
22568kill file after processing, which is necessary if you use expiring
22569kills.
22570
22571@item gnus-apply-kill-hook
22572@vindex gnus-apply-kill-hook
22573@findex gnus-apply-kill-file-unless-scored
22574@findex gnus-apply-kill-file
22575A hook called to apply kill files to a group. It is
22576@code{(gnus-apply-kill-file)} by default. If you want to ignore the
22577kill file if you have a score file for the same group, you can set this
22578hook to @code{(gnus-apply-kill-file-unless-scored)}. If you don't want
22579kill files to be processed, you should set this variable to @code{nil}.
22580
22581@item gnus-kill-file-mode-hook
22582@vindex gnus-kill-file-mode-hook
22583A hook called in kill-file mode buffers.
22584
22585@end table
22586
22587
22588@node Converting Kill Files
22589@section Converting Kill Files
22590@cindex kill files
22591@cindex converting kill files
22592
22593If you have loads of old kill files, you may want to convert them into
22594score files. If they are ``regular'', you can use
22595the @file{gnus-kill-to-score.el} package; if not, you'll have to do it
22596by hand.
22597
e3e955fe
MB
22598The kill to score conversion package isn't included in Emacs by default.
22599You can fetch it from the contrib directory of the Gnus distribution or
22600from
22601@uref{http://heim.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el}.
4009494e
GM
22602
22603If your old kill files are very complex---if they contain more
22604non-@code{gnus-kill} forms than not, you'll have to convert them by
22605hand. Or just let them be as they are. Gnus will still use them as
22606before.
22607
22608
4009494e
GM
22609@node Advanced Scoring
22610@section Advanced Scoring
22611
22612Scoring on Subjects and From headers is nice enough, but what if you're
22613really interested in what a person has to say only when she's talking
22614about a particular subject? Or what if you really don't want to
22615read what person A has to say when she's following up to person B, but
22616want to read what she says when she's following up to person C?
22617
22618By using advanced scoring rules you may create arbitrarily complex
22619scoring patterns.
22620
22621@menu
22622* Advanced Scoring Syntax:: A definition.
22623* Advanced Scoring Examples:: What they look like.
22624* Advanced Scoring Tips:: Getting the most out of it.
22625@end menu
22626
22627
22628@node Advanced Scoring Syntax
22629@subsection Advanced Scoring Syntax
22630
22631Ordinary scoring rules have a string as the first element in the rule.
22632Advanced scoring rules have a list as the first element. The second
22633element is the score to be applied if the first element evaluated to a
22634non-@code{nil} value.
22635
22636These lists may consist of three logical operators, one redirection
22637operator, and various match operators.
22638
22639Logical operators:
22640
22641@table @code
22642@item &
22643@itemx and
22644This logical operator will evaluate each of its arguments until it finds
22645one that evaluates to @code{false}, and then it'll stop. If all arguments
22646evaluate to @code{true} values, then this operator will return
22647@code{true}.
22648
22649@item |
22650@itemx or
22651This logical operator will evaluate each of its arguments until it finds
22652one that evaluates to @code{true}. If no arguments are @code{true},
22653then this operator will return @code{false}.
22654
22655@item !
22656@itemx not
22657