Merge from gnus--devo--0
[bpt/emacs.git] / doc / misc / gnus.texi
CommitLineData
4009494e
GM
1\input texinfo
2
db78a8cb 3@setfilename ../../info/gnus
4009494e
GM
4@settitle Gnus Manual
5@syncodeindex fn cp
6@syncodeindex vr cp
7@syncodeindex pg cp
8
01c52d31
MB
9@documentencoding ISO-8859-1
10
4009494e
GM
11@copying
12Copyright @copyright{} 1995, 1996, 1997, 1998, 1999, 2000, 2001,
d82cf70b 132002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
4009494e
GM
14
15@quotation
16Permission is granted to copy, distribute and/or modify this document
17under the terms of the GNU Free Documentation License, Version 1.2 or
18any later version published by the Free Software Foundation; with no
debf4439
GM
19Invariant Sections, with the Front-Cover texts being ``A GNU Manual'',
20and with the Back-Cover Texts as in (a) below. A copy of the license
21is included in the section entitled ``GNU Free Documentation License''.
4009494e 22
6f093307
GM
23(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
24modify this GNU manual. Buying copies from the FSF supports it in
25developing GNU and promoting software freedom.''
4009494e
GM
26@end quotation
27@end copying
28
29@iftex
30@iflatex
31\documentclass[twoside,a4paper,openright,11pt]{book}
32\usepackage[latin1]{inputenc}
33\usepackage{pagestyle}
34\usepackage{epsfig}
35\usepackage{pixidx}
36\input{gnusconfig.tex}
37
38\ifx\pdfoutput\undefined
39\else
40\usepackage[pdftex,bookmarks,colorlinks=true]{hyperref}
41\usepackage{thumbpdf}
42\pdfcompresslevel=9
43\fi
44
45\makeindex
46\begin{document}
47
48% Adjust ../Makefile.in if you change the following line:
c7ff939a 49\newcommand{\gnusversionname}{Gnus v5.13}
4009494e
GM
50\newcommand{\gnuschaptername}{}
51\newcommand{\gnussectionname}{}
52
53\newcommand{\gnusbackslash}{/}
54
55\newcommand{\gnusref}[1]{``#1'' on page \pageref{#1}}
56\ifx\pdfoutput\undefined
57\newcommand{\gnusuref}[1]{\gnustt{#1}}
58\else
59\newcommand{\gnusuref}[1]{\href{#1}{\gnustt{#1}}}
60\fi
61\newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}}
62\newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}}
63
64\newcommand{\gnuskindex}[1]{\index{#1}}
65\newcommand{\gnusindex}[1]{\index{#1}}
66
67\newcommand{\gnustt}[1]{{\gnusselectttfont{}#1}}
68\newcommand{\gnuscode}[1]{\gnustt{#1}}
69\newcommand{\gnusasis}[1]{\gnustt{#1}}
70\newcommand{\gnusurl}[1]{\gnustt{#1}}
71\newcommand{\gnuscommand}[1]{\gnustt{#1}}
72\newcommand{\gnusenv}[1]{\gnustt{#1}}
73\newcommand{\gnussamp}[1]{``{\fontencoding{OT1}\gnusselectttfont{}#1}''}
74\newcommand{\gnuslisp}[1]{\gnustt{#1}}
75\newcommand{\gnuskbd}[1]{`\gnustt{#1}'}
76\newcommand{\gnuskey}[1]{`\gnustt{#1}'}
77\newcommand{\gnusfile}[1]{`\gnustt{#1}'}
78\newcommand{\gnusdfn}[1]{\textit{#1}}
79\newcommand{\gnusi}[1]{\textit{#1}}
80\newcommand{\gnusr}[1]{\textrm{#1}}
81\newcommand{\gnusstrong}[1]{\textbf{#1}}
82\newcommand{\gnusemph}[1]{\textit{#1}}
83\newcommand{\gnusvar}[1]{{\fontsize{10pt}{10}\selectfont\textsl{\textsf{#1}}}}
84\newcommand{\gnussc}[1]{\textsc{#1}}
85\newcommand{\gnustitle}[1]{{\huge\textbf{#1}}}
86\newcommand{\gnusversion}[1]{{\small\textit{#1}}}
87\newcommand{\gnusauthor}[1]{{\large\textbf{#1}}}
88\newcommand{\gnusresult}[1]{\gnustt{=> #1}}
89\newcommand{\gnusacronym}[1]{\textsc{#1}}
90\newcommand{\gnusemail}[1]{\textit{#1}}
91
92\newcommand{\gnusbullet}{{${\bullet}$}}
93\newcommand{\gnusdollar}{\$}
94\newcommand{\gnusampersand}{\&}
95\newcommand{\gnuspercent}{\%}
96\newcommand{\gnushash}{\#}
97\newcommand{\gnushat}{\symbol{"5E}}
98\newcommand{\gnusunderline}{\symbol{"5F}}
99\newcommand{\gnusnot}{$\neg$}
100\newcommand{\gnustilde}{\symbol{"7E}}
101\newcommand{\gnusless}{{$<$}}
102\newcommand{\gnusgreater}{{$>$}}
103\newcommand{\gnusbraceleft}{{$>$}}
104\newcommand{\gnusbraceright}{{$>$}}
105
106\newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head,height=1cm}}}
107\newcommand{\gnusinteresting}{
108\marginpar[\mbox{}\hfill\gnushead]{\gnushead}
109}
110
111\newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
112
113\newcommand{\gnuspagechapter}[1]{
114{\mbox{}}
115}
116
117\newdimen{\gnusdimen}
118\gnusdimen 0pt
119
120\newcommand{\gnuschapter}[2]{
121\gnuscleardoublepage
122\ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi
123\chapter{#2}
124\renewcommand{\gnussectionname}{}
125\renewcommand{\gnuschaptername}{#2}
126\thispagestyle{empty}
127\hspace*{-2cm}
128\begin{picture}(500,500)(0,0)
129\put(480,350){\makebox(0,0)[tr]{#1}}
130\put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}}
131\end{picture}
132\clearpage
133}
134
135\newcommand{\gnusfigure}[3]{
136\begin{figure}
137\mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2)
138#3
139\end{picture}
140\caption{#1}
141\end{figure}
142}
143
144\newcommand{\gnusicon}[1]{
145\marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=ps/#1-up,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=ps/#1-up,height=1cm}}}
146}
147
148\newcommand{\gnuspicon}[1]{
149\margindex{\epsfig{figure=#1,width=2cm}}
150}
151
152\newcommand{\gnusxface}[2]{
153\margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}}
154}
155
156\newcommand{\gnussmiley}[2]{
157\margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}}
158}
159
160\newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1}
161
162\newcommand{\gnussection}[1]{
163\renewcommand{\gnussectionname}{#1}
164\section{#1}
165}
166
167\newenvironment{codelist}%
168{\begin{list}{}{
169}
170}{\end{list}}
171
172\newenvironment{asislist}%
173{\begin{list}{}{
174}
175}{\end{list}}
176
177\newenvironment{kbdlist}%
178{\begin{list}{}{
179\labelwidth=0cm
180}
181}{\end{list}}
182
183\newenvironment{dfnlist}%
184{\begin{list}{}{
185}
186}{\end{list}}
187
188\newenvironment{stronglist}%
189{\begin{list}{}{
190}
191}{\end{list}}
192
193\newenvironment{samplist}%
194{\begin{list}{}{
195}
196}{\end{list}}
197
198\newenvironment{varlist}%
199{\begin{list}{}{
200}
201}{\end{list}}
202
203\newenvironment{emphlist}%
204{\begin{list}{}{
205}
206}{\end{list}}
207
208\newlength\gnusheadtextwidth
209\setlength{\gnusheadtextwidth}{\headtextwidth}
210\addtolength{\gnusheadtextwidth}{1cm}
211
212\newpagestyle{gnuspreamble}%
213{
214{
215\ifodd\count0
216{
217\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}}
218}
219\else
220{
221\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}}
222}
223}
224\fi
225}
226}
227{
228\ifodd\count0
229\mbox{} \hfill
230\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
231\else
232\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
233\hfill \mbox{}
234\fi
235}
236
237\newpagestyle{gnusindex}%
238{
239{
240\ifodd\count0
241{
242\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}}
243}
244\else
245{
246\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}
247}
248\fi
249}
250}
251{
252\ifodd\count0
253\mbox{} \hfill
254\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
255\else
256\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
257\hfill \mbox{}
258\fi
259}
260
261\newpagestyle{gnus}%
262{
263{
264\ifodd\count0
265{
266\makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}}
267}
268\else
269{
270\makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}}
271}
272\fi
273}
274}
275{
276\ifodd\count0
277\mbox{} \hfill
278\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
279\else
280\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
281\hfill \mbox{}
282\fi
283}
284
285\pagenumbering{roman}
286\pagestyle{gnuspreamble}
287
288@end iflatex
289@end iftex
290
291@iftex
292@iflatex
293
294\begin{titlepage}
295{
296
297%\addtolength{\oddsidemargin}{-5cm}
298%\addtolength{\evensidemargin}{-5cm}
299\parindent=0cm
300\addtolength{\textheight}{2cm}
301
302\gnustitle{\gnustitlename}\hfill\gnusversion{\gnusversionname}\\
303\rule{15cm}{1mm}\\
304\vfill
305\hspace*{0cm}\epsfig{figure=ps/gnus-big-logo,height=15cm}
306\vfill
307\rule{15cm}{1mm}\\
308\gnusauthor{by Lars Magne Ingebrigtsen}
309\newpage
310}
311
312\mbox{}
313\vfill
314
315\thispagestyle{empty}
316
317@c @insertcopying
318\newpage
319\end{titlepage}
320@end iflatex
321@end iftex
322
323@ifnottex
324@insertcopying
325@end ifnottex
326
327@dircategory Emacs
328@direntry
329* Gnus: (gnus). The newsreader Gnus.
330@end direntry
331@iftex
332@finalout
333@end iftex
334@setchapternewpage odd
335
336
337
338@titlepage
339@title Gnus Manual
340
341@author by Lars Magne Ingebrigtsen
342@page
343@vskip 0pt plus 1filll
344@insertcopying
345@end titlepage
346
347
348@node Top
349@top The Gnus Newsreader
350
351@ifinfo
352
353You can read news (and mail) from within Emacs by using Gnus. The news
354can be gotten by any nefarious means you can think of---@acronym{NNTP}, local
355spool or your mbox file. All at the same time, if you want to push your
356luck.
357
358@c Adjust ../Makefile.in if you change the following line:
c7ff939a 359This manual corresponds to Gnus v5.13
4009494e
GM
360
361@end ifinfo
362
363@iftex
364
365@iflatex
366\tableofcontents
367\gnuscleardoublepage
368@end iflatex
369
370Gnus is the advanced, self-documenting, customizable, extensible
371unreal-time newsreader for GNU Emacs.
372
373Oops. That sounds oddly familiar, so let's start over again to avoid
374being accused of plagiarism:
375
376Gnus is a message-reading laboratory. It will let you look at just
377about anything as if it were a newsgroup. You can read mail with it,
378you can browse directories with it, you can @code{ftp} with it---you
379can even read news with it!
380
381Gnus tries to empower people who read news the same way Emacs empowers
382people who edit text. Gnus sets no limits to what the user should be
383allowed to do. Users are encouraged to extend Gnus to make it behave
384like they want it to behave. A program should not control people;
385people should be empowered to do what they want by using (or abusing)
386the program.
387
9b3ebcb6 388@c Adjust ../Makefile.in if you change the following line:
2e4089ab 389This manual corresponds to Gnus v5.13
9b3ebcb6
MB
390
391@heading Other related manuals
392@itemize
393@item Message manual: Composing messages
394@item Emacs-MIME: Composing messages; @acronym{MIME}-specific parts.
395@item Sieve: Managing Sieve scripts in Emacs.
396@item PGG: @acronym{PGP/MIME} with Gnus.
2e4089ab 397@item SASL: @acronym{SASL} authentication in Emacs.
9b3ebcb6
MB
398@end itemize
399
4009494e
GM
400@end iftex
401
402@menu
403* Starting Up:: Finding news can be a pain.
404* Group Buffer:: Selecting, subscribing and killing groups.
405* Summary Buffer:: Reading, saving and posting articles.
406* Article Buffer:: Displaying and handling articles.
407* Composing Messages:: Information on sending mail and news.
408* Select Methods:: Gnus reads all messages from various select methods.
409* Scoring:: Assigning values to articles.
410* Various:: General purpose settings.
411* The End:: Farewell and goodbye.
412* Appendices:: Terminology, Emacs intro, @acronym{FAQ}, History, Internals.
413* GNU Free Documentation License:: The license for this documentation.
414* Index:: Variable, function and concept index.
415* Key Index:: Key Index.
416
417Other related manuals
418
419* Message:(message). Composing messages.
420* Emacs-MIME:(emacs-mime). Composing messages; @acronym{MIME}-specific parts.
421* Sieve:(sieve). Managing Sieve scripts in Emacs.
422* PGG:(pgg). @acronym{PGP/MIME} with Gnus.
01c52d31 423* SASL:(sasl). @acronym{SASL} authentication in Emacs.
4009494e
GM
424
425@detailmenu
426 --- The Detailed Node Listing ---
427
428Starting Gnus
429
430* Finding the News:: Choosing a method for getting news.
431* The First Time:: What does Gnus do the first time you start it?
432* The Server is Down:: How can I read my mail then?
433* Slave Gnusae:: You can have more than one Gnus active at a time.
434* Fetching a Group:: Starting Gnus just to read a group.
435* New Groups:: What is Gnus supposed to do with new groups?
436* Changing Servers:: You may want to move from one server to another.
437* Startup Files:: Those pesky startup files---@file{.newsrc}.
438* Auto Save:: Recovering from a crash.
439* The Active File:: Reading the active file over a slow line Takes Time.
440* Startup Variables:: Other variables you might change.
441
442New Groups
443
444* Checking New Groups:: Determining what groups are new.
445* Subscription Methods:: What Gnus should do with new groups.
446* Filtering New Groups:: Making Gnus ignore certain new groups.
447
448Group Buffer
449
450* Group Buffer Format:: Information listed and how you can change it.
451* Group Maneuvering:: Commands for moving in the group buffer.
452* Selecting a Group:: Actually reading news.
453* Subscription Commands:: Unsubscribing, killing, subscribing.
454* Group Data:: Changing the info for a group.
455* Group Levels:: Levels? What are those, then?
456* Group Score:: A mechanism for finding out what groups you like.
457* Marking Groups:: You can mark groups for later processing.
458* Foreign Groups:: Creating and editing groups.
459* Group Parameters:: Each group may have different parameters set.
460* Listing Groups:: Gnus can list various subsets of the groups.
461* Sorting Groups:: Re-arrange the group order.
462* Group Maintenance:: Maintaining a tidy @file{.newsrc} file.
463* Browse Foreign Server:: You can browse a server. See what it has to offer.
464* Exiting Gnus:: Stop reading news and get some work done.
465* Group Topics:: A folding group mode divided into topics.
01c52d31 466* Non-ASCII Group Names:: Accessing groups of non-English names.
4009494e
GM
467* Misc Group Stuff:: Other stuff that you can to do.
468
469Group Buffer Format
470
471* Group Line Specification:: Deciding how the group buffer is to look.
472* Group Mode Line Specification:: The group buffer mode line.
473* Group Highlighting:: Having nice colors in the group buffer.
474
475Group Topics
476
477* Topic Commands:: Interactive E-Z commands.
478* Topic Variables:: How to customize the topics the Lisp Way.
479* Topic Sorting:: Sorting each topic individually.
480* Topic Topology:: A map of the world.
481* Topic Parameters:: Parameters that apply to all groups in a topic.
482
483Misc Group Stuff
484
485* Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
486* Group Information:: Information and help on groups and Gnus.
487* Group Timestamp:: Making Gnus keep track of when you last read a group.
488* File Commands:: Reading and writing the Gnus files.
489* Sieve Commands:: Managing Sieve scripts.
490
491Summary Buffer
492
493* Summary Buffer Format:: Deciding how the summary buffer is to look.
494* Summary Maneuvering:: Moving around the summary buffer.
495* Choosing Articles:: Reading articles.
496* Paging the Article:: Scrolling the current article.
497* Reply Followup and Post:: Posting articles.
498* Delayed Articles:: Send articles at a later time.
499* Marking Articles:: Marking articles as read, expirable, etc.
500* Limiting:: You can limit the summary buffer.
501* Threading:: How threads are made.
502* Sorting the Summary Buffer:: How articles and threads are sorted.
503* Asynchronous Fetching:: Gnus might be able to pre-fetch articles.
504* Article Caching:: You may store articles in a cache.
505* Persistent Articles:: Making articles expiry-resistant.
01c52d31 506* Sticky Articles:: Article buffers that are not reused.
4009494e
GM
507* Article Backlog:: Having already read articles hang around.
508* Saving Articles:: Ways of customizing article saving.
509* Decoding Articles:: Gnus can treat series of (uu)encoded articles.
510* Article Treatment:: The article buffer can be mangled at will.
511* MIME Commands:: Doing MIMEy things with the articles.
512* Charsets:: Character set issues.
513* Article Commands:: Doing various things with the article buffer.
514* Summary Sorting:: Sorting the summary buffer in various ways.
515* Finding the Parent:: No child support? Get the parent.
516* Alternative Approaches:: Reading using non-default summaries.
517* Tree Display:: A more visual display of threads.
518* Mail Group Commands:: Some commands can only be used in mail groups.
519* Various Summary Stuff:: What didn't fit anywhere else.
520* Exiting the Summary Buffer:: Returning to the Group buffer,
521 or reselecting the current group.
522* Crosspost Handling:: How crossposted articles are dealt with.
523* Duplicate Suppression:: An alternative when crosspost handling fails.
524* Security:: Decrypt and Verify.
525* Mailing List:: Mailing list minor mode.
526
527Summary Buffer Format
528
529* Summary Buffer Lines:: You can specify how summary lines should look.
530* To From Newsgroups:: How to not display your own name.
531* Summary Buffer Mode Line:: You can say how the mode line should look.
532* Summary Highlighting:: Making the summary buffer all pretty and nice.
533
534Choosing Articles
535
536* Choosing Commands:: Commands for choosing articles.
537* Choosing Variables:: Variables that influence these commands.
538
539Reply, Followup and Post
540
541* Summary Mail Commands:: Sending mail.
542* Summary Post Commands:: Sending news.
543* Summary Message Commands:: Other Message-related commands.
544* Canceling and Superseding::
545
546Marking Articles
547
548* Unread Articles:: Marks for unread articles.
549* Read Articles:: Marks for read articles.
550* Other Marks:: Marks that do not affect readedness.
551* Setting Marks:: How to set and remove marks.
552* Generic Marking Commands:: How to customize the marking.
553* Setting Process Marks:: How to mark articles for later processing.
554
555Threading
556
557* Customizing Threading:: Variables you can change to affect the threading.
558* Thread Commands:: Thread based commands in the summary buffer.
559
560Customizing Threading
561
562* Loose Threads:: How Gnus gathers loose threads into bigger threads.
563* Filling In Threads:: Making the threads displayed look fuller.
564* More Threading:: Even more variables for fiddling with threads.
565* Low-Level Threading:: You thought it was over@dots{} but you were wrong!
566
567Decoding Articles
568
569* Uuencoded Articles:: Uudecode articles.
570* Shell Archives:: Unshar articles.
571* PostScript Files:: Split PostScript.
572* Other Files:: Plain save and binhex.
573* Decoding Variables:: Variables for a happy decoding.
574* Viewing Files:: You want to look at the result of the decoding?
575
576Decoding Variables
577
578* Rule Variables:: Variables that say how a file is to be viewed.
579* Other Decode Variables:: Other decode variables.
580* Uuencoding and Posting:: Variables for customizing uuencoding.
581
582Article Treatment
583
584* Article Highlighting:: You want to make the article look like fruit salad.
585* Article Fontisizing:: Making emphasized text look nice.
586* Article Hiding:: You also want to make certain info go away.
587* Article Washing:: Lots of way-neat functions to make life better.
588* Article Header:: Doing various header transformations.
589* Article Buttons:: Click on URLs, Message-IDs, addresses and the like.
590* Article Button Levels:: Controlling appearance of buttons.
591* Article Date:: Grumble, UT!
592* Article Display:: Display various stuff---X-Face, Picons, Smileys
593* Article Signature:: What is a signature?
594* Article Miscellanea:: Various other stuff.
595
596Alternative Approaches
597
598* Pick and Read:: First mark articles and then read them.
599* Binary Groups:: Auto-decode all articles.
600
601Various Summary Stuff
602
603* Summary Group Information:: Information oriented commands.
604* Searching for Articles:: Multiple article commands.
605* Summary Generation Commands::
606* Really Various Summary Commands:: Those pesky non-conformant commands.
607
608Article Buffer
609
610* Hiding Headers:: Deciding what headers should be displayed.
611* Using MIME:: Pushing articles through @acronym{MIME} before reading them.
612* Customizing Articles:: Tailoring the look of the articles.
613* Article Keymap:: Keystrokes available in the article buffer.
614* Misc Article:: Other stuff.
615
616Composing Messages
617
618* Mail:: Mailing and replying.
619* Posting Server:: What server should you post and mail via?
620* POP before SMTP:: You cannot send a mail unless you read a mail.
621* Mail and Post:: Mailing and posting at the same time.
622* Archived Messages:: Where Gnus stores the messages you've sent.
623* Posting Styles:: An easier way to specify who you are.
624* Drafts:: Postponing messages and rejected messages.
625* Rejected Articles:: What happens if the server doesn't like your article?
626* Signing and encrypting:: How to compose secure messages.
627
628Select Methods
629
630* Server Buffer:: Making and editing virtual servers.
631* Getting News:: Reading USENET news with Gnus.
632* Getting Mail:: Reading your personal mail with Gnus.
633* Browsing the Web:: Getting messages from a plethora of Web sources.
634* IMAP:: Using Gnus as a @acronym{IMAP} client.
635* Other Sources:: Reading directories, files, SOUP packets.
636* Combined Groups:: Combining groups into one group.
637* Email Based Diary:: Using mails to manage diary events in Gnus.
638* Gnus Unplugged:: Reading news and mail offline.
639
640Server Buffer
641
642* Server Buffer Format:: You can customize the look of this buffer.
643* Server Commands:: Commands to manipulate servers.
644* Example Methods:: Examples server specifications.
645* Creating a Virtual Server:: An example session.
646* Server Variables:: Which variables to set.
647* Servers and Methods:: You can use server names as select methods.
648* Unavailable Servers:: Some servers you try to contact may be down.
649
650Getting News
651
652* NNTP:: Reading news from an @acronym{NNTP} server.
653* News Spool:: Reading news from the local spool.
654
655@acronym{NNTP}
656
657* Direct Functions:: Connecting directly to the server.
658* Indirect Functions:: Connecting indirectly to the server.
659* Common Variables:: Understood by several connection functions.
01c52d31 660* NNTP marks:: Storing marks for @acronym{NNTP} servers.
4009494e
GM
661
662Getting Mail
663
664* Mail in a Newsreader:: Important introductory notes.
665* Getting Started Reading Mail:: A simple cookbook example.
666* Splitting Mail:: How to create mail groups.
667* Mail Sources:: How to tell Gnus where to get mail from.
668* Mail Back End Variables:: Variables for customizing mail handling.
669* Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.
670* Group Mail Splitting:: Use group customize to drive mail splitting.
671* Incorporating Old Mail:: What about the old mail you have?
672* Expiring Mail:: Getting rid of unwanted mail.
673* Washing Mail:: Removing cruft from the mail you get.
674* Duplicates:: Dealing with duplicated mail.
675* Not Reading Mail:: Using mail back ends for reading other files.
676* Choosing a Mail Back End:: Gnus can read a variety of mail formats.
677
678Mail Sources
679
680* Mail Source Specifiers:: How to specify what a mail source is.
681* Mail Source Customization:: Some variables that influence things.
682* Fetching Mail:: Using the mail source specifiers.
683
684Choosing a Mail Back End
685
686* Unix Mail Box:: Using the (quite) standard Un*x mbox.
687* Rmail Babyl:: Emacs programs use the Rmail Babyl format.
688* Mail Spool:: Store your mail in a private spool?
689* MH Spool:: An mhspool-like back end.
690* Maildir:: Another one-file-per-message format.
691* Mail Folders:: Having one file for each group.
692* Comparing Mail Back Ends:: An in-depth looks at pros and cons.
693
694Browsing the Web
695
696* Archiving Mail::
697* Web Searches:: Creating groups from articles that match a string.
698* Slashdot:: Reading the Slashdot comments.
699* Ultimate:: The Ultimate Bulletin Board systems.
700* Web Archive:: Reading mailing list archived on web.
701* RSS:: Reading RDF site summary.
702* Customizing W3:: Doing stuff to Emacs/W3 from Gnus.
703
704@acronym{IMAP}
705
706* Splitting in IMAP:: Splitting mail with nnimap.
707* Expiring in IMAP:: Expiring mail with nnimap.
708* Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox.
709* Expunging mailboxes:: Equivalent of a ``compress mailbox'' button.
710* A note on namespaces:: How to (not) use @acronym{IMAP} namespace in Gnus.
711* Debugging IMAP:: What to do when things don't work.
712
713Other Sources
714
715* Directory Groups:: You can read a directory as if it was a newsgroup.
716* Anything Groups:: Dired? Who needs dired?
717* Document Groups:: Single files can be the basis of a group.
718* SOUP:: Reading @sc{soup} packets ``offline''.
719* Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
720
721Document Groups
722
723* Document Server Internals:: How to add your own document types.
724
725SOUP
726
727* SOUP Commands:: Commands for creating and sending @sc{soup} packets
728* SOUP Groups:: A back end for reading @sc{soup} packets.
729* SOUP Replies:: How to enable @code{nnsoup} to take over mail and news.
730
731Combined Groups
732
733* Virtual Groups:: Combining articles from many groups.
734* Kibozed Groups:: Looking through parts of the newsfeed for articles.
735
736Email Based Diary
737
738* The NNDiary Back End:: Basic setup and usage.
739* The Gnus Diary Library:: Utility toolkit on top of nndiary.
740* Sending or Not Sending:: A final note on sending diary messages.
741
742The NNDiary Back End
743
744* Diary Messages:: What makes a message valid for nndiary.
745* Running NNDiary:: NNDiary has two modes of operation.
746* Customizing NNDiary:: Bells and whistles.
747
748The Gnus Diary Library
749
750* Diary Summary Line Format:: A nicer summary buffer line format.
751* Diary Articles Sorting:: A nicer way to sort messages.
752* Diary Headers Generation:: Not doing it manually.
753* Diary Group Parameters:: Not handling them manually.
754
755Gnus Unplugged
756
757* Agent Basics:: How it all is supposed to work.
758* Agent Categories:: How to tell the Gnus Agent what to download.
759* Agent Commands:: New commands for all the buffers.
760* Agent Visuals:: Ways that the agent may effect your summary buffer.
761* Agent as Cache:: The Agent is a big cache too.
762* Agent Expiry:: How to make old articles go away.
763* Agent Regeneration:: How to recover from lost connections and other accidents.
01c52d31 764* Agent and flags:: How the Agent maintains flags.
4009494e
GM
765* Agent and IMAP:: How to use the Agent with @acronym{IMAP}.
766* Outgoing Messages:: What happens when you post/mail something?
767* Agent Variables:: Customizing is fun.
768* Example Setup:: An example @file{~/.gnus.el} file for offline people.
769* Batching Agents:: How to fetch news from a @code{cron} job.
770* Agent Caveats:: What you think it'll do and what it does.
771
772Agent Categories
773
774* Category Syntax:: What a category looks like.
775* Category Buffer:: A buffer for maintaining categories.
776* Category Variables:: Customize'r'Us.
777
778Agent Commands
779
780* Group Agent Commands:: Configure groups and fetch their contents.
781* Summary Agent Commands:: Manually select then fetch specific articles.
782* Server Agent Commands:: Select the servers that are supported by the agent.
783
784Scoring
785
786* Summary Score Commands:: Adding score entries for the current group.
787* Group Score Commands:: General score commands.
788* Score Variables:: Customize your scoring. (My, what terminology).
789* Score File Format:: What a score file may contain.
790* Score File Editing:: You can edit score files by hand as well.
791* Adaptive Scoring:: Big Sister Gnus knows what you read.
792* Home Score File:: How to say where new score entries are to go.
793* Followups To Yourself:: Having Gnus notice when people answer you.
794* Scoring On Other Headers:: Scoring on non-standard headers.
795* Scoring Tips:: How to score effectively.
796* Reverse Scoring:: That problem child of old is not problem.
797* Global Score Files:: Earth-spanning, ear-splitting score files.
798* Kill Files:: They are still here, but they can be ignored.
799* Converting Kill Files:: Translating kill files to score files.
4009494e
GM
800* Advanced Scoring:: Using logical expressions to build score rules.
801* Score Decays:: It can be useful to let scores wither away.
802
4009494e
GM
803Advanced Scoring
804
805* Advanced Scoring Syntax:: A definition.
806* Advanced Scoring Examples:: What they look like.
807* Advanced Scoring Tips:: Getting the most out of it.
808
809Various
810
811* Process/Prefix:: A convention used by many treatment commands.
812* Interactive:: Making Gnus ask you many questions.
813* Symbolic Prefixes:: How to supply some Gnus functions with options.
814* Formatting Variables:: You can specify what buffers should look like.
815* Window Layout:: Configuring the Gnus buffer windows.
816* Faces and Fonts:: How to change how faces look.
817* Compilation:: How to speed Gnus up.
818* Mode Lines:: Displaying information in the mode lines.
819* Highlighting and Menus:: Making buffers look all nice and cozy.
820* Buttons:: Get tendinitis in ten easy steps!
821* Daemons:: Gnus can do things behind your back.
822* NoCeM:: How to avoid spam and other fatty foods.
823* Undo:: Some actions can be undone.
824* Predicate Specifiers:: Specifying predicates.
825* Moderation:: What to do if you're a moderator.
826* Image Enhancements:: Modern versions of Emacs/XEmacs can display images.
827* Fuzzy Matching:: What's the big fuzz?
828* Thwarting Email Spam:: Simple ways to avoid unsolicited commercial email.
829* Spam Package:: A package for filtering and processing spam.
830* Other modes:: Interaction with other modes.
831* Various Various:: Things that are really various.
832
833Formatting Variables
834
835* Formatting Basics:: A formatting variable is basically a format string.
836* Mode Line Formatting:: Some rules about mode line formatting variables.
837* Advanced Formatting:: Modifying output in various ways.
838* User-Defined Specs:: Having Gnus call your own functions.
839* Formatting Fonts:: Making the formatting look colorful and nice.
840* Positioning Point:: Moving point to a position after an operation.
841* Tabulation:: Tabulating your output.
842* Wide Characters:: Dealing with wide characters.
843
844Image Enhancements
845
846* X-Face:: Display a funky, teensy black-and-white image.
847* Face:: Display a funkier, teensier colored image.
848* Smileys:: Show all those happy faces the way they were
849 meant to be shown.
850* Picons:: How to display pictures of what you're reading.
851* XVarious:: Other XEmacsy Gnusey variables.
852
853Thwarting Email Spam
854
855* The problem of spam:: Some background, and some solutions
856* Anti-Spam Basics:: Simple steps to reduce the amount of spam.
857* SpamAssassin:: How to use external anti-spam tools.
858* Hashcash:: Reduce spam by burning CPU time.
859
860Spam Package
861
862* Spam Package Introduction::
863* Filtering Incoming Mail::
864* Detecting Spam in Groups::
865* Spam and Ham Processors::
866* Spam Package Configuration Examples::
867* Spam Back Ends::
868* Extending the Spam package::
869* Spam Statistics Package::
870
871Spam Statistics Package
872
873* Creating a spam-stat dictionary::
874* Splitting mail using spam-stat::
875* Low-level interface to the spam-stat dictionary::
876
877Appendices
878
879* XEmacs:: Requirements for installing under XEmacs.
880* History:: How Gnus got where it is today.
881* On Writing Manuals:: Why this is not a beginner's guide.
882* Terminology:: We use really difficult, like, words here.
883* Customization:: Tailoring Gnus to your needs.
884* Troubleshooting:: What you might try if things do not work.
885* Gnus Reference Guide:: Rilly, rilly technical stuff.
886* Emacs for Heathens:: A short introduction to Emacsian terms.
887* Frequently Asked Questions:: The Gnus FAQ
888
889History
890
891* Gnus Versions:: What Gnus versions have been released.
892* Other Gnus Versions:: Other Gnus versions that also have been released.
893* Why?:: What's the point of Gnus?
894* Compatibility:: Just how compatible is Gnus with @sc{gnus}?
895* Conformity:: Gnus tries to conform to all standards.
896* Emacsen:: Gnus can be run on a few modern Emacsen.
897* Gnus Development:: How Gnus is developed.
898* Contributors:: Oodles of people.
899* New Features:: Pointers to some of the new stuff in Gnus.
900
901New Features
902
903* ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus.
904* September Gnus:: The Thing Formally Known As Gnus 5.2/5.3.
905* Red Gnus:: Third time best---Gnus 5.4/5.5.
906* Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7.
907* Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9.
908* Oort Gnus:: It's big. It's far out. Gnus 5.10/5.11.
01c52d31 909* No Gnus:: Very punny.
4009494e
GM
910
911Customization
912
913* Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.
914* Slow Terminal Connection:: You run a remote Emacs.
915* Little Disk Space:: You feel that having large setup files is icky.
916* Slow Machine:: You feel like buying a faster machine.
917
918Gnus Reference Guide
919
920* Gnus Utility Functions:: Common functions and variable to use.
921* Back End Interface:: How Gnus communicates with the servers.
922* Score File Syntax:: A BNF definition of the score file standard.
923* Headers:: How Gnus stores headers internally.
924* Ranges:: A handy format for storing mucho numbers.
925* Group Info:: The group info format.
926* Extended Interactive:: Symbolic prefixes and stuff.
927* Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen.
928* Various File Formats:: Formats of files that Gnus use.
929
930Back End Interface
931
932* Required Back End Functions:: Functions that must be implemented.
933* Optional Back End Functions:: Functions that need not be implemented.
934* Error Messaging:: How to get messages and report errors.
935* Writing New Back Ends:: Extending old back ends.
936* Hooking New Back Ends Into Gnus:: What has to be done on the Gnus end.
937* Mail-like Back Ends:: Some tips on mail back ends.
938
939Various File Formats
940
941* Active File Format:: Information on articles and groups available.
942* Newsgroups File Format:: Group descriptions.
943
944Emacs for Heathens
945
946* Keystrokes:: Entering text and executing commands.
947* Emacs Lisp:: The built-in Emacs programming language.
948
949@end detailmenu
950@end menu
951
952@node Starting Up
953@chapter Starting Gnus
954@cindex starting up
955
956If you haven't used Emacs much before using Gnus, read @ref{Emacs for
957Heathens} first.
958
959@kindex M-x gnus
960@findex gnus
961If your system administrator has set things up properly, starting Gnus
962and reading news is extremely easy---you just type @kbd{M-x gnus} in
963your Emacs. If not, you should customize the variable
964@code{gnus-select-method} as described in @ref{Finding the News}. For a
965minimal setup for posting should also customize the variables
966@code{user-full-name} and @code{user-mail-address}.
967
968@findex gnus-other-frame
969@kindex M-x gnus-other-frame
970If you want to start Gnus in a different frame, you can use the command
971@kbd{M-x gnus-other-frame} instead.
972
973If things do not go smoothly at startup, you have to twiddle some
974variables in your @file{~/.gnus.el} file. This file is similar to
975@file{~/.emacs}, but is read when Gnus starts.
976
977If you puzzle at any terms used in this manual, please refer to the
978terminology section (@pxref{Terminology}).
979
980@menu
981* Finding the News:: Choosing a method for getting news.
982* The First Time:: What does Gnus do the first time you start it?
983* The Server is Down:: How can I read my mail then?
984* Slave Gnusae:: You can have more than one Gnus active at a time.
985* New Groups:: What is Gnus supposed to do with new groups?
986* Changing Servers:: You may want to move from one server to another.
987* Startup Files:: Those pesky startup files---@file{.newsrc}.
988* Auto Save:: Recovering from a crash.
989* The Active File:: Reading the active file over a slow line Takes Time.
990* Startup Variables:: Other variables you might change.
991@end menu
992
993
994@node Finding the News
995@section Finding the News
996@cindex finding news
997
998@vindex gnus-select-method
999@c @head
1000The @code{gnus-select-method} variable says where Gnus should look for
1001news. This variable should be a list where the first element says
1002@dfn{how} and the second element says @dfn{where}. This method is your
1003native method. All groups not fetched with this method are
1004foreign groups.
1005
1006For instance, if the @samp{news.somewhere.edu} @acronym{NNTP} server is where
1007you want to get your daily dosage of news from, you'd say:
1008
1009@lisp
1010(setq gnus-select-method '(nntp "news.somewhere.edu"))
1011@end lisp
1012
1013If you want to read directly from the local spool, say:
1014
1015@lisp
1016(setq gnus-select-method '(nnspool ""))
1017@end lisp
1018
1019If you can use a local spool, you probably should, as it will almost
1020certainly be much faster. But do not use the local spool if your
1021server is running Leafnode (which is a simple, standalone private news
1022server); in this case, use @code{(nntp "localhost")}.
1023
1024@vindex gnus-nntpserver-file
1025@cindex NNTPSERVER
1026@cindex @acronym{NNTP} server
1027If this variable is not set, Gnus will take a look at the
1028@env{NNTPSERVER} environment variable. If that variable isn't set,
1029Gnus will see whether @code{gnus-nntpserver-file}
1030(@file{/etc/nntpserver} by default) has any opinions on the matter.
1031If that fails as well, Gnus will try to use the machine running Emacs
1032as an @acronym{NNTP} server. That's a long shot, though.
1033
1034@vindex gnus-nntp-server
1035If @code{gnus-nntp-server} is set, this variable will override
1036@code{gnus-select-method}. You should therefore set
1037@code{gnus-nntp-server} to @code{nil}, which is what it is by default.
1038
1039@vindex gnus-secondary-servers
1040@vindex gnus-nntp-server
1041You can also make Gnus prompt you interactively for the name of an
1042@acronym{NNTP} server. If you give a non-numerical prefix to @code{gnus}
1043(i.e., @kbd{C-u M-x gnus}), Gnus will let you choose between the servers
1044in the @code{gnus-secondary-servers} list (if any). You can also just
1045type in the name of any server you feel like visiting. (Note that this
1046will set @code{gnus-nntp-server}, which means that if you then @kbd{M-x
1047gnus} later in the same Emacs session, Gnus will contact the same
1048server.)
1049
1050@findex gnus-group-browse-foreign-server
1051@kindex B (Group)
1052However, if you use one @acronym{NNTP} server regularly and are just
1053interested in a couple of groups from a different server, you would be
1054better served by using the @kbd{B} command in the group buffer. It will
1055let you have a look at what groups are available, and you can subscribe
1056to any of the groups you want to. This also makes @file{.newsrc}
1057maintenance much tidier. @xref{Foreign Groups}.
1058
1059@vindex gnus-secondary-select-methods
1060@c @head
1061A slightly different approach to foreign groups is to set the
1062@code{gnus-secondary-select-methods} variable. The select methods
1063listed in this variable are in many ways just as native as the
1064@code{gnus-select-method} server. They will also be queried for active
1065files during startup (if that's required), and new newsgroups that
1066appear on these servers will be subscribed (or not) just as native
1067groups are.
1068
1069For instance, if you use the @code{nnmbox} back end to read your mail,
1070you would typically set this variable to
1071
1072@lisp
1073(setq gnus-secondary-select-methods '((nnmbox "")))
1074@end lisp
1075
01c52d31
MB
1076Note: the @acronym{NNTP} back end stores marks in marks files
1077(@pxref{NNTP marks}). This feature makes it easy to share marks between
1078several Gnus installations, but may slow down things a bit when fetching
1079new articles. @xref{NNTP marks}, for more information.
1080
4009494e
GM
1081
1082@node The First Time
1083@section The First Time
1084@cindex first time usage
1085
1086If no startup files exist (@pxref{Startup Files}), Gnus will try to
1087determine what groups should be subscribed by default.
1088
1089@vindex gnus-default-subscribed-newsgroups
1090If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus
1091will subscribe you to just those groups in that list, leaving the rest
1092killed. Your system administrator should have set this variable to
1093something useful.
1094
1095Since she hasn't, Gnus will just subscribe you to a few arbitrarily
1096picked groups (i.e., @samp{*.newusers}). (@dfn{Arbitrary} is defined
1097here as @dfn{whatever Lars thinks you should read}.)
1098
1099You'll also be subscribed to the Gnus documentation group, which should
1100help you with most common problems.
1101
1102If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will just
1103use the normal functions for handling new groups, and not do anything
1104special.
1105
1106
1107@node The Server is Down
1108@section The Server is Down
1109@cindex server errors
1110
1111If the default server is down, Gnus will understandably have some
1112problems starting. However, if you have some mail groups in addition to
1113the news groups, you may want to start Gnus anyway.
1114
1115Gnus, being the trusting sort of program, will ask whether to proceed
1116without a native select method if that server can't be contacted. This
1117will happen whether the server doesn't actually exist (i.e., you have
1118given the wrong address) or the server has just momentarily taken ill
1119for some reason or other. If you decide to continue and have no foreign
1120groups, you'll find it difficult to actually do anything in the group
1121buffer. But, hey, that's your problem. Blllrph!
1122
1123@findex gnus-no-server
1124@kindex M-x gnus-no-server
1125@c @head
1126If you know that the server is definitely down, or you just want to read
1127your mail without bothering with the server at all, you can use the
1128@code{gnus-no-server} command to start Gnus. That might come in handy
1129if you're in a hurry as well. This command will not attempt to contact
1130your primary server---instead, it will just activate all groups on level
11311 and 2. (You should preferably keep no native groups on those two
1132levels.) Also @pxref{Group Levels}.
1133
1134
1135@node Slave Gnusae
1136@section Slave Gnusae
1137@cindex slave
1138
1139You might want to run more than one Emacs with more than one Gnus at the
1140same time. If you are using different @file{.newsrc} files (e.g., if you
1141are using the two different Gnusae to read from two different servers),
1142that is no problem whatsoever. You just do it.
1143
1144The problem appears when you want to run two Gnusae that use the same
1145@file{.newsrc} file.
1146
1147To work around that problem some, we here at the Think-Tank at the Gnus
1148Towers have come up with a new concept: @dfn{Masters} and
1149@dfn{slaves}. (We have applied for a patent on this concept, and have
1150taken out a copyright on those words. If you wish to use those words in
1151conjunction with each other, you have to send $1 per usage instance to
1152me. Usage of the patent (@dfn{Master/Slave Relationships In Computer
1153Applications}) will be much more expensive, of course.)
1154
1155@findex gnus-slave
1156Anyway, you start one Gnus up the normal way with @kbd{M-x gnus} (or
1157however you do it). Each subsequent slave Gnusae should be started with
1158@kbd{M-x gnus-slave}. These slaves won't save normal @file{.newsrc}
1159files, but instead save @dfn{slave files} that contain information only
1160on what groups have been read in the slave session. When a master Gnus
1161starts, it will read (and delete) these slave files, incorporating all
1162information from them. (The slave files will be read in the sequence
1163they were created, so the latest changes will have precedence.)
1164
1165Information from the slave files has, of course, precedence over the
1166information in the normal (i.e., master) @file{.newsrc} file.
1167
1168If the @file{.newsrc*} files have not been saved in the master when the
1169slave starts, you may be prompted as to whether to read an auto-save
1170file. If you answer ``yes'', the unsaved changes to the master will be
1171incorporated into the slave. If you answer ``no'', the slave may see some
1172messages as unread that have been read in the master.
1173
1174
1175
1176@node New Groups
1177@section New Groups
1178@cindex new groups
1179@cindex subscription
1180
1181@vindex gnus-check-new-newsgroups
1182If you are satisfied that you really never want to see any new groups,
1183you can set @code{gnus-check-new-newsgroups} to @code{nil}. This will
1184also save you some time at startup. Even if this variable is
1185@code{nil}, you can always subscribe to the new groups just by pressing
1186@kbd{U} in the group buffer (@pxref{Group Maintenance}). This variable
1187is @code{ask-server} by default. If you set this variable to
1188@code{always}, then Gnus will query the back ends for new groups even
1189when you do the @kbd{g} command (@pxref{Scanning New Messages}).
1190
1191@menu
1192* Checking New Groups:: Determining what groups are new.
1193* Subscription Methods:: What Gnus should do with new groups.
1194* Filtering New Groups:: Making Gnus ignore certain new groups.
1195@end menu
1196
1197
1198@node Checking New Groups
1199@subsection Checking New Groups
1200
1201Gnus normally determines whether a group is new or not by comparing the
1202list of groups from the active file(s) with the lists of subscribed and
1203dead groups. This isn't a particularly fast method. If
1204@code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask the
1205server for new groups since the last time. This is both faster and
1206cheaper. This also means that you can get rid of the list of killed
1207groups altogether, so you may set @code{gnus-save-killed-list} to
1208@code{nil}, which will save time both at startup, at exit, and all over.
1209Saves disk space, too. Why isn't this the default, then?
1210Unfortunately, not all servers support this command.
1211
1212I bet I know what you're thinking now: How do I find out whether my
1213server supports @code{ask-server}? No? Good, because I don't have a
1214fail-safe answer. I would suggest just setting this variable to
1215@code{ask-server} and see whether any new groups appear within the next
1216few days. If any do, then it works. If none do, then it doesn't
1217work. I could write a function to make Gnus guess whether the server
1218supports @code{ask-server}, but it would just be a guess. So I won't.
1219You could @code{telnet} to the server and say @code{HELP} and see
1220whether it lists @samp{NEWGROUPS} among the commands it understands. If
1221it does, then it might work. (But there are servers that lists
1222@samp{NEWGROUPS} without supporting the function properly.)
1223
1224This variable can also be a list of select methods. If so, Gnus will
1225issue an @code{ask-server} command to each of the select methods, and
1226subscribe them (or not) using the normal methods. This might be handy
1227if you are monitoring a few servers for new groups. A side effect is
1228that startup will take much longer, so you can meditate while waiting.
1229Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss.
1230
1231
1232@node Subscription Methods
1233@subsection Subscription Methods
1234
1235@vindex gnus-subscribe-newsgroup-method
1236What Gnus does when it encounters a new group is determined by the
1237@code{gnus-subscribe-newsgroup-method} variable.
1238
1239This variable should contain a function. This function will be called
1240with the name of the new group as the only parameter.
1241
1242Some handy pre-fab functions are:
1243
1244@table @code
1245
1246@item gnus-subscribe-zombies
1247@vindex gnus-subscribe-zombies
1248Make all new groups zombies. This is the default. You can browse the
1249zombies later (with @kbd{A z}) and either kill them all off properly
1250(with @kbd{S z}), or subscribe to them (with @kbd{u}).
1251
1252@item gnus-subscribe-randomly
1253@vindex gnus-subscribe-randomly
1254Subscribe all new groups in arbitrary order. This really means that all
1255new groups will be added at ``the top'' of the group buffer.
1256
1257@item gnus-subscribe-alphabetically
1258@vindex gnus-subscribe-alphabetically
1259Subscribe all new groups in alphabetical order.
1260
1261@item gnus-subscribe-hierarchically
1262@vindex gnus-subscribe-hierarchically
1263Subscribe all new groups hierarchically. The difference between this
1264function and @code{gnus-subscribe-alphabetically} is slight.
1265@code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly
1266alphabetical fashion, while this function will enter groups into its
1267hierarchy. So if you want to have the @samp{rec} hierarchy before the
1268@samp{comp} hierarchy, this function will not mess that configuration
1269up. Or something like that.
1270
1271@item gnus-subscribe-interactively
1272@vindex gnus-subscribe-interactively
1273Subscribe new groups interactively. This means that Gnus will ask
1274you about @strong{all} new groups. The groups you choose to subscribe
1275to will be subscribed hierarchically.
1276
1277@item gnus-subscribe-killed
1278@vindex gnus-subscribe-killed
1279Kill all new groups.
1280
1281@item gnus-subscribe-topics
1282@vindex gnus-subscribe-topics
1283Put the groups into the topic that has a matching @code{subscribe} topic
1284parameter (@pxref{Topic Parameters}). For instance, a @code{subscribe}
1285topic parameter that looks like
1286
1287@example
1288"nnslashdot"
1289@end example
1290
1291will mean that all groups that match that regex will be subscribed under
1292that topic.
1293
1294If no topics match the groups, the groups will be subscribed in the
1295top-level topic.
1296
1297@end table
1298
1299@vindex gnus-subscribe-hierarchical-interactive
1300A closely related variable is
1301@code{gnus-subscribe-hierarchical-interactive}. (That's quite a
1302mouthful.) If this variable is non-@code{nil}, Gnus will ask you in a
1303hierarchical fashion whether to subscribe to new groups or not. Gnus
1304will ask you for each sub-hierarchy whether you want to descend the
1305hierarchy or not.
1306
1307One common mistake is to set the variable a few paragraphs above
1308(@code{gnus-subscribe-newsgroup-method}) to
1309@code{gnus-subscribe-hierarchical-interactive}. This is an error. This
1310will not work. This is ga-ga. So don't do it.
1311
1312
1313@node Filtering New Groups
1314@subsection Filtering New Groups
1315
1316A nice and portable way to control which new newsgroups should be
1317subscribed (or ignored) is to put an @dfn{options} line at the start of
1318the @file{.newsrc} file. Here's an example:
1319
1320@example
1321options -n !alt.all !rec.all sci.all
1322@end example
1323
1324@vindex gnus-subscribe-options-newsgroup-method
1325This line obviously belongs to a serious-minded intellectual scientific
1326person (or she may just be plain old boring), because it says that all
1327groups that have names beginning with @samp{alt} and @samp{rec} should
1328be ignored, and all groups with names beginning with @samp{sci} should
1329be subscribed. Gnus will not use the normal subscription method for
1330subscribing these groups.
1331@code{gnus-subscribe-options-newsgroup-method} is used instead. This
1332variable defaults to @code{gnus-subscribe-alphabetically}.
1333
1334@vindex gnus-options-not-subscribe
1335@vindex gnus-options-subscribe
1336If you don't want to mess with your @file{.newsrc} file, you can just
1337set the two variables @code{gnus-options-subscribe} and
1338@code{gnus-options-not-subscribe}. These two variables do exactly the
1339same as the @file{.newsrc} @samp{options -n} trick. Both are regexps,
1340and if the new group matches the former, it will be unconditionally
1341subscribed, and if it matches the latter, it will be ignored.
1342
1343@vindex gnus-auto-subscribed-groups
1344Yet another variable that meddles here is
1345@code{gnus-auto-subscribed-groups}. It works exactly like
1346@code{gnus-options-subscribe}, and is therefore really superfluous,
1347but I thought it would be nice to have two of these. This variable is
1348more meant for setting some ground rules, while the other variable is
1349used more for user fiddling. By default this variable makes all new
1350groups that come from mail back ends (@code{nnml}, @code{nnbabyl},
1351@code{nnfolder}, @code{nnmbox}, @code{nnmh}, and @code{nnmaildir})
1352subscribed. If you don't like that, just set this variable to
1353@code{nil}.
1354
1355New groups that match this regexp are subscribed using
1356@code{gnus-subscribe-options-newsgroup-method}.
1357
1358
1359@node Changing Servers
1360@section Changing Servers
1361@cindex changing servers
1362
1363Sometimes it is necessary to move from one @acronym{NNTP} server to another.
1364This happens very rarely, but perhaps you change jobs, or one server is
1365very flaky and you want to use another.
1366
1367Changing the server is pretty easy, right? You just change
1368@code{gnus-select-method} to point to the new server?
1369
1370@emph{Wrong!}
1371
1372Article numbers are not (in any way) kept synchronized between different
1373@acronym{NNTP} servers, and the only way Gnus keeps track of what articles
1374you have read is by keeping track of article numbers. So when you
1375change @code{gnus-select-method}, your @file{.newsrc} file becomes
1376worthless.
1377
1378Gnus provides a few functions to attempt to translate a @file{.newsrc}
1379file from one server to another. They all have one thing in
1380common---they take a looong time to run. You don't want to use these
1381functions more than absolutely necessary.
1382
1383@kindex M-x gnus-change-server
1384@findex gnus-change-server
1385If you have access to both servers, Gnus can request the headers for all
1386the articles you have read and compare @code{Message-ID}s and map the
1387article numbers of the read articles and article marks. The @kbd{M-x
1388gnus-change-server} command will do this for all your native groups. It
1389will prompt for the method you want to move to.
1390
1391@kindex M-x gnus-group-move-group-to-server
1392@findex gnus-group-move-group-to-server
1393You can also move individual groups with the @kbd{M-x
1394gnus-group-move-group-to-server} command. This is useful if you want to
1395move a (foreign) group from one server to another.
1396
1397@kindex M-x gnus-group-clear-data-on-native-groups
1398@findex gnus-group-clear-data-on-native-groups
1399If you don't have access to both the old and new server, all your marks
1400and read ranges have become worthless. You can use the @kbd{M-x
1401gnus-group-clear-data-on-native-groups} command to clear out all data
1402that you have on your native groups. Use with caution.
1403
1404@kindex M-x gnus-group-clear-data
1405@findex gnus-group-clear-data
1406Clear the data from the current group only---nix out marks and the
1407list of read articles (@code{gnus-group-clear-data}).
1408
1409After changing servers, you @strong{must} move the cache hierarchy away,
1410since the cached articles will have wrong article numbers, which will
1411affect which articles Gnus thinks are read.
1412@code{gnus-group-clear-data-on-native-groups} will ask you if you want
1413to have it done automatically; for @code{gnus-group-clear-data}, you
1414can use @kbd{M-x gnus-cache-move-cache} (but beware, it will move the
1415cache for all groups).
1416
1417
1418@node Startup Files
1419@section Startup Files
1420@cindex startup files
1421@cindex .newsrc
1422@cindex .newsrc.el
1423@cindex .newsrc.eld
1424
1425Most common Unix news readers use a shared startup file called
1426@file{.newsrc}. This file contains all the information about what
1427groups are subscribed, and which articles in these groups have been
1428read.
1429
1430Things got a bit more complicated with @sc{gnus}. In addition to
1431keeping the @file{.newsrc} file updated, it also used a file called
1432@file{.newsrc.el} for storing all the information that didn't fit into
1433the @file{.newsrc} file. (Actually, it also duplicated everything in
1434the @file{.newsrc} file.) @sc{gnus} would read whichever one of these
1435files was the most recently saved, which enabled people to swap between
1436@sc{gnus} and other newsreaders.
1437
1438That was kinda silly, so Gnus went one better: In addition to the
1439@file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called
1440@file{.newsrc.eld}. It will read whichever of these files that are most
1441recent, but it will never write a @file{.newsrc.el} file. You should
1442never delete the @file{.newsrc.eld} file---it contains much information
1443not stored in the @file{.newsrc} file.
1444
1445@vindex gnus-save-newsrc-file
1446@vindex gnus-read-newsrc-file
1447You can turn off writing the @file{.newsrc} file by setting
1448@code{gnus-save-newsrc-file} to @code{nil}, which means you can delete
1449the file and save some space, as well as exiting from Gnus faster.
1450However, this will make it impossible to use other newsreaders than
1451Gnus. But hey, who would want to, right? Similarly, setting
1452@code{gnus-read-newsrc-file} to @code{nil} makes Gnus ignore the
1453@file{.newsrc} file and any @file{.newsrc-SERVER} files, which can be
1454convenient if you use a different news reader occasionally, and you
1455want to read a different subset of the available groups with that
1456news reader.
1457
1458@vindex gnus-save-killed-list
1459If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus
1460will not save the list of killed groups to the startup file. This will
1461save both time (when starting and quitting) and space (on disk). It
1462will also mean that Gnus has no record of what groups are new or old,
1463so the automatic new groups subscription methods become meaningless.
1464You should always set @code{gnus-check-new-newsgroups} to @code{nil} or
1465@code{ask-server} if you set this variable to @code{nil} (@pxref{New
1466Groups}). This variable can also be a regular expression. If that's
1467the case, remove all groups that do not match this regexp before
1468saving. This can be useful in certain obscure situations that involve
1469several servers where not all servers support @code{ask-server}.
1470
1471@vindex gnus-startup-file
1472@vindex gnus-backup-startup-file
1473@vindex version-control
1474The @code{gnus-startup-file} variable says where the startup files are.
1475The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup
1476file being whatever that one is, with a @samp{.eld} appended.
1477If you want version control for this file, set
1478@code{gnus-backup-startup-file}. It respects the same values as the
1479@code{version-control} variable.
1480
1481@vindex gnus-save-newsrc-hook
1482@vindex gnus-save-quick-newsrc-hook
1483@vindex gnus-save-standard-newsrc-hook
1484@code{gnus-save-newsrc-hook} is called before saving any of the newsrc
1485files, while @code{gnus-save-quick-newsrc-hook} is called just before
1486saving the @file{.newsrc.eld} file, and
1487@code{gnus-save-standard-newsrc-hook} is called just before saving the
1488@file{.newsrc} file. The latter two are commonly used to turn version
1489control on or off. Version control is on by default when saving the
1490startup files. If you want to turn backup creation off, say something like:
1491
1492@lisp
1493(defun turn-off-backup ()
1494 (set (make-local-variable 'backup-inhibited) t))
1495
1496(add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup)
1497(add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup)
1498@end lisp
1499
1500@vindex gnus-init-file
1501@vindex gnus-site-init-file
1502When Gnus starts, it will read the @code{gnus-site-init-file}
1503(@file{.../site-lisp/gnus-init} by default) and @code{gnus-init-file}
1504(@file{~/.gnus} by default) files. These are normal Emacs Lisp files
1505and can be used to avoid cluttering your @file{~/.emacs} and
1506@file{site-init} files with Gnus stuff. Gnus will also check for files
1507with the same names as these, but with @file{.elc} and @file{.el}
1508suffixes. In other words, if you have set @code{gnus-init-file} to
1509@file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el},
1510and finally @file{~/.gnus} (in this order). If Emacs was invoked with
1511the @option{-q} or @option{--no-init-file} options (@pxref{Initial
1512Options, ,Initial Options, emacs, The Emacs Manual}), Gnus doesn't read
1513@code{gnus-init-file}.
1514
1515
1516@node Auto Save
1517@section Auto Save
1518@cindex dribble file
1519@cindex auto-save
1520
1521Whenever you do something that changes the Gnus data (reading articles,
1522catching up, killing/subscribing groups), the change is added to a
1523special @dfn{dribble buffer}. This buffer is auto-saved the normal
1524Emacs way. If your Emacs should crash before you have saved the
1525@file{.newsrc} files, all changes you have made can be recovered from
1526this file.
1527
1528If Gnus detects this file at startup, it will ask the user whether to
1529read it. The auto save file is deleted whenever the real startup file is
1530saved.
1531
1532@vindex gnus-use-dribble-file
1533If @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create and
1534maintain a dribble buffer. The default is @code{t}.
1535
1536@vindex gnus-dribble-directory
1537Gnus will put the dribble file(s) in @code{gnus-dribble-directory}. If
1538this variable is @code{nil}, which it is by default, Gnus will dribble
1539into the directory where the @file{.newsrc} file is located. (This is
1540normally the user's home directory.) The dribble file will get the same
1541file permissions as the @file{.newsrc} file.
1542
1543@vindex gnus-always-read-dribble-file
1544If @code{gnus-always-read-dribble-file} is non-@code{nil}, Gnus will
1545read the dribble file on startup without querying the user.
1546
1547
1548@node The Active File
1549@section The Active File
1550@cindex active file
1551@cindex ignored groups
1552
1553When Gnus starts, or indeed whenever it tries to determine whether new
1554articles have arrived, it reads the active file. This is a very large
1555file that lists all the active groups and articles on the server.
1556
1557@vindex gnus-ignored-newsgroups
1558Before examining the active file, Gnus deletes all lines that match the
1559regexp @code{gnus-ignored-newsgroups}. This is done primarily to reject
1560any groups with bogus names, but you can use this variable to make Gnus
1561ignore hierarchies you aren't ever interested in. However, this is not
1562recommended. In fact, it's highly discouraged. Instead, @pxref{New
1563Groups} for an overview of other variables that can be used instead.
1564
1565@c This variable is
1566@c @code{nil} by default, and will slow down active file handling somewhat
1567@c if you set it to anything else.
1568
1569@vindex gnus-read-active-file
1570@c @head
1571The active file can be rather Huge, so if you have a slow network, you
1572can set @code{gnus-read-active-file} to @code{nil} to prevent Gnus from
1573reading the active file. This variable is @code{some} by default.
1574
1575Gnus will try to make do by getting information just on the groups that
1576you actually subscribe to.
1577
1578Note that if you subscribe to lots and lots of groups, setting this
1579variable to @code{nil} will probably make Gnus slower, not faster. At
1580present, having this variable @code{nil} will slow Gnus down
1581considerably, unless you read news over a 2400 baud modem.
1582
1583This variable can also have the value @code{some}. Gnus will then
1584attempt to read active info only on the subscribed groups. On some
1585servers this is quite fast (on sparkling, brand new INN servers that
1586support the @code{LIST ACTIVE group} command), on others this isn't fast
1587at all. In any case, @code{some} should be faster than @code{nil}, and
1588is certainly faster than @code{t} over slow lines.
1589
1590Some news servers (old versions of Leafnode and old versions of INN, for
1591instance) do not support the @code{LIST ACTIVE group}. For these
1592servers, @code{nil} is probably the most efficient value for this
1593variable.
1594
1595If this variable is @code{nil}, Gnus will ask for group info in total
1596lock-step, which isn't very fast. If it is @code{some} and you use an
1597@acronym{NNTP} server, Gnus will pump out commands as fast as it can, and
1598read all the replies in one swoop. This will normally result in better
1599performance, but if the server does not support the aforementioned
1600@code{LIST ACTIVE group} command, this isn't very nice to the server.
1601
1602If you think that starting up Gnus takes too long, try all the three
1603different values for this variable and see what works best for you.
1604
1605In any case, if you use @code{some} or @code{nil}, you should definitely
1606kill all groups that you aren't interested in to speed things up.
1607
1608Note that this variable also affects active file retrieval from
1609secondary select methods.
1610
1611
1612@node Startup Variables
1613@section Startup Variables
1614
1615@table @code
1616
1617@item gnus-load-hook
1618@vindex gnus-load-hook
1619A hook run while Gnus is being loaded. Note that this hook will
1620normally be run just once in each Emacs session, no matter how many
1621times you start Gnus.
1622
1623@item gnus-before-startup-hook
1624@vindex gnus-before-startup-hook
1625A hook run after starting up Gnus successfully.
1626
1627@item gnus-startup-hook
1628@vindex gnus-startup-hook
1629A hook run as the very last thing after starting up Gnus
1630
1631@item gnus-started-hook
1632@vindex gnus-started-hook
1633A hook that is run as the very last thing after starting up Gnus
1634successfully.
1635
1636@item gnus-setup-news-hook
1637@vindex gnus-setup-news-hook
1638A hook that is run after reading the @file{.newsrc} file(s), but before
1639generating the group buffer.
1640
1641@item gnus-check-bogus-newsgroups
1642@vindex gnus-check-bogus-newsgroups
1643If non-@code{nil}, Gnus will check for and delete all bogus groups at
1644startup. A @dfn{bogus group} is a group that you have in your
1645@file{.newsrc} file, but doesn't exist on the news server. Checking for
1646bogus groups can take quite a while, so to save time and resources it's
1647best to leave this option off, and do the checking for bogus groups once
1648in a while from the group buffer instead (@pxref{Group Maintenance}).
1649
1650@item gnus-inhibit-startup-message
1651@vindex gnus-inhibit-startup-message
1652If non-@code{nil}, the startup message won't be displayed. That way,
1653your boss might not notice as easily that you are reading news instead
1654of doing your job. Note that this variable is used before
1655@file{~/.gnus.el} is loaded, so it should be set in @file{.emacs} instead.
1656
1657@item gnus-no-groups-message
1658@vindex gnus-no-groups-message
1659Message displayed by Gnus when no groups are available.
1660
1661@item gnus-play-startup-jingle
1662@vindex gnus-play-startup-jingle
1663If non-@code{nil}, play the Gnus jingle at startup.
1664
1665@item gnus-startup-jingle
1666@vindex gnus-startup-jingle
1667Jingle to be played if the above variable is non-@code{nil}. The
1668default is @samp{Tuxedomoon.Jingle4.au}.
1669
1670@end table
1671
1672
1673@node Group Buffer
1674@chapter Group Buffer
1675@cindex group buffer
1676
1677@c Alex Schroeder suggests to rearrange this as follows:
1678@c
1679@c <kensanata> ok, just save it for reference. I'll go to bed in a minute.
1680@c 1. Selecting a Group, 2. (new) Finding a Group, 3. Group Levels,
1681@c 4. Subscription Commands, 5. Group Maneuvering, 6. Group Data,
1682@c 7. Group Score, 8. Group Buffer Format
1683@c <kensanata> Group Levels should have more information on levels 5 to 9. I
1684@c suggest to split the 4th paragraph ("Gnus considers groups...") as follows:
1685@c <kensanata> First, "Gnus considers groups... (default 9)."
1686@c <kensanata> New, a table summarizing what levels 1 to 9 mean.
1687@c <kensanata> Third, "Gnus treats subscribed ... reasons of efficiency"
1688@c <kensanata> Then expand the next paragraph or add some more to it.
1689@c This short one sentence explains levels 1 and 2, therefore I understand
1690@c that I should keep important news at 3 and boring news at 4.
1691@c Say so! Then go on to explain why I should bother with levels 6 to 9.
1692@c Maybe keep those that you don't want to read temporarily at 6,
1693@c those that you never want to read at 8, those that offend your
1694@c human rights at 9...
1695
1696
1697The @dfn{group buffer} lists all (or parts) of the available groups. It
1698is the first buffer shown when Gnus starts, and will never be killed as
1699long as Gnus is active.
1700
1701@iftex
1702@iflatex
1703\gnusfigure{The Group Buffer}{320}{
1704\put(75,50){\epsfig{figure=ps/group,height=9cm}}
1705\put(120,37){\makebox(0,0)[t]{Buffer name}}
1706\put(120,38){\vector(1,2){10}}
1707\put(40,60){\makebox(0,0)[r]{Mode line}}
1708\put(40,58){\vector(1,0){30}}
1709\put(200,28){\makebox(0,0)[t]{Native select method}}
1710\put(200,26){\vector(-1,2){15}}
1711}
1712@end iflatex
1713@end iftex
1714
1715@menu
1716* Group Buffer Format:: Information listed and how you can change it.
1717* Group Maneuvering:: Commands for moving in the group buffer.
1718* Selecting a Group:: Actually reading news.
1719* Subscription Commands:: Unsubscribing, killing, subscribing.
1720* Group Data:: Changing the info for a group.
1721* Group Levels:: Levels? What are those, then?
1722* Group Score:: A mechanism for finding out what groups you like.
1723* Marking Groups:: You can mark groups for later processing.
1724* Foreign Groups:: Creating and editing groups.
1725* Group Parameters:: Each group may have different parameters set.
1726* Listing Groups:: Gnus can list various subsets of the groups.
1727* Sorting Groups:: Re-arrange the group order.
1728* Group Maintenance:: Maintaining a tidy @file{.newsrc} file.
1729* Browse Foreign Server:: You can browse a server. See what it has to offer.
1730* Exiting Gnus:: Stop reading news and get some work done.
1731* Group Topics:: A folding group mode divided into topics.
01c52d31 1732* Non-ASCII Group Names:: Accessing groups of non-English names.
e6d2d263 1733* Searching:: Mail search engines.
4009494e
GM
1734* Misc Group Stuff:: Other stuff that you can to do.
1735@end menu
1736
1737
1738@node Group Buffer Format
1739@section Group Buffer Format
1740
1741@menu
1742* Group Line Specification:: Deciding how the group buffer is to look.
1743* Group Mode Line Specification:: The group buffer mode line.
1744* Group Highlighting:: Having nice colors in the group buffer.
1745@end menu
1746
1747You can customize the Group Mode tool bar, see @kbd{M-x
1748customize-apropos RET gnus-group-tool-bar}. This feature is only
1749available in Emacs.
1750
1751The tool bar icons are now (de)activated correctly depending on the
1752cursor position. Therefore, moving around in the Group Buffer is
1753slower. You can disable this via the variable
1754@code{gnus-group-update-tool-bar}. Its default value depends on your
1755Emacs version.
1756
1757@node Group Line Specification
1758@subsection Group Line Specification
1759@cindex group buffer format
1760
1761The default format of the group buffer is nice and dull, but you can
1762make it as exciting and ugly as you feel like.
1763
1764Here's a couple of example group lines:
1765
1766@example
1767 25: news.announce.newusers
1768 * 0: alt.fan.andrea-dworkin
1769@end example
1770
1771Quite simple, huh?
1772
1773You can see that there are 25 unread articles in
1774@samp{news.announce.newusers}. There are no unread articles, but some
1775ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little
1776asterisk at the beginning of the line?).
1777
1778@vindex gnus-group-line-format
1779You can change that format to whatever you want by fiddling with the
1780@code{gnus-group-line-format} variable. This variable works along the
1781lines of a @code{format} specification, which is pretty much the same as
1782a @code{printf} specifications, for those of you who use (feh!) C.
1783@xref{Formatting Variables}.
1784
1785@samp{%M%S%5y:%B%(%g%)\n} is the value that produced those lines above.
1786
1787There should always be a colon on the line; the cursor always moves to
1788the colon after performing an operation. @xref{Positioning
1789Point}. Nothing else is required---not even the group name. All
1790displayed text is just window dressing, and is never examined by Gnus.
1791Gnus stores all real information it needs using text properties.
1792
1793(Note that if you make a really strange, wonderful, spreadsheet-like
1794layout, everybody will believe you are hard at work with the accounting
1795instead of wasting time reading news.)
1796
1797Here's a list of all available format characters:
1798
1799@table @samp
1800
1801@item M
1802An asterisk if the group only has marked articles.
1803
1804@item S
1805Whether the group is subscribed.
1806
1807@item L
1808Level of subscribedness.
1809
1810@item N
1811Number of unread articles.
1812
1813@item I
1814Number of dormant articles.
1815
1816@item T
1817Number of ticked articles.
1818
1819@item R
1820Number of read articles.
1821
1822@item U
1823Number of unseen articles.
1824
1825@item t
1826Estimated total number of articles. (This is really @var{max-number}
1827minus @var{min-number} plus 1.)
1828
1829Gnus uses this estimation because the @acronym{NNTP} protocol provides
1830efficient access to @var{max-number} and @var{min-number} but getting
1831the true unread message count is not possible efficiently. For
1832hysterical raisins, even the mail back ends, where the true number of
1833unread messages might be available efficiently, use the same limited
1834interface. To remove this restriction from Gnus means that the back
01c52d31
MB
1835end interface has to be changed, which is not an easy job.
1836
1837The nnml backend (@pxref{Mail Spool}) has a feature called ``group
1838compaction'' which circumvents this deficiency: the idea is to
1839renumber all articles from 1, removing all gaps between numbers, hence
1840getting a correct total count. Other backends may support this in the
1841future. In order to keep your total article count relatively up to
1842date, you might want to compact your groups (or even directly your
1843server) from time to time. @xref{Misc Group Stuff}, @xref{Server Commands}.
4009494e
GM
1844
1845@item y
1846Number of unread, unticked, non-dormant articles.
1847
1848@item i
1849Number of ticked and dormant articles.
1850
1851@item g
1852Full group name.
1853
1854@item G
1855Group name.
1856
1857@item C
1858Group comment (@pxref{Group Parameters}) or group name if there is no
1859comment element in the group parameters.
1860
1861@item D
1862Newsgroup description. You need to read the group descriptions
1863before these will appear, and to do that, you either have to set
1864@code{gnus-read-active-file} or use the group buffer @kbd{M-d}
1865command.
1866
1867@item o
1868@samp{m} if moderated.
1869
1870@item O
1871@samp{(m)} if moderated.
1872
1873@item s
1874Select method.
1875
1876@item B
1877If the summary buffer for the group is open or not.
1878
1879@item n
1880Select from where.
1881
1882@item z
1883A string that looks like @samp{<%s:%n>} if a foreign select method is
1884used.
1885
1886@item P
1887Indentation based on the level of the topic (@pxref{Group Topics}).
1888
1889@item c
1890@vindex gnus-group-uncollapsed-levels
1891Short (collapsed) group name. The @code{gnus-group-uncollapsed-levels}
1892variable says how many levels to leave at the end of the group name.
1893The default is 1---this will mean that group names like
1894@samp{gnu.emacs.gnus} will be shortened to @samp{g.e.gnus}.
1895
1896@item m
1897@vindex gnus-new-mail-mark
1898@cindex %
1899@samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail to
1900the group lately.
1901
1902@item p
1903@samp{#} (@code{gnus-process-mark}) if the group is process marked.
1904
1905@item d
1906A string that says when you last read the group (@pxref{Group
1907Timestamp}).
1908
01c52d31
MB
1909@item F
1910The disk space used by the articles fetched by both the cache and
1911agent. The value is automatically scaled to bytes(B), kilobytes(K),
1912megabytes(M), or gigabytes(G) to minimize the column width. A format
1913of %7F is sufficient for a fixed-width column.
1914
4009494e
GM
1915@item u
1916User defined specifier. The next character in the format string should
1917be a letter. Gnus will call the function
1918@code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
1919following @samp{%u}. The function will be passed a single dummy
1920parameter as argument. The function should return a string, which will
1921be inserted into the buffer just like information from any other
1922specifier.
1923@end table
1924
1925@cindex *
1926All the ``number-of'' specs will be filled with an asterisk (@samp{*})
1927if no info is available---for instance, if it is a non-activated foreign
1928group, or a bogus native group.
1929
1930
1931@node Group Mode Line Specification
1932@subsection Group Mode Line Specification
1933@cindex group mode line
1934
1935@vindex gnus-group-mode-line-format
1936The mode line can be changed by setting
1937@code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}). It
1938doesn't understand that many format specifiers:
1939
1940@table @samp
1941@item S
1942The native news server.
1943@item M
1944The native select method.
1945@end table
1946
1947
1948@node Group Highlighting
1949@subsection Group Highlighting
1950@cindex highlighting
1951@cindex group highlighting
1952
1953@vindex gnus-group-highlight
1954Highlighting in the group buffer is controlled by the
1955@code{gnus-group-highlight} variable. This is an alist with elements
1956that look like @code{(@var{form} . @var{face})}. If @var{form} evaluates to
1957something non-@code{nil}, the @var{face} will be used on the line.
1958
1959Here's an example value for this variable that might look nice if the
1960background is dark:
1961
1962@lisp
1963(cond (window-system
1964 (setq custom-background-mode 'light)
1965 (defface my-group-face-1
1966 '((t (:foreground "Red" :bold t))) "First group face")
1967 (defface my-group-face-2
1968 '((t (:foreground "DarkSeaGreen4" :bold t)))
1969 "Second group face")
1970 (defface my-group-face-3
1971 '((t (:foreground "Green4" :bold t))) "Third group face")
1972 (defface my-group-face-4
1973 '((t (:foreground "SteelBlue" :bold t))) "Fourth group face")
1974 (defface my-group-face-5
1975 '((t (:foreground "Blue" :bold t))) "Fifth group face")))
1976
1977(setq gnus-group-highlight
1978 '(((> unread 200) . my-group-face-1)
1979 ((and (< level 3) (zerop unread)) . my-group-face-2)
1980 ((< level 3) . my-group-face-3)
1981 ((zerop unread) . my-group-face-4)
1982 (t . my-group-face-5)))
1983@end lisp
1984
1985Also @pxref{Faces and Fonts}.
1986
1987Variables that are dynamically bound when the forms are evaluated
1988include:
1989
1990@table @code
1991@item group
1992The group name.
1993@item unread
1994The number of unread articles in the group.
1995@item method
1996The select method.
1997@item mailp
1998Whether the group is a mail group.
1999@item level
2000The level of the group.
2001@item score
2002The score of the group.
2003@item ticked
2004The number of ticked articles in the group.
2005@item total
2006The total number of articles in the group. Or rather,
2007@var{max-number} minus @var{min-number} plus one.
2008@item topic
2009When using the topic minor mode, this variable is bound to the current
2010topic being inserted.
2011@end table
2012
2013When the forms are @code{eval}ed, point is at the beginning of the line
2014of the group in question, so you can use many of the normal Gnus
2015functions for snarfing info on the group.
2016
2017@vindex gnus-group-update-hook
2018@findex gnus-group-highlight-line
2019@code{gnus-group-update-hook} is called when a group line is changed.
2020It will not be called when @code{gnus-visual} is @code{nil}. This hook
2021calls @code{gnus-group-highlight-line} by default.
2022
2023
2024@node Group Maneuvering
2025@section Group Maneuvering
2026@cindex group movement
2027
2028All movement commands understand the numeric prefix and will behave as
2029expected, hopefully.
2030
2031@table @kbd
2032
2033@item n
2034@kindex n (Group)
2035@findex gnus-group-next-unread-group
2036Go to the next group that has unread articles
2037(@code{gnus-group-next-unread-group}).
2038
2039@item p
2040@itemx DEL
2041@kindex DEL (Group)
2042@kindex p (Group)
2043@findex gnus-group-prev-unread-group
2044Go to the previous group that has unread articles
2045(@code{gnus-group-prev-unread-group}).
2046
2047@item N
2048@kindex N (Group)
2049@findex gnus-group-next-group
2050Go to the next group (@code{gnus-group-next-group}).
2051
2052@item P
2053@kindex P (Group)
2054@findex gnus-group-prev-group
2055Go to the previous group (@code{gnus-group-prev-group}).
2056
2057@item M-n
2058@kindex M-n (Group)
2059@findex gnus-group-next-unread-group-same-level
2060Go to the next unread group on the same (or lower) level
2061(@code{gnus-group-next-unread-group-same-level}).
2062
2063@item M-p
2064@kindex M-p (Group)
2065@findex gnus-group-prev-unread-group-same-level
2066Go to the previous unread group on the same (or lower) level
2067(@code{gnus-group-prev-unread-group-same-level}).
2068@end table
2069
2070Three commands for jumping to groups:
2071
2072@table @kbd
2073
2074@item j
2075@kindex j (Group)
2076@findex gnus-group-jump-to-group
2077Jump to a group (and make it visible if it isn't already)
2078(@code{gnus-group-jump-to-group}). Killed groups can be jumped to, just
2079like living groups.
2080
2081@item ,
2082@kindex , (Group)
2083@findex gnus-group-best-unread-group
2084Jump to the unread group with the lowest level
2085(@code{gnus-group-best-unread-group}).
2086
2087@item .
2088@kindex . (Group)
2089@findex gnus-group-first-unread-group
2090Jump to the first group with unread articles
2091(@code{gnus-group-first-unread-group}).
2092@end table
2093
2094@vindex gnus-group-goto-unread
2095If @code{gnus-group-goto-unread} is @code{nil}, all the movement
2096commands will move to the next group, not the next unread group. Even
2097the commands that say they move to the next unread group. The default
2098is @code{t}.
2099
01c52d31
MB
2100@vindex gnus-summary-next-group-on-exit
2101If @code{gnus-summary-next-group-on-exit} is @code{t}, when a summary is
2102exited, the point in the group buffer is moved to the next unread group.
2103Otherwise, the point is set to the group just exited. The default is
2104@code{t}.
4009494e
GM
2105
2106@node Selecting a Group
2107@section Selecting a Group
2108@cindex group selection
2109
2110@table @kbd
2111
2112@item SPACE
2113@kindex SPACE (Group)
2114@findex gnus-group-read-group
2115Select the current group, switch to the summary buffer and display the
2116first unread article (@code{gnus-group-read-group}). If there are no
2117unread articles in the group, or if you give a non-numerical prefix to
2118this command, Gnus will offer to fetch all the old articles in this
2119group from the server. If you give a numerical prefix @var{n}, @var{n}
2120determines the number of articles Gnus will fetch. If @var{n} is
2121positive, Gnus fetches the @var{n} newest articles, if @var{n} is
2122negative, Gnus fetches the @code{abs(@var{n})} oldest articles.
2123
2124Thus, @kbd{SPC} enters the group normally, @kbd{C-u SPC} offers old
2125articles, @kbd{C-u 4 2 SPC} fetches the 42 newest articles, and @kbd{C-u
2126- 4 2 SPC} fetches the 42 oldest ones.
2127
2128When you are in the group (in the Summary buffer), you can type
2129@kbd{M-g} to fetch new articles, or @kbd{C-u M-g} to also show the old
2130ones.
2131
2132@item RET
2133@kindex RET (Group)
2134@findex gnus-group-select-group
2135Select the current group and switch to the summary buffer
2136(@code{gnus-group-select-group}). Takes the same arguments as
2137@code{gnus-group-read-group}---the only difference is that this command
2138does not display the first unread article automatically upon group
2139entry.
2140
2141@item M-RET
2142@kindex M-RET (Group)
2143@findex gnus-group-quick-select-group
2144This does the same as the command above, but tries to do it with the
2145minimum amount of fuzz (@code{gnus-group-quick-select-group}). No
2146scoring/killing will be performed, there will be no highlights and no
2147expunging. This might be useful if you're in a real hurry and have to
2148enter some humongous group. If you give a 0 prefix to this command
2149(i.e., @kbd{0 M-RET}), Gnus won't even generate the summary buffer,
2150which is useful if you want to toggle threading before generating the
2151summary buffer (@pxref{Summary Generation Commands}).
2152
2153@item M-SPACE
2154@kindex M-SPACE (Group)
2155@findex gnus-group-visible-select-group
2156This is yet one more command that does the same as the @kbd{RET}
2157command, but this one does it without expunging and hiding dormants
2158(@code{gnus-group-visible-select-group}).
2159
2160@item C-M-RET
2161@kindex C-M-RET (Group)
2162@findex gnus-group-select-group-ephemerally
2163Finally, this command selects the current group ephemerally without
2164doing any processing of its contents
2165(@code{gnus-group-select-group-ephemerally}). Even threading has been
2166turned off. Everything you do in the group after selecting it in this
2167manner will have no permanent effects.
2168
2169@end table
2170
2171@vindex gnus-large-newsgroup
2172The @code{gnus-large-newsgroup} variable says what Gnus should
2173consider to be a big group. If it is @code{nil}, no groups are
2174considered big. The default value is 200. If the group has more
2175(unread and/or ticked) articles than this, Gnus will query the user
2176before entering the group. The user can then specify how many
2177articles should be fetched from the server. If the user specifies a
2178negative number (@var{-n}), the @var{n} oldest articles will be
2179fetched. If it is positive, the @var{n} articles that have arrived
2180most recently will be fetched.
2181
2182@vindex gnus-large-ephemeral-newsgroup
2183@code{gnus-large-ephemeral-newsgroup} is the same as
2184@code{gnus-large-newsgroup}, but is only used for ephemeral
2185newsgroups.
2186
4b70e299 2187@vindex gnus-newsgroup-maximum-articles
4009494e
GM
2188In groups in some news servers, there might be a big gap between a few
2189very old articles that will never be expired and the recent ones. In
2190such a case, the server will return the data like @code{(1 . 30000000)}
2191for the @code{LIST ACTIVE group} command, for example. Even if there
2192are actually only the articles 1-10 and 29999900-30000000, Gnus doesn't
2193know it at first and prepares for getting 30000000 articles. However,
2194it will consume hundreds megabytes of memories and might make Emacs get
2195stuck as the case may be. If you use such news servers, set the
4b70e299
MB
2196variable @code{gnus-newsgroup-maximum-articles} to a positive number.
2197The value means that Gnus ignores articles other than this number of the
2198latest ones in every group. For instance, the value 10000 makes Gnus
2199get only the articles 29990001-30000000 (if the latest article number is
220030000000 in a group). Note that setting this variable to a number might
2201prevent you from reading very old articles. The default value of the
2202variable @code{gnus-newsgroup-maximum-articles} is @code{nil}, which
2203means Gnus never ignores old articles.
4009494e
GM
2204
2205@vindex gnus-select-group-hook
2206@vindex gnus-auto-select-first
2207@vindex gnus-auto-select-subject
2208If @code{gnus-auto-select-first} is non-@code{nil}, select an article
2209automatically when entering a group with the @kbd{SPACE} command.
2210Which article this is is controlled by the
2211@code{gnus-auto-select-subject} variable. Valid values for this
2212variable are:
2213
2214@table @code
2215
2216@item unread
2217Place point on the subject line of the first unread article.
2218
2219@item first
2220Place point on the subject line of the first article.
2221
2222@item unseen
2223Place point on the subject line of the first unseen article.
2224
2225@item unseen-or-unread
2226Place point on the subject line of the first unseen article, and if
2227there is no such article, place point on the subject line of the first
2228unread article.
2229
2230@item best
2231Place point on the subject line of the highest-scored unread article.
2232
2233@end table
2234
2235This variable can also be a function. In that case, that function
2236will be called to place point on a subject line.
2237
2238If you want to prevent automatic selection in some group (say, in a
2239binary group with Huge articles) you can set the
2240@code{gnus-auto-select-first} variable to @code{nil} in
2241@code{gnus-select-group-hook}, which is called when a group is
2242selected.
2243
2244
2245@node Subscription Commands
2246@section Subscription Commands
2247@cindex subscription
2248
2249@table @kbd
2250
2251@item S t
2252@itemx u
2253@kindex S t (Group)
2254@kindex u (Group)
2255@findex gnus-group-unsubscribe-current-group
2256@c @icon{gnus-group-unsubscribe}
2257Toggle subscription to the current group
2258(@code{gnus-group-unsubscribe-current-group}).
2259
2260@item S s
2261@itemx U
2262@kindex S s (Group)
2263@kindex U (Group)
2264@findex gnus-group-unsubscribe-group
2265Prompt for a group to subscribe, and then subscribe it. If it was
2266subscribed already, unsubscribe it instead
2267(@code{gnus-group-unsubscribe-group}).
2268
2269@item S k
2270@itemx C-k
2271@kindex S k (Group)
2272@kindex C-k (Group)
2273@findex gnus-group-kill-group
2274@c @icon{gnus-group-kill-group}
2275Kill the current group (@code{gnus-group-kill-group}).
2276
2277@item S y
2278@itemx C-y
2279@kindex S y (Group)
2280@kindex C-y (Group)
2281@findex gnus-group-yank-group
2282Yank the last killed group (@code{gnus-group-yank-group}).
2283
2284@item C-x C-t
2285@kindex C-x C-t (Group)
2286@findex gnus-group-transpose-groups
2287Transpose two groups (@code{gnus-group-transpose-groups}). This isn't
2288really a subscription command, but you can use it instead of a
2289kill-and-yank sequence sometimes.
2290
2291@item S w
2292@itemx C-w
2293@kindex S w (Group)
2294@kindex C-w (Group)
2295@findex gnus-group-kill-region
2296Kill all groups in the region (@code{gnus-group-kill-region}).
2297
2298@item S z
2299@kindex S z (Group)
2300@findex gnus-group-kill-all-zombies
2301Kill all zombie groups (@code{gnus-group-kill-all-zombies}).
2302
2303@item S C-k
2304@kindex S C-k (Group)
2305@findex gnus-group-kill-level
2306Kill all groups on a certain level (@code{gnus-group-kill-level}).
2307These groups can't be yanked back after killing, so this command should
2308be used with some caution. The only time where this command comes in
2309really handy is when you have a @file{.newsrc} with lots of unsubscribed
2310groups that you want to get rid off. @kbd{S C-k} on level 7 will
2311kill off all unsubscribed groups that do not have message numbers in the
2312@file{.newsrc} file.
2313
2314@end table
2315
2316Also @pxref{Group Levels}.
2317
2318
2319@node Group Data
2320@section Group Data
2321
2322@table @kbd
2323
2324@item c
2325@kindex c (Group)
2326@findex gnus-group-catchup-current
2327@vindex gnus-group-catchup-group-hook
2328@c @icon{gnus-group-catchup-current}
2329Mark all unticked articles in this group as read
2330(@code{gnus-group-catchup-current}).
2331@code{gnus-group-catchup-group-hook} is called when catching up a group from
2332the group buffer.
2333
2334@item C
2335@kindex C (Group)
2336@findex gnus-group-catchup-current-all
2337Mark all articles in this group, even the ticked ones, as read
2338(@code{gnus-group-catchup-current-all}).
2339
2340@item M-c
2341@kindex M-c (Group)
2342@findex gnus-group-clear-data
2343Clear the data from the current group---nix out marks and the list of
2344read articles (@code{gnus-group-clear-data}).
2345
2346@item M-x gnus-group-clear-data-on-native-groups
2347@kindex M-x gnus-group-clear-data-on-native-groups
2348@findex gnus-group-clear-data-on-native-groups
2349If you have switched from one @acronym{NNTP} server to another, all your marks
2350and read ranges have become worthless. You can use this command to
2351clear out all data that you have on your native groups. Use with
2352caution.
2353
2354@end table
2355
2356
2357@node Group Levels
2358@section Group Levels
2359@cindex group level
2360@cindex level
2361
2362All groups have a level of @dfn{subscribedness}. For instance, if a
2363group is on level 2, it is more subscribed than a group on level 5. You
2364can ask Gnus to just list groups on a given level or lower
2365(@pxref{Listing Groups}), or to just check for new articles in groups on
2366a given level or lower (@pxref{Scanning New Messages}).
2367
2368Remember: The higher the level of the group, the less important it is.
2369
2370@table @kbd
2371
2372@item S l
2373@kindex S l (Group)
2374@findex gnus-group-set-current-level
2375Set the level of the current group. If a numeric prefix is given, the
2376next @var{n} groups will have their levels set. The user will be
2377prompted for a level.
2378@end table
2379
2380@vindex gnus-level-killed
2381@vindex gnus-level-zombie
2382@vindex gnus-level-unsubscribed
2383@vindex gnus-level-subscribed
2384Gnus considers groups from levels 1 to
2385@code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed,
2386@code{gnus-level-subscribed} (exclusive) and
2387@code{gnus-level-unsubscribed} (inclusive) (default 7) to be
2388unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead)
2389(default 8) and @code{gnus-level-killed} to be killed (completely dead)
2390(default 9). Gnus treats subscribed and unsubscribed groups exactly the
2391same, but zombie and killed groups have no information on what articles
2392you have read, etc, stored. This distinction between dead and living
2393groups isn't done because it is nice or clever, it is done purely for
2394reasons of efficiency.
2395
2396It is recommended that you keep all your mail groups (if any) on quite
2397low levels (e.g. 1 or 2).
2398
2399Maybe the following description of the default behavior of Gnus helps to
2400understand what these levels are all about. By default, Gnus shows you
2401subscribed nonempty groups, but by hitting @kbd{L} you can have it show
2402empty subscribed groups and unsubscribed groups, too. Type @kbd{l} to
2403go back to showing nonempty subscribed groups again. Thus, unsubscribed
2404groups are hidden, in a way.
2405
2406Zombie and killed groups are similar to unsubscribed groups in that they
2407are hidden by default. But they are different from subscribed and
2408unsubscribed groups in that Gnus doesn't ask the news server for
2409information (number of messages, number of unread messages) on zombie
2410and killed groups. Normally, you use @kbd{C-k} to kill the groups you
2411aren't interested in. If most groups are killed, Gnus is faster.
2412
2413Why does Gnus distinguish between zombie and killed groups? Well, when
2414a new group arrives on the server, Gnus by default makes it a zombie
2415group. This means that you are normally not bothered with new groups,
2416but you can type @kbd{A z} to get a list of all new groups. Subscribe
2417the ones you like and kill the ones you don't want. (@kbd{A k} shows a
2418list of killed groups.)
2419
2420If you want to play with the level variables, you should show some care.
2421Set them once, and don't touch them ever again. Better yet, don't touch
2422them at all unless you know exactly what you're doing.
2423
2424@vindex gnus-level-default-unsubscribed
2425@vindex gnus-level-default-subscribed
2426Two closely related variables are @code{gnus-level-default-subscribed}
2427(default 3) and @code{gnus-level-default-unsubscribed} (default 6),
2428which are the levels that new groups will be put on if they are
2429(un)subscribed. These two variables should, of course, be inside the
2430relevant valid ranges.
2431
2432@vindex gnus-keep-same-level
2433If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands
2434will only move to groups of the same level (or lower). In
2435particular, going from the last article in one group to the next group
2436will go to the next group of the same level (or lower). This might be
2437handy if you want to read the most important groups before you read the
2438rest.
2439
2440If this variable is @code{best}, Gnus will make the next newsgroup the
2441one with the best level.
2442
2443@vindex gnus-group-default-list-level
2444All groups with a level less than or equal to
2445@code{gnus-group-default-list-level} will be listed in the group buffer
2446by default.
2447
2448@vindex gnus-group-list-inactive-groups
2449If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active
2450groups will be listed along with the unread groups. This variable is
2451@code{t} by default. If it is @code{nil}, inactive groups won't be
2452listed.
2453
2454@vindex gnus-group-use-permanent-levels
2455If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you
2456give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
2457use this level as the ``work'' level.
2458
2459@vindex gnus-activate-level
2460Gnus will normally just activate (i. e., query the server about) groups
2461on level @code{gnus-activate-level} or less. If you don't want to
2462activate unsubscribed groups, for instance, you might set this variable
2463to 5. The default is 6.
2464
2465
2466@node Group Score
2467@section Group Score
2468@cindex group score
2469@cindex group rank
2470@cindex rank
2471
2472You would normally keep important groups on high levels, but that scheme
2473is somewhat restrictive. Don't you wish you could have Gnus sort the
2474group buffer according to how often you read groups, perhaps? Within
2475reason?
2476
2477This is what @dfn{group score} is for. You can have Gnus assign a score
2478to each group through the mechanism described below. You can then sort
2479the group buffer based on this score. Alternatively, you can sort on
2480score and then level. (Taken together, the level and the score is
2481called the @dfn{rank} of the group. A group that is on level 4 and has
2482a score of 1 has a higher rank than a group on level 5 that has a score
2483of 300. (The level is the most significant part and the score is the
2484least significant part.))
2485
2486@findex gnus-summary-bubble-group
2487If you want groups you read often to get higher scores than groups you
2488read seldom you can add the @code{gnus-summary-bubble-group} function to
2489the @code{gnus-summary-exit-hook} hook. This will result (after
2490sorting) in a bubbling sort of action. If you want to see that in
2491action after each summary exit, you can add
2492@code{gnus-group-sort-groups-by-rank} or
2493@code{gnus-group-sort-groups-by-score} to the same hook, but that will
2494slow things down somewhat.
2495
2496
2497@node Marking Groups
2498@section Marking Groups
2499@cindex marking groups
2500
2501If you want to perform some command on several groups, and they appear
2502subsequently in the group buffer, you would normally just give a
2503numerical prefix to the command. Most group commands will then do your
2504bidding on those groups.
2505
2506However, if the groups are not in sequential order, you can still
2507perform a command on several groups. You simply mark the groups first
2508with the process mark and then execute the command.
2509
2510@table @kbd
2511
2512@item #
2513@kindex # (Group)
2514@itemx M m
2515@kindex M m (Group)
2516@findex gnus-group-mark-group
2517Set the mark on the current group (@code{gnus-group-mark-group}).
2518
2519@item M-#
2520@kindex M-# (Group)
2521@itemx M u
2522@kindex M u (Group)
2523@findex gnus-group-unmark-group
2524Remove the mark from the current group
2525(@code{gnus-group-unmark-group}).
2526
2527@item M U
2528@kindex M U (Group)
2529@findex gnus-group-unmark-all-groups
2530Remove the mark from all groups (@code{gnus-group-unmark-all-groups}).
2531
2532@item M w
2533@kindex M w (Group)
2534@findex gnus-group-mark-region
2535Mark all groups between point and mark (@code{gnus-group-mark-region}).
2536
2537@item M b
2538@kindex M b (Group)
2539@findex gnus-group-mark-buffer
2540Mark all groups in the buffer (@code{gnus-group-mark-buffer}).
2541
2542@item M r
2543@kindex M r (Group)
2544@findex gnus-group-mark-regexp
2545Mark all groups that match some regular expression
2546(@code{gnus-group-mark-regexp}).
2547@end table
2548
2549Also @pxref{Process/Prefix}.
2550
2551@findex gnus-group-universal-argument
2552If you want to execute some command on all groups that have been marked
2553with the process mark, you can use the @kbd{M-&}
2554(@code{gnus-group-universal-argument}) command. It will prompt you for
2555the command to be executed.
2556
2557
2558@node Foreign Groups
2559@section Foreign Groups
2560@cindex foreign groups
2561
2562Below are some group mode commands for making and editing general foreign
2563groups, as well as commands to ease the creation of a few
2564special-purpose groups. All these commands insert the newly created
2565groups under point---@code{gnus-subscribe-newsgroup-method} is not
2566consulted.
2567
2568Changes from the group editing commands are stored in
2569@file{~/.newsrc.eld} (@code{gnus-startup-file}). An alternative is the
2570variable @code{gnus-parameters}, @xref{Group Parameters}.
2571
2572@table @kbd
2573
2574@item G m
2575@kindex G m (Group)
2576@findex gnus-group-make-group
2577@cindex making groups
2578Make a new group (@code{gnus-group-make-group}). Gnus will prompt you
2579for a name, a method and possibly an @dfn{address}. For an easier way
2580to subscribe to @acronym{NNTP} groups (@pxref{Browse Foreign Server}).
2581
2582@item G M
2583@kindex G M (Group)
2584@findex gnus-group-read-ephemeral-group
2585Make an ephemeral group (@code{gnus-group-read-ephemeral-group}). Gnus
2586will prompt you for a name, a method and an @dfn{address}.
2587
2588@item G r
2589@kindex G r (Group)
2590@findex gnus-group-rename-group
2591@cindex renaming groups
2592Rename the current group to something else
2593(@code{gnus-group-rename-group}). This is valid only on some
2594groups---mail groups mostly. This command might very well be quite slow
2595on some back ends.
2596
2597@item G c
2598@kindex G c (Group)
2599@cindex customizing
2600@findex gnus-group-customize
2601Customize the group parameters (@code{gnus-group-customize}).
2602
2603@item G e
2604@kindex G e (Group)
2605@findex gnus-group-edit-group-method
2606@cindex renaming groups
2607Enter a buffer where you can edit the select method of the current
2608group (@code{gnus-group-edit-group-method}).
2609
2610@item G p
2611@kindex G p (Group)
2612@findex gnus-group-edit-group-parameters
2613Enter a buffer where you can edit the group parameters
2614(@code{gnus-group-edit-group-parameters}).
2615
2616@item G E
2617@kindex G E (Group)
2618@findex gnus-group-edit-group
2619Enter a buffer where you can edit the group info
2620(@code{gnus-group-edit-group}).
2621
2622@item G d
2623@kindex G d (Group)
2624@findex gnus-group-make-directory-group
2625@cindex nndir
2626Make a directory group (@pxref{Directory Groups}). You will be prompted
2627for a directory name (@code{gnus-group-make-directory-group}).
2628
2629@item G h
2630@kindex G h (Group)
2631@cindex help group
2632@findex gnus-group-make-help-group
2633Make the Gnus help group (@code{gnus-group-make-help-group}).
2634
2635@item G a
2636@kindex G a (Group)
2637@cindex (ding) archive
2638@cindex archive group
2639@findex gnus-group-make-archive-group
2640@vindex gnus-group-archive-directory
2641@vindex gnus-group-recent-archive-directory
2642Make a Gnus archive group (@code{gnus-group-make-archive-group}). By
2643default a group pointing to the most recent articles will be created
2644(@code{gnus-group-recent-archive-directory}), but given a prefix, a full
2645group will be created from @code{gnus-group-archive-directory}.
2646
2647@item G k
2648@kindex G k (Group)
2649@findex gnus-group-make-kiboze-group
2650@cindex nnkiboze
2651Make a kiboze group. You will be prompted for a name, for a regexp to
2652match groups to be ``included'' in the kiboze group, and a series of
2653strings to match on headers (@code{gnus-group-make-kiboze-group}).
2654@xref{Kibozed Groups}.
2655
2656@item G D
2657@kindex G D (Group)
2658@findex gnus-group-enter-directory
2659@cindex nneething
2660Read an arbitrary directory as if it were a newsgroup with the
2661@code{nneething} back end (@code{gnus-group-enter-directory}).
2662@xref{Anything Groups}.
2663
2664@item G f
2665@kindex G f (Group)
2666@findex gnus-group-make-doc-group
2667@cindex ClariNet Briefs
2668@cindex nndoc
2669Make a group based on some file or other
2670(@code{gnus-group-make-doc-group}). If you give a prefix to this
2671command, you will be prompted for a file name and a file type.
2672Currently supported types are @code{mbox}, @code{babyl},
2673@code{digest}, @code{news}, @code{rnews}, @code{mmdf}, @code{forward},
2674@code{rfc934}, @code{rfc822-forward}, @code{mime-parts},
2675@code{standard-digest}, @code{slack-digest}, @code{clari-briefs},
2676@code{nsmail}, @code{outlook}, @code{oe-dbx}, and @code{mailman}. If
2677you run this command without a prefix, Gnus will guess at the file
2678type. @xref{Document Groups}.
2679
2680@item G u
2681@kindex G u (Group)
2682@vindex gnus-useful-groups
2683@findex gnus-group-make-useful-group
2684Create one of the groups mentioned in @code{gnus-useful-groups}
2685(@code{gnus-group-make-useful-group}).
2686
2687@item G w
2688@kindex G w (Group)
2689@findex gnus-group-make-web-group
2690@cindex Google
2691@cindex nnweb
2692@cindex gmane
2693Make an ephemeral group based on a web search
2694(@code{gnus-group-make-web-group}). If you give a prefix to this
2695command, make a solid group instead. You will be prompted for the
2696search engine type and the search string. Valid search engine types
2697include @code{google}, @code{dejanews}, and @code{gmane}.
2698@xref{Web Searches}.
2699
2700If you use the @code{google} search engine, you can limit the search
2701to a particular group by using a match string like
2702@samp{shaving group:alt.sysadmin.recovery}.
2703
2704@item G R
2705@kindex G R (Group)
2706@findex gnus-group-make-rss-group
2707Make a group based on an @acronym{RSS} feed
2708(@code{gnus-group-make-rss-group}). You will be prompted for an URL.
2709@xref{RSS}.
2710
2711@item G DEL
2712@kindex G DEL (Group)
2713@findex gnus-group-delete-group
2714This function will delete the current group
2715(@code{gnus-group-delete-group}). If given a prefix, this function will
2716actually delete all the articles in the group, and forcibly remove the
2717group itself from the face of the Earth. Use a prefix only if you are
2718absolutely sure of what you are doing. This command can't be used on
2719read-only groups (like @code{nntp} groups), though.
2720
2721@item G V
2722@kindex G V (Group)
2723@findex gnus-group-make-empty-virtual
2724Make a new, fresh, empty @code{nnvirtual} group
2725(@code{gnus-group-make-empty-virtual}). @xref{Virtual Groups}.
2726
2727@item G v
2728@kindex G v (Group)
2729@findex gnus-group-add-to-virtual
2730Add the current group to an @code{nnvirtual} group
2731(@code{gnus-group-add-to-virtual}). Uses the process/prefix convention.
2732@end table
2733
2734@xref{Select Methods}, for more information on the various select
2735methods.
2736
2737@vindex gnus-activate-foreign-newsgroups
2738If @code{gnus-activate-foreign-newsgroups} is a positive number,
2739Gnus will check all foreign groups with this level or lower at startup.
2740This might take quite a while, especially if you subscribe to lots of
2741groups from different @acronym{NNTP} servers. Also @pxref{Group Levels};
2742@code{gnus-activate-level} also affects activation of foreign
2743newsgroups.
2744
2745
9b3ebcb6
MB
2746The following commands create ephemeral groups. They can be called not
2747only from the Group buffer, but in any Gnus buffer.
2748
2749@table @code
2750@item gnus-read-ephemeral-gmane-group
2751@findex gnus-read-ephemeral-gmane-group
2752@vindex gnus-gmane-group-download-format
2753Read an ephemeral group on Gmane.org. The articles are downloaded via
2754HTTP using the URL specified by @code{gnus-gmane-group-download-format}.
2755Gnus will prompt you for a group name, the start article number and an
2756the article range.
2757
2758@item gnus-read-ephemeral-gmane-group-url
2759@findex gnus-read-ephemeral-gmane-group-url
2760This command is similar to @code{gnus-read-ephemeral-gmane-group}, but
2761the group name and the article number and range are constructed from a
2762given @acronym{URL}. Supported @acronym{URL} formats include e.g.
2763@url{http://thread.gmane.org/gmane.foo.bar/12300/focus=12399},
2764@url{http://thread.gmane.org/gmane.foo.bar/12345/},
2765@url{http://article.gmane.org/gmane.foo.bar/12345/},
2766@url{http://permalink.gmane.org/gmane.foo.bar/12345/}, and
2767@url{http://news.gmane.org/group/gmane.foo.bar/thread=12345}.
2768
2769@item gnus-read-ephemeral-emacs-bug-group
2770@findex gnus-read-ephemeral-emacs-bug-group
2771Read an Emacs bug report in an ephemeral group. Gnus will prompt for a
2772bug number. The default is the number at point. The @acronym{URL} is
2773specified in @code{gnus-bug-group-download-format-alist}.
2774
2775@item gnus-read-ephemeral-debian-bug-group
2776@findex gnus-read-ephemeral-debian-bug-group
2777Read a Debian bug report in an ephemeral group. Analog to
2778@code{gnus-read-ephemeral-emacs-bug-group}.
2779@end table
2780
2781Some of these command are also useful for article buttons, @xref{Article
2782Buttons}.
2783
2784Here is an example:
2785@lisp
2786(require 'gnus-art)
2787(add-to-list
2788 'gnus-button-alist
2789 '("#\\([0-9]+\\)\\>" 1
2790 (string-match "\\<emacs\\>" (or gnus-newsgroup-name ""))
2791 gnus-read-ephemeral-emacs-bug-group 1))
2792@end lisp
2793
2794
4009494e
GM
2795@node Group Parameters
2796@section Group Parameters
2797@cindex group parameters
2798
2799The group parameters store information local to a particular group.
87035689
MB
2800
2801Use the @kbd{G p} or the @kbd{G c} command to edit group parameters of a
2802group. (@kbd{G p} presents you with a Lisp-based interface, @kbd{G c}
2803presents you with a Customize-like interface. The latter helps avoid
2804silly Lisp errors.) You might also be interested in reading about topic
2805parameters (@pxref{Topic Parameters}).
2806Additionally, you can set group parameters via the
2807@code{gnus-parameters} variable, see below.
2808
4009494e
GM
2809Here's an example group parameter list:
2810
2811@example
2812((to-address . "ding@@gnus.org")
2813 (auto-expire . t))
2814@end example
2815
2816We see that each element consists of a ``dotted pair''---the thing before
2817the dot is the key, while the thing after the dot is the value. All the
2818parameters have this form @emph{except} local variable specs, which are
2819not dotted pairs, but proper lists.
2820
2821Some parameters have correspondent customizable variables, each of which
2822is an alist of regexps and values.
2823
2824The following group parameters can be used:
2825
2826@table @code
2827@item to-address
2828@cindex to-address
2829Address used by when doing followups and new posts.
2830
2831@example
2832(to-address . "some@@where.com")
2833@end example
2834
2835This is primarily useful in mail groups that represent closed mailing
2836lists---mailing lists where it's expected that everybody that writes to
2837the mailing list is subscribed to it. Since using this parameter
2838ensures that the mail only goes to the mailing list itself, it means
2839that members won't receive two copies of your followups.
2840
2841Using @code{to-address} will actually work whether the group is foreign
2842or not. Let's say there's a group on the server that is called
2843@samp{fa.4ad-l}. This is a real newsgroup, but the server has gotten
2844the articles from a mail-to-news gateway. Posting directly to this
2845group is therefore impossible---you have to send mail to the mailing
2846list address instead.
2847
2848See also @code{gnus-parameter-to-address-alist}.
2849
2850@item to-list
2851@cindex to-list
2852Address used when doing @kbd{a} in that group.
2853
2854@example
2855(to-list . "some@@where.com")
2856@end example
2857
2858It is totally ignored
2859when doing a followup---except that if it is present in a news group,
2860you'll get mail group semantics when doing @kbd{f}.
2861
2862If you do an @kbd{a} command in a mail group and you have neither a
2863@code{to-list} group parameter nor a @code{to-address} group parameter,
2864then a @code{to-list} group parameter will be added automatically upon
2865sending the message if @code{gnus-add-to-list} is set to @code{t}.
2866@vindex gnus-add-to-list
2867
2868@findex gnus-mailing-list-mode
2869@cindex mail list groups
2870If this variable is set, @code{gnus-mailing-list-mode} is turned on when
2871entering summary buffer.
2872
2873See also @code{gnus-parameter-to-list-alist}.
2874
2875@anchor{subscribed}
2876@item subscribed
2877@cindex subscribed
2878@cindex Mail-Followup-To
2879@findex gnus-find-subscribed-addresses
2880If this parameter is set to @code{t}, Gnus will consider the
2881to-address and to-list parameters for this group as addresses of
2882mailing lists you are subscribed to. Giving Gnus this information is
2883(only) a first step in getting it to generate correct Mail-Followup-To
2884headers for your posts to these lists. The second step is to put the
2885following in your @file{.gnus.el}
2886
2887@lisp
2888(setq message-subscribed-address-functions
2889 '(gnus-find-subscribed-addresses))
2890@end lisp
2891
2892@xref{Mailing Lists, ,Mailing Lists, message, The Message Manual}, for
2893a complete treatment of available MFT support.
2894
2895@item visible
2896@cindex visible
2897If the group parameter list has the element @code{(visible . t)},
2898that group will always be visible in the Group buffer, regardless
2899of whether it has any unread articles.
2900
2901This parameter cannot be set via @code{gnus-parameters}. See
2902@code{gnus-permanently-visible-groups} as an alternative.
2903
2904@item broken-reply-to
2905@cindex broken-reply-to
2906Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
2907headers in this group are to be ignored, and for the header to be hidden
2908if @code{reply-to} is part of @code{gnus-boring-article-headers}. This
2909can be useful if you're reading a mailing list group where the listserv
2910has inserted @code{Reply-To} headers that point back to the listserv
2911itself. That is broken behavior. So there!
2912
2913@item to-group
2914@cindex to-group
2915Elements like @code{(to-group . "some.group.name")} means that all
2916posts in that group will be sent to @code{some.group.name}.
2917
2918@item newsgroup
2919@cindex newsgroup
2920If you have @code{(newsgroup . t)} in the group parameter list, Gnus
2921will treat all responses as if they were responses to news articles.
2922This can be useful if you have a mail group that's really a mirror of a
2923news group.
2924
2925@item gcc-self
2926@cindex gcc-self
2927If @code{(gcc-self . t)} is present in the group parameter list, newly
2928composed messages will be @code{Gcc}'d to the current group. If
2929@code{(gcc-self . none)} is present, no @code{Gcc:} header will be
2930generated, if @code{(gcc-self . "string")} is present, this string will
2931be inserted literally as a @code{gcc} header. This parameter takes
2932precedence over any default @code{Gcc} rules as described later
2933(@pxref{Archived Messages}).
2934
2935@strong{Caveat}: Adding @code{(gcc-self . t)} to the parameter list of
2936@code{nntp} groups (or the like) isn't valid. An @code{nntp} server
2937doesn't accept articles.
2938
2939@item auto-expire
2940@cindex auto-expire
2941@cindex expiring mail
2942If the group parameter has an element that looks like @code{(auto-expire
2943. t)}, all articles read will be marked as expirable. For an
2944alternative approach, @pxref{Expiring Mail}.
2945
2946See also @code{gnus-auto-expirable-newsgroups}.
2947
2948@item total-expire
2949@cindex total-expire
2950@cindex expiring mail
2951If the group parameter has an element that looks like
2952@code{(total-expire . t)}, all read articles will be put through the
2953expiry process, even if they are not marked as expirable. Use with
2954caution. Unread, ticked and dormant articles are not eligible for
2955expiry.
2956
2957See also @code{gnus-total-expirable-newsgroups}.
2958
2959@item expiry-wait
2960@cindex expiry-wait
2961@vindex nnmail-expiry-wait-function
2962If the group parameter has an element that looks like
2963@code{(expiry-wait . 10)}, this value will override any
2964@code{nnmail-expiry-wait} and @code{nnmail-expiry-wait-function}
2965(@pxref{Expiring Mail}) when expiring expirable messages. The value
2966can either be a number of days (not necessarily an integer) or the
2967symbols @code{never} or @code{immediate}.
2968
2969@item expiry-target
2970@cindex expiry-target
2971Where expired messages end up. This parameter overrides
2972@code{nnmail-expiry-target}.
2973
2974@item score-file
2975@cindex score file group parameter
2976Elements that look like @code{(score-file . "file")} will make
2977@file{file} into the current score file for the group in question. All
2978interactive score entries will be put into this file.
2979
2980@item adapt-file
2981@cindex adapt file group parameter
2982Elements that look like @code{(adapt-file . "file")} will make
2983@file{file} into the current adaptive file for the group in question.
2984All adaptive score entries will be put into this file.
2985
2986@item admin-address
2987@cindex admin-address
2988When unsubscribing from a mailing list you should never send the
2989unsubscription notice to the mailing list itself. Instead, you'd send
2990messages to the administrative address. This parameter allows you to
2991put the admin address somewhere convenient.
2992
2993@item display
2994@cindex display
2995Elements that look like @code{(display . MODE)} say which articles to
2996display on entering the group. Valid values are:
2997
2998@table @code
2999@item all
3000Display all articles, both read and unread.
3001
3002@item an integer
3003Display the last @var{integer} articles in the group. This is the same as
3004entering the group with @kbd{C-u @var{integer}}.
3005
3006@item default
3007Display the default visible articles, which normally includes unread and
3008ticked articles.
3009
3010@item an array
3011Display articles that satisfy a predicate.
3012
3013Here are some examples:
3014
3015@table @code
3016@item [unread]
3017Display only unread articles.
3018
3019@item [not expire]
3020Display everything except expirable articles.
3021
3022@item [and (not reply) (not expire)]
3023Display everything except expirable and articles you've already
3024responded to.
3025@end table
3026
3027The available operators are @code{not}, @code{and} and @code{or}.
3028Predicates include @code{tick}, @code{unsend}, @code{undownload},
3029@code{unread}, @code{dormant}, @code{expire}, @code{reply},
3030@code{killed}, @code{bookmark}, @code{score}, @code{save},
3031@code{cache}, @code{forward}, @code{unseen} and @code{recent}.
3032
3033@end table
3034
3035The @code{display} parameter works by limiting the summary buffer to
3036the subset specified. You can pop the limit by using the @kbd{/ w}
3037command (@pxref{Limiting}).
3038
3039@item comment
3040@cindex comment
3041Elements that look like @code{(comment . "This is a comment")} are
3042arbitrary comments on the group. You can display comments in the
3043group line (@pxref{Group Line Specification}).
3044
3045@item charset
3046@cindex charset
3047Elements that look like @code{(charset . iso-8859-1)} will make
3048@code{iso-8859-1} the default charset; that is, the charset that will be
3049used for all articles that do not specify a charset.
3050
3051See also @code{gnus-group-charset-alist}.
3052
3053@item ignored-charsets
3054@cindex ignored-charset
3055Elements that look like @code{(ignored-charsets x-unknown iso-8859-1)}
3056will make @code{iso-8859-1} and @code{x-unknown} ignored; that is, the
3057default charset will be used for decoding articles.
3058
3059See also @code{gnus-group-ignored-charsets-alist}.
3060
3061@item posting-style
3062@cindex posting-style
3063You can store additional posting style information for this group
3064here (@pxref{Posting Styles}). The format is that of an entry in the
3065@code{gnus-posting-styles} alist, except that there's no regexp matching
3066the group name (of course). Style elements in this group parameter will
3067take precedence over the ones found in @code{gnus-posting-styles}.
3068
3069For instance, if you want a funky name and signature in this group only,
3070instead of hacking @code{gnus-posting-styles}, you could put something
3071like this in the group parameters:
3072
3073@example
3074(posting-style
3075 (name "Funky Name")
3076 ("X-My-Header" "Funky Value")
3077 (signature "Funky Signature"))
3078@end example
3079
01c52d31
MB
3080If you're using topics to organize your group buffer
3081(@pxref{Group Topics}), note that posting styles can also be set in
3082the topics parameters. Posting styles in topic parameters apply to all
3083groups in this topic. More precisely, the posting-style settings for a
3084group result from the hierarchical merging of all posting-style
3085entries in the parameters of this group and all the topics it belongs
3086to.
3087
3088
4009494e
GM
3089@item post-method
3090@cindex post-method
3091If it is set, the value is used as the method for posting message
3092instead of @code{gnus-post-method}.
3093
a1da1e37
MB
3094@item mail-source
3095@cindex mail-source
3096If it is set, and the setting of @code{mail-sources} includes a
3097@code{group} mail source (@pxref{Mail Sources}), the value is a
3098mail source for this group.
3099
4009494e
GM
3100@item banner
3101@cindex banner
3102An item like @code{(banner . @var{regexp})} causes any part of an article
3103that matches the regular expression @var{regexp} to be stripped. Instead of
3104@var{regexp}, you can also use the symbol @code{signature} which strips the
3105last signature or any of the elements of the alist
3106@code{gnus-article-banner-alist}.
3107
3108@item sieve
3109@cindex sieve
3110This parameter contains a Sieve test that should match incoming mail
3111that should be placed in this group. From this group parameter, a
3112Sieve @samp{IF} control structure is generated, having the test as the
3113condition and @samp{fileinto "group.name";} as the body.
3114
3115For example, if the @samp{INBOX.list.sieve} group has the @code{(sieve
3116address "sender" "sieve-admin@@extundo.com")} group parameter, when
3117translating the group parameter into a Sieve script (@pxref{Sieve
3118Commands}) the following Sieve code is generated:
3119
3120@example
01c52d31
MB
3121if address "sender" "sieve-admin@@extundo.com" @{
3122 fileinto "INBOX.list.sieve";
3123@}
3124@end example
3125
3126To generate tests for multiple email-addresses use a group parameter
3127like @code{(sieve address "sender" ("name@@one.org" else@@two.org"))}.
3128When generating a sieve script (@pxref{Sieve Commands}) Sieve code
3129like the following is generated:
3130
3131@example
3132if address "sender" ["name@@one.org", "else@@two.org"] @{
3133 fileinto "INBOX.list.sieve";
4009494e
GM
3134@}
3135@end example
3136
01c52d31
MB
3137See @pxref{Sieve Commands} for commands and variables that might be of
3138interest in relation to the sieve parameter.
3139
4009494e
GM
3140The Sieve language is described in RFC 3028. @xref{Top, Emacs Sieve,
3141Top, sieve, Emacs Sieve}.
3142
3143@item (agent parameters)
3144If the agent has been enabled, you can set any of the its parameters
3145to control the behavior of the agent in individual groups. See Agent
3146Parameters in @ref{Category Syntax}. Most users will choose to set
3147agent parameters in either an agent category or group topic to
3148minimize the configuration effort.
3149
3150@item (@var{variable} @var{form})
3151You can use the group parameters to set variables local to the group you
3152are entering. If you want to turn threading off in @samp{news.answers},
3153you could put @code{(gnus-show-threads nil)} in the group parameters of
3154that group. @code{gnus-show-threads} will be made into a local variable
3155in the summary buffer you enter, and the form @code{nil} will be
3156@code{eval}ed there.
3157
3158Note that this feature sets the variable locally to the summary buffer.
3159But some variables are evaluated in the article buffer, or in the
3160message buffer (of a reply or followup or otherwise newly created
3161message). As a workaround, it might help to add the variable in
3162question to @code{gnus-newsgroup-variables}. @xref{Various Summary
3163Stuff}. So if you want to set @code{message-from-style} via the group
3164parameters, then you may need the following statement elsewhere in your
e6d2d263 3165@file{~/.gnus.el} file:
4009494e
GM
3166
3167@lisp
3168(add-to-list 'gnus-newsgroup-variables 'message-from-style)
3169@end lisp
3170
3171@vindex gnus-list-identifiers
3172A use for this feature is to remove a mailing list identifier tag in
3173the subject fields of articles. E.g. if the news group
3174
3175@example
3176nntp+news.gnus.org:gmane.text.docbook.apps
3177@end example
3178
3179has the tag @samp{DOC-BOOK-APPS:} in the subject of all articles, this
3180tag can be removed from the article subjects in the summary buffer for
3181the group by putting @code{(gnus-list-identifiers "DOCBOOK-APPS:")}
3182into the group parameters for the group.
3183
3184This can also be used as a group-specific hook function. If you want to
3185hear a beep when you enter a group, you could put something like
3186@code{(dummy-variable (ding))} in the parameters of that group.
3187@code{dummy-variable} will be set to the (meaningless) result of the
3188@code{(ding)} form.
3189
3190Alternatively, since the VARIABLE becomes local to the group, this
3191pattern can be used to temporarily change a hook. For example, if the
3192following is added to a group parameter
3193
3194@lisp
3195(gnus-summary-prepared-hook
3196 '(lambda nil (local-set-key "d" (local-key-binding "n"))))
3197@end lisp
3198
3199when the group is entered, the 'd' key will not mark the article as
3200expired.
3201
3202@end table
3203
4009494e
GM
3204@vindex gnus-parameters
3205Group parameters can be set via the @code{gnus-parameters} variable too.
3206But some variables, such as @code{visible}, have no effect (For this
3207case see @code{gnus-permanently-visible-groups} as an alternative.).
3208For example:
3209
3210@lisp
3211(setq gnus-parameters
3212 '(("mail\\..*"
3213 (gnus-show-threads nil)
3214 (gnus-use-scoring nil)
3215 (gnus-summary-line-format
3216 "%U%R%z%I%(%[%d:%ub%-23,23f%]%) %s\n")
3217 (gcc-self . t)
3218 (display . all))
3219
3220 ("^nnimap:\\(foo.bar\\)$"
3221 (to-group . "\\1"))
3222
3223 ("mail\\.me"
3224 (gnus-use-scoring t))
3225
3226 ("list\\..*"
3227 (total-expire . t)
3228 (broken-reply-to . t))))
3229@end lisp
3230
3231String value of parameters will be subjected to regexp substitution, as
3232the @code{to-group} example shows.
3233
3234@vindex gnus-parameters-case-fold-search
3235By default, whether comparing the group name and one of those regexps
3236specified in @code{gnus-parameters} is done in a case-sensitive manner
3237or a case-insensitive manner depends on the value of
3238@code{case-fold-search} at the time when the comparison is done. The
3239value of @code{case-fold-search} is typically @code{t}; it means, for
3240example, the element @code{("INBOX\\.FOO" (total-expire . t))} might be
3241applied to both the @samp{INBOX.FOO} group and the @samp{INBOX.foo}
3242group. If you want to make those regexps always case-sensitive, set the
3243value of the @code{gnus-parameters-case-fold-search} variable to
3244@code{nil}. Otherwise, set it to @code{t} if you want to compare them
3245always in a case-insensitive manner.
3246
01c52d31
MB
3247You can define different sorting to different groups via
3248@code{gnus-parameters}. Here is an example to sort an @acronym{NNTP}
3249group by reverse date to see the latest news at the top and an
3250@acronym{RSS} group by subject. In this example, the first group is the
3251Debian daily news group @code{gmane.linux.debian.user.news} from
3252news.gmane.org. The @acronym{RSS} group corresponds to the Debian
3253weekly news RSS feed
3254@url{http://packages.debian.org/unstable/newpkg_main.en.rdf},
3255@xref{RSS}.
3256
3257@lisp
3258(setq
3259 gnus-parameters
3260 '(("nntp.*gmane\\.debian\\.user\\.news"
3261 (gnus-show-threads nil)
3262 (gnus-article-sort-functions '((not gnus-article-sort-by-date)))
3263 (gnus-use-adaptive-scoring nil)
3264 (gnus-use-scoring nil))
3265 ("nnrss.*debian"
3266 (gnus-show-threads nil)
3267 (gnus-article-sort-functions 'gnus-article-sort-by-subject)
3268 (gnus-use-adaptive-scoring nil)
3269 (gnus-use-scoring t)
3270 (gnus-score-find-score-files-function 'gnus-score-find-single)
3271 (gnus-summary-line-format "%U%R%z%d %I%(%[ %s %]%)\n"))))
3272@end lisp
3273
4009494e
GM
3274
3275@node Listing Groups
3276@section Listing Groups
3277@cindex group listing
3278
3279These commands all list various slices of the groups available.
3280
3281@table @kbd
3282
3283@item l
3284@itemx A s
3285@kindex A s (Group)
3286@kindex l (Group)
3287@findex gnus-group-list-groups
3288List all groups that have unread articles
3289(@code{gnus-group-list-groups}). If the numeric prefix is used, this
3290command will list only groups of level ARG and lower. By default, it
3291only lists groups of level five (i.e.,
3292@code{gnus-group-default-list-level}) or lower (i.e., just subscribed
3293groups).
3294
3295@item L
3296@itemx A u
3297@kindex A u (Group)
3298@kindex L (Group)
3299@findex gnus-group-list-all-groups
3300List all groups, whether they have unread articles or not
3301(@code{gnus-group-list-all-groups}). If the numeric prefix is used,
3302this command will list only groups of level ARG and lower. By default,
3303it lists groups of level seven or lower (i.e., just subscribed and
3304unsubscribed groups).
3305
3306@item A l
3307@kindex A l (Group)
3308@findex gnus-group-list-level
3309List all unread groups on a specific level
3310(@code{gnus-group-list-level}). If given a prefix, also list the groups
3311with no unread articles.
3312
3313@item A k
3314@kindex A k (Group)
3315@findex gnus-group-list-killed
3316List all killed groups (@code{gnus-group-list-killed}). If given a
3317prefix argument, really list all groups that are available, but aren't
3318currently (un)subscribed. This could entail reading the active file
3319from the server.
3320
3321@item A z
3322@kindex A z (Group)
3323@findex gnus-group-list-zombies
3324List all zombie groups (@code{gnus-group-list-zombies}).
3325
3326@item A m
3327@kindex A m (Group)
3328@findex gnus-group-list-matching
3329List all unread, subscribed groups with names that match a regexp
3330(@code{gnus-group-list-matching}).
3331
3332@item A M
3333@kindex A M (Group)
3334@findex gnus-group-list-all-matching
3335List groups that match a regexp (@code{gnus-group-list-all-matching}).
3336
3337@item A A
3338@kindex A A (Group)
3339@findex gnus-group-list-active
3340List absolutely all groups in the active file(s) of the
3341server(s) you are connected to (@code{gnus-group-list-active}). This
3342might very well take quite a while. It might actually be a better idea
3343to do a @kbd{A M} to list all matching, and just give @samp{.} as the
3344thing to match on. Also note that this command may list groups that
3345don't exist (yet)---these will be listed as if they were killed groups.
3346Take the output with some grains of salt.
3347
3348@item A a
3349@kindex A a (Group)
3350@findex gnus-group-apropos
3351List all groups that have names that match a regexp
3352(@code{gnus-group-apropos}).
3353
3354@item A d
3355@kindex A d (Group)
3356@findex gnus-group-description-apropos
3357List all groups that have names or descriptions that match a regexp
3358(@code{gnus-group-description-apropos}).
3359
3360@item A c
3361@kindex A c (Group)
3362@findex gnus-group-list-cached
3363List all groups with cached articles (@code{gnus-group-list-cached}).
3364
3365@item A ?
3366@kindex A ? (Group)
3367@findex gnus-group-list-dormant
3368List all groups with dormant articles (@code{gnus-group-list-dormant}).
3369
3370@item A /
3371@kindex A / (Group)
3372@findex gnus-group-list-limit
3373List groups limited within the current selection
3374(@code{gnus-group-list-limit}).
3375
3376@item A f
3377@kindex A f (Group)
3378@findex gnus-group-list-flush
3379Flush groups from the current selection (@code{gnus-group-list-flush}).
3380
3381@item A p
3382@kindex A p (Group)
3383@findex gnus-group-list-plus
3384List groups plus the current selection (@code{gnus-group-list-plus}).
3385
3386@end table
3387
3388@vindex gnus-permanently-visible-groups
3389@cindex visible group parameter
3390Groups that match the @code{gnus-permanently-visible-groups} regexp will
3391always be shown, whether they have unread articles or not. You can also
3392add the @code{visible} element to the group parameters in question to
3393get the same effect.
3394
3395@vindex gnus-list-groups-with-ticked-articles
3396Groups that have just ticked articles in it are normally listed in the
3397group buffer. If @code{gnus-list-groups-with-ticked-articles} is
3398@code{nil}, these groups will be treated just like totally empty
3399groups. It is @code{t} by default.
3400
3401
3402@node Sorting Groups
3403@section Sorting Groups
3404@cindex sorting groups
3405
3406@kindex C-c C-s (Group)
3407@findex gnus-group-sort-groups
3408@vindex gnus-group-sort-function
3409The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the
3410group buffer according to the function(s) given by the
3411@code{gnus-group-sort-function} variable. Available sorting functions
3412include:
3413
3414@table @code
3415
3416@item gnus-group-sort-by-alphabet
3417@findex gnus-group-sort-by-alphabet
3418Sort the group names alphabetically. This is the default.
3419
3420@item gnus-group-sort-by-real-name
3421@findex gnus-group-sort-by-real-name
3422Sort the group alphabetically on the real (unprefixed) group names.
3423
3424@item gnus-group-sort-by-level
3425@findex gnus-group-sort-by-level
3426Sort by group level.
3427
3428@item gnus-group-sort-by-score
3429@findex gnus-group-sort-by-score
3430Sort by group score. @xref{Group Score}.
3431
3432@item gnus-group-sort-by-rank
3433@findex gnus-group-sort-by-rank
3434Sort by group score and then the group level. The level and the score
3435are, when taken together, the group's @dfn{rank}. @xref{Group Score}.
3436
3437@item gnus-group-sort-by-unread
3438@findex gnus-group-sort-by-unread
3439Sort by number of unread articles.
3440
3441@item gnus-group-sort-by-method
3442@findex gnus-group-sort-by-method
3443Sort alphabetically on the select method.
3444
3445@item gnus-group-sort-by-server
3446@findex gnus-group-sort-by-server
3447Sort alphabetically on the Gnus server name.
3448
3449
3450@end table
3451
3452@code{gnus-group-sort-function} can also be a list of sorting
3453functions. In that case, the most significant sort key function must be
3454the last one.
3455
3456
3457There are also a number of commands for sorting directly according to
3458some sorting criteria:
3459
3460@table @kbd
3461@item G S a
3462@kindex G S a (Group)
3463@findex gnus-group-sort-groups-by-alphabet
3464Sort the group buffer alphabetically by group name
3465(@code{gnus-group-sort-groups-by-alphabet}).
3466
3467@item G S u
3468@kindex G S u (Group)
3469@findex gnus-group-sort-groups-by-unread
3470Sort the group buffer by the number of unread articles
3471(@code{gnus-group-sort-groups-by-unread}).
3472
3473@item G S l
3474@kindex G S l (Group)
3475@findex gnus-group-sort-groups-by-level
3476Sort the group buffer by group level
3477(@code{gnus-group-sort-groups-by-level}).
3478
3479@item G S v
3480@kindex G S v (Group)
3481@findex gnus-group-sort-groups-by-score
3482Sort the group buffer by group score
3483(@code{gnus-group-sort-groups-by-score}). @xref{Group Score}.
3484
3485@item G S r
3486@kindex G S r (Group)
3487@findex gnus-group-sort-groups-by-rank
3488Sort the group buffer by group rank
3489(@code{gnus-group-sort-groups-by-rank}). @xref{Group Score}.
3490
3491@item G S m
3492@kindex G S m (Group)
3493@findex gnus-group-sort-groups-by-method
3494Sort the group buffer alphabetically by back end name@*
3495(@code{gnus-group-sort-groups-by-method}).
3496
3497@item G S n
3498@kindex G S n (Group)
3499@findex gnus-group-sort-groups-by-real-name
3500Sort the group buffer alphabetically by real (unprefixed) group name
3501(@code{gnus-group-sort-groups-by-real-name}).
3502
3503@end table
3504
3505All the commands below obey the process/prefix convention
3506(@pxref{Process/Prefix}).
3507
3508When given a symbolic prefix (@pxref{Symbolic Prefixes}), all these
3509commands will sort in reverse order.
3510
3511You can also sort a subset of the groups:
3512
3513@table @kbd
3514@item G P a
3515@kindex G P a (Group)
3516@findex gnus-group-sort-selected-groups-by-alphabet
3517Sort the groups alphabetically by group name
3518(@code{gnus-group-sort-selected-groups-by-alphabet}).
3519
3520@item G P u
3521@kindex G P u (Group)
3522@findex gnus-group-sort-selected-groups-by-unread
3523Sort the groups by the number of unread articles
3524(@code{gnus-group-sort-selected-groups-by-unread}).
3525
3526@item G P l
3527@kindex G P l (Group)
3528@findex gnus-group-sort-selected-groups-by-level
3529Sort the groups by group level
3530(@code{gnus-group-sort-selected-groups-by-level}).
3531
3532@item G P v
3533@kindex G P v (Group)
3534@findex gnus-group-sort-selected-groups-by-score
3535Sort the groups by group score
3536(@code{gnus-group-sort-selected-groups-by-score}). @xref{Group Score}.
3537
3538@item G P r
3539@kindex G P r (Group)
3540@findex gnus-group-sort-selected-groups-by-rank
3541Sort the groups by group rank
3542(@code{gnus-group-sort-selected-groups-by-rank}). @xref{Group Score}.
3543
3544@item G P m
3545@kindex G P m (Group)
3546@findex gnus-group-sort-selected-groups-by-method
3547Sort the groups alphabetically by back end name@*
3548(@code{gnus-group-sort-selected-groups-by-method}).
3549
3550@item G P n
3551@kindex G P n (Group)
3552@findex gnus-group-sort-selected-groups-by-real-name
3553Sort the groups alphabetically by real (unprefixed) group name
3554(@code{gnus-group-sort-selected-groups-by-real-name}).
3555
3556@item G P s
3557@kindex G P s (Group)
3558@findex gnus-group-sort-selected-groups
3559Sort the groups according to @code{gnus-group-sort-function}.
3560
3561@end table
3562
3563And finally, note that you can use @kbd{C-k} and @kbd{C-y} to manually
3564move groups around.
3565
3566
3567@node Group Maintenance
3568@section Group Maintenance
3569@cindex bogus groups
3570
3571@table @kbd
3572@item b
3573@kindex b (Group)
3574@findex gnus-group-check-bogus-groups
3575Find bogus groups and delete them
3576(@code{gnus-group-check-bogus-groups}).
3577
3578@item F
3579@kindex F (Group)
3580@findex gnus-group-find-new-groups
3581Find new groups and process them (@code{gnus-group-find-new-groups}).
3582With 1 @kbd{C-u}, use the @code{ask-server} method to query the server
3583for new groups. With 2 @kbd{C-u}'s, use most complete method possible
3584to query the server for new groups, and subscribe the new groups as
3585zombies.
3586
3587@item C-c C-x
3588@kindex C-c C-x (Group)
3589@findex gnus-group-expire-articles
3590@cindex expiring mail
3591Run all expirable articles in the current group through the expiry
3592process (if any) (@code{gnus-group-expire-articles}). That is, delete
3593all expirable articles in the group that have been around for a while.
3594(@pxref{Expiring Mail}).
3595
3596@item C-c C-M-x
3597@kindex C-c C-M-x (Group)
3598@findex gnus-group-expire-all-groups
3599@cindex expiring mail
3600Run all expirable articles in all groups through the expiry process
3601(@code{gnus-group-expire-all-groups}).
3602
3603@end table
3604
3605
3606@node Browse Foreign Server
3607@section Browse Foreign Server
3608@cindex foreign servers
3609@cindex browsing servers
3610
3611@table @kbd
3612@item B
3613@kindex B (Group)
3614@findex gnus-group-browse-foreign-server
3615You will be queried for a select method and a server name. Gnus will
3616then attempt to contact this server and let you browse the groups there
3617(@code{gnus-group-browse-foreign-server}).
3618@end table
3619
3620@findex gnus-browse-mode
3621A new buffer with a list of available groups will appear. This buffer
3622will use the @code{gnus-browse-mode}. This buffer looks a bit (well,
3623a lot) like a normal group buffer.
3624
3625Here's a list of keystrokes available in the browse mode:
3626
3627@table @kbd
3628@item n
3629@kindex n (Browse)
3630@findex gnus-group-next-group
3631Go to the next group (@code{gnus-group-next-group}).
3632
3633@item p
3634@kindex p (Browse)
3635@findex gnus-group-prev-group
3636Go to the previous group (@code{gnus-group-prev-group}).
3637
3638@item SPACE
3639@kindex SPACE (Browse)
3640@findex gnus-browse-read-group
3641Enter the current group and display the first article
3642(@code{gnus-browse-read-group}).
3643
3644@item RET
3645@kindex RET (Browse)
3646@findex gnus-browse-select-group
3647Enter the current group (@code{gnus-browse-select-group}).
3648
3649@item u
3650@kindex u (Browse)
3651@findex gnus-browse-unsubscribe-current-group
3652Unsubscribe to the current group, or, as will be the case here,
3653subscribe to it (@code{gnus-browse-unsubscribe-current-group}).
3654
3655@item l
3656@itemx q
3657@kindex q (Browse)
3658@kindex l (Browse)
3659@findex gnus-browse-exit
3660Exit browse mode (@code{gnus-browse-exit}).
3661
3662@item d
3663@kindex d (Browse)
3664@findex gnus-browse-describe-group
3665Describe the current group (@code{gnus-browse-describe-group}).
3666
3667@item ?
3668@kindex ? (Browse)
3669@findex gnus-browse-describe-briefly
3670Describe browse mode briefly (well, there's not much to describe, is
3671there) (@code{gnus-browse-describe-briefly}).
3672@end table
3673
3674
3675@node Exiting Gnus
3676@section Exiting Gnus
3677@cindex exiting Gnus
3678
3679Yes, Gnus is ex(c)iting.
3680
3681@table @kbd
3682@item z
3683@kindex z (Group)
3684@findex gnus-group-suspend
3685Suspend Gnus (@code{gnus-group-suspend}). This doesn't really exit Gnus,
3686but it kills all buffers except the Group buffer. I'm not sure why this
3687is a gain, but then who am I to judge?
3688
3689@item q
3690@kindex q (Group)
3691@findex gnus-group-exit
3692@c @icon{gnus-group-exit}
3693Quit Gnus (@code{gnus-group-exit}).
3694
3695@item Q
3696@kindex Q (Group)
3697@findex gnus-group-quit
3698Quit Gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}).
3699The dribble file will be saved, though (@pxref{Auto Save}).
3700@end table
3701
3702@vindex gnus-exit-gnus-hook
3703@vindex gnus-suspend-gnus-hook
3704@vindex gnus-after-exiting-gnus-hook
3705@code{gnus-suspend-gnus-hook} is called when you suspend Gnus and
3706@code{gnus-exit-gnus-hook} is called when you quit Gnus, while
3707@code{gnus-after-exiting-gnus-hook} is called as the final item when
3708exiting Gnus.
3709
3710Note:
3711
3712@quotation
3713Miss Lisa Cannifax, while sitting in English class, felt her feet go
3714numbly heavy and herself fall into a hazy trance as the boy sitting
3715behind her drew repeated lines with his pencil across the back of her
3716plastic chair.
3717@end quotation
3718
3719
3720@node Group Topics
3721@section Group Topics
3722@cindex topics
3723
3724If you read lots and lots of groups, it might be convenient to group
3725them hierarchically according to topics. You put your Emacs groups over
3726here, your sex groups over there, and the rest (what, two groups or so?)
3727you put in some misc section that you never bother with anyway. You can
3728even group the Emacs sex groups as a sub-topic to either the Emacs
3729groups or the sex groups---or both! Go wild!
3730
3731@iftex
3732@iflatex
3733\gnusfigure{Group Topics}{400}{
3734\put(75,50){\epsfig{figure=ps/group-topic,height=9cm}}
3735}
3736@end iflatex
3737@end iftex
3738
3739Here's an example:
3740
3741@example
3742Gnus
3743 Emacs -- I wuw it!
3744 3: comp.emacs
3745 2: alt.religion.emacs
3746 Naughty Emacs
3747 452: alt.sex.emacs
3748 0: comp.talk.emacs.recovery
3749 Misc
3750 8: comp.binaries.fractals
3751 13: comp.sources.unix
3752@end example
3753
3754@findex gnus-topic-mode
3755@kindex t (Group)
3756To get this @emph{fab} functionality you simply turn on (ooh!) the
3757@code{gnus-topic} minor mode---type @kbd{t} in the group buffer. (This
3758is a toggling command.)
3759
3760Go ahead, just try it. I'll still be here when you get back. La de
3761dum@dots{} Nice tune, that@dots{} la la la@dots{} What, you're back?
3762Yes, and now press @kbd{l}. There. All your groups are now listed
3763under @samp{misc}. Doesn't that make you feel all warm and fuzzy?
3764Hot and bothered?
3765
3766If you want this permanently enabled, you should add that minor mode to
3767the hook for the group mode. Put the following line in your
3768@file{~/.gnus.el} file:
3769
3770@lisp
3771(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
3772@end lisp
3773
3774@menu
3775* Topic Commands:: Interactive E-Z commands.
3776* Topic Variables:: How to customize the topics the Lisp Way.
3777* Topic Sorting:: Sorting each topic individually.
3778* Topic Topology:: A map of the world.
3779* Topic Parameters:: Parameters that apply to all groups in a topic.
3780@end menu
3781
3782
3783@node Topic Commands
3784@subsection Topic Commands
3785@cindex topic commands
3786
3787When the topic minor mode is turned on, a new @kbd{T} submap will be
3788available. In addition, a few of the standard keys change their
3789definitions slightly.
3790
3791In general, the following kinds of operations are possible on topics.
3792First of all, you want to create topics. Secondly, you want to put
3793groups in topics and to move them around until you have an order you
3794like. The third kind of operation is to show/hide parts of the whole
3795shebang. You might want to hide a topic including its subtopics and
3796groups, to get a better overview of the other groups.
3797
3798Here is a list of the basic keys that you might need to set up topics
3799the way you like.
3800
3801@table @kbd
3802
3803@item T n
3804@kindex T n (Topic)
3805@findex gnus-topic-create-topic
3806Prompt for a new topic name and create it
3807(@code{gnus-topic-create-topic}).
3808
3809@item T TAB
3810@itemx TAB
3811@kindex T TAB (Topic)
3812@kindex TAB (Topic)
3813@findex gnus-topic-indent
3814``Indent'' the current topic so that it becomes a sub-topic of the
3815previous topic (@code{gnus-topic-indent}). If given a prefix,
3816``un-indent'' the topic instead.
3817
3818@item M-TAB
3819@kindex M-TAB (Topic)
3820@findex gnus-topic-unindent
3821``Un-indent'' the current topic so that it becomes a sub-topic of the
3822parent of its current parent (@code{gnus-topic-unindent}).
3823
3824@end table
3825
3826The following two keys can be used to move groups and topics around.
3827They work like the well-known cut and paste. @kbd{C-k} is like cut and
3828@kbd{C-y} is like paste. Of course, this being Emacs, we use the terms
3829kill and yank rather than cut and paste.
3830
3831@table @kbd
3832
3833@item C-k
3834@kindex C-k (Topic)
3835@findex gnus-topic-kill-group
3836Kill a group or topic (@code{gnus-topic-kill-group}). All groups in the
3837topic will be removed along with the topic.
3838
3839@item C-y
3840@kindex C-y (Topic)
3841@findex gnus-topic-yank-group
3842Yank the previously killed group or topic
3843(@code{gnus-topic-yank-group}). Note that all topics will be yanked
3844before all groups.
3845
3846So, to move a topic to the beginning of the list of topics, just hit
3847@kbd{C-k} on it. This is like the ``cut'' part of cut and paste. Then,
3848move the cursor to the beginning of the buffer (just below the ``Gnus''
3849topic) and hit @kbd{C-y}. This is like the ``paste'' part of cut and
3850paste. Like I said -- E-Z.
3851
3852You can use @kbd{C-k} and @kbd{C-y} on groups as well as on topics. So
3853you can move topics around as well as groups.
3854
3855@end table
3856
3857After setting up the topics the way you like them, you might wish to
3858hide a topic, or to show it again. That's why we have the following
3859key.
3860
3861@table @kbd
3862
3863@item RET
3864@kindex RET (Topic)
3865@findex gnus-topic-select-group
3866@itemx SPACE
3867Either select a group or fold a topic (@code{gnus-topic-select-group}).
3868When you perform this command on a group, you'll enter the group, as
3869usual. When done on a topic line, the topic will be folded (if it was
3870visible) or unfolded (if it was folded already). So it's basically a
3871toggling command on topics. In addition, if you give a numerical
3872prefix, group on that level (and lower) will be displayed.
3873
3874@end table
3875
3876Now for a list of other commands, in no particular order.
3877
3878@table @kbd
3879
3880@item T m
3881@kindex T m (Topic)
3882@findex gnus-topic-move-group
3883Move the current group to some other topic
3884(@code{gnus-topic-move-group}). This command uses the process/prefix
3885convention (@pxref{Process/Prefix}).
3886
3887@item T j
3888@kindex T j (Topic)
3889@findex gnus-topic-jump-to-topic
3890Go to a topic (@code{gnus-topic-jump-to-topic}).
3891
3892@item T c
3893@kindex T c (Topic)
3894@findex gnus-topic-copy-group
3895Copy the current group to some other topic
3896(@code{gnus-topic-copy-group}). This command uses the process/prefix
3897convention (@pxref{Process/Prefix}).
3898
3899@item T h
3900@kindex T h (Topic)
3901@findex gnus-topic-hide-topic
3902Hide the current topic (@code{gnus-topic-hide-topic}). If given
3903a prefix, hide the topic permanently.
3904
3905@item T s
3906@kindex T s (Topic)
3907@findex gnus-topic-show-topic
3908Show the current topic (@code{gnus-topic-show-topic}). If given
3909a prefix, show the topic permanently.
3910
3911@item T D
3912@kindex T D (Topic)
3913@findex gnus-topic-remove-group
3914Remove a group from the current topic (@code{gnus-topic-remove-group}).
3915This command is mainly useful if you have the same group in several
3916topics and wish to remove it from one of the topics. You may also
3917remove a group from all topics, but in that case, Gnus will add it to
3918the root topic the next time you start Gnus. In fact, all new groups
3919(which, naturally, don't belong to any topic) will show up in the root
3920topic.
3921
3922This command uses the process/prefix convention
3923(@pxref{Process/Prefix}).
3924
3925@item T M
3926@kindex T M (Topic)
3927@findex gnus-topic-move-matching
3928Move all groups that match some regular expression to a topic
3929(@code{gnus-topic-move-matching}).
3930
3931@item T C
3932@kindex T C (Topic)
3933@findex gnus-topic-copy-matching
3934Copy all groups that match some regular expression to a topic
3935(@code{gnus-topic-copy-matching}).
3936
3937@item T H
3938@kindex T H (Topic)
3939@findex gnus-topic-toggle-display-empty-topics
3940Toggle hiding empty topics
3941(@code{gnus-topic-toggle-display-empty-topics}).
3942
3943@item T #
3944@kindex T # (Topic)
3945@findex gnus-topic-mark-topic
3946Mark all groups in the current topic with the process mark
3947(@code{gnus-topic-mark-topic}). This command works recursively on
3948sub-topics unless given a prefix.
3949
3950@item T M-#
3951@kindex T M-# (Topic)
3952@findex gnus-topic-unmark-topic
3953Remove the process mark from all groups in the current topic
3954(@code{gnus-topic-unmark-topic}). This command works recursively on
3955sub-topics unless given a prefix.
3956
3957@item C-c C-x
3958@kindex C-c C-x (Topic)
3959@findex gnus-topic-expire-articles
3960@cindex expiring mail
3961Run all expirable articles in the current group or topic through the
3962expiry process (if any)
3963(@code{gnus-topic-expire-articles}). (@pxref{Expiring Mail}).
3964
3965@item T r
3966@kindex T r (Topic)
3967@findex gnus-topic-rename
3968Rename a topic (@code{gnus-topic-rename}).
3969
3970@item T DEL
3971@kindex T DEL (Topic)
3972@findex gnus-topic-delete
3973Delete an empty topic (@code{gnus-topic-delete}).
3974
3975@item A T
3976@kindex A T (Topic)
3977@findex gnus-topic-list-active
3978List all groups that Gnus knows about in a topics-ified way
3979(@code{gnus-topic-list-active}).
3980
3981@item T M-n
3982@kindex T M-n (Topic)
3983@findex gnus-topic-goto-next-topic
3984Go to the next topic (@code{gnus-topic-goto-next-topic}).
3985
3986@item T M-p
3987@kindex T M-p (Topic)
3988@findex gnus-topic-goto-previous-topic
01c52d31 3989Go to the previous topic (@code{gnus-topic-goto-previous-topic}).
4009494e
GM
3990
3991@item G p
3992@kindex G p (Topic)
3993@findex gnus-topic-edit-parameters
3994@cindex group parameters
3995@cindex topic parameters
3996@cindex parameters
3997Edit the topic parameters (@code{gnus-topic-edit-parameters}).
3998@xref{Topic Parameters}.
3999
4000@end table
4001
4002
4003@node Topic Variables
4004@subsection Topic Variables
4005@cindex topic variables
4006
4007The previous section told you how to tell Gnus which topics to display.
4008This section explains how to tell Gnus what to display about each topic.
4009
4010@vindex gnus-topic-line-format
4011The topic lines themselves are created according to the
4012@code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
4013Valid elements are:
4014
4015@table @samp
4016@item i
4017Indentation.
4018@item n
4019Topic name.
4020@item v
4021Visibility.
4022@item l
4023Level.
4024@item g
4025Number of groups in the topic.
4026@item a
4027Number of unread articles in the topic.
4028@item A
4029Number of unread articles in the topic and all its subtopics.
4030@end table
4031
4032@vindex gnus-topic-indent-level
4033Each sub-topic (and the groups in the sub-topics) will be indented with
4034@code{gnus-topic-indent-level} times the topic level number of spaces.
4035The default is 2.
4036
4037@vindex gnus-topic-mode-hook
4038@code{gnus-topic-mode-hook} is called in topic minor mode buffers.
4039
4040@vindex gnus-topic-display-empty-topics
4041The @code{gnus-topic-display-empty-topics} says whether to display even
4042topics that have no unread articles in them. The default is @code{t}.
4043
4044
4045@node Topic Sorting
4046@subsection Topic Sorting
4047@cindex topic sorting
4048
4049You can sort the groups in each topic individually with the following
4050commands:
4051
4052
4053@table @kbd
4054@item T S a
4055@kindex T S a (Topic)
4056@findex gnus-topic-sort-groups-by-alphabet
4057Sort the current topic alphabetically by group name
4058(@code{gnus-topic-sort-groups-by-alphabet}).
4059
4060@item T S u
4061@kindex T S u (Topic)
4062@findex gnus-topic-sort-groups-by-unread
4063Sort the current topic by the number of unread articles
4064(@code{gnus-topic-sort-groups-by-unread}).
4065
4066@item T S l
4067@kindex T S l (Topic)
4068@findex gnus-topic-sort-groups-by-level
4069Sort the current topic by group level
4070(@code{gnus-topic-sort-groups-by-level}).
4071
4072@item T S v
4073@kindex T S v (Topic)
4074@findex gnus-topic-sort-groups-by-score
4075Sort the current topic by group score
4076(@code{gnus-topic-sort-groups-by-score}). @xref{Group Score}.
4077
4078@item T S r
4079@kindex T S r (Topic)
4080@findex gnus-topic-sort-groups-by-rank
4081Sort the current topic by group rank
4082(@code{gnus-topic-sort-groups-by-rank}). @xref{Group Score}.
4083
4084@item T S m
4085@kindex T S m (Topic)
4086@findex gnus-topic-sort-groups-by-method
4087Sort the current topic alphabetically by back end name
4088(@code{gnus-topic-sort-groups-by-method}).
4089
4090@item T S e
4091@kindex T S e (Topic)
4092@findex gnus-topic-sort-groups-by-server
4093Sort the current topic alphabetically by server name
4094(@code{gnus-topic-sort-groups-by-server}).
4095
4096@item T S s
4097@kindex T S s (Topic)
4098@findex gnus-topic-sort-groups
4099Sort the current topic according to the function(s) given by the
4100@code{gnus-group-sort-function} variable
4101(@code{gnus-topic-sort-groups}).
4102
4103@end table
4104
4105When given a prefix argument, all these commands will sort in reverse
4106order. @xref{Sorting Groups}, for more information about group
4107sorting.
4108
4109
4110@node Topic Topology
4111@subsection Topic Topology
4112@cindex topic topology
4113@cindex topology
4114
4115So, let's have a look at an example group buffer:
4116
4117@example
4118@group
4119Gnus
4120 Emacs -- I wuw it!
4121 3: comp.emacs
4122 2: alt.religion.emacs
4123 Naughty Emacs
4124 452: alt.sex.emacs
4125 0: comp.talk.emacs.recovery
4126 Misc
4127 8: comp.binaries.fractals
4128 13: comp.sources.unix
4129@end group
4130@end example
4131
4132So, here we have one top-level topic (@samp{Gnus}), two topics under
4133that, and one sub-topic under one of the sub-topics. (There is always
4134just one (1) top-level topic). This topology can be expressed as
4135follows:
4136
4137@lisp
4138(("Gnus" visible)
4139 (("Emacs -- I wuw it!" visible)
4140 (("Naughty Emacs" visible)))
4141 (("Misc" visible)))
4142@end lisp
4143
4144@vindex gnus-topic-topology
4145This is in fact how the variable @code{gnus-topic-topology} would look
4146for the display above. That variable is saved in the @file{.newsrc.eld}
4147file, and shouldn't be messed with manually---unless you really want
4148to. Since this variable is read from the @file{.newsrc.eld} file,
4149setting it in any other startup files will have no effect.
4150
4151This topology shows what topics are sub-topics of what topics (right),
4152and which topics are visible. Two settings are currently
4153allowed---@code{visible} and @code{invisible}.
4154
4155
4156@node Topic Parameters
4157@subsection Topic Parameters
4158@cindex topic parameters
4159
4160All groups in a topic will inherit group parameters from the parent
4161(and ancestor) topic parameters. All valid group parameters are valid
4162topic parameters (@pxref{Group Parameters}). When the agent is
4163enabled, all agent parameters (See Agent Parameters in @ref{Category
4164Syntax}) are also valid topic parameters.
4165
4166In addition, the following parameters are only valid as topic
4167parameters:
4168
4169@table @code
4170@item subscribe
4171When subscribing new groups by topic (@pxref{Subscription Methods}), the
4172@code{subscribe} topic parameter says what groups go in what topic. Its
4173value should be a regexp to match the groups that should go in that
4174topic.
4175
4176@item subscribe-level
4177When subscribing new groups by topic (see the @code{subscribe} parameter),
4178the group will be subscribed with the level specified in the
4179@code{subscribe-level} instead of @code{gnus-level-default-subscribed}.
4180
4181@end table
4182
4183Group parameters (of course) override topic parameters, and topic
4184parameters in sub-topics override topic parameters in super-topics. You
4185know. Normal inheritance rules. (@dfn{Rules} is here a noun, not a
4186verb, although you may feel free to disagree with me here.)
4187
4188@example
4189@group
4190Gnus
4191 Emacs
4192 3: comp.emacs
4193 2: alt.religion.emacs
4194 452: alt.sex.emacs
4195 Relief
4196 452: alt.sex.emacs
4197 0: comp.talk.emacs.recovery
4198 Misc
4199 8: comp.binaries.fractals
4200 13: comp.sources.unix
4201 452: alt.sex.emacs
4202@end group
4203@end example
4204
4205The @samp{Emacs} topic has the topic parameter @code{(score-file
4206. "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter
4207@code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has the
4208topic parameter @code{(score-file . "emacs.SCORE")}. In addition,
4209@* @samp{alt.religion.emacs} has the group parameter @code{(score-file
4210. "religion.SCORE")}.
4211
4212Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you
4213will get the @file{relief.SCORE} home score file. If you enter the same
4214group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home
4215score file. If you enter the group @samp{alt.religion.emacs}, you'll
4216get the @file{religion.SCORE} home score file.
4217
4218This seems rather simple and self-evident, doesn't it? Well, yes. But
4219there are some problems, especially with the @code{total-expiry}
4220parameter. Say you have a mail group in two topics; one with
4221@code{total-expiry} and one without. What happens when you do @kbd{M-x
4222gnus-expire-all-expirable-groups}? Gnus has no way of telling which one
4223of these topics you mean to expire articles from, so anything may
4224happen. In fact, I hereby declare that it is @dfn{undefined} what
4225happens. You just have to be careful if you do stuff like that.
4226
4227
01c52d31
MB
4228@node Non-ASCII Group Names
4229@section Accessing groups of non-English names
4230@cindex non-ascii group names
4231
4232There are some news servers that provide groups of which the names are
4233expressed with their native languages in the world. For instance, in a
4234certain news server there are some newsgroups of which the names are
4235spelled in Chinese, where people are talking in Chinese. You can, of
4236course, subscribe to such news groups using Gnus. Currently Gnus
4237supports non-@acronym{ASCII} group names not only with the @code{nntp}
4238back end but also with the @code{nnml} back end and the @code{nnrss}
4239back end.
4240
4241Every such group name is encoded by a certain charset in the server
4242side (in an @acronym{NNTP} server its administrator determines the
4243charset, but for groups in the other back ends it is determined by you).
4244Gnus has to display the decoded ones for you in the group buffer and the
4245article buffer, and needs to use the encoded ones when communicating
4246with servers. However, Gnus doesn't know what charset is used for each
4247non-@acronym{ASCII} group name. The following two variables are just
4248the ones for telling Gnus what charset should be used for each group:
4249
4250@table @code
4251@item gnus-group-name-charset-method-alist
4252@vindex gnus-group-name-charset-method-alist
4253An alist of select methods and charsets. The default value is
4254@code{nil}. The names of groups in the server specified by that select
4255method are all supposed to use the corresponding charset. For example:
4256
4257@lisp
4258(setq gnus-group-name-charset-method-alist
4259 '(((nntp "news.com.cn") . cn-gb-2312)))
4260@end lisp
4261
4262Charsets specified for groups with this variable are preferred to the
4263ones specified for the same groups with the
4264@code{gnus-group-name-charset-group-alist} variable (see below).
4265
4266A select method can be very long, like:
4267
4268@lisp
4269(nntp "gmane"
4270 (nntp-address "news.gmane.org")
4271 (nntp-end-of-line "\n")
4272 (nntp-open-connection-function
4273 nntp-open-via-rlogin-and-telnet)
4274 (nntp-via-rlogin-command "ssh")
4275 (nntp-via-rlogin-command-switches
4276 ("-C" "-t" "-e" "none"))
4277 (nntp-via-address @dots{}))
4278@end lisp
4279
4280In that case, you can truncate it into @code{(nntp "gmane")} in this
4281variable. That is, it is enough to contain only the back end name and
4282the server name.
4283
4284@item gnus-group-name-charset-group-alist
4285@cindex UTF-8 group names
4286@vindex gnus-group-name-charset-group-alist
4287An alist of regexp of group name and the charset for group names.
4288@code{((".*" . utf-8))} is the default value if UTF-8 is supported,
4289otherwise the default is @code{nil}. For example:
4290
4291@lisp
4292(setq gnus-group-name-charset-group-alist
4293 '(("\\.com\\.cn:" . cn-gb-2312)
4294 (".*" . utf-8)))
4295@end lisp
4296
4297Note that this variable is ignored if the match is made with
4298@code{gnus-group-name-charset-method-alist}.
4299@end table
4300
4301Those two variables are used also to determine the charset for encoding
4302and decoding non-@acronym{ASCII} group names that are in the back ends
4303other than @code{nntp}. It means that it is you who determine it. If
4304you do nothing, the charset used for group names in those back ends will
4305all be @code{utf-8} because of the last element of
4306@code{gnus-group-name-charset-group-alist}.
4307
4308There is one more important variable for non-@acronym{ASCII} group
4309names. @emph{XEmacs users must set this}. Emacs users necessarily need
4310not do:
4311
4312@table @code
4313@item nnmail-pathname-coding-system
4314The value of this variable should be a coding system or @code{nil}
4315(which is the default). The @code{nnml} back end, the @code{nnrss} back
4316end, the @acronym{NNTP} marks feature (@pxref{NNTP marks}), the agent,
4317and the cache use non-@acronym{ASCII} group names in those files and
4318directories. This variable overrides the value of
4319@code{file-name-coding-system} which specifies the coding system used
4320when encoding and decoding those file names and directory names.
4321
4322In XEmacs (with the @code{mule} feature), @code{file-name-coding-system}
4323is the only means to specify the coding system used to encode and decode
4324file names. Therefore, @emph{you, XEmacs users, have to set it} to the
4325coding system that is suitable to encode and decode non-@acronym{ASCII}
4326group names. On the other hand, Emacs uses the value of
4327@code{default-file-name-coding-system} if @code{file-name-coding-system}
4328is @code{nil}. Normally the value of
4329@code{default-file-name-coding-system} is initialized according to the
4330locale, so you will need to do nothing if the value is suitable to
4331encode and decode non-@acronym{ASCII} group names.
4332
4333The value of this variable (or @code{default-file-name-coding-system})
4334does not necessarily need to be the same value that is determined by
4335@code{gnus-group-name-charset-method-alist} and
4336@code{gnus-group-name-charset-group-alist}.
4337
4338If you want to subscribe to the groups spelled in Chinese but
4339@code{default-file-name-coding-system} is initialized by default to
4340@code{iso-latin-1} for example, that is the most typical case where you
4341have to set @code{nnmail-pathname-coding-system} even if you are an
4342Emacs user. The @code{utf-8} coding system is a good candidate for it.
4343Otherwise, you may change the locale in your system so that
4344@code{default-file-name-coding-system} may be initialized to an
4345appropriate value, instead of specifying this variable.
4346@end table
4347
4348Note that when you copy or move articles from a non-@acronym{ASCII}
4349group to another group, the charset used to encode and decode group
4350names should be the same in both groups. Otherwise the Newsgroups
4351header will be displayed incorrectly in the article buffer.
4352
4353
e6d2d263
MB
4354@node Searching
4355@section Searching
4356
4357@menu
4358* nnir:: Searching on IMAP, with swish, namazu, etc.
4359* nnmairix:: Searching maildir, MH or mbox with Mairix.
4360@end menu
4361
4362@cindex Searching
4363
4364FIXME: This node is a stub.
4365
4366FIXME: Add a brief overview of Gnus search capabilities. A brief
4367comparison of nnir, nnmairix, contrib/gnus-namazu would be nice
4368as well.
4369
4370FIXME: Explain difference to @ref{Searching for Articles}, add reference
4371and back-reference.
4372
4373@node nnir
4374@subsection nnir
4375
4376FIXME: As a first step, convert the commentary of @file{nnir} to texi.
4377@cindex nnir
4378
4379@node nnmairix
4380@subsection nnmairix
4381
4382@cindex mairix
4383@cindex nnmairix
4384This paragraph describes how to set up mairix and the back end
4385@code{nnmairix} for indexing and searching your mail from within
4386Gnus. Additionally, you can create permanent ``smart'' groups which are
4387bound to mairix searches and are automatically updated.
4388
4389@menu
4390* About mairix:: About the mairix mail search engine
4391* nnmairix requirements:: What you will need for using nnmairix
4392* What nnmairix does:: What does nnmairix actually do?
4393* Setting up mairix:: Set up your mairix installation
4394* Configuring nnmairix:: Set up the nnmairix back end
4395* nnmairix keyboard shortcuts:: List of available keyboard shortcuts
4396* Propagating marks:: How to propagate marks from nnmairix groups
4397* nnmairix tips and tricks:: Some tips, tricks and examples
4398* nnmairix caveats:: Some more stuff you might want to know
4399@end menu
4400
2b968687
MB
4401@c FIXME: The markup in this section might need improvement.
4402@c E.g. adding @samp, @var, @file, @command, etc.
4403@c Cf. (info "(texinfo)Indicating")
e6d2d263
MB
4404
4405@node About mairix
4406@subsubsection About mairix
4407
4408Mairix is a tool for indexing and searching words in locally stored
4409mail. It was written by Richard Curnow and is licensed under the
4410GPL. Mairix comes with most popular GNU/Linux distributions, but it also
4411runs under Windows (with cygwin), Mac OS X and Solaris. The homepage can
4412be found at
4413@uref{http://www.rpcurnow.force9.co.uk/mairix/index.html}
4414
4415Though mairix might not be as flexible as other search tools like
4416swish++ or namazu, which you can use via the @code{nnir} back end, it
4417has the prime advantage of being incredibly fast. On current systems, it
4418can easily search through headers and message bodies of thousands and
4419thousands of mails in well under a second. Building the database
4420necessary for searching might take a minute or two, but only has to be
4421done once fully. Afterwards, the updates are done incrementally and
4422therefore are really fast, too. Additionally, mairix is very easy to set
4423up.
4424
4425For maximum speed though, mairix should be used with mails stored in
4426@code{Maildir} or @code{MH} format (this includes the @code{nnml} back
4427end), although it also works with mbox. Mairix presents the search
4428results by populating a @emph{virtual} maildir/MH folder with symlinks
4429which point to the ``real'' message files (if mbox is used, copies are
4430made). Since mairix already presents search results in such a virtual
4431mail folder, it is very well suited for using it as an external program
4432for creating @emph{smart} mail folders, which represent certain mail
4433searches. This is similar to a Kiboze group (@pxref{Kibozed Groups}),
4434but much faster.
4435
4436@node nnmairix requirements
4437@subsubsection nnmairix requirements
4438
2b968687 4439Mairix searches local mail---that means, mairix absolutely must have
e6d2d263
MB
4440direct access to your mail folders. If your mail resides on another
4441server (e.g. an @acronym{IMAP} server) and you happen to have shell
4442access, @code{nnmairix} supports running mairix remotely, e.g. via ssh.
4443
4444Additionally, @code{nnmairix} only supports the following Gnus back
2b968687
MB
4445ends: @code{nnml}, @code{nnmaildir}, and @code{nnimap}. You must use
4446one of these back ends for using @code{nnmairix}. Other back ends, like
4447@code{nnmbox}, @code{nnfolder} or @code{nnmh}, won't work.
e6d2d263
MB
4448
4449If you absolutely must use mbox and still want to use @code{nnmairix},
4450you can set up a local @acronym{IMAP} server, which you then access via
4451@code{nnimap}. This is a rather massive setup for accessing some mbox
4452files, so just change to MH or Maildir already...
4453
4454@node What nnmairix does
4455@subsubsection What nnmairix does
4456
4457The back end @code{nnmairix} enables you to call mairix from within Gnus,
4458either to query mairix with a search term or to update the
4459database. While visiting a message in the summary buffer, you can use
4460several pre-defined shortcuts for calling mairix, e.g. to quickly
4461search for all mails from the sender of the current message or to
4462display the whole thread associated with the message, even if the
4463mails are in different folders.
4464
4465Additionally, you can create permanent @code{nnmairix} groups which are bound
4466to certain mairix searches. This way, you can easily create a group
4467containing mails from a certain sender, with a certain subject line or
4468even for one specific thread based on the Message-ID. If you check for
4469new mail in these folders (e.g. by pressing @kbd{g} or @kbd{M-g}), they
4470automatically update themselves by calling mairix.
4471
4472You might ask why you need @code{nnmairix} at all, since mairix already
4473creates the group, populates it with links to the mails so that you can
4474then access it with Gnus, right? Well, this @emph{might} work, but often
2b968687 4475does not---at least not without problems. Most probably you will get
e6d2d263
MB
4476strange article counts, and sometimes you might see mails which Gnus
4477claims have already been canceled and are inaccessible. This is due to
4478the fact that Gnus isn't really amused when things are happening behind
4479its back. Another problem can be the mail back end itself, e.g. if you
4480use mairix with an @acronym{IMAP} server (I had Dovecot complaining
4481about corrupt index files when mairix changed the contents of the search
4482group). Using @code{nnmairix} should circumvent these problems.
4483
2b968687 4484@code{nnmairix} is not really a mail back end---it's actually more like a
e6d2d263
MB
4485wrapper, sitting between a ``real'' mail back end where mairix stores the
4486searches and the Gnus front end. You can choose between three different
4487mail back ends for the mairix folders: @code{nnml}, @code{nnmaildir} or
4488@code{nnimap}. @code{nnmairix} will call the mairix binary so that the
4489search results are stored in folders named
4490@code{zz_mairix-<NAME>-<NUMBER>} on this mail back end, but it will
4491present these folders in the Gnus front end only with @code{<NAME>}. You
4492can use an existing mail back end where you already store your mail, but
4493if you're uncomfortable with @code{nnmairix} creating new mail groups
4494alongside your other mail, you can also create e.g. a new
4495@code{nnmaildir} server exclusively for mairix. However, a special case
4496exists if you want to use mairix remotely on an IMAP server with
2b968687 4497@code{nnimap}---here the mairix folders and your other mail must be on
e6d2d263
MB
4498the same @code{nnimap} back end.
4499
4500@node Setting up mairix
4501@subsubsection Setting up mairix
4502
4503First: create a backup of your mail folders (@pxref{nnmairix caveats}).
4504
4505Setting up mairix is easy: simply create a @file{.mairixrc} file with
4506(at least) the following entries:
4507
4508@example
4509# Your Maildir/MH base folder
4510base=~/Maildir
4511@end example
4512
2b968687
MB
4513This is the base folder for your mails. All the following directories
4514are relative to this base folder. If you want to use @code{nnmairix}
4515with @code{nnimap}, this base directory has to point to the mail
4516directory where the @acronym{IMAP} server stores the mail folders!
e6d2d263 4517
e6d2d263
MB
4518@example
4519maildir= ... your maildir folders which should be indexed ...
4520mh= ... your nnml/mh folders which should be indexed ...
4521mbox = ... your mbox files which should be indexed ...
4522@end example
4523
4524Specify all your maildir/nnml folders and mbox files (relative to the
2b968687 4525base directory!) you want to index with mairix. See the man-page for
e6d2d263
MB
4526mairixrc for details.
4527
4528@example
4529omit=zz_mairix-*
4530@end example
4531
4532@vindex nnmairix-group-prefix
4533This should make sure that you don't accidentally index the mairix
4534search results. You can change the prefix of these folders with the
4535variable @code{nnmairix-group-prefix}.
4536
e6d2d263
MB
4537@example
4538mformat= ... 'maildir' or 'mh' ...
4539database= ... location of database file ...
4540@end example
4541
4542The @code{format} setting specifies the output format for the mairix
4543search folder. Set this to @code{mh} if you want to access search results
4544with @code{nnml}. Otherwise choose @code{maildir}.
4545
2b968687
MB
4546To summarize, here is my shortened @file{.mairixrc} file as an example:
4547
4548@example
4549base=~/Maildir
4550maildir=.personal:.work:.logcheck:.sent
4551mh=../Mail/nnml/*...
4552mbox=../mboxmail/mailarchive_year*
4553mformat=maildir
4554omit=zz_mairix-*
4555database=~/.mairixdatabase
4556@end example
4557
4558In this case, the base directory is @file{~/Maildir}, where all my Maildir
4559folders are stored. As you can see, the folders are separated by
4560colons. If you wonder why every folder begins with a dot: this is
4561because I use Dovecot as @acronym{IMAP} server, which again uses
4562@code{Maildir++} folders. For testing nnmairix, I also have some
4563@code{nnml} mail, which is saved in @file{~/Mail/nnml}. Since this has
4564to be specified relative to the @code{base} directory, the @code{../Mail}
4565notation is needed. Note that the line ends in @code{*...}, which means
4566to recursively scan all files under this directory. Without the three
4567dots, the wildcard @code{*} will not work recursively. I also have some
4568old mbox files with archived mail lying around in @file{~/mboxmail}.
4569The other lines should be obvious.
4570
4571See the man page for @code{mairixrc} for details and further options,
4572especially regarding wildcard usage, which may be a little different
4573than you are used to.
4574
4575Now simply call @code{mairix} to create the index for the first time.
4576Note that this may take a few minutes, but every following index will do
4577the updates incrementally and hence is very fast.
e6d2d263
MB
4578
4579@node Configuring nnmairix
4580@subsubsection Configuring nnmairix
4581
4582In group mode, type @kbd{G b c}
4583(@code{nnmairix-create-server-and-default-group}). This will ask you for all
4584necessary information and create a @code{nnmairix} server as a foreign
4585server. You will have to specify the following:
4586
4587@itemize @bullet
4588
4589@item
2b968687 4590The @strong{name} of the @code{nnmairix} server---choose whatever you
e6d2d263
MB
4591want.
4592
4593@item
4594The @strong{mail back end} where mairix should stores its
4595searches. Currently @code{nnmaildir}, @code{nnimap} and @code{nnml} are
4596supported. As explained above, for locally stored mails, this can be an
4597existing mail back end where you store your mails. However, you can also
4598create e.g. a new @code{nnmaildir} server exclusively for
4599@code{nnmairix} in your secondary select methods (@pxref{Finding the
4600News}). If you want to use mairix remotely on an @acronym{IMAP} server,
4601you have to choose the corresponding @code{nnimap} back end here.
4602
4603@item
4604@vindex nnmairix-mairix-search-options
4605The @strong{command} to call the mairix binary. This will usually just
4606be @code{mairix}, but you can also choose something like @code{ssh
4607SERVER mairix} if you want to call mairix remotely, e.g. on your
4608@acronym{IMAP} server. If you want to add some default options to
4609mairix, you could do this here, but better use the variable
4610@code{nnmairix-mairix-search-options} instead.
4611
4612@item
4613The name of the @strong{default search group}. This will be the group
4614where all temporary mairix searches are stored, i.e. all searches which
4615are not bound to permanent @code{nnmairix} groups. Choose whatever you
4616like.
4617
4618@item
4619If the mail back end is @code{nnimap} or @code{nnmaildir}, you will be
4620asked if you work with @strong{Maildir++}, i.e. with hidden maildir
4621folders (=beginning with a dot). For example, you have to answer
4622@samp{yes} here if you work with the Dovecot @acronym{IMAP}
4623server. Otherwise, you should answer @samp{no} here.
4624
4625@end itemize
4626
4627@node nnmairix keyboard shortcuts
4628@subsubsection nnmairix keyboard shortcuts
4629
4630In group mode:
4631
4632@table @kbd
4633
4634@item G b c
4635@kindex G b c (Group)
4636@findex nnmairix-create-server-and-default-group
4637Creates @code{nnmairix} server and default search group for this server
4638(@code{nnmairix-create-server-and-default-group}). You should have done
4639this by now (@pxref{Configuring nnmairix}).
4640
4641@item G b s
4642@kindex G b s (Group)
4643@findex nnmairix-search
4644Prompts for query which is then sent to the mairix binary. Search
4645results are put into the default search group which is automatically
4646displayed (@code{nnmairix-search}).
4647
4648@item G b m
4649@kindex G b m (Group)
4650@findex nnmairix-widget-search
4651Allows you to create a mairix search or a permanent group more
4652comfortably using graphical widgets, similar to a customization
4653group. Just try it to see how it works (@code{nnmairix-widget-search}).
4654
4655@item G b i
4656@kindex G b i (Group)
4657@findex nnmairix-search-interactive
4658Another command for creating a mairix query more comfortably, but uses
4659only the minibuffer (@code{nnmairix-search-interactive}).
4660
4661@item G b g
4662@kindex G b g (Group)
4663@findex nnmairix-create-search-group
4664Creates a permanent group which is associated with a search query
4665(@code{nnmairix-create-search-group}). The @code{nnmairix} back end
4666automatically calls mairix when you update this group with @kbd{g} or
4667@kbd{M-g}.
4668
4669@item G b q
4670@kindex G b q (Group)
4671@findex nnmairix-group-change-query-this-group
4672Changes the search query for the @code{nnmairix} group under cursor
4673(@code{nnmairix-group-change-query-this-group}).
4674
4675@item G b t
4676@kindex G b t (Group)
4677@findex nnmairix-group-toggle-threads-this-group
4678Toggles the 'threads' parameter for the @code{nnmairix} group under cursor,
4679i.e. if you want see the whole threads of the found messages
4680(@code{nnmairix-group-toggle-threads-this-group}).
4681
4682@item G b u
4683@kindex G b u (Group)
4684@findex nnmairix-update-database
4685@vindex nnmairix-mairix-update-options
4686Calls mairix binary for updating the database
4687(@code{nnmairix-update-database}). The default parameters are @code{-F}
4688and @code{-Q} for making this as fast as possible (see variable
4689@code{nnmairix-mairix-update-options} for defining these default
4690options).
4691
4692@item G b r
4693@kindex G b r (Group)
4694@findex nnmairix-group-toggle-readmarks-this-group
4695Keep articles in this @code{nnmairix} group always read or unread, or leave the
4696marks unchanged (@code{nnmairix-group-toggle-readmarks-this-group}).
4697
4698@item G b d
4699@kindex G b d (Group)
4700@findex nnmairix-group-delete-recreate-this-group
4701Recreate @code{nnmairix} group on the ``real'' mail back end
4702(@code{nnmairix-group-delete-recreate-this-group}). You can do this if
4703you always get wrong article counts with a @code{nnmairix} group.
4704
4705@item G b a
4706@kindex G b a (Group)
4707@findex nnmairix-group-toggle-allowfast-this-group
4708Toggles the @code{allow-fast} parameters for group under cursor
4709(@code{nnmairix-group-toggle-allowfast-this-group}). The default
4710behavior of @code{nnmairix} is to do a mairix search every time you
4711update or enter the group. With the @code{allow-fast} parameter set,
4712mairix will only be called when you explicitly update the group, but not
4713upon entering. This makes entering the group faster, but it may also
4714lead to dangling symlinks if something changed between updating and
4715entering the group which is not yet in the mairix database.
4716
4717@item G b p
4718@kindex G b p (Group)
4719@findex nnmairix-group-toggle-propmarks-this-group
4720Toggle marks propagation for this group
4721(@code{nnmairix-group-toggle-propmarks-this-group}). (@pxref{Propagating
4722marks}).
4723
4724@item G b o
4725@kindex G b o (Group)
4726@findex nnmairix-propagate-marks
4727Manually propagate marks (@code{nnmairix-propagate-marks}); needed only when
4728@code{nnmairix-propagate-marks-upon-close} is set to @code{nil}.
4729
4730@end table
4731
4732In summary mode:
4733
4734@table @kbd
4735
4736@item $ m
4737@kindex $ m (Summary)
4738@findex nnmairix-widget-search-from-this-article
4739Allows you to create a mairix query or group based on the current
4740message using graphical widgets (same as @code{nnmairix-widget-search})
4741(@code{nnmairix-widget-search-from-this-article}).
4742
4743@item $ g
4744@kindex $ g (Summary)
4745@findex nnmairix-create-search-group-from-message
4746Interactively creates a new search group with query based on the current
4747message, but uses the minibuffer instead of graphical widgets
4748(@code{nnmairix-create-search-group-from-message}).
4749
4750@item $ t
4751@kindex $ t (Summary)
4752@findex nnmairix-search-thread-this-article
4753Searches thread for the current article
4754(@code{nnmairix-search-thread-this-article}). This is effectively a
4755shortcut for calling @code{nnmairix-search} with @samp{m:msgid} of the
4756current article and enabled threads.
4757
4758@item $ f
4759@kindex $ f (Summary)
4760@findex nnmairix-search-from-this-article
4761Searches all messages from sender of the current article
4762(@code{nnmairix-search-from-this-article}). This is a shortcut for
4763calling @code{nnmairix-search} with @samp{f:From}.
4764
4765@item $ o
4766@kindex $ o (Summary)
4767@findex nnmairix-goto-original-article
4768(Only in @code{nnmairix} groups!) Tries determine the group this article
4769originally came from and displays the article in this group, so that
4770e.g. replying to this article the correct posting styles/group
4771parameters are applied (@code{nnmairix-goto-original-article}). This
4772function will use the registry if available, but can also parse the
2b968687 4773article file name as a fallback method.
e6d2d263
MB
4774
4775@item $ u
4776@kindex $ u (Summary)
4777@findex nnmairix-remove-tick-mark-original-article
4778Remove possibly existing tick mark from original article
4779(@code{nnmairix-remove-tick-mark-original-article}). (@pxref{nnmairix
4780tips and tricks}).
4781
4782@end table
4783
4784@node Propagating marks
4785@subsubsection Propagating marks
4786
4787First of: you really need a patched mairix binary for using the marks
4788propagation feature efficiently. Otherwise, you would have to update
4789the mairix database all the time. You can get the patch at
4790
4791@uref{http://m61s02.vlinux.de/mairix-maildir-patch.tar}
4792
4793You need the mairix v0.21 source code for this patch; everything else
4794is explained in the accompanied readme file. If you don't want to use
4795marks propagation, you don't have to apply these patches, but they also
4796fix some annoyances regarding changing maildir flags, so it might still
4797be useful to you.
4798
4799With the patched mairix binary, you can use @code{nnmairix} as an
4800alternative to mail splitting (@pxref{Fancy Mail Splitting}). For
4801example, instead of splitting all mails from @samp{david@@foobar.com}
4802into a group, you can simply create a search group with the query
4803@samp{f:david@@foobar.com}. This is actually what ``smart folders'' are
4804all about: simply put everything in one mail folder and dynamically
4805create searches instead of splitting. This is more flexible, since you
4806can dynamically change your folders any time you want to. This also
4807implies that you will usually read your mails in the @code{nnmairix}
4808groups instead of your ``real'' mail groups.
4809
4810There is one problem, though: say you got a new mail from
2b968687 4811@samp{david@@foobar.com}; it will now show up in two groups, the
e6d2d263
MB
4812``real'' group (your INBOX, for example) and in the @code{nnmairix}
4813search group (provided you have updated the mairix database). Now you
4814enter the @code{nnmairix} group and read the mail. The mail will be
2b968687 4815marked as read, but only in the @code{nnmairix} group---in the ``real''
e6d2d263
MB
4816mail group it will be still shown as unread.
4817
4818You could now catch up the mail group (@pxref{Group Data}), but this is
4819tedious and error prone, since you may overlook mails you don't have
4820created @code{nnmairix} groups for. Of course, you could first use
4821@code{nnmairix-goto-original-article} (@pxref{nnmairix keyboard
4822shortcuts}) and then read the mail in the original group, but that's
4823even more cumbersome.
4824
4825Clearly, the easiest way would be if marks could somehow be
4826automatically set for the original article. This is exactly what
4827@emph{marks propagation} is about.
4828
4829Marks propagation is deactivated by default. You can activate it for a
4830certain @code{nnmairix} group with
4831@code{nnmairix-group-toggle-propmarks-this-group} (bound to @kbd{G b
4832p}). This function will warn you if you try to use it with your default
4833search group; the reason is that the default search group is used for
4834temporary searches, and it's easy to accidentally propagate marks from
4835this group. However, you can ignore this warning if you really want to.
4836
4837With marks propagation enabled, all the marks you set in a @code{nnmairix}
4838group should now be propagated to the original article. For example,
4839you can now tick an article (by default with @kbd{!}) and this mark should
4840magically be set for the original article, too.
4841
4842A few more remarks which you may or may not want to know:
4843
4844@vindex nnmairix-propagate-marks-upon-close
4845Marks will not be set immediately, but only upon closing a group. This
4846not only makes marks propagation faster, it also avoids problems with
4847dangling symlinks when dealing with maildir files (since changing flags
4848will change the file name). You can also control when to propagate marks
4849via @code{nnmairix-propagate-marks-upon-close} (see the doc-string for
4850details).
4851
4852Obviously, @code{nnmairix} will have to look up the original group for every
4853article you want to set marks for. If available, @code{nnmairix} will first use
4854the registry for determining the original group. The registry is very
4855fast, hence you should really, really enable the registry when using
4856marks propagation. If you don't have to worry about RAM and disc space,
4857set @code{gnus-registry-max-entries} to a large enough value; to be on
4858the safe side, choose roughly the amount of mails you index with mairix.
4859
4860@vindex nnmairix-only-use-registry
4861If you don't want to use the registry or the registry hasn't seen the
2b968687
MB
4862original article yet, @code{nnmairix} will use an additional mairix
4863search for determining the file name of the article. This, of course, is
4864way slower than the registry---if you set hundreds or even thousands of
4865marks this way, it might take some time. You can avoid this situation by
4866setting @code{nnmairix-only-use-registry} to t.
e6d2d263
MB
4867
4868Maybe you also want to propagate marks the other way round, i.e. if you
4869tick an article in a "real" mail group, you'd like to have the same
4870article in a @code{nnmairix} group ticked, too. For several good
4871reasons, this can only be done efficiently if you use maildir. To
4872immediately contradict myself, let me mention that it WON'T work with
4873@code{nnmaildir}, since @code{nnmaildir} stores the marks externally and
4874not in the file name. Therefore, propagating marks to @code{nnmairix}
4875groups will usually only work if you use an IMAP server which uses
4876maildir as its file format.
4877
4878@vindex nnmairix-propagate-marks-to-nnmairix-groups
4879If you work with this setup, just set
4880@code{nnmairix-propagate-marks-to-nnmairix-groups} to @code{t} and see what
4881happens. If you don't like what you see, just set it to @code{nil} again. One
4882problem might be that you get a wrong number of unread articles; this
4883usually happens when you delete or expire articles in the original
4884groups. When this happens, you can recreate the @code{nnmairix} group on the
4885back end using @kbd{G b d}.
4886
4887@node nnmairix tips and tricks
4888@subsubsection nnmairix tips and tricks
4889
4890@itemize
4891@item
4892Checking Mail
4893
4894@findex nnmairix-update-groups
4895I put all my important mail groups at group level 1. The mairix groups
4896have group level 5, so they do not get checked at start up (@pxref{Group
4897Levels}).
4898
4899I use the following to check for mails:
4900
4901@lisp
4902(defun my-check-mail-mairix-update (level)
4903 (interactive "P")
4904 ;; if no prefix given, set level=1
4905 (gnus-group-get-new-news (or level 1))
4906 (nnmairix-update-groups "mairixsearch" t t)
4907 (gnus-group-list-groups))
4908
4909(define-key gnus-group-mode-map "g" 'my-check-mail-mairix-update)
4910@end lisp
4911
4912Instead of @samp{"mairixsearch"} use the name of your @code{nnmairix}
4913server. See the doc string for @code{nnmairix-update-groups} for
4914details.
4915
4916@item
4917Example: search group for ticked articles
4918
4919For example, you can create a group for all ticked articles, where the
4920articles always stay unread:
4921
4922Hit @kbd{G b g}, enter group name (e.g. @samp{important}), use
4923@samp{F:f} as query and do not include threads.
4924
4925Now activate marks propagation for this group by using @kbd{G b p}. Then
4926activate the always-unread feature by using @kbd{G b r} twice.
4927
2b968687 4928So far so good---but how do you remove the tick marks in the @code{nnmairix}
e6d2d263
MB
4929group? There are two options: You may simply use
4930@code{nnmairix-remove-tick-mark-original-article} (bound to @kbd{$ u}) to remove
4931tick marks from the original article. The other possibility is to set
4932@code{nnmairix-propagate-marks-to-nnmairix-groups} to @code{t}, but see the above
4933comments about this option. If it works for you, the tick marks should
4934also exist in the @code{nnmairix} group and you can remove them as usual,
4935e.g. by marking an article as read.
4936
4937When you have removed a tick mark from the original article, this
4938article should vanish from the @code{nnmairix} group after you have updated the
4939mairix database and updated the group. Fortunately, there is a function
4940for doing exactly that: @code{nnmairix-update-groups}. See the previous code
4941snippet and the doc string for details.
4942
4943@item
4944Dealing with auto-subscription of mail groups
4945
4946As described before, all @code{nnmairix} groups are in fact stored on
4947the mail back end in the form @samp{zz_mairix-<NAME>-<NUMBER>}. You can
4948see them when you enter the back end server in the server buffer. You
4949should not subscribe these groups! Unfortunately, these groups will
2b968687 4950usually get @emph{auto-subscribed} when you use @code{nnmaildir} or
e6d2d263
MB
4951@code{nnml}, i.e. you will suddenly see groups of the form
4952@samp{zz_mairix*} pop up in your group buffer. If this happens to you,
4953simply kill these groups with C-k. For avoiding this, turn off
4954auto-subscription completely by setting the variable
4955@code{gnus-auto-subscribed-groups} to @code{nil} (@pxref{Filtering New
4956Groups}), or if you like to keep this feature use the following kludge
4957for turning it off for all groups beginning with @samp{zz_}:
4958
4959@lisp
4960(setq gnus-auto-subscribed-groups
4961 "^\\(nnml\\|nnfolder\\|nnmbox\\|nnmh\\|nnbabyl\\|nnmaildir\\).*:\\([^z]\\|z$\\|\\z[^z]\\|zz$\\|zz[^_]\\|zz_$\\).*")
4962@end lisp
4963
4964@end itemize
4965
4966@node nnmairix caveats
4967@subsubsection nnmairix caveats
4968
4969@itemize
4970@item
4971If you use the Gnus agent (@pxref{Gnus Unplugged}): don't agentize
4972@code{nnmairix} groups (though I have no idea what happens if you do).
4973
4974@item
4975If you use the Gnus registry: don't use the registry with
4976@code{nnmairix} groups (put them in
2b968687
MB
4977@code{gnus-registry-unfollowed-groups}). Be @emph{extra careful} if
4978you use @code{gnus-registry-split-fancy-with-parent}; mails which are
e6d2d263
MB
4979split into @code{nnmairix} groups are usually gone for good as soon as
4980you check the group for new mail (yes, it has happened to me...).
4981
4982@item
2b968687 4983Therefore: @emph{Never ever} put ``real'' mails into @code{nnmairix}
e6d2d263
MB
4984groups (you shouldn't be able to, anyway).
4985
4986@item
4987mairix does only support us-ascii characters.
4988
4989@item
4990@code{nnmairix} uses a rather brute force method to force Gnus to
4991completely reread the group on the mail back end after mairix was
2b968687 4992called---it simply deletes and re-creates the group on the mail
e6d2d263
MB
4993back end. So far, this has worked for me without any problems, and I
4994don't see how @code{nnmairix} could delete other mail groups than its
4995own, but anyway: you really should have a backup of your mail
4996folders.
4997
4998@item
4999All necessary information is stored in the group parameters
5000(@pxref{Group Parameters}). This has the advantage that no active file
5001is needed, but also implies that when you kill a @code{nnmairix} group,
5002it is gone for good.
5003
5004@item
5005@findex nnmairix-purge-old-groups
5006If you create and kill a lot of @code{nnmairix} groups, the
5007``zz_mairix-*'' groups will accumulate on the mail back end server. To
5008delete old groups which are no longer needed, call
5009@code{nnmairix-purge-old-groups}. Note that this assumes that you don't
5010save any ``real'' mail in folders of the form
5011@code{zz_mairix-<NAME>-<NUMBER>}. You can change the prefix of
5012@code{nnmairix} groups by changing the variable
5013@code{nnmairix-group-prefix}.
5014
5015@item
2b968687 5016The following only applies if you @emph{don't} use the mentioned patch
e6d2d263
MB
5017for mairix (@pxref{Propagating marks}):
5018
5019A problem can occur when using @code{nnmairix} with maildir folders and
5020comes with the fact that maildir stores mail flags like @samp{Seen} or
5021@samp{Replied} by appending chars @samp{S} and @samp{R} to the message
5022file name, respectively. This implies that currently you would have to
5023update the mairix database not only when new mail arrives, but also when
5024mail flags are changing. The same applies to new mails which are indexed
5025while they are still in the @samp{new} folder but then get moved to
5026@samp{cur} when Gnus has seen the mail. If you don't update the database
5027after this has happened, a mairix query can lead to symlinks pointing to
5028non-existing files. In Gnus, these messages will usually appear with
5029``(none)'' entries in the header and can't be accessed. If this happens
5030to you, using @kbd{G b u} and updating the group will usually fix this.
5031
5032@end itemize
5033
4009494e
GM
5034@node Misc Group Stuff
5035@section Misc Group Stuff
5036
5037@menu
5038* Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
5039* Group Information:: Information and help on groups and Gnus.
5040* Group Timestamp:: Making Gnus keep track of when you last read a group.
5041* File Commands:: Reading and writing the Gnus files.
5042* Sieve Commands:: Managing Sieve scripts.
5043@end menu
5044
5045@table @kbd
5046
5047@item v
5048@kindex v (Group)
5049@cindex keys, reserved for users (Group)
5050The key @kbd{v} is reserved for users. You can bind it to some
5051command or better use it as a prefix key. For example:
5052
5053@lisp
5054(define-key gnus-group-mode-map (kbd "v j d")
5055 (lambda ()
5056 (interactive)
5057 (gnus-group-jump-to-group "nndraft:drafts")))
5058@end lisp
5059
5060On keys reserved for users in Emacs and on keybindings in general
5061@xref{Keymaps, Keymaps, , emacs, The Emacs Editor}.
5062
5063@item ^
5064@kindex ^ (Group)
5065@findex gnus-group-enter-server-mode
5066Enter the server buffer (@code{gnus-group-enter-server-mode}).
5067@xref{Server Buffer}.
5068
5069@item a
5070@kindex a (Group)
5071@findex gnus-group-post-news
5072Start composing a message (a news by default)
5073(@code{gnus-group-post-news}). If given a prefix, post to the group
5074under the point. If the prefix is 1, prompt for a group to post to.
5075Contrary to what the name of this function suggests, the prepared
5076article might be a mail instead of a news, if a mail group is specified
5077with the prefix argument. @xref{Composing Messages}.
5078
5079@item m
5080@kindex m (Group)
5081@findex gnus-group-mail
5082Mail a message somewhere (@code{gnus-group-mail}). If given a prefix,
5083use the posting style of the group under the point. If the prefix is 1,
5084prompt for a group name to find the posting style.
5085@xref{Composing Messages}.
5086
5087@item i
5088@kindex i (Group)
5089@findex gnus-group-news
5090Start composing a news (@code{gnus-group-news}). If given a prefix,
5091post to the group under the point. If the prefix is 1, prompt
5092for group to post to. @xref{Composing Messages}.
5093
5094This function actually prepares a news even when using mail groups.
5095This is useful for ``posting'' messages to mail groups without actually
5096sending them over the network: they're just saved directly to the group
5097in question. The corresponding back end must have a request-post method
5098for this to work though.
5099
01c52d31
MB
5100@item G z
5101@kindex G z (Group)
5102@findex gnus-group-compact-group
5103
5104Compact the group under point (@code{gnus-group-compact-group}).
5105Currently implemented only in nnml (@pxref{Mail Spool}). This removes
5106gaps between article numbers, hence getting a correct total article
5107count.
5108
4009494e
GM
5109@end table
5110
5111Variables for the group buffer:
5112
5113@table @code
5114
5115@item gnus-group-mode-hook
5116@vindex gnus-group-mode-hook
5117is called after the group buffer has been
5118created.
5119
5120@item gnus-group-prepare-hook
5121@vindex gnus-group-prepare-hook
5122is called after the group buffer is
5123generated. It may be used to modify the buffer in some strange,
5124unnatural way.
5125
5126@item gnus-group-prepared-hook
5127@vindex gnus-group-prepare-hook
5128is called as the very last thing after the group buffer has been
5129generated. It may be used to move point around, for instance.
5130
5131@item gnus-permanently-visible-groups
5132@vindex gnus-permanently-visible-groups
5133Groups matching this regexp will always be listed in the group buffer,
5134whether they are empty or not.
5135
4009494e
GM
5136@end table
5137
5138@node Scanning New Messages
5139@subsection Scanning New Messages
5140@cindex new messages
5141@cindex scanning new news
5142
5143@table @kbd
5144
5145@item g
5146@kindex g (Group)
5147@findex gnus-group-get-new-news
5148@c @icon{gnus-group-get-new-news}
5149Check the server(s) for new articles. If the numerical prefix is used,
5150this command will check only groups of level @var{arg} and lower
5151(@code{gnus-group-get-new-news}). If given a non-numerical prefix, this
5152command will force a total re-reading of the active file(s) from the
5153back end(s).
5154
5155@item M-g
5156@kindex M-g (Group)
5157@findex gnus-group-get-new-news-this-group
5158@vindex gnus-goto-next-group-when-activating
5159@c @icon{gnus-group-get-new-news-this-group}
5160Check whether new articles have arrived in the current group
5161(@code{gnus-group-get-new-news-this-group}).
5162@code{gnus-goto-next-group-when-activating} says whether this command is
5163to move point to the next group or not. It is @code{t} by default.
5164
5165@findex gnus-activate-all-groups
5166@cindex activating groups
5167@item C-c M-g
5168@kindex C-c M-g (Group)
5169Activate absolutely all groups (@code{gnus-activate-all-groups}).
5170
5171@item R
5172@kindex R (Group)
5173@cindex restarting
5174@findex gnus-group-restart
5175Restart Gnus (@code{gnus-group-restart}). This saves the @file{.newsrc}
5176file(s), closes the connection to all servers, clears up all run-time
5177Gnus variables, and then starts Gnus all over again.
5178
5179@end table
5180
5181@vindex gnus-get-new-news-hook
5182@code{gnus-get-new-news-hook} is run just before checking for new news.
5183
5184@vindex gnus-after-getting-new-news-hook
5185@code{gnus-after-getting-new-news-hook} is run after checking for new
5186news.
5187
5188
5189@node Group Information
5190@subsection Group Information
5191@cindex group information
5192@cindex information on groups
5193
5194@table @kbd
5195
5196
5197@item H f
5198@kindex H f (Group)
5199@findex gnus-group-fetch-faq
5200@vindex gnus-group-faq-directory
5201@cindex FAQ
5202@cindex ange-ftp
5203Try to fetch the @acronym{FAQ} for the current group
5204(@code{gnus-group-fetch-faq}). Gnus will try to get the @acronym{FAQ}
5205from @code{gnus-group-faq-directory}, which is usually a directory on
5206a remote machine. This variable can also be a list of directories.
5207In that case, giving a prefix to this command will allow you to choose
5208between the various sites. @code{ange-ftp} (or @code{efs}) will be
5209used for fetching the file.
5210
5211If fetching from the first site is unsuccessful, Gnus will attempt to go
5212through @code{gnus-group-faq-directory} and try to open them one by one.
5213
5214@item H c
5215@kindex H c (Group)
5216@findex gnus-group-fetch-charter
5217@vindex gnus-group-charter-alist
5218@cindex charter
5219Try to open the charter for the current group in a web browser
5220(@code{gnus-group-fetch-charter}). Query for a group if given a
5221prefix argument.
5222
5223Gnus will use @code{gnus-group-charter-alist} to find the location of
5224the charter. If no location is known, Gnus will fetch the control
5225messages for the group, which in some cases includes the charter.
5226
5227@item H C
5228@kindex H C (Group)
5229@findex gnus-group-fetch-control
5230@vindex gnus-group-fetch-control-use-browse-url
5231@cindex control message
5232Fetch the control messages for the group from the archive at
5233@code{ftp.isc.org} (@code{gnus-group-fetch-control}). Query for a
5234group if given a prefix argument.
5235
5236If @code{gnus-group-fetch-control-use-browse-url} is non-@code{nil},
5237Gnus will open the control messages in a browser using
5238@code{browse-url}. Otherwise they are fetched using @code{ange-ftp}
5239and displayed in an ephemeral group.
5240
5241Note that the control messages are compressed. To use this command
5242you need to turn on @code{auto-compression-mode} (@pxref{Compressed
5243Files, ,Compressed Files, emacs, The Emacs Manual}).
5244
5245@item H d
5246@itemx C-c C-d
5247@c @icon{gnus-group-describe-group}
5248@kindex H d (Group)
5249@kindex C-c C-d (Group)
5250@cindex describing groups
5251@cindex group description
5252@findex gnus-group-describe-group
5253Describe the current group (@code{gnus-group-describe-group}). If given
5254a prefix, force Gnus to re-read the description from the server.
5255
5256@item M-d
5257@kindex M-d (Group)
5258@findex gnus-group-describe-all-groups
5259Describe all groups (@code{gnus-group-describe-all-groups}). If given a
5260prefix, force Gnus to re-read the description file from the server.
5261
5262@item H v
5263@itemx V
5264@kindex V (Group)
5265@kindex H v (Group)
5266@cindex version
5267@findex gnus-version
5268Display current Gnus version numbers (@code{gnus-version}).
5269
5270@item ?
5271@kindex ? (Group)
5272@findex gnus-group-describe-briefly
5273Give a very short help message (@code{gnus-group-describe-briefly}).
5274
5275@item C-c C-i
5276@kindex C-c C-i (Group)
5277@cindex info
5278@cindex manual
5279@findex gnus-info-find-node
5280Go to the Gnus info node (@code{gnus-info-find-node}).
5281@end table
5282
5283
5284@node Group Timestamp
5285@subsection Group Timestamp
5286@cindex timestamps
5287@cindex group timestamps
5288
5289It can be convenient to let Gnus keep track of when you last read a
5290group. To set the ball rolling, you should add
5291@code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}:
5292
5293@lisp
5294(add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
5295@end lisp
5296
5297After doing this, each time you enter a group, it'll be recorded.
5298
5299This information can be displayed in various ways---the easiest is to
5300use the @samp{%d} spec in the group line format:
5301
5302@lisp
5303(setq gnus-group-line-format
5304 "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n")
5305@end lisp
5306
5307This will result in lines looking like:
5308
5309@example
5310* 0: mail.ding 19961002T012943
5311 0: custom 19961002T012713
5312@end example
5313
5314As you can see, the date is displayed in compact ISO 8601 format. This
5315may be a bit too much, so to just display the date, you could say
5316something like:
5317
5318@lisp
5319(setq gnus-group-line-format
5320 "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n")
5321@end lisp
5322
5323If you would like greater control of the time format, you can use a
5324user-defined format spec. Something like the following should do the
5325trick:
5326
5327@lisp
5328(setq gnus-group-line-format
5329 "%M\%S\%p\%P\%5y: %(%-40,40g%) %ud\n")
5330(defun gnus-user-format-function-d (headers)
5331 (let ((time (gnus-group-timestamp gnus-tmp-group)))
5332 (if time
5333 (format-time-string "%b %d %H:%M" time)
5334 "")))
5335@end lisp
5336
5337
5338@node File Commands
5339@subsection File Commands
5340@cindex file commands
5341
5342@table @kbd
5343
5344@item r
5345@kindex r (Group)
5346@findex gnus-group-read-init-file
5347@vindex gnus-init-file
5348@cindex reading init file
5349Re-read the init file (@code{gnus-init-file}, which defaults to
5350@file{~/.gnus.el}) (@code{gnus-group-read-init-file}).
5351
5352@item s
5353@kindex s (Group)
5354@findex gnus-group-save-newsrc
5355@cindex saving .newsrc
5356Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted)
5357(@code{gnus-group-save-newsrc}). If given a prefix, force saving the
5358file(s) whether Gnus thinks it is necessary or not.
5359
5360@c @item Z
5361@c @kindex Z (Group)
5362@c @findex gnus-group-clear-dribble
5363@c Clear the dribble buffer (@code{gnus-group-clear-dribble}).
5364
5365@end table
5366
5367
5368@node Sieve Commands
5369@subsection Sieve Commands
5370@cindex group sieve commands
5371
5372Sieve is a server-side mail filtering language. In Gnus you can use
5373the @code{sieve} group parameter (@pxref{Group Parameters}) to specify
5374sieve rules that should apply to each group. Gnus provides two
5375commands to translate all these group parameters into a proper Sieve
5376script that can be transfered to the server somehow.
5377
5378@vindex gnus-sieve-file
5379@vindex gnus-sieve-region-start
5380@vindex gnus-sieve-region-end
5381The generated Sieve script is placed in @code{gnus-sieve-file} (by
5382default @file{~/.sieve}). The Sieve code that Gnus generate is placed
5383between two delimiters, @code{gnus-sieve-region-start} and
5384@code{gnus-sieve-region-end}, so you may write additional Sieve code
5385outside these delimiters that will not be removed the next time you
5386regenerate the Sieve script.
5387
5388@vindex gnus-sieve-crosspost
5389The variable @code{gnus-sieve-crosspost} controls how the Sieve script
5390is generated. If it is non-@code{nil} (the default) articles is
5391placed in all groups that have matching rules, otherwise the article
5392is only placed in the group with the first matching rule. For
5393example, the group parameter @samp{(sieve address "sender"
5394"owner-ding@@hpc.uh.edu")} will generate the following piece of Sieve
5395code if @code{gnus-sieve-crosspost} is @code{nil}. (When
5396@code{gnus-sieve-crosspost} is non-@code{nil}, it looks the same
5397except that the line containing the call to @code{stop} is removed.)
5398
5399@example
5400if address "sender" "owner-ding@@hpc.uh.edu" @{
5401 fileinto "INBOX.ding";
5402 stop;
5403@}
5404@end example
5405
5406@xref{Top, Emacs Sieve, Top, sieve, Emacs Sieve}.
5407
5408@table @kbd
5409
5410@item D g
5411@kindex D g (Group)
5412@findex gnus-sieve-generate
5413@vindex gnus-sieve-file
5414@cindex generating sieve script
5415Regenerate a Sieve script from the @code{sieve} group parameters and
5416put you into the @code{gnus-sieve-file} without saving it.
5417
5418@item D u
5419@kindex D u (Group)
5420@findex gnus-sieve-update
5421@vindex gnus-sieve-file
5422@cindex updating sieve script
5423Regenerates the Gnus managed part of @code{gnus-sieve-file} using the
5424@code{sieve} group parameters, save the file and upload it to the
5425server using the @code{sieveshell} program.
5426
5427@end table
5428
5429
5430@node Summary Buffer
5431@chapter Summary Buffer
5432@cindex summary buffer
5433
5434A line for each article is displayed in the summary buffer. You can
5435move around, read articles, post articles and reply to articles.
5436
5437The most common way to a summary buffer is to select a group from the
5438group buffer (@pxref{Selecting a Group}).
5439
5440You can have as many summary buffers open as you wish.
5441
5442You can customize the Summary Mode tool bar, see @kbd{M-x
5443customize-apropos RET gnus-summary-tool-bar}. This feature is only
5444available in Emacs.
5445
5446@kindex v (Summary)
5447@cindex keys, reserved for users (Summary)
5448The key @kbd{v} is reserved for users. You can bind it to some
5449command or better use it as a prefix key. For example:
5450@lisp
5451(define-key gnus-summary-mode-map (kbd "v -") "LrS") ;; lower subthread
5452@end lisp
5453
5454@menu
5455* Summary Buffer Format:: Deciding how the summary buffer is to look.
5456* Summary Maneuvering:: Moving around the summary buffer.
5457* Choosing Articles:: Reading articles.
5458* Paging the Article:: Scrolling the current article.
5459* Reply Followup and Post:: Posting articles.
5460* Delayed Articles:: Send articles at a later time.
5461* Marking Articles:: Marking articles as read, expirable, etc.
5462* Limiting:: You can limit the summary buffer.
5463* Threading:: How threads are made.
5464* Sorting the Summary Buffer:: How articles and threads are sorted.
5465* Asynchronous Fetching:: Gnus might be able to pre-fetch articles.
5466* Article Caching:: You may store articles in a cache.
5467* Persistent Articles:: Making articles expiry-resistant.
01c52d31 5468* Sticky Articles:: Article buffers that are not reused.
4009494e
GM
5469* Article Backlog:: Having already read articles hang around.
5470* Saving Articles:: Ways of customizing article saving.
5471* Decoding Articles:: Gnus can treat series of (uu)encoded articles.
5472* Article Treatment:: The article buffer can be mangled at will.
5473* MIME Commands:: Doing MIMEy things with the articles.
5474* Charsets:: Character set issues.
5475* Article Commands:: Doing various things with the article buffer.
5476* Summary Sorting:: Sorting the summary buffer in various ways.
5477* Finding the Parent:: No child support? Get the parent.
5478* Alternative Approaches:: Reading using non-default summaries.
5479* Tree Display:: A more visual display of threads.
5480* Mail Group Commands:: Some commands can only be used in mail groups.
5481* Various Summary Stuff:: What didn't fit anywhere else.
5482* Exiting the Summary Buffer:: Returning to the Group buffer,
5483 or reselecting the current group.
5484* Crosspost Handling:: How crossposted articles are dealt with.
5485* Duplicate Suppression:: An alternative when crosspost handling fails.
5486* Security:: Decrypt and Verify.
5487* Mailing List:: Mailing list minor mode.
5488@end menu
5489
5490
5491@node Summary Buffer Format
5492@section Summary Buffer Format
5493@cindex summary buffer format
5494
5495@iftex
5496@iflatex
5497\gnusfigure{The Summary Buffer}{180}{
5498\put(0,0){\epsfig{figure=ps/summary,width=7.5cm}}
5499\put(445,0){\makebox(0,0)[br]{\epsfig{figure=ps/summary-article,width=7.5cm}}}
5500}
5501@end iflatex
5502@end iftex
5503
5504@menu
5505* Summary Buffer Lines:: You can specify how summary lines should look.
5506* To From Newsgroups:: How to not display your own name.
5507* Summary Buffer Mode Line:: You can say how the mode line should look.
5508* Summary Highlighting:: Making the summary buffer all pretty and nice.
5509@end menu
5510
5511@findex mail-extract-address-components
5512@findex gnus-extract-address-components
5513@vindex gnus-extract-address-components
5514Gnus will use the value of the @code{gnus-extract-address-components}
5515variable as a function for getting the name and address parts of a
5516@code{From} header. Two pre-defined functions exist:
5517@code{gnus-extract-address-components}, which is the default, quite
5518fast, and too simplistic solution; and
5519@code{mail-extract-address-components}, which works very nicely, but is
5520slower. The default function will return the wrong answer in 5% of the
5521cases. If this is unacceptable to you, use the other function instead:
5522
5523@lisp
5524(setq gnus-extract-address-components
5525 'mail-extract-address-components)
5526@end lisp
5527
5528@vindex gnus-summary-same-subject
5529@code{gnus-summary-same-subject} is a string indicating that the current
5530article has the same subject as the previous. This string will be used
5531with those specs that require it. The default is @code{""}.
5532
5533
5534@node Summary Buffer Lines
5535@subsection Summary Buffer Lines
5536
5537@vindex gnus-summary-line-format
5538You can change the format of the lines in the summary buffer by changing
5539the @code{gnus-summary-line-format} variable. It works along the same
5540lines as a normal @code{format} string, with some extensions
5541(@pxref{Formatting Variables}).
5542
5543There should always be a colon or a point position marker on the line;
5544the cursor always moves to the point position marker or the colon after
5545performing an operation. (Of course, Gnus wouldn't be Gnus if it wasn't
5546possible to change this. Just write a new function
5547@code{gnus-goto-colon} which does whatever you like with the cursor.)
5548@xref{Positioning Point}.
5549
5550The default string is @samp{%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n}.
5551
5552The following format specification characters and extended format
5553specification(s) are understood:
5554
5555@table @samp
5556@item N
5557Article number.
5558@item S
5559Subject string. List identifiers stripped,
5560@code{gnus-list-identifiers}. @xref{Article Hiding}.
5561@item s
5562Subject if the article is the root of the thread or the previous article
5563had a different subject, @code{gnus-summary-same-subject} otherwise.
5564(@code{gnus-summary-same-subject} defaults to @code{""}.)
5565@item F
5566Full @code{From} header.
5567@item n
5568The name (from the @code{From} header).
5569@item f
5570The name, @code{To} header or the @code{Newsgroups} header (@pxref{To
5571From Newsgroups}).
5572@item a
5573The name (from the @code{From} header). This differs from the @code{n}
5574spec in that it uses the function designated by the
5575@code{gnus-extract-address-components} variable, which is slower, but
5576may be more thorough.
5577@item A
5578The address (from the @code{From} header). This works the same way as
5579the @code{a} spec.
5580@item L
5581Number of lines in the article.
5582@item c
5583Number of characters in the article. This specifier is not supported
5584in some methods (like nnfolder).
5585@item k
5586Pretty-printed version of the number of characters in the article;
5587for example, @samp{1.2k} or @samp{0.4M}.
5588@item I
5589Indentation based on thread level (@pxref{Customizing Threading}).
5590@item B
5591A complex trn-style thread tree, showing response-connecting trace
5592lines. A thread could be drawn like this:
5593
5594@example
5595>
5596+->
5597| +->
5598| | \->
5599| | \->
5600| \->
5601+->
5602\->
5603@end example
5604
5605You can customize the appearance with the following options. Note
5606that it is possible to make the thread display look really neat by
5607replacing the default @acronym{ASCII} characters with graphic
5608line-drawing glyphs.
5609@table @code
5610@item gnus-sum-thread-tree-root
5611@vindex gnus-sum-thread-tree-root
5612Used for the root of a thread. If @code{nil}, use subject
5613instead. The default is @samp{> }.
5614
5615@item gnus-sum-thread-tree-false-root
5616@vindex gnus-sum-thread-tree-false-root
5617Used for the false root of a thread (@pxref{Loose Threads}). If
5618@code{nil}, use subject instead. The default is @samp{> }.
5619
5620@item gnus-sum-thread-tree-single-indent
5621@vindex gnus-sum-thread-tree-single-indent
5622Used for a thread with just one message. If @code{nil}, use subject
5623instead. The default is @samp{}.
5624
5625@item gnus-sum-thread-tree-vertical
5626@vindex gnus-sum-thread-tree-vertical
5627Used for drawing a vertical line. The default is @samp{| }.
5628
5629@item gnus-sum-thread-tree-indent
5630@vindex gnus-sum-thread-tree-indent
5631Used for indenting. The default is @samp{ }.
5632
5633@item gnus-sum-thread-tree-leaf-with-other
5634@vindex gnus-sum-thread-tree-leaf-with-other
5635Used for a leaf with brothers. The default is @samp{+-> }.
5636
5637@item gnus-sum-thread-tree-single-leaf
5638@vindex gnus-sum-thread-tree-single-leaf
5639Used for a leaf without brothers. The default is @samp{\-> }
5640
5641@end table
5642
5643@item T
5644Nothing if the article is a root and lots of spaces if it isn't (it
5645pushes everything after it off the screen).
5646@item [
5647Opening bracket, which is normally @samp{[}, but can also be @samp{<}
5648for adopted articles (@pxref{Customizing Threading}).
5649@item ]
5650Closing bracket, which is normally @samp{]}, but can also be @samp{>}
5651for adopted articles.
5652@item >
5653One space for each thread level.
5654@item <
5655Twenty minus thread level spaces.
5656@item U
5657Unread. @xref{Read Articles}.
5658
5659@item R
5660This misleadingly named specifier is the @dfn{secondary mark}. This
5661mark will say whether the article has been replied to, has been cached,
5662or has been saved. @xref{Other Marks}.
5663
5664@item i
5665Score as a number (@pxref{Scoring}).
5666@item z
5667@vindex gnus-summary-zcore-fuzz
5668Zcore, @samp{+} if above the default level and @samp{-} if below the
5669default level. If the difference between
5670@code{gnus-summary-default-score} and the score is less than
5671@code{gnus-summary-zcore-fuzz}, this spec will not be used.
5672@item V
5673Total thread score.
5674@item x
5675@code{Xref}.
5676@item D
5677@code{Date}.
5678@item d
5679The @code{Date} in @code{DD-MMM} format.
5680@item o
5681The @code{Date} in @var{YYYYMMDD}@code{T}@var{HHMMSS} format.
5682@item M
5683@code{Message-ID}.
5684@item r
5685@code{References}.
5686@item t
5687Number of articles in the current sub-thread. Using this spec will slow
5688down summary buffer generation somewhat.
5689@item e
5690An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the
5691article has any children.
5692@item P
5693The line number.
5694@item O
5695Download mark.
5696@item *
5697Desired cursor position (instead of after first colon).
5698@item &user-date;
5699Age sensitive date format. Various date format is defined in
5700@code{gnus-user-date-format-alist}.
5701@item u
5702User defined specifier. The next character in the format string should
5703be a letter. Gnus will call the function
5704@code{gnus-user-format-function-@var{x}}, where @var{x} is the letter
5705following @samp{%u}. The function will be passed the current header as
5706argument. The function should return a string, which will be inserted
5707into the summary just like information from any other summary specifier.
5708@end table
5709
5710Text between @samp{%(} and @samp{%)} will be highlighted with
5711@code{gnus-mouse-face} when the mouse point is placed inside the area.
5712There can only be one such area.
5713
5714The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs
5715have to be handled with care. For reasons of efficiency, Gnus will
5716compute what column these characters will end up in, and ``hard-code''
5717that. This means that it is invalid to have these specs after a
5718variable-length spec. Well, you might not be arrested, but your summary
5719buffer will look strange, which is bad enough.
5720
5721The smart choice is to have these specs as far to the left as possible.
5722(Isn't that the case with everything, though? But I digress.)
5723
5724This restriction may disappear in later versions of Gnus.
5725
5726
5727@node To From Newsgroups
5728@subsection To From Newsgroups
5729@cindex To
5730@cindex Newsgroups
5731
5732In some groups (particularly in archive groups), the @code{From} header
5733isn't very interesting, since all the articles there are written by
5734you. To display the information in the @code{To} or @code{Newsgroups}
5735headers instead, you need to decide three things: What information to
5736gather; where to display it; and when to display it.
5737
5738@enumerate
5739@item
5740@vindex gnus-extra-headers
5741The reading of extra header information is controlled by the
5742@code{gnus-extra-headers}. This is a list of header symbols. For
5743instance:
5744
5745@lisp
5746(setq gnus-extra-headers
5747 '(To Newsgroups X-Newsreader))
5748@end lisp
5749
5750This will result in Gnus trying to obtain these three headers, and
5751storing it in header structures for later easy retrieval.
5752
5753@item
5754@findex gnus-extra-header
5755The value of these extra headers can be accessed via the
5756@code{gnus-extra-header} function. Here's a format line spec that will
5757access the @code{X-Newsreader} header:
5758
5759@example
5760"%~(form (gnus-extra-header 'X-Newsreader))@@"
5761@end example
5762
5763@item
5764@vindex gnus-ignored-from-addresses
5765The @code{gnus-ignored-from-addresses} variable says when the @samp{%f}
5766summary line spec returns the @code{To}, @code{Newsreader} or
5767@code{From} header. If this regexp matches the contents of the
5768@code{From} header, the value of the @code{To} or @code{Newsreader}
5769headers are used instead.
5770
01c52d31
MB
5771To distinguish regular articles from those where the @code{From} field
5772has been swapped, a string is prefixed to the @code{To} or
5773@code{Newsgroups} header in the summary line. By default the string is
5774@samp{-> } for @code{To} and @samp{=> } for @code{Newsgroups}, you can
5775customize these strings with @code{gnus-summary-to-prefix} and
5776@code{gnus-summary-newsgroup-prefix}.
5777
4009494e
GM
5778@end enumerate
5779
5780@vindex nnmail-extra-headers
5781A related variable is @code{nnmail-extra-headers}, which controls when
5782to include extra headers when generating overview (@acronym{NOV}) files.
5783If you have old overview files, you should regenerate them after
5784changing this variable, by entering the server buffer using @kbd{^},
5785and then @kbd{g} on the appropriate mail server (e.g. nnml) to cause
5786regeneration.
5787
5788@vindex gnus-summary-line-format
5789You also have to instruct Gnus to display the data by changing the
5790@code{%n} spec to the @code{%f} spec in the
5791@code{gnus-summary-line-format} variable.
5792
5793In summary, you'd typically put something like the following in
5794@file{~/.gnus.el}:
5795
5796@lisp
5797(setq gnus-extra-headers
5798 '(To Newsgroups))
5799(setq nnmail-extra-headers gnus-extra-headers)
5800(setq gnus-summary-line-format
5801 "%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n")
5802(setq gnus-ignored-from-addresses
5803 "Your Name Here")
5804@end lisp
5805
5806(The values listed above are the default values in Gnus. Alter them
5807to fit your needs.)
5808
5809A note for news server administrators, or for users who wish to try to
5810convince their news server administrator to provide some additional
5811support:
5812
5813The above is mostly useful for mail groups, where you have control over
5814the @acronym{NOV} files that are created. However, if you can persuade your
5815nntp admin to add (in the usual implementation, notably INN):
5816
5817@example
5818Newsgroups:full
5819@end example
5820
5821to the end of her @file{overview.fmt} file, then you can use that just
5822as you would the extra headers from the mail groups.
5823
5824
5825@node Summary Buffer Mode Line
5826@subsection Summary Buffer Mode Line
5827
5828@vindex gnus-summary-mode-line-format
5829You can also change the format of the summary mode bar (@pxref{Mode Line
5830Formatting}). Set @code{gnus-summary-mode-line-format} to whatever you
5831like. The default is @samp{Gnus: %%b [%A] %Z}.
5832
5833Here are the elements you can play with:
5834
5835@table @samp
5836@item G
5837Group name.
5838@item p
5839Unprefixed group name.
5840@item A
5841Current article number.
5842@item z
5843Current article score.
5844@item V
5845Gnus version.
5846@item U
5847Number of unread articles in this group.
5848@item e
5849Number of unread articles in this group that aren't displayed in the
5850summary buffer.
5851@item Z
5852A string with the number of unread and unselected articles represented
5853either as @samp{<%U(+%e) more>} if there are both unread and unselected
5854articles, and just as @samp{<%U more>} if there are just unread articles
5855and no unselected ones.
5856@item g
5857Shortish group name. For instance, @samp{rec.arts.anime} will be
5858shortened to @samp{r.a.anime}.
5859@item S
5860Subject of the current article.
5861@item u
5862User-defined spec (@pxref{User-Defined Specs}).
5863@item s
5864Name of the current score file (@pxref{Scoring}).
5865@item d
5866Number of dormant articles (@pxref{Unread Articles}).
5867@item t
5868Number of ticked articles (@pxref{Unread Articles}).
5869@item r
5870Number of articles that have been marked as read in this session.
5871@item E
5872Number of articles expunged by the score files.
5873@end table
5874
5875
5876@node Summary Highlighting
5877@subsection Summary Highlighting
5878
5879@table @code
5880
5881@item gnus-visual-mark-article-hook
5882@vindex gnus-visual-mark-article-hook
5883This hook is run after selecting an article. It is meant to be used for
5884highlighting the article in some way. It is not run if
5885@code{gnus-visual} is @code{nil}.
5886
5887@item gnus-summary-update-hook
5888@vindex gnus-summary-update-hook
5889This hook is called when a summary line is changed. It is not run if
5890@code{gnus-visual} is @code{nil}.
5891
5892@item gnus-summary-selected-face
5893@vindex gnus-summary-selected-face
5894This is the face (or @dfn{font} as some people call it) used to
5895highlight the current article in the summary buffer.
5896
5897@item gnus-summary-highlight
5898@vindex gnus-summary-highlight
5899Summary lines are highlighted according to this variable, which is a
5900list where the elements are of the format @code{(@var{form}
5901. @var{face})}. If you would, for instance, like ticked articles to be
5902italic and high-scored articles to be bold, you could set this variable
5903to something like
5904@lisp
5905(((eq mark gnus-ticked-mark) . italic)
5906 ((> score default) . bold))
5907@end lisp
5908As you may have guessed, if @var{form} returns a non-@code{nil} value,
5909@var{face} will be applied to the line.
5910@end table
5911
5912
5913@node Summary Maneuvering
5914@section Summary Maneuvering
5915@cindex summary movement
5916
5917All the straight movement commands understand the numeric prefix and
5918behave pretty much as you'd expect.
5919
5920None of these commands select articles.
5921
5922@table @kbd
5923@item G M-n
5924@itemx M-n
5925@kindex M-n (Summary)
5926@kindex G M-n (Summary)
5927@findex gnus-summary-next-unread-subject
5928Go to the next summary line of an unread article
5929(@code{gnus-summary-next-unread-subject}).
5930
5931@item G M-p
5932@itemx M-p
5933@kindex M-p (Summary)
5934@kindex G M-p (Summary)
5935@findex gnus-summary-prev-unread-subject
5936Go to the previous summary line of an unread article
5937(@code{gnus-summary-prev-unread-subject}).
5938
5939@item G g
5940@kindex G g (Summary)
5941@findex gnus-summary-goto-subject
5942Ask for an article number and then go to the summary line of that article
5943without displaying the article (@code{gnus-summary-goto-subject}).
5944@end table
5945
5946If Gnus asks you to press a key to confirm going to the next group, you
5947can use the @kbd{C-n} and @kbd{C-p} keys to move around the group
5948buffer, searching for the next group to read without actually returning
5949to the group buffer.
5950
5951Variables related to summary movement:
5952
5953@table @code
5954
5955@vindex gnus-auto-select-next
5956@item gnus-auto-select-next
5957If you issue one of the movement commands (like @kbd{n}) and there are
5958no more unread articles after the current one, Gnus will offer to go to
5959the next group. If this variable is @code{t} and the next group is
5960empty, Gnus will exit summary mode and return to the group buffer. If
5961this variable is neither @code{t} nor @code{nil}, Gnus will select the
5962next group with unread articles. As a special case, if this variable
5963is @code{quietly}, Gnus will select the next group without asking for
5964confirmation. If this variable is @code{almost-quietly}, the same
5965will happen only if you are located on the last article in the group.
5966Finally, if this variable is @code{slightly-quietly}, the @kbd{Z n}
5967command will go to the next group without confirmation. Also
5968@pxref{Group Levels}.
5969
5970@item gnus-auto-select-same
5971@vindex gnus-auto-select-same
5972If non-@code{nil}, all the movement commands will try to go to the next
5973article with the same subject as the current. (@dfn{Same} here might
5974mean @dfn{roughly equal}. See @code{gnus-summary-gather-subject-limit}
5975for details (@pxref{Customizing Threading}).) If there are no more
5976articles with the same subject, go to the first unread article.
5977
5978This variable is not particularly useful if you use a threaded display.
5979
5980@item gnus-summary-check-current
5981@vindex gnus-summary-check-current
5982If non-@code{nil}, all the ``unread'' movement commands will not proceed
5983to the next (or previous) article if the current article is unread.
5984Instead, they will choose the current article.
5985
5986@item gnus-auto-center-summary
5987@vindex gnus-auto-center-summary
5988If non-@code{nil}, Gnus will keep the point in the summary buffer
5989centered at all times. This makes things quite tidy, but if you have a
5990slow network connection, or simply do not like this un-Emacsism, you can
5991set this variable to @code{nil} to get the normal Emacs scrolling
5992action. This will also inhibit horizontal re-centering of the summary
5993buffer, which might make it more inconvenient to read extremely long
5994threads.
5995
5996This variable can also be a number. In that case, center the window at
5997the given number of lines from the top.
5998
5999@end table
6000
6001
6002@node Choosing Articles
6003@section Choosing Articles
6004@cindex selecting articles
6005
6006@menu
6007* Choosing Commands:: Commands for choosing articles.
6008* Choosing Variables:: Variables that influence these commands.
6009@end menu
6010
6011
6012@node Choosing Commands
6013@subsection Choosing Commands
6014
6015None of the following movement commands understand the numeric prefix,
6016and they all select and display an article.
6017
6018If you want to fetch new articles or redisplay the group, see
6019@ref{Exiting the Summary Buffer}.
6020
6021@table @kbd
6022@item SPACE
6023@kindex SPACE (Summary)
6024@findex gnus-summary-next-page
6025Select the current article, or, if that one's read already, the next
6026unread article (@code{gnus-summary-next-page}).
6027
6028If you have an article window open already and you press @kbd{SPACE}
6029again, the article will be scrolled. This lets you conveniently
6030@kbd{SPACE} through an entire newsgroup. @xref{Paging the Article}.
6031
6032@item G n
6033@itemx n
6034@kindex n (Summary)
6035@kindex G n (Summary)
6036@findex gnus-summary-next-unread-article
6037@c @icon{gnus-summary-next-unread}
6038Go to next unread article (@code{gnus-summary-next-unread-article}).
6039
6040@item G p
6041@itemx p
6042@kindex p (Summary)
6043@findex gnus-summary-prev-unread-article
6044@c @icon{gnus-summary-prev-unread}
6045Go to previous unread article (@code{gnus-summary-prev-unread-article}).
6046
6047@item G N
6048@itemx N
6049@kindex N (Summary)
6050@kindex G N (Summary)
6051@findex gnus-summary-next-article
6052Go to the next article (@code{gnus-summary-next-article}).
6053
6054@item G P
6055@itemx P
6056@kindex P (Summary)
6057@kindex G P (Summary)
6058@findex gnus-summary-prev-article
6059Go to the previous article (@code{gnus-summary-prev-article}).
6060
6061@item G C-n
6062@kindex G C-n (Summary)
6063@findex gnus-summary-next-same-subject
6064Go to the next article with the same subject
6065(@code{gnus-summary-next-same-subject}).
6066
6067@item G C-p
6068@kindex G C-p (Summary)
6069@findex gnus-summary-prev-same-subject
6070Go to the previous article with the same subject
6071(@code{gnus-summary-prev-same-subject}).
6072
6073@item G f
6074@itemx .
6075@kindex G f (Summary)
6076@kindex . (Summary)
6077@findex gnus-summary-first-unread-article
6078Go to the first unread article
6079(@code{gnus-summary-first-unread-article}).
6080
6081@item G b
6082@itemx ,
6083@kindex G b (Summary)
6084@kindex , (Summary)
6085@findex gnus-summary-best-unread-article
6086Go to the unread article with the highest score
6087(@code{gnus-summary-best-unread-article}). If given a prefix argument,
6088go to the first unread article that has a score over the default score.
6089
6090@item G l
6091@itemx l
6092@kindex l (Summary)
6093@kindex G l (Summary)
6094@findex gnus-summary-goto-last-article
6095Go to the previous article read (@code{gnus-summary-goto-last-article}).
6096
6097@item G o
6098@kindex G o (Summary)
6099@findex gnus-summary-pop-article
6100@cindex history
6101@cindex article history
6102Pop an article off the summary history and go to this article
6103(@code{gnus-summary-pop-article}). This command differs from the
6104command above in that you can pop as many previous articles off the
6105history as you like, while @kbd{l} toggles the two last read articles.
6106For a somewhat related issue (if you use these commands a lot),
6107@pxref{Article Backlog}.
6108
6109@item G j
6110@itemx j
6111@kindex j (Summary)
6112@kindex G j (Summary)
6113@findex gnus-summary-goto-article
6114Ask for an article number or @code{Message-ID}, and then go to that
6115article (@code{gnus-summary-goto-article}).
6116
6117@end table
6118
6119
6120@node Choosing Variables
6121@subsection Choosing Variables
6122
6123Some variables relevant for moving and selecting articles:
6124
6125@table @code
6126@item gnus-auto-extend-newsgroup
6127@vindex gnus-auto-extend-newsgroup
6128All the movement commands will try to go to the previous (or next)
6129article, even if that article isn't displayed in the Summary buffer if
6130this variable is non-@code{nil}. Gnus will then fetch the article from
6131the server and display it in the article buffer.
6132
6133@item gnus-select-article-hook
6134@vindex gnus-select-article-hook
6135This hook is called whenever an article is selected. The default is
6136@code{nil}. If you would like each article to be saved in the Agent as
6137you read it, putting @code{gnus-agent-fetch-selected-article} on this
6138hook will do so.
6139
6140@item gnus-mark-article-hook
6141@vindex gnus-mark-article-hook
6142@findex gnus-summary-mark-unread-as-read
6143@findex gnus-summary-mark-read-and-unread-as-read
6144@findex gnus-unread-mark
6145This hook is called whenever an article is selected. It is intended to
6146be used for marking articles as read. The default value is
6147@code{gnus-summary-mark-read-and-unread-as-read}, and will change the
6148mark of almost any article you read to @code{gnus-read-mark}. The only
6149articles not affected by this function are ticked, dormant, and
6150expirable articles. If you'd instead like to just have unread articles
6151marked as read, you can use @code{gnus-summary-mark-unread-as-read}
6152instead. It will leave marks like @code{gnus-low-score-mark},
6153@code{gnus-del-mark} (and so on) alone.
6154
6155@end table
6156
6157
6158@node Paging the Article
6159@section Scrolling the Article
6160@cindex article scrolling
6161
6162@table @kbd
6163
6164@item SPACE
6165@kindex SPACE (Summary)
6166@findex gnus-summary-next-page
6167Pressing @kbd{SPACE} will scroll the current article forward one page,
6168or, if you have come to the end of the current article, will choose the
6169next article (@code{gnus-summary-next-page}).
6170
6171@vindex gnus-article-boring-faces
6172@vindex gnus-article-skip-boring
6173If @code{gnus-article-skip-boring} is non-@code{nil} and the rest of
6174the article consists only of citations and signature, then it will be
6175skipped; the next article will be shown instead. You can customize
6176what is considered uninteresting with
6177@code{gnus-article-boring-faces}. You can manually view the article's
6178pages, no matter how boring, using @kbd{C-M-v}.
6179
6180@item DEL
6181@kindex DEL (Summary)
6182@findex gnus-summary-prev-page
6183Scroll the current article back one page (@code{gnus-summary-prev-page}).
6184
6185@item RET
6186@kindex RET (Summary)
6187@findex gnus-summary-scroll-up
6188Scroll the current article one line forward
6189(@code{gnus-summary-scroll-up}).
6190
6191@item M-RET
6192@kindex M-RET (Summary)
6193@findex gnus-summary-scroll-down
6194Scroll the current article one line backward
6195(@code{gnus-summary-scroll-down}).
6196
6197@item A g
6198@itemx g
6199@kindex A g (Summary)
6200@kindex g (Summary)
6201@findex gnus-summary-show-article
6202@vindex gnus-summary-show-article-charset-alist
6203(Re)fetch the current article (@code{gnus-summary-show-article}). If
6204given a prefix, fetch the current article, but don't run any of the
6205article treatment functions. This will give you a ``raw'' article, just
6206the way it came from the server.
6207
6208If given a numerical prefix, you can do semi-manual charset stuff.
6209@kbd{C-u 0 g cn-gb-2312 RET} will decode the message as if it were
6210encoded in the @code{cn-gb-2312} charset. If you have
6211
6212@lisp
6213(setq gnus-summary-show-article-charset-alist
6214 '((1 . cn-gb-2312)
6215 (2 . big5)))
6216@end lisp
6217
6218then you can say @kbd{C-u 1 g} to get the same effect.
6219
6220@item A <
6221@itemx <
6222@kindex < (Summary)
6223@kindex A < (Summary)
6224@findex gnus-summary-beginning-of-article
6225Scroll to the beginning of the article
6226(@code{gnus-summary-beginning-of-article}).
6227
6228@item A >
6229@itemx >
6230@kindex > (Summary)
6231@kindex A > (Summary)
6232@findex gnus-summary-end-of-article
6233Scroll to the end of the article (@code{gnus-summary-end-of-article}).
6234
6235@item A s
6236@itemx s
6237@kindex A s (Summary)
6238@kindex s (Summary)
6239@findex gnus-summary-isearch-article
6240Perform an isearch in the article buffer
6241(@code{gnus-summary-isearch-article}).
6242
6243@item h
6244@kindex h (Summary)
6245@findex gnus-summary-select-article-buffer
6246Select the article buffer (@code{gnus-summary-select-article-buffer}).
6247
6248@end table
6249
6250
6251@node Reply Followup and Post
6252@section Reply, Followup and Post
6253
6254@menu
6255* Summary Mail Commands:: Sending mail.
6256* Summary Post Commands:: Sending news.
6257* Summary Message Commands:: Other Message-related commands.
6258* Canceling and Superseding::
6259@end menu
6260
6261
6262@node Summary Mail Commands
6263@subsection Summary Mail Commands
6264@cindex mail
6265@cindex composing mail
6266
6267Commands for composing a mail message:
6268
6269@table @kbd
6270
6271@item S r
6272@itemx r
6273@kindex S r (Summary)
6274@kindex r (Summary)
6275@findex gnus-summary-reply
6276@c @icon{gnus-summary-mail-reply}
6277@c @icon{gnus-summary-reply}
6278Mail a reply to the author of the current article
6279(@code{gnus-summary-reply}).
6280
6281@item S R
6282@itemx R
6283@kindex R (Summary)
6284@kindex S R (Summary)
6285@findex gnus-summary-reply-with-original
6286@c @icon{gnus-summary-reply-with-original}
6287Mail a reply to the author of the current article and include the
6288original message (@code{gnus-summary-reply-with-original}). This
6289command uses the process/prefix convention.
6290
6291@item S w
6292@kindex S w (Summary)
6293@findex gnus-summary-wide-reply
6294Mail a wide reply to the author of the current article
6295(@code{gnus-summary-wide-reply}). A @dfn{wide reply} is a reply that
6296goes out to all people listed in the @code{To}, @code{From} (or
6297@code{Reply-to}) and @code{Cc} headers. If @code{Mail-Followup-To} is
6298present, that's used instead.
6299
6300@item S W
6301@kindex S W (Summary)
6302@findex gnus-summary-wide-reply-with-original
6303Mail a wide reply to the current article and include the original
6304message (@code{gnus-summary-wide-reply-with-original}). This command uses
6305the process/prefix convention.
6306
6307@item S v
6308@kindex S v (Summary)
6309@findex gnus-summary-very-wide-reply
6310Mail a very wide reply to the author of the current article
6311(@code{gnus-summary-wide-reply}). A @dfn{very wide reply} is a reply
6312that goes out to all people listed in the @code{To}, @code{From} (or
6313@code{Reply-to}) and @code{Cc} headers in all the process/prefixed
6314articles. This command uses the process/prefix convention.
6315
6316@item S V
6317@kindex S V (Summary)
6318@findex gnus-summary-very-wide-reply-with-original
6319Mail a very wide reply to the author of the current article and include the
6320original message (@code{gnus-summary-very-wide-reply-with-original}). This
6321command uses the process/prefix convention.
6322
6323@item S B r
6324@kindex S B r (Summary)
6325@findex gnus-summary-reply-broken-reply-to
6326Mail a reply to the author of the current article but ignore the
6327@code{Reply-To} field (@code{gnus-summary-reply-broken-reply-to}).
6328If you need this because a mailing list incorrectly sets a
6329@code{Reply-To} header pointing to the list, you probably want to set
6330the @code{broken-reply-to} group parameter instead, so things will work
6331correctly. @xref{Group Parameters}.
6332
6333@item S B R
6334@kindex S B R (Summary)
6335@findex gnus-summary-reply-broken-reply-to-with-original
6336Mail a reply to the author of the current article and include the
6337original message but ignore the @code{Reply-To} field
6338(@code{gnus-summary-reply-broken-reply-to-with-original}).
6339
6340@item S o m
6341@itemx C-c C-f
6342@kindex S o m (Summary)
6343@kindex C-c C-f (Summary)
6344@findex gnus-summary-mail-forward
6345@c @icon{gnus-summary-mail-forward}
6346Forward the current article to some other person
6347(@code{gnus-summary-mail-forward}). If no prefix is given, the message
6348is forwarded according to the value of (@code{message-forward-as-mime})
6349and (@code{message-forward-show-mml}); if the prefix is 1, decode the
6350message and forward directly inline; if the prefix is 2, forward message
6351as an rfc822 @acronym{MIME} section; if the prefix is 3, decode message and
6352forward as an rfc822 @acronym{MIME} section; if the prefix is 4, forward message
6353directly inline; otherwise, the message is forwarded as no prefix given
6354but use the flipped value of (@code{message-forward-as-mime}). By
6355default, the message is decoded and forwarded as an rfc822 @acronym{MIME}
6356section.
6357
6358@item S m
6359@itemx m
6360@kindex m (Summary)
6361@kindex S m (Summary)
6362@findex gnus-summary-mail-other-window
6363@c @icon{gnus-summary-mail-originate}
6364Prepare a mail (@code{gnus-summary-mail-other-window}). By default, use
6365the posting style of the current group. If given a prefix, disable that.
6366If the prefix is 1, prompt for a group name to find the posting style.
6367
6368@item S i
6369@itemx i
6370@kindex i (Summary)
6371@kindex S i (Summary)
6372@findex gnus-summary-news-other-window
6373Prepare a news (@code{gnus-summary-news-other-window}). By default,
6374post to the current group. If given a prefix, disable that. If the
6375prefix is 1, prompt for a group to post to.
6376
6377This function actually prepares a news even when using mail groups.
6378This is useful for ``posting'' messages to mail groups without actually
6379sending them over the network: they're just saved directly to the group
6380in question. The corresponding back end must have a request-post method
6381for this to work though.
6382
6383@item S D b
6384@kindex S D b (Summary)
6385@findex gnus-summary-resend-bounced-mail
6386@cindex bouncing mail
6387If you have sent a mail, but the mail was bounced back to you for some
6388reason (wrong address, transient failure), you can use this command to
6389resend that bounced mail (@code{gnus-summary-resend-bounced-mail}). You
6390will be popped into a mail buffer where you can edit the headers before
6391sending the mail off again. If you give a prefix to this command, and
6392the bounced mail is a reply to some other mail, Gnus will try to fetch
6393that mail and display it for easy perusal of its headers. This might
6394very well fail, though.
6395
6396@item S D r
6397@kindex S D r (Summary)
6398@findex gnus-summary-resend-message
6399Not to be confused with the previous command,
6400@code{gnus-summary-resend-message} will prompt you for an address to
6401send the current message off to, and then send it to that place. The
6402headers of the message won't be altered---but lots of headers that say
6403@code{Resent-To}, @code{Resent-From} and so on will be added. This
6404means that you actually send a mail to someone that has a @code{To}
6405header that (probably) points to yourself. This will confuse people.
6406So, natcherly you'll only do that if you're really eVIl.
6407
6408This command is mainly used if you have several accounts and want to
6409ship a mail to a different account of yours. (If you're both
6410@code{root} and @code{postmaster} and get a mail for @code{postmaster}
6411to the @code{root} account, you may want to resend it to
6412@code{postmaster}. Ordnung muss sein!
6413
6414This command understands the process/prefix convention
6415(@pxref{Process/Prefix}).
6416
6417@item S D e
6418@kindex S D e (Summary)
6419@findex gnus-summary-resend-message-edit
6420
6421Like the previous command, but will allow you to edit the message as
6422if it were a new message before resending.
6423
6424@item S O m
6425@kindex S O m (Summary)
6426@findex gnus-uu-digest-mail-forward
6427Digest the current series (@pxref{Decoding Articles}) and forward the
6428result using mail (@code{gnus-uu-digest-mail-forward}). This command
6429uses the process/prefix convention (@pxref{Process/Prefix}).
6430
6431@item S M-c
6432@kindex S M-c (Summary)
6433@findex gnus-summary-mail-crosspost-complaint
6434@cindex crossposting
6435@cindex excessive crossposting
6436Send a complaint about excessive crossposting to the author of the
6437current article (@code{gnus-summary-mail-crosspost-complaint}).
6438
6439@findex gnus-crosspost-complaint
6440This command is provided as a way to fight back against the current
6441crossposting pandemic that's sweeping Usenet. It will compose a reply
6442using the @code{gnus-crosspost-complaint} variable as a preamble. This
6443command understands the process/prefix convention
6444(@pxref{Process/Prefix}) and will prompt you before sending each mail.
6445
6446@end table
6447
6448Also @xref{Header Commands, ,Header Commands, message, The Message
6449Manual}, for more information.
6450
6451
6452@node Summary Post Commands
6453@subsection Summary Post Commands
6454@cindex post
6455@cindex composing news
6456
6457Commands for posting a news article:
6458
6459@table @kbd
6460@item S p
6461@itemx a
6462@kindex a (Summary)
6463@kindex S p (Summary)
6464@findex gnus-summary-post-news
6465@c @icon{gnus-summary-post-news}
6466Prepare for posting an article (@code{gnus-summary-post-news}). By
6467default, post to the current group. If given a prefix, disable that.
6468If the prefix is 1, prompt for another group instead.
6469
6470@item S f
6471@itemx f
6472@kindex f (Summary)
6473@kindex S f (Summary)
6474@findex gnus-summary-followup
6475@c @icon{gnus-summary-followup}
6476Post a followup to the current article (@code{gnus-summary-followup}).
6477
6478@item S F
6479@itemx F
6480@kindex S F (Summary)
6481@kindex F (Summary)
6482@c @icon{gnus-summary-followup-with-original}
6483@findex gnus-summary-followup-with-original
6484Post a followup to the current article and include the original message
6485(@code{gnus-summary-followup-with-original}). This command uses the
6486process/prefix convention.
6487
6488@item S n
6489@kindex S n (Summary)
6490@findex gnus-summary-followup-to-mail
6491Post a followup to the current article via news, even if you got the
6492message through mail (@code{gnus-summary-followup-to-mail}).
6493
6494@item S N
6495@kindex S N (Summary)
6496@findex gnus-summary-followup-to-mail-with-original
6497Post a followup to the current article via news, even if you got the
6498message through mail and include the original message
6499(@code{gnus-summary-followup-to-mail-with-original}). This command uses
6500the process/prefix convention.
6501
6502@item S o p
6503@kindex S o p (Summary)
6504@findex gnus-summary-post-forward
6505Forward the current article to a newsgroup
6506(@code{gnus-summary-post-forward}).
6507 If no prefix is given, the message is forwarded according to the value
6508of (@code{message-forward-as-mime}) and
6509(@code{message-forward-show-mml}); if the prefix is 1, decode the
6510message and forward directly inline; if the prefix is 2, forward message
6511as an rfc822 @acronym{MIME} section; if the prefix is 3, decode message and
6512forward as an rfc822 @acronym{MIME} section; if the prefix is 4, forward message
6513directly inline; otherwise, the message is forwarded as no prefix given
6514but use the flipped value of (@code{message-forward-as-mime}). By
6515default, the message is decoded and forwarded as an rfc822 @acronym{MIME} section.
6516
6517@item S O p
6518@kindex S O p (Summary)
6519@findex gnus-uu-digest-post-forward
6520@cindex digests
6521@cindex making digests
6522Digest the current series and forward the result to a newsgroup
6523(@code{gnus-uu-digest-post-forward}). This command uses the
6524process/prefix convention.
6525
6526@item S u
6527@kindex S u (Summary)
6528@findex gnus-uu-post-news
6529@c @icon{gnus-uu-post-news}
6530Uuencode a file, split it into parts, and post it as a series
6531(@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}).
6532@end table
6533
6534Also @xref{Header Commands, ,Header Commands, message, The Message
6535Manual}, for more information.
6536
6537
6538@node Summary Message Commands
6539@subsection Summary Message Commands
6540
6541@table @kbd
6542@item S y
6543@kindex S y (Summary)
6544@findex gnus-summary-yank-message
6545Yank the current article into an already existing Message composition
6546buffer (@code{gnus-summary-yank-message}). This command prompts for
6547what message buffer you want to yank into, and understands the
6548process/prefix convention (@pxref{Process/Prefix}).
6549
6550@end table
6551
6552
6553@node Canceling and Superseding
6554@subsection Canceling Articles
6555@cindex canceling articles
6556@cindex superseding articles
6557
6558Have you ever written something, and then decided that you really,
6559really, really wish you hadn't posted that?
6560
6561Well, you can't cancel mail, but you can cancel posts.
6562
6563@findex gnus-summary-cancel-article
6564@kindex C (Summary)
6565@c @icon{gnus-summary-cancel-article}
6566Find the article you wish to cancel (you can only cancel your own
6567articles, so don't try any funny stuff). Then press @kbd{C} or @kbd{S
6568c} (@code{gnus-summary-cancel-article}). Your article will be
6569canceled---machines all over the world will be deleting your article.
6570This command uses the process/prefix convention (@pxref{Process/Prefix}).
6571
6572Be aware, however, that not all sites honor cancels, so your article may
6573live on here and there, while most sites will delete the article in
6574question.
6575
6576Gnus will use the ``current'' select method when canceling. If you
6577want to use the standard posting method, use the @samp{a} symbolic
6578prefix (@pxref{Symbolic Prefixes}).
6579
6580Gnus ensures that only you can cancel your own messages using a
6581@code{Cancel-Lock} header (@pxref{Canceling News, Canceling News, ,
6582message, Message Manual}).
6583
6584If you discover that you have made some mistakes and want to do some
6585corrections, you can post a @dfn{superseding} article that will replace
6586your original article.
6587
6588@findex gnus-summary-supersede-article
6589@kindex S (Summary)
6590Go to the original article and press @kbd{S s}
6591(@code{gnus-summary-supersede-article}). You will be put in a buffer
6592where you can edit the article all you want before sending it off the
6593usual way.
6594
6595The same goes for superseding as for canceling, only more so: Some
6596sites do not honor superseding. On those sites, it will appear that you
6597have posted almost the same article twice.
6598
6599If you have just posted the article, and change your mind right away,
6600there is a trick you can use to cancel/supersede the article without
6601waiting for the article to appear on your site first. You simply return
6602to the post buffer (which is called @code{*sent ...*}). There you will
6603find the article you just posted, with all the headers intact. Change
6604the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes}
6605header by substituting one of those words for the word
6606@code{Message-ID}. Then just press @kbd{C-c C-c} to send the article as
6607you would do normally. The previous article will be
6608canceled/superseded.
6609
6610Just remember, kids: There is no 'c' in 'supersede'.
6611
6612@node Delayed Articles
6613@section Delayed Articles
6614@cindex delayed sending
6615@cindex send delayed
6616
6617Sometimes, you might wish to delay the sending of a message. For
6618example, you might wish to arrange for a message to turn up just in time
6619to remind your about the birthday of your Significant Other. For this,
6620there is the @code{gnus-delay} package. Setup is simple:
6621
6622@lisp
6623(gnus-delay-initialize)
6624@end lisp
6625
6626@findex gnus-delay-article
6627Normally, to send a message you use the @kbd{C-c C-c} command from
6628Message mode. To delay a message, use @kbd{C-c C-j}
6629(@code{gnus-delay-article}) instead. This will ask you for how long the
6630message should be delayed. Possible answers are:
6631
6632@itemize @bullet
6633@item
6634A time span. Consists of an integer and a letter. For example,
6635@code{42d} means to delay for 42 days. Available letters are @code{m}
6636(minutes), @code{h} (hours), @code{d} (days), @code{w} (weeks), @code{M}
6637(months) and @code{Y} (years).
6638
6639@item
6640A specific date. Looks like @code{YYYY-MM-DD}. The message will be
6641delayed until that day, at a specific time (eight o'clock by default).
6642See also @code{gnus-delay-default-hour}.
6643
6644@item
6645A specific time of day. Given in @code{hh:mm} format, 24h, no am/pm
6646stuff. The deadline will be at that time today, except if that time has
6647already passed, then it's at the given time tomorrow. So if it's ten
6648o'clock in the morning and you specify @code{11:15}, then the deadline
6649is one hour and fifteen minutes hence. But if you specify @code{9:20},
6650that means a time tomorrow.
6651@end itemize
6652
6653The action of the @code{gnus-delay-article} command is influenced by a
6654couple of variables:
6655
6656@table @code
6657@item gnus-delay-default-hour
6658@vindex gnus-delay-default-hour
6659When you specify a specific date, the message will be due on that hour
6660on the given date. Possible values are integers 0 through 23.
6661
6662@item gnus-delay-default-delay
6663@vindex gnus-delay-default-delay
6664This is a string and gives the default delay. It can be of any of the
6665formats described above.
6666
6667@item gnus-delay-group
6668@vindex gnus-delay-group
6669Delayed articles will be kept in this group on the drafts server until
6670they are due. You probably don't need to change this. The default
6671value is @code{"delayed"}.
6672
6673@item gnus-delay-header
6674@vindex gnus-delay-header
6675The deadline for each article will be stored in a header. This variable
6676is a string and gives the header name. You probably don't need to
6677change this. The default value is @code{"X-Gnus-Delayed"}.
6678@end table
6679
6680The way delaying works is like this: when you use the
6681@code{gnus-delay-article} command, you give a certain delay. Gnus
6682calculates the deadline of the message and stores it in the
6683@code{X-Gnus-Delayed} header and puts the message in the
6684@code{nndraft:delayed} group.
6685
6686@findex gnus-delay-send-queue
6687And whenever you get new news, Gnus looks through the group for articles
6688which are due and sends them. It uses the @code{gnus-delay-send-queue}
6689function for this. By default, this function is added to the hook
6690@code{gnus-get-new-news-hook}. But of course, you can change this.
6691Maybe you want to use the demon to send drafts? Just tell the demon to
6692execute the @code{gnus-delay-send-queue} function.
6693
6694@table @code
6695@item gnus-delay-initialize
6696@findex gnus-delay-initialize
6697By default, this function installs @code{gnus-delay-send-queue} in
6698@code{gnus-get-new-news-hook}. But it accepts the optional second
6699argument @code{no-check}. If it is non-@code{nil},
6700@code{gnus-get-new-news-hook} is not changed. The optional first
6701argument is ignored.
6702
6703For example, @code{(gnus-delay-initialize nil t)} means to do nothing.
6704Presumably, you want to use the demon for sending due delayed articles.
6705Just don't forget to set that up :-)
6706@end table
6707
6708
6709@node Marking Articles
6710@section Marking Articles
6711@cindex article marking
6712@cindex article ticking
6713@cindex marks
6714
6715There are several marks you can set on an article.
6716
6717You have marks that decide the @dfn{readedness} (whoo, neato-keano
6718neologism ohoy!) of the article. Alphabetic marks generally mean
6719@dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.
6720
6721In addition, you also have marks that do not affect readedness.
6722
6723@ifinfo
6724There's a plethora of commands for manipulating these marks.
6725@end ifinfo
6726
6727@menu
6728* Unread Articles:: Marks for unread articles.
6729* Read Articles:: Marks for read articles.
6730* Other Marks:: Marks that do not affect readedness.
6731* Setting Marks:: How to set and remove marks.
6732* Generic Marking Commands:: How to customize the marking.
6733* Setting Process Marks:: How to mark articles for later processing.
6734@end menu
6735
6736
6737@node Unread Articles
6738@subsection Unread Articles
6739
6740The following marks mark articles as (kinda) unread, in one form or
6741other.
6742
6743@table @samp
6744@item !
6745@vindex gnus-ticked-mark
6746Marked as ticked (@code{gnus-ticked-mark}).
6747
6748@dfn{Ticked articles} are articles that will remain visible always. If
6749you see an article that you find interesting, or you want to put off
6750reading it, or replying to it, until sometime later, you'd typically
6751tick it. However, articles can be expired (from news servers by the
6752news server software, Gnus itself never expires ticked messages), so if
6753you want to keep an article forever, you'll have to make it persistent
6754(@pxref{Persistent Articles}).
6755
6756@item ?
6757@vindex gnus-dormant-mark
6758Marked as dormant (@code{gnus-dormant-mark}).
6759
6760@dfn{Dormant articles} will only appear in the summary buffer if there
6761are followups to it. If you want to see them even if they don't have
6762followups, you can use the @kbd{/ D} command (@pxref{Limiting}).
6763Otherwise (except for the visibility issue), they are just like ticked
6764messages.
6765
6766@item SPACE
6767@vindex gnus-unread-mark
6768Marked as unread (@code{gnus-unread-mark}).
6769
6770@dfn{Unread articles} are articles that haven't been read at all yet.
6771@end table
6772
6773
6774@node Read Articles
6775@subsection Read Articles
6776@cindex expirable mark
6777
6778All the following marks mark articles as read.
6779
6780@table @samp
6781
6782@item r
6783@vindex gnus-del-mark
6784These are articles that the user has marked as read with the @kbd{d}
6785command manually, more or less (@code{gnus-del-mark}).
6786
6787@item R
6788@vindex gnus-read-mark
6789Articles that have actually been read (@code{gnus-read-mark}).
6790
6791@item O
6792@vindex gnus-ancient-mark
6793Articles that were marked as read in previous sessions and are now
6794@dfn{old} (@code{gnus-ancient-mark}).
6795
6796@item K
6797@vindex gnus-killed-mark
6798Marked as killed (@code{gnus-killed-mark}).
6799
6800@item X
6801@vindex gnus-kill-file-mark
6802Marked as killed by kill files (@code{gnus-kill-file-mark}).
6803
6804@item Y
6805@vindex gnus-low-score-mark
6806Marked as read by having too low a score (@code{gnus-low-score-mark}).
6807
6808@item C
6809@vindex gnus-catchup-mark
6810Marked as read by a catchup (@code{gnus-catchup-mark}).
6811
6812@item G
6813@vindex gnus-canceled-mark
6814Canceled article (@code{gnus-canceled-mark})
6815
6816@item F
6817@vindex gnus-souped-mark
6818@sc{soup}ed article (@code{gnus-souped-mark}). @xref{SOUP}.
6819
6820@item Q
6821@vindex gnus-sparse-mark
6822Sparsely reffed article (@code{gnus-sparse-mark}). @xref{Customizing
6823Threading}.
6824
6825@item M
6826@vindex gnus-duplicate-mark
6827Article marked as read by duplicate suppression
6828(@code{gnus-duplicate-mark}). @xref{Duplicate Suppression}.
6829
6830@end table
6831
6832All these marks just mean that the article is marked as read, really.
6833They are interpreted differently when doing adaptive scoring, though.
6834
6835One more special mark, though:
6836
6837@table @samp
6838@item E
6839@vindex gnus-expirable-mark
6840Marked as expirable (@code{gnus-expirable-mark}).
6841
6842Marking articles as @dfn{expirable} (or have them marked as such
6843automatically) doesn't make much sense in normal groups---a user doesn't
6844control expiring of news articles, but in mail groups, for instance,
6845articles marked as @dfn{expirable} can be deleted by Gnus at
6846any time.
6847@end table
6848
6849
6850@node Other Marks
6851@subsection Other Marks
6852@cindex process mark
6853@cindex bookmarks
6854
6855There are some marks that have nothing to do with whether the article is
6856read or not.
6857
6858@itemize @bullet
6859
6860@item
6861You can set a bookmark in the current article. Say you are reading a
6862long thesis on cats' urinary tracts, and have to go home for dinner
6863before you've finished reading the thesis. You can then set a bookmark
6864in the article, and Gnus will jump to this bookmark the next time it
6865encounters the article. @xref{Setting Marks}.
6866
6867@item
6868@vindex gnus-replied-mark
6869All articles that you have replied to or made a followup to (i.e., have
6870answered) will be marked with an @samp{A} in the second column
6871(@code{gnus-replied-mark}).
6872
6873@item
6874@vindex gnus-forwarded-mark
6875All articles that you have forwarded will be marked with an @samp{F} in
6876the second column (@code{gnus-forwarded-mark}).
6877
6878@item
6879@vindex gnus-cached-mark
6880Articles stored in the article cache will be marked with an @samp{*} in
6881the second column (@code{gnus-cached-mark}). @xref{Article Caching}.
6882
6883@item
6884@vindex gnus-saved-mark
6885Articles ``saved'' (in some manner or other; not necessarily
6886religiously) are marked with an @samp{S} in the second column
6887(@code{gnus-saved-mark}).
6888
6889@item
6890@vindex gnus-recent-mark
6891Articles that according to the server haven't been shown to the user
6892before are marked with a @samp{N} in the second column
6893(@code{gnus-recent-mark}). Note that not all servers support this
6894mark, in which case it simply never appears. Compare with
6895@code{gnus-unseen-mark}.
6896
6897@item
6898@vindex gnus-unseen-mark
6899Articles that haven't been seen before in Gnus by the user are marked
6900with a @samp{.} in the second column (@code{gnus-unseen-mark}).
6901Compare with @code{gnus-recent-mark}.
6902
6903@item
6904@vindex gnus-downloaded-mark
6905When using the Gnus agent (@pxref{Agent Basics}), articles may be
6906downloaded for unplugged (offline) viewing. If you are using the
6907@samp{%O} spec, these articles get the @samp{+} mark in that spec.
6908(The variable @code{gnus-downloaded-mark} controls which character to
6909use.)
6910
6911@item
6912@vindex gnus-undownloaded-mark
6913When using the Gnus agent (@pxref{Agent Basics}), some articles might
6914not have been downloaded. Such articles cannot be viewed while you
6915are unplugged (offline). If you are using the @samp{%O} spec, these
6916articles get the @samp{-} mark in that spec. (The variable
6917@code{gnus-undownloaded-mark} controls which character to use.)
6918
6919@item
6920@vindex gnus-downloadable-mark
6921The Gnus agent (@pxref{Agent Basics}) downloads some articles
6922automatically, but it is also possible to explicitly mark articles for
6923download, even if they would not be downloaded automatically. Such
6924explicitly-marked articles get the @samp{%} mark in the first column.
6925(The variable @code{gnus-downloadable-mark} controls which character to
6926use.)
6927
6928@item
6929@vindex gnus-not-empty-thread-mark
6930@vindex gnus-empty-thread-mark
6931If the @samp{%e} spec is used, the presence of threads or not will be
6932marked with @code{gnus-not-empty-thread-mark} and
6933@code{gnus-empty-thread-mark} in the third column, respectively.
6934
6935@item
6936@vindex gnus-process-mark
6937Finally we have the @dfn{process mark} (@code{gnus-process-mark}). A
6938variety of commands react to the presence of the process mark. For
6939instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view
6940all articles that have been marked with the process mark. Articles
6941marked with the process mark have a @samp{#} in the second column.
6942
6943@end itemize
6944
6945You might have noticed that most of these ``non-readedness'' marks
6946appear in the second column by default. So if you have a cached, saved,
6947replied article that you have process-marked, what will that look like?
6948
6949Nothing much. The precedence rules go as follows: process -> cache ->
6950replied -> saved. So if the article is in the cache and is replied,
6951you'll only see the cache mark and not the replied mark.
6952
6953
6954@node Setting Marks
6955@subsection Setting Marks
6956@cindex setting marks
6957
6958All the marking commands understand the numeric prefix.
6959
6960@table @kbd
6961@item M c
6962@itemx M-u
6963@kindex M c (Summary)
6964@kindex M-u (Summary)
6965@findex gnus-summary-clear-mark-forward
6966@cindex mark as unread
6967Clear all readedness-marks from the current article
6968(@code{gnus-summary-clear-mark-forward}). In other words, mark the
6969article as unread.
6970
6971@item M t
6972@itemx !
6973@kindex ! (Summary)
6974@kindex M t (Summary)
6975@findex gnus-summary-tick-article-forward
6976Tick the current article (@code{gnus-summary-tick-article-forward}).
6977@xref{Article Caching}.
6978
6979@item M ?
6980@itemx ?
6981@kindex ? (Summary)
6982@kindex M ? (Summary)
6983@findex gnus-summary-mark-as-dormant
6984Mark the current article as dormant
6985(@code{gnus-summary-mark-as-dormant}). @xref{Article Caching}.
6986
6987@item M d
6988@itemx d
6989@kindex M d (Summary)
6990@kindex d (Summary)
6991@findex gnus-summary-mark-as-read-forward
6992Mark the current article as read
6993(@code{gnus-summary-mark-as-read-forward}).
6994
6995@item D
6996@kindex D (Summary)
6997@findex gnus-summary-mark-as-read-backward
6998Mark the current article as read and move point to the previous line
6999(@code{gnus-summary-mark-as-read-backward}).
7000
7001@item M k
7002@itemx k
7003@kindex k (Summary)
7004@kindex M k (Summary)
7005@findex gnus-summary-kill-same-subject-and-select
7006Mark all articles that have the same subject as the current one as read,
7007and then select the next unread article
7008(@code{gnus-summary-kill-same-subject-and-select}).
7009
7010@item M K
7011@itemx C-k
7012@kindex M K (Summary)
7013@kindex C-k (Summary)
7014@findex gnus-summary-kill-same-subject
7015Mark all articles that have the same subject as the current one as read
7016(@code{gnus-summary-kill-same-subject}).
7017
7018@item M C
7019@kindex M C (Summary)
7020@findex gnus-summary-catchup
7021@c @icon{gnus-summary-catchup}
7022Mark all unread articles as read (@code{gnus-summary-catchup}).
7023
7024@item M C-c
7025@kindex M C-c (Summary)
7026@findex gnus-summary-catchup-all
7027Mark all articles in the group as read---even the ticked and dormant
7028articles (@code{gnus-summary-catchup-all}).
7029
7030@item M H
7031@kindex M H (Summary)
7032@findex gnus-summary-catchup-to-here
7033Catchup the current group to point (before the point)
7034(@code{gnus-summary-catchup-to-here}).
7035
7036@item M h
7037@kindex M h (Summary)
7038@findex gnus-summary-catchup-from-here
7039Catchup the current group from point (after the point)
7040(@code{gnus-summary-catchup-from-here}).
7041
7042@item C-w
7043@kindex C-w (Summary)
7044@findex gnus-summary-mark-region-as-read
7045Mark all articles between point and mark as read
7046(@code{gnus-summary-mark-region-as-read}).
7047
7048@item M V k
7049@kindex M V k (Summary)
7050@findex gnus-summary-kill-below
7051Kill all articles with scores below the default score (or below the
7052numeric prefix) (@code{gnus-summary-kill-below}).
7053
7054@item M e
7055@itemx E
7056@kindex M e (Summary)
7057@kindex E (Summary)
7058@findex gnus-summary-mark-as-expirable
7059Mark the current article as expirable
7060(@code{gnus-summary-mark-as-expirable}).
7061
7062@item M b
7063@kindex M b (Summary)
7064@findex gnus-summary-set-bookmark
7065Set a bookmark in the current article
7066(@code{gnus-summary-set-bookmark}).
7067
7068@item M B
7069@kindex M B (Summary)
7070@findex gnus-summary-remove-bookmark
7071Remove the bookmark from the current article
7072(@code{gnus-summary-remove-bookmark}).
7073
7074@item M V c
7075@kindex M V c (Summary)
7076@findex gnus-summary-clear-above
7077Clear all marks from articles with scores over the default score (or
7078over the numeric prefix) (@code{gnus-summary-clear-above}).
7079
7080@item M V u
7081@kindex M V u (Summary)
7082@findex gnus-summary-tick-above
7083Tick all articles with scores over the default score (or over the
7084numeric prefix) (@code{gnus-summary-tick-above}).
7085
7086@item M V m
7087@kindex M V m (Summary)
7088@findex gnus-summary-mark-above
7089Prompt for a mark, and mark all articles with scores over the default
7090score (or over the numeric prefix) with this mark
7091(@code{gnus-summary-clear-above}).
7092@end table
7093
7094@vindex gnus-summary-goto-unread
7095The @code{gnus-summary-goto-unread} variable controls what action should
7096be taken after setting a mark. If non-@code{nil}, point will move to
7097the next/previous unread article. If @code{nil}, point will just move
7098one line up or down. As a special case, if this variable is
7099@code{never}, all the marking commands as well as other commands (like
7100@kbd{SPACE}) will move to the next article, whether it is unread or not.
7101The default is @code{t}.
7102
7103
7104@node Generic Marking Commands
7105@subsection Generic Marking Commands
7106
7107Some people would like the command that ticks an article (@kbd{!}) go to
7108the next article. Others would like it to go to the next unread
7109article. Yet others would like it to stay on the current article. And
7110even though I haven't heard of anybody wanting it to go to the
7111previous (unread) article, I'm sure there are people that want that as
7112well.
7113
7114Multiply these five behaviors with five different marking commands, and
7115you get a potentially complex set of variable to control what each
7116command should do.
7117
7118To sidestep that mess, Gnus provides commands that do all these
7119different things. They can be found on the @kbd{M M} map in the summary
7120buffer. Type @kbd{M M C-h} to see them all---there are too many of them
7121to list in this manual.
7122
7123While you can use these commands directly, most users would prefer
7124altering the summary mode keymap. For instance, if you would like the
7125@kbd{!} command to go to the next article instead of the next unread
7126article, you could say something like:
7127
7128@lisp
7129@group
7130(add-hook 'gnus-summary-mode-hook 'my-alter-summary-map)
7131(defun my-alter-summary-map ()
7132 (local-set-key "!" 'gnus-summary-put-mark-as-ticked-next))
7133@end group
7134@end lisp
7135
7136@noindent
7137or
7138
7139@lisp
7140(defun my-alter-summary-map ()
7141 (local-set-key "!" "MM!n"))
7142@end lisp
7143
7144
7145@node Setting Process Marks
7146@subsection Setting Process Marks
7147@cindex setting process marks
7148
7149Process marks are displayed as @code{#} in the summary buffer, and are
7150used for marking articles in such a way that other commands will
7151process these articles. For instance, if you process mark four
7152articles and then use the @kbd{*} command, Gnus will enter these four
7153articles into the cache. For more information,
7154@pxref{Process/Prefix}.
7155
7156@table @kbd
7157
7158@item M P p
7159@itemx #
7160@kindex # (Summary)
7161@kindex M P p (Summary)
7162@findex gnus-summary-mark-as-processable
7163Mark the current article with the process mark
7164(@code{gnus-summary-mark-as-processable}).
7165@findex gnus-summary-unmark-as-processable
7166
7167@item M P u
7168@itemx M-#
7169@kindex M P u (Summary)
7170@kindex M-# (Summary)
7171Remove the process mark, if any, from the current article
7172(@code{gnus-summary-unmark-as-processable}).
7173
7174@item M P U
7175@kindex M P U (Summary)
7176@findex gnus-summary-unmark-all-processable
7177Remove the process mark from all articles
7178(@code{gnus-summary-unmark-all-processable}).
7179
7180@item M P i
7181@kindex M P i (Summary)
7182@findex gnus-uu-invert-processable
7183Invert the list of process marked articles
7184(@code{gnus-uu-invert-processable}).
7185
7186@item M P R
7187@kindex M P R (Summary)
7188@findex gnus-uu-mark-by-regexp
7189Mark articles that have a @code{Subject} header that matches a regular
7190expression (@code{gnus-uu-mark-by-regexp}).
7191
7192@item M P G
7193@kindex M P G (Summary)
7194@findex gnus-uu-unmark-by-regexp
7195Unmark articles that have a @code{Subject} header that matches a regular
7196expression (@code{gnus-uu-unmark-by-regexp}).
7197
7198@item M P r
7199@kindex M P r (Summary)
7200@findex gnus-uu-mark-region
7201Mark articles in region (@code{gnus-uu-mark-region}).
7202
7203@item M P g
7204@kindex M P g (Summary)
7205@findex gnus-uu-unmark-region
7206Unmark articles in region (@code{gnus-uu-unmark-region}).
7207
7208@item M P t
7209@kindex M P t (Summary)
7210@findex gnus-uu-mark-thread
7211Mark all articles in the current (sub)thread
7212(@code{gnus-uu-mark-thread}).
7213
7214@item M P T
7215@kindex M P T (Summary)
7216@findex gnus-uu-unmark-thread
7217Unmark all articles in the current (sub)thread
7218(@code{gnus-uu-unmark-thread}).
7219
7220@item M P v
7221@kindex M P v (Summary)
7222@findex gnus-uu-mark-over
7223Mark all articles that have a score above the prefix argument
7224(@code{gnus-uu-mark-over}).
7225
7226@item M P s
7227@kindex M P s (Summary)
7228@findex gnus-uu-mark-series
7229Mark all articles in the current series (@code{gnus-uu-mark-series}).
7230
7231@item M P S
7232@kindex M P S (Summary)
7233@findex gnus-uu-mark-sparse
7234Mark all series that have already had some articles marked
7235(@code{gnus-uu-mark-sparse}).
7236
7237@item M P a
7238@kindex M P a (Summary)
7239@findex gnus-uu-mark-all
7240Mark all articles in series order (@code{gnus-uu-mark-all}).
7241
7242@item M P b
7243@kindex M P b (Summary)
7244@findex gnus-uu-mark-buffer
7245Mark all articles in the buffer in the order they appear
7246(@code{gnus-uu-mark-buffer}).
7247
7248@item M P k
7249@kindex M P k (Summary)
7250@findex gnus-summary-kill-process-mark
7251Push the current process mark set onto the stack and unmark all articles
7252(@code{gnus-summary-kill-process-mark}).
7253
7254@item M P y
7255@kindex M P y (Summary)
7256@findex gnus-summary-yank-process-mark
7257Pop the previous process mark set from the stack and restore it
7258(@code{gnus-summary-yank-process-mark}).
7259
7260@item M P w
7261@kindex M P w (Summary)
7262@findex gnus-summary-save-process-mark
7263Push the current process mark set onto the stack
7264(@code{gnus-summary-save-process-mark}).
7265
7266@end table
7267
7268Also see the @kbd{&} command in @ref{Searching for Articles}, for how to
7269set process marks based on article body contents.
7270
7271
7272@node Limiting
7273@section Limiting
7274@cindex limiting
7275
7276It can be convenient to limit the summary buffer to just show some
7277subset of the articles currently in the group. The effect most limit
7278commands have is to remove a few (or many) articles from the summary
7279buffer.
7280
7281All limiting commands work on subsets of the articles already fetched
7282from the servers. None of these commands query the server for
7283additional articles.
7284
7285@table @kbd
7286
7287@item / /
7288@itemx / s
7289@kindex / / (Summary)
7290@findex gnus-summary-limit-to-subject
7291Limit the summary buffer to articles that match some subject
7292(@code{gnus-summary-limit-to-subject}). If given a prefix, exclude
7293matching articles.
7294
7295@item / a
7296@kindex / a (Summary)
7297@findex gnus-summary-limit-to-author
7298Limit the summary buffer to articles that match some author
7299(@code{gnus-summary-limit-to-author}). If given a prefix, exclude
7300matching articles.
7301
01c52d31
MB
7302@item / R
7303@kindex / R (Summary)
7304@findex gnus-summary-limit-to-recipient
7305Limit the summary buffer to articles that match some recipient
7306(@code{gnus-summary-limit-to-recipient}). If given a prefix, exclude
7307matching articles.
7308
7309@item / A
7310@kindex / A (Summary)
7311@findex gnus-summary-limit-to-address
7312Limit the summary buffer to articles in which contents of From, To or Cc
7313header match a given address (@code{gnus-summary-limit-to-address}). If
7314given a prefix, exclude matching articles.
7315
7316@item / S
7317@kindex / S (Summary)
7318@findex gnus-summary-limit-to-singletons
7319Limit the summary buffer to articles that aren't part of any displayed
7320threads (@code{gnus-summary-limit-to-singletons}). If given a prefix,
7321limit to articles that are part of displayed threads.
7322
4009494e
GM
7323@item / x
7324@kindex / x (Summary)
7325@findex gnus-summary-limit-to-extra
7326Limit the summary buffer to articles that match one of the ``extra''
7327headers (@pxref{To From Newsgroups})
7328(@code{gnus-summary-limit-to-extra}). If given a prefix, exclude
7329matching articles.
7330
7331@item / u
7332@itemx x
7333@kindex / u (Summary)
7334@kindex x (Summary)
7335@findex gnus-summary-limit-to-unread
7336Limit the summary buffer to articles not marked as read
7337(@code{gnus-summary-limit-to-unread}). If given a prefix, limit the
7338buffer to articles strictly unread. This means that ticked and
7339dormant articles will also be excluded.
7340
7341@item / m
7342@kindex / m (Summary)
7343@findex gnus-summary-limit-to-marks
7344Ask for a mark and then limit to all articles that have been marked
7345with that mark (@code{gnus-summary-limit-to-marks}).
7346
7347@item / t
7348@kindex / t (Summary)
7349@findex gnus-summary-limit-to-age
7350Ask for a number and then limit the summary buffer to articles older than (or equal to) that number of days
7351(@code{gnus-summary-limit-to-age}). If given a prefix, limit to
7352articles younger than that number of days.
7353
7354@item / n
7355@kindex / n (Summary)
7356@findex gnus-summary-limit-to-articles
7357With prefix @samp{n}, limit the summary buffer to the next @samp{n}
7358articles. If not given a prefix, use the process marked articles
7359instead. (@code{gnus-summary-limit-to-articles}).
7360
7361@item / w
7362@kindex / w (Summary)
7363@findex gnus-summary-pop-limit
7364Pop the previous limit off the stack and restore it
7365(@code{gnus-summary-pop-limit}). If given a prefix, pop all limits off
7366the stack.
7367
7368@item / .
7369@kindex / . (Summary)
7370@findex gnus-summary-limit-to-unseen
7371Limit the summary buffer to the unseen articles
7372(@code{gnus-summary-limit-to-unseen}).
7373
7374@item / v
7375@kindex / v (Summary)
7376@findex gnus-summary-limit-to-score
7377Limit the summary buffer to articles that have a score at or above some
7378score (@code{gnus-summary-limit-to-score}).
7379
7380@item / p
7381@kindex / p (Summary)
7382@findex gnus-summary-limit-to-display-predicate
7383Limit the summary buffer to articles that satisfy the @code{display}
7384group parameter predicate
7385(@code{gnus-summary-limit-to-display-predicate}). @xref{Group
7386Parameters}, for more on this predicate.
7387
01c52d31
MB
7388@item / r
7389@kindex / r (Summary)
7390@findex gnus-summary-limit-to-replied
7391Limit the summary buffer to replied articles
7392(@code{gnus-summary-limit-to-replied}). If given a prefix, exclude
7393replied articles.
7394
4009494e
GM
7395@item / E
7396@itemx M S
7397@kindex M S (Summary)
7398@kindex / E (Summary)
7399@findex gnus-summary-limit-include-expunged
7400Include all expunged articles in the limit
7401(@code{gnus-summary-limit-include-expunged}).
7402
7403@item / D
7404@kindex / D (Summary)
7405@findex gnus-summary-limit-include-dormant
7406Include all dormant articles in the limit
7407(@code{gnus-summary-limit-include-dormant}).
7408
7409@item / *
7410@kindex / * (Summary)
7411@findex gnus-summary-limit-include-cached
7412Include all cached articles in the limit
7413(@code{gnus-summary-limit-include-cached}).
7414
7415@item / d
7416@kindex / d (Summary)
7417@findex gnus-summary-limit-exclude-dormant
7418Exclude all dormant articles from the limit
7419(@code{gnus-summary-limit-exclude-dormant}).
7420
7421@item / M
7422@kindex / M (Summary)
7423@findex gnus-summary-limit-exclude-marks
7424Exclude all marked articles (@code{gnus-summary-limit-exclude-marks}).
7425
7426@item / T
7427@kindex / T (Summary)
7428@findex gnus-summary-limit-include-thread
7429Include all the articles in the current thread in the limit.
7430
7431@item / c
7432@kindex / c (Summary)
7433@findex gnus-summary-limit-exclude-childless-dormant
7434Exclude all dormant articles that have no children from the limit@*
7435(@code{gnus-summary-limit-exclude-childless-dormant}).
7436
7437@item / C
7438@kindex / C (Summary)
7439@findex gnus-summary-limit-mark-excluded-as-read
7440Mark all excluded unread articles as read
7441(@code{gnus-summary-limit-mark-excluded-as-read}). If given a prefix,
7442also mark excluded ticked and dormant articles as read.
7443
7444@item / N
7445@kindex / N (Summary)
7446@findex gnus-summary-insert-new-articles
7447Insert all new articles in the summary buffer. It scans for new emails
7448if @var{back-end}@code{-get-new-mail} is non-@code{nil}.
7449
7450@item / o
7451@kindex / o (Summary)
7452@findex gnus-summary-insert-old-articles
7453Insert all old articles in the summary buffer. If given a numbered
7454prefix, fetch this number of articles.
7455
01c52d31
MB
7456@item / b
7457@kindex / b (Summary)
7458@findex gnus-summary-limit-to-bodies
7459Limit the summary buffer to articles that have bodies that match a
7460certain regexp (@code{gnus-summary-limit-to-bodies}). If given a
7461prefix, reverse the limit. This command is quite slow since it
7462requires selecting each article to find the matches.
7463
7464@item / h
7465@kindex / h (Summary)
7466@findex gnus-summary-limit-to-headers
7467Like the previous command, only limit to headers instead
7468(@code{gnus-summary-limit-to-headers}).
7469
4009494e
GM
7470@end table
7471
7472
7473@node Threading
7474@section Threading
7475@cindex threading
7476@cindex article threading
7477
7478Gnus threads articles by default. @dfn{To thread} is to put responses
7479to articles directly after the articles they respond to---in a
7480hierarchical fashion.
7481
7482Threading is done by looking at the @code{References} headers of the
7483articles. In a perfect world, this would be enough to build pretty
7484trees, but unfortunately, the @code{References} header is often broken
7485or simply missing. Weird news propagation exacerbates the problem,
7486so one has to employ other heuristics to get pleasing results. A
7487plethora of approaches exists, as detailed in horrible detail in
7488@ref{Customizing Threading}.
7489
7490First, a quick overview of the concepts:
7491
7492@table @dfn
7493@item root
7494The top-most article in a thread; the first article in the thread.
7495
7496@item thread
7497A tree-like article structure.
7498
7499@item sub-thread
7500A small(er) section of this tree-like structure.
7501
7502@item loose threads
7503Threads often lose their roots due to article expiry, or due to the root
7504already having been read in a previous session, and not displayed in the
7505summary buffer. We then typically have many sub-threads that really
7506belong to one thread, but are without connecting roots. These are
7507called loose threads.
7508
7509@item thread gathering
7510An attempt to gather loose threads into bigger threads.
7511
7512@item sparse threads
7513A thread where the missing articles have been ``guessed'' at, and are
7514displayed as empty lines in the summary buffer.
7515
7516@end table
7517
7518
7519@menu
7520* Customizing Threading:: Variables you can change to affect the threading.
7521* Thread Commands:: Thread based commands in the summary buffer.
7522@end menu
7523
7524
7525@node Customizing Threading
7526@subsection Customizing Threading
7527@cindex customizing threading
7528
7529@menu
7530* Loose Threads:: How Gnus gathers loose threads into bigger threads.
7531* Filling In Threads:: Making the threads displayed look fuller.
7532* More Threading:: Even more variables for fiddling with threads.
7533* Low-Level Threading:: You thought it was over@dots{} but you were wrong!
7534@end menu
7535
7536
7537@node Loose Threads
7538@subsubsection Loose Threads
7539@cindex <
7540@cindex >
7541@cindex loose threads
7542
7543@table @code
7544@item gnus-summary-make-false-root
7545@vindex gnus-summary-make-false-root
7546If non-@code{nil}, Gnus will gather all loose subtrees into one big tree
7547and create a dummy root at the top. (Wait a minute. Root at the top?
7548Yup.) Loose subtrees occur when the real root has expired, or you've
7549read or killed the root in a previous session.
7550
7551When there is no real root of a thread, Gnus will have to fudge
7552something. This variable says what fudging method Gnus should use.
7553There are four possible values:
7554
7555@iftex
7556@iflatex
7557\gnusfigure{The Summary Buffer}{390}{
7558\put(0,0){\epsfig{figure=ps/summary-adopt,width=7.5cm}}
7559\put(445,0){\makebox(0,0)[br]{\epsfig{figure=ps/summary-empty,width=7.5cm}}}
7560\put(0,400){\makebox(0,0)[tl]{\epsfig{figure=ps/summary-none,width=7.5cm}}}
7561\put(445,400){\makebox(0,0)[tr]{\epsfig{figure=ps/summary-dummy,width=7.5cm}}}
7562}
7563@end iflatex
7564@end iftex
7565
7566@cindex adopting articles
7567
7568@table @code
7569
7570@item adopt
7571Gnus will make the first of the orphaned articles the parent. This
7572parent will adopt all the other articles. The adopted articles will be
7573marked as such by pointy brackets (@samp{<>}) instead of the standard
7574square brackets (@samp{[]}). This is the default method.
7575
7576@item dummy
7577@vindex gnus-summary-dummy-line-format
7578@vindex gnus-summary-make-false-root-always
7579Gnus will create a dummy summary line that will pretend to be the
7580parent. This dummy line does not correspond to any real article, so
7581selecting it will just select the first real article after the dummy
7582article. @code{gnus-summary-dummy-line-format} is used to specify the
7583format of the dummy roots. It accepts only one format spec: @samp{S},
7584which is the subject of the article. @xref{Formatting Variables}.
7585If you want all threads to have a dummy root, even the non-gathered
7586ones, set @code{gnus-summary-make-false-root-always} to @code{t}.
7587
7588@item empty
7589Gnus won't actually make any article the parent, but simply leave the
7590subject field of all orphans except the first empty. (Actually, it will
7591use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
7592Buffer Format}).)
7593
7594@item none
7595Don't make any article parent at all. Just gather the threads and
7596display them after one another.
7597
7598@item nil
7599Don't gather loose threads.
7600@end table
7601
7602@item gnus-summary-gather-subject-limit
7603@vindex gnus-summary-gather-subject-limit
7604Loose threads are gathered by comparing subjects of articles. If this
7605variable is @code{nil}, Gnus requires an exact match between the
7606subjects of the loose threads before gathering them into one big
7607super-thread. This might be too strict a requirement, what with the
7608presence of stupid newsreaders that chop off long subject lines. If
7609you think so, set this variable to, say, 20 to require that only the
7610first 20 characters of the subjects have to match. If you set this
7611variable to a really low number, you'll find that Gnus will gather
7612everything in sight into one thread, which isn't very helpful.
7613
7614@cindex fuzzy article gathering
7615If you set this variable to the special value @code{fuzzy}, Gnus will
7616use a fuzzy string comparison algorithm on the subjects (@pxref{Fuzzy
7617Matching}).
7618
7619@item gnus-simplify-subject-fuzzy-regexp
7620@vindex gnus-simplify-subject-fuzzy-regexp
7621This can either be a regular expression or list of regular expressions
7622that match strings that will be removed from subjects if fuzzy subject
7623simplification is used.
7624
7625@item gnus-simplify-ignored-prefixes
7626@vindex gnus-simplify-ignored-prefixes
7627If you set @code{gnus-summary-gather-subject-limit} to something as low
7628as 10, you might consider setting this variable to something sensible:
7629
7630@c Written by Michael Ernst <mernst@cs.rice.edu>
7631@lisp
7632(setq gnus-simplify-ignored-prefixes
7633 (concat
7634 "\\`\\[?\\("
7635 (mapconcat
7636 'identity
7637 '("looking"
7638 "wanted" "followup" "summary\\( of\\)?"
7639 "help" "query" "problem" "question"
7640 "answer" "reference" "announce"
7641 "How can I" "How to" "Comparison of"
7642 ;; ...
7643 )
7644 "\\|")
7645 "\\)\\s *\\("
7646 (mapconcat 'identity
7647 '("for" "for reference" "with" "about")
7648 "\\|")
7649 "\\)?\\]?:?[ \t]*"))
7650@end lisp
7651
7652All words that match this regexp will be removed before comparing two
7653subjects.
7654
7655@item gnus-simplify-subject-functions
7656@vindex gnus-simplify-subject-functions
7657If non-@code{nil}, this variable overrides
7658@code{gnus-summary-gather-subject-limit}. This variable should be a
7659list of functions to apply to the @code{Subject} string iteratively to
7660arrive at the simplified version of the string.
7661
7662Useful functions to put in this list include:
7663
7664@table @code
7665@item gnus-simplify-subject-re
7666@findex gnus-simplify-subject-re
7667Strip the leading @samp{Re:}.
7668
7669@item gnus-simplify-subject-fuzzy
7670@findex gnus-simplify-subject-fuzzy
7671Simplify fuzzily.
7672
7673@item gnus-simplify-whitespace
7674@findex gnus-simplify-whitespace
7675Remove excessive whitespace.
7676
7677@item gnus-simplify-all-whitespace
7678@findex gnus-simplify-all-whitespace
7679Remove all whitespace.
7680@end table
7681
7682You may also write your own functions, of course.
7683
7684
7685@item gnus-summary-gather-exclude-subject
7686@vindex gnus-summary-gather-exclude-subject
7687Since loose thread gathering is done on subjects only, that might lead
7688to many false hits, especially with certain common subjects like
7689@samp{} and @samp{(none)}. To make the situation slightly better,
7690you can use the regexp @code{gnus-summary-gather-exclude-subject} to say
7691what subjects should be excluded from the gathering process.@*
7692The default is @samp{^ *$\\|^(none)$}.
7693
7694@item gnus-summary-thread-gathering-function
7695@vindex gnus-summary-thread-gathering-function
7696Gnus gathers threads by looking at @code{Subject} headers. This means
7697that totally unrelated articles may end up in the same ``thread'', which
7698is confusing. An alternate approach is to look at all the
7699@code{Message-ID}s in all the @code{References} headers to find matches.
7700This will ensure that no gathered threads ever include unrelated
7701articles, but it also means that people who have posted with broken
7702newsreaders won't be gathered properly. The choice is yours---plague or
7703cholera:
7704
7705@table @code
7706@item gnus-gather-threads-by-subject
7707@findex gnus-gather-threads-by-subject
7708This function is the default gathering function and looks at
7709@code{Subject}s exclusively.
7710
7711@item gnus-gather-threads-by-references
7712@findex gnus-gather-threads-by-references
7713This function looks at @code{References} headers exclusively.
7714@end table
7715
7716If you want to test gathering by @code{References}, you could say
7717something like:
7718
7719@lisp
7720(setq gnus-summary-thread-gathering-function
7721 'gnus-gather-threads-by-references)
7722@end lisp
7723
7724@end table
7725
7726
7727@node Filling In Threads
7728@subsubsection Filling In Threads
7729
7730@table @code
7731@item gnus-fetch-old-headers
7732@vindex gnus-fetch-old-headers
7733If non-@code{nil}, Gnus will attempt to build old threads by fetching
7734more old headers---headers to articles marked as read. If you would
7735like to display as few summary lines as possible, but still connect as
7736many loose threads as possible, you should set this variable to
7737@code{some} or a number. If you set it to a number, no more than that
7738number of extra old headers will be fetched. In either case, fetching
7739old headers only works if the back end you are using carries overview
7740files---this would normally be @code{nntp}, @code{nnspool},
7741@code{nnml}, and @code{nnmaildir}. Also remember that if the root of
7742the thread has been expired by the server, there's not much Gnus can
7743do about that.
7744
7745This variable can also be set to @code{invisible}. This won't have any
7746visible effects, but is useful if you use the @kbd{A T} command a lot
7747(@pxref{Finding the Parent}).
7748
f394fa25
MB
7749The server has to support @acronym{NOV} for any of this to work.
7750
7751@cindex Gmane, gnus-fetch-old-headers
7752This feature can seriously impact performance it ignores all locally
7753cached header entries. Setting it to @code{t} for groups for a server
7754that doesn't expire articles (such as news.gmane.org), leads to very
7755slow summary generation.
7756
4009494e
GM
7757@item gnus-fetch-old-ephemeral-headers
7758@vindex gnus-fetch-old-ephemeral-headers
7759Same as @code{gnus-fetch-old-headers}, but only used for ephemeral
7760newsgroups.
7761
7762@item gnus-build-sparse-threads
7763@vindex gnus-build-sparse-threads
7764Fetching old headers can be slow. A low-rent similar effect can be
7765gotten by setting this variable to @code{some}. Gnus will then look at
7766the complete @code{References} headers of all articles and try to string
7767together articles that belong in the same thread. This will leave
7768@dfn{gaps} in the threading display where Gnus guesses that an article
7769is missing from the thread. (These gaps appear like normal summary
7770lines. If you select a gap, Gnus will try to fetch the article in
7771question.) If this variable is @code{t}, Gnus will display all these
7772``gaps'' without regard for whether they are useful for completing the
7773thread or not. Finally, if this variable is @code{more}, Gnus won't cut
7774off sparse leaf nodes that don't lead anywhere. This variable is
7775@code{nil} by default.
7776
7777@item gnus-read-all-available-headers
7778@vindex gnus-read-all-available-headers
7779This is a rather obscure variable that few will find useful. It's
7780intended for those non-news newsgroups where the back end has to fetch
7781quite a lot to present the summary buffer, and where it's impossible to
7782go back to parents of articles. This is mostly the case in the
7783web-based groups, like the @code{nnultimate} groups.
7784
7785If you don't use those, then it's safe to leave this as the default
7786@code{nil}. If you want to use this variable, it should be a regexp
7787that matches the group name, or @code{t} for all groups.
7788
7789@end table
7790
7791
7792@node More Threading
7793@subsubsection More Threading
7794
7795@table @code
7796@item gnus-show-threads
7797@vindex gnus-show-threads
7798If this variable is @code{nil}, no threading will be done, and all of
7799the rest of the variables here will have no effect. Turning threading
7800off will speed group selection up a bit, but it is sure to make reading
7801slower and more awkward.
7802
7803@item gnus-thread-hide-subtree
7804@vindex gnus-thread-hide-subtree
7805If non-@code{nil}, all threads will be hidden when the summary buffer is
7806generated.
7807
7808This can also be a predicate specifier (@pxref{Predicate Specifiers}).
7809Available predicates are @code{gnus-article-unread-p} and
7810@code{gnus-article-unseen-p}.
7811
7812Here's an example:
7813
7814@lisp
7815(setq gnus-thread-hide-subtree
7816 '(or gnus-article-unread-p
7817 gnus-article-unseen-p))
7818@end lisp
7819
7820(It's a pretty nonsensical example, since all unseen articles are also
7821unread, but you get my drift.)
7822
7823
7824@item gnus-thread-expunge-below
7825@vindex gnus-thread-expunge-below
7826All threads that have a total score (as defined by
7827@code{gnus-thread-score-function}) less than this number will be
7828expunged. This variable is @code{nil} by default, which means that no
7829threads are expunged.
7830
7831@item gnus-thread-hide-killed
7832@vindex gnus-thread-hide-killed
7833if you kill a thread and this variable is non-@code{nil}, the subtree
7834will be hidden.
7835
7836@item gnus-thread-ignore-subject
7837@vindex gnus-thread-ignore-subject
7838Sometimes somebody changes the subject in the middle of a thread. If
7839this variable is non-@code{nil}, which is the default, the subject
7840change is ignored. If it is @code{nil}, a change in the subject will
7841result in a new thread.
7842
7843@item gnus-thread-indent-level
7844@vindex gnus-thread-indent-level
7845This is a number that says how much each sub-thread should be indented.
7846The default is 4.
7847
7848@item gnus-sort-gathered-threads-function
7849@vindex gnus-sort-gathered-threads-function
7850Sometimes, particularly with mailing lists, the order in which mails
7851arrive locally is not necessarily the same as the order in which they
7852arrived on the mailing list. Consequently, when sorting sub-threads
7853using the default @code{gnus-thread-sort-by-number}, responses can end
7854up appearing before the article to which they are responding to.
7855Setting this variable to an alternate value
7856(e.g. @code{gnus-thread-sort-by-date}), in a group's parameters or in an
7857appropriate hook (e.g. @code{gnus-summary-generate-hook}) can produce a
7858more logical sub-thread ordering in such instances.
7859
7860@end table
7861
7862
7863@node Low-Level Threading
7864@subsubsection Low-Level Threading
7865
7866@table @code
7867
7868@item gnus-parse-headers-hook
7869@vindex gnus-parse-headers-hook
7870Hook run before parsing any headers.
7871
7872@item gnus-alter-header-function
7873@vindex gnus-alter-header-function
7874If non-@code{nil}, this function will be called to allow alteration of
7875article header structures. The function is called with one parameter,
7876the article header vector, which it may alter in any way. For instance,
7877if you have a mail-to-news gateway which alters the @code{Message-ID}s
7878in systematic ways (by adding prefixes and such), you can use this
7879variable to un-scramble the @code{Message-ID}s so that they are more
7880meaningful. Here's one example:
7881
7882@lisp
7883(setq gnus-alter-header-function 'my-alter-message-id)
7884
7885(defun my-alter-message-id (header)
7886 (let ((id (mail-header-id header)))
7887 (when (string-match
7888 "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id)
7889 (mail-header-set-id
7890 (concat (match-string 1 id) "@@" (match-string 2 id))
7891 header))))
7892@end lisp
7893
7894@end table
7895
7896
7897@node Thread Commands
7898@subsection Thread Commands
7899@cindex thread commands
7900
7901@table @kbd
7902
7903@item T k
7904@itemx C-M-k
7905@kindex T k (Summary)
7906@kindex C-M-k (Summary)
7907@findex gnus-summary-kill-thread
7908Mark all articles in the current (sub-)thread as read
7909(@code{gnus-summary-kill-thread}). If the prefix argument is positive,
7910remove all marks instead. If the prefix argument is negative, tick
7911articles instead.
7912
7913@item T l
7914@itemx C-M-l
7915@kindex T l (Summary)
7916@kindex C-M-l (Summary)
7917@findex gnus-summary-lower-thread
7918Lower the score of the current (sub-)thread
7919(@code{gnus-summary-lower-thread}).
7920
7921@item T i
7922@kindex T i (Summary)
7923@findex gnus-summary-raise-thread
7924Increase the score of the current (sub-)thread
7925(@code{gnus-summary-raise-thread}).
7926
7927@item T #
7928@kindex T # (Summary)
7929@findex gnus-uu-mark-thread
7930Set the process mark on the current (sub-)thread
7931(@code{gnus-uu-mark-thread}).
7932
7933@item T M-#
7934@kindex T M-# (Summary)
7935@findex gnus-uu-unmark-thread
7936Remove the process mark from the current (sub-)thread
7937(@code{gnus-uu-unmark-thread}).
7938
7939@item T T
7940@kindex T T (Summary)
7941@findex gnus-summary-toggle-threads
7942Toggle threading (@code{gnus-summary-toggle-threads}).
7943
7944@item T s
7945@kindex T s (Summary)
7946@findex gnus-summary-show-thread
7947Expose the (sub-)thread hidden under the current article, if any@*
7948(@code{gnus-summary-show-thread}).
7949
7950@item T h
7951@kindex T h (Summary)
7952@findex gnus-summary-hide-thread
7953Hide the current (sub-)thread (@code{gnus-summary-hide-thread}).
7954
7955@item T S
7956@kindex T S (Summary)
7957@findex gnus-summary-show-all-threads
7958Expose all hidden threads (@code{gnus-summary-show-all-threads}).
7959
7960@item T H
7961@kindex T H (Summary)
7962@findex gnus-summary-hide-all-threads
7963Hide all threads (@code{gnus-summary-hide-all-threads}).
7964
7965@item T t
7966@kindex T t (Summary)
7967@findex gnus-summary-rethread-current
7968Re-thread the current article's thread
7969(@code{gnus-summary-rethread-current}). This works even when the
7970summary buffer is otherwise unthreaded.
7971
7972@item T ^
7973@kindex T ^ (Summary)
7974@findex gnus-summary-reparent-thread
7975Make the current article the child of the marked (or previous) article
7976(@code{gnus-summary-reparent-thread}).
7977
01c52d31
MB
7978@item T M-^
7979@kindex T M-^ (Summary)
7980@findex gnus-summary-reparent-children
7981Make the current article the parent of the marked articles
7982(@code{gnus-summary-reparent-children}).
7983
4009494e
GM
7984@end table
7985
7986The following commands are thread movement commands. They all
7987understand the numeric prefix.
7988
7989@table @kbd
7990
7991@item T n
7992@kindex T n (Summary)
7993@itemx C-M-f
7994@kindex C-M-n (Summary)
7995@itemx M-down
7996@kindex M-down (Summary)
7997@findex gnus-summary-next-thread
7998Go to the next thread (@code{gnus-summary-next-thread}).
7999
8000@item T p
8001@kindex T p (Summary)
8002@itemx C-M-b
8003@kindex C-M-p (Summary)
8004@itemx M-up
8005@kindex M-up (Summary)
8006@findex gnus-summary-prev-thread
8007Go to the previous thread (@code{gnus-summary-prev-thread}).
8008
8009@item T d
8010@kindex T d (Summary)
8011@findex gnus-summary-down-thread
8012Descend the thread (@code{gnus-summary-down-thread}).
8013
8014@item T u
8015@kindex T u (Summary)
8016@findex gnus-summary-up-thread
8017Ascend the thread (@code{gnus-summary-up-thread}).
8018
8019@item T o
8020@kindex T o (Summary)
8021@findex gnus-summary-top-thread
8022Go to the top of the thread (@code{gnus-summary-top-thread}).
8023@end table
8024
8025@vindex gnus-thread-operation-ignore-subject
8026If you ignore subject while threading, you'll naturally end up with
8027threads that have several different subjects in them. If you then issue
8028a command like @kbd{T k} (@code{gnus-summary-kill-thread}) you might not
8029wish to kill the entire thread, but just those parts of the thread that
8030have the same subject as the current article. If you like this idea,
8031you can fiddle with @code{gnus-thread-operation-ignore-subject}. If it
8032is non-@code{nil} (which it is by default), subjects will be ignored
8033when doing thread commands. If this variable is @code{nil}, articles in
8034the same thread with different subjects will not be included in the
8035operation in question. If this variable is @code{fuzzy}, only articles
8036that have subjects fuzzily equal will be included (@pxref{Fuzzy
8037Matching}).
8038
8039
8040@node Sorting the Summary Buffer
8041@section Sorting the Summary Buffer
8042
8043@findex gnus-thread-sort-by-total-score
8044@findex gnus-thread-sort-by-date
8045@findex gnus-thread-sort-by-score
8046@findex gnus-thread-sort-by-subject
8047@findex gnus-thread-sort-by-author
01c52d31 8048@findex gnus-thread-sort-by-recipient
4009494e
GM
8049@findex gnus-thread-sort-by-number
8050@findex gnus-thread-sort-by-random
8051@vindex gnus-thread-sort-functions
8052@findex gnus-thread-sort-by-most-recent-number
8053@findex gnus-thread-sort-by-most-recent-date
8054If you are using a threaded summary display, you can sort the threads by
8055setting @code{gnus-thread-sort-functions}, which can be either a single
8056function, a list of functions, or a list containing functions and
8057@code{(not some-function)} elements.
8058
8059By default, sorting is done on article numbers. Ready-made sorting
8060predicate functions include @code{gnus-thread-sort-by-number},
01c52d31
MB
8061@code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-recipient},
8062@code{gnus-thread-sort-by-subject},
8063@code{gnus-thread-sort-by-date},
8064@code{gnus-thread-sort-by-score},
4009494e
GM
8065@code{gnus-thread-sort-by-most-recent-number},
8066@code{gnus-thread-sort-by-most-recent-date},
8067@code{gnus-thread-sort-by-random} and
8068@code{gnus-thread-sort-by-total-score}.
8069
8070Each function takes two threads and returns non-@code{nil} if the first
8071thread should be sorted before the other. Note that sorting really is
8072normally done by looking only at the roots of each thread.
8073
8074If you use more than one function, the primary sort key should be the
8075last function in the list. You should probably always include
8076@code{gnus-thread-sort-by-number} in the list of sorting
8077functions---preferably first. This will ensure that threads that are
8078equal with respect to the other sort criteria will be displayed in
8079ascending article order.
8080
8081If you would like to sort by reverse score, then by subject, and finally
8082by number, you could do something like:
8083
8084@lisp
8085(setq gnus-thread-sort-functions
8086 '(gnus-thread-sort-by-number
8087 gnus-thread-sort-by-subject
8088 (not gnus-thread-sort-by-total-score)))
8089@end lisp
8090
8091The threads that have highest score will be displayed first in the
8092summary buffer. When threads have the same score, they will be sorted
8093alphabetically. The threads that have the same score and the same
8094subject will be sorted by number, which is (normally) the sequence in
8095which the articles arrived.
8096
8097If you want to sort by score and then reverse arrival order, you could
8098say something like:
8099
8100@lisp
8101(setq gnus-thread-sort-functions
01c52d31 8102 '((not gnus-thread-sort-by-number)
4009494e
GM
8103 gnus-thread-sort-by-score))
8104@end lisp
8105
8106@vindex gnus-thread-score-function
8107The function in the @code{gnus-thread-score-function} variable (default
8108@code{+}) is used for calculating the total score of a thread. Useful
8109functions might be @code{max}, @code{min}, or squared means, or whatever
8110tickles your fancy.
8111
8112@findex gnus-article-sort-functions
8113@findex gnus-article-sort-by-date
6ecfe5c2 8114@findex gnus-article-sort-by-most-recent-date
4009494e
GM
8115@findex gnus-article-sort-by-score
8116@findex gnus-article-sort-by-subject
8117@findex gnus-article-sort-by-author
8118@findex gnus-article-sort-by-random
8119@findex gnus-article-sort-by-number
6ecfe5c2 8120@findex gnus-article-sort-by-most-recent-number
4009494e
GM
8121If you are using an unthreaded display for some strange reason or
8122other, you have to fiddle with the @code{gnus-article-sort-functions}
8123variable. It is very similar to the
8124@code{gnus-thread-sort-functions}, except that it uses slightly
8125different functions for article comparison. Available sorting
8126predicate functions are @code{gnus-article-sort-by-number},
8127@code{gnus-article-sort-by-author},
8128@code{gnus-article-sort-by-subject}, @code{gnus-article-sort-by-date},
8129@code{gnus-article-sort-by-random}, and
8130@code{gnus-article-sort-by-score}.
8131
8132If you want to sort an unthreaded summary display by subject, you could
8133say something like:
8134
8135@lisp
8136(setq gnus-article-sort-functions
8137 '(gnus-article-sort-by-number
8138 gnus-article-sort-by-subject))
8139@end lisp
8140
01c52d31
MB
8141You can define group specific sorting via @code{gnus-parameters},
8142@xref{Group Parameters}.
4009494e
GM
8143
8144
8145@node Asynchronous Fetching
8146@section Asynchronous Article Fetching
8147@cindex asynchronous article fetching
8148@cindex article pre-fetch
8149@cindex pre-fetch
8150
8151If you read your news from an @acronym{NNTP} server that's far away, the
8152network latencies may make reading articles a chore. You have to wait
8153for a while after pressing @kbd{n} to go to the next article before the
8154article appears. Why can't Gnus just go ahead and fetch the article
8155while you are reading the previous one? Why not, indeed.
8156
8157First, some caveats. There are some pitfalls to using asynchronous
8158article fetching, especially the way Gnus does it.
8159
8160Let's say you are reading article 1, which is short, and article 2 is
8161quite long, and you are not interested in reading that. Gnus does not
8162know this, so it goes ahead and fetches article 2. You decide to read
8163article 3, but since Gnus is in the process of fetching article 2, the
8164connection is blocked.
8165
8166To avoid these situations, Gnus will open two (count 'em two)
8167connections to the server. Some people may think this isn't a very nice
8168thing to do, but I don't see any real alternatives. Setting up that
8169extra connection takes some time, so Gnus startup will be slower.
8170
8171Gnus will fetch more articles than you will read. This will mean that
8172the link between your machine and the @acronym{NNTP} server will become more
8173loaded than if you didn't use article pre-fetch. The server itself will
8174also become more loaded---both with the extra article requests, and the
8175extra connection.
8176
8177Ok, so now you know that you shouldn't really use this thing@dots{} unless
8178you really want to.
8179
8180@vindex gnus-asynchronous
8181Here's how: Set @code{gnus-asynchronous} to @code{t}. The rest should
8182happen automatically.
8183
8184@vindex gnus-use-article-prefetch
8185You can control how many articles are to be pre-fetched by setting
8186@code{gnus-use-article-prefetch}. This is 30 by default, which means
8187that when you read an article in the group, the back end will pre-fetch
8188the next 30 articles. If this variable is @code{t}, the back end will
8189pre-fetch all the articles it can without bound. If it is
8190@code{nil}, no pre-fetching will be done.
8191
8192@vindex gnus-async-prefetch-article-p
8193@findex gnus-async-unread-p
8194There are probably some articles that you don't want to pre-fetch---read
8195articles, for instance. The @code{gnus-async-prefetch-article-p}
8196variable controls whether an article is to be pre-fetched. This
8197function should return non-@code{nil} when the article in question is
8198to be pre-fetched. The default is @code{gnus-async-unread-p}, which
8199returns @code{nil} on read articles. The function is called with an
8200article data structure as the only parameter.
8201
8202If, for instance, you wish to pre-fetch only unread articles shorter
8203than 100 lines, you could say something like:
8204
8205@lisp
8206(defun my-async-short-unread-p (data)
8207 "Return non-nil for short, unread articles."
8208 (and (gnus-data-unread-p data)
8209 (< (mail-header-lines (gnus-data-header data))
8210 100)))
8211
8212(setq gnus-async-prefetch-article-p 'my-async-short-unread-p)
8213@end lisp
8214
8215These functions will be called many, many times, so they should
8216preferably be short and sweet to avoid slowing down Gnus too much.
8217It's probably a good idea to byte-compile things like this.
8218
8219@vindex gnus-prefetched-article-deletion-strategy
8220Articles have to be removed from the asynch buffer sooner or later. The
8221@code{gnus-prefetched-article-deletion-strategy} says when to remove
8222articles. This is a list that may contain the following elements:
8223
8224@table @code
8225@item read
8226Remove articles when they are read.
8227
8228@item exit
8229Remove articles when exiting the group.
8230@end table
8231
8232The default value is @code{(read exit)}.
8233
8234@c @vindex gnus-use-header-prefetch
8235@c If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles
8236@c from the next group.
8237
8238
8239@node Article Caching
8240@section Article Caching
8241@cindex article caching
8242@cindex caching
8243
8244If you have an @emph{extremely} slow @acronym{NNTP} connection, you may
8245consider turning article caching on. Each article will then be stored
8246locally under your home directory. As you may surmise, this could
8247potentially use @emph{huge} amounts of disk space, as well as eat up all
8248your inodes so fast it will make your head swim. In vodka.
8249
8250Used carefully, though, it could be just an easier way to save articles.
8251
8252@vindex gnus-use-long-file-name
8253@vindex gnus-cache-directory
8254@vindex gnus-use-cache
8255To turn caching on, set @code{gnus-use-cache} to @code{t}. By default,
8256all articles ticked or marked as dormant will then be copied
8257over to your local cache (@code{gnus-cache-directory}). Whether this
8258cache is flat or hierarchical is controlled by the
8259@code{gnus-use-long-file-name} variable, as usual.
8260
8261When re-selecting a ticked or dormant article, it will be fetched from the
8262cache instead of from the server. As articles in your cache will never
8263expire, this might serve as a method of saving articles while still
8264keeping them where they belong. Just mark all articles you want to save
8265as dormant, and don't worry.
8266
8267When an article is marked as read, is it removed from the cache.
8268
8269@vindex gnus-cache-remove-articles
8270@vindex gnus-cache-enter-articles
8271The entering/removal of articles from the cache is controlled by the
8272@code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}
8273variables. Both are lists of symbols. The first is @code{(ticked
8274dormant)} by default, meaning that ticked and dormant articles will be
8275put in the cache. The latter is @code{(read)} by default, meaning that
8276articles marked as read are removed from the cache. Possibly
8277symbols in these two lists are @code{ticked}, @code{dormant},
8278@code{unread} and @code{read}.
8279
8280@findex gnus-jog-cache
8281So where does the massive article-fetching and storing come into the
8282picture? The @code{gnus-jog-cache} command will go through all
8283subscribed newsgroups, request all unread articles, score them, and
8284store them in the cache. You should only ever, ever ever ever, use this
8285command if 1) your connection to the @acronym{NNTP} server is really, really,
8286really slow and 2) you have a really, really, really huge disk.
8287Seriously. One way to cut down on the number of articles downloaded is
8288to score unwanted articles down and have them marked as read. They will
8289not then be downloaded by this command.
8290
8291@vindex gnus-uncacheable-groups
8292@vindex gnus-cacheable-groups
8293It is likely that you do not want caching on all groups. For instance,
8294if your @code{nnml} mail is located under your home directory, it makes no
8295sense to cache it somewhere else under your home directory. Unless you
8296feel that it's neat to use twice as much space.
8297
8298To limit the caching, you could set @code{gnus-cacheable-groups} to a
8299regexp of groups to cache, @samp{^nntp} for instance, or set the
8300@code{gnus-uncacheable-groups} regexp to @samp{^nnml}, for instance.
8301Both variables are @code{nil} by default. If a group matches both
8302variables, the group is not cached.
8303
8304@findex gnus-cache-generate-nov-databases
8305@findex gnus-cache-generate-active
8306@vindex gnus-cache-active-file
8307The cache stores information on what articles it contains in its active
8308file (@code{gnus-cache-active-file}). If this file (or any other parts
8309of the cache) becomes all messed up for some reason or other, Gnus
8310offers two functions that will try to set things right. @kbd{M-x
8311gnus-cache-generate-nov-databases} will (re)build all the @acronym{NOV}
8312files, and @kbd{gnus-cache-generate-active} will (re)generate the active
8313file.
8314
8315@findex gnus-cache-move-cache
8316@code{gnus-cache-move-cache} will move your whole
8317@code{gnus-cache-directory} to some other location. You get asked to
8318where, isn't that cool?
8319
8320@node Persistent Articles
8321@section Persistent Articles
8322@cindex persistent articles
8323
8324Closely related to article caching, we have @dfn{persistent articles}.
8325In fact, it's just a different way of looking at caching, and much more
8326useful in my opinion.
8327
8328Say you're reading a newsgroup, and you happen on to some valuable gem
8329that you want to keep and treasure forever. You'd normally just save it
8330(using one of the many saving commands) in some file. The problem with
8331that is that it's just, well, yucky. Ideally you'd prefer just having
8332the article remain in the group where you found it forever; untouched by
8333the expiry going on at the news server.
8334
8335This is what a @dfn{persistent article} is---an article that just won't
8336be deleted. It's implemented using the normal cache functions, but
8337you use two explicit commands for managing persistent articles:
8338
8339@table @kbd
8340
8341@item *
8342@kindex * (Summary)
8343@findex gnus-cache-enter-article
8344Make the current article persistent (@code{gnus-cache-enter-article}).
8345
8346@item M-*
8347@kindex M-* (Summary)
8348@findex gnus-cache-remove-article
8349Remove the current article from the persistent articles
8350(@code{gnus-cache-remove-article}). This will normally delete the
8351article.
8352@end table
8353
8354Both these commands understand the process/prefix convention.
8355
8356To avoid having all ticked articles (and stuff) entered into the cache,
8357you should set @code{gnus-use-cache} to @code{passive} if you're just
8358interested in persistent articles:
8359
8360@lisp
8361(setq gnus-use-cache 'passive)
8362@end lisp
8363
01c52d31
MB
8364@node Sticky Articles
8365@section Sticky Articles
8366@cindex sticky articles
8367
8368When you select an article the current article buffer will be reused
8369according to the value of the variable
8370@code{gnus-single-article-buffer}. If its value is non-@code{nil} (the
8371default) all articles reuse the same article buffer. Else each group
8372has its own article buffer.
8373
8374This implies that it's not possible to have more than one article buffer
8375in a group at a time. But sometimes you might want to display all the
8376latest emails from your mother, your father, your aunt, your uncle and
8377your 17 cousins to coordinate the next christmas party.
8378
8379That's where sticky articles come in handy. A sticky article buffer
8380basically is a normal article buffer, but it won't be reused when you
8381select another article. You can make an article sticky with:
8382
8383@table @kbd
8384@item A S
8385@kindex A S (Summary)
8386@findex gnus-sticky-article
8387Make the current article sticky. If a prefix arg is given, ask for a
8388name for this sticky article buffer.
8389@end table
8390
8391To close a sticky article buffer you can use these commands:
8392
8393@table @kbd
8394@item q
8395@kindex q (Article)
8396@findex bury-buffer
8397Puts this sticky article buffer at the end of the list of all buffers.
8398
8399@item k
8400@kindex k (Article)
8401@findex gnus-kill-sticky-article-buffer
8402Kills this sticky article buffer.
8403@end table
8404
8405To kill all sticky article buffers you can use:
8406
8407@defun gnus-kill-sticky-article-buffers ARG
8408Kill all sticky article buffers.
8409If a prefix ARG is given, ask for confirmation.
8410@end defun
4009494e
GM
8411
8412@node Article Backlog
8413@section Article Backlog
8414@cindex backlog
8415@cindex article backlog
8416
8417If you have a slow connection, but the idea of using caching seems
8418unappealing to you (and it is, really), you can help the situation some
8419by switching on the @dfn{backlog}. This is where Gnus will buffer
8420already read articles so that it doesn't have to re-fetch articles
8421you've already read. This only helps if you are in the habit of
8422re-selecting articles you've recently read, of course. If you never do
8423that, turning the backlog on will slow Gnus down a little bit, and
8424increase memory usage some.
8425
8426@vindex gnus-keep-backlog
8427If you set @code{gnus-keep-backlog} to a number @var{n}, Gnus will store
8428at most @var{n} old articles in a buffer for later re-fetching. If this
8429variable is non-@code{nil} and is not a number, Gnus will store
8430@emph{all} read articles, which means that your Emacs will grow without
8431bound before exploding and taking your machine down with you. I put
8432that in there just to keep y'all on your toes.
8433
8434The default value is 20.
8435
8436
8437@node Saving Articles
8438@section Saving Articles
8439@cindex saving articles
8440
8441Gnus can save articles in a number of ways. Below is the documentation
8442for saving articles in a fairly straight-forward fashion (i.e., little
8443processing of the article is done before it is saved). For a different
8444approach (uudecoding, unsharing) you should use @code{gnus-uu}
8445(@pxref{Decoding Articles}).
8446
8447For the commands listed here, the target is a file. If you want to
8448save to a group, see the @kbd{B c} (@code{gnus-summary-copy-article})
8449command (@pxref{Mail Group Commands}).
8450
8451@vindex gnus-save-all-headers
8452If @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not delete
8453unwanted headers before saving the article.
8454
8455@vindex gnus-saved-headers
8456If the preceding variable is @code{nil}, all headers that match the
8457@code{gnus-saved-headers} regexp will be kept, while the rest will be
8458deleted before saving.
8459
8460@table @kbd
8461
8462@item O o
8463@itemx o
8464@kindex O o (Summary)
8465@kindex o (Summary)
8466@findex gnus-summary-save-article
8467@c @icon{gnus-summary-save-article}
8468Save the current article using the default article saver
8469(@code{gnus-summary-save-article}).
8470
8471@item O m
8472@kindex O m (Summary)
8473@findex gnus-summary-save-article-mail
8474Save the current article in a Unix mail box (mbox) file
8475(@code{gnus-summary-save-article-mail}).
8476
8477@item O r
8478@kindex O r (Summary)
8479@findex gnus-summary-save-article-rmail
8480Save the current article in Rmail format
8481(@code{gnus-summary-save-article-rmail}).
8482
8483@item O f
8484@kindex O f (Summary)
8485@findex gnus-summary-save-article-file
8486@c @icon{gnus-summary-save-article-file}
8487Save the current article in plain file format
8488(@code{gnus-summary-save-article-file}).
8489
8490@item O F
8491@kindex O F (Summary)
8492@findex gnus-summary-write-article-file
8493Write the current article in plain file format, overwriting any previous
8494file contents (@code{gnus-summary-write-article-file}).
8495
8496@item O b
8497@kindex O b (Summary)
8498@findex gnus-summary-save-article-body-file
8499Save the current article body in plain file format
8500(@code{gnus-summary-save-article-body-file}).
8501
8502@item O h
8503@kindex O h (Summary)
8504@findex gnus-summary-save-article-folder
8505Save the current article in mh folder format
8506(@code{gnus-summary-save-article-folder}).
8507
8508@item O v
8509@kindex O v (Summary)
8510@findex gnus-summary-save-article-vm
8511Save the current article in a VM folder
8512(@code{gnus-summary-save-article-vm}).
8513
8514@item O p
8515@itemx |
8516@kindex O p (Summary)
8517@kindex | (Summary)
8518@findex gnus-summary-pipe-output
89167438 8519@vindex gnus-summary-pipe-output-default-command
4009494e
GM
8520Save the current article in a pipe. Uhm, like, what I mean is---Pipe
8521the current article to a process (@code{gnus-summary-pipe-output}).
8522If given a symbolic prefix (@pxref{Symbolic Prefixes}), include the
6ecfe5c2
MB
8523complete headers in the piped output. The symbolic prefix @code{r} is
8524special; it lets this command pipe a raw article including all headers.
8525The @code{gnus-summary-pipe-output-default-command} variable can be set
8526to a string containing the default command and options (default
8527@code{nil}).
4009494e
GM
8528
8529@item O P
8530@kindex O P (Summary)
8531@findex gnus-summary-muttprint
8532@vindex gnus-summary-muttprint-program
8533Save the current article into muttprint. That is, print it using the
8534external program @uref{http://muttprint.sourceforge.net/,
8535Muttprint}. The program name and options to use is controlled by the
8536variable @code{gnus-summary-muttprint-program}.
8537(@code{gnus-summary-muttprint}).
8538
8539@end table
8540
8541@vindex gnus-prompt-before-saving
8542All these commands use the process/prefix convention
8543(@pxref{Process/Prefix}). If you save bunches of articles using these
8544functions, you might get tired of being prompted for files to save each
8545and every article in. The prompting action is controlled by
8546the @code{gnus-prompt-before-saving} variable, which is @code{always} by
8547default, giving you that excessive prompting action you know and
8548loathe. If you set this variable to @code{t} instead, you'll be prompted
8549just once for each series of articles you save. If you like to really
8550have Gnus do all your thinking for you, you can even set this variable
8551to @code{nil}, which means that you will never be prompted for files to
8552save articles in. Gnus will simply save all the articles in the default
8553files.
8554
8555
8556@vindex gnus-default-article-saver
8557You can customize the @code{gnus-default-article-saver} variable to make
8558Gnus do what you want it to. You can use any of the eight ready-made
8559functions below, or you can create your own.
8560
8561@table @code
8562
8563@item gnus-summary-save-in-rmail
8564@findex gnus-summary-save-in-rmail
8565@vindex gnus-rmail-save-name
8566@findex gnus-plain-save-name
8567This is the default format, @dfn{Babyl}. Uses the function in the
8568@code{gnus-rmail-save-name} variable to get a file name to save the
8569article in. The default is @code{gnus-plain-save-name}.
8570
8571@item gnus-summary-save-in-mail
8572@findex gnus-summary-save-in-mail
8573@vindex gnus-mail-save-name
8574Save in a Unix mail (mbox) file. Uses the function in the
8575@code{gnus-mail-save-name} variable to get a file name to save the
8576article in. The default is @code{gnus-plain-save-name}.
8577
8578@item gnus-summary-save-in-file
8579@findex gnus-summary-save-in-file
8580@vindex gnus-file-save-name
8581@findex gnus-numeric-save-name
8582Append the article straight to an ordinary file. Uses the function in
8583the @code{gnus-file-save-name} variable to get a file name to save the
8584article in. The default is @code{gnus-numeric-save-name}.
8585
8586@item gnus-summary-write-to-file
8587@findex gnus-summary-write-to-file
8588Write the article straight to an ordinary file. The file is
8589overwritten if it exists. Uses the function in the
8590@code{gnus-file-save-name} variable to get a file name to save the
8591article in. The default is @code{gnus-numeric-save-name}.
8592
8593@item gnus-summary-save-body-in-file
8594@findex gnus-summary-save-body-in-file
8595Append the article body to an ordinary file. Uses the function in the
8596@code{gnus-file-save-name} variable to get a file name to save the
8597article in. The default is @code{gnus-numeric-save-name}.
8598
8599@item gnus-summary-write-body-to-file
8600@findex gnus-summary-write-body-to-file
8601Write the article body straight to an ordinary file. The file is
8602overwritten if it exists. Uses the function in the
8603@code{gnus-file-save-name} variable to get a file name to save the
8604article in. The default is @code{gnus-numeric-save-name}.
8605
8606@item gnus-summary-save-in-folder
8607@findex gnus-summary-save-in-folder
8608@findex gnus-folder-save-name
8609@findex gnus-Folder-save-name
8610@vindex gnus-folder-save-name
8611@cindex rcvstore
8612@cindex MH folders
8613Save the article to an MH folder using @code{rcvstore} from the MH
8614library. Uses the function in the @code{gnus-folder-save-name} variable
8615to get a file name to save the article in. The default is
8616@code{gnus-folder-save-name}, but you can also use
8617@code{gnus-Folder-save-name}, which creates capitalized names.
8618
8619@item gnus-summary-save-in-vm
8620@findex gnus-summary-save-in-vm
8621Save the article in a VM folder. You have to have the VM mail
8622reader to use this setting.
89167438
MB
8623
8624@item gnus-summary-save-in-pipe
8625@findex gnus-summary-save-in-pipe
d62672f3
MB
8626Pipe the article to a shell command. This function takes optional two
8627arguments COMMAND and RAW. Valid values for COMMAND include:
8628
8629@itemize @bullet
8630@item a string@*
8631The executable command name and possibly arguments.
8632@item @code{nil}@*
8633You will be prompted for the command in the minibuffer.
8634@item the symbol @code{default}@*
8635It will be replaced with the command which the variable
8636@code{gnus-summary-pipe-output-default-command} holds or the command
8637last used for saving.
8638@end itemize
8639
8640Non-@code{nil} value for RAW overrides @code{:decode} and
8641@code{:headers} properties (see below) and the raw article including all
8642headers will be piped.
4009494e
GM
8643@end table
8644
8645The symbol of each function may have the following properties:
8646
8647@table @code
8648@item :decode
8649The value non-@code{nil} means save decoded articles. This is
8650meaningful only with @code{gnus-summary-save-in-file},
8651@code{gnus-summary-save-body-in-file},
89167438
MB
8652@code{gnus-summary-write-to-file},
8653@code{gnus-summary-write-body-to-file}, and
8654@code{gnus-summary-save-in-pipe}.
4009494e
GM
8655
8656@item :function
8657The value specifies an alternative function which appends, not
8658overwrites, articles to a file. This implies that when saving many
8659articles at a time, @code{gnus-prompt-before-saving} is bound to
8660@code{t} and all articles are saved in a single file. This is
8661meaningful only with @code{gnus-summary-write-to-file} and
8662@code{gnus-summary-write-body-to-file}.
8663
8664@item :headers
8665The value specifies the symbol of a variable of which the value
8666specifies headers to be saved. If it is omitted,
8667@code{gnus-save-all-headers} and @code{gnus-saved-headers} control what
8668headers should be saved.
8669@end table
8670
8671@vindex gnus-article-save-directory
8672All of these functions, except for the last one, will save the article
8673in the @code{gnus-article-save-directory}, which is initialized from the
8674@env{SAVEDIR} environment variable. This is @file{~/News/} by
8675default.
8676
8677As you can see above, the functions use different functions to find a
8678suitable name of a file to save the article in. Below is a list of
8679available functions that generate names:
8680
8681@table @code
8682
8683@item gnus-Numeric-save-name
8684@findex gnus-Numeric-save-name
8685File names like @file{~/News/Alt.andrea-dworkin/45}.
8686
8687@item gnus-numeric-save-name
8688@findex gnus-numeric-save-name
8689File names like @file{~/News/alt.andrea-dworkin/45}.
8690
8691@item gnus-Plain-save-name
8692@findex gnus-Plain-save-name
8693File names like @file{~/News/Alt.andrea-dworkin}.
8694
8695@item gnus-plain-save-name
8696@findex gnus-plain-save-name
8697File names like @file{~/News/alt.andrea-dworkin}.
8698
8699@item gnus-sender-save-name
8700@findex gnus-sender-save-name
8701File names like @file{~/News/larsi}.
8702@end table
8703
8704@vindex gnus-split-methods
8705You can have Gnus suggest where to save articles by plonking a regexp into
8706the @code{gnus-split-methods} alist. For instance, if you would like to
8707save articles related to Gnus in the file @file{gnus-stuff}, and articles
8708related to VM in @file{vm-stuff}, you could set this variable to something
8709like:
8710
8711@lisp
8712(("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff")
8713 ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff")
8714 (my-choosing-function "../other-dir/my-stuff")
8715 ((equal gnus-newsgroup-name "mail.misc") "mail-stuff"))
8716@end lisp
8717
8718We see that this is a list where each element is a list that has two
8719elements---the @dfn{match} and the @dfn{file}. The match can either be
8720a string (in which case it is used as a regexp to match on the article
8721head); it can be a symbol (which will be called as a function with the
8722group name as a parameter); or it can be a list (which will be
8723@code{eval}ed). If any of these actions have a non-@code{nil} result,
8724the @dfn{file} will be used as a default prompt. In addition, the
8725result of the operation itself will be used if the function or form
8726called returns a string or a list of strings.
8727
8728You basically end up with a list of file names that might be used when
8729saving the current article. (All ``matches'' will be used.) You will
8730then be prompted for what you really want to use as a name, with file
8731name completion over the results from applying this variable.
8732
8733This variable is @code{((gnus-article-archive-name))} by default, which
8734means that Gnus will look at the articles it saves for an
8735@code{Archive-name} line and use that as a suggestion for the file
8736name.
8737
8738Here's an example function to clean up file names somewhat. If you have
8739lots of mail groups called things like
8740@samp{nnml:mail.whatever}, you may want to chop off the beginning of
8741these group names before creating the file name to save to. The
8742following will do just that:
8743
8744@lisp
8745(defun my-save-name (group)
8746 (when (string-match "^nnml:mail." group)
8747 (substring group (match-end 0))))
8748
8749(setq gnus-split-methods
8750 '((gnus-article-archive-name)
8751 (my-save-name)))
8752@end lisp
8753
8754
8755@vindex gnus-use-long-file-name
8756Finally, you have the @code{gnus-use-long-file-name} variable. If it is
8757@code{nil}, all the preceding functions will replace all periods
8758(@samp{.}) in the group names with slashes (@samp{/})---which means that
8759the functions will generate hierarchies of directories instead of having
8760all the files in the top level directory
8761(@file{~/News/alt/andrea-dworkin} instead of
8762@file{~/News/alt.andrea-dworkin}.) This variable is @code{t} by default
8763on most systems. However, for historical reasons, this is @code{nil} on
8764Xenix and usg-unix-v machines by default.
8765
8766This function also affects kill and score file names. If this variable
8767is a list, and the list contains the element @code{not-score}, long file
8768names will not be used for score files, if it contains the element
8769@code{not-save}, long file names will not be used for saving, and if it
8770contains the element @code{not-kill}, long file names will not be used
8771for kill files.
8772
8773If you'd like to save articles in a hierarchy that looks something like
8774a spool, you could
8775
8776@lisp
8777(setq gnus-use-long-file-name '(not-save)) ; @r{to get a hierarchy}
8778(setq gnus-default-article-saver
8779 'gnus-summary-save-in-file) ; @r{no encoding}
8780@end lisp
8781
8782Then just save with @kbd{o}. You'd then read this hierarchy with
8783ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and
8784the top level directory as the argument (@file{~/News/}). Then just walk
8785around to the groups/directories with @code{nneething}.
8786
8787
8788@node Decoding Articles
8789@section Decoding Articles
8790@cindex decoding articles
8791
8792Sometime users post articles (or series of articles) that have been
8793encoded in some way or other. Gnus can decode them for you.
8794
8795@menu
8796* Uuencoded Articles:: Uudecode articles.
8797* Shell Archives:: Unshar articles.
8798* PostScript Files:: Split PostScript.
8799* Other Files:: Plain save and binhex.
8800* Decoding Variables:: Variables for a happy decoding.
8801* Viewing Files:: You want to look at the result of the decoding?
8802@end menu
8803
8804@cindex series
8805@cindex article series
8806All these functions use the process/prefix convention
8807(@pxref{Process/Prefix}) for finding out what articles to work on, with
8808the extension that a ``single article'' means ``a single series''. Gnus
8809can find out by itself what articles belong to a series, decode all the
8810articles and unpack/view/save the resulting file(s).
8811
8812Gnus guesses what articles are in the series according to the following
8813simplish rule: The subjects must be (nearly) identical, except for the
8814last two numbers of the line. (Spaces are largely ignored, however.)
8815
8816For example: If you choose a subject called @samp{cat.gif (2/3)}, Gnus
8817will find all the articles that match the regexp @samp{^cat.gif
8818([0-9]+/[0-9]+).*$}.
8819
8820Subjects that are non-standard, like @samp{cat.gif (2/3) Part 6 of a
8821series}, will not be properly recognized by any of the automatic viewing
8822commands, and you have to mark the articles manually with @kbd{#}.
8823
8824
8825@node Uuencoded Articles
8826@subsection Uuencoded Articles
8827@cindex uudecode
8828@cindex uuencoded articles
8829
8830@table @kbd
8831
8832@item X u
8833@kindex X u (Summary)
8834@findex gnus-uu-decode-uu
8835@c @icon{gnus-uu-decode-uu}
8836Uudecodes the current series (@code{gnus-uu-decode-uu}).
8837
8838@item X U
8839@kindex X U (Summary)
8840@findex gnus-uu-decode-uu-and-save
8841Uudecodes and saves the current series
8842(@code{gnus-uu-decode-uu-and-save}).
8843
8844@item X v u
8845@kindex X v u (Summary)
8846@findex gnus-uu-decode-uu-view
8847Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}).
8848
8849@item X v U
8850@kindex X v U (Summary)
8851@findex gnus-uu-decode-uu-and-save-view
8852Uudecodes, views and saves the current series
8853(@code{gnus-uu-decode-uu-and-save-view}).
8854
8855@end table
8856
8857Remember that these all react to the presence of articles marked with
8858the process mark. If, for instance, you'd like to decode and save an
8859entire newsgroup, you'd typically do @kbd{M P a}
8860(@code{gnus-uu-mark-all}) and then @kbd{X U}
8861(@code{gnus-uu-decode-uu-and-save}).
8862
8863All this is very much different from how @code{gnus-uu} worked with
8864@sc{gnus 4.1}, where you had explicit keystrokes for everything under
8865the sun. This version of @code{gnus-uu} generally assumes that you mark
8866articles in some way (@pxref{Setting Process Marks}) and then press
8867@kbd{X u}.
8868
8869@vindex gnus-uu-notify-files
8870Note: When trying to decode articles that have names matching
8871@code{gnus-uu-notify-files}, which is hard-coded to
8872@samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will
8873automatically post an article on @samp{comp.unix.wizards} saying that
8874you have just viewed the file in question. This feature can't be turned
8875off.
8876
8877
8878@node Shell Archives
8879@subsection Shell Archives
8880@cindex unshar
8881@cindex shell archives
8882@cindex shared articles
8883
8884Shell archives (``shar files'') used to be a popular way to distribute
8885sources, but it isn't used all that much today. In any case, we have
8886some commands to deal with these:
8887
8888@table @kbd
8889
8890@item X s
8891@kindex X s (Summary)
8892@findex gnus-uu-decode-unshar
8893Unshars the current series (@code{gnus-uu-decode-unshar}).
8894
8895@item X S
8896@kindex X S (Summary)
8897@findex gnus-uu-decode-unshar-and-save
8898Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}).
8899
8900@item X v s
8901@kindex X v s (Summary)
8902@findex gnus-uu-decode-unshar-view
8903Unshars and views the current series (@code{gnus-uu-decode-unshar-view}).
8904
8905@item X v S
8906@kindex X v S (Summary)
8907@findex gnus-uu-decode-unshar-and-save-view
8908Unshars, views and saves the current series
8909(@code{gnus-uu-decode-unshar-and-save-view}).
8910@end table
8911
8912
8913@node PostScript Files
8914@subsection PostScript Files
8915@cindex PostScript
8916
8917@table @kbd
8918
8919@item X p
8920@kindex X p (Summary)
8921@findex gnus-uu-decode-postscript
8922Unpack the current PostScript series (@code{gnus-uu-decode-postscript}).
8923
8924@item X P
8925@kindex X P (Summary)
8926@findex gnus-uu-decode-postscript-and-save
8927Unpack and save the current PostScript series
8928(@code{gnus-uu-decode-postscript-and-save}).
8929
8930@item X v p
8931@kindex X v p (Summary)
8932@findex gnus-uu-decode-postscript-view
8933View the current PostScript series
8934(@code{gnus-uu-decode-postscript-view}).
8935
8936@item X v P
8937@kindex X v P (Summary)
8938@findex gnus-uu-decode-postscript-and-save-view
8939View and save the current PostScript series
8940(@code{gnus-uu-decode-postscript-and-save-view}).
8941@end table
8942
8943
8944@node Other Files
8945@subsection Other Files
8946
8947@table @kbd
8948@item X o
8949@kindex X o (Summary)
8950@findex gnus-uu-decode-save
8951Save the current series
8952(@code{gnus-uu-decode-save}).
8953
8954@item X b
8955@kindex X b (Summary)
8956@findex gnus-uu-decode-binhex
8957Unbinhex the current series (@code{gnus-uu-decode-binhex}). This
8958doesn't really work yet.
b890d447
MB
8959
8960@item X Y
8961@kindex X Y (Summary)
8962@findex gnus-uu-decode-yenc
8963yEnc-decode the current series and save it (@code{gnus-uu-decode-yenc}).
4009494e
GM
8964@end table
8965
8966
8967@node Decoding Variables
8968@subsection Decoding Variables
8969
8970Adjective, not verb.
8971
8972@menu
8973* Rule Variables:: Variables that say how a file is to be viewed.
8974* Other Decode Variables:: Other decode variables.
8975* Uuencoding and Posting:: Variables for customizing uuencoding.
8976@end menu
8977
8978
8979@node Rule Variables
8980@subsubsection Rule Variables
8981@cindex rule variables
8982
8983Gnus uses @dfn{rule variables} to decide how to view a file. All these
8984variables are of the form
8985
8986@lisp
8987 (list '(regexp1 command2)
8988 '(regexp2 command2)
8989 ...)
8990@end lisp
8991
8992@table @code
8993
8994@item gnus-uu-user-view-rules
8995@vindex gnus-uu-user-view-rules
8996@cindex sox
8997This variable is consulted first when viewing files. If you wish to use,
8998for instance, @code{sox} to convert an @file{.au} sound file, you could
8999say something like:
9000@lisp
9001(setq gnus-uu-user-view-rules
9002 (list '("\\\\.au$" "sox %s -t .aiff > /dev/audio")))
9003@end lisp
9004
9005@item gnus-uu-user-view-rules-end
9006@vindex gnus-uu-user-view-rules-end
9007This variable is consulted if Gnus couldn't make any matches from the
9008user and default view rules.
9009
9010@item gnus-uu-user-archive-rules
9011@vindex gnus-uu-user-archive-rules
9012This variable can be used to say what commands should be used to unpack
9013archives.
9014@end table
9015
9016
9017@node Other Decode Variables
9018@subsubsection Other Decode Variables
9019
9020@table @code
9021@vindex gnus-uu-grabbed-file-functions
9022
9023@item gnus-uu-grabbed-file-functions
9024All functions in this list will be called right after each file has been
9025successfully decoded---so that you can move or view files right away,
9026and don't have to wait for all files to be decoded before you can do
9027anything. Ready-made functions you can put in this list are:
9028
9029@table @code
9030
9031@item gnus-uu-grab-view
9032@findex gnus-uu-grab-view
9033View the file.
9034
9035@item gnus-uu-grab-move
9036@findex gnus-uu-grab-move
9037Move the file (if you're using a saving function.)
9038@end table
9039
9040@item gnus-uu-be-dangerous
9041@vindex gnus-uu-be-dangerous
9042Specifies what to do if unusual situations arise during decoding. If
9043@code{nil}, be as conservative as possible. If @code{t}, ignore things
9044that didn't work, and overwrite existing files. Otherwise, ask each
9045time.
9046
9047@item gnus-uu-ignore-files-by-name
9048@vindex gnus-uu-ignore-files-by-name
9049Files with name matching this regular expression won't be viewed.
9050
9051@item gnus-uu-ignore-files-by-type
9052@vindex gnus-uu-ignore-files-by-type
9053Files with a @acronym{MIME} type matching this variable won't be viewed.
9054Note that Gnus tries to guess what type the file is based on the name.
9055@code{gnus-uu} is not a @acronym{MIME} package (yet), so this is slightly
9056kludgey.
9057
9058@item gnus-uu-tmp-dir
9059@vindex gnus-uu-tmp-dir
9060Where @code{gnus-uu} does its work.
9061
9062@item gnus-uu-do-not-unpack-archives
9063@vindex gnus-uu-do-not-unpack-archives
9064Non-@code{nil} means that @code{gnus-uu} won't peek inside archives
9065looking for files to display.
9066
9067@item gnus-uu-view-and-save
9068@vindex gnus-uu-view-and-save
9069Non-@code{nil} means that the user will always be asked to save a file
9070after viewing it.
9071
9072@item gnus-uu-ignore-default-view-rules
9073@vindex gnus-uu-ignore-default-view-rules
9074Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing
9075rules.
9076
9077@item gnus-uu-ignore-default-archive-rules
9078@vindex gnus-uu-ignore-default-archive-rules
9079Non-@code{nil} means that @code{gnus-uu} will ignore the default archive
9080unpacking commands.
9081
9082@item gnus-uu-kill-carriage-return
9083@vindex gnus-uu-kill-carriage-return
9084Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns
9085from articles.
9086
9087@item gnus-uu-unmark-articles-not-decoded
9088@vindex gnus-uu-unmark-articles-not-decoded
9089Non-@code{nil} means that @code{gnus-uu} will mark unsuccessfully
9090decoded articles as unread.
9091
9092@item gnus-uu-correct-stripped-uucode
9093@vindex gnus-uu-correct-stripped-uucode
9094Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix
9095uuencoded files that have had trailing spaces deleted.
9096
9097@item gnus-uu-pre-uudecode-hook
9098@vindex gnus-uu-pre-uudecode-hook
9099Hook run before sending a message to @code{uudecode}.
9100
9101@item gnus-uu-view-with-metamail
9102@vindex gnus-uu-view-with-metamail
9103@cindex metamail
9104Non-@code{nil} means that @code{gnus-uu} will ignore the viewing
9105commands defined by the rule variables and just fudge a @acronym{MIME}
9106content type based on the file name. The result will be fed to
9107@code{metamail} for viewing.
9108
9109@item gnus-uu-save-in-digest
9110@vindex gnus-uu-save-in-digest
9111Non-@code{nil} means that @code{gnus-uu}, when asked to save without
9112decoding, will save in digests. If this variable is @code{nil},
9113@code{gnus-uu} will just save everything in a file without any
9114embellishments. The digesting almost conforms to RFC 1153---no easy way
9115to specify any meaningful volume and issue numbers were found, so I
9116simply dropped them.
9117
9118@end table
9119
9120
9121@node Uuencoding and Posting
9122@subsubsection Uuencoding and Posting
9123
9124@table @code
9125
9126@item gnus-uu-post-include-before-composing
9127@vindex gnus-uu-post-include-before-composing
9128Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode
9129before you compose the article. If this variable is @code{t}, you can
9130either include an encoded file with @kbd{C-c C-i} or have one included
9131for you when you post the article.
9132
9133@item gnus-uu-post-length
9134@vindex gnus-uu-post-length
9135Maximum length of an article. The encoded file will be split into how
9136many articles it takes to post the entire file.
9137
9138@item gnus-uu-post-threaded
9139@vindex gnus-uu-post-threaded
9140Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a
9141thread. This may not be smart, as no other decoder I have seen is able
9142to follow threads when collecting uuencoded articles. (Well, I have
9143seen one package that does that---@code{gnus-uu}, but somehow, I don't
9144think that counts@dots{}) Default is @code{nil}.
9145
9146@item gnus-uu-post-separate-description
9147@vindex gnus-uu-post-separate-description
9148Non-@code{nil} means that the description will be posted in a separate
9149article. The first article will typically be numbered (0/x). If this
9150variable is @code{nil}, the description the user enters will be included
9151at the beginning of the first article, which will be numbered (1/x).
9152Default is @code{t}.
9153
9154@end table
9155
9156
9157@node Viewing Files
9158@subsection Viewing Files
9159@cindex viewing files
9160@cindex pseudo-articles
9161
9162After decoding, if the file is some sort of archive, Gnus will attempt
9163to unpack the archive and see if any of the files in the archive can be
9164viewed. For instance, if you have a gzipped tar file @file{pics.tar.gz}
9165containing the files @file{pic1.jpg} and @file{pic2.gif}, Gnus will
9166uncompress and de-tar the main file, and then view the two pictures.
9167This unpacking process is recursive, so if the archive contains archives
9168of archives, it'll all be unpacked.
9169
9170Finally, Gnus will normally insert a @dfn{pseudo-article} for each
9171extracted file into the summary buffer. If you go to these
9172``articles'', you will be prompted for a command to run (usually Gnus
9173will make a suggestion), and then the command will be run.
9174
9175@vindex gnus-view-pseudo-asynchronously
9176If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait
9177until the viewing is done before proceeding.
9178
9179@vindex gnus-view-pseudos
9180If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert
9181the pseudo-articles into the summary buffer, but view them
9182immediately. If this variable is @code{not-confirm}, the user won't even
9183be asked for a confirmation before viewing is done.
9184
9185@vindex gnus-view-pseudos-separately
9186If @code{gnus-view-pseudos-separately} is non-@code{nil}, one
9187pseudo-article will be created for each file to be viewed. If
9188@code{nil}, all files that use the same viewing command will be given as
9189a list of parameters to that command.
9190
9191@vindex gnus-insert-pseudo-articles
9192If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert
9193pseudo-articles when decoding. It is @code{t} by default.
9194
9195So; there you are, reading your @emph{pseudo-articles} in your
9196@emph{virtual newsgroup} from the @emph{virtual server}; and you think:
9197Why isn't anything real anymore? How did we get here?
9198
9199
9200@node Article Treatment
9201@section Article Treatment
9202
9203Reading through this huge manual, you may have quite forgotten that the
9204object of newsreaders is to actually, like, read what people have
9205written. Reading articles. Unfortunately, people are quite bad at
9206writing, so there are tons of functions and variables to make reading
9207these articles easier.
9208
9209@menu
9210* Article Highlighting:: You want to make the article look like fruit salad.
9211* Article Fontisizing:: Making emphasized text look nice.
9212* Article Hiding:: You also want to make certain info go away.
9213* Article Washing:: Lots of way-neat functions to make life better.
9214* Article Header:: Doing various header transformations.
9215* Article Buttons:: Click on URLs, Message-IDs, addresses and the like.
9216* Article Button Levels:: Controlling appearance of buttons.
9217* Article Date:: Grumble, UT!
9218* Article Display:: Display various stuff---X-Face, Picons, Smileys
9219* Article Signature:: What is a signature?
9220* Article Miscellanea:: Various other stuff.
9221@end menu
9222
9223
9224@node Article Highlighting
9225@subsection Article Highlighting
9226@cindex highlighting
9227
9228Not only do you want your article buffer to look like fruit salad, but
9229you want it to look like technicolor fruit salad.
9230
9231@table @kbd
9232
9233@item W H a
9234@kindex W H a (Summary)
9235@findex gnus-article-highlight
9236@findex gnus-article-maybe-highlight
9237Do much highlighting of the current article
9238(@code{gnus-article-highlight}). This function highlights header, cited
9239text, the signature, and adds buttons to the body and the head.
9240
9241@item W H h
9242@kindex W H h (Summary)
9243@findex gnus-article-highlight-headers
9244@vindex gnus-header-face-alist
9245Highlight the headers (@code{gnus-article-highlight-headers}). The
9246highlighting will be done according to the @code{gnus-header-face-alist}
9247variable, which is a list where each element has the form
9248@code{(@var{regexp} @var{name} @var{content})}.
9249@var{regexp} is a regular expression for matching the
9250header, @var{name} is the face used for highlighting the header name
9251(@pxref{Faces and Fonts}) and @var{content} is the face for highlighting
9252the header value. The first match made will be used. Note that
9253@var{regexp} shouldn't have @samp{^} prepended---Gnus will add one.
9254
9255@item W H c
9256@kindex W H c (Summary)
9257@findex gnus-article-highlight-citation
9258Highlight cited text (@code{gnus-article-highlight-citation}).
9259
9260Some variables to customize the citation highlights:
9261
9262@table @code
9263@vindex gnus-cite-parse-max-size
9264
9265@item gnus-cite-parse-max-size
9266If the article size in bytes is bigger than this variable (which is
926725000 by default), no citation highlighting will be performed.
9268
9269@item gnus-cite-max-prefix
9270@vindex gnus-cite-max-prefix
9271Maximum possible length for a citation prefix (default 20).
9272
9273@item gnus-cite-face-list
9274@vindex gnus-cite-face-list
9275List of faces used for highlighting citations (@pxref{Faces and Fonts}).
9276When there are citations from multiple articles in the same message,
9277Gnus will try to give each citation from each article its own face.
9278This should make it easier to see who wrote what.
9279
9280@item gnus-supercite-regexp
9281@vindex gnus-supercite-regexp
9282Regexp matching normal Supercite attribution lines.
9283
9284@item gnus-supercite-secondary-regexp
9285@vindex gnus-supercite-secondary-regexp
9286Regexp matching mangled Supercite attribution lines.
9287
9288@item gnus-cite-minimum-match-count
9289@vindex gnus-cite-minimum-match-count
9290Minimum number of identical prefixes we have to see before we believe
9291that it's a citation.
9292
9293@item gnus-cite-attribution-prefix
9294@vindex gnus-cite-attribution-prefix
9295Regexp matching the beginning of an attribution line.
9296
9297@item gnus-cite-attribution-suffix
9298@vindex gnus-cite-attribution-suffix
9299Regexp matching the end of an attribution line.
9300
9301@item gnus-cite-attribution-face
9302@vindex gnus-cite-attribution-face
9303Face used for attribution lines. It is merged with the face for the
9304cited text belonging to the attribution.
9305
9306@item gnus-cite-ignore-quoted-from
9307@vindex gnus-cite-ignore-quoted-from
9308If non-@code{nil}, no citation highlighting will be performed on lines
9309beginning with @samp{>From }. Those lines may have been quoted by MTAs
9310in order not to mix up with the envelope From line. The default value
9311is @code{t}.
9312
9313@end table
9314
9315
9316@item W H s
9317@kindex W H s (Summary)
9318@vindex gnus-signature-separator
9319@vindex gnus-signature-face
9320@findex gnus-article-highlight-signature
9321Highlight the signature (@code{gnus-article-highlight-signature}).
9322Everything after @code{gnus-signature-separator} (@pxref{Article
9323Signature}) in an article will be considered a signature and will be
9324highlighted with @code{gnus-signature-face}, which is @code{italic} by
9325default.
9326
9327@end table
9328
9329@xref{Customizing Articles}, for how to highlight articles automatically.
9330
9331
9332@node Article Fontisizing
9333@subsection Article Fontisizing
9334@cindex emphasis
9335@cindex article emphasis
9336
9337@findex gnus-article-emphasize
9338@kindex W e (Summary)
9339People commonly add emphasis to words in news articles by writing things
9340like @samp{_this_} or @samp{*this*} or @samp{/this/}. Gnus can make
9341this look nicer by running the article through the @kbd{W e}
9342(@code{gnus-article-emphasize}) command.
9343
9344@vindex gnus-emphasis-alist
9345How the emphasis is computed is controlled by the
9346@code{gnus-emphasis-alist} variable. This is an alist where the first
9347element is a regular expression to be matched. The second is a number
9348that says what regular expression grouping is used to find the entire
9349emphasized word. The third is a number that says what regexp grouping
9350should be displayed and highlighted. (The text between these two
9351groupings will be hidden.) The fourth is the face used for
9352highlighting.
9353
9354@lisp
9355(setq gnus-emphasis-alist
9356 '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline)
9357 ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold)))
9358@end lisp
9359
9360@cindex slash
9361@cindex asterisk
9362@cindex underline
9363@cindex /
9364@cindex *
9365
9366@vindex gnus-emphasis-underline
9367@vindex gnus-emphasis-bold
9368@vindex gnus-emphasis-italic
9369@vindex gnus-emphasis-underline-bold
9370@vindex gnus-emphasis-underline-italic
9371@vindex gnus-emphasis-bold-italic
9372@vindex gnus-emphasis-underline-bold-italic
9373By default, there are seven rules, and they use the following faces:
9374@code{gnus-emphasis-bold}, @code{gnus-emphasis-italic},
9375@code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic},
9376@code{gnus-emphasis-underline-italic},
9377@code{gnus-emphasis-underline-bold}, and
9378@code{gnus-emphasis-underline-bold-italic}.
9379
9380If you want to change these faces, you can either use @kbd{M-x
9381customize}, or you can use @code{copy-face}. For instance, if you want
9382to make @code{gnus-emphasis-italic} use a red face instead, you could
9383say something like:
9384
9385@lisp
9386(copy-face 'red 'gnus-emphasis-italic)
9387@end lisp
9388
9389@vindex gnus-group-highlight-words-alist
9390
9391If you want to highlight arbitrary words, you can use the
9392@code{gnus-group-highlight-words-alist} variable, which uses the same
9393syntax as @code{gnus-emphasis-alist}. The @code{highlight-words} group
9394parameter (@pxref{Group Parameters}) can also be used.
9395
9396@xref{Customizing Articles}, for how to fontize articles automatically.
9397
9398
9399@node Article Hiding
9400@subsection Article Hiding
9401@cindex article hiding
9402
9403Or rather, hiding certain things in each article. There usually is much
9404too much cruft in most articles.
9405
9406@table @kbd
9407
9408@item W W a
9409@kindex W W a (Summary)
9410@findex gnus-article-hide
9411Do quite a lot of hiding on the article buffer
9412(@kbd{gnus-article-hide}). In particular, this function will hide
9413headers, @acronym{PGP}, cited text and the signature.
9414
9415@item W W h
9416@kindex W W h (Summary)
9417@findex gnus-article-hide-headers
9418Hide headers (@code{gnus-article-hide-headers}). @xref{Hiding
9419Headers}.
9420
9421@item W W b
9422@kindex W W b (Summary)
9423@findex gnus-article-hide-boring-headers
9424Hide headers that aren't particularly interesting
9425(@code{gnus-article-hide-boring-headers}). @xref{Hiding Headers}.
9426
9427@item W W s
9428@kindex W W s (Summary)
9429@findex gnus-article-hide-signature
9430Hide signature (@code{gnus-article-hide-signature}). @xref{Article
9431Signature}.
9432
9433@item W W l
9434@kindex W W l (Summary)
9435@findex gnus-article-hide-list-identifiers
9436@vindex gnus-list-identifiers
9437Strip list identifiers specified in @code{gnus-list-identifiers}. These
9438are strings some mailing list servers add to the beginning of all
9439@code{Subject} headers---for example, @samp{[zebra 4711]}. Any leading
9440@samp{Re: } is skipped before stripping. @code{gnus-list-identifiers}
9441may not contain @code{\\(..\\)}.
9442
9443@table @code
9444
9445@item gnus-list-identifiers
9446@vindex gnus-list-identifiers
9447A regular expression that matches list identifiers to be removed from
9448subject. This can also be a list of regular expressions.
9449
9450@end table
9451
9452@item W W P
9453@kindex W W P (Summary)
9454@findex gnus-article-hide-pem
9455Hide @acronym{PEM} (privacy enhanced messages) cruft
9456(@code{gnus-article-hide-pem}).
9457
9458@item W W B
9459@kindex W W B (Summary)
9460@findex gnus-article-strip-banner
9461@vindex gnus-article-banner-alist
9462@vindex gnus-article-address-banner-alist
9463@cindex banner
9464@cindex OneList
9465@cindex stripping advertisements
9466@cindex advertisements
9467Strip the banner specified by the @code{banner} group parameter
9468(@code{gnus-article-strip-banner}). This is mainly used to hide those
9469annoying banners and/or signatures that some mailing lists and moderated
9470groups adds to all the messages. The way to use this function is to add
9471the @code{banner} group parameter (@pxref{Group Parameters}) to the
9472group you want banners stripped from. The parameter either be a string,
9473which will be interpreted as a regular expression matching text to be
9474removed, or the symbol @code{signature}, meaning that the (last)
9475signature should be removed, or other symbol, meaning that the
9476corresponding regular expression in @code{gnus-article-banner-alist} is
9477used.
9478
9479Regardless of a group, you can hide things like advertisements only when
9480the sender of an article has a certain mail address specified in
9481@code{gnus-article-address-banner-alist}.
9482
9483@table @code
9484
9485@item gnus-article-address-banner-alist
9486@vindex gnus-article-address-banner-alist
9487Alist of mail addresses and banners. Each element has the form
9488@code{(@var{address} . @var{banner})}, where @var{address} is a regexp
9489matching a mail address in the From header, @var{banner} is one of a
9490symbol @code{signature}, an item in @code{gnus-article-banner-alist},
9491a regexp and @code{nil}. If @var{address} matches author's mail
9492address, it will remove things like advertisements. For example, if a
9493sender has the mail address @samp{hail@@yoo-hoo.co.jp} and there is a
9494banner something like @samp{Do You Yoo-hoo!?} in all articles he
9495sends, you can use the following element to remove them:
9496
9497@lisp
9498("@@yoo-hoo\\.co\\.jp\\'" .
9499 "\n_+\nDo You Yoo-hoo!\\?\n.*\n.*\n")
9500@end lisp
9501
9502@end table
9503
9504@item W W c
9505@kindex W W c (Summary)
9506@findex gnus-article-hide-citation
9507Hide citation (@code{gnus-article-hide-citation}). Some variables for
9508customizing the hiding:
9509
9510@table @code
9511
9512@item gnus-cited-opened-text-button-line-format
9513@itemx gnus-cited-closed-text-button-line-format
9514@vindex gnus-cited-closed-text-button-line-format
9515@vindex gnus-cited-opened-text-button-line-format
9516Gnus adds buttons to show where the cited text has been hidden, and to
9517allow toggle hiding the text. The format of the variable is specified
9518by these format-like variable (@pxref{Formatting Variables}). These
9519specs are valid:
9520
9521@table @samp
9522@item b
9523Starting point of the hidden text.
9524@item e
9525Ending point of the hidden text.
9526@item l
9527Number of characters in the hidden region.
9528@item n
9529Number of lines of hidden text.
9530@end table
9531
9532@item gnus-cited-lines-visible
9533@vindex gnus-cited-lines-visible
9534The number of lines at the beginning of the cited text to leave
9535shown. This can also be a cons cell with the number of lines at the top
9536and bottom of the text, respectively, to remain visible.
9537
9538@end table
9539
9540@item W W C-c
9541@kindex W W C-c (Summary)
9542@findex gnus-article-hide-citation-maybe
9543
9544Hide citation (@code{gnus-article-hide-citation-maybe}) depending on the
9545following two variables:
9546
9547@table @code
9548@item gnus-cite-hide-percentage
9549@vindex gnus-cite-hide-percentage
9550If the cited text is of a bigger percentage than this variable (default
955150), hide the cited text.
9552
9553@item gnus-cite-hide-absolute
9554@vindex gnus-cite-hide-absolute
9555The cited text must have at least this length (default 10) before it
9556is hidden.
9557@end table
9558
9559@item W W C
9560@kindex W W C (Summary)
9561@findex gnus-article-hide-citation-in-followups
9562Hide cited text in articles that aren't roots
9563(@code{gnus-article-hide-citation-in-followups}). This isn't very
9564useful as an interactive command, but might be a handy function to stick
9565have happen automatically (@pxref{Customizing Articles}).
9566
9567@end table
9568
9569All these ``hiding'' commands are toggles, but if you give a negative
9570prefix to these commands, they will show what they have previously
9571hidden. If you give a positive prefix, they will always hide.
9572
9573Also @pxref{Article Highlighting} for further variables for
9574citation customization.
9575
9576@xref{Customizing Articles}, for how to hide article elements
9577automatically.
9578
9579
9580@node Article Washing
9581@subsection Article Washing
9582@cindex washing
9583@cindex article washing
9584
9585We call this ``article washing'' for a really good reason. Namely, the
9586@kbd{A} key was taken, so we had to use the @kbd{W} key instead.
9587
9588@dfn{Washing} is defined by us as ``changing something from something to
9589something else'', but normally results in something looking better.
9590Cleaner, perhaps.
9591
9592@xref{Customizing Articles}, if you want to change how Gnus displays
9593articles by default.
9594
9595@table @kbd
9596
9597@item C-u g
9598This is not really washing, it's sort of the opposite of washing. If
9599you type this, you see the article exactly as it exists on disk or on
9600the server.
9601
9602@item g
9603Force redisplaying of the current article
9604(@code{gnus-summary-show-article}). This is also not really washing.
9605If you type this, you see the article without any previously applied
9606interactive Washing functions but with all default treatments
9607(@pxref{Customizing Articles}).
9608
9609@item W l
9610@kindex W l (Summary)
9611@findex gnus-summary-stop-page-breaking
9612Remove page breaks from the current article
9613(@code{gnus-summary-stop-page-breaking}). @xref{Misc Article}, for page
9614delimiters.
9615
9616@item W r
9617@kindex W r (Summary)
9618@findex gnus-summary-caesar-message
9619@c @icon{gnus-summary-caesar-message}
9620Do a Caesar rotate (rot13) on the article buffer
9621(@code{gnus-summary-caesar-message}).
9622Unreadable articles that tell you to read them with Caesar rotate or rot13.
9623(Typically offensive jokes and such.)
9624
9625It's commonly called ``rot13'' because each letter is rotated 13
9626positions in the alphabet, e. g. @samp{B} (letter #2) -> @samp{O} (letter
9627#15). It is sometimes referred to as ``Caesar rotate'' because Caesar
9628is rumored to have employed this form of, uh, somewhat weak encryption.
9629
9630@item W m
9631@kindex W m (Summary)
9632@findex gnus-summary-morse-message
9633Morse decode the article buffer (@code{gnus-summary-morse-message}).
9634
01c52d31
MB
9635@item W i
9636@kindex W i (Summary)
9637@findex gnus-summary-idna-message
9638Decode IDNA encoded domain names in the current articles. IDNA
9639encoded domain names looks like @samp{xn--bar}. If a string remain
9640unencoded after running invoking this, it is likely an invalid IDNA
9641string (@samp{xn--bar} is invalid). You must have GNU Libidn
9642(@url{http://www.gnu.org/software/libidn/}) installed for this command
9643to work.
9644
4009494e
GM
9645@item W t
9646@item t
9647@kindex W t (Summary)
9648@kindex t (Summary)
9649@findex gnus-summary-toggle-header
9650Toggle whether to display all headers in the article buffer
9651(@code{gnus-summary-toggle-header}).
9652
9653@item W v
9654@kindex W v (Summary)
9655@findex gnus-summary-verbose-headers
9656Toggle whether to display all headers in the article buffer permanently
9657(@code{gnus-summary-verbose-headers}).
9658
9659@item W o
9660@kindex W o (Summary)
9661@findex gnus-article-treat-overstrike
9662Treat overstrike (@code{gnus-article-treat-overstrike}).
9663
9664@item W d
9665@kindex W d (Summary)
9666@findex gnus-article-treat-dumbquotes
9667@vindex gnus-article-dumbquotes-map
9668@cindex Smartquotes
9669@cindex M****s*** sm*rtq**t*s
9670@cindex Latin 1
9671Treat M****s*** sm*rtq**t*s according to
9672@code{gnus-article-dumbquotes-map}
9673(@code{gnus-article-treat-dumbquotes}). Note that this function guesses
9674whether a character is a sm*rtq**t* or not, so it should only be used
9675interactively.
9676
9677Sm*rtq**t*s are M****s***'s unilateral extension to the character map in
9678an attempt to provide more quoting characters. If you see something
9679like @code{\222} or @code{\264} where you're expecting some kind of
9680apostrophe or quotation mark, then try this wash.
9681
9682@item W Y f
9683@kindex W Y f (Summary)
9684@findex gnus-article-outlook-deuglify-article
9685@cindex Outlook Express
9686Full deuglify of broken Outlook (Express) articles: Treat dumbquotes,
9687unwrap lines, repair attribution and rearrange citation.
9688(@code{gnus-article-outlook-deuglify-article}).
9689
9690@item W Y u
9691@kindex W Y u (Summary)
9692@findex gnus-article-outlook-unwrap-lines
9693@vindex gnus-outlook-deuglify-unwrap-min
9694@vindex gnus-outlook-deuglify-unwrap-max
9695Unwrap lines that appear to be wrapped citation lines. You can control
9696what lines will be unwrapped by frobbing
9697@code{gnus-outlook-deuglify-unwrap-min} and
9698@code{gnus-outlook-deuglify-unwrap-max}, indicating the minimum and
9699maximum length of an unwrapped citation line.
9700(@code{gnus-article-outlook-unwrap-lines}).
9701
9702@item W Y a
9703@kindex W Y a (Summary)
9704@findex gnus-article-outlook-repair-attribution
9705Repair a broken attribution line.@*
9706(@code{gnus-article-outlook-repair-attribution}).
9707
9708@item W Y c
9709@kindex W Y c (Summary)
9710@findex gnus-article-outlook-rearrange-citation
9711Repair broken citations by rearranging the text.
9712(@code{gnus-article-outlook-rearrange-citation}).
9713
9714@item W w
9715@kindex W w (Summary)
9716@findex gnus-article-fill-cited-article
9717Do word wrap (@code{gnus-article-fill-cited-article}).
9718
9719You can give the command a numerical prefix to specify the width to use
9720when filling.
9721
9722@item W Q
9723@kindex W Q (Summary)
9724@findex gnus-article-fill-long-lines
9725Fill long lines (@code{gnus-article-fill-long-lines}).
9726
9727@item W C
9728@kindex W C (Summary)
9729@findex gnus-article-capitalize-sentences
9730Capitalize the first word in each sentence
9731(@code{gnus-article-capitalize-sentences}).
9732
9733@item W c
9734@kindex W c (Summary)
9735@findex gnus-article-remove-cr
9736Translate CRLF pairs (i. e., @samp{^M}s on the end of the lines) into LF
9737(this takes care of DOS line endings), and then translate any remaining
9738CRs into LF (this takes care of Mac line endings)
9739(@code{gnus-article-remove-cr}).
9740
9741@item W q
9742@kindex W q (Summary)
9743@findex gnus-article-de-quoted-unreadable
9744Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}).
9745Quoted-Printable is one common @acronym{MIME} encoding employed when
9746sending non-@acronym{ASCII} (i.e., 8-bit) articles. It typically
01c52d31
MB
9747makes strings like @samp{d@'ej@`a vu} look like @samp{d=E9j=E0 vu},
9748which doesn't look very readable to me. Note that this is usually
9749done automatically by Gnus if the message in question has a
4009494e
GM
9750@code{Content-Transfer-Encoding} header that says that this encoding
9751has been done. If a prefix is given, a charset will be asked for.
9752
9753@item W 6
9754@kindex W 6 (Summary)
9755@findex gnus-article-de-base64-unreadable
9756Treat base64 (@code{gnus-article-de-base64-unreadable}). Base64 is
9757one common @acronym{MIME} encoding employed when sending
9758non-@acronym{ASCII} (i.e., 8-bit) articles. Note that this is
9759usually done automatically by Gnus if the message in question has a
9760@code{Content-Transfer-Encoding} header that says that this encoding
9761has been done. If a prefix is given, a charset will be asked for.
9762
9763@item W Z
9764@kindex W Z (Summary)
9765@findex gnus-article-decode-HZ
9766Treat HZ or HZP (@code{gnus-article-decode-HZ}). HZ (or HZP) is one
9767common encoding employed when sending Chinese articles. It typically
9768makes strings look like @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}}.
9769
01c52d31
MB
9770@item W A
9771@kindex W A (Summary)
9772@findex gnus-article-treat-ansi-sequences
9773@cindex @acronym{ANSI} control sequences
9774Translate @acronym{ANSI} SGR control sequences into overlays or
9775extents (@code{gnus-article-treat-ansi-sequences}). @acronym{ANSI}
9776sequences are used in some Chinese hierarchies for highlighting.
9777
4009494e
GM
9778@item W u
9779@kindex W u (Summary)
9780@findex gnus-article-unsplit-urls
9781Remove newlines from within URLs. Some mailers insert newlines into
9782outgoing email messages to keep lines short. This reformatting can
9783split long URLs onto multiple lines. Repair those URLs by removing
9784the newlines (@code{gnus-article-unsplit-urls}).
9785
9786@item W h
9787@kindex W h (Summary)
9788@findex gnus-article-wash-html
9789Treat @acronym{HTML} (@code{gnus-article-wash-html}). Note that this is
9790usually done automatically by Gnus if the message in question has a
9791@code{Content-Type} header that says that the message is @acronym{HTML}.
9792
9793If a prefix is given, a charset will be asked for. If it is a number,
9794the charset defined in @code{gnus-summary-show-article-charset-alist}
9795(@pxref{Paging the Article}) will be used.
9796
9797@vindex gnus-article-wash-function
9798The default is to use the function specified by
9799@code{mm-text-html-renderer} (@pxref{Display Customization, ,Display
9800Customization, emacs-mime, The Emacs MIME Manual}) to convert the
9801@acronym{HTML}, but this is controlled by the
9802@code{gnus-article-wash-function} variable. Pre-defined functions you
9803can use include:
9804
9805@table @code
9806@item w3
9807Use Emacs/W3.
9808
9809@item w3m
9810Use @uref{http://emacs-w3m.namazu.org/, emacs-w3m}.
9811
9812@item w3m-standalone
9813Use @uref{http://w3m.sourceforge.net/, w3m}.
9814
9815@item links
9816Use @uref{http://links.sf.net/, Links}.
9817
9818@item lynx
9819Use @uref{http://lynx.isc.org/, Lynx}.
9820
9821@item html2text
9822Use html2text---a simple @acronym{HTML} converter included with Gnus.
9823
9824@end table
9825
9826@item W b
9827@kindex W b (Summary)
9828@findex gnus-article-add-buttons
9829Add clickable buttons to the article (@code{gnus-article-add-buttons}).
9830@xref{Article Buttons}.
9831
9832@item W B
9833@kindex W B (Summary)
9834@findex gnus-article-add-buttons-to-head
9835Add clickable buttons to the article headers
9836(@code{gnus-article-add-buttons-to-head}).
9837
9838@item W p
9839@kindex W p (Summary)
9840@findex gnus-article-verify-x-pgp-sig
9841Verify a signed control message
9842(@code{gnus-article-verify-x-pgp-sig}). Control messages such as
9843@code{newgroup} and @code{checkgroups} are usually signed by the
9844hierarchy maintainer. You need to add the @acronym{PGP} public key of
9845the maintainer to your keyring to verify the
9846message.@footnote{@acronym{PGP} keys for many hierarchies are
9847available at @uref{ftp://ftp.isc.org/pub/pgpcontrol/README.html}}
9848
9849@item W s
9850@kindex W s (Summary)
9851@findex gnus-summary-force-verify-and-decrypt
9852Verify a signed (@acronym{PGP}, @acronym{PGP/MIME} or
9853@acronym{S/MIME}) message
9854(@code{gnus-summary-force-verify-and-decrypt}). @xref{Security}.
9855
9856@item W a
9857@kindex W a (Summary)
9858@findex gnus-article-strip-headers-in-body
9859Strip headers like the @code{X-No-Archive} header from the beginning of
9860article bodies (@code{gnus-article-strip-headers-in-body}).
9861
9862@item W E l
9863@kindex W E l (Summary)
9864@findex gnus-article-strip-leading-blank-lines
9865Remove all blank lines from the beginning of the article
9866(@code{gnus-article-strip-leading-blank-lines}).
9867
9868@item W E m
9869@kindex W E m (Summary)
9870@findex gnus-article-strip-multiple-blank-lines
9871Replace all blank lines with empty lines and then all multiple empty
9872lines with a single empty line.
9873(@code{gnus-article-strip-multiple-blank-lines}).
9874
9875@item W E t
9876@kindex W E t (Summary)
9877@findex gnus-article-remove-trailing-blank-lines
9878Remove all blank lines at the end of the article
9879(@code{gnus-article-remove-trailing-blank-lines}).
9880
9881@item W E a
9882@kindex W E a (Summary)
9883@findex gnus-article-strip-blank-lines
9884Do all the three commands above
9885(@code{gnus-article-strip-blank-lines}).
9886
9887@item W E A
9888@kindex W E A (Summary)
9889@findex gnus-article-strip-all-blank-lines
9890Remove all blank lines
9891(@code{gnus-article-strip-all-blank-lines}).
9892
9893@item W E s
9894@kindex W E s (Summary)
9895@findex gnus-article-strip-leading-space
9896Remove all white space from the beginning of all lines of the article
9897body (@code{gnus-article-strip-leading-space}).
9898
9899@item W E e
9900@kindex W E e (Summary)
9901@findex gnus-article-strip-trailing-space
9902Remove all white space from the end of all lines of the article
9903body (@code{gnus-article-strip-trailing-space}).
9904
9905@end table
9906
9907@xref{Customizing Articles}, for how to wash articles automatically.
9908
9909
9910@node Article Header
9911@subsection Article Header
9912
9913These commands perform various transformations of article header.
9914
9915@table @kbd
9916
9917@item W G u
9918@kindex W G u (Summary)
9919@findex gnus-article-treat-unfold-headers
9920Unfold folded header lines (@code{gnus-article-treat-unfold-headers}).
9921
9922@item W G n
9923@kindex W G n (Summary)
9924@findex gnus-article-treat-fold-newsgroups
9925Fold the @code{Newsgroups} and @code{Followup-To} headers
9926(@code{gnus-article-treat-fold-newsgroups}).
9927
9928@item W G f
9929@kindex W G f (Summary)
9930@findex gnus-article-treat-fold-headers
9931Fold all the message headers
9932(@code{gnus-article-treat-fold-headers}).
9933
9934@item W E w
9935@kindex W E w (Summary)
9936@findex gnus-article-remove-leading-whitespace
9937Remove excessive whitespace from all headers
9938(@code{gnus-article-remove-leading-whitespace}).
9939
9940@end table
9941
9942
9943@node Article Buttons
9944@subsection Article Buttons
9945@cindex buttons
9946
9947People often include references to other stuff in articles, and it would
9948be nice if Gnus could just fetch whatever it is that people talk about
9949with the minimum of fuzz when you hit @kbd{RET} or use the middle mouse
9950button on these references.
9951
9952@vindex gnus-button-man-handler
9953Gnus adds @dfn{buttons} to certain standard references by default:
9954Well-formed URLs, mail addresses, Message-IDs, Info links, man pages and
9955Emacs or Gnus related references. This is controlled by two variables,
9956one that handles article bodies and one that handles article heads:
9957
9958@table @code
9959
9960@item gnus-button-alist
9961@vindex gnus-button-alist
9962This is an alist where each entry has this form:
9963
9964@lisp
9965(@var{regexp} @var{button-par} @var{use-p} @var{function} @var{data-par})
9966@end lisp
9967
9968@table @var
9969
9970@item regexp
9971All text that match this regular expression (case insensitive) will be
9972considered an external reference. Here's a typical regexp that matches
9973embedded URLs: @samp{<URL:\\([^\n\r>]*\\)>}. This can also be a
9974variable containing a regexp, useful variables to use include
9975@code{gnus-button-url-regexp} and @code{gnus-button-mid-or-mail-regexp}.
9976
9977@item button-par
9978Gnus has to know which parts of the matches is to be highlighted. This
9979is a number that says what sub-expression of the regexp is to be
9980highlighted. If you want it all highlighted, you use 0 here.
9981
9982@item use-p
9983This form will be @code{eval}ed, and if the result is non-@code{nil},
9984this is considered a match. This is useful if you want extra sifting to
9985avoid false matches. Often variables named
9986@code{gnus-button-@var{*}-level} are used here, @xref{Article Button
9987Levels}, but any other form may be used too.
9988
9989@c @code{use-p} is @code{eval}ed only if @code{regexp} matches.
9990
9991@item function
9992This function will be called when you click on this button.
9993
9994@item data-par
9995As with @var{button-par}, this is a sub-expression number, but this one
9996says which part of the match is to be sent as data to @var{function}.
9997
9998@end table
9999
10000So the full entry for buttonizing URLs is then
10001
10002@lisp
10003("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)
10004@end lisp
10005
10006@item gnus-header-button-alist
10007@vindex gnus-header-button-alist
10008This is just like the other alist, except that it is applied to the
10009article head only, and that each entry has an additional element that is
10010used to say what headers to apply the buttonize coding to:
10011
10012@lisp
10013(@var{header} @var{regexp} @var{button-par} @var{use-p} @var{function} @var{data-par})
10014@end lisp
10015
10016@var{header} is a regular expression.
10017@end table
10018
10019@subsubsection Related variables and functions
10020
10021@table @code
10022@item gnus-button-@var{*}-level
10023@xref{Article Button Levels}.
10024
10025@c Stuff related to gnus-button-browse-level
10026
10027@item gnus-button-url-regexp
10028@vindex gnus-button-url-regexp
10029A regular expression that matches embedded URLs. It is used in the
10030default values of the variables above.
10031
10032@c Stuff related to gnus-button-man-level
10033
10034@item gnus-button-man-handler
10035@vindex gnus-button-man-handler
10036The function to use for displaying man pages. It must take at least one
10037argument with a string naming the man page.
10038
10039@c Stuff related to gnus-button-message-level
10040
10041@item gnus-button-mid-or-mail-regexp
10042@vindex gnus-button-mid-or-mail-regexp
10043Regular expression that matches a message ID or a mail address.
10044
10045@item gnus-button-prefer-mid-or-mail
10046@vindex gnus-button-prefer-mid-or-mail
10047This variable determines what to do when the button on a string as
10048@samp{foo123@@bar.invalid} is pushed. Strings like this can be either a
10049message ID or a mail address. If it is one of the symbols @code{mid} or
10050@code{mail}, Gnus will always assume that the string is a message ID or
10051a mail address, respectively. If this variable is set to the symbol
10052@code{ask}, always query the user what to do. If it is a function, this
10053function will be called with the string as its only argument. The
10054function must return @code{mid}, @code{mail}, @code{invalid} or
10055@code{ask}. The default value is the function
10056@code{gnus-button-mid-or-mail-heuristic}.
10057
10058@item gnus-button-mid-or-mail-heuristic
10059@findex gnus-button-mid-or-mail-heuristic
10060Function that guesses whether its argument is a message ID or a mail
10061address. Returns @code{mid} if it's a message IDs, @code{mail} if
10062it's a mail address, @code{ask} if unsure and @code{invalid} if the
10063string is invalid.
10064
10065@item gnus-button-mid-or-mail-heuristic-alist
10066@vindex gnus-button-mid-or-mail-heuristic-alist
10067An alist of @code{(RATE . REGEXP)} pairs used by the function
10068@code{gnus-button-mid-or-mail-heuristic}.
10069
10070@c Stuff related to gnus-button-tex-level
10071
10072@item gnus-button-ctan-handler
10073@findex gnus-button-ctan-handler
10074The function to use for displaying CTAN links. It must take one
10075argument, the string naming the URL.
10076
10077@item gnus-ctan-url
10078@vindex gnus-ctan-url
10079Top directory of a CTAN (Comprehensive TeX Archive Network) archive used
10080by @code{gnus-button-ctan-handler}.
10081
10082@c Misc stuff
10083
10084@item gnus-article-button-face
10085@vindex gnus-article-button-face
10086Face used on buttons.
10087
10088@item gnus-article-mouse-face
10089@vindex gnus-article-mouse-face
10090Face used when the mouse cursor is over a button.
10091
10092@end table
10093
10094@xref{Customizing Articles}, for how to buttonize articles automatically.
10095
10096
10097@node Article Button Levels
10098@subsection Article button levels
10099@cindex button levels
10100The higher the value of the variables @code{gnus-button-@var{*}-level},
10101the more buttons will appear. If the level is zero, no corresponding
10102buttons are displayed. With the default value (which is 5) you should
10103already see quite a lot of buttons. With higher levels, you will see
10104more buttons, but you may also get more false positives. To avoid them,
10105you can set the variables @code{gnus-button-@var{*}-level} local to
10106specific groups (@pxref{Group Parameters}). Here's an example for the
10107variable @code{gnus-parameters}:
10108
10109@lisp
10110;; @r{increase @code{gnus-button-*-level} in some groups:}
10111(setq gnus-parameters
10112 '(("\\<\\(emacs\\|gnus\\)\\>" (gnus-button-emacs-level 10))
10113 ("\\<unix\\>" (gnus-button-man-level 10))
10114 ("\\<tex\\>" (gnus-button-tex-level 10))))
10115@end lisp
10116
10117@table @code
10118
10119@item gnus-button-browse-level
10120@vindex gnus-button-browse-level
10121Controls the display of references to message IDs, mail addresses and
10122news URLs. Related variables and functions include
10123@code{gnus-button-url-regexp}, @code{browse-url}, and
10124@code{browse-url-browser-function}.
10125
10126@item gnus-button-emacs-level
10127@vindex gnus-button-emacs-level
10128Controls the display of Emacs or Gnus references. Related functions are
10129@code{gnus-button-handle-custom},
10130@code{gnus-button-handle-describe-function},
10131@code{gnus-button-handle-describe-variable},
10132@code{gnus-button-handle-symbol},
10133@code{gnus-button-handle-describe-key},
10134@code{gnus-button-handle-apropos},
10135@code{gnus-button-handle-apropos-command},
10136@code{gnus-button-handle-apropos-variable},
10137@code{gnus-button-handle-apropos-documentation}, and
10138@code{gnus-button-handle-library}.
10139
10140@item gnus-button-man-level
10141@vindex gnus-button-man-level
10142Controls the display of references to (Unix) man pages.
10143See @code{gnus-button-man-handler}.
10144
10145@item gnus-button-message-level
10146@vindex gnus-button-message-level
10147Controls the display of message IDs, mail addresses and news URLs.
10148Related variables and functions include
10149@code{gnus-button-mid-or-mail-regexp},
10150@code{gnus-button-prefer-mid-or-mail},
10151@code{gnus-button-mid-or-mail-heuristic}, and
10152@code{gnus-button-mid-or-mail-heuristic-alist}.
10153
10154@item gnus-button-tex-level
10155@vindex gnus-button-tex-level
10156Controls the display of references to @TeX{} or LaTeX stuff, e.g. for CTAN
10157URLs. See the variables @code{gnus-ctan-url},
10158@code{gnus-button-ctan-handler},
10159@code{gnus-button-ctan-directory-regexp}, and
10160@code{gnus-button-handle-ctan-bogus-regexp}.
10161
10162@end table
10163
10164
10165@node Article Date
10166@subsection Article Date
10167
10168The date is most likely generated in some obscure timezone you've never
10169heard of, so it's quite nice to be able to find out what the time was
10170when the article was sent.
10171
10172@table @kbd
10173
10174@item W T u
10175@kindex W T u (Summary)
10176@findex gnus-article-date-ut
10177Display the date in UT (aka. GMT, aka ZULU)
10178(@code{gnus-article-date-ut}).
10179
10180@item W T i
10181@kindex W T i (Summary)
10182@findex gnus-article-date-iso8601
10183@cindex ISO 8601
10184Display the date in international format, aka. ISO 8601
10185(@code{gnus-article-date-iso8601}).
10186
10187@item W T l
10188@kindex W T l (Summary)
10189@findex gnus-article-date-local
10190Display the date in the local timezone (@code{gnus-article-date-local}).
10191
10192@item W T p
10193@kindex W T p (Summary)
10194@findex gnus-article-date-english
10195Display the date in a format that's easily pronounceable in English
10196(@code{gnus-article-date-english}).
10197
10198@item W T s
10199@kindex W T s (Summary)
10200@vindex gnus-article-time-format
10201@findex gnus-article-date-user
10202@findex format-time-string
10203Display the date using a user-defined format
10204(@code{gnus-article-date-user}). The format is specified by the
10205@code{gnus-article-time-format} variable, and is a string that's passed
10206to @code{format-time-string}. See the documentation of that variable
10207for a list of possible format specs.
10208
10209@item W T e
10210@kindex W T e (Summary)
10211@findex gnus-article-date-lapsed
10212@findex gnus-start-date-timer
10213@findex gnus-stop-date-timer
10214Say how much time has elapsed between the article was posted and now
10215(@code{gnus-article-date-lapsed}). It looks something like:
10216
10217@example
10218X-Sent: 6 weeks, 4 days, 1 hour, 3 minutes, 8 seconds ago
10219@end example
10220
10221@vindex gnus-article-date-lapsed-new-header
10222The value of @code{gnus-article-date-lapsed-new-header} determines
10223whether this header will just be added below the old Date one, or will
10224replace it.
10225
10226An advantage of using Gnus to read mail is that it converts simple bugs
10227into wonderful absurdities.
10228
10229If you want to have this line updated continually, you can put
10230
10231@lisp
10232(gnus-start-date-timer)
10233@end lisp
10234
10235in your @file{~/.gnus.el} file, or you can run it off of some hook. If
10236you want to stop the timer, you can use the @code{gnus-stop-date-timer}
10237command.
10238
10239@item W T o
10240@kindex W T o (Summary)
10241@findex gnus-article-date-original
10242Display the original date (@code{gnus-article-date-original}). This can
10243be useful if you normally use some other conversion function and are
10244worried that it might be doing something totally wrong. Say, claiming
10245that the article was posted in 1854. Although something like that is
10246@emph{totally} impossible. Don't you trust me? *titter*
10247
10248@end table
10249
10250@xref{Customizing Articles}, for how to display the date in your
10251preferred format automatically.
10252
10253
10254@node Article Display
10255@subsection Article Display
10256@cindex picons
10257@cindex x-face
10258@cindex smileys
10259
10260These commands add various frivolous display gimmicks to the article
10261buffer in Emacs versions that support them.
10262
10263@code{X-Face} headers are small black-and-white images supplied by the
10264message headers (@pxref{X-Face}).
10265
10266@code{Face} headers are small colored images supplied by the message
10267headers (@pxref{Face}).
10268
10269Smileys are those little @samp{:-)} symbols that people like to litter
10270their messages with (@pxref{Smileys}).
10271
10272Picons, on the other hand, reside on your own system, and Gnus will
10273try to match the headers to what you have (@pxref{Picons}).
10274
10275All these functions are toggles---if the elements already exist,
10276they'll be removed.
10277
10278@table @kbd
10279@item W D x
10280@kindex W D x (Summary)
10281@findex gnus-article-display-x-face
10282Display an @code{X-Face} in the @code{From} header.
10283(@code{gnus-article-display-x-face}).
10284
10285@item W D d
10286@kindex W D d (Summary)
10287@findex gnus-article-display-face
10288Display a @code{Face} in the @code{From} header.
10289(@code{gnus-article-display-face}).
10290
10291@item W D s
10292@kindex W D s (Summary)
10293@findex gnus-treat-smiley
10294Display smileys (@code{gnus-treat-smiley}).
10295
10296@item W D f
10297@kindex W D f (Summary)
10298@findex gnus-treat-from-picon
10299Piconify the @code{From} header (@code{gnus-treat-from-picon}).
10300
10301@item W D m
10302@kindex W D m (Summary)
10303@findex gnus-treat-mail-picon
10304Piconify all mail headers (i. e., @code{Cc}, @code{To})
10305(@code{gnus-treat-mail-picon}).
10306
10307@item W D n
10308@kindex W D n (Summary)
10309@findex gnus-treat-newsgroups-picon
10310Piconify all news headers (i. e., @code{Newsgroups} and
10311@code{Followup-To}) (@code{gnus-treat-newsgroups-picon}).
10312
10313@item W D D
10314@kindex W D D (Summary)
10315@findex gnus-article-remove-images
10316Remove all images from the article buffer
10317(@code{gnus-article-remove-images}).
10318
10319@end table
10320
10321
10322
10323@node Article Signature
10324@subsection Article Signature
10325@cindex signatures
10326@cindex article signature
10327
10328@vindex gnus-signature-separator
10329Each article is divided into two parts---the head and the body. The
10330body can be divided into a signature part and a text part. The variable
10331that says what is to be considered a signature is
10332@code{gnus-signature-separator}. This is normally the standard
10333@samp{^-- $} as mandated by son-of-RFC 1036. However, many people use
10334non-standard signature separators, so this variable can also be a list
10335of regular expressions to be tested, one by one. (Searches are done
10336from the end of the body towards the beginning.) One likely value is:
10337
10338@lisp
10339(setq gnus-signature-separator
10340 '("^-- $" ; @r{The standard}
10341 "^-- *$" ; @r{A common mangling}
10342 "^-------*$" ; @r{Many people just use a looong}
10343 ; @r{line of dashes. Shame!}
10344 "^ *--------*$" ; @r{Double-shame!}
10345 "^________*$" ; @r{Underscores are also popular}
10346 "^========*$")) ; @r{Pervert!}
10347@end lisp
10348
10349The more permissive you are, the more likely it is that you'll get false
10350positives.
10351
10352@vindex gnus-signature-limit
10353@code{gnus-signature-limit} provides a limit to what is considered a
10354signature when displaying articles.
10355
10356@enumerate
10357@item
10358If it is an integer, no signature may be longer (in characters) than
10359that integer.
10360@item
10361If it is a floating point number, no signature may be longer (in lines)
10362than that number.
10363@item
10364If it is a function, the function will be called without any parameters,
10365and if it returns @code{nil}, there is no signature in the buffer.
10366@item
10367If it is a string, it will be used as a regexp. If it matches, the text
10368in question is not a signature.
10369@end enumerate
10370
10371This variable can also be a list where the elements may be of the types
10372listed above. Here's an example:
10373
10374@lisp
10375(setq gnus-signature-limit
10376 '(200.0 "^---*Forwarded article"))
10377@end lisp
10378
10379This means that if there are more than 200 lines after the signature
10380separator, or the text after the signature separator is matched by
10381the regular expression @samp{^---*Forwarded article}, then it isn't a
10382signature after all.
10383
10384
10385@node Article Miscellanea
10386@subsection Article Miscellanea
10387
10388@table @kbd
10389@item A t
10390@kindex A t (Summary)
10391@findex gnus-article-babel
10392Translate the article from one language to another
10393(@code{gnus-article-babel}).
10394
10395@end table
10396
10397
10398@node MIME Commands
10399@section MIME Commands
10400@cindex MIME decoding
10401@cindex attachments
10402@cindex viewing attachments
10403
10404The following commands all understand the numerical prefix. For
01c52d31 10405instance, @kbd{3 K v} means ``view the third @acronym{MIME} part''.
4009494e
GM
10406
10407@table @kbd
10408@item b
10409@itemx K v
10410@kindex b (Summary)
10411@kindex K v (Summary)
10412View the @acronym{MIME} part.
10413
10414@item K o
10415@kindex K o (Summary)
10416Save the @acronym{MIME} part.
10417
01c52d31
MB
10418@item K O
10419@kindex K O (Summary)
10420Prompt for a file name, then save the @acronym{MIME} part and strip it
10421from the article. The stripped @acronym{MIME} object will be referred
10422via the message/external-body @acronym{MIME} type.
10423
10424@item K r
10425@kindex K r (Summary)
10426Replace the @acronym{MIME} part with an external body.
10427
10428@item K d
10429@kindex K d (Summary)
10430Delete the @acronym{MIME} part and add some information about the
10431removed part.
10432
4009494e
GM
10433@item K c
10434@kindex K c (Summary)
10435Copy the @acronym{MIME} part.
10436
10437@item K e
10438@kindex K e (Summary)
10439View the @acronym{MIME} part externally.
10440
10441@item K i
10442@kindex K i (Summary)
10443View the @acronym{MIME} part internally.
10444
10445@item K |
10446@kindex K | (Summary)
10447Pipe the @acronym{MIME} part to an external command.
10448@end table
10449
10450The rest of these @acronym{MIME} commands do not use the numerical prefix in
10451the same manner:
10452
10453@table @kbd
9b3ebcb6
MB
10454@item K H
10455@kindex K H (Summary)
10456@findex gnus-article-browse-html-article
10457View @samp{text/html} parts of the current article with a WWW browser.
10458The message header is added to the beginning of every html part unless
10459the prefix argument is given.
10460
10461Warning: Spammers use links to images in HTML articles to verify whether
10462you have read the message. As this command passes the @acronym{HTML}
10463content to the browser without eliminating these ``web bugs'' you should
10464only use it for mails from trusted senders.
10465
10466If you always want to display @acronym{HTML} parts in the browser, set
10467@code{mm-text-html-renderer} to @code{nil}.
10468
4009494e
GM
10469@item K b
10470@kindex K b (Summary)
10471Make all the @acronym{MIME} parts have buttons in front of them. This is
10472mostly useful if you wish to save (or perform other actions) on inlined
10473parts.
10474
10475@item K m
10476@kindex K m (Summary)
10477@findex gnus-summary-repair-multipart
10478Some multipart messages are transmitted with missing or faulty headers.
10479This command will attempt to ``repair'' these messages so that they can
10480be viewed in a more pleasant manner
10481(@code{gnus-summary-repair-multipart}).
10482
10483@item X m
10484@kindex X m (Summary)
10485@findex gnus-summary-save-parts
10486Save all parts matching a @acronym{MIME} type to a directory
10487(@code{gnus-summary-save-parts}). Understands the process/prefix
10488convention (@pxref{Process/Prefix}).
10489
10490@item M-t
10491@kindex M-t (Summary)
10492@findex gnus-summary-toggle-display-buttonized
10493Toggle the buttonized display of the article buffer
10494(@code{gnus-summary-toggle-display-buttonized}).
10495
10496@item W M w
10497@kindex W M w (Summary)
10498@findex gnus-article-decode-mime-words
10499Decode RFC 2047-encoded words in the article headers
10500(@code{gnus-article-decode-mime-words}).
10501
10502@item W M c
10503@kindex W M c (Summary)
10504@findex gnus-article-decode-charset
10505Decode encoded article bodies as well as charsets
10506(@code{gnus-article-decode-charset}).
10507
10508This command looks in the @code{Content-Type} header to determine the
10509charset. If there is no such header in the article, you can give it a
10510prefix, which will prompt for the charset to decode as. In regional
10511groups where people post using some common encoding (but do not
10512include @acronym{MIME} headers), you can set the @code{charset} group/topic
10513parameter to the required charset (@pxref{Group Parameters}).
10514
10515@item W M v
10516@kindex W M v (Summary)
10517@findex gnus-mime-view-all-parts
10518View all the @acronym{MIME} parts in the current article
10519(@code{gnus-mime-view-all-parts}).
10520
10521@end table
10522
10523Relevant variables:
10524
10525@table @code
10526@item gnus-ignored-mime-types
10527@vindex gnus-ignored-mime-types
10528This is a list of regexps. @acronym{MIME} types that match a regexp from
10529this list will be completely ignored by Gnus. The default value is
10530@code{nil}.
10531
10532To have all Vcards be ignored, you'd say something like this:
10533
10534@lisp
10535(setq gnus-ignored-mime-types
10536 '("text/x-vcard"))
10537@end lisp
10538
10539@item gnus-article-loose-mime
10540@vindex gnus-article-loose-mime
10541If non-@code{nil}, Gnus won't require the @samp{MIME-Version} header
10542before interpreting the message as a @acronym{MIME} message. This helps
10543when reading messages from certain broken mail user agents. The
b890d447 10544default is @code{t}.
4009494e
GM
10545
10546@item gnus-article-emulate-mime
10547@vindex gnus-article-emulate-mime
10548@cindex uuencode
10549@cindex yEnc
10550There are other, non-@acronym{MIME} encoding methods used. The most common
10551is @samp{uuencode}, but yEncode is also getting to be popular. If
10552this variable is non-@code{nil}, Gnus will look in message bodies to
10553see if it finds these encodings, and if so, it'll run them through the
10554Gnus @acronym{MIME} machinery. The default is @code{t}. Only
10555single-part yEnc encoded attachments can be decoded. There's no support
10556for encoding in Gnus.
10557
10558@item gnus-unbuttonized-mime-types
10559@vindex gnus-unbuttonized-mime-types
10560This is a list of regexps. @acronym{MIME} types that match a regexp from
10561this list won't have @acronym{MIME} buttons inserted unless they aren't
10562displayed or this variable is overridden by
10563@code{gnus-buttonized-mime-types}. The default value is
10564@code{(".*/.*")}. This variable is only used when
10565@code{gnus-inhibit-mime-unbuttonizing} is @code{nil}.
10566
10567@item gnus-buttonized-mime-types
10568@vindex gnus-buttonized-mime-types
10569This is a list of regexps. @acronym{MIME} types that match a regexp from
10570this list will have @acronym{MIME} buttons inserted unless they aren't
10571displayed. This variable overrides
10572@code{gnus-unbuttonized-mime-types}. The default value is @code{nil}.
10573This variable is only used when @code{gnus-inhibit-mime-unbuttonizing}
10574is @code{nil}.
10575
10576To see e.g. security buttons but no other buttons, you could set this
10577variable to @code{("multipart/signed")} and leave
10578@code{gnus-unbuttonized-mime-types} at the default value.
10579
10580You could also add @code{"multipart/alternative"} to this list to
10581display radio buttons that allow you to choose one of two media types
10582those mails include. See also @code{mm-discouraged-alternatives}
10583(@pxref{Display Customization, ,Display Customization, emacs-mime, The
10584Emacs MIME Manual}).
10585
10586@item gnus-inhibit-mime-unbuttonizing
10587@vindex gnus-inhibit-mime-unbuttonizing
10588If this is non-@code{nil}, then all @acronym{MIME} parts get buttons. The
10589default value is @code{nil}.
10590
10591@item gnus-article-mime-part-function
10592@vindex gnus-article-mime-part-function
10593For each @acronym{MIME} part, this function will be called with the @acronym{MIME}
10594handle as the parameter. The function is meant to be used to allow
10595users to gather information from the article (e. g., add Vcard info to
10596the bbdb database) or to do actions based on parts (e. g., automatically
10597save all jpegs into some directory).
10598
10599Here's an example function the does the latter:
10600
10601@lisp
10602(defun my-save-all-jpeg-parts (handle)
10603 (when (equal (car (mm-handle-type handle)) "image/jpeg")
10604 (with-temp-buffer
10605 (insert (mm-get-part handle))
10606 (write-region (point-min) (point-max)
10607 (read-file-name "Save jpeg to: ")))))
10608(setq gnus-article-mime-part-function
10609 'my-save-all-jpeg-parts)
10610@end lisp
10611
10612@vindex gnus-mime-multipart-functions
10613@item gnus-mime-multipart-functions
10614Alist of @acronym{MIME} multipart types and functions to handle them.
10615
10616@vindex gnus-mime-display-multipart-alternative-as-mixed
10617@item gnus-mime-display-multipart-alternative-as-mixed
10618Display "multipart/alternative" parts as "multipart/mixed".
10619
10620@vindex gnus-mime-display-multipart-related-as-mixed
10621@item gnus-mime-display-multipart-related-as-mixed
10622Display "multipart/related" parts as "multipart/mixed".
10623
9b3ebcb6 10624If displaying @samp{text/html} is discouraged, see
4009494e
GM
10625@code{mm-discouraged-alternatives}, images or other material inside a
10626"multipart/related" part might be overlooked when this variable is
10627@code{nil}. @ref{Display Customization, Display Customization, ,
10628emacs-mime, Emacs-Mime Manual}.
10629
10630@vindex gnus-mime-display-multipart-as-mixed
10631@item gnus-mime-display-multipart-as-mixed
10632Display "multipart" parts as "multipart/mixed". If @code{t}, it
10633overrides @code{nil} values of
10634@code{gnus-mime-display-multipart-alternative-as-mixed} and
10635@code{gnus-mime-display-multipart-related-as-mixed}.
10636
10637@vindex mm-file-name-rewrite-functions
10638@item mm-file-name-rewrite-functions
10639List of functions used for rewriting file names of @acronym{MIME} parts.
10640Each function takes a file name as input and returns a file name.
10641
10642Ready-made functions include@*
10643@code{mm-file-name-delete-whitespace},
10644@code{mm-file-name-trim-whitespace},
10645@code{mm-file-name-collapse-whitespace}, and
10646@code{mm-file-name-replace-whitespace}. The later uses the value of
10647the variable @code{mm-file-name-replace-whitespace} to replace each
10648whitespace character in a file name with that string; default value
10649is @code{"_"} (a single underscore).
10650@findex mm-file-name-delete-whitespace
10651@findex mm-file-name-trim-whitespace
10652@findex mm-file-name-collapse-whitespace
10653@findex mm-file-name-replace-whitespace
10654@vindex mm-file-name-replace-whitespace
10655
10656The standard functions @code{capitalize}, @code{downcase},
10657@code{upcase}, and @code{upcase-initials} may be useful, too.
10658
10659Everybody knows that whitespace characters in file names are evil,
10660except those who don't know. If you receive lots of attachments from
10661such unenlightened users, you can make live easier by adding
10662
10663@lisp
10664(setq mm-file-name-rewrite-functions
10665 '(mm-file-name-trim-whitespace
10666 mm-file-name-collapse-whitespace
10667 mm-file-name-replace-whitespace))
10668@end lisp
10669
10670@noindent
10671to your @file{~/.gnus.el} file.
10672
10673@end table
10674
10675
10676@node Charsets
10677@section Charsets
10678@cindex charsets
10679
10680People use different charsets, and we have @acronym{MIME} to let us know what
10681charsets they use. Or rather, we wish we had. Many people use
10682newsreaders and mailers that do not understand or use @acronym{MIME}, and
10683just send out messages without saying what character sets they use. To
10684help a bit with this, some local news hierarchies have policies that say
10685what character set is the default. For instance, the @samp{fj}
10686hierarchy uses @code{iso-2022-jp}.
10687
10688@vindex gnus-group-charset-alist
10689This knowledge is encoded in the @code{gnus-group-charset-alist}
10690variable, which is an alist of regexps (use the first item to match full
10691group names) and default charsets to be used when reading these groups.
10692
10693@vindex gnus-newsgroup-ignored-charsets
10694In addition, some people do use soi-disant @acronym{MIME}-aware agents that
10695aren't. These blithely mark messages as being in @code{iso-8859-1}
10696even if they really are in @code{koi-8}. To help here, the
10697@code{gnus-newsgroup-ignored-charsets} variable can be used. The
10698charsets that are listed here will be ignored. The variable can be
10699set on a group-by-group basis using the group parameters (@pxref{Group
10700Parameters}). The default value is @code{(unknown-8bit x-unknown)},
10701which includes values some agents insist on having in there.
10702
10703@vindex gnus-group-posting-charset-alist
10704When posting, @code{gnus-group-posting-charset-alist} is used to
10705determine which charsets should not be encoded using the @acronym{MIME}
10706encodings. For instance, some hierarchies discourage using
10707quoted-printable header encoding.
10708
10709This variable is an alist of regexps and permitted unencoded charsets
10710for posting. Each element of the alist has the form @code{(}@var{test
10711header body-list}@code{)}, where:
10712
10713@table @var
10714@item test
10715is either a regular expression matching the newsgroup header or a
10716variable to query,
10717@item header
10718is the charset which may be left unencoded in the header (@code{nil}
10719means encode all charsets),
10720@item body-list
10721is a list of charsets which may be encoded using 8bit content-transfer
10722encoding in the body, or one of the special values @code{nil} (always
10723encode using quoted-printable) or @code{t} (always use 8bit).
10724@end table
10725
10726@cindex Russian
10727@cindex koi8-r
10728@cindex koi8-u
10729@cindex iso-8859-5
10730@cindex coding system aliases
10731@cindex preferred charset
10732
10733@xref{Encoding Customization, , Encoding Customization, emacs-mime,
10734The Emacs MIME Manual}, for additional variables that control which
10735MIME charsets are used when sending messages.
10736
10737Other charset tricks that may be useful, although not Gnus-specific:
10738
10739If there are several @acronym{MIME} charsets that encode the same Emacs
10740charset, you can choose what charset to use by saying the following:
10741
10742@lisp
10743(put-charset-property 'cyrillic-iso8859-5
10744 'preferred-coding-system 'koi8-r)
10745@end lisp
10746
10747This means that Russian will be encoded using @code{koi8-r} instead of
10748the default @code{iso-8859-5} @acronym{MIME} charset.
10749
10750If you want to read messages in @code{koi8-u}, you can cheat and say
10751
10752@lisp
10753(define-coding-system-alias 'koi8-u 'koi8-r)
10754@end lisp
10755
10756This will almost do the right thing.
10757
10758And finally, to read charsets like @code{windows-1251}, you can say
10759something like
10760
10761@lisp
10762(codepage-setup 1251)
10763(define-coding-system-alias 'windows-1251 'cp1251)
10764@end lisp
10765
10766
10767@node Article Commands
10768@section Article Commands
10769
10770@table @kbd
10771
10772@item A P
10773@cindex PostScript
10774@cindex printing
10775@kindex A P (Summary)
10776@vindex gnus-ps-print-hook
10777@findex gnus-summary-print-article
10778Generate and print a PostScript image of the article buffer
10779(@code{gnus-summary-print-article}). @code{gnus-ps-print-hook} will
10780be run just before printing the buffer. An alternative way to print
10781article is to use Muttprint (@pxref{Saving Articles}).
10782
10783@end table
10784
10785
10786@node Summary Sorting
10787@section Summary Sorting
10788@cindex summary sorting
10789
10790You can have the summary buffer sorted in various ways, even though I
10791can't really see why you'd want that.
10792
10793@table @kbd
10794
10795@item C-c C-s C-n
10796@kindex C-c C-s C-n (Summary)
10797@findex gnus-summary-sort-by-number
10798Sort by article number (@code{gnus-summary-sort-by-number}).
10799
6ecfe5c2
MB
10800@item C-c C-s C-m C-n
10801@kindex C-c C-s C-n (Summary)
10802@findex gnus-summary-sort-by-most-recent-number
10803Sort by most recent article number
10804(@code{gnus-summary-sort-by-most-recent-number}).
10805
4009494e
GM
10806@item C-c C-s C-a
10807@kindex C-c C-s C-a (Summary)
10808@findex gnus-summary-sort-by-author
10809Sort by author (@code{gnus-summary-sort-by-author}).
10810
01c52d31
MB
10811@item C-c C-s C-t
10812@kindex C-c C-s C-t (Summary)
10813@findex gnus-summary-sort-by-recipient
10814Sort by recipient (@code{gnus-summary-sort-by-recipient}).
10815
4009494e
GM
10816@item C-c C-s C-s
10817@kindex C-c C-s C-s (Summary)
10818@findex gnus-summary-sort-by-subject
10819Sort by subject (@code{gnus-summary-sort-by-subject}).
10820
10821@item C-c C-s C-d
10822@kindex C-c C-s C-d (Summary)
10823@findex gnus-summary-sort-by-date
10824Sort by date (@code{gnus-summary-sort-by-date}).
10825
6ecfe5c2
MB
10826@item C-c C-s C-m C-d
10827@kindex C-c C-s C-m C-d (Summary)
10828@findex gnus-summary-sort-by-most-recent-date
10829Sort by most recent date (@code{gnus-summary-sort-by-most-recent-date}).
10830
4009494e
GM
10831@item C-c C-s C-l
10832@kindex C-c C-s C-l (Summary)
10833@findex gnus-summary-sort-by-lines
10834Sort by lines (@code{gnus-summary-sort-by-lines}).
10835
10836@item C-c C-s C-c
10837@kindex C-c C-s C-c (Summary)
10838@findex gnus-summary-sort-by-chars
10839Sort by article length (@code{gnus-summary-sort-by-chars}).
10840
10841@item C-c C-s C-i
10842@kindex C-c C-s C-i (Summary)
10843@findex gnus-summary-sort-by-score
10844Sort by score (@code{gnus-summary-sort-by-score}).
10845
10846@item C-c C-s C-r
10847@kindex C-c C-s C-r (Summary)
10848@findex gnus-summary-sort-by-random
10849Randomize (@code{gnus-summary-sort-by-random}).
10850
10851@item C-c C-s C-o
10852@kindex C-c C-s C-o (Summary)
10853@findex gnus-summary-sort-by-original
10854Sort using the default sorting method
10855(@code{gnus-summary-sort-by-original}).
10856@end table
10857
10858These functions will work both when you use threading and when you don't
10859use threading. In the latter case, all summary lines will be sorted,
10860line by line. In the former case, sorting will be done on a
10861root-by-root basis, which might not be what you were looking for. To
10862toggle whether to use threading, type @kbd{T T} (@pxref{Thread
10863Commands}).
10864
6ecfe5c2
MB
10865If a prefix argument if given, the sort order is reversed.
10866
4009494e
GM
10867
10868@node Finding the Parent
10869@section Finding the Parent
10870@cindex parent articles
10871@cindex referring articles
10872
10873@table @kbd
10874@item ^
10875@kindex ^ (Summary)
10876@findex gnus-summary-refer-parent-article
10877If you'd like to read the parent of the current article, and it is not
10878displayed in the summary buffer, you might still be able to. That is,
10879if the current group is fetched by @acronym{NNTP}, the parent hasn't expired
10880and the @code{References} in the current article are not mangled, you
10881can just press @kbd{^} or @kbd{A r}
10882(@code{gnus-summary-refer-parent-article}). If everything goes well,
10883you'll get the parent. If the parent is already displayed in the
10884summary buffer, point will just move to this article.
10885
10886If given a positive numerical prefix, fetch that many articles back into
10887the ancestry. If given a negative numerical prefix, fetch just that
10888ancestor. So if you say @kbd{3 ^}, Gnus will fetch the parent, the
10889grandparent and the grandgrandparent of the current article. If you say
10890@kbd{-3 ^}, Gnus will only fetch the grandgrandparent of the current
10891article.
10892
10893@item A R (Summary)
10894@findex gnus-summary-refer-references
10895@kindex A R (Summary)
10896Fetch all articles mentioned in the @code{References} header of the
10897article (@code{gnus-summary-refer-references}).
10898
10899@item A T (Summary)
10900@findex gnus-summary-refer-thread
10901@kindex A T (Summary)
10902Display the full thread where the current article appears
10903(@code{gnus-summary-refer-thread}). This command has to fetch all the
10904headers in the current group to work, so it usually takes a while. If
10905you do it often, you may consider setting @code{gnus-fetch-old-headers}
10906to @code{invisible} (@pxref{Filling In Threads}). This won't have any
10907visible effects normally, but it'll make this command work a whole lot
10908faster. Of course, it'll make group entry somewhat slow.
10909
10910@vindex gnus-refer-thread-limit
10911The @code{gnus-refer-thread-limit} variable says how many old (i. e.,
10912articles before the first displayed in the current group) headers to
10913fetch when doing this command. The default is 200. If @code{t}, all
10914the available headers will be fetched. This variable can be overridden
10915by giving the @kbd{A T} command a numerical prefix.
10916
10917@item M-^ (Summary)
10918@findex gnus-summary-refer-article
10919@kindex M-^ (Summary)
10920@cindex Message-ID
10921@cindex fetching by Message-ID
10922You can also ask Gnus for an arbitrary article, no matter what group it
10923belongs to. @kbd{M-^} (@code{gnus-summary-refer-article}) will ask you
10924for a @code{Message-ID}, which is one of those long, hard-to-read
10925thingies that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}.
10926You have to get it all exactly right. No fuzzy searches, I'm afraid.
10927
10928Gnus looks for the @code{Message-ID} in the headers that have already
10929been fetched, but also tries all the select methods specified by
10930@code{gnus-refer-article-method} if it is not found.
10931@end table
10932
10933@vindex gnus-refer-article-method
10934If the group you are reading is located on a back end that does not
10935support fetching by @code{Message-ID} very well (like @code{nnspool}),
10936you can set @code{gnus-refer-article-method} to an @acronym{NNTP} method. It
10937would, perhaps, be best if the @acronym{NNTP} server you consult is the one
10938updating the spool you are reading from, but that's not really
10939necessary.
10940
10941It can also be a list of select methods, as well as the special symbol
10942@code{current}, which means to use the current select method. If it
10943is a list, Gnus will try all the methods in the list until it finds a
10944match.
10945
10946Here's an example setting that will first try the current method, and
10947then ask Google if that fails:
10948
10949@lisp
10950(setq gnus-refer-article-method
10951 '(current
10952 (nnweb "google" (nnweb-type google))))
10953@end lisp
10954
10955Most of the mail back ends support fetching by @code{Message-ID}, but
10956do not do a particularly excellent job at it. That is, @code{nnmbox},
10957@code{nnbabyl}, @code{nnmaildir}, @code{nnml}, are able to locate
10958articles from any groups, while @code{nnfolder}, and @code{nnimap} are
10959only able to locate articles that have been posted to the current
10960group. (Anything else would be too time consuming.) @code{nnmh} does
10961not support this at all.
10962
10963
10964@node Alternative Approaches
10965@section Alternative Approaches
10966
10967Different people like to read news using different methods. This being
10968Gnus, we offer a small selection of minor modes for the summary buffers.
10969
10970@menu
10971* Pick and Read:: First mark articles and then read them.
10972* Binary Groups:: Auto-decode all articles.
10973@end menu
10974
10975
10976@node Pick and Read
10977@subsection Pick and Read
10978@cindex pick and read
10979
10980Some newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) use
10981a two-phased reading interface. The user first marks in a summary
10982buffer the articles she wants to read. Then she starts reading the
10983articles with just an article buffer displayed.
10984
10985@findex gnus-pick-mode
10986@kindex M-x gnus-pick-mode
10987Gnus provides a summary buffer minor mode that allows
10988this---@code{gnus-pick-mode}. This basically means that a few process
10989mark commands become one-keystroke commands to allow easy marking, and
10990it provides one additional command for switching to the summary buffer.
10991
10992Here are the available keystrokes when using pick mode:
10993
10994@table @kbd
10995@item .
10996@kindex . (Pick)
10997@findex gnus-pick-article-or-thread
10998Pick the article or thread on the current line
10999(@code{gnus-pick-article-or-thread}). If the variable
11000@code{gnus-thread-hide-subtree} is true, then this key selects the
11001entire thread when used at the first article of the thread. Otherwise,
11002it selects just the article. If given a numerical prefix, go to that
11003thread or article and pick it. (The line number is normally displayed
11004at the beginning of the summary pick lines.)
11005
11006@item SPACE
11007@kindex SPACE (Pick)
11008@findex gnus-pick-next-page
11009Scroll the summary buffer up one page (@code{gnus-pick-next-page}). If
11010at the end of the buffer, start reading the picked articles.
11011
11012@item u
11013@kindex u (Pick)
11014@findex gnus-pick-unmark-article-or-thread.
11015Unpick the thread or article
11016(@code{gnus-pick-unmark-article-or-thread}). If the variable
11017@code{gnus-thread-hide-subtree} is true, then this key unpicks the
11018thread if used at the first article of the thread. Otherwise it unpicks
11019just the article. You can give this key a numerical prefix to unpick
11020the thread or article at that line.
11021
11022@item RET
11023@kindex RET (Pick)
11024@findex gnus-pick-start-reading
11025@vindex gnus-pick-display-summary
11026Start reading the picked articles (@code{gnus-pick-start-reading}). If
11027given a prefix, mark all unpicked articles as read first. If
11028@code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer
11029will still be visible when you are reading.
11030
11031@end table
11032
11033All the normal summary mode commands are still available in the
11034pick-mode, with the exception of @kbd{u}. However @kbd{!} is available
11035which is mapped to the same function
11036@code{gnus-summary-tick-article-forward}.
11037
11038If this sounds like a good idea to you, you could say:
11039
11040@lisp
11041(add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
11042@end lisp
11043
11044@vindex gnus-pick-mode-hook
11045@code{gnus-pick-mode-hook} is run in pick minor mode buffers.
11046
11047@vindex gnus-mark-unpicked-articles-as-read
11048If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark
11049all unpicked articles as read. The default is @code{nil}.
11050
11051@vindex gnus-summary-pick-line-format
11052The summary line format in pick mode is slightly different from the
11053standard format. At the beginning of each line the line number is
11054displayed. The pick mode line format is controlled by the
11055@code{gnus-summary-pick-line-format} variable (@pxref{Formatting
11056Variables}). It accepts the same format specs that
11057@code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}).
11058
11059
11060@node Binary Groups
11061@subsection Binary Groups
11062@cindex binary groups
11063
11064@findex gnus-binary-mode
11065@kindex M-x gnus-binary-mode
11066If you spend much time in binary groups, you may grow tired of hitting
11067@kbd{X u}, @kbd{n}, @kbd{RET} all the time. @kbd{M-x gnus-binary-mode}
11068is a minor mode for summary buffers that makes all ordinary Gnus article
11069selection functions uudecode series of articles and display the result
11070instead of just displaying the articles the normal way.
11071
11072@kindex g (Binary)
11073@findex gnus-binary-show-article
11074The only way, in fact, to see the actual articles is the @kbd{g}
11075command, when you have turned on this mode
11076(@code{gnus-binary-show-article}).
11077
11078@vindex gnus-binary-mode-hook
11079@code{gnus-binary-mode-hook} is called in binary minor mode buffers.
11080
11081
11082@node Tree Display
11083@section Tree Display
11084@cindex trees
11085
11086@vindex gnus-use-trees
11087If you don't like the normal Gnus summary display, you might try setting
11088@code{gnus-use-trees} to @code{t}. This will create (by default) an
11089additional @dfn{tree buffer}. You can execute all summary mode commands
11090in the tree buffer.
11091
11092There are a few variables to customize the tree display, of course:
11093
11094@table @code
11095@item gnus-tree-mode-hook
11096@vindex gnus-tree-mode-hook
11097A hook called in all tree mode buffers.
11098
11099@item gnus-tree-mode-line-format
11100@vindex gnus-tree-mode-line-format
11101A format string for the mode bar in the tree mode buffers (@pxref{Mode
11102Line Formatting}). The default is @samp{Gnus: %%b %S %Z}. For a list
11103of valid specs, @pxref{Summary Buffer Mode Line}.
11104
11105@item gnus-selected-tree-face
11106@vindex gnus-selected-tree-face
11107Face used for highlighting the selected article in the tree buffer. The
11108default is @code{modeline}.
11109
11110@item gnus-tree-line-format
11111@vindex gnus-tree-line-format
11112A format string for the tree nodes. The name is a bit of a misnomer,
11113though---it doesn't define a line, but just the node. The default value
11114is @samp{%(%[%3,3n%]%)}, which displays the first three characters of
11115the name of the poster. It is vital that all nodes are of the same
11116length, so you @emph{must} use @samp{%4,4n}-like specifiers.
11117
11118Valid specs are:
11119
11120@table @samp
11121@item n
11122The name of the poster.
11123@item f
11124The @code{From} header.
11125@item N
11126The number of the article.
11127@item [
11128The opening bracket.
11129@item ]
11130The closing bracket.
11131@item s
11132The subject.
11133@end table
11134
11135@xref{Formatting Variables}.
11136
11137Variables related to the display are:
11138
11139@table @code
11140@item gnus-tree-brackets
11141@vindex gnus-tree-brackets
11142This is used for differentiating between ``real'' articles and
11143``sparse'' articles. The format is
11144@example
11145((@var{real-open} . @var{real-close})
11146 (@var{sparse-open} . @var{sparse-close})
11147 (@var{dummy-open} . @var{dummy-close}))
11148@end example
11149and the default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))}.
11150
11151@item gnus-tree-parent-child-edges
11152@vindex gnus-tree-parent-child-edges
11153This is a list that contains the characters used for connecting parent
11154nodes to their children. The default is @code{(?- ?\\ ?|)}.
11155
11156@end table
11157
11158@item gnus-tree-minimize-window
11159@vindex gnus-tree-minimize-window
11160If this variable is non-@code{nil}, Gnus will try to keep the tree
11161buffer as small as possible to allow more room for the other Gnus
11162windows. If this variable is a number, the tree buffer will never be
11163higher than that number. The default is @code{t}. Note that if you
11164have several windows displayed side-by-side in a frame and the tree
11165buffer is one of these, minimizing the tree window will also resize all
11166other windows displayed next to it.
11167
11168You may also wish to add the following hook to keep the window minimized
11169at all times:
11170
11171@lisp
11172(add-hook 'gnus-configure-windows-hook
11173 'gnus-tree-perhaps-minimize)
11174@end lisp
11175
11176@item gnus-generate-tree-function
11177@vindex gnus-generate-tree-function
11178@findex gnus-generate-horizontal-tree
11179@findex gnus-generate-vertical-tree
11180The function that actually generates the thread tree. Two predefined
11181functions are available: @code{gnus-generate-horizontal-tree} and
11182@code{gnus-generate-vertical-tree} (which is the default).
11183
11184@end table
11185
11186Here's an example from a horizontal tree buffer:
11187
11188@example
11189@{***@}-(***)-[odd]-[Gun]
11190 | \[Jan]
11191 | \[odd]-[Eri]
11192 | \(***)-[Eri]
11193 | \[odd]-[Paa]
11194 \[Bjo]
11195 \[Gun]
11196 \[Gun]-[Jor]
11197@end example
11198
11199Here's the same thread displayed in a vertical tree buffer:
11200
11201@example
11202@group
11203@{***@}
11204 |--------------------------\-----\-----\
11205(***) [Bjo] [Gun] [Gun]
11206 |--\-----\-----\ |
11207[odd] [Jan] [odd] (***) [Jor]
11208 | | |--\
11209[Gun] [Eri] [Eri] [odd]
11210 |
11211 [Paa]
11212@end group
11213@end example
11214
11215If you're using horizontal trees, it might be nice to display the trees
11216side-by-side with the summary buffer. You could add something like the
11217following to your @file{~/.gnus.el} file:
11218
11219@lisp
11220(setq gnus-use-trees t
11221 gnus-generate-tree-function 'gnus-generate-horizontal-tree
11222 gnus-tree-minimize-window nil)
11223(gnus-add-configuration
11224 '(article
11225 (vertical 1.0
11226 (horizontal 0.25
11227 (summary 0.75 point)
11228 (tree 1.0))
11229 (article 1.0))))
11230@end lisp
11231
11232@xref{Window Layout}.
11233
11234
11235@node Mail Group Commands
11236@section Mail Group Commands
11237@cindex mail group commands
11238
11239Some commands only make sense in mail groups. If these commands are
11240invalid in the current group, they will raise a hell and let you know.
11241
11242All these commands (except the expiry and edit commands) use the
11243process/prefix convention (@pxref{Process/Prefix}).
11244
11245@table @kbd
11246
11247@item B e
11248@kindex B e (Summary)
11249@findex gnus-summary-expire-articles
11250@cindex expiring mail
11251Run all expirable articles in the current group through the expiry
11252process (@code{gnus-summary-expire-articles}). That is, delete all
11253expirable articles in the group that have been around for a while.
11254(@pxref{Expiring Mail}).
11255
11256@item B C-M-e
11257@kindex B C-M-e (Summary)
11258@findex gnus-summary-expire-articles-now
11259@cindex expiring mail
11260Delete all the expirable articles in the group
11261(@code{gnus-summary-expire-articles-now}). This means that @strong{all}
11262articles eligible for expiry in the current group will
11263disappear forever into that big @file{/dev/null} in the sky.
11264
11265@item B DEL
11266@kindex B DEL (Summary)
11267@findex gnus-summary-delete-article
11268@c @icon{gnus-summary-mail-delete}
11269Delete the mail article. This is ``delete'' as in ``delete it from your
11270disk forever and ever, never to return again.'' Use with caution.
11271(@code{gnus-summary-delete-article}).
11272
11273@item B m
11274@kindex B m (Summary)
11275@cindex move mail
11276@findex gnus-summary-move-article
11277@vindex gnus-preserve-marks
11278Move the article from one mail group to another
11279(@code{gnus-summary-move-article}). Marks will be preserved if
11280@code{gnus-preserve-marks} is non-@code{nil} (which is the default).
11281
11282@item B c
11283@kindex B c (Summary)
11284@cindex copy mail
11285@findex gnus-summary-copy-article
11286@c @icon{gnus-summary-mail-copy}
11287Copy the article from one group (mail group or not) to a mail group
11288(@code{gnus-summary-copy-article}). Marks will be preserved if
11289@code{gnus-preserve-marks} is non-@code{nil} (which is the default).
11290
11291@item B B
11292@kindex B B (Summary)
11293@cindex crosspost mail
11294@findex gnus-summary-crosspost-article
11295Crosspost the current article to some other group
11296(@code{gnus-summary-crosspost-article}). This will create a new copy of
11297the article in the other group, and the Xref headers of the article will
11298be properly updated.
11299
11300@item B i
11301@kindex B i (Summary)
11302@findex gnus-summary-import-article
11303Import an arbitrary file into the current mail newsgroup
11304(@code{gnus-summary-import-article}). You will be prompted for a file
11305name, a @code{From} header and a @code{Subject} header.
11306
11307@item B I
11308@kindex B I (Summary)
11309@findex gnus-summary-create-article
11310Create an empty article in the current mail newsgroups
11311(@code{gnus-summary-create-article}). You will be prompted for a
11312@code{From} header and a @code{Subject} header.
11313
11314@item B r
11315@kindex B r (Summary)
11316@findex gnus-summary-respool-article
11317@vindex gnus-summary-respool-default-method
11318Respool the mail article (@code{gnus-summary-respool-article}).
11319@code{gnus-summary-respool-default-method} will be used as the default
11320select method when respooling. This variable is @code{nil} by default,
11321which means that the current group select method will be used instead.
11322Marks will be preserved if @code{gnus-preserve-marks} is non-@code{nil}
11323(which is the default).
11324
11325@item B w
11326@itemx e
11327@kindex B w (Summary)
11328@kindex e (Summary)
11329@findex gnus-summary-edit-article
11330@kindex C-c C-c (Article)
11331@findex gnus-summary-edit-article-done
11332Edit the current article (@code{gnus-summary-edit-article}). To finish
11333editing and make the changes permanent, type @kbd{C-c C-c}
11334(@code{gnus-summary-edit-article-done}). If you give a prefix to the
11335@kbd{C-c C-c} command, Gnus won't re-highlight the article.
11336
11337@item B q
11338@kindex B q (Summary)
11339@findex gnus-summary-respool-query
11340If you want to re-spool an article, you might be curious as to what group
11341the article will end up in before you do the re-spooling. This command
11342will tell you (@code{gnus-summary-respool-query}).
11343
11344@item B t
11345@kindex B t (Summary)
11346@findex gnus-summary-respool-trace
11347Similarly, this command will display all fancy splitting patterns used
11348when respooling, if any (@code{gnus-summary-respool-trace}).
11349
11350@item B p
11351@kindex B p (Summary)
11352@findex gnus-summary-article-posted-p
11353Some people have a tendency to send you ``courtesy'' copies when they
11354follow up to articles you have posted. These usually have a
11355@code{Newsgroups} header in them, but not always. This command
11356(@code{gnus-summary-article-posted-p}) will try to fetch the current
11357article from your news server (or rather, from
11358@code{gnus-refer-article-method} or @code{gnus-select-method}) and will
11359report back whether it found the article or not. Even if it says that
11360it didn't find the article, it may have been posted anyway---mail
11361propagation is much faster than news propagation, and the news copy may
11362just not have arrived yet.
11363
11364@item K E
11365@kindex K E (Summary)
11366@findex gnus-article-encrypt-body
11367@vindex gnus-article-encrypt-protocol
11368Encrypt the body of an article (@code{gnus-article-encrypt-body}).
11369The body is encrypted with the encryption protocol specified by the
11370variable @code{gnus-article-encrypt-protocol}.
11371
11372@end table
11373
11374@vindex gnus-move-split-methods
11375@cindex moving articles
11376If you move (or copy) articles regularly, you might wish to have Gnus
11377suggest where to put the articles. @code{gnus-move-split-methods} is a
11378variable that uses the same syntax as @code{gnus-split-methods}
11379(@pxref{Saving Articles}). You may customize that variable to create
11380suggestions you find reasonable. (Note that
11381@code{gnus-move-split-methods} uses group names where
11382@code{gnus-split-methods} uses file names.)
11383
11384@lisp
11385(setq gnus-move-split-methods
11386 '(("^From:.*Lars Magne" "nnml:junk")
11387 ("^Subject:.*gnus" "nnfolder:important")
11388 (".*" "nnml:misc")))
11389@end lisp
11390
11391
11392@node Various Summary Stuff
11393@section Various Summary Stuff
11394
11395@menu
11396* Summary Group Information:: Information oriented commands.
11397* Searching for Articles:: Multiple article commands.
11398* Summary Generation Commands::
11399* Really Various Summary Commands:: Those pesky non-conformant commands.
11400@end menu
11401
11402@table @code
11403@vindex gnus-summary-display-while-building
11404@item gnus-summary-display-while-building
11405If non-@code{nil}, show and update the summary buffer as it's being
11406built. If @code{t}, update the buffer after every line is inserted.
11407If the value is an integer, @var{n}, update the display every @var{n}
11408lines. The default is @code{nil}.
11409
11410@vindex gnus-summary-display-arrow
11411@item gnus-summary-display-arrow
11412If non-@code{nil}, display an arrow in the fringe to indicate the
11413current article.
11414
11415@vindex gnus-summary-mode-hook
11416@item gnus-summary-mode-hook
11417This hook is called when creating a summary mode buffer.
11418
11419@vindex gnus-summary-generate-hook
11420@item gnus-summary-generate-hook
11421This is called as the last thing before doing the threading and the
11422generation of the summary buffer. It's quite convenient for customizing
11423the threading variables based on what data the newsgroup has. This hook
11424is called from the summary buffer after most summary buffer variables
11425have been set.
11426
11427@vindex gnus-summary-prepare-hook
11428@item gnus-summary-prepare-hook
11429It is called after the summary buffer has been generated. You might use
11430it to, for instance, highlight lines or modify the look of the buffer in
11431some other ungodly manner. I don't care.
11432
11433@vindex gnus-summary-prepared-hook
11434@item gnus-summary-prepared-hook
11435A hook called as the very last thing after the summary buffer has been
11436generated.
11437
11438@vindex gnus-summary-ignore-duplicates
11439@item gnus-summary-ignore-duplicates
11440When Gnus discovers two articles that have the same @code{Message-ID},
11441it has to do something drastic. No articles are allowed to have the
11442same @code{Message-ID}, but this may happen when reading mail from some
11443sources. Gnus allows you to customize what happens with this variable.
11444If it is @code{nil} (which is the default), Gnus will rename the
11445@code{Message-ID} (for display purposes only) and display the article as
11446any other article. If this variable is @code{t}, it won't display the
11447article---it'll be as if it never existed.
11448
11449@vindex gnus-alter-articles-to-read-function
11450@item gnus-alter-articles-to-read-function
11451This function, which takes two parameters (the group name and the list
11452of articles to be selected), is called to allow the user to alter the
11453list of articles to be selected.
11454
11455For instance, the following function adds the list of cached articles to
11456the list in one particular group:
11457
11458@lisp
11459(defun my-add-cached-articles (group articles)
11460 (if (string= group "some.group")
11461 (append gnus-newsgroup-cached articles)
11462 articles))
11463@end lisp
11464
11465@vindex gnus-newsgroup-variables
11466@item gnus-newsgroup-variables
11467A list of newsgroup (summary buffer) local variables, or cons of
11468variables and their default expressions to be evalled (when the default
11469values are not @code{nil}), that should be made global while the summary
11470buffer is active.
11471
11472Note: The default expressions will be evaluated (using function
11473@code{eval}) before assignment to the local variable rather than just
11474assigned to it. If the default expression is the symbol @code{global},
11475that symbol will not be evaluated but the global value of the local
11476variable will be used instead.
11477
11478These variables can be used to set variables in the group parameters
11479while still allowing them to affect operations done in other
11480buffers. For example:
11481
11482@lisp
11483(setq gnus-newsgroup-variables
11484 '(message-use-followup-to
11485 (gnus-visible-headers .
11486 "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^To:")))
11487@end lisp
11488
11489Also @pxref{Group Parameters}.
3a23a519
MB
11490
11491@vindex gnus-propagate-marks
11492@item gnus-propagate-marks
11493If non-@code{nil}, propagate marks to the backends for possible
11494storing. @xref{NNTP marks}, and friends, for a more fine-grained
11495sieve.
11496
4009494e
GM
11497@end table
11498
11499
11500@node Summary Group Information
11501@subsection Summary Group Information
11502
11503@table @kbd
11504
11505@item H f
11506@kindex H f (Summary)
11507@findex gnus-summary-fetch-faq
11508@vindex gnus-group-faq-directory
11509Try to fetch the @acronym{FAQ} (list of frequently asked questions)
11510for the current group (@code{gnus-summary-fetch-faq}). Gnus will try
11511to get the @acronym{FAQ} from @code{gnus-group-faq-directory}, which
11512is usually a directory on a remote machine. This variable can also be
11513a list of directories. In that case, giving a prefix to this command
11514will allow you to choose between the various sites. @code{ange-ftp}
11515or @code{efs} will probably be used for fetching the file.
11516
11517@item H d
11518@kindex H d (Summary)
11519@findex gnus-summary-describe-group
11520Give a brief description of the current group
11521(@code{gnus-summary-describe-group}). If given a prefix, force
11522rereading the description from the server.
11523
11524@item H h
11525@kindex H h (Summary)
11526@findex gnus-summary-describe-briefly
11527Give an extremely brief description of the most important summary
11528keystrokes (@code{gnus-summary-describe-briefly}).
11529
11530@item H i
11531@kindex H i (Summary)
11532@findex gnus-info-find-node
11533Go to the Gnus info node (@code{gnus-info-find-node}).
11534@end table
11535
11536
11537@node Searching for Articles
11538@subsection Searching for Articles
11539
11540@table @kbd
11541
11542@item M-s
11543@kindex M-s (Summary)
11544@findex gnus-summary-search-article-forward
11545Search through all subsequent (raw) articles for a regexp
11546(@code{gnus-summary-search-article-forward}).
11547
11548@item M-r
11549@kindex M-r (Summary)
11550@findex gnus-summary-search-article-backward
11551Search through all previous (raw) articles for a regexp
11552(@code{gnus-summary-search-article-backward}).
11553
01c52d31
MB
11554@item M-S
11555@kindex M-S (Summary)
11556@findex gnus-summary-repeat-search-article-forward
11557Repeat the previous search forwards
11558(@code{gnus-summary-repeat-search-article-forward}).
11559
11560@item M-R
11561@kindex M-R (Summary)
11562@findex gnus-summary-repeat-search-article-backward
11563Repeat the previous search backwards
11564(@code{gnus-summary-repeat-search-article-backward}).
11565
4009494e
GM
11566@item &
11567@kindex & (Summary)
11568@findex gnus-summary-execute-command
11569This command will prompt you for a header, a regular expression to match
11570on this field, and a command to be executed if the match is made
11571(@code{gnus-summary-execute-command}). If the header is an empty
11572string, the match is done on the entire article. If given a prefix,
11573search backward instead.
11574
11575For instance, @kbd{& RET some.*string RET #} will put the process mark on
11576all articles that have heads or bodies that match @samp{some.*string}.
11577
11578@item M-&
11579@kindex M-& (Summary)
11580@findex gnus-summary-universal-argument
11581Perform any operation on all articles that have been marked with
11582the process mark (@code{gnus-summary-universal-argument}).
11583@end table
11584
11585@node Summary Generation Commands
11586@subsection Summary Generation Commands
11587
11588@table @kbd
11589
11590@item Y g
11591@kindex Y g (Summary)
11592@findex gnus-summary-prepare
11593Regenerate the current summary buffer (@code{gnus-summary-prepare}).
11594
11595@item Y c
11596@kindex Y c (Summary)
11597@findex gnus-summary-insert-cached-articles
11598Pull all cached articles (for the current group) into the summary buffer
11599(@code{gnus-summary-insert-cached-articles}).
11600
11601@item Y d
11602@kindex Y d (Summary)
11603@findex gnus-summary-insert-dormant-articles
11604Pull all dormant articles (for the current group) into the summary buffer
11605(@code{gnus-summary-insert-dormant-articles}).
11606
01c52d31
MB
11607@item Y t
11608@kindex Y t (Summary)
11609@findex gnus-summary-insert-ticked-articles
11610Pull all ticked articles (for the current group) into the summary buffer
11611(@code{gnus-summary-insert-ticked-articles}).
11612
4009494e
GM
11613@end table
11614
11615
11616@node Really Various Summary Commands
11617@subsection Really Various Summary Commands
11618
11619@table @kbd
11620
11621@item A D
11622@itemx C-d
11623@kindex C-d (Summary)
11624@kindex A D (Summary)
11625@findex gnus-summary-enter-digest-group
11626If the current article is a collection of other articles (for instance,
11627a digest), you might use this command to enter a group based on the that
11628article (@code{gnus-summary-enter-digest-group}). Gnus will try to
11629guess what article type is currently displayed unless you give a prefix
11630to this command, which forces a ``digest'' interpretation. Basically,
11631whenever you see a message that is a collection of other messages of
11632some format, you @kbd{C-d} and read these messages in a more convenient
11633fashion.
11634
01c52d31
MB
11635@vindex gnus-auto-select-on-ephemeral-exit
11636The variable @code{gnus-auto-select-on-ephemeral-exit} controls what
11637article should be selected after exiting a digest group. Valid values
11638include:
11639
11640@table @code
11641@item next
11642Select the next article.
11643
11644@item next-unread
11645Select the next unread article.
11646
11647@item next-noselect
11648Move the cursor to the next article. This is the default.
11649
11650@item next-unread-noselect
11651Move the cursor to the next unread article.
11652@end table
11653
11654If it has any other value or there is no next (unread) article, the
11655article selected before entering to the digest group will appear.
11656
4009494e
GM
11657@item C-M-d
11658@kindex C-M-d (Summary)
11659@findex gnus-summary-read-document
11660This command is very similar to the one above, but lets you gather
11661several documents into one biiig group
11662(@code{gnus-summary-read-document}). It does this by opening several
11663@code{nndoc} groups for each document, and then opening an
11664@code{nnvirtual} group on top of these @code{nndoc} groups. This
11665command understands the process/prefix convention
11666(@pxref{Process/Prefix}).
11667
11668@item C-t
11669@kindex C-t (Summary)
11670@findex gnus-summary-toggle-truncation
11671Toggle truncation of summary lines
11672(@code{gnus-summary-toggle-truncation}). This will probably confuse the
11673line centering function in the summary buffer, so it's not a good idea
11674to have truncation switched off while reading articles.
11675
11676@item =
11677@kindex = (Summary)
11678@findex gnus-summary-expand-window
11679Expand the summary buffer window (@code{gnus-summary-expand-window}).
11680If given a prefix, force an @code{article} window configuration.
11681
11682@item C-M-e
11683@kindex C-M-e (Summary)
11684@findex gnus-summary-edit-parameters
11685Edit the group parameters (@pxref{Group Parameters}) of the current
11686group (@code{gnus-summary-edit-parameters}).
11687
11688@item C-M-a
11689@kindex C-M-a (Summary)
11690@findex gnus-summary-customize-parameters
11691Customize the group parameters (@pxref{Group Parameters}) of the current
11692group (@code{gnus-summary-customize-parameters}).
11693
11694@end table
11695
11696
11697@node Exiting the Summary Buffer
11698@section Exiting the Summary Buffer
11699@cindex summary exit
11700@cindex exiting groups
11701
11702Exiting from the summary buffer will normally update all info on the
11703group and return you to the group buffer.
11704
11705@table @kbd
11706
11707@item Z Z
11708@itemx Z Q
11709@itemx q
11710@kindex Z Z (Summary)
11711@kindex Z Q (Summary)
11712@kindex q (Summary)
11713@findex gnus-summary-exit
11714@vindex gnus-summary-exit-hook
11715@vindex gnus-summary-prepare-exit-hook
11716@vindex gnus-group-no-more-groups-hook
11717@c @icon{gnus-summary-exit}
11718Exit the current group and update all information on the group
11719(@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} is
11720called before doing much of the exiting, which calls
11721@code{gnus-summary-expire-articles} by default.
11722@code{gnus-summary-exit-hook} is called after finishing the exit
11723process. @code{gnus-group-no-more-groups-hook} is run when returning to
11724group mode having no more (unread) groups.
11725
11726@item Z E
11727@itemx Q
11728@kindex Z E (Summary)
11729@kindex Q (Summary)
11730@findex gnus-summary-exit-no-update
11731Exit the current group without updating any information on the group
11732(@code{gnus-summary-exit-no-update}).
11733
11734@item Z c
11735@itemx c
11736@kindex Z c (Summary)
11737@kindex c (Summary)
11738@findex gnus-summary-catchup-and-exit
11739@c @icon{gnus-summary-catchup-and-exit}
11740Mark all unticked articles in the group as read and then exit
11741(@code{gnus-summary-catchup-and-exit}).
11742
11743@item Z C
11744@kindex Z C (Summary)
11745@findex gnus-summary-catchup-all-and-exit
11746Mark all articles, even the ticked ones, as read and then exit
11747(@code{gnus-summary-catchup-all-and-exit}).
11748
11749@item Z n
11750@kindex Z n (Summary)
11751@findex gnus-summary-catchup-and-goto-next-group
11752Mark all articles as read and go to the next group
11753(@code{gnus-summary-catchup-and-goto-next-group}).
11754
01c52d31
MB
11755@item Z p
11756@kindex Z p (Summary)
11757@findex gnus-summary-catchup-and-goto-prev-group
11758Mark all articles as read and go to the previous group
11759(@code{gnus-summary-catchup-and-goto-prev-group}).
11760
4009494e
GM
11761@item Z R
11762@itemx C-x C-s
11763@kindex Z R (Summary)
11764@kindex C-x C-s (Summary)
11765@findex gnus-summary-reselect-current-group
11766Exit this group, and then enter it again
11767(@code{gnus-summary-reselect-current-group}). If given a prefix, select
11768all articles, both read and unread.
11769
11770@item Z G
11771@itemx M-g
11772@kindex Z G (Summary)
11773@kindex M-g (Summary)
11774@findex gnus-summary-rescan-group
11775@c @icon{gnus-summary-mail-get}
11776Exit the group, check for new articles in the group, and select the
11777group (@code{gnus-summary-rescan-group}). If given a prefix, select all
11778articles, both read and unread.
11779
11780@item Z N
11781@kindex Z N (Summary)
11782@findex gnus-summary-next-group
11783Exit the group and go to the next group
11784(@code{gnus-summary-next-group}).
11785
11786@item Z P
11787@kindex Z P (Summary)
11788@findex gnus-summary-prev-group
11789Exit the group and go to the previous group
11790(@code{gnus-summary-prev-group}).
11791
11792@item Z s
11793@kindex Z s (Summary)
11794@findex gnus-summary-save-newsrc
11795Save the current number of read/marked articles in the dribble buffer
11796and then save the dribble buffer (@code{gnus-summary-save-newsrc}). If
11797given a prefix, also save the @file{.newsrc} file(s). Using this
11798command will make exit without updating (the @kbd{Q} command) worthless.
11799@end table
11800
11801@vindex gnus-exit-group-hook
11802@code{gnus-exit-group-hook} is called when you exit the current group
11803with an ``updating'' exit. For instance @kbd{Q}
11804(@code{gnus-summary-exit-no-update}) does not call this hook.
11805
11806@findex gnus-summary-wake-up-the-dead
11807@findex gnus-dead-summary-mode
11808@vindex gnus-kill-summary-on-exit
11809If you're in the habit of exiting groups, and then changing your mind
11810about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}.
11811If you do that, Gnus won't kill the summary buffer when you exit it.
11812(Quelle surprise!) Instead it will change the name of the buffer to
11813something like @samp{*Dead Summary ... *} and install a minor mode
11814called @code{gnus-dead-summary-mode}. Now, if you switch back to this
11815buffer, you'll find that all keys are mapped to a function called
11816@code{gnus-summary-wake-up-the-dead}. So tapping any keys in a dead
11817summary buffer will result in a live, normal summary buffer.
11818
11819There will never be more than one dead summary buffer at any one time.
11820
11821@vindex gnus-use-cross-reference
11822The data on the current group will be updated (which articles you have
11823read, which articles you have replied to, etc.) when you exit the
11824summary buffer. If the @code{gnus-use-cross-reference} variable is
11825@code{t} (which is the default), articles that are cross-referenced to
11826this group and are marked as read, will also be marked as read in the
11827other subscribed groups they were cross-posted to. If this variable is
11828neither @code{nil} nor @code{t}, the article will be marked as read in
11829both subscribed and unsubscribed groups (@pxref{Crosspost Handling}).
11830
11831
11832@node Crosspost Handling
11833@section Crosspost Handling
11834
11835@cindex velveeta
11836@cindex spamming
11837Marking cross-posted articles as read ensures that you'll never have to
11838read the same article more than once. Unless, of course, somebody has
11839posted it to several groups separately. Posting the same article to
11840several groups (not cross-posting) is called @dfn{spamming}, and you are
11841by law required to send nasty-grams to anyone who perpetrates such a
11842heinous crime. You may want to try NoCeM handling to filter out spam
11843(@pxref{NoCeM}).
11844
11845Remember: Cross-posting is kinda ok, but posting the same article
11846separately to several groups is not. Massive cross-posting (aka.
11847@dfn{velveeta}) is to be avoided at all costs, and you can even use the
11848@code{gnus-summary-mail-crosspost-complaint} command to complain about
11849excessive crossposting (@pxref{Summary Mail Commands}).
11850
11851@cindex cross-posting
11852@cindex Xref
11853@cindex @acronym{NOV}
11854One thing that may cause Gnus to not do the cross-posting thing
11855correctly is if you use an @acronym{NNTP} server that supports @sc{xover}
11856(which is very nice, because it speeds things up considerably) which
11857does not include the @code{Xref} header in its @acronym{NOV} lines. This is
11858Evil, but all too common, alas, alack. Gnus tries to Do The Right Thing
11859even with @sc{xover} by registering the @code{Xref} lines of all
11860articles you actually read, but if you kill the articles, or just mark
11861them as read without reading them, Gnus will not get a chance to snoop
11862the @code{Xref} lines out of these articles, and will be unable to use
11863the cross reference mechanism.
11864
11865@cindex LIST overview.fmt
11866@cindex overview.fmt
11867To check whether your @acronym{NNTP} server includes the @code{Xref} header
11868in its overview files, try @samp{telnet your.nntp.server nntp},
11869@samp{MODE READER} on @code{inn} servers, and then say @samp{LIST
11870overview.fmt}. This may not work, but if it does, and the last line you
11871get does not read @samp{Xref:full}, then you should shout and whine at
11872your news admin until she includes the @code{Xref} header in the
11873overview files.
11874
4009494e 11875If you want Gnus to get the @code{Xref}s right all the time, you have to
4b70e299
MB
11876set @code{nntp-nov-is-evil} to @code{t}, which slows things down
11877considerably. Also @pxref{Slow/Expensive Connection}.
4009494e
GM
11878
11879C'est la vie.
11880
11881For an alternative approach, @pxref{Duplicate Suppression}.
11882
11883
11884@node Duplicate Suppression
11885@section Duplicate Suppression
11886
11887By default, Gnus tries to make sure that you don't have to read the same
11888article more than once by utilizing the crossposting mechanism
11889(@pxref{Crosspost Handling}). However, that simple and efficient
11890approach may not work satisfactory for some users for various
11891reasons.
11892
11893@enumerate
11894@item
11895The @acronym{NNTP} server may fail to generate the @code{Xref} header. This
11896is evil and not very common.
11897
11898@item
11899The @acronym{NNTP} server may fail to include the @code{Xref} header in the
11900@file{.overview} data bases. This is evil and all too common, alas.
11901
11902@item
11903You may be reading the same group (or several related groups) from
11904different @acronym{NNTP} servers.
11905
11906@item
11907You may be getting mail that duplicates articles posted to groups.
11908@end enumerate
11909
11910I'm sure there are other situations where @code{Xref} handling fails as
11911well, but these four are the most common situations.
11912
11913If, and only if, @code{Xref} handling fails for you, then you may
11914consider switching on @dfn{duplicate suppression}. If you do so, Gnus
11915will remember the @code{Message-ID}s of all articles you have read or
11916otherwise marked as read, and then, as if by magic, mark them as read
11917all subsequent times you see them---in @emph{all} groups. Using this
11918mechanism is quite likely to be somewhat inefficient, but not overly
11919so. It's certainly preferable to reading the same articles more than
11920once.
11921
11922Duplicate suppression is not a very subtle instrument. It's more like a
11923sledge hammer than anything else. It works in a very simple
11924fashion---if you have marked an article as read, it adds this Message-ID
11925to a cache. The next time it sees this Message-ID, it will mark the
11926article as read with the @samp{M} mark. It doesn't care what group it
11927saw the article in.
11928
11929@table @code
11930@item gnus-suppress-duplicates
11931@vindex gnus-suppress-duplicates
11932If non-@code{nil}, suppress duplicates.
11933
11934@item gnus-save-duplicate-list
11935@vindex gnus-save-duplicate-list
11936If non-@code{nil}, save the list of duplicates to a file. This will
11937make startup and shutdown take longer, so the default is @code{nil}.
11938However, this means that only duplicate articles read in a single Gnus
11939session are suppressed.
11940
11941@item gnus-duplicate-list-length
11942@vindex gnus-duplicate-list-length
11943This variable says how many @code{Message-ID}s to keep in the duplicate
11944suppression list. The default is 10000.
11945
11946@item gnus-duplicate-file
11947@vindex gnus-duplicate-file
11948The name of the file to store the duplicate suppression list in. The
11949default is @file{~/News/suppression}.
11950@end table
11951
11952If you have a tendency to stop and start Gnus often, setting
11953@code{gnus-save-duplicate-list} to @code{t} is probably a good idea. If
11954you leave Gnus running for weeks on end, you may have it @code{nil}. On
11955the other hand, saving the list makes startup and shutdown much slower,
11956so that means that if you stop and start Gnus often, you should set
11957@code{gnus-save-duplicate-list} to @code{nil}. Uhm. I'll leave this up
11958to you to figure out, I think.
11959
11960@node Security
11961@section Security
11962
11963Gnus is able to verify signed messages or decrypt encrypted messages.
11964The formats that are supported are @acronym{PGP}, @acronym{PGP/MIME}
11965and @acronym{S/MIME}, however you need some external programs to get
11966things to work:
11967
11968@enumerate
11969@item
11970To handle @acronym{PGP} and @acronym{PGP/MIME} messages, you have to
11971install an OpenPGP implementation such as GnuPG. The Lisp interface
11972to GnuPG included with Gnus is called PGG (@pxref{Top, ,PGG, pgg, PGG
11973Manual}), but Mailcrypt and gpg.el are also supported.
11974
11975@item
11976To handle @acronym{S/MIME} message, you need to install OpenSSL. OpenSSL 0.9.6
11977or newer is recommended.
11978
11979@end enumerate
11980
11981The variables that control security functionality on reading messages
11982include:
11983
11984@table @code
11985@item mm-verify-option
11986@vindex mm-verify-option
11987Option of verifying signed parts. @code{never}, not verify;
11988@code{always}, always verify; @code{known}, only verify known
11989protocols. Otherwise, ask user.
11990
11991@item mm-decrypt-option
11992@vindex mm-decrypt-option
11993Option of decrypting encrypted parts. @code{never}, no decryption;
11994@code{always}, always decrypt; @code{known}, only decrypt known
11995protocols. Otherwise, ask user.
11996
11997@item mml1991-use
11998@vindex mml1991-use
11999Symbol indicating elisp interface to OpenPGP implementation for
12000@acronym{PGP} messages. The default is @code{pgg}, but
12001@code{mailcrypt} and @code{gpg} are also supported although
12002deprecated.
12003
12004@item mml2015-use
12005@vindex mml2015-use
12006Symbol indicating elisp interface to OpenPGP implementation for
12007@acronym{PGP/MIME} messages. The default is @code{pgg}, but
12008@code{mailcrypt} and @code{gpg} are also supported although
12009deprecated.
12010
12011@end table
12012
12013By default the buttons that display security information are not
12014shown, because they clutter reading the actual e-mail. You can type
12015@kbd{K b} manually to display the information. Use the
12016@code{gnus-buttonized-mime-types} and
12017@code{gnus-unbuttonized-mime-types} variables to control this
12018permanently. @ref{MIME Commands} for further details, and hints on
12019how to customize these variables to always display security
12020information.
12021
12022@cindex snarfing keys
12023@cindex importing PGP keys
12024@cindex PGP key ring import
12025Snarfing OpenPGP keys (i.e., importing keys from articles into your
12026key ring) is not supported explicitly through a menu item or command,
12027rather Gnus do detect and label keys as @samp{application/pgp-keys},
12028allowing you to specify whatever action you think is appropriate
12029through the usual @acronym{MIME} infrastructure. You can use a
12030@file{~/.mailcap} entry (@pxref{mailcap, , mailcap, emacs-mime, The
12031Emacs MIME Manual}) such as the following to import keys using GNU
12032Privacy Guard when you click on the @acronym{MIME} button
12033(@pxref{Using MIME}).
12034
12035@example
12036application/pgp-keys; gpg --import --interactive --verbose; needsterminal
12037@end example
12038@noindent
12039This happens to also be the default action defined in
12040@code{mailcap-mime-data}.
12041
12042More information on how to set things for sending outgoing signed and
12043encrypted messages up can be found in the message manual
12044(@pxref{Security, ,Security, message, Message Manual}).
12045
12046@node Mailing List
12047@section Mailing List
12048@cindex mailing list
12049@cindex RFC 2396
12050
12051@kindex A M (summary)
12052@findex gnus-mailing-list-insinuate
12053Gnus understands some mailing list fields of RFC 2369. To enable it,
12054add a @code{to-list} group parameter (@pxref{Group Parameters}),
12055possibly using @kbd{A M} (@code{gnus-mailing-list-insinuate}) in the
12056summary buffer.
12057
12058That enables the following commands to the summary buffer:
12059
12060@table @kbd
12061
12062@item C-c C-n h
12063@kindex C-c C-n h (Summary)
12064@findex gnus-mailing-list-help
12065Send a message to fetch mailing list help, if List-Help field exists.
12066
12067@item C-c C-n s
12068@kindex C-c C-n s (Summary)
12069@findex gnus-mailing-list-subscribe
12070Send a message to subscribe the mailing list, if List-Subscribe field exists.
12071
12072@item C-c C-n u
12073@kindex C-c C-n u (Summary)
12074@findex gnus-mailing-list-unsubscribe
12075Send a message to unsubscribe the mailing list, if List-Unsubscribe
12076field exists.
12077
12078@item C-c C-n p
12079@kindex C-c C-n p (Summary)
12080@findex gnus-mailing-list-post
12081Post to the mailing list, if List-Post field exists.
12082
12083@item C-c C-n o
12084@kindex C-c C-n o (Summary)
12085@findex gnus-mailing-list-owner
12086Send a message to the mailing list owner, if List-Owner field exists.
12087
12088@item C-c C-n a
12089@kindex C-c C-n a (Summary)
01c52d31 12090@findex gnus-mailing-list-archive
4009494e
GM
12091Browse the mailing list archive, if List-Archive field exists.
12092
12093@end table
12094
12095
12096@node Article Buffer
12097@chapter Article Buffer
12098@cindex article buffer
12099
12100The articles are displayed in the article buffer, of which there is only
12101one. All the summary buffers share the same article buffer unless you
12102tell Gnus otherwise.
12103
12104@menu
12105* Hiding Headers:: Deciding what headers should be displayed.
12106* Using MIME:: Pushing articles through @acronym{MIME} before reading them.
12107* Customizing Articles:: Tailoring the look of the articles.
12108* Article Keymap:: Keystrokes available in the article buffer.
12109* Misc Article:: Other stuff.
12110@end menu
12111
12112
12113@node Hiding Headers
12114@section Hiding Headers
12115@cindex hiding headers
12116@cindex deleting headers
12117
12118The top section of each article is the @dfn{head}. (The rest is the
12119@dfn{body}, but you may have guessed that already.)
12120
12121@vindex gnus-show-all-headers
12122There is a lot of useful information in the head: the name of the person
12123who wrote the article, the date it was written and the subject of the
12124article. That's well and nice, but there's also lots of information
12125most people do not want to see---what systems the article has passed
12126through before reaching you, the @code{Message-ID}, the
12127@code{References}, etc. ad nauseam---and you'll probably want to get rid
12128of some of those lines. If you want to keep all those lines in the
12129article buffer, you can set @code{gnus-show-all-headers} to @code{t}.
12130
12131Gnus provides you with two variables for sifting headers:
12132
12133@table @code
12134
12135@item gnus-visible-headers
12136@vindex gnus-visible-headers
12137If this variable is non-@code{nil}, it should be a regular expression
12138that says what headers you wish to keep in the article buffer. All
12139headers that do not match this variable will be hidden.
12140
12141For instance, if you only want to see the name of the person who wrote
12142the article and the subject, you'd say:
12143
12144@lisp
12145(setq gnus-visible-headers "^From:\\|^Subject:")
12146@end lisp
12147
12148This variable can also be a list of regexps to match headers to
12149remain visible.
12150
12151@item gnus-ignored-headers
12152@vindex gnus-ignored-headers
12153This variable is the reverse of @code{gnus-visible-headers}. If this
12154variable is set (and @code{gnus-visible-headers} is @code{nil}), it
12155should be a regular expression that matches all lines that you want to
12156hide. All lines that do not match this variable will remain visible.
12157
12158For instance, if you just want to get rid of the @code{References} line
12159and the @code{Xref} line, you might say:
12160
12161@lisp
12162(setq gnus-ignored-headers "^References:\\|^Xref:")
12163@end lisp
12164
12165This variable can also be a list of regexps to match headers to
12166be removed.
12167
12168Note that if @code{gnus-visible-headers} is non-@code{nil}, this
12169variable will have no effect.
12170
12171@end table
12172
12173@vindex gnus-sorted-header-list
12174Gnus can also sort the headers for you. (It does this by default.) You
12175can control the sorting by setting the @code{gnus-sorted-header-list}
12176variable. It is a list of regular expressions that says in what order
12177the headers are to be displayed.
12178
12179For instance, if you want the name of the author of the article first,
12180and then the subject, you might say something like:
12181
12182@lisp
12183(setq gnus-sorted-header-list '("^From:" "^Subject:"))
12184@end lisp
12185
12186Any headers that are to remain visible, but are not listed in this
12187variable, will be displayed in random order after all the headers listed in this variable.
12188
12189@findex gnus-article-hide-boring-headers
12190@vindex gnus-boring-article-headers
12191You can hide further boring headers by setting
12192@code{gnus-treat-hide-boring-headers} to @code{head}. What this function
12193does depends on the @code{gnus-boring-article-headers} variable. It's a
12194list, but this list doesn't actually contain header names. Instead it
12195lists various @dfn{boring conditions} that Gnus can check and remove
12196from sight.
12197
12198These conditions are:
12199@table @code
12200@item empty
12201Remove all empty headers.
12202@item followup-to
12203Remove the @code{Followup-To} header if it is identical to the
12204@code{Newsgroups} header.
12205@item reply-to
12206Remove the @code{Reply-To} header if it lists the same addresses as
12207the @code{From} header, or if the @code{broken-reply-to} group
12208parameter is set.
12209@item newsgroups
12210Remove the @code{Newsgroups} header if it only contains the current group
12211name.
12212@item to-address
12213Remove the @code{To} header if it only contains the address identical to
12214the current group's @code{to-address} parameter.
12215@item to-list
12216Remove the @code{To} header if it only contains the address identical to
12217the current group's @code{to-list} parameter.
12218@item cc-list
12219Remove the @code{Cc} header if it only contains the address identical to
12220the current group's @code{to-list} parameter.
12221@item date
12222Remove the @code{Date} header if the article is less than three days
12223old.
12224@item long-to
12225Remove the @code{To} and/or @code{Cc} header if it is very long.
12226@item many-to
12227Remove all @code{To} and/or @code{Cc} headers if there are more than one.
12228@end table
12229
12230To include these three elements, you could say something like:
12231
12232@lisp
12233(setq gnus-boring-article-headers
12234 '(empty followup-to reply-to))
12235@end lisp
12236
12237This is also the default value for this variable.
12238
12239
12240@node Using MIME
12241@section Using MIME
12242@cindex @acronym{MIME}
12243
12244Mime is a standard for waving your hands through the air, aimlessly,
12245while people stand around yawning.
12246
12247@acronym{MIME}, however, is a standard for encoding your articles, aimlessly,
12248while all newsreaders die of fear.
12249
12250@acronym{MIME} may specify what character set the article uses, the encoding
12251of the characters, and it also makes it possible to embed pictures and
12252other naughty stuff in innocent-looking articles.
12253
12254@vindex gnus-display-mime-function
12255@findex gnus-display-mime
12256Gnus pushes @acronym{MIME} articles through @code{gnus-display-mime-function}
12257to display the @acronym{MIME} parts. This is @code{gnus-display-mime} by
12258default, which creates a bundle of clickable buttons that can be used to
12259display, save and manipulate the @acronym{MIME} objects.
12260
12261The following commands are available when you have placed point over a
12262@acronym{MIME} button:
12263
12264@table @kbd
12265@findex gnus-article-press-button
12266@item RET (Article)
12267@kindex RET (Article)
12268@itemx BUTTON-2 (Article)
12269Toggle displaying of the @acronym{MIME} object
12270(@code{gnus-article-press-button}). If built-in viewers can not display
12271the object, Gnus resorts to external viewers in the @file{mailcap}
12272files. If a viewer has the @samp{copiousoutput} specification, the
12273object is displayed inline.
12274
12275@findex gnus-mime-view-part
12276@item M-RET (Article)
12277@kindex M-RET (Article)
12278@itemx v (Article)
12279Prompt for a method, and then view the @acronym{MIME} object using this
12280method (@code{gnus-mime-view-part}).
12281
12282@findex gnus-mime-view-part-as-type
12283@item t (Article)
12284@kindex t (Article)
12285View the @acronym{MIME} object as if it were a different @acronym{MIME} media type
12286(@code{gnus-mime-view-part-as-type}).
12287
12288@findex gnus-mime-view-part-as-charset
12289@item C (Article)
12290@kindex C (Article)
12291Prompt for a charset, and then view the @acronym{MIME} object using this
12292charset (@code{gnus-mime-view-part-as-charset}).
12293
12294@findex gnus-mime-save-part
12295@item o (Article)
12296@kindex o (Article)
12297Prompt for a file name, and then save the @acronym{MIME} object
12298(@code{gnus-mime-save-part}).
12299
12300@findex gnus-mime-save-part-and-strip
12301@item C-o (Article)
12302@kindex C-o (Article)
12303Prompt for a file name, then save the @acronym{MIME} object and strip it from
12304the article. Then proceed to article editing, where a reasonable
12305suggestion is being made on how the altered article should look
12306like. The stripped @acronym{MIME} object will be referred via the
12307message/external-body @acronym{MIME} type.
12308(@code{gnus-mime-save-part-and-strip}).
12309
01c52d31
MB
12310@findex gnus-mime-replace-part
12311@item r (Article)
12312@kindex r (Article)
12313Prompt for a file name, replace the @acronym{MIME} object with an
12314external body refering to the file via the message/external-body
12315@acronym{MIME} type. (@code{gnus-mime-replace-part}).
12316
4009494e
GM
12317@findex gnus-mime-delete-part
12318@item d (Article)
12319@kindex d (Article)
12320Delete the @acronym{MIME} object from the article and replace it with some
12321information about the removed @acronym{MIME} object
12322(@code{gnus-mime-delete-part}).
12323
01c52d31
MB
12324@c FIXME: gnus-auto-select-part should be documented here
12325
4009494e
GM
12326@findex gnus-mime-copy-part
12327@item c (Article)
12328@kindex c (Article)
12329Copy the @acronym{MIME} object to a fresh buffer and display this buffer
01c52d31
MB
12330(@code{gnus-mime-copy-part}). If given a prefix, copy the raw contents
12331without decoding. If given a numerical prefix, you can do semi-manual
12332charset stuff (see @code{gnus-summary-show-article-charset-alist} in
12333@ref{Paging the Article}). Compressed files like @file{.gz} and
4009494e
GM
12334@file{.bz2} are automatically decompressed if
12335@code{auto-compression-mode} is enabled (@pxref{Compressed Files,,
12336Accessing Compressed Files, emacs, The Emacs Editor}).
12337
12338@findex gnus-mime-print-part
12339@item p (Article)
12340@kindex p (Article)
12341Print the @acronym{MIME} object (@code{gnus-mime-print-part}). This
12342command respects the @samp{print=} specifications in the
12343@file{.mailcap} file.
12344
12345@findex gnus-mime-inline-part
12346@item i (Article)
12347@kindex i (Article)
12348Insert the contents of the @acronym{MIME} object into the buffer
9b3ebcb6 12349(@code{gnus-mime-inline-part}) as @samp{text/plain}. If given a prefix, insert
4009494e
GM
12350the raw contents without decoding. If given a numerical prefix, you can
12351do semi-manual charset stuff (see
12352@code{gnus-summary-show-article-charset-alist} in @ref{Paging the
01c52d31
MB
12353Article}). Compressed files like @file{.gz} and @file{.bz2} are
12354automatically decompressed depending on @code{jka-compr} regardless of
12355@code{auto-compression-mode} (@pxref{Compressed Files,, Accessing
12356Compressed Files, emacs, The Emacs Editor}).
4009494e
GM
12357
12358@findex gnus-mime-view-part-internally
12359@item E (Article)
12360@kindex E (Article)
12361View the @acronym{MIME} object with an internal viewer. If no internal
12362viewer is available, use an external viewer
12363(@code{gnus-mime-view-part-internally}).
12364
12365@findex gnus-mime-view-part-externally
12366@item e (Article)
12367@kindex e (Article)
12368View the @acronym{MIME} object with an external viewer.
12369(@code{gnus-mime-view-part-externally}).
12370
12371@findex gnus-mime-pipe-part
12372@item | (Article)
12373@kindex | (Article)
12374Output the @acronym{MIME} object to a process (@code{gnus-mime-pipe-part}).
12375
12376@findex gnus-mime-action-on-part
12377@item . (Article)
12378@kindex . (Article)
12379Interactively run an action on the @acronym{MIME} object
12380(@code{gnus-mime-action-on-part}).
12381
12382@end table
12383
12384Gnus will display some @acronym{MIME} objects automatically. The way Gnus
12385determines which parts to do this with is described in the Emacs
12386@acronym{MIME} manual.
12387
12388It might be best to just use the toggling functions from the article
12389buffer to avoid getting nasty surprises. (For instance, you enter the
12390group @samp{alt.sing-a-long} and, before you know it, @acronym{MIME} has
12391decoded the sound file in the article and some horrible sing-a-long song
12392comes screaming out your speakers, and you can't find the volume button,
12393because there isn't one, and people are starting to look at you, and you
12394try to stop the program, but you can't, and you can't find the program
12395to control the volume, and everybody else in the room suddenly decides
12396to look at you disdainfully, and you'll feel rather stupid.)
12397
12398Any similarity to real events and people is purely coincidental. Ahem.
12399
12400Also @pxref{MIME Commands}.
12401
12402
12403@node Customizing Articles
12404@section Customizing Articles
12405@cindex article customization
12406
12407A slew of functions for customizing how the articles are to look like
12408exist. You can call these functions interactively
12409(@pxref{Article Washing}), or you can have them
12410called automatically when you select the articles.
12411
12412To have them called automatically, you should set the corresponding
12413``treatment'' variable. For instance, to have headers hidden, you'd set
12414@code{gnus-treat-hide-headers}. Below is a list of variables that can
12415be set, but first we discuss the values these variables can have.
12416
12417Note: Some values, while valid, make little sense. Check the list below
12418for sensible values.
12419
12420@enumerate
12421@item
12422@code{nil}: Don't do this treatment.
12423
12424@item
12425@code{t}: Do this treatment on all body parts.
12426
12427@item
12428@code{head}: Do the treatment on the headers.
12429
12430@item
01c52d31
MB
12431@code{first}: Do this treatment on the first body part.
12432
12433@item
12434@code{last}: Do this treatment on the last body part.
4009494e
GM
12435
12436@item
12437An integer: Do this treatment on all body parts that have a length less
12438than this number.
12439
12440@item
12441A list of strings: Do this treatment on all body parts that are in
12442articles that are read in groups that have names that match one of the
12443regexps in the list.
12444
12445@item
12446A list where the first element is not a string:
12447
12448The list is evaluated recursively. The first element of the list is a
12449predicate. The following predicates are recognized: @code{or},
12450@code{and}, @code{not} and @code{typep}. Here's an example:
12451
12452@lisp
12453(or last
12454 (typep "text/x-vcard"))
12455@end lisp
12456
12457@end enumerate
12458
12459You may have noticed that the word @dfn{part} is used here. This refers
12460to the fact that some messages are @acronym{MIME} multipart articles that may
12461be divided into several parts. Articles that are not multiparts are
12462considered to contain just a single part.
12463
12464@vindex gnus-article-treat-types
12465Are the treatments applied to all sorts of multipart parts? Yes, if you
12466want to, but by default, only @samp{text/plain} parts are given the
12467treatment. This is controlled by the @code{gnus-article-treat-types}
12468variable, which is a list of regular expressions that are matched to the
12469type of the part. This variable is ignored if the value of the
12470controlling variable is a predicate list, as described above.
12471
12472@ifinfo
12473@c Avoid sort of redundant entries in the same section for the printed
12474@c manual, but add them in info to allow `i gnus-treat-foo-bar RET' or
12475@c `i foo-bar'.
12476@vindex gnus-treat-buttonize
12477@vindex gnus-treat-buttonize-head
12478@vindex gnus-treat-capitalize-sentences
12479@vindex gnus-treat-overstrike
12480@vindex gnus-treat-strip-cr
12481@vindex gnus-treat-strip-headers-in-body
12482@vindex gnus-treat-strip-leading-blank-lines
12483@vindex gnus-treat-strip-multiple-blank-lines
12484@vindex gnus-treat-strip-pem
12485@vindex gnus-treat-strip-trailing-blank-lines
12486@vindex gnus-treat-unsplit-urls
12487@vindex gnus-treat-wash-html
12488@vindex gnus-treat-date-english
12489@vindex gnus-treat-date-iso8601
12490@vindex gnus-treat-date-lapsed
12491@vindex gnus-treat-date-local
12492@vindex gnus-treat-date-original
12493@vindex gnus-treat-date-user-defined
12494@vindex gnus-treat-date-ut
12495@vindex gnus-treat-from-picon
12496@vindex gnus-treat-mail-picon
12497@vindex gnus-treat-newsgroups-picon
12498@vindex gnus-treat-display-smileys
12499@vindex gnus-treat-body-boundary
12500@vindex gnus-treat-display-x-face
12501@vindex gnus-treat-display-face
12502@vindex gnus-treat-emphasize
12503@vindex gnus-treat-fill-article
12504@vindex gnus-treat-fill-long-lines
12505@vindex gnus-treat-hide-boring-headers
12506@vindex gnus-treat-hide-citation
12507@vindex gnus-treat-hide-citation-maybe
12508@vindex gnus-treat-hide-headers
12509@vindex gnus-treat-hide-signature
12510@vindex gnus-treat-strip-banner
12511@vindex gnus-treat-strip-list-identifiers
12512@vindex gnus-treat-highlight-citation
12513@vindex gnus-treat-highlight-headers
12514@vindex gnus-treat-highlight-signature
12515@vindex gnus-treat-play-sounds
12516@vindex gnus-treat-translate
12517@vindex gnus-treat-x-pgp-sig
12518@vindex gnus-treat-unfold-headers
12519@vindex gnus-treat-fold-headers
12520@vindex gnus-treat-fold-newsgroups
12521@vindex gnus-treat-leading-whitespace
12522@end ifinfo
12523
12524The following treatment options are available. The easiest way to
12525customize this is to examine the @code{gnus-article-treat} customization
12526group. Values in parenthesis are suggested sensible values. Others are
12527possible but those listed are probably sufficient for most people.
12528
12529@table @code
12530@item gnus-treat-buttonize (t, integer)
12531@item gnus-treat-buttonize-head (head)
12532
12533@xref{Article Buttons}.
12534
12535@item gnus-treat-capitalize-sentences (t, integer)
12536@item gnus-treat-overstrike (t, integer)
12537@item gnus-treat-strip-cr (t, integer)
12538@item gnus-treat-strip-headers-in-body (t, integer)
01c52d31 12539@item gnus-treat-strip-leading-blank-lines (t, first, integer)
4009494e
GM
12540@item gnus-treat-strip-multiple-blank-lines (t, integer)
12541@item gnus-treat-strip-pem (t, last, integer)
12542@item gnus-treat-strip-trailing-blank-lines (t, last, integer)
12543@item gnus-treat-unsplit-urls (t, integer)
12544@item gnus-treat-wash-html (t, integer)
12545
12546@xref{Article Washing}.
12547
12548@item gnus-treat-date-english (head)
12549@item gnus-treat-date-iso8601 (head)
12550@item gnus-treat-date-lapsed (head)
12551@item gnus-treat-date-local (head)
12552@item gnus-treat-date-original (head)
12553@item gnus-treat-date-user-defined (head)
12554@item gnus-treat-date-ut (head)
12555
12556@xref{Article Date}.
12557
12558@item gnus-treat-from-picon (head)
12559@item gnus-treat-mail-picon (head)
12560@item gnus-treat-newsgroups-picon (head)
12561
12562@xref{Picons}.
12563
12564@item gnus-treat-display-smileys (t, integer)
12565
12566@item gnus-treat-body-boundary (head)
12567
12568@vindex gnus-body-boundary-delimiter
12569Adds a delimiter between header and body, the string used as delimiter
12570is controlled by @code{gnus-body-boundary-delimiter}.
12571
12572@xref{Smileys}.
12573
12574@vindex gnus-treat-display-x-face
12575@item gnus-treat-display-x-face (head)
12576
12577@xref{X-Face}.
12578
12579@vindex gnus-treat-display-face
12580@item gnus-treat-display-face (head)
12581
12582@xref{Face}.
12583
12584@vindex gnus-treat-emphasize
12585@item gnus-treat-emphasize (t, head, integer)
12586@vindex gnus-treat-fill-article
12587@item gnus-treat-fill-article (t, integer)
12588@vindex gnus-treat-fill-long-lines
12589@item gnus-treat-fill-long-lines (t, integer)
12590@vindex gnus-treat-hide-boring-headers
12591@item gnus-treat-hide-boring-headers (head)
12592@vindex gnus-treat-hide-citation
12593@item gnus-treat-hide-citation (t, integer)
12594@vindex gnus-treat-hide-citation-maybe
12595@item gnus-treat-hide-citation-maybe (t, integer)
12596@vindex gnus-treat-hide-headers
12597@item gnus-treat-hide-headers (head)
12598@vindex gnus-treat-hide-signature
12599@item gnus-treat-hide-signature (t, last)
12600@vindex gnus-treat-strip-banner
12601@item gnus-treat-strip-banner (t, last)
12602@vindex gnus-treat-strip-list-identifiers
12603@item gnus-treat-strip-list-identifiers (head)
12604
12605@xref{Article Hiding}.
12606
12607@vindex gnus-treat-highlight-citation
12608@item gnus-treat-highlight-citation (t, integer)
12609@vindex gnus-treat-highlight-headers
12610@item gnus-treat-highlight-headers (head)
12611@vindex gnus-treat-highlight-signature
12612@item gnus-treat-highlight-signature (t, last, integer)
12613
12614@xref{Article Highlighting}.
12615
12616@vindex gnus-treat-play-sounds
12617@item gnus-treat-play-sounds
12618@vindex gnus-treat-translate
12619@item gnus-treat-translate
01c52d31 12620@item gnus-treat-ansi-sequences (t)
4009494e
GM
12621@vindex gnus-treat-x-pgp-sig
12622@item gnus-treat-x-pgp-sig (head)
12623
12624@vindex gnus-treat-unfold-headers
12625@item gnus-treat-unfold-headers (head)
12626@vindex gnus-treat-fold-headers
12627@item gnus-treat-fold-headers (head)
12628@vindex gnus-treat-fold-newsgroups
12629@item gnus-treat-fold-newsgroups (head)
12630@vindex gnus-treat-leading-whitespace
12631@item gnus-treat-leading-whitespace (head)
12632
12633@xref{Article Header}.
12634
12635
12636@end table
12637
12638@vindex gnus-part-display-hook
12639You can, of course, write your own functions to be called from
12640@code{gnus-part-display-hook}. The functions are called narrowed to the
12641part, and you can do anything you like, pretty much. There is no
12642information that you have to keep in the buffer---you can change
12643everything.
12644
12645
12646@node Article Keymap
12647@section Article Keymap
12648
12649Most of the keystrokes in the summary buffer can also be used in the
12650article buffer. They should behave as if you typed them in the summary
12651buffer, which means that you don't actually have to have a summary
12652buffer displayed while reading. You can do it all from the article
12653buffer.
12654
12655@kindex v (Article)
12656@cindex keys, reserved for users (Article)
12657The key @kbd{v} is reserved for users. You can bind it to some
12658command or better use it as a prefix key.
12659
12660A few additional keystrokes are available:
12661
12662@table @kbd
12663
12664@item SPACE
12665@kindex SPACE (Article)
12666@findex gnus-article-next-page
12667Scroll forwards one page (@code{gnus-article-next-page}).
12668This is exactly the same as @kbd{h SPACE h}.
12669
12670@item DEL
12671@kindex DEL (Article)
12672@findex gnus-article-prev-page
12673Scroll backwards one page (@code{gnus-article-prev-page}).
12674This is exactly the same as @kbd{h DEL h}.
12675
12676@item C-c ^
12677@kindex C-c ^ (Article)
12678@findex gnus-article-refer-article
12679If point is in the neighborhood of a @code{Message-ID} and you press
12680@kbd{C-c ^}, Gnus will try to get that article from the server
12681(@code{gnus-article-refer-article}).
12682
12683@item C-c C-m
12684@kindex C-c C-m (Article)
12685@findex gnus-article-mail
12686Send a reply to the address near point (@code{gnus-article-mail}). If
12687given a prefix, include the mail.
12688
12689@item s
12690@kindex s (Article)
12691@findex gnus-article-show-summary
12692Reconfigure the buffers so that the summary buffer becomes visible
12693(@code{gnus-article-show-summary}).
12694
12695@item ?
12696@kindex ? (Article)
12697@findex gnus-article-describe-briefly
12698Give a very brief description of the available keystrokes
12699(@code{gnus-article-describe-briefly}).
12700
12701@item TAB
12702@kindex TAB (Article)
12703@findex gnus-article-next-button
12704Go to the next button, if any (@code{gnus-article-next-button}). This
12705only makes sense if you have buttonizing turned on.
12706
12707@item M-TAB
12708@kindex M-TAB (Article)
12709@findex gnus-article-prev-button
12710Go to the previous button, if any (@code{gnus-article-prev-button}).
12711
12712@item R
12713@kindex R (Article)
12714@findex gnus-article-reply-with-original
12715Send a reply to the current article and yank the current article
95838435
MB
12716(@code{gnus-article-reply-with-original}). If the region is active,
12717only yank the text in the region.
12718
12719@item S W
12720@kindex S W (Article)
12721@findex gnus-article-wide-reply-with-original
12722Send a wide reply to the current article and yank the current article
12723(@code{gnus-article-wide-reply-with-original}). If the region is
12724active, only yank the text in the region.
4009494e
GM
12725
12726@item F
12727@kindex F (Article)
12728@findex gnus-article-followup-with-original
12729Send a followup to the current article and yank the current article
95838435
MB
12730(@code{gnus-article-followup-with-original}). If the region is active,
12731only yank the text in the region.
4009494e
GM
12732
12733
12734@end table
12735
12736
12737@node Misc Article
12738@section Misc Article
12739
12740@table @code
12741
12742@item gnus-single-article-buffer
12743@vindex gnus-single-article-buffer
12744@cindex article buffers, several
12745If non-@code{nil}, use the same article buffer for all the groups.
12746(This is the default.) If @code{nil}, each group will have its own
12747article buffer.
12748
12749@vindex gnus-article-decode-hook
12750@item gnus-article-decode-hook
12751@cindex @acronym{MIME}
12752Hook used to decode @acronym{MIME} articles. The default value is
12753@code{(article-decode-charset article-decode-encoded-words)}
12754
12755@vindex gnus-article-prepare-hook
12756@item gnus-article-prepare-hook
12757This hook is called right after the article has been inserted into the
12758article buffer. It is mainly intended for functions that do something
12759depending on the contents; it should probably not be used for changing
12760the contents of the article buffer.
12761
12762@item gnus-article-mode-hook
12763@vindex gnus-article-mode-hook
12764Hook called in article mode buffers.
12765
12766@item gnus-article-mode-syntax-table
12767@vindex gnus-article-mode-syntax-table
12768Syntax table used in article buffers. It is initialized from
12769@code{text-mode-syntax-table}.
12770
12771@vindex gnus-article-over-scroll
12772@item gnus-article-over-scroll
12773If non-@code{nil}, allow scrolling the article buffer even when there
12774no more new text to scroll in. The default is @code{nil}.
12775
12776@vindex gnus-article-mode-line-format
12777@item gnus-article-mode-line-format
12778This variable is a format string along the same lines as
12779@code{gnus-summary-mode-line-format} (@pxref{Summary Buffer Mode
12780Line}). It accepts the same format specifications as that variable,
12781with two extensions:
12782
12783@table @samp
12784
12785@item w
12786The @dfn{wash status} of the article. This is a short string with one
12787character for each possible article wash operation that may have been
12788performed. The characters and their meaning:
12789
12790@table @samp
12791
12792@item c
12793Displayed when cited text may be hidden in the article buffer.
12794
12795@item h
12796Displayed when headers are hidden in the article buffer.
12797
12798@item p
12799Displayed when article is digitally signed or encrypted, and Gnus has
12800hidden the security headers. (N.B. does not tell anything about
12801security status, i.e. good or bad signature.)
12802
12803@item s
12804Displayed when the signature has been hidden in the Article buffer.
12805
12806@item o
12807Displayed when Gnus has treated overstrike characters in the article buffer.
12808
12809@item e
6772c8e1 12810Displayed when Gnus has treated emphasized strings in the article buffer.
4009494e
GM
12811
12812@end table
12813
12814@item m
12815The number of @acronym{MIME} parts in the article.
12816
12817@end table
12818
12819@vindex gnus-break-pages
12820
12821@item gnus-break-pages
12822Controls whether @dfn{page breaking} is to take place. If this variable
12823is non-@code{nil}, the articles will be divided into pages whenever a
12824page delimiter appears in the article. If this variable is @code{nil},
12825paging will not be done.
12826
12827@item gnus-page-delimiter
12828@vindex gnus-page-delimiter
12829This is the delimiter mentioned above. By default, it is @samp{^L}
12830(formfeed).
12831
12832@cindex IDNA
12833@cindex internationalized domain names
12834@vindex gnus-use-idna
12835@item gnus-use-idna
12836This variable controls whether Gnus performs IDNA decoding of
12837internationalized domain names inside @samp{From}, @samp{To} and
01c52d31
MB
12838@samp{Cc} headers. @xref{IDNA, ,IDNA,message, The Message Manual},
12839for how to compose such messages. This requires
4009494e
GM
12840@uref{http://www.gnu.org/software/libidn/, GNU Libidn}, and this
12841variable is only enabled if you have installed it.
12842
12843@end table
12844
12845
12846@node Composing Messages
12847@chapter Composing Messages
12848@cindex composing messages
12849@cindex messages
12850@cindex mail
12851@cindex sending mail
12852@cindex reply
12853@cindex followup
12854@cindex post
12855@cindex using gpg
12856@cindex using s/mime
12857@cindex using smime
12858
12859@kindex C-c C-c (Post)
12860All commands for posting and mailing will put you in a message buffer
12861where you can edit the article all you like, before you send the
12862article by pressing @kbd{C-c C-c}. @xref{Top, , Overview, message,
12863Message Manual}. Where the message will be posted/mailed to depends
12864on your setup (@pxref{Posting Server}).
12865
12866@menu
12867* Mail:: Mailing and replying.
12868* Posting Server:: What server should you post and mail via?
12869* POP before SMTP:: You cannot send a mail unless you read a mail.
12870* Mail and Post:: Mailing and posting at the same time.
12871* Archived Messages:: Where Gnus stores the messages you've sent.
12872* Posting Styles:: An easier way to specify who you are.
12873* Drafts:: Postponing messages and rejected messages.
12874* Rejected Articles:: What happens if the server doesn't like your article?
12875* Signing and encrypting:: How to compose secure messages.
12876@end menu
12877
12878Also @pxref{Canceling and Superseding} for information on how to
12879remove articles you shouldn't have posted.
12880
12881
12882@node Mail
12883@section Mail
12884
12885Variables for customizing outgoing mail:
12886
12887@table @code
12888@item gnus-uu-digest-headers
12889@vindex gnus-uu-digest-headers
12890List of regexps to match headers included in digested messages. The
12891headers will be included in the sequence they are matched. If
12892@code{nil} include all headers.
12893
12894@item gnus-add-to-list
12895@vindex gnus-add-to-list
12896If non-@code{nil}, add a @code{to-list} group parameter to mail groups
12897that have none when you do a @kbd{a}.
12898
12899@item gnus-confirm-mail-reply-to-news
12900@vindex gnus-confirm-mail-reply-to-news
12901If non-@code{nil}, Gnus will ask you for a confirmation when you are
12902about to reply to news articles by mail. If it is @code{nil}, nothing
12903interferes in what you want to do. This can also be a function
12904receiving the group name as the only parameter which should return
12905non-@code{nil} if a confirmation is needed, or a regular expression
12906matching group names, where confirmation should be asked for.
12907
12908If you find yourself never wanting to reply to mail, but occasionally
12909press @kbd{R} anyway, this variable might be for you.
12910
12911@item gnus-confirm-treat-mail-like-news
12912@vindex gnus-confirm-treat-mail-like-news
12913If non-@code{nil}, Gnus also requests confirmation according to
12914@code{gnus-confirm-mail-reply-to-news} when replying to mail. This is
12915useful for treating mailing lists like newsgroups.
12916
12917@end table
12918
12919
12920@node Posting Server
12921@section Posting Server
12922
12923When you press those magical @kbd{C-c C-c} keys to ship off your latest
12924(extremely intelligent, of course) article, where does it go?
12925
12926Thank you for asking. I hate you.
12927
12928It can be quite complicated.
12929
12930@vindex gnus-post-method
12931When posting news, Message usually invokes @code{message-send-news}
12932(@pxref{News Variables, , News Variables, message, Message Manual}).
12933Normally, Gnus will post using the same select method as you're
12934reading from (which might be convenient if you're reading lots of
12935groups from different private servers). However. If the server
12936you're reading from doesn't allow posting, just reading, you probably
12937want to use some other server to post your (extremely intelligent and
12938fabulously interesting) articles. You can then set the
12939@code{gnus-post-method} to some other method:
12940
12941@lisp
12942(setq gnus-post-method '(nnspool ""))
12943@end lisp
12944
12945Now, if you've done this, and then this server rejects your article, or
12946this server is down, what do you do then? To override this variable you
12947can use a non-zero prefix to the @kbd{C-c C-c} command to force using
12948the ``current'' server, to get back the default behavior, for posting.
12949
12950If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command,
12951Gnus will prompt you for what method to use for posting.
12952
12953You can also set @code{gnus-post-method} to a list of select methods.
12954If that's the case, Gnus will always prompt you for what method to use
12955for posting.
12956
12957Finally, if you want to always post using the native select method,
12958you can set this variable to @code{native}.
12959
d82cf70b
MB
12960@vindex message-send-mail-function
12961When sending mail, Message invokes the function specified by the
12962variable @code{message-send-mail-function}. Gnus tries to set it to a
12963value suitable for your system.
12964@xref{Mail Variables, ,Mail Variables,message,Message manual}, for more
12965information.
4009494e
GM
12966
12967@node POP before SMTP
12968@section POP before SMTP
12969@cindex pop before smtp
12970@findex message-smtpmail-send-it
12971@findex mail-source-touch-pop
12972
12973Does your @acronym{ISP} require the @acronym{POP}-before-@acronym{SMTP}
12974authentication? It is whether you need to connect to the @acronym{POP}
12975mail server within a certain time before sending mails. If so, there is
12976a convenient way. To do that, put the following lines in your
12977@file{~/.gnus.el} file:
12978
12979@lisp
12980(setq message-send-mail-function 'message-smtpmail-send-it)
12981(add-hook 'message-send-mail-hook 'mail-source-touch-pop)
12982@end lisp
12983
12984@noindent
12985It means to let Gnus connect to the @acronym{POP} mail server in advance
12986whenever you send a mail. The @code{mail-source-touch-pop} function
12987does only a @acronym{POP} authentication according to the value of
12988@code{mail-sources} without fetching mails, just before sending a mail.
12989Note that you have to use @code{message-smtpmail-send-it} which runs
12990@code{message-send-mail-hook} rather than @code{smtpmail-send-it} and
12991set the value of @code{mail-sources} for a @acronym{POP} connection
12992correctly. @xref{Mail Sources}.
12993
12994If you have two or more @acronym{POP} mail servers set in
12995@code{mail-sources}, you may want to specify one of them to
12996@code{mail-source-primary-source} as the @acronym{POP} mail server to be
12997used for the @acronym{POP}-before-@acronym{SMTP} authentication. If it
12998is your primary @acronym{POP} mail server (i.e., you are fetching mails
12999mainly from that server), you can set it permanently as follows:
13000
13001@lisp
13002(setq mail-source-primary-source
13003 '(pop :server "pop3.mail.server"
13004 :password "secret"))
13005@end lisp
13006
13007@noindent
13008Otherwise, bind it dynamically only when performing the
13009@acronym{POP}-before-@acronym{SMTP} authentication as follows:
13010
13011@lisp
13012(add-hook 'message-send-mail-hook
13013 (lambda ()
13014 (let ((mail-source-primary-source
13015 '(pop :server "pop3.mail.server"
13016 :password "secret")))
13017 (mail-source-touch-pop))))
13018@end lisp
13019
13020@node Mail and Post
13021@section Mail and Post
13022
13023Here's a list of variables relevant to both mailing and
13024posting:
13025
13026@table @code
13027@item gnus-mailing-list-groups
13028@findex gnus-mailing-list-groups
13029@cindex mailing lists
13030
13031If your news server offers groups that are really mailing lists
13032gatewayed to the @acronym{NNTP} server, you can read those groups without
13033problems, but you can't post/followup to them without some difficulty.
13034One solution is to add a @code{to-address} to the group parameters
13035(@pxref{Group Parameters}). An easier thing to do is set the
13036@code{gnus-mailing-list-groups} to a regexp that matches the groups that
13037really are mailing lists. Then, at least, followups to the mailing
13038lists will work most of the time. Posting to these groups (@kbd{a}) is
13039still a pain, though.
13040
13041@item gnus-user-agent
13042@vindex gnus-user-agent
13043@cindex User-Agent
13044
13045This variable controls which information should be exposed in the
13046User-Agent header. It can be a list of symbols or a string. Valid
13047symbols are @code{gnus} (show Gnus version) and @code{emacs} (show Emacs
13048version). In addition to the Emacs version, you can add @code{codename}
13049(show (S)XEmacs codename) or either @code{config} (show system
13050configuration) or @code{type} (show system type). If you set it to a
13051string, be sure to use a valid format, see RFC 2616.
13052
13053@end table
13054
13055You may want to do spell-checking on messages that you send out. Or, if
13056you don't want to spell-check by hand, you could add automatic
13057spell-checking via the @code{ispell} package:
13058
13059@cindex ispell
13060@findex ispell-message
13061@lisp
13062(add-hook 'message-send-hook 'ispell-message)
13063@end lisp
13064
13065If you want to change the @code{ispell} dictionary based on what group
13066you're in, you could say something like the following:
13067
13068@lisp
13069(add-hook 'gnus-select-group-hook
13070 (lambda ()
13071 (cond
13072 ((string-match
13073 "^de\\." (gnus-group-real-name gnus-newsgroup-name))
13074 (ispell-change-dictionary "deutsch"))
13075 (t
13076 (ispell-change-dictionary "english")))))
13077@end lisp
13078
13079Modify to suit your needs.
13080
01c52d31
MB
13081@vindex gnus-message-highlight-citation
13082If @code{gnus-message-highlight-citation} is t, different levels of
13083citations are highlighted like in Gnus article buffers also in message
13084mode buffers.
4009494e
GM
13085
13086@node Archived Messages
13087@section Archived Messages
13088@cindex archived messages
13089@cindex sent messages
13090
13091Gnus provides a few different methods for storing the mail and news you
13092send. The default method is to use the @dfn{archive virtual server} to
13093store the messages. If you want to disable this completely, the
13094@code{gnus-message-archive-group} variable should be @code{nil}, which
13095is the default.
13096
13097For archiving interesting messages in a group you read, see the
13098@kbd{B c} (@code{gnus-summary-copy-article}) command (@pxref{Mail
13099Group Commands}).
13100
13101@vindex gnus-message-archive-method
13102@code{gnus-message-archive-method} says what virtual server Gnus is to
01c52d31
MB
13103use to store sent messages. The default is @code{"archive"}, and when
13104actually being used it is expanded into:
4009494e
GM
13105
13106@lisp
13107(nnfolder "archive"
13108 (nnfolder-directory "~/Mail/archive")
13109 (nnfolder-active-file "~/Mail/archive/active")
13110 (nnfolder-get-new-mail nil)
13111 (nnfolder-inhibit-expiry t))
13112@end lisp
13113
01c52d31
MB
13114@quotation
13115@vindex gnus-update-message-archive-method
13116Note: a server like this is saved in the @file{~/.newsrc.eld} file first
13117so that it may be used as a real method of the server which is named
13118@code{"archive"} (that is, for the case where
13119@code{gnus-message-archive-method} is set to @code{"archive"}) ever
13120since. If it once has been saved, it will never be updated by default
13121even if you change the value of @code{gnus-message-archive-method}
13122afterward. Therefore, the server @code{"archive"} doesn't necessarily
13123mean the @code{nnfolder} server like this at all times. If you want the
13124saved method to reflect always the value of
13125@code{gnus-message-archive-method}, set the
13126@code{gnus-update-message-archive-method} variable to a non-@code{nil}
13127value. The default value of this variable is @code{nil}.
13128@end quotation
13129
4009494e
GM
13130You can, however, use any mail select method (@code{nnml},
13131@code{nnmbox}, etc.). @code{nnfolder} is a quite likable select method
13132for doing this sort of thing, though. If you don't like the default
13133directory chosen, you could say something like:
13134
13135@lisp
13136(setq gnus-message-archive-method
13137 '(nnfolder "archive"
13138 (nnfolder-inhibit-expiry t)
13139 (nnfolder-active-file "~/News/sent-mail/active")
13140 (nnfolder-directory "~/News/sent-mail/")))
13141@end lisp
13142
13143@vindex gnus-message-archive-group
13144@cindex Gcc
13145Gnus will insert @code{Gcc} headers in all outgoing messages that point
13146to one or more group(s) on that server. Which group to use is
13147determined by the @code{gnus-message-archive-group} variable.
13148
13149This variable can be used to do the following:
13150
13151@table @asis
13152@item a string
13153Messages will be saved in that group.
13154
13155Note that you can include a select method in the group name, then the
13156message will not be stored in the select method given by
13157@code{gnus-message-archive-method}, but in the select method specified
13158by the group name, instead. Suppose @code{gnus-message-archive-method}
13159has the default value shown above. Then setting
13160@code{gnus-message-archive-group} to @code{"foo"} means that outgoing
13161messages are stored in @samp{nnfolder+archive:foo}, but if you use the
13162value @code{"nnml:foo"}, then outgoing messages will be stored in
13163@samp{nnml:foo}.
13164
13165@item a list of strings
13166Messages will be saved in all those groups.
13167
13168@item an alist of regexps, functions and forms
13169When a key ``matches'', the result is used.
13170
13171@item @code{nil}
13172No message archiving will take place. This is the default.
13173@end table
13174
13175Let's illustrate:
13176
13177Just saving to a single group called @samp{MisK}:
13178@lisp
13179(setq gnus-message-archive-group "MisK")
13180@end lisp
13181
13182Saving to two groups, @samp{MisK} and @samp{safe}:
13183@lisp
13184(setq gnus-message-archive-group '("MisK" "safe"))
13185@end lisp
13186
13187Save to different groups based on what group you are in:
13188@lisp
13189(setq gnus-message-archive-group
13190 '(("^alt" "sent-to-alt")
13191 ("mail" "sent-to-mail")
13192 (".*" "sent-to-misc")))
13193@end lisp
13194
13195More complex stuff:
13196@lisp
13197(setq gnus-message-archive-group
13198 '((if (message-news-p)
13199 "misc-news"
13200 "misc-mail")))
13201@end lisp
13202
13203How about storing all news messages in one file, but storing all mail
13204messages in one file per month:
13205
13206@lisp
13207(setq gnus-message-archive-group
13208 '((if (message-news-p)
13209 "misc-news"
13210 (concat "mail." (format-time-string "%Y-%m")))))
13211@end lisp
13212
13213@c (XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to
13214@c use a different value for @code{gnus-message-archive-group} there.)
13215
13216Now, when you send a message off, it will be stored in the appropriate
13217group. (If you want to disable storing for just one particular message,
13218you can just remove the @code{Gcc} header that has been inserted.) The
13219archive group will appear in the group buffer the next time you start
13220Gnus, or the next time you press @kbd{F} in the group buffer. You can
13221enter it and read the articles in it just like you'd read any other
13222group. If the group gets really big and annoying, you can simply rename
13223if (using @kbd{G r} in the group buffer) to something
13224nice---@samp{misc-mail-september-1995}, or whatever. New messages will
13225continue to be stored in the old (now empty) group.
13226
13227That's the default method of archiving sent messages. Gnus offers a
13228different way for the people who don't like the default method. In that
13229case you should set @code{gnus-message-archive-group} to @code{nil};
13230this will disable archiving.
13231
13232@table @code
13233@item gnus-outgoing-message-group
13234@vindex gnus-outgoing-message-group
13235All outgoing messages will be put in this group. If you want to store
13236all your outgoing mail and articles in the group @samp{nnml:archive},
13237you set this variable to that value. This variable can also be a list of
13238group names.
13239
13240If you want to have greater control over what group to put each
13241message in, you can set this variable to a function that checks the
13242current newsgroup name and then returns a suitable group name (or list
13243of names).
13244
13245This variable can be used instead of @code{gnus-message-archive-group},
13246but the latter is the preferred method.
13247
13248@item gnus-gcc-mark-as-read
13249@vindex gnus-gcc-mark-as-read
13250If non-@code{nil}, automatically mark @code{Gcc} articles as read.
13251
13252@item gnus-gcc-externalize-attachments
13253@vindex gnus-gcc-externalize-attachments
13254If @code{nil}, attach files as normal parts in Gcc copies; if a regexp
13255and matches the Gcc group name, attach files as external parts; if it is
13256@code{all}, attach local files as external parts; if it is other
13257non-@code{nil}, the behavior is the same as @code{all}, but it may be
13258changed in the future.
13259
13260@end table
13261
13262
13263@node Posting Styles
13264@section Posting Styles
13265@cindex posting styles
13266@cindex styles
13267
13268All them variables, they make my head swim.
13269
13270So what if you want a different @code{Organization} and signature based
13271on what groups you post to? And you post both from your home machine
13272and your work machine, and you want different @code{From} lines, and so
13273on?
13274
13275@vindex gnus-posting-styles
13276One way to do stuff like that is to write clever hooks that change the
13277variables you need to have changed. That's a bit boring, so somebody
13278came up with the bright idea of letting the user specify these things in
13279a handy alist. Here's an example of a @code{gnus-posting-styles}
13280variable:
13281
13282@lisp
13283((".*"
13284 (signature "Peace and happiness")
13285 (organization "What me?"))
13286 ("^comp"
13287 (signature "Death to everybody"))
13288 ("comp.emacs.i-love-it"
13289 (organization "Emacs is it")))
13290@end lisp
13291
13292As you might surmise from this example, this alist consists of several
13293@dfn{styles}. Each style will be applicable if the first element
13294``matches'', in some form or other. The entire alist will be iterated
13295over, from the beginning towards the end, and each match will be
13296applied, which means that attributes in later styles that match override
13297the same attributes in earlier matching styles. So
13298@samp{comp.programming.literate} will have the @samp{Death to everybody}
13299signature and the @samp{What me?} @code{Organization} header.
13300
13301The first element in each style is called the @code{match}. If it's a
13302string, then Gnus will try to regexp match it against the group name.
13303If it is the form @code{(header @var{match} @var{regexp})}, then Gnus
13304will look in the original article for a header whose name is
13305@var{match} and compare that @var{regexp}. @var{match} and
13306@var{regexp} are strings. (The original article is the one you are
13307replying or following up to. If you are not composing a reply or a
13308followup, then there is nothing to match against.) If the
13309@code{match} is a function symbol, that function will be called with
13310no arguments. If it's a variable symbol, then the variable will be
13311referenced. If it's a list, then that list will be @code{eval}ed. In
13312any case, if this returns a non-@code{nil} value, then the style is
13313said to @dfn{match}.
13314
13315Each style may contain an arbitrary amount of @dfn{attributes}. Each
13316attribute consists of a @code{(@var{name} @var{value})} pair. In
13317addition, you can also use the @code{(@var{name} :file @var{value})}
13318form or the @code{(@var{name} :value @var{value})} form. Where
13319@code{:file} signifies @var{value} represents a file name and its
13320contents should be used as the attribute value, @code{:value} signifies
13321@var{value} does not represent a file name explicitly. The attribute
13322name can be one of:
13323
13324@itemize @bullet
13325@item @code{signature}
13326@item @code{signature-file}
13327@item @code{x-face-file}
13328@item @code{address}, overriding @code{user-mail-address}
13329@item @code{name}, overriding @code{(user-full-name)}
13330@item @code{body}
13331@end itemize
13332
01c52d31
MB
13333Note that the @code{signature-file} attribute honors the variable
13334@code{message-signature-directory}.
13335
4009494e
GM
13336The attribute name can also be a string or a symbol. In that case,
13337this will be used as a header name, and the value will be inserted in
13338the headers of the article; if the value is @code{nil}, the header
13339name will be removed. If the attribute name is @code{eval}, the form
13340is evaluated, and the result is thrown away.
13341
13342The attribute value can be a string (used verbatim), a function with
13343zero arguments (the return value will be used), a variable (its value
13344will be used) or a list (it will be @code{eval}ed and the return value
13345will be used). The functions and sexps are called/@code{eval}ed in the
13346message buffer that is being set up. The headers of the current article
13347are available through the @code{message-reply-headers} variable, which
13348is a vector of the following headers: number subject from date id
13349references chars lines xref extra.
13350
13351@vindex message-reply-headers
13352
13353If you wish to check whether the message you are about to compose is
13354meant to be a news article or a mail message, you can check the values
13355of the @code{message-news-p} and @code{message-mail-p} functions.
13356
13357@findex message-mail-p
13358@findex message-news-p
13359
13360So here's a new example:
13361
13362@lisp
13363(setq gnus-posting-styles
13364 '((".*"
13365 (signature-file "~/.signature")
13366 (name "User Name")
13367 (x-face-file "~/.xface")
13368 (x-url (getenv "WWW_HOME"))
13369 (organization "People's Front Against MWM"))
13370 ("^rec.humor"
13371 (signature my-funny-signature-randomizer))
13372 ((equal (system-name) "gnarly") ;; @r{A form}
13373 (signature my-quote-randomizer))
13374 (message-news-p ;; @r{A function symbol}
13375 (signature my-news-signature))
13376 (window-system ;; @r{A value symbol}
13377 ("X-Window-System" (format "%s" window-system)))
13378 ;; @r{If I'm replying to Larsi, set the Organization header.}
13379 ((header "from" "larsi.*org")
13380 (Organization "Somewhere, Inc."))
13381 ((posting-from-work-p) ;; @r{A user defined function}
13382 (signature-file "~/.work-signature")
13383 (address "user@@bar.foo")
13384 (body "You are fired.\n\nSincerely, your boss.")
13385 (organization "Important Work, Inc"))
13386 ("nnml:.*"
13387 (From (save-excursion
13388 (set-buffer gnus-article-buffer)
13389 (message-fetch-field "to"))))
13390 ("^nn.+:"
13391 (signature-file "~/.mail-signature"))))
13392@end lisp
13393
13394The @samp{nnml:.*} rule means that you use the @code{To} address as the
13395@code{From} address in all your outgoing replies, which might be handy
13396if you fill many roles.
13397You may also use @code{message-alternative-emails} instead.
13398@xref{Message Headers, ,Message Headers, message, Message Manual}.
13399
13400@node Drafts
13401@section Drafts
13402@cindex drafts
13403
13404If you are writing a message (mail or news) and suddenly remember that
13405you have a steak in the oven (or some pesto in the food processor, you
13406craaazy vegetarians), you'll probably wish there was a method to save
13407the message you are writing so that you can continue editing it some
13408other day, and send it when you feel its finished.
13409
13410Well, don't worry about it. Whenever you start composing a message of
13411some sort using the Gnus mail and post commands, the buffer you get will
13412automatically associate to an article in a special @dfn{draft} group.
13413If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the
13414article will be saved there. (Auto-save files also go to the draft
13415group.)
13416
13417@cindex nndraft
13418@vindex nndraft-directory
13419The draft group is a special group (which is implemented as an
13420@code{nndraft} group, if you absolutely have to know) called
13421@samp{nndraft:drafts}. The variable @code{nndraft-directory} says where
13422@code{nndraft} is to store its files. What makes this group special is
13423that you can't tick any articles in it or mark any articles as
13424read---all articles in the group are permanently unread.
13425
13426If the group doesn't exist, it will be created and you'll be subscribed
13427to it. The only way to make it disappear from the Group buffer is to
13428unsubscribe it. The special properties of the draft group comes from
13429a group property (@pxref{Group Parameters}), and if lost the group
13430behaves like any other group. This means the commands below will not
13431be available. To restore the special properties of the group, the
13432simplest way is to kill the group, using @kbd{C-k}, and restart
13433Gnus. The group is automatically created again with the
13434correct parameters. The content of the group is not lost.
13435
13436@c @findex gnus-dissociate-buffer-from-draft
13437@c @kindex C-c M-d (Mail)
13438@c @kindex C-c M-d (Post)
13439@c @findex gnus-associate-buffer-with-draft
13440@c @kindex C-c C-d (Mail)
13441@c @kindex C-c C-d (Post)
13442@c If you're writing some super-secret message that you later want to
13443@c encode with PGP before sending, you may wish to turn the auto-saving
13444@c (and association with the draft group) off. You never know who might be
13445@c interested in reading all your extremely valuable and terribly horrible
13446@c and interesting secrets. The @kbd{C-c M-d}
13447@c (@code{gnus-dissociate-buffer-from-draft}) command does that for you.
13448@c If you change your mind and want to turn the auto-saving back on again,
13449@c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that.
13450@c
13451@c @vindex gnus-use-draft
13452@c To leave association with the draft group off by default, set
13453@c @code{gnus-use-draft} to @code{nil}. It is @code{t} by default.
13454
13455@findex gnus-draft-edit-message
13456@kindex D e (Draft)
13457When you want to continue editing the article, you simply enter the
13458draft group and push @kbd{D e} (@code{gnus-draft-edit-message}) to do
13459that. You will be placed in a buffer where you left off.
13460
13461Rejected articles will also be put in this draft group (@pxref{Rejected
13462Articles}).
13463
13464@findex gnus-draft-send-all-messages
13465@kindex D s (Draft)
13466@findex gnus-draft-send-message
13467@kindex D S (Draft)
13468If you have lots of rejected messages you want to post (or mail) without
13469doing further editing, you can use the @kbd{D s} command
13470(@code{gnus-draft-send-message}). This command understands the
13471process/prefix convention (@pxref{Process/Prefix}). The @kbd{D S}
13472command (@code{gnus-draft-send-all-messages}) will ship off all messages
13473in the buffer.
13474
13475@findex gnus-draft-toggle-sending
13476@kindex D t (Draft)
13477If you have some messages that you wish not to send, you can use the
13478@kbd{D t} (@code{gnus-draft-toggle-sending}) command to mark the message
13479as unsendable. This is a toggling command.
13480
13481
13482@node Rejected Articles
13483@section Rejected Articles
13484@cindex rejected articles
13485
13486Sometimes a news server will reject an article. Perhaps the server
13487doesn't like your face. Perhaps it just feels miserable. Perhaps
13488@emph{there be demons}. Perhaps you have included too much cited text.
13489Perhaps the disk is full. Perhaps the server is down.
13490
13491These situations are, of course, totally beyond the control of Gnus.
13492(Gnus, of course, loves the way you look, always feels great, has angels
13493fluttering around inside of it, doesn't care about how much cited text
13494you include, never runs full and never goes down.) So Gnus saves these
13495articles until some later time when the server feels better.
13496
13497The rejected articles will automatically be put in a special draft group
13498(@pxref{Drafts}). When the server comes back up again, you'd then
13499typically enter that group and send all the articles off.
13500
13501@node Signing and encrypting
13502@section Signing and encrypting
13503@cindex using gpg
13504@cindex using s/mime
13505@cindex using smime
13506
13507Gnus can digitally sign and encrypt your messages, using vanilla
13508@acronym{PGP} format or @acronym{PGP/MIME} or @acronym{S/MIME}. For
13509decoding such messages, see the @code{mm-verify-option} and
13510@code{mm-decrypt-option} options (@pxref{Security}).
13511
13512@vindex gnus-message-replysign
13513@vindex gnus-message-replyencrypt
13514@vindex gnus-message-replysignencrypted
13515Often, you would like to sign replies to people who send you signed
13516messages. Even more often, you might want to encrypt messages which
13517are in reply to encrypted messages. Gnus offers
13518@code{gnus-message-replysign} to enable the former, and
13519@code{gnus-message-replyencrypt} for the latter. In addition, setting
13520@code{gnus-message-replysignencrypted} (on by default) will sign
13521automatically encrypted messages.
13522
13523Instructing @acronym{MML} to perform security operations on a
13524@acronym{MIME} part is done using the @kbd{C-c C-m s} key map for
13525signing and the @kbd{C-c C-m c} key map for encryption, as follows.
13526
13527@table @kbd
13528
13529@item C-c C-m s s
13530@kindex C-c C-m s s (Message)
13531@findex mml-secure-message-sign-smime
13532
13533Digitally sign current message using @acronym{S/MIME}.
13534
13535@item C-c C-m s o
13536@kindex C-c C-m s o (Message)
13537@findex mml-secure-message-sign-pgp
13538
13539Digitally sign current message using @acronym{PGP}.
13540
13541@item C-c C-m s p
13542@kindex C-c C-m s p (Message)
13543@findex mml-secure-message-sign-pgp
13544
13545Digitally sign current message using @acronym{PGP/MIME}.
13546
13547@item C-c C-m c s
13548@kindex C-c C-m c s (Message)
13549@findex mml-secure-message-encrypt-smime
13550
13551Digitally encrypt current message using @acronym{S/MIME}.
13552
13553@item C-c C-m c o
13554@kindex C-c C-m c o (Message)
13555@findex mml-secure-message-encrypt-pgp
13556
13557Digitally encrypt current message using @acronym{PGP}.
13558
13559@item C-c C-m c p
13560@kindex C-c C-m c p (Message)
13561@findex mml-secure-message-encrypt-pgpmime
13562
13563Digitally encrypt current message using @acronym{PGP/MIME}.
13564
13565@item C-c C-m C-n
13566@kindex C-c C-m C-n (Message)
13567@findex mml-unsecure-message
13568Remove security related @acronym{MML} tags from message.
13569
13570@end table
13571
13572@xref{Security, ,Security, message, Message Manual}, for more information.
13573
13574@node Select Methods
13575@chapter Select Methods
13576@cindex foreign groups
13577@cindex select methods
13578
13579A @dfn{foreign group} is a group not read by the usual (or
13580default) means. It could be, for instance, a group from a different
13581@acronym{NNTP} server, it could be a virtual group, or it could be your own
13582personal mail group.
13583
13584A foreign group (or any group, really) is specified by a @dfn{name} and
13585a @dfn{select method}. To take the latter first, a select method is a
13586list where the first element says what back end to use (e.g. @code{nntp},
13587@code{nnspool}, @code{nnml}) and the second element is the @dfn{server
13588name}. There may be additional elements in the select method, where the
13589value may have special meaning for the back end in question.
13590
13591One could say that a select method defines a @dfn{virtual server}---so
13592we do just that (@pxref{Server Buffer}).
13593
13594The @dfn{name} of the group is the name the back end will recognize the
13595group as.
13596
13597For instance, the group @samp{soc.motss} on the @acronym{NNTP} server
13598@samp{some.where.edu} will have the name @samp{soc.motss} and select
13599method @code{(nntp "some.where.edu")}. Gnus will call this group
13600@samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp}
13601back end just knows this group as @samp{soc.motss}.
13602
13603The different methods all have their peculiarities, of course.
13604
13605@menu
13606* Server Buffer:: Making and editing virtual servers.
13607* Getting News:: Reading USENET news with Gnus.
13608* Getting Mail:: Reading your personal mail with Gnus.
13609* Browsing the Web:: Getting messages from a plethora of Web sources.
13610* IMAP:: Using Gnus as a @acronym{IMAP} client.
13611* Other Sources:: Reading directories, files, SOUP packets.
13612* Combined Groups:: Combining groups into one group.
13613* Email Based Diary:: Using mails to manage diary events in Gnus.
13614* Gnus Unplugged:: Reading news and mail offline.
13615@end menu
13616
13617
13618@node Server Buffer
13619@section Server Buffer
13620
13621Traditionally, a @dfn{server} is a machine or a piece of software that
13622one connects to, and then requests information from. Gnus does not
13623connect directly to any real servers, but does all transactions through
13624one back end or other. But that's just putting one layer more between
13625the actual media and Gnus, so we might just as well say that each
13626back end represents a virtual server.
13627
13628For instance, the @code{nntp} back end may be used to connect to several
13629different actual @acronym{NNTP} servers, or, perhaps, to many different ports
13630on the same actual @acronym{NNTP} server. You tell Gnus which back end to
13631use, and what parameters to set by specifying a @dfn{select method}.
13632
13633These select method specifications can sometimes become quite
13634complicated---say, for instance, that you want to read from the
13635@acronym{NNTP} server @samp{news.funet.fi} on port number 13, which
13636hangs if queried for @acronym{NOV} headers and has a buggy select. Ahem.
13637Anyway, if you had to specify that for each group that used this
13638server, that would be too much work, so Gnus offers a way of naming
13639select methods, which is what you do in the server buffer.
13640
13641To enter the server buffer, use the @kbd{^}
13642(@code{gnus-group-enter-server-mode}) command in the group buffer.
13643
13644@menu
13645* Server Buffer Format:: You can customize the look of this buffer.
13646* Server Commands:: Commands to manipulate servers.
13647* Example Methods:: Examples server specifications.
13648* Creating a Virtual Server:: An example session.
13649* Server Variables:: Which variables to set.
13650* Servers and Methods:: You can use server names as select methods.
13651* Unavailable Servers:: Some servers you try to contact may be down.
13652@end menu
13653
13654@vindex gnus-server-mode-hook
13655@code{gnus-server-mode-hook} is run when creating the server buffer.
13656
13657
13658@node Server Buffer Format
13659@subsection Server Buffer Format
13660@cindex server buffer format
13661
13662@vindex gnus-server-line-format
13663You can change the look of the server buffer lines by changing the
13664@code{gnus-server-line-format} variable. This is a @code{format}-like
13665variable, with some simple extensions:
13666
13667@table @samp
13668
13669@item h
13670How the news is fetched---the back end name.
13671
13672@item n
13673The name of this server.
13674
13675@item w
13676Where the news is to be fetched from---the address.
13677
13678@item s
13679The opened/closed/denied status of the server.
13680
13681@item a
13682Whether this server is agentized.
13683@end table
13684
13685@vindex gnus-server-mode-line-format
13686The mode line can also be customized by using the
13687@code{gnus-server-mode-line-format} variable (@pxref{Mode Line
13688Formatting}). The following specs are understood:
13689
13690@table @samp
13691@item S
13692Server name.
13693
13694@item M
13695Server method.
13696@end table
13697
13698Also @pxref{Formatting Variables}.
13699
13700
13701@node Server Commands
13702@subsection Server Commands
13703@cindex server commands
13704
13705@table @kbd
13706
13707@item v
13708@kindex v (Server)
13709@cindex keys, reserved for users (Server)
13710The key @kbd{v} is reserved for users. You can bind it to some
13711command or better use it as a prefix key.
13712
13713@item a
13714@kindex a (Server)
13715@findex gnus-server-add-server
13716Add a new server (@code{gnus-server-add-server}).
13717
13718@item e
13719@kindex e (Server)
13720@findex gnus-server-edit-server
13721Edit a server (@code{gnus-server-edit-server}).
13722
13723@item SPACE
13724@kindex SPACE (Server)
13725@findex gnus-server-read-server
13726Browse the current server (@code{gnus-server-read-server}).
13727
13728@item q
13729@kindex q (Server)
13730@findex gnus-server-exit
13731Return to the group buffer (@code{gnus-server-exit}).
13732
13733@item k
13734@kindex k (Server)
13735@findex gnus-server-kill-server
13736Kill the current server (@code{gnus-server-kill-server}).
13737
13738@item y
13739@kindex y (Server)
13740@findex gnus-server-yank-server
13741Yank the previously killed server (@code{gnus-server-yank-server}).
13742
13743@item c
13744@kindex c (Server)
13745@findex gnus-server-copy-server
13746Copy the current server (@code{gnus-server-copy-server}).
13747
13748@item l
13749@kindex l (Server)
13750@findex gnus-server-list-servers
13751List all servers (@code{gnus-server-list-servers}).
13752
13753@item s
13754@kindex s (Server)
13755@findex gnus-server-scan-server
13756Request that the server scan its sources for new articles
13757(@code{gnus-server-scan-server}). This is mainly sensible with mail
13758servers.
13759
13760@item g
13761@kindex g (Server)
13762@findex gnus-server-regenerate-server
13763Request that the server regenerate all its data structures
13764(@code{gnus-server-regenerate-server}). This can be useful if you have
13765a mail back end that has gotten out of sync.
13766
01c52d31
MB
13767@item z
13768@kindex z (Server)
13769@findex gnus-server-compact-server
13770
13771Compact all groups in the server under point
13772(@code{gnus-server-compact-server}). Currently implemented only in
13773nnml (@pxref{Mail Spool}). This removes gaps between article numbers,
13774hence getting a correct total article count.
13775
4009494e
GM
13776@end table
13777
13778
13779@node Example Methods
13780@subsection Example Methods
13781
13782Most select methods are pretty simple and self-explanatory:
13783
13784@lisp
13785(nntp "news.funet.fi")
13786@end lisp
13787
13788Reading directly from the spool is even simpler:
13789
13790@lisp
13791(nnspool "")
13792@end lisp
13793
13794As you can see, the first element in a select method is the name of the
13795back end, and the second is the @dfn{address}, or @dfn{name}, if you
13796will.
13797
13798After these two elements, there may be an arbitrary number of
13799@code{(@var{variable} @var{form})} pairs.
13800
13801To go back to the first example---imagine that you want to read from
13802port 15 on that machine. This is what the select method should
13803look like then:
13804
13805@lisp
13806(nntp "news.funet.fi" (nntp-port-number 15))
13807@end lisp
13808
13809You should read the documentation to each back end to find out what
13810variables are relevant, but here's an @code{nnmh} example:
13811
13812@code{nnmh} is a mail back end that reads a spool-like structure. Say
13813you have two structures that you wish to access: One is your private
13814mail spool, and the other is a public one. Here's the possible spec for
13815your private mail:
13816
13817@lisp
13818(nnmh "private" (nnmh-directory "~/private/mail/"))
13819@end lisp
13820
13821(This server is then called @samp{private}, but you may have guessed
13822that.)
13823
13824Here's the method for a public spool:
13825
13826@lisp
13827(nnmh "public"
13828 (nnmh-directory "/usr/information/spool/")
13829 (nnmh-get-new-mail nil))
13830@end lisp
13831
13832@cindex proxy
13833@cindex firewall
13834
13835If you are behind a firewall and only have access to the @acronym{NNTP}
13836server from the firewall machine, you can instruct Gnus to @code{rlogin}
31fe2b00
SM
13837on the firewall machine and connect with
13838@uref{http://netcat.sourceforge.net/, netcat} from there to the
13839@acronym{NNTP} server.
4009494e
GM
13840Doing this can be rather fiddly, but your virtual server definition
13841should probably look something like this:
13842
13843@lisp
13844(nntp "firewall"
31fe2b00 13845 (nntp-open-connection-function nntp-open-via-rlogin-and-netcat)
4009494e 13846 (nntp-via-address "the.firewall.machine")
31fe2b00 13847 (nntp-address "the.real.nntp.host"))
4009494e
GM
13848@end lisp
13849
13850If you want to use the wonderful @code{ssh} program to provide a
13851compressed connection over the modem line, you could add the following
13852configuration to the example above:
13853
13854@lisp
13855 (nntp-via-rlogin-command "ssh")
13856@end lisp
13857
01c52d31
MB
13858See also @code{nntp-via-rlogin-command-switches}. Here's an example for
13859an indirect connection:
fbcbb58c 13860
01c52d31
MB
13861@lisp
13862(setq gnus-select-method
13863 '(nntp "indirect"
13864 (nntp-address "news.server.example")
13865 (nntp-via-user-name "intermediate_user_name")
13866 (nntp-via-address "intermediate.host.example")
13867 (nntp-via-rlogin-command "ssh")
31fe2b00
SM
13868 (nntp-via-rlogin-command-switches ("-C"))
13869 (nntp-open-connection-function nntp-open-via-rlogin-and-netcat)))
01c52d31 13870@end lisp
4009494e 13871
fbcbb58c
KY
13872This means that you have to have set up @code{ssh-agent} correctly to
13873provide automatic authorization, of course.
13874
4009494e
GM
13875If you're behind a firewall, but have direct access to the outside world
13876through a wrapper command like "runsocks", you could open a socksified
31fe2b00 13877netcat connection to the news server as follows:
4009494e
GM
13878
13879@lisp
13880(nntp "outside"
13881 (nntp-pre-command "runsocks")
990e2c2f 13882 (nntp-open-connection-function nntp-open-netcat-stream)
31fe2b00 13883 (nntp-address "the.news.server"))
4009494e
GM
13884@end lisp
13885
4009494e
GM
13886
13887@node Creating a Virtual Server
13888@subsection Creating a Virtual Server
13889
13890If you're saving lots of articles in the cache by using persistent
13891articles, you may want to create a virtual server to read the cache.
13892
13893First you need to add a new server. The @kbd{a} command does that. It
13894would probably be best to use @code{nnml} to read the cache. You
13895could also use @code{nnspool} or @code{nnmh}, though.
13896
13897Type @kbd{a nnml RET cache RET}.
13898
13899You should now have a brand new @code{nnml} virtual server called
13900@samp{cache}. You now need to edit it to have the right definitions.
13901Type @kbd{e} to edit the server. You'll be entered into a buffer that
13902will contain the following:
13903
13904@lisp
13905(nnml "cache")
13906@end lisp
13907
13908Change that to:
13909
13910@lisp
13911(nnml "cache"
13912 (nnml-directory "~/News/cache/")
13913 (nnml-active-file "~/News/cache/active"))
13914@end lisp
13915
13916Type @kbd{C-c C-c} to return to the server buffer. If you now press
13917@kbd{RET} over this virtual server, you should be entered into a browse
13918buffer, and you should be able to enter any of the groups displayed.
13919
13920
13921@node Server Variables
13922@subsection Server Variables
13923@cindex server variables
13924@cindex server parameters
13925
13926One sticky point when defining variables (both on back ends and in Emacs
13927in general) is that some variables are typically initialized from other
13928variables when the definition of the variables is being loaded. If you
13929change the ``base'' variable after the variables have been loaded, you
13930won't change the ``derived'' variables.
13931
13932This typically affects directory and file variables. For instance,
13933@code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml}
13934directory variables are initialized from that variable, so
13935@code{nnml-active-file} will be @file{~/Mail/active}. If you define a
13936new virtual @code{nnml} server, it will @emph{not} suffice to set just
13937@code{nnml-directory}---you have to explicitly set all the file
13938variables to be what you want them to be. For a complete list of
13939variables for each back end, see each back end's section later in this
13940manual, but here's an example @code{nnml} definition:
13941
13942@lisp
13943(nnml "public"
13944 (nnml-directory "~/my-mail/")
13945 (nnml-active-file "~/my-mail/active")
13946 (nnml-newsgroups-file "~/my-mail/newsgroups"))
13947@end lisp
13948
13949Server variables are often called @dfn{server parameters}.
13950
13951@node Servers and Methods
13952@subsection Servers and Methods
13953
13954Wherever you would normally use a select method
13955(e.g. @code{gnus-secondary-select-method}, in the group select method,
13956when browsing a foreign server) you can use a virtual server name
13957instead. This could potentially save lots of typing. And it's nice all
13958over.
13959
13960
13961@node Unavailable Servers
13962@subsection Unavailable Servers
13963
13964If a server seems to be unreachable, Gnus will mark that server as
13965@code{denied}. That means that any subsequent attempt to make contact
13966with that server will just be ignored. ``It can't be opened,'' Gnus
13967will tell you, without making the least effort to see whether that is
13968actually the case or not.
13969
13970That might seem quite naughty, but it does make sense most of the time.
13971Let's say you have 10 groups subscribed to on server
13972@samp{nephelococcygia.com}. This server is located somewhere quite far
13973away from you and the machine is quite slow, so it takes 1 minute just
13974to find out that it refuses connection to you today. If Gnus were to
13975attempt to do that 10 times, you'd be quite annoyed, so Gnus won't
13976attempt to do that. Once it has gotten a single ``connection refused'',
13977it will regard that server as ``down''.
13978
13979So, what happens if the machine was only feeling unwell temporarily?
13980How do you test to see whether the machine has come up again?
13981
13982You jump to the server buffer (@pxref{Server Buffer}) and poke it
13983with the following commands:
13984
13985@table @kbd
13986
13987@item O
13988@kindex O (Server)
13989@findex gnus-server-open-server
13990Try to establish connection to the server on the current line
13991(@code{gnus-server-open-server}).
13992
13993@item C
13994@kindex C (Server)
13995@findex gnus-server-close-server
13996Close the connection (if any) to the server
13997(@code{gnus-server-close-server}).
13998
13999@item D
14000@kindex D (Server)
14001@findex gnus-server-deny-server
14002Mark the current server as unreachable
14003(@code{gnus-server-deny-server}).
14004
14005@item M-o
14006@kindex M-o (Server)
14007@findex gnus-server-open-all-servers
14008Open the connections to all servers in the buffer
14009(@code{gnus-server-open-all-servers}).
14010
14011@item M-c
14012@kindex M-c (Server)
14013@findex gnus-server-close-all-servers
14014Close the connections to all servers in the buffer
14015(@code{gnus-server-close-all-servers}).
14016
14017@item R
14018@kindex R (Server)
14019@findex gnus-server-remove-denials
14020Remove all marks to whether Gnus was denied connection from any servers
14021(@code{gnus-server-remove-denials}).
14022
14023@item L
14024@kindex L (Server)
14025@findex gnus-server-offline-server
14026Set server status to offline (@code{gnus-server-offline-server}).
14027
14028@end table
14029
14030
14031@node Getting News
14032@section Getting News
14033@cindex reading news
14034@cindex news back ends
14035
14036A newsreader is normally used for reading news. Gnus currently provides
14037only two methods of getting news---it can read from an @acronym{NNTP} server,
14038or it can read from a local spool.
14039
14040@menu
14041* NNTP:: Reading news from an @acronym{NNTP} server.
14042* News Spool:: Reading news from the local spool.
14043@end menu
14044
14045
14046@node NNTP
14047@subsection NNTP
14048@cindex nntp
14049
14050Subscribing to a foreign group from an @acronym{NNTP} server is rather easy.
14051You just specify @code{nntp} as method and the address of the @acronym{NNTP}
14052server as the, uhm, address.
14053
14054If the @acronym{NNTP} server is located at a non-standard port, setting the
14055third element of the select method to this port number should allow you
14056to connect to the right port. You'll have to edit the group info for
14057that (@pxref{Foreign Groups}).
14058
14059The name of the foreign group can be the same as a native group. In
14060fact, you can subscribe to the same group from as many different servers
14061you feel like. There will be no name collisions.
14062
14063The following variables can be used to create a virtual @code{nntp}
14064server:
14065
14066@table @code
14067
14068@item nntp-server-opened-hook
14069@vindex nntp-server-opened-hook
14070@cindex @sc{mode reader}
14071@cindex authinfo
14072@cindex authentication
14073@cindex nntp authentication
14074@findex nntp-send-authinfo
14075@findex nntp-send-mode-reader
14076is run after a connection has been made. It can be used to send
14077commands to the @acronym{NNTP} server after it has been contacted. By
14078default it sends the command @code{MODE READER} to the server with the
14079@code{nntp-send-mode-reader} function. This function should always be
14080present in this hook.
14081
14082@item nntp-authinfo-function
14083@vindex nntp-authinfo-function
14084@findex nntp-send-authinfo
14085@vindex nntp-authinfo-file
14086This function will be used to send @samp{AUTHINFO} to the @acronym{NNTP}
14087server. The default function is @code{nntp-send-authinfo}, which looks
14088through your @file{~/.authinfo} (or whatever you've set the
14089@code{nntp-authinfo-file} variable to) for applicable entries. If none
14090are found, it will prompt you for a login name and a password. The
14091format of the @file{~/.authinfo} file is (almost) the same as the
14092@code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp}
14093manual page, but here are the salient facts:
14094
14095@enumerate
14096@item
14097The file contains one or more line, each of which define one server.
14098
14099@item
14100Each line may contain an arbitrary number of token/value pairs.
14101
14102The valid tokens include @samp{machine}, @samp{login}, @samp{password},
14103@samp{default}. In addition Gnus introduces two new tokens, not present
14104in the original @file{.netrc}/@code{ftp} syntax, namely @samp{port} and
14105@samp{force}. (This is the only way the @file{.authinfo} file format
14106deviates from the @file{.netrc} file format.) @samp{port} is used to
14107indicate what port on the server the credentials apply to and
14108@samp{force} is explained below.
14109
14110@end enumerate
14111
14112Here's an example file:
14113
14114@example
14115machine news.uio.no login larsi password geheimnis
14116machine nntp.ifi.uio.no login larsi force yes
14117@end example
14118
14119The token/value pairs may appear in any order; @samp{machine} doesn't
14120have to be first, for instance.
14121
14122In this example, both login name and password have been supplied for the
14123former server, while the latter has only the login name listed, and the
14124user will be prompted for the password. The latter also has the
14125@samp{force} tag, which means that the authinfo will be sent to the
14126@var{nntp} server upon connection; the default (i.e., when there is not
14127@samp{force} tag) is to not send authinfo to the @var{nntp} server
14128until the @var{nntp} server asks for it.
14129
14130You can also add @samp{default} lines that will apply to all servers
14131that don't have matching @samp{machine} lines.
14132
14133@example
14134default force yes
14135@end example
14136
14137This will force sending @samp{AUTHINFO} commands to all servers not
14138previously mentioned.
14139
14140Remember to not leave the @file{~/.authinfo} file world-readable.
14141
14142@item nntp-server-action-alist
14143@vindex nntp-server-action-alist
14144This is a list of regexps to match on server types and actions to be
14145taken when matches are made. For instance, if you want Gnus to beep
14146every time you connect to innd, you could say something like:
14147
14148@lisp
14149(setq nntp-server-action-alist
14150 '(("innd" (ding))))
14151@end lisp
14152
14153You probably don't want to do that, though.
14154
14155The default value is
14156
14157@lisp
14158'(("nntpd 1\\.5\\.11t"
14159 (remove-hook 'nntp-server-opened-hook
14160 'nntp-send-mode-reader)))
14161@end lisp
14162
14163This ensures that Gnus doesn't send the @code{MODE READER} command to
14164nntpd 1.5.11t, since that command chokes that server, I've been told.
14165
14166@item nntp-maximum-request
14167@vindex nntp-maximum-request
14168If the @acronym{NNTP} server doesn't support @acronym{NOV} headers, this back end
14169will collect headers by sending a series of @code{head} commands. To
14170speed things up, the back end sends lots of these commands without
14171waiting for reply, and then reads all the replies. This is controlled
14172by the @code{nntp-maximum-request} variable, and is 400 by default. If
14173your network is buggy, you should set this to 1.
14174
14175@item nntp-connection-timeout
14176@vindex nntp-connection-timeout
14177If you have lots of foreign @code{nntp} groups that you connect to
14178regularly, you're sure to have problems with @acronym{NNTP} servers not
14179responding properly, or being too loaded to reply within reasonable
14180time. This is can lead to awkward problems, which can be helped
14181somewhat by setting @code{nntp-connection-timeout}. This is an integer
14182that says how many seconds the @code{nntp} back end should wait for a
14183connection before giving up. If it is @code{nil}, which is the default,
14184no timeouts are done.
14185
14186@item nntp-nov-is-evil
14187@vindex nntp-nov-is-evil
14188If the @acronym{NNTP} server does not support @acronym{NOV}, you could set this
14189variable to @code{t}, but @code{nntp} usually checks automatically whether @acronym{NOV}
14190can be used.
14191
14192@item nntp-xover-commands
14193@vindex nntp-xover-commands
14194@cindex @acronym{NOV}
14195@cindex XOVER
14196List of strings used as commands to fetch @acronym{NOV} lines from a
14197server. The default value of this variable is @code{("XOVER"
14198"XOVERVIEW")}.
14199
14200@item nntp-nov-gap
14201@vindex nntp-nov-gap
14202@code{nntp} normally sends just one big request for @acronym{NOV} lines to
14203the server. The server responds with one huge list of lines. However,
14204if you have read articles 2-5000 in the group, and only want to read
14205article 1 and 5001, that means that @code{nntp} will fetch 4999 @acronym{NOV}
14206lines that you will not need. This variable says how
14207big a gap between two consecutive articles is allowed to be before the
14208@code{XOVER} request is split into several request. Note that if your
14209network is fast, setting this variable to a really small number means
14210that fetching will probably be slower. If this variable is @code{nil},
14211@code{nntp} will never split requests. The default is 5.
14212
14213@item nntp-xref-number-is-evil
14214@vindex nntp-xref-number-is-evil
14215When Gnus refers to an article having the @code{Message-ID} that a user
14216specifies or having the @code{Message-ID} of the parent article of the
14217current one (@pxref{Finding the Parent}), Gnus sends a @code{HEAD}
14218command to the @acronym{NNTP} server to know where it is, and the server
14219returns the data containing the pairs of a group and an article number
14220in the @code{Xref} header. Gnus normally uses the article number to
14221refer to the article if the data shows that that article is in the
14222current group, while it uses the @code{Message-ID} otherwise. However,
14223some news servers, e.g., ones running Diablo, run multiple engines
14224having the same articles but article numbers are not kept synchronized
14225between them. In that case, the article number that appears in the
14226@code{Xref} header varies by which engine is chosen, so you cannot refer
14227to the parent article that is in the current group, for instance. If
14228you connect to such a server, set this variable to a non-@code{nil}
14229value, and Gnus never uses article numbers. For example:
14230
14231@lisp
14232(setq gnus-select-method
14233 '(nntp "newszilla"
14234 (nntp-address "newszilla.example.com")
14235 (nntp-xref-number-is-evil t)
14236 @dots{}))
14237@end lisp
14238
14239The default value of this server variable is @code{nil}.
14240
14241@item nntp-prepare-server-hook
14242@vindex nntp-prepare-server-hook
14243A hook run before attempting to connect to an @acronym{NNTP} server.
14244
14245@item nntp-record-commands
14246@vindex nntp-record-commands
14247If non-@code{nil}, @code{nntp} will log all commands it sends to the
14248@acronym{NNTP} server (along with a timestamp) in the @samp{*nntp-log*}
14249buffer. This is useful if you are debugging a Gnus/@acronym{NNTP} connection
14250that doesn't seem to work.
14251
14252@item nntp-open-connection-function
14253@vindex nntp-open-connection-function
14254It is possible to customize how the connection to the nntp server will
14255be opened. If you specify an @code{nntp-open-connection-function}
14256parameter, Gnus will use that function to establish the connection.
01c52d31
MB
14257Seven pre-made functions are supplied. These functions can be grouped
14258in two categories: direct connection functions (four pre-made), and
14259indirect ones (three pre-made).
4009494e
GM
14260
14261@item nntp-never-echoes-commands
14262@vindex nntp-never-echoes-commands
14263Non-@code{nil} means the nntp server never echoes commands. It is
14264reported that some nntps server doesn't echo commands. So, you may want
14265to set this to non-@code{nil} in the method for such a server setting
14266@code{nntp-open-connection-function} to @code{nntp-open-ssl-stream} for
14267example. The default value is @code{nil}. Note that the
14268@code{nntp-open-connection-functions-never-echo-commands} variable
14269overrides the @code{nil} value of this variable.
14270
14271@item nntp-open-connection-functions-never-echo-commands
14272@vindex nntp-open-connection-functions-never-echo-commands
14273List of functions that never echo commands. Add or set a function which
14274you set to @code{nntp-open-connection-function} to this list if it does
14275not echo commands. Note that a non-@code{nil} value of the
14276@code{nntp-never-echoes-commands} variable overrides this variable. The
14277default value is @code{(nntp-open-network-stream)}.
14278
14279@item nntp-prepare-post-hook
14280@vindex nntp-prepare-post-hook
14281A hook run just before posting an article. If there is no
14282@code{Message-ID} header in the article and the news server provides the
14283recommended ID, it will be added to the article before running this
14284hook. It is useful to make @code{Cancel-Lock} headers even if you
14285inhibit Gnus to add a @code{Message-ID} header, you could say:
14286
14287@lisp
14288(add-hook 'nntp-prepare-post-hook 'canlock-insert-header)
14289@end lisp
14290
14291Note that not all servers support the recommended ID. This works for
14292INN versions 2.3.0 and later, for instance.
14293
14294@end table
14295
14296@menu
14297* Direct Functions:: Connecting directly to the server.
14298* Indirect Functions:: Connecting indirectly to the server.
14299* Common Variables:: Understood by several connection functions.
01c52d31 14300* NNTP marks:: Storing marks for @acronym{NNTP} servers.
4009494e
GM
14301@end menu
14302
14303
14304@node Direct Functions
14305@subsubsection Direct Functions
14306@cindex direct connection functions
14307
14308These functions are called direct because they open a direct connection
14309between your machine and the @acronym{NNTP} server. The behavior of these
14310functions is also affected by commonly understood variables
14311(@pxref{Common Variables}).
14312
14313@table @code
14314@findex nntp-open-network-stream
14315@item nntp-open-network-stream
14316This is the default, and simply connects to some port or other on the
14317remote system.
14318
14319@findex nntp-open-tls-stream
14320@item nntp-open-tls-stream
14321Opens a connection to a server over a @dfn{secure} channel. To use
14322this you must have @uref{http://www.gnu.org/software/gnutls/, GNUTLS}
14323installed. You then define a server as follows:
14324
14325@lisp
14326;; @r{"nntps" is port 563 and is predefined in our @file{/etc/services}}
14327;; @r{however, @samp{gnutls-cli -p} doesn't like named ports.}
14328;;
14329(nntp "snews.bar.com"
14330 (nntp-open-connection-function nntp-open-tls-stream)
14331 (nntp-port-number )
14332 (nntp-address "snews.bar.com"))
14333@end lisp
14334
14335@findex nntp-open-ssl-stream
14336@item nntp-open-ssl-stream
14337Opens a connection to a server over a @dfn{secure} channel. To use
14338this you must have @uref{http://www.openssl.org, OpenSSL} or
14339@uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL, SSLeay} installed. You
14340then define a server as follows:
14341
14342@lisp
14343;; @r{"snews" is port 563 and is predefined in our @file{/etc/services}}
14344;; @r{however, @samp{openssl s_client -port} doesn't like named ports.}
14345;;
14346(nntp "snews.bar.com"
14347 (nntp-open-connection-function nntp-open-ssl-stream)
14348 (nntp-port-number 563)
14349 (nntp-address "snews.bar.com"))
14350@end lisp
14351
990e2c2f
SM
14352@findex nntp-open-netcat-stream
14353@item nntp-open-netcat-stream
31fe2b00
SM
14354Opens a connection to an @acronym{NNTP} server using the @code{netcat}
14355program. You might wonder why this function exists, since we have
14356the default @code{nntp-open-network-stream} which would do the job. (One
4009494e
GM
14357of) the reason(s) is that if you are behind a firewall but have direct
14358connections to the outside world thanks to a command wrapper like
14359@code{runsocks}, you can use it like this:
14360
14361@lisp
14362(nntp "socksified"
14363 (nntp-pre-command "runsocks")
990e2c2f 14364 (nntp-open-connection-function nntp-open-netcat-stream)
4009494e
GM
14365 (nntp-address "the.news.server"))
14366@end lisp
14367
14368With the default method, you would need to wrap your whole Emacs
14369session, which is not a good idea.
31fe2b00
SM
14370
14371@findex nntp-open-telnet-stream
14372@item nntp-open-telnet-stream
990e2c2f 14373Like @code{nntp-open-netcat-stream}, but uses @code{telnet} rather than
31fe2b00
SM
14374@code{netcat}. @code{telnet} is a bit less robust because of things
14375like line-end-conversion, but sometimes netcat is simply
14376not available. The previous example would turn into:
14377
14378@lisp
14379(nntp "socksified"
14380 (nntp-pre-command "runsocks")
14381 (nntp-open-connection-function nntp-open-telnet-stream)
14382 (nntp-address "the.news.server")
14383 (nntp-end-of-line "\n"))
14384@end lisp
4009494e
GM
14385@end table
14386
14387
14388@node Indirect Functions
14389@subsubsection Indirect Functions
14390@cindex indirect connection functions
14391
14392These functions are called indirect because they connect to an
14393intermediate host before actually connecting to the @acronym{NNTP} server.
14394All of these functions and related variables are also said to belong to
14395the ``via'' family of connection: they're all prefixed with ``via'' to make
14396things cleaner. The behavior of these functions is also affected by
14397commonly understood variables (@pxref{Common Variables}).
14398
14399@table @code
31fe2b00
SM
14400@item nntp-open-via-rlogin-and-netcat
14401@findex nntp-open-via-rlogin-and-netcat
14402Does an @samp{rlogin} on a remote system, and then uses @code{netcat} to connect
4009494e
GM
14403to the real @acronym{NNTP} server from there. This is useful for instance if
14404you need to connect to a firewall machine first.
14405
31fe2b00 14406@code{nntp-open-via-rlogin-and-netcat}-specific variables:
4009494e
GM
14407
14408@table @code
14409@item nntp-via-rlogin-command
14410@vindex nntp-via-rlogin-command
14411Command used to log in on the intermediate host. The default is
14412@samp{rsh}, but @samp{ssh} is a popular alternative.
14413
14414@item nntp-via-rlogin-command-switches
14415@vindex nntp-via-rlogin-command-switches
14416List of strings to be used as the switches to
14417@code{nntp-via-rlogin-command}. The default is @code{nil}. If you use
14418@samp{ssh} for @code{nntp-via-rlogin-command}, you may set this to
31fe2b00 14419@samp{("-C")} in order to compress all data connections.
4009494e
GM
14420@end table
14421
31fe2b00
SM
14422@item nntp-open-via-rlogin-and-telnet
14423@findex nntp-open-via-rlogin-and-telnet
14424Does essentially the same, but uses @code{telnet} instead of @samp{netcat}
01c52d31 14425to connect to the real @acronym{NNTP} server from the intermediate host.
31fe2b00
SM
14426@code{telnet} is a bit less robust because of things like
14427line-end-conversion, but sometimes @code{netcat} is simply not available.
01c52d31 14428
31fe2b00 14429@code{nntp-open-via-rlogin-and-telnet}-specific variables:
01c52d31
MB
14430
14431@table @code
31fe2b00
SM
14432@item nntp-telnet-command
14433@vindex nntp-telnet-command
01c52d31 14434Command used to connect to the real @acronym{NNTP} server from the
fbcbb58c 14435intermediate host. The default is @samp{telnet}.
01c52d31 14436
31fe2b00
SM
14437@item nntp-telnet-switches
14438@vindex nntp-telnet-switches
01c52d31 14439List of strings to be used as the switches to the
31fe2b00 14440@code{nntp-telnet-command} command. The default is @code{("-8")}.
01c52d31
MB
14441
14442@item nntp-via-rlogin-command
14443@vindex nntp-via-rlogin-command
14444Command used to log in on the intermediate host. The default is
14445@samp{rsh}, but @samp{ssh} is a popular alternative.
14446
14447@item nntp-via-rlogin-command-switches
14448@vindex nntp-via-rlogin-command-switches
14449List of strings to be used as the switches to
31fe2b00
SM
14450@code{nntp-via-rlogin-command}. If you use @samp{ssh}, you may need to set
14451this to @samp{("-t" "-e" "none")} or @samp{("-C" "-t" "-e" "none")} if
14452the telnet command requires a pseudo-tty allocation on an intermediate
14453host. The default is @code{nil}.
01c52d31
MB
14454@end table
14455
31fe2b00
SM
14456Note that you may want to change the value for @code{nntp-end-of-line}
14457to @samp{\n} (@pxref{Common Variables}).
14458
4009494e
GM
14459@item nntp-open-via-telnet-and-telnet
14460@findex nntp-open-via-telnet-and-telnet
14461Does essentially the same, but uses @samp{telnet} instead of
14462@samp{rlogin} to connect to the intermediate host.
14463
14464@code{nntp-open-via-telnet-and-telnet}-specific variables:
14465
14466@table @code
14467@item nntp-via-telnet-command
14468@vindex nntp-via-telnet-command
14469Command used to @code{telnet} the intermediate host. The default is
14470@samp{telnet}.
14471
14472@item nntp-via-telnet-switches
14473@vindex nntp-via-telnet-switches
14474List of strings to be used as the switches to the
14475@code{nntp-via-telnet-command} command. The default is @samp{("-8")}.
14476
14477@item nntp-via-user-password
14478@vindex nntp-via-user-password
14479Password to use when logging in on the intermediate host.
14480
14481@item nntp-via-envuser
14482@vindex nntp-via-envuser
14483If non-@code{nil}, the intermediate @code{telnet} session (client and
14484server both) will support the @code{ENVIRON} option and not prompt for
14485login name. This works for Solaris @code{telnet}, for instance.
14486
14487@item nntp-via-shell-prompt
14488@vindex nntp-via-shell-prompt
14489Regexp matching the shell prompt on the intermediate host. The default
14490is @samp{bash\\|\$ *\r?$\\|> *\r?}.
14491
14492@end table
14493
01c52d31
MB
14494Note that you may want to change the value for @code{nntp-end-of-line}
14495to @samp{\n} (@pxref{Common Variables}).
4009494e
GM
14496@end table
14497
14498
14499Here are some additional variables that are understood by all the above
14500functions:
14501
14502@table @code
14503
14504@item nntp-via-user-name
14505@vindex nntp-via-user-name
14506User name to use when connecting to the intermediate host.
14507
14508@item nntp-via-address
14509@vindex nntp-via-address
14510Address of the intermediate host to connect to.
14511
14512@end table
14513
14514
14515@node Common Variables
14516@subsubsection Common Variables
14517
14518The following variables affect the behavior of all, or several of the
14519pre-made connection functions. When not specified, all functions are
14520affected (the values of the following variables will be used as the
14521default if each virtual @code{nntp} server doesn't specify those server
14522variables individually).
14523
14524@table @code
14525
14526@item nntp-pre-command
14527@vindex nntp-pre-command
14528A command wrapper to use when connecting through a non native
14529connection function (all except @code{nntp-open-network-stream},
14530@code{nntp-open-tls-stream}, and @code{nntp-open-ssl-stream}). This is
14531where you would put a @samp{SOCKS} wrapper for instance.
14532
14533@item nntp-address
14534@vindex nntp-address
14535The address of the @acronym{NNTP} server.
14536
14537@item nntp-port-number
14538@vindex nntp-port-number
14539Port number to connect to the @acronym{NNTP} server. The default is
14540@samp{nntp}. If you use @acronym{NNTP} over
14541@acronym{TLS}/@acronym{SSL}, you may want to use integer ports rather
14542than named ports (i.e, use @samp{563} instead of @samp{snews} or
14543@samp{nntps}), because external @acronym{TLS}/@acronym{SSL} tools may
14544not work with named ports.
14545
14546@item nntp-end-of-line
14547@vindex nntp-end-of-line
14548String to use as end-of-line marker when talking to the @acronym{NNTP}
14549server. This is @samp{\r\n} by default, but should be @samp{\n} when
01c52d31 14550using a non native telnet connection function.
4009494e 14551
990e2c2f
SM
14552@item nntp-netcat-command
14553@vindex nntp-netcat-command
4009494e 14554Command to use when connecting to the @acronym{NNTP} server through
31fe2b00 14555@samp{netcat}. This is @emph{not} for an intermediate host. This is
4009494e 14556just for the real @acronym{NNTP} server. The default is
31fe2b00 14557@samp{nc}.
4009494e 14558
990e2c2f
SM
14559@item nntp-netcat-switches
14560@vindex nntp-netcat-switches
14561A list of switches to pass to @code{nntp-netcat-command}. The default
31fe2b00 14562is @samp{()}.
4009494e
GM
14563
14564@end table
14565
01c52d31
MB
14566@node NNTP marks
14567@subsubsection NNTP marks
14568@cindex storing NNTP marks
14569
14570Gnus stores marks (@pxref{Marking Articles}) for @acronym{NNTP}
14571servers in marks files. A marks file records what marks you have set
14572in a group and each file is specific to the corresponding server.
14573Marks files are stored in @file{~/News/marks}
14574(@code{nntp-marks-directory}) under a classic hierarchy resembling
14575that of a news server, for example marks for the group
14576@samp{gmane.discuss} on the news.gmane.org server will be stored in
14577the file @file{~/News/marks/news.gmane.org/gmane/discuss/.marks}.
14578
14579Marks files are useful because you can copy the @file{~/News/marks}
14580directory (using rsync, scp or whatever) to another Gnus installation,
14581and it will realize what articles you have read and marked. The data
14582in @file{~/News/marks} has priority over the same data in
14583@file{~/.newsrc.eld}.
14584
14585Note that marks files are very much server-specific: Gnus remembers
14586the article numbers so if you don't use the same servers on both
14587installations things are most likely to break (most @acronym{NNTP}
14588servers do not use the same article numbers as any other server).
14589However, if you use servers A, B, C on one installation and servers A,
14590D, E on the other, you can sync the marks files for A and then you'll
14591get synchronization for that server between the two installations.
14592
14593Using @acronym{NNTP} marks can possibly incur a performance penalty so
14594if Gnus feels sluggish, try setting the @code{nntp-marks-is-evil}
14595variable to @code{t}. Marks will then be stored in @file{~/.newsrc.eld}.
14596
14597Related variables:
14598
14599@table @code
14600
14601@item nntp-marks-is-evil
14602@vindex nntp-marks-is-evil
14603If non-@code{nil}, this back end will ignore any marks files. The
14604default is @code{nil}.
14605
14606@item nntp-marks-directory
14607@vindex nntp-marks-directory
14608The directory where marks for nntp groups will be stored.
14609
14610@end table
14611
4009494e
GM
14612
14613@node News Spool
14614@subsection News Spool
14615@cindex nnspool
14616@cindex news spool
14617
14618Subscribing to a foreign group from the local spool is extremely easy,
14619and might be useful, for instance, to speed up reading groups that
14620contain very big articles---@samp{alt.binaries.pictures.furniture}, for
14621instance.
14622
14623Anyway, you just specify @code{nnspool} as the method and @code{""} (or
14624anything else) as the address.
14625
14626If you have access to a local spool, you should probably use that as the
14627native select method (@pxref{Finding the News}). It is normally faster
14628than using an @code{nntp} select method, but might not be. It depends.
14629You just have to try to find out what's best at your site.
14630
14631@table @code
14632
14633@item nnspool-inews-program
14634@vindex nnspool-inews-program
14635Program used to post an article.
14636
14637@item nnspool-inews-switches
14638@vindex nnspool-inews-switches
14639Parameters given to the inews program when posting an article.
14640
14641@item nnspool-spool-directory
14642@vindex nnspool-spool-directory
14643Where @code{nnspool} looks for the articles. This is normally
14644@file{/usr/spool/news/}.
14645
14646@item nnspool-nov-directory
14647@vindex nnspool-nov-directory
14648Where @code{nnspool} will look for @acronym{NOV} files. This is normally@*
14649@file{/usr/spool/news/over.view/}.
14650
14651@item nnspool-lib-dir
14652@vindex nnspool-lib-dir
14653Where the news lib dir is (@file{/usr/lib/news/} by default).
14654
14655@item nnspool-active-file
14656@vindex nnspool-active-file
14657The name of the active file.
14658
14659@item nnspool-newsgroups-file
14660@vindex nnspool-newsgroups-file
14661The name of the group descriptions file.
14662
14663@item nnspool-history-file
14664@vindex nnspool-history-file
14665The name of the news history file.
14666
14667@item nnspool-active-times-file
14668@vindex nnspool-active-times-file
14669The name of the active date file.
14670
14671@item nnspool-nov-is-evil
14672@vindex nnspool-nov-is-evil
14673If non-@code{nil}, @code{nnspool} won't try to use any @acronym{NOV} files
14674that it finds.
14675
14676@item nnspool-sift-nov-with-sed
14677@vindex nnspool-sift-nov-with-sed
14678@cindex sed
14679If non-@code{nil}, which is the default, use @code{sed} to get the
14680relevant portion from the overview file. If @code{nil},
14681@code{nnspool} will load the entire file into a buffer and process it
14682there.
14683
14684@end table
14685
14686
14687@node Getting Mail
14688@section Getting Mail
14689@cindex reading mail
14690@cindex mail
14691
14692Reading mail with a newsreader---isn't that just plain WeIrD? But of
14693course.
14694
14695@menu
14696* Mail in a Newsreader:: Important introductory notes.
14697* Getting Started Reading Mail:: A simple cookbook example.
14698* Splitting Mail:: How to create mail groups.
14699* Mail Sources:: How to tell Gnus where to get mail from.
14700* Mail Back End Variables:: Variables for customizing mail handling.
14701* Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.
14702* Group Mail Splitting:: Use group customize to drive mail splitting.
14703* Incorporating Old Mail:: What about the old mail you have?
14704* Expiring Mail:: Getting rid of unwanted mail.
14705* Washing Mail:: Removing cruft from the mail you get.
14706* Duplicates:: Dealing with duplicated mail.
14707* Not Reading Mail:: Using mail back ends for reading other files.
14708* Choosing a Mail Back End:: Gnus can read a variety of mail formats.
14709@end menu
14710
14711
14712@node Mail in a Newsreader
14713@subsection Mail in a Newsreader
14714
14715If you are used to traditional mail readers, but have decided to switch
14716to reading mail with Gnus, you may find yourself experiencing something
14717of a culture shock.
14718
14719Gnus does not behave like traditional mail readers. If you want to make
14720it behave that way, you can, but it's an uphill battle.
14721
14722Gnus, by default, handles all its groups using the same approach. This
14723approach is very newsreaderly---you enter a group, see the new/unread
14724messages, and when you read the messages, they get marked as read, and
14725you don't see them any more. (Unless you explicitly ask for them.)
14726
14727In particular, you do not do anything explicitly to delete messages.
14728
14729Does this mean that all the messages that have been marked as read are
14730deleted? How awful!
14731
14732But, no, it means that old messages are @dfn{expired} according to some
14733scheme or other. For news messages, the expire process is controlled by
14734the news administrator; for mail, the expire process is controlled by
14735you. The expire process for mail is covered in depth in @ref{Expiring
14736Mail}.
14737
14738What many Gnus users find, after using it a while for both news and
14739mail, is that the transport mechanism has very little to do with how
14740they want to treat a message.
14741
14742Many people subscribe to several mailing lists. These are transported
14743via @acronym{SMTP}, and are therefore mail. But we might go for weeks without
14744answering, or even reading these messages very carefully. We may not
14745need to save them because if we should need to read one again, they are
14746archived somewhere else.
14747
14748Some people have local news groups which have only a handful of readers.
14749These are transported via @acronym{NNTP}, and are therefore news. But we may need
14750to read and answer a large fraction of the messages very carefully in
14751order to do our work. And there may not be an archive, so we may need
14752to save the interesting messages the same way we would personal mail.
14753
14754The important distinction turns out to be not the transport mechanism,
14755but other factors such as how interested we are in the subject matter,
14756or how easy it is to retrieve the message if we need to read it again.
14757
14758Gnus provides many options for sorting mail into ``groups'' which behave
14759like newsgroups, and for treating each group (whether mail or news)
14760differently.
14761
14762Some users never get comfortable using the Gnus (ahem) paradigm and wish
14763that Gnus should grow up and be a male, er, mail reader. It is possible
14764to whip Gnus into a more mailreaderly being, but, as said before, it's
14765not easy. People who prefer proper mail readers should try @sc{vm}
14766instead, which is an excellent, and proper, mail reader.
14767
14768I don't mean to scare anybody off, but I want to make it clear that you
14769may be required to learn a new way of thinking about messages. After
14770you've been subjected to The Gnus Way, you will come to love it. I can
14771guarantee it. (At least the guy who sold me the Emacs Subliminal
14772Brain-Washing Functions that I've put into Gnus did guarantee it. You
14773Will Be Assimilated. You Love Gnus. You Love The Gnus Mail Way.
14774You Do.)
14775
14776
14777@node Getting Started Reading Mail
14778@subsection Getting Started Reading Mail
14779
14780It's quite easy to use Gnus to read your new mail. You just plonk the
14781mail back end of your choice into @code{gnus-secondary-select-methods},
14782and things will happen automatically.
14783
14784For instance, if you want to use @code{nnml} (which is a ``one file per
14785mail'' back end), you could put the following in your @file{~/.gnus.el} file:
14786
14787@lisp
14788(setq gnus-secondary-select-methods '((nnml "")))
14789@end lisp
14790
14791Now, the next time you start Gnus, this back end will be queried for new
14792articles, and it will move all the messages in your spool file to its
14793directory, which is @file{~/Mail/} by default. The new group that will
14794be created (@samp{mail.misc}) will be subscribed, and you can read it
14795like any other group.
14796
14797You will probably want to split the mail into several groups, though:
14798
14799@lisp
14800(setq nnmail-split-methods
14801 '(("junk" "^From:.*Lars Ingebrigtsen")
14802 ("crazy" "^Subject:.*die\\|^Organization:.*flabby")
14803 ("other" "")))
14804@end lisp
14805
14806This will result in three new @code{nnml} mail groups being created:
14807@samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}. All the
14808mail that doesn't fit into the first two groups will be placed in the
14809last group.
14810
14811This should be sufficient for reading mail with Gnus. You might want to
14812give the other sections in this part of the manual a perusal, though.
14813Especially @pxref{Choosing a Mail Back End} and @pxref{Expiring Mail}.
14814
14815
14816@node Splitting Mail
14817@subsection Splitting Mail
14818@cindex splitting mail
14819@cindex mail splitting
14820@cindex mail filtering (splitting)
14821
14822@vindex nnmail-split-methods
14823The @code{nnmail-split-methods} variable says how the incoming mail is
14824to be split into groups.
14825
14826@lisp
14827(setq nnmail-split-methods
14828 '(("mail.junk" "^From:.*Lars Ingebrigtsen")
14829 ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby")
14830 ("mail.other" "")))
14831@end lisp
14832
14833This variable is a list of lists, where the first element of each of
14834these lists is the name of the mail group (they do not have to be called
14835something beginning with @samp{mail}, by the way), and the second
14836element is a regular expression used on the header of each mail to
14837determine if it belongs in this mail group. The first string may
14838contain @samp{\\1} forms, like the ones used by @code{replace-match} to
14839insert sub-expressions from the matched text. For instance:
14840
14841@lisp
14842("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com")
14843@end lisp
14844
14845@noindent
14846In that case, @code{nnmail-split-lowercase-expanded} controls whether
14847the inserted text should be made lowercase. @xref{Fancy Mail Splitting}.
14848
14849The second element can also be a function. In that case, it will be
14850called narrowed to the headers with the first element of the rule as the
14851argument. It should return a non-@code{nil} value if it thinks that the
14852mail belongs in that group.
14853
14854@cindex @samp{bogus} group
14855The last of these groups should always be a general one, and the regular
14856expression should @emph{always} be @samp{""} so that it matches any mails
14857that haven't been matched by any of the other regexps. (These rules are
14858processed from the beginning of the alist toward the end. The first rule
14859to make a match will ``win'', unless you have crossposting enabled. In
14860that case, all matching rules will ``win''.) If no rule matched, the mail
14861will end up in the @samp{bogus} group. When new groups are created by
14862splitting mail, you may want to run @code{gnus-group-find-new-groups} to
14863see the new groups. This also applies to the @samp{bogus} group.
14864
14865If you like to tinker with this yourself, you can set this variable to a
14866function of your choice. This function will be called without any
14867arguments in a buffer narrowed to the headers of an incoming mail
14868message. The function should return a list of group names that it
14869thinks should carry this mail message.
14870
14871Note that the mail back ends are free to maul the poor, innocent,
14872incoming headers all they want to. They all add @code{Lines} headers;
14873some add @code{X-Gnus-Group} headers; most rename the Unix mbox
14874@code{From<SPACE>} line to something else.
14875
14876@vindex nnmail-crosspost
14877The mail back ends all support cross-posting. If several regexps match,
14878the mail will be ``cross-posted'' to all those groups.
14879@code{nnmail-crosspost} says whether to use this mechanism or not. Note
14880that no articles are crossposted to the general (@samp{""}) group.
14881
14882@vindex nnmail-crosspost-link-function
14883@cindex crosspost
14884@cindex links
14885@code{nnmh} and @code{nnml} makes crossposts by creating hard links to
14886the crossposted articles. However, not all file systems support hard
14887links. If that's the case for you, set
14888@code{nnmail-crosspost-link-function} to @code{copy-file}. (This
14889variable is @code{add-name-to-file} by default.)
14890
14891@kindex M-x nnmail-split-history
14892@findex nnmail-split-history
14893If you wish to see where the previous mail split put the messages, you
14894can use the @kbd{M-x nnmail-split-history} command. If you wish to see
14895where re-spooling messages would put the messages, you can use
14896@code{gnus-summary-respool-trace} and related commands (@pxref{Mail
14897Group Commands}).
14898
14899@vindex nnmail-split-header-length-limit
14900Header lines longer than the value of
14901@code{nnmail-split-header-length-limit} are excluded from the split
14902function.
14903
14904@vindex nnmail-mail-splitting-decodes
14905@vindex nnmail-mail-splitting-charset
14906By default, splitting does not decode headers, so you can not match on
14907non-@acronym{ASCII} strings. But it is useful if you want to match
14908articles based on the raw header data. To enable it, set the
14909@code{nnmail-mail-splitting-decodes} variable to a non-@code{nil} value.
14910In addition, the value of the @code{nnmail-mail-splitting-charset}
14911variable is used for decoding non-@acronym{MIME} encoded string when
14912@code{nnmail-mail-splitting-decodes} is non-@code{nil}. The default
14913value is @code{nil} which means not to decode non-@acronym{MIME} encoded
14914string. A suitable value for you will be @code{undecided} or be the
14915charset used normally in mails you are interested in.
14916
14917@vindex nnmail-resplit-incoming
14918By default, splitting is performed on all incoming messages. If you
14919specify a @code{directory} entry for the variable @code{mail-sources}
14920(@pxref{Mail Source Specifiers}), however, then splitting does
14921@emph{not} happen by default. You can set the variable
14922@code{nnmail-resplit-incoming} to a non-@code{nil} value to make
14923splitting happen even in this case. (This variable has no effect on
14924other kinds of entries.)
14925
14926Gnus gives you all the opportunity you could possibly want for shooting
14927yourself in the foot. Let's say you create a group that will contain
14928all the mail you get from your boss. And then you accidentally
14929unsubscribe from the group. Gnus will still put all the mail from your
14930boss in the unsubscribed group, and so, when your boss mails you ``Have
14931that report ready by Monday or you're fired!'', you'll never see it and,
14932come Tuesday, you'll still believe that you're gainfully employed while
14933you really should be out collecting empty bottles to save up for next
14934month's rent money.
14935
14936
14937@node Mail Sources
14938@subsection Mail Sources
14939
14940Mail can be gotten from many different sources---the mail spool, from
14941a @acronym{POP} mail server, from a procmail directory, or from a
14942maildir, for instance.
14943
14944@menu
14945* Mail Source Specifiers:: How to specify what a mail source is.
14946* Mail Source Customization:: Some variables that influence things.
14947* Fetching Mail:: Using the mail source specifiers.
14948@end menu
14949
14950
14951@node Mail Source Specifiers
14952@subsubsection Mail Source Specifiers
14953@cindex POP
14954@cindex mail server
14955@cindex procmail
14956@cindex mail spool
14957@cindex mail source
14958
14959You tell Gnus how to fetch mail by setting @code{mail-sources}
14960(@pxref{Fetching Mail}) to a @dfn{mail source specifier}.
14961
14962Here's an example:
14963
14964@lisp
14965(pop :server "pop3.mailserver.com" :user "myname")
14966@end lisp
14967
14968As can be observed, a mail source specifier is a list where the first
14969element is a @dfn{mail source type}, followed by an arbitrary number of
14970@dfn{keywords}. Keywords that are not explicitly specified are given
14971default values.
14972
a1da1e37
MB
14973The @code{mail-sources} is global for all mail groups. You can specify
14974an additional mail source for a particular group by including the
14975@code{group} mail specifier in @code{mail-sources}, and setting a
14976@code{mail-source} group parameter (@pxref{Group Parameters}) specifying
14977a single mail source. When this is used, @code{mail-sources} is
14978typically just @code{(group)}; the @code{mail-source} parameter for a
14979group might look like this:
14980
14981@lisp
14982(mail-source . (file :path "home/user/spools/foo.spool"))
14983@end lisp
14984
14985This means that the group's (and only this group's) messages will be
14986fetched from the spool file @samp{/user/spools/foo.spool}.
14987
4009494e
GM
14988The following mail source types are available:
14989
14990@table @code
14991@item file
14992Get mail from a single file; typically from the mail spool.
14993
14994Keywords:
14995
14996@table @code
14997@item :path
14998The file name. Defaults to the value of the @env{MAIL}
14999environment variable or the value of @code{rmail-spool-directory}
15000(usually something like @file{/usr/mail/spool/user-name}).
15001
15002@item :prescript
15003@itemx :postscript
15004Script run before/after fetching mail.
15005@end table
15006
15007An example file mail source:
15008
15009@lisp
15010(file :path "/usr/spool/mail/user-name")
15011@end lisp
15012
15013Or using the default file name:
15014
15015@lisp
15016(file)
15017@end lisp
15018
15019If the mail spool file is not located on the local machine, it's best
15020to use @acronym{POP} or @acronym{IMAP} or the like to fetch the mail.
15021You can not use ange-ftp file names here---it has no way to lock the
15022mail spool while moving the mail.
15023
15024If it's impossible to set up a proper server, you can use ssh instead.
15025
15026@lisp
15027(setq mail-sources
15028 '((file :prescript "ssh host bin/getmail >%t")))
15029@end lisp
15030
15031The @samp{getmail} script would look something like the following:
15032
15033@example
15034#!/bin/sh
15035# getmail - move mail from spool to stdout
15036# flu@@iki.fi
15037
15038MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail
15039TMP=$HOME/Mail/tmp
15040rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP
15041@end example
15042
15043Alter this script to fit the @samp{movemail} and temporary
15044file you want to use.
15045
15046
15047@item directory
15048@vindex nnmail-scan-directory-mail-source-once
15049Get mail from several files in a directory. This is typically used
15050when you have procmail split the incoming mail into several files.
15051That is, there is a one-to-one correspondence between files in that
15052directory and groups, so that mail from the file @file{foo.bar.spool}
15053will be put in the group @code{foo.bar}. (You can change the suffix
15054to be used instead of @code{.spool}.) Setting
15055@code{nnmail-scan-directory-mail-source-once} to non-@code{nil} forces
15056Gnus to scan the mail source only once. This is particularly useful
15057if you want to scan mail groups at a specified level.
15058
15059@vindex nnmail-resplit-incoming
15060There is also the variable @code{nnmail-resplit-incoming}, if you set
15061that to a non-@code{nil} value, then the normal splitting process is
15062applied to all the files from the directory, @ref{Splitting Mail}.
15063
15064Keywords:
15065
15066@table @code
15067@item :path
15068The name of the directory where the files are. There is no default
15069value.
15070
15071@item :suffix
15072Only files ending with this suffix are used. The default is
15073@samp{.spool}.
15074
15075@item :predicate
15076Only files that have this predicate return non-@code{nil} are returned.
15077The default is @code{identity}. This is used as an additional
15078filter---only files that have the right suffix @emph{and} satisfy this
15079predicate are considered.
15080
15081@item :prescript
15082@itemx :postscript
15083Script run before/after fetching mail.
15084
15085@end table
15086
15087An example directory mail source:
15088
15089@lisp
15090(directory :path "/home/user-name/procmail-dir/"
15091 :suffix ".prcml")
15092@end lisp
15093
15094@item pop
15095Get mail from a @acronym{POP} server.
15096
15097Keywords:
15098
15099@table @code
15100@item :server
15101The name of the @acronym{POP} server. The default is taken from the
15102@env{MAILHOST} environment variable.
15103
15104@item :port
15105The port number of the @acronym{POP} server. This can be a number (eg,
15106@samp{:port 1234}) or a string (eg, @samp{:port "pop3"}). If it is a
15107string, it should be a service name as listed in @file{/etc/services} on
15108Unix systems. The default is @samp{"pop3"}. On some systems you might
15109need to specify it as @samp{"pop-3"} instead.
15110
15111@item :user
15112The user name to give to the @acronym{POP} server. The default is the login
15113name.
15114
15115@item :password
15116The password to give to the @acronym{POP} server. If not specified,
15117the user is prompted.
15118
15119@item :program
15120The program to use to fetch mail from the @acronym{POP} server. This
15121should be a @code{format}-like string. Here's an example:
15122
15123@example
15124fetchmail %u@@%s -P %p %t
15125@end example
15126
15127The valid format specifier characters are:
15128
15129@table @samp
15130@item t
15131The name of the file the mail is to be moved to. This must always be
15132included in this string.
15133
15134@item s
15135The name of the server.
15136
15137@item P
15138The port number of the server.
15139
15140@item u
15141The user name to use.
15142
15143@item p
15144The password to use.
15145@end table
15146
15147The values used for these specs are taken from the values you give the
15148corresponding keywords.
15149
15150@item :prescript
15151A script to be run before fetching the mail. The syntax is the same as
15152the @code{:program} keyword. This can also be a function to be run.
15153
15154@item :postscript
15155A script to be run after fetching the mail. The syntax is the same as
15156the @code{:program} keyword. This can also be a function to be run.
15157
15158@item :function
15159The function to use to fetch mail from the @acronym{POP} server. The
15160function is called with one parameter---the name of the file where the
15161mail should be moved to.
15162
15163@item :authentication
15164This can be either the symbol @code{password} or the symbol @code{apop}
15165and says what authentication scheme to use. The default is
15166@code{password}.
15167
15168@end table
15169
15170@vindex pop3-movemail
15171@vindex pop3-leave-mail-on-server
15172If the @code{:program} and @code{:function} keywords aren't specified,
15173@code{pop3-movemail} will be used. If @code{pop3-leave-mail-on-server}
15174is non-@code{nil} the mail is to be left on the @acronym{POP} server
15175after fetching when using @code{pop3-movemail}. Note that POP servers
15176maintain no state information between sessions, so what the client
15177believes is there and what is actually there may not match up. If they
15178do not, then you may get duplicate mails or the whole thing can fall
15179apart and leave you with a corrupt mailbox.
15180
15181Here are some examples for getting mail from a @acronym{POP} server.
15182Fetch from the default @acronym{POP} server, using the default user
15183name, and default fetcher:
15184
15185@lisp
15186(pop)
15187@end lisp
15188
15189Fetch from a named server with a named user and password:
15190
15191@lisp
15192(pop :server "my.pop.server"
15193 :user "user-name" :password "secret")
15194@end lisp
15195
15196Use @samp{movemail} to move the mail:
15197
15198@lisp
15199(pop :program "movemail po:%u %t %p")
15200@end lisp
15201
15202@item maildir
15203Get mail from a maildir. This is a type of mailbox that is supported by
15204at least qmail and postfix, where each file in a special directory
15205contains exactly one mail.
15206
15207Keywords:
15208
15209@table @code
15210@item :path
15211The name of the directory where the mails are stored. The default is
15212taken from the @env{MAILDIR} environment variable or
15213@file{~/Maildir/}.
15214@item :subdirs
15215The subdirectories of the Maildir. The default is
15216@samp{("new" "cur")}.
15217
15218@c If you sometimes look at your mail through a pop3 daemon before fetching
15219@c them with Gnus, you may also have to fetch your mails from the
15220@c @code{cur} directory inside the maildir, like in the first example
15221@c below.
15222
15223You can also get mails from remote hosts (because maildirs don't suffer
15224from locking problems).
15225
15226@end table
15227
15228Two example maildir mail sources:
15229
15230@lisp
15231(maildir :path "/home/user-name/Maildir/"
15232 :subdirs ("cur" "new"))
15233@end lisp
15234
15235@lisp
15236(maildir :path "/user@@remotehost.org:~/Maildir/"
15237 :subdirs ("new"))
15238@end lisp
15239
15240@item imap
15241Get mail from a @acronym{IMAP} server. If you don't want to use
15242@acronym{IMAP} as intended, as a network mail reading protocol (ie
15243with nnimap), for some reason or other, Gnus let you treat it similar
15244to a @acronym{POP} server and fetches articles from a given
15245@acronym{IMAP} mailbox. @xref{IMAP}, for more information.
15246
15247Note that for the Kerberos, GSSAPI, @acronym{TLS}/@acronym{SSL} and STARTTLS support you
15248may need external programs and libraries, @xref{IMAP}.
15249
15250Keywords:
15251
15252@table @code
15253@item :server
15254The name of the @acronym{IMAP} server. The default is taken from the
15255@env{MAILHOST} environment variable.
15256
15257@item :port
15258The port number of the @acronym{IMAP} server. The default is @samp{143}, or
15259@samp{993} for @acronym{TLS}/@acronym{SSL} connections.
15260
15261@item :user
15262The user name to give to the @acronym{IMAP} server. The default is the login
15263name.
15264
15265@item :password
15266The password to give to the @acronym{IMAP} server. If not specified, the user is
15267prompted.
15268
15269@item :stream
15270What stream to use for connecting to the server, this is one of the
15271symbols in @code{imap-stream-alist}. Right now, this means
15272@samp{gssapi}, @samp{kerberos4}, @samp{starttls}, @samp{tls},
15273@samp{ssl}, @samp{shell} or the default @samp{network}.
15274
15275@item :authentication
15276Which authenticator to use for authenticating to the server, this is
15277one of the symbols in @code{imap-authenticator-alist}. Right now,
15278this means @samp{gssapi}, @samp{kerberos4}, @samp{digest-md5},
15279@samp{cram-md5}, @samp{anonymous} or the default @samp{login}.
15280
15281@item :program
15282When using the `shell' :stream, the contents of this variable is
15283mapped into the @code{imap-shell-program} variable. This should be a
15284@code{format}-like string (or list of strings). Here's an example:
15285
15286@example
15287ssh %s imapd
15288@end example
15289
01c52d31
MB
15290Make sure nothing is interfering with the output of the program, e.g.,
15291don't forget to redirect the error output to the void. The valid format
15292specifier characters are:
4009494e
GM
15293
15294@table @samp
15295@item s
15296The name of the server.
15297
15298@item l
15299User name from @code{imap-default-user}.
15300
15301@item p
15302The port number of the server.
15303@end table
15304
15305The values used for these specs are taken from the values you give the
15306corresponding keywords.
15307
15308@item :mailbox
15309The name of the mailbox to get mail from. The default is @samp{INBOX}
d55fe5bb 15310which normally is the mailbox which receives incoming mail.
4009494e
GM
15311
15312@item :predicate
15313The predicate used to find articles to fetch. The default, @samp{UNSEEN
15314UNDELETED}, is probably the best choice for most people, but if you
15315sometimes peek in your mailbox with a @acronym{IMAP} client and mark some
15316articles as read (or; SEEN) you might want to set this to @samp{1:*}.
15317Then all articles in the mailbox is fetched, no matter what. For a
15318complete list of predicates, see RFC 2060 section 6.4.4.
15319
15320@item :fetchflag
15321How to flag fetched articles on the server, the default @samp{\Deleted}
15322will mark them as deleted, an alternative would be @samp{\Seen} which
15323would simply mark them as read. These are the two most likely choices,
15324but more flags are defined in RFC 2060 section 2.3.2.
15325
15326@item :dontexpunge
15327If non-@code{nil}, don't remove all articles marked as deleted in the
15328mailbox after finishing the fetch.
15329
15330@end table
15331
15332An example @acronym{IMAP} mail source:
15333
15334@lisp
15335(imap :server "mail.mycorp.com"
15336 :stream kerberos4
15337 :fetchflag "\\Seen")
15338@end lisp
15339
15340@item webmail
15341Get mail from a webmail server, such as @uref{http://www.hotmail.com/},
15342@uref{http://webmail.netscape.com/}, @uref{http://www.netaddress.com/},
15343@uref{http://mail.yahoo.com/}.
15344
15345NOTE: Webmail largely depends on cookies. A "one-line-cookie" patch is
15346required for url "4.0pre.46".
15347
15348WARNING: Mails may be lost. NO WARRANTY.
15349
15350Keywords:
15351
15352@table @code
15353@item :subtype
15354The type of the webmail server. The default is @code{hotmail}. The
15355alternatives are @code{netscape}, @code{netaddress}, @code{my-deja}.
15356
15357@item :user
15358The user name to give to the webmail server. The default is the login
15359name.
15360
15361@item :password
15362The password to give to the webmail server. If not specified, the user is
15363prompted.
15364
15365@item :dontexpunge
15366If non-@code{nil}, only fetch unread articles and don't move them to
15367trash folder after finishing the fetch.
15368
15369@end table
15370
15371An example webmail source:
15372
15373@lisp
15374(webmail :subtype 'hotmail
15375 :user "user-name"
15376 :password "secret")
15377@end lisp
a1da1e37
MB
15378
15379@item group
15380Get the actual mail source from the @code{mail-source} group parameter,
15381@xref{Group Parameters}.
15382
4009494e
GM
15383@end table
15384
15385@table @dfn
15386@item Common Keywords
15387Common keywords can be used in any type of mail source.
15388
15389Keywords:
15390
15391@table @code
15392@item :plugged
15393If non-@code{nil}, fetch the mail even when Gnus is unplugged. If you
15394use directory source to get mail, you can specify it as in this
15395example:
15396
15397@lisp
15398(setq mail-sources
15399 '((directory :path "/home/pavel/.Spool/"
15400 :suffix ""
15401 :plugged t)))
15402@end lisp
15403
15404Gnus will then fetch your mail even when you are unplugged. This is
15405useful when you use local mail and news.
15406
15407@end table
15408@end table
15409
15410@subsubsection Function Interface
15411
15412Some of the above keywords specify a Lisp function to be executed.
15413For each keyword @code{:foo}, the Lisp variable @code{foo} is bound to
15414the value of the keyword while the function is executing. For example,
15415consider the following mail-source setting:
15416
15417@lisp
15418(setq mail-sources '((pop :user "jrl"
15419 :server "pophost" :function fetchfunc)))
15420@end lisp
15421
15422While the function @code{fetchfunc} is executing, the symbol @code{user}
15423is bound to @code{"jrl"}, and the symbol @code{server} is bound to
15424@code{"pophost"}. The symbols @code{port}, @code{password},
15425@code{program}, @code{prescript}, @code{postscript}, @code{function},
15426and @code{authentication} are also bound (to their default values).
15427
15428See above for a list of keywords for each type of mail source.
15429
15430
15431@node Mail Source Customization
15432@subsubsection Mail Source Customization
15433
15434The following is a list of variables that influence how the mail is
15435fetched. You would normally not need to set or change any of these
15436variables.
15437
15438@table @code
15439@item mail-source-crash-box
15440@vindex mail-source-crash-box
15441File where mail will be stored while processing it. The default is@*
15442@file{~/.emacs-mail-crash-box}.
15443
37a68866 15444@cindex Incoming*
4009494e
GM
15445@item mail-source-delete-incoming
15446@vindex mail-source-delete-incoming
15447If non-@code{nil}, delete incoming files after handling them. If
15448@code{t}, delete the files immediately, if @code{nil}, never delete any
15449files. If a positive number, delete files older than number of days
37a68866
MB
15450(the deletion will only happen when receiving new mail). You may also
15451set @code{mail-source-delete-incoming} to @code{nil} and call
4009494e 15452@code{mail-source-delete-old-incoming} from a hook or interactively.
2b968687
MB
15453@code{mail-source-delete-incoming} defaults to @code{10} in alpha Gnusae
15454and @code{2} in released Gnusae. @xref{Gnus Development}.
4009494e
GM
15455
15456@item mail-source-delete-old-incoming-confirm
15457@vindex mail-source-delete-old-incoming-confirm
15458If non-@code{nil}, ask for confirmation before deleting old incoming
15459files. This variable only applies when
15460@code{mail-source-delete-incoming} is a positive number.
15461
15462@item mail-source-ignore-errors
15463@vindex mail-source-ignore-errors
15464If non-@code{nil}, ignore errors when reading mail from a mail source.
15465
15466@item mail-source-directory
15467@vindex mail-source-directory
15468Directory where incoming mail source files (if any) will be stored. The
15469default is @file{~/Mail/}. At present, the only thing this is used for
15470is to say where the incoming files will be stored if the variable
15471@code{mail-source-delete-incoming} is @code{nil} or a number.
15472
15473@item mail-source-incoming-file-prefix
15474@vindex mail-source-incoming-file-prefix
15475Prefix for file name for storing incoming mail. The default is
15476@file{Incoming}, in which case files will end up with names like
15477@file{Incoming30630D_} or @file{Incoming298602ZD}. This is really only
15478relevant if @code{mail-source-delete-incoming} is @code{nil} or a
15479number.
15480
15481@item mail-source-default-file-modes
15482@vindex mail-source-default-file-modes
15483All new mail files will get this file mode. The default is 384.
15484
15485@item mail-source-movemail-program
15486@vindex mail-source-movemail-program
15487If non-@code{nil}, name of program for fetching new mail. If
15488@code{nil}, @code{movemail} in @var{exec-directory}.
15489
15490@end table
15491
15492
15493@node Fetching Mail
15494@subsubsection Fetching Mail
15495
15496@vindex mail-sources
4009494e
GM
15497The way to actually tell Gnus where to get new mail from is to set
15498@code{mail-sources} to a list of mail source specifiers
15499(@pxref{Mail Source Specifiers}).
15500
b890d447
MB
15501If this variable is @code{nil}, the mail back ends will never attempt to
15502fetch mail by themselves.
4009494e
GM
15503
15504If you want to fetch mail both from your local spool as well as a
15505@acronym{POP} mail server, you'd say something like:
15506
15507@lisp
15508(setq mail-sources
15509 '((file)
15510 (pop :server "pop3.mail.server"
15511 :password "secret")))
15512@end lisp
15513
15514Or, if you don't want to use any of the keyword defaults:
15515
15516@lisp
15517(setq mail-sources
15518 '((file :path "/var/spool/mail/user-name")
15519 (pop :server "pop3.mail.server"
15520 :user "user-name"
15521 :port "pop3"
15522 :password "secret")))
15523@end lisp
15524
15525
15526When you use a mail back end, Gnus will slurp all your mail from your
15527inbox and plonk it down in your home directory. Gnus doesn't move any
15528mail if you're not using a mail back end---you have to do a lot of magic
15529invocations first. At the time when you have finished drawing the
15530pentagram, lightened the candles, and sacrificed the goat, you really
15531shouldn't be too surprised when Gnus moves your mail.
15532
15533
15534
15535@node Mail Back End Variables
15536@subsection Mail Back End Variables
15537
15538These variables are (for the most part) pertinent to all the various
15539mail back ends.
15540
15541@table @code
15542@vindex nnmail-read-incoming-hook
15543@item nnmail-read-incoming-hook
15544The mail back ends all call this hook after reading new mail. You can
15545use this hook to notify any mail watch programs, if you want to.
15546
15547@vindex nnmail-split-hook
15548@item nnmail-split-hook
15549@findex gnus-article-decode-encoded-words
15550@cindex RFC 1522 decoding
15551@cindex RFC 2047 decoding
15552Hook run in the buffer where the mail headers of each message is kept
15553just before the splitting based on these headers is done. The hook is
15554free to modify the buffer contents in any way it sees fit---the buffer
15555is discarded after the splitting has been done, and no changes performed
15556in the buffer will show up in any files.
15557@code{gnus-article-decode-encoded-words} is one likely function to add
15558to this hook.
15559
15560@vindex nnmail-pre-get-new-mail-hook
15561@vindex nnmail-post-get-new-mail-hook
15562@item nnmail-pre-get-new-mail-hook
15563@itemx nnmail-post-get-new-mail-hook
15564These are two useful hooks executed when treating new incoming
15565mail---@code{nnmail-pre-get-new-mail-hook} (is called just before
15566starting to handle the new mail) and
15567@code{nnmail-post-get-new-mail-hook} (is called when the mail handling
15568is done). Here's and example of using these two hooks to change the
15569default file modes the new mail files get:
15570
15571@lisp
15572(add-hook 'nnmail-pre-get-new-mail-hook
15573 (lambda () (set-default-file-modes 511)))
15574
15575(add-hook 'nnmail-post-get-new-mail-hook
15576 (lambda () (set-default-file-modes 551)))
15577@end lisp
15578
15579@item nnmail-use-long-file-names
15580@vindex nnmail-use-long-file-names
15581If non-@code{nil}, the mail back ends will use long file and directory
15582names. Groups like @samp{mail.misc} will end up in directories
15583(assuming use of @code{nnml} back end) or files (assuming use of
15584@code{nnfolder} back end) like @file{mail.misc}. If it is @code{nil},
15585the same group will end up in @file{mail/misc}.
15586
15587@item nnmail-delete-file-function
15588@vindex nnmail-delete-file-function
15589@findex delete-file
15590Function called to delete files. It is @code{delete-file} by default.
15591
15592@item nnmail-cache-accepted-message-ids
15593@vindex nnmail-cache-accepted-message-ids
15594If non-@code{nil}, put the @code{Message-ID}s of articles imported into
15595the back end (via @code{Gcc}, for instance) into the mail duplication
15596discovery cache. The default is @code{nil}.
15597
15598@item nnmail-cache-ignore-groups
15599@vindex nnmail-cache-ignore-groups
15600This can be a regular expression or a list of regular expressions.
15601Group names that match any of the regular expressions will never be
15602recorded in the @code{Message-ID} cache.
15603
15604This can be useful, for example, when using Fancy Splitting
15605(@pxref{Fancy Mail Splitting}) together with the function
15606@code{nnmail-split-fancy-with-parent}.
15607
15608@end table
15609
15610
15611@node Fancy Mail Splitting
15612@subsection Fancy Mail Splitting
15613@cindex mail splitting
15614@cindex fancy mail splitting
15615
15616@vindex nnmail-split-fancy
15617@findex nnmail-split-fancy
15618If the rather simple, standard method for specifying how to split mail
15619doesn't allow you to do what you want, you can set
15620@code{nnmail-split-methods} to @code{nnmail-split-fancy}. Then you can
15621play with the @code{nnmail-split-fancy} variable.
15622
15623Let's look at an example value of this variable first:
15624
15625@lisp
15626;; @r{Messages from the mailer daemon are not crossposted to any of}
15627;; @r{the ordinary groups. Warnings are put in a separate group}
15628;; @r{from real errors.}
15629(| ("from" mail (| ("subject" "warn.*" "mail.warning")
15630 "mail.misc"))
15631 ;; @r{Non-error messages are crossposted to all relevant}
15632 ;; @r{groups, but we don't crosspost between the group for the}
15633 ;; @r{(ding) list and the group for other (ding) related mail.}
15634 (& (| (any "ding@@ifi\\.uio\\.no" "ding.list")
15635 ("subject" "ding" "ding.misc"))
15636 ;; @r{Other mailing lists@dots{}}
15637 (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list")
15638 (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list")
15639 ;; @r{Both lists below have the same suffix, so prevent}
15640 ;; @r{cross-posting to mkpkg.list of messages posted only to}
15641 ;; @r{the bugs- list, but allow cross-posting when the}
15642 ;; @r{message was really cross-posted.}
15643 (any "bugs-mypackage@@somewhere" "mypkg.bugs")
15644 (any "mypackage@@somewhere" - "bugs-mypackage" "mypkg.list")
15645 ;; @r{People@dots{}}
15646 (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen"))
15647 ;; @r{Unmatched mail goes to the catch all group.}
15648 "misc.misc")
15649@end lisp
15650
15651This variable has the format of a @dfn{split}. A split is a
15652(possibly) recursive structure where each split may contain other
15653splits. Here are the possible split syntaxes:
15654
15655@table @code
15656
15657@item group
15658If the split is a string, that will be taken as a group name. Normal
15659regexp match expansion will be done. See below for examples.
15660
15661@c Don't fold this line.
15662@item (@var{field} @var{value} [- @var{restrict} [@dots{}] ] @var{split} [@var{invert-partial}])
15663The split can be a list containing at least three elements. If the
15664first element @var{field} (a regexp matching a header) contains
15665@var{value} (also a regexp) then store the message as specified by
15666@var{split}.
15667
15668If @var{restrict} (yet another regexp) matches some string after
15669@var{field} and before the end of the matched @var{value}, the
15670@var{split} is ignored. If none of the @var{restrict} clauses match,
15671@var{split} is processed.
15672
15673The last element @var{invert-partial} is optional. If it is
15674non-@code{nil}, the match-partial-words behavior controlled by the
15675variable @code{nnmail-split-fancy-match-partial-words} (see below) is
15676be inverted. (New in Gnus 5.10.7)
15677
15678@item (| @var{split} @dots{})
15679If the split is a list, and the first element is @code{|} (vertical
15680bar), then process each @var{split} until one of them matches. A
15681@var{split} is said to match if it will cause the mail message to be
15682stored in one or more groups.
15683
15684@item (& @var{split} @dots{})
15685If the split is a list, and the first element is @code{&}, then
15686process all @var{split}s in the list.
15687
15688@item junk
15689If the split is the symbol @code{junk}, then don't save (i.e., delete)
15690this message. Use with extreme caution.
15691
15692@item (: @var{function} @var{arg1} @var{arg2} @dots{})
15693If the split is a list, and the first element is @samp{:}, then the
15694second element will be called as a function with @var{args} given as
15695arguments. The function should return a @var{split}.
15696
15697@cindex body split
15698For instance, the following function could be used to split based on the
15699body of the messages:
15700
15701@lisp
15702(defun split-on-body ()
15703 (save-excursion
15704 (save-restriction
15705 (widen)
15706 (goto-char (point-min))
15707 (when (re-search-forward "Some.*string" nil t)
15708 "string.group"))))
15709@end lisp
15710
b890d447
MB
15711The buffer is narrowed to the header of the message in question when
15712@var{function} is run. That's why @code{(widen)} needs to be called
15713after @code{save-excursion} and @code{save-restriction} in the example
23f87bed 15714above. Also note that with the nnimap backend, message bodies will
4009494e
GM
15715not be downloaded by default. You need to set
15716@code{nnimap-split-download-body} to @code{t} to do that
15717(@pxref{Splitting in IMAP}).
15718
15719@item (! @var{func} @var{split})
15720If the split is a list, and the first element is @code{!}, then
15721@var{split} will be processed, and @var{func} will be called as a
15722function with the result of @var{split} as argument. @var{func}
15723should return a split.
15724
15725@item nil
15726If the split is @code{nil}, it is ignored.
15727
15728@end table
15729
15730In these splits, @var{field} must match a complete field name.
15731
15732Normally, @var{value} in these splits must match a complete @emph{word}
15733according to the fundamental mode syntax table. In other words, all
15734@var{value}'s will be implicitly surrounded by @code{\<...\>} markers,
15735which are word delimiters. Therefore, if you use the following split,
15736for example,
15737
15738@example
15739(any "joe" "joemail")
15740@end example
15741
15742@noindent
15743messages sent from @samp{joedavis@@foo.org} will normally not be filed
15744in @samp{joemail}. If you want to alter this behavior, you can use any
15745of the following three ways:
15746
15747@enumerate
15748@item
15749@vindex nnmail-split-fancy-match-partial-words
15750You can set the @code{nnmail-split-fancy-match-partial-words} variable
15751to non-@code{nil} in order to ignore word boundaries and instead the
15752match becomes more like a grep. This variable controls whether partial
15753words are matched during fancy splitting. The default value is
15754@code{nil}.
15755
15756Note that it influences all @var{value}'s in your split rules.
15757
15758@item
15759@var{value} beginning with @code{.*} ignores word boundaries in front of
15760a word. Similarly, if @var{value} ends with @code{.*}, word boundaries
15761in the rear of a word will be ignored. For example, the @var{value}
15762@code{"@@example\\.com"} does not match @samp{foo@@example.com} but
15763@code{".*@@example\\.com"} does.
15764
15765@item
15766You can set the @var{invert-partial} flag in your split rules of the
15767@samp{(@var{field} @var{value} @dots{})} types, aforementioned in this
15768section. If the flag is set, word boundaries on both sides of a word
15769are ignored even if @code{nnmail-split-fancy-match-partial-words} is
15770@code{nil}. Contrarily, if the flag is set, word boundaries are not
15771ignored even if @code{nnmail-split-fancy-match-partial-words} is
15772non-@code{nil}. (New in Gnus 5.10.7)
15773@end enumerate
15774
15775@vindex nnmail-split-abbrev-alist
15776@var{field} and @var{value} can also be Lisp symbols, in that case
15777they are expanded as specified by the variable
15778@code{nnmail-split-abbrev-alist}. This is an alist of cons cells,
15779where the @sc{car} of a cell contains the key, and the @sc{cdr}
15780contains the associated value. Predefined entries in
15781@code{nnmail-split-abbrev-alist} include:
15782
15783@table @code
15784@item from
15785Matches the @samp{From}, @samp{Sender} and @samp{Resent-From} fields.
15786@item to
15787Matches the @samp{To}, @samp{Cc}, @samp{Apparently-To},
15788@samp{Resent-To} and @samp{Resent-Cc} fields.
15789@item any
15790Is the union of the @code{from} and @code{to} entries.
15791@end table
15792
15793@vindex nnmail-split-fancy-syntax-table
15794@code{nnmail-split-fancy-syntax-table} is the syntax table in effect
15795when all this splitting is performed.
15796
15797If you want to have Gnus create groups dynamically based on some
15798information in the headers (i.e., do @code{replace-match}-like
15799substitutions in the group names), you can say things like:
15800
15801@example
15802(any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1")
15803@end example
15804
15805In this example, messages sent to @samp{debian-foo@@lists.debian.org}
15806will be filed in @samp{mail.debian.foo}.
15807
15808If the string contains the element @samp{\&}, then the previously
15809matched string will be substituted. Similarly, the elements @samp{\\1}
15810up to @samp{\\9} will be substituted with the text matched by the
15811groupings 1 through 9.
15812
15813@vindex nnmail-split-lowercase-expanded
15814Where @code{nnmail-split-lowercase-expanded} controls whether the
15815lowercase of the matched string should be used for the substitution.
15816Setting it as non-@code{nil} is useful to avoid the creation of multiple
15817groups when users send to an address using different case
15818(i.e. mailing-list@@domain vs Mailing-List@@Domain). The default value
15819is @code{t}.
15820
15821@findex nnmail-split-fancy-with-parent
15822@code{nnmail-split-fancy-with-parent} is a function which allows you to
15823split followups into the same groups their parents are in. Sometimes
15824you can't make splitting rules for all your mail. For example, your
15825boss might send you personal mail regarding different projects you are
15826working on, and as you can't tell your boss to put a distinguishing
15827string into the subject line, you have to resort to manually moving the
15828messages into the right group. With this function, you only have to do
15829it once per thread.
15830
15831To use this feature, you have to set @code{nnmail-treat-duplicates}
15832and @code{nnmail-cache-accepted-message-ids} to a non-@code{nil}
15833value. And then you can include @code{nnmail-split-fancy-with-parent}
15834using the colon feature, like so:
15835@lisp
15836(setq nnmail-treat-duplicates 'warn ; @r{or @code{delete}}
15837 nnmail-cache-accepted-message-ids t
15838 nnmail-split-fancy
15839 '(| (: nnmail-split-fancy-with-parent)
15840 ;; @r{other splits go here}
15841 ))
15842@end lisp
15843
15844This feature works as follows: when @code{nnmail-treat-duplicates} is
15845non-@code{nil}, Gnus records the message id of every message it sees
15846in the file specified by the variable
15847@code{nnmail-message-id-cache-file}, together with the group it is in
15848(the group is omitted for non-mail messages). When mail splitting is
15849invoked, the function @code{nnmail-split-fancy-with-parent} then looks
15850at the References (and In-Reply-To) header of each message to split
15851and searches the file specified by @code{nnmail-message-id-cache-file}
15852for the message ids. When it has found a parent, it returns the
15853corresponding group name unless the group name matches the regexp
15854@code{nnmail-split-fancy-with-parent-ignore-groups}. It is
15855recommended that you set @code{nnmail-message-id-cache-length} to a
15856somewhat higher number than the default so that the message ids are
15857still in the cache. (A value of 5000 appears to create a file some
15858300 kBytes in size.)
15859@vindex nnmail-cache-accepted-message-ids
15860When @code{nnmail-cache-accepted-message-ids} is non-@code{nil}, Gnus
15861also records the message ids of moved articles, so that the followup
15862messages goes into the new group.
15863
15864Also see the variable @code{nnmail-cache-ignore-groups} if you don't
15865want certain groups to be recorded in the cache. For example, if all
15866outgoing messages are written to an ``outgoing'' group, you could set
15867@code{nnmail-cache-ignore-groups} to match that group name.
15868Otherwise, answers to all your messages would end up in the
15869``outgoing'' group.
15870
15871
15872@node Group Mail Splitting
15873@subsection Group Mail Splitting
15874@cindex mail splitting
15875@cindex group mail splitting
15876
15877@findex gnus-group-split
15878If you subscribe to dozens of mailing lists but you don't want to
15879maintain mail splitting rules manually, group mail splitting is for you.
15880You just have to set @code{to-list} and/or @code{to-address} in group
15881parameters or group customization and set @code{nnmail-split-methods} to
15882@code{gnus-group-split}. This splitting function will scan all groups
15883for those parameters and split mail accordingly, i.e., messages posted
15884from or to the addresses specified in the parameters @code{to-list} or
15885@code{to-address} of a mail group will be stored in that group.
15886
15887Sometimes, mailing lists have multiple addresses, and you may want mail
15888splitting to recognize them all: just set the @code{extra-aliases} group
15889parameter to the list of additional addresses and it's done. If you'd
15890rather use a regular expression, set @code{split-regexp}.
15891
15892All these parameters in a group will be used to create an
15893@code{nnmail-split-fancy} split, in which the @var{field} is @samp{any},
15894the @var{value} is a single regular expression that matches
15895@code{to-list}, @code{to-address}, all of @code{extra-aliases} and all
15896matches of @code{split-regexp}, and the @var{split} is the name of the
15897group. @var{restrict}s are also supported: just set the
15898@code{split-exclude} parameter to a list of regular expressions.
15899
15900If you can't get the right split to be generated using all these
15901parameters, or you just need something fancier, you can set the
15902parameter @code{split-spec} to an @code{nnmail-split-fancy} split. In
15903this case, all other aforementioned parameters will be ignored by
15904@code{gnus-group-split}. In particular, @code{split-spec} may be set to
15905@code{nil}, in which case the group will be ignored by
15906@code{gnus-group-split}.
15907
15908@vindex gnus-group-split-default-catch-all-group
15909@code{gnus-group-split} will do cross-posting on all groups that match,
15910by defining a single @code{&} fancy split containing one split for each
15911group. If a message doesn't match any split, it will be stored in the
15912group named in @code{gnus-group-split-default-catch-all-group}, unless
15913some group has @code{split-spec} set to @code{catch-all}, in which case
15914that group is used as the catch-all group. Even though this variable is
15915often used just to name a group, it may also be set to an arbitrarily
15916complex fancy split (after all, a group name is a fancy split), and this
15917may be useful to split mail that doesn't go to any mailing list to
15918personal mail folders. Note that this fancy split is added as the last
15919element of a @code{|} split list that also contains a @code{&} split
15920with the rules extracted from group parameters.
15921
15922It's time for an example. Assume the following group parameters have
15923been defined:
15924
15925@example
15926nnml:mail.bar:
15927((to-address . "bar@@femail.com")
15928 (split-regexp . ".*@@femail\\.com"))
15929nnml:mail.foo:
15930((to-list . "foo@@nowhere.gov")
15931 (extra-aliases "foo@@localhost" "foo-redist@@home")
15932 (split-exclude "bugs-foo" "rambling-foo")
15933 (admin-address . "foo-request@@nowhere.gov"))
15934nnml:mail.others:
15935((split-spec . catch-all))
15936@end example
15937
15938Setting @code{nnmail-split-methods} to @code{gnus-group-split} will
15939behave as if @code{nnmail-split-fancy} had been selected and variable
15940@code{nnmail-split-fancy} had been set as follows:
15941
15942@lisp
15943(| (& (any "\\(bar@@femail\\.com\\|.*@@femail\\.com\\)" "mail.bar")
15944 (any "\\(foo@@nowhere\\.gov\\|foo@@localhost\\|foo-redist@@home\\)"
15945 - "bugs-foo" - "rambling-foo" "mail.foo"))
15946 "mail.others")
15947@end lisp
15948
15949@findex gnus-group-split-fancy
15950If you'd rather not use group splitting for all your mail groups, you
15951may use it for only some of them, by using @code{nnmail-split-fancy}
15952splits like this:
15953
15954@lisp
15955(: gnus-group-split-fancy @var{groups} @var{no-crosspost} @var{catch-all})
15956@end lisp
15957
15958@var{groups} may be a regular expression or a list of group names whose
15959parameters will be scanned to generate the output split.
15960@var{no-crosspost} can be used to disable cross-posting; in this case, a
15961single @code{|} split will be output. @var{catch-all} is the fall back
15962fancy split, used like @code{gnus-group-split-default-catch-all-group}.
15963If @var{catch-all} is @code{nil}, or if @code{split-regexp} matches the
15964empty string in any selected group, no catch-all split will be issued.
15965Otherwise, if some group has @code{split-spec} set to @code{catch-all},
15966this group will override the value of the @var{catch-all} argument.
15967
15968@findex gnus-group-split-setup
15969Unfortunately, scanning all groups and their parameters can be quite
15970slow, especially considering that it has to be done for every message.
15971But don't despair! The function @code{gnus-group-split-setup} can be
15972used to enable @code{gnus-group-split} in a much more efficient way. It
15973sets @code{nnmail-split-methods} to @code{nnmail-split-fancy} and sets
15974@code{nnmail-split-fancy} to the split produced by
15975@code{gnus-group-split-fancy}. Thus, the group parameters are only
15976scanned once, no matter how many messages are split.
15977
15978@findex gnus-group-split-update
15979However, if you change group parameters, you'd have to update
15980@code{nnmail-split-fancy} manually. You can do it by running
15981@code{gnus-group-split-update}. If you'd rather have it updated
15982automatically, just tell @code{gnus-group-split-setup} to do it for
15983you. For example, add to your @file{~/.gnus.el}:
15984
15985@lisp
15986(gnus-group-split-setup @var{auto-update} @var{catch-all})
15987@end lisp
15988
15989If @var{auto-update} is non-@code{nil}, @code{gnus-group-split-update}
15990will be added to @code{nnmail-pre-get-new-mail-hook}, so you won't ever
15991have to worry about updating @code{nnmail-split-fancy} again. If you
15992don't omit @var{catch-all} (it's optional, equivalent to @code{nil}),
15993@code{gnus-group-split-default-catch-all-group} will be set to its
15994value.
15995
15996@vindex gnus-group-split-updated-hook
15997Because you may want to change @code{nnmail-split-fancy} after it is set
15998by @code{gnus-group-split-update}, this function will run
15999@code{gnus-group-split-updated-hook} just before finishing.
16000
16001@node Incorporating Old Mail
16002@subsection Incorporating Old Mail
16003@cindex incorporating old mail
16004@cindex import old mail
16005
16006Most people have lots of old mail stored in various file formats. If
16007you have set up Gnus to read mail using one of the spiffy Gnus mail
16008back ends, you'll probably wish to have that old mail incorporated into
16009your mail groups.
16010
16011Doing so can be quite easy.
16012
16013To take an example: You're reading mail using @code{nnml}
16014(@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a
16015satisfactory value (@pxref{Splitting Mail}). You have an old Unix mbox
16016file filled with important, but old, mail. You want to move it into
16017your @code{nnml} groups.
16018
16019Here's how:
16020
16021@enumerate
16022@item
16023Go to the group buffer.
16024
16025@item
16026Type @kbd{G f} and give the file name to the mbox file when prompted to create an
16027@code{nndoc} group from the mbox file (@pxref{Foreign Groups}).
16028
16029@item
16030Type @kbd{SPACE} to enter the newly created group.
16031
16032@item
16033Type @kbd{M P b} to process-mark all articles in this group's buffer
16034(@pxref{Setting Process Marks}).
16035
16036@item
16037Type @kbd{B r} to respool all the process-marked articles, and answer
16038@samp{nnml} when prompted (@pxref{Mail Group Commands}).
16039@end enumerate
16040
16041All the mail messages in the mbox file will now also be spread out over
16042all your @code{nnml} groups. Try entering them and check whether things
16043have gone without a glitch. If things look ok, you may consider
16044deleting the mbox file, but I wouldn't do that unless I was absolutely
16045sure that all the mail has ended up where it should be.
16046
16047Respooling is also a handy thing to do if you're switching from one mail
16048back end to another. Just respool all the mail in the old mail groups
16049using the new mail back end.
16050
16051
16052@node Expiring Mail
16053@subsection Expiring Mail
16054@cindex article expiry
16055@cindex expiring mail
16056
16057Traditional mail readers have a tendency to remove mail articles when
16058you mark them as read, in some way. Gnus takes a fundamentally
16059different approach to mail reading.
16060
16061Gnus basically considers mail just to be news that has been received in
16062a rather peculiar manner. It does not think that it has the power to
16063actually change the mail, or delete any mail messages. If you enter a
16064mail group, and mark articles as ``read'', or kill them in some other
16065fashion, the mail articles will still exist on the system. I repeat:
16066Gnus will not delete your old, read mail. Unless you ask it to, of
16067course.
16068
16069To make Gnus get rid of your unwanted mail, you have to mark the
16070articles as @dfn{expirable}. (With the default key bindings, this means
16071that you have to type @kbd{E}.) This does not mean that the articles
16072will disappear right away, however. In general, a mail article will be
16073deleted from your system if, 1) it is marked as expirable, AND 2) it is
16074more than one week old. If you do not mark an article as expirable, it
16075will remain on your system until hell freezes over. This bears
16076repeating one more time, with some spurious capitalizations: IF you do
16077NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES.
16078
16079You do not have to mark articles as expirable by hand. Gnus provides
16080two features, called ``auto-expire'' and ``total-expire'', that can help you
16081with this. In a nutshell, ``auto-expire'' means that Gnus hits @kbd{E}
16082for you when you select an article. And ``total-expire'' means that Gnus
16083considers all articles as expirable that are read. So, in addition to
16084the articles marked @samp{E}, also the articles marked @samp{r},
16085@samp{R}, @samp{O}, @samp{K}, @samp{Y} and so on are considered
16086expirable.
16087
16088When should either auto-expire or total-expire be used? Most people
16089who are subscribed to mailing lists split each list into its own group
16090and then turn on auto-expire or total-expire for those groups.
16091(@xref{Splitting Mail}, for more information on splitting each list
16092into its own group.)
16093
16094Which one is better, auto-expire or total-expire? It's not easy to
16095answer. Generally speaking, auto-expire is probably faster. Another
16096advantage of auto-expire is that you get more marks to work with: for
16097the articles that are supposed to stick around, you can still choose
16098between tick and dormant and read marks. But with total-expire, you
16099only have dormant and ticked to choose from. The advantage of
16100total-expire is that it works well with adaptive scoring (@pxref{Adaptive
16101Scoring}). Auto-expire works with normal scoring but not with adaptive
16102scoring.
16103
16104@vindex gnus-auto-expirable-newsgroups
16105Groups that match the regular expression
16106@code{gnus-auto-expirable-newsgroups} will have all articles that you
16107read marked as expirable automatically. All articles marked as
16108expirable have an @samp{E} in the first column in the summary buffer.
16109
16110By default, if you have auto expiry switched on, Gnus will mark all the
16111articles you read as expirable, no matter if they were read or unread
16112before. To avoid having articles marked as read marked as expirable
16113automatically, you can put something like the following in your
16114@file{~/.gnus.el} file:
16115
16116@vindex gnus-mark-article-hook
16117@lisp
16118(remove-hook 'gnus-mark-article-hook
16119 'gnus-summary-mark-read-and-unread-as-read)
16120(add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read)
16121@end lisp
16122
16123Note that making a group auto-expirable doesn't mean that all read
16124articles are expired---only the articles marked as expirable
16125will be expired. Also note that using the @kbd{d} command won't make
16126articles expirable---only semi-automatic marking of articles as read will
16127mark the articles as expirable in auto-expirable groups.
16128
16129Let's say you subscribe to a couple of mailing lists, and you want the
16130articles you have read to disappear after a while:
16131
16132@lisp
16133(setq gnus-auto-expirable-newsgroups
16134 "mail.nonsense-list\\|mail.nice-list")
16135@end lisp
16136
16137Another way to have auto-expiry happen is to have the element
16138@code{auto-expire} in the group parameters of the group.
16139
16140If you use adaptive scoring (@pxref{Adaptive Scoring}) and
16141auto-expiring, you'll have problems. Auto-expiring and adaptive scoring
16142don't really mix very well.
16143
16144@vindex nnmail-expiry-wait
16145The @code{nnmail-expiry-wait} variable supplies the default time an
16146expirable article has to live. Gnus starts counting days from when the
16147message @emph{arrived}, not from when it was sent. The default is seven
16148days.
16149
16150Gnus also supplies a function that lets you fine-tune how long articles
16151are to live, based on what group they are in. Let's say you want to
16152have one month expiry period in the @samp{mail.private} group, a one day
16153expiry period in the @samp{mail.junk} group, and a six day expiry period
16154everywhere else:
16155
16156@vindex nnmail-expiry-wait-function
16157@lisp
16158(setq nnmail-expiry-wait-function
16159 (lambda (group)
16160 (cond ((string= group "mail.private")
16161 31)
16162 ((string= group "mail.junk")
16163 1)
16164 ((string= group "important")
16165 'never)
16166 (t
16167 6))))
16168@end lisp
16169
16170The group names this function is fed are ``unadorned'' group
16171names---no @samp{nnml:} prefixes and the like.
16172
16173The @code{nnmail-expiry-wait} variable and
16174@code{nnmail-expiry-wait-function} function can either be a number (not
16175necessarily an integer) or one of the symbols @code{immediate} or
16176@code{never}.
16177
16178You can also use the @code{expiry-wait} group parameter to selectively
16179change the expiry period (@pxref{Group Parameters}).
16180
16181@vindex nnmail-expiry-target
16182The normal action taken when expiring articles is to delete them.
16183However, in some circumstances it might make more sense to move them
16184to other groups instead of deleting them. The variable
16185@code{nnmail-expiry-target} (and the @code{expiry-target} group
16186parameter) controls this. The variable supplies a default value for
16187all groups, which can be overridden for specific groups by the group
16188parameter. default value is @code{delete}, but this can also be a
16189string (which should be the name of the group the message should be
16190moved to), or a function (which will be called in a buffer narrowed to
16191the message in question, and with the name of the group being moved
16192from as its parameter) which should return a target---either a group
16193name or @code{delete}.
16194
16195Here's an example for specifying a group name:
16196@lisp
16197(setq nnmail-expiry-target "nnml:expired")
16198@end lisp
16199
16200@findex nnmail-fancy-expiry-target
16201@vindex nnmail-fancy-expiry-targets
16202Gnus provides a function @code{nnmail-fancy-expiry-target} which will
16203expire mail to groups according to the variable
16204@code{nnmail-fancy-expiry-targets}. Here's an example:
16205
16206@lisp
16207 (setq nnmail-expiry-target 'nnmail-fancy-expiry-target
16208 nnmail-fancy-expiry-targets
16209 '((to-from "boss" "nnfolder:Work")
16210 ("subject" "IMPORTANT" "nnfolder:IMPORTANT.%Y.%b")
16211 ("from" ".*" "nnfolder:Archive-%Y")))
16212@end lisp
16213
16214With this setup, any mail that has @code{IMPORTANT} in its Subject
16215header and was sent in the year @code{YYYY} and month @code{MMM}, will
16216get expired to the group @code{nnfolder:IMPORTANT.YYYY.MMM}. If its
16217From or To header contains the string @code{boss}, it will get expired
16218to @code{nnfolder:Work}. All other mail will get expired to
16219@code{nnfolder:Archive-YYYY}.
16220
16221@vindex nnmail-keep-last-article
16222If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never
16223expire the final article in a mail newsgroup. This is to make life
16224easier for procmail users.
16225
16226@vindex gnus-total-expirable-newsgroups
16227By the way: That line up there, about Gnus never expiring non-expirable
16228articles, is a lie. If you put @code{total-expire} in the group
16229parameters, articles will not be marked as expirable, but all read
16230articles will be put through the expiry process. Use with extreme
16231caution. Even more dangerous is the
16232@code{gnus-total-expirable-newsgroups} variable. All groups that match
16233this regexp will have all read articles put through the expiry process,
16234which means that @emph{all} old mail articles in the groups in question
16235will be deleted after a while. Use with extreme caution, and don't come
16236crying to me when you discover that the regexp you used matched the
16237wrong group and all your important mail has disappeared. Be a
16238@emph{man}! Or a @emph{woman}! Whatever you feel more comfortable
16239with! So there!
16240
16241Most people make most of their mail groups total-expirable, though.
16242
16243@vindex gnus-inhibit-user-auto-expire
16244If @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user marking
16245commands will not mark an article as expirable, even if the group has
16246auto-expire turned on.
16247
16248
16249@node Washing Mail
16250@subsection Washing Mail
16251@cindex mail washing
16252@cindex list server brain damage
16253@cindex incoming mail treatment
16254
16255Mailers and list servers are notorious for doing all sorts of really,
16256really stupid things with mail. ``Hey, RFC 822 doesn't explicitly
16257prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the
16258end of all lines passing through our server, so let's do that!!!!1!''
16259Yes, but RFC 822 wasn't designed to be read by morons. Things that were
16260considered to be self-evident were not discussed. So. Here we are.
16261
16262Case in point: The German version of Microsoft Exchange adds @samp{AW:
16263} to the subjects of replies instead of @samp{Re: }. I could pretend to
16264be shocked and dismayed by this, but I haven't got the energy. It is to
16265laugh.
16266
16267Gnus provides a plethora of functions for washing articles while
16268displaying them, but it might be nicer to do the filtering before
16269storing the mail to disk. For that purpose, we have three hooks and
16270various functions that can be put in these hooks.
16271
16272@table @code
16273@item nnmail-prepare-incoming-hook
16274@vindex nnmail-prepare-incoming-hook
16275This hook is called before doing anything with the mail and is meant for
16276grand, sweeping gestures. It is called in a buffer that contains all
16277the new, incoming mail. Functions to be used include:
16278
16279@table @code
16280@item nnheader-ms-strip-cr
16281@findex nnheader-ms-strip-cr
16282Remove trailing carriage returns from each line. This is default on
16283Emacs running on MS machines.
16284
16285@end table
16286
16287@item nnmail-prepare-incoming-header-hook
16288@vindex nnmail-prepare-incoming-header-hook
16289This hook is called narrowed to each header. It can be used when
16290cleaning up the headers. Functions that can be used include:
16291
16292@table @code
16293@item nnmail-remove-leading-whitespace
16294@findex nnmail-remove-leading-whitespace
16295Clear leading white space that ``helpful'' listservs have added to the
16296headers to make them look nice. Aaah.
16297
16298(Note that this function works on both the header on the body of all
16299messages, so it is a potentially dangerous function to use (if a body
16300of a message contains something that looks like a header line). So
16301rather than fix the bug, it is of course the right solution to make it
16302into a feature by documenting it.)
16303
16304@item nnmail-remove-list-identifiers
16305@findex nnmail-remove-list-identifiers
16306Some list servers add an identifier---for example, @samp{(idm)}---to the
16307beginning of all @code{Subject} headers. I'm sure that's nice for
16308people who use stone age mail readers. This function will remove
16309strings that match the @code{nnmail-list-identifiers} regexp, which can
16310also be a list of regexp. @code{nnmail-list-identifiers} may not contain
16311@code{\\(..\\)}.
16312
16313For instance, if you want to remove the @samp{(idm)} and the
16314@samp{nagnagnag} identifiers:
16315
16316@lisp
16317(setq nnmail-list-identifiers
16318 '("(idm)" "nagnagnag"))
16319@end lisp
16320
16321This can also be done non-destructively with
16322@code{gnus-list-identifiers}, @xref{Article Hiding}.
16323
16324@item nnmail-remove-tabs
16325@findex nnmail-remove-tabs
16326Translate all @samp{TAB} characters into @samp{SPACE} characters.
16327
01c52d31
MB
16328@item nnmail-ignore-broken-references
16329@findex nnmail-ignore-broken-references
16330@c @findex nnmail-fix-eudora-headers
4009494e 16331@cindex Eudora
01c52d31
MB
16332@cindex Pegasus
16333Some mail user agents (e.g. Eudora and Pegasus) produce broken
16334@code{References} headers, but correct @code{In-Reply-To} headers. This
16335function will get rid of the @code{References} header if the headers
16336contain a line matching the regular expression
16337@code{nnmail-broken-references-mailers}.
4009494e
GM
16338
16339@end table
16340
16341@item nnmail-prepare-incoming-message-hook
16342@vindex nnmail-prepare-incoming-message-hook
16343This hook is called narrowed to each message. Functions to be used
16344include:
16345
16346@table @code
16347@item article-de-quoted-unreadable
16348@findex article-de-quoted-unreadable
16349Decode Quoted Readable encoding.
16350
16351@end table
16352@end table
16353
16354
16355@node Duplicates
16356@subsection Duplicates
16357
16358@vindex nnmail-treat-duplicates
16359@vindex nnmail-message-id-cache-length
16360@vindex nnmail-message-id-cache-file
16361@cindex duplicate mails
16362If you are a member of a couple of mailing lists, you will sometimes
16363receive two copies of the same mail. This can be quite annoying, so
16364@code{nnmail} checks for and treats any duplicates it might find. To do
16365this, it keeps a cache of old @code{Message-ID}s---
16366@code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by
16367default. The approximate maximum number of @code{Message-ID}s stored
16368there is controlled by the @code{nnmail-message-id-cache-length}
16369variable, which is 1000 by default. (So 1000 @code{Message-ID}s will be
16370stored.) If all this sounds scary to you, you can set
16371@code{nnmail-treat-duplicates} to @code{warn} (which is what it is by
16372default), and @code{nnmail} won't delete duplicate mails. Instead it
16373will insert a warning into the head of the mail saying that it thinks
16374that this is a duplicate of a different message.
16375
16376This variable can also be a function. If that's the case, the function
16377will be called from a buffer narrowed to the message in question with
16378the @code{Message-ID} as a parameter. The function must return either
16379@code{nil}, @code{warn}, or @code{delete}.
16380
16381You can turn this feature off completely by setting the variable to
16382@code{nil}.
16383
16384If you want all the duplicate mails to be put into a special
16385@dfn{duplicates} group, you could do that using the normal mail split
16386methods:
16387
16388@lisp
16389(setq nnmail-split-fancy
16390 '(| ;; @r{Messages duplicates go to a separate group.}
16391 ("gnus-warning" "duplicat\\(e\\|ion\\) of message" "duplicate")
16392 ;; @r{Message from daemons, postmaster, and the like to another.}
16393 (any mail "mail.misc")
16394 ;; @r{Other rules.}
16395 [...] ))
16396@end lisp
16397@noindent
16398Or something like:
16399@lisp
16400(setq nnmail-split-methods
16401 '(("duplicates" "^Gnus-Warning:.*duplicate")
16402 ;; @r{Other rules.}
16403 [...]))
16404@end lisp
16405
16406Here's a neat feature: If you know that the recipient reads her mail
16407with Gnus, and that she has @code{nnmail-treat-duplicates} set to
16408@code{delete}, you can send her as many insults as you like, just by
16409using a @code{Message-ID} of a mail that you know that she's already
16410received. Think of all the fun! She'll never see any of it! Whee!
16411
16412
16413@node Not Reading Mail
16414@subsection Not Reading Mail
16415
16416If you start using any of the mail back ends, they have the annoying
16417habit of assuming that you want to read mail with them. This might not
16418be unreasonable, but it might not be what you want.
16419
16420If you set @code{mail-sources} and @code{nnmail-spool-file} to
16421@code{nil}, none of the back ends will ever attempt to read incoming
16422mail, which should help.
16423
16424@vindex nnbabyl-get-new-mail
16425@vindex nnmbox-get-new-mail
16426@vindex nnml-get-new-mail
16427@vindex nnmh-get-new-mail
16428@vindex nnfolder-get-new-mail
16429This might be too much, if, for instance, you are reading mail quite
16430happily with @code{nnml} and just want to peek at some old Rmail
16431file you have stashed away with @code{nnbabyl}. All back ends have
16432variables called back-end-@code{get-new-mail}. If you want to disable
16433the @code{nnbabyl} mail reading, you edit the virtual server for the
16434group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}.
16435
16436All the mail back ends will call @code{nn}*@code{-prepare-save-mail-hook}
16437narrowed to the article to be saved before saving it when reading
16438incoming mail.
16439
16440
16441@node Choosing a Mail Back End
16442@subsection Choosing a Mail Back End
16443
16444Gnus will read the mail spool when you activate a mail group. The mail
16445file is first copied to your home directory. What happens after that
16446depends on what format you want to store your mail in.
16447
16448There are six different mail back ends in the standard Gnus, and more
16449back ends are available separately. The mail back end most people use
16450(because it is possibly the fastest) is @code{nnml} (@pxref{Mail
16451Spool}).
16452
16453@menu
16454* Unix Mail Box:: Using the (quite) standard Un*x mbox.
16455* Rmail Babyl:: Emacs programs use the Rmail Babyl format.
16456* Mail Spool:: Store your mail in a private spool?
16457* MH Spool:: An mhspool-like back end.
16458* Maildir:: Another one-file-per-message format.
16459* Mail Folders:: Having one file for each group.
16460* Comparing Mail Back Ends:: An in-depth looks at pros and cons.
16461@end menu
16462
16463
16464@node Unix Mail Box
16465@subsubsection Unix Mail Box
16466@cindex nnmbox
16467@cindex unix mail box
16468
16469@vindex nnmbox-active-file
16470@vindex nnmbox-mbox-file
16471The @dfn{nnmbox} back end will use the standard Un*x mbox file to store
16472mail. @code{nnmbox} will add extra headers to each mail article to say
16473which group it belongs in.
16474
16475Virtual server settings:
16476
16477@table @code
16478@item nnmbox-mbox-file
16479@vindex nnmbox-mbox-file
16480The name of the mail box in the user's home directory. Default is
16481@file{~/mbox}.
16482
16483@item nnmbox-active-file
16484@vindex nnmbox-active-file
16485The name of the active file for the mail box. Default is
16486@file{~/.mbox-active}.
16487
16488@item nnmbox-get-new-mail
16489@vindex nnmbox-get-new-mail
16490If non-@code{nil}, @code{nnmbox} will read incoming mail and split it
16491into groups. Default is @code{t}.
16492@end table
16493
16494
16495@node Rmail Babyl
16496@subsubsection Rmail Babyl
16497@cindex nnbabyl
16498@cindex Rmail mbox
16499
16500@vindex nnbabyl-active-file
16501@vindex nnbabyl-mbox-file
16502The @dfn{nnbabyl} back end will use a Babyl mail box (aka. @dfn{Rmail
16503mbox}) to store mail. @code{nnbabyl} will add extra headers to each
16504mail article to say which group it belongs in.
16505
16506Virtual server settings:
16507
16508@table @code
16509@item nnbabyl-mbox-file
16510@vindex nnbabyl-mbox-file
16511The name of the Rmail mbox file. The default is @file{~/RMAIL}
16512
16513@item nnbabyl-active-file
16514@vindex nnbabyl-active-file
16515The name of the active file for the rmail box. The default is
16516@file{~/.rmail-active}
16517
16518@item nnbabyl-get-new-mail
16519@vindex nnbabyl-get-new-mail
16520If non-@code{nil}, @code{nnbabyl} will read incoming mail. Default is
16521@code{t}
16522@end table
16523
16524
16525@node Mail Spool
16526@subsubsection Mail Spool
16527@cindex nnml
16528@cindex mail @acronym{NOV} spool
16529
16530The @dfn{nnml} spool mail format isn't compatible with any other known
16531format. It should be used with some caution.
16532
16533@vindex nnml-directory
16534If you use this back end, Gnus will split all incoming mail into files,
16535one file for each mail, and put the articles into the corresponding
16536directories under the directory specified by the @code{nnml-directory}
16537variable. The default value is @file{~/Mail/}.
16538
16539You do not have to create any directories beforehand; Gnus will take
16540care of all that.
16541
16542If you have a strict limit as to how many files you are allowed to store
16543in your account, you should not use this back end. As each mail gets its
16544own file, you might very well occupy thousands of inodes within a few
16545weeks. If this is no problem for you, and it isn't a problem for you
16546having your friendly systems administrator walking around, madly,
16547shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should
16548know that this is probably the fastest format to use. You do not have
16549to trudge through a big mbox file just to read your new mail.
16550
16551@code{nnml} is probably the slowest back end when it comes to article
16552splitting. It has to create lots of files, and it also generates
16553@acronym{NOV} databases for the incoming mails. This makes it possibly the
16554fastest back end when it comes to reading mail.
16555
16556@cindex self contained nnml servers
16557@cindex marks
16558When the marks file is used (which it is by default), @code{nnml}
16559servers have the property that you may backup them using @code{tar} or
16560similar, and later be able to restore them into Gnus (by adding the
16561proper @code{nnml} server) and have all your marks be preserved. Marks
01c52d31 16562for a group are usually stored in the @code{.marks} file (but see
4009494e
GM
16563@code{nnml-marks-file-name}) within each @code{nnml} group's directory.
16564Individual @code{nnml} groups are also possible to backup, use @kbd{G m}
16565to restore the group (after restoring the backup into the nnml
16566directory).
16567
16568If for some reason you believe your @file{.marks} files are screwed
16569up, you can just delete them all. Gnus will then correctly regenerate
16570them next time it starts.
16571
16572Virtual server settings:
16573
16574@table @code
16575@item nnml-directory
16576@vindex nnml-directory
16577All @code{nnml} directories will be placed under this directory. The
16578default is the value of @code{message-directory} (whose default value
16579is @file{~/Mail}).
16580
16581@item nnml-active-file
16582@vindex nnml-active-file
16583The active file for the @code{nnml} server. The default is
16584@file{~/Mail/active}.
16585
16586@item nnml-newsgroups-file
16587@vindex nnml-newsgroups-file
16588The @code{nnml} group descriptions file. @xref{Newsgroups File
16589Format}. The default is @file{~/Mail/newsgroups}.
16590
16591@item nnml-get-new-mail
16592@vindex nnml-get-new-mail
16593If non-@code{nil}, @code{nnml} will read incoming mail. The default is
16594@code{t}.
16595
16596@item nnml-nov-is-evil
16597@vindex nnml-nov-is-evil
16598If non-@code{nil}, this back end will ignore any @acronym{NOV} files. The
16599default is @code{nil}.
16600
16601@item nnml-nov-file-name
16602@vindex nnml-nov-file-name
16603The name of the @acronym{NOV} files. The default is @file{.overview}.
16604
16605@item nnml-prepare-save-mail-hook
16606@vindex nnml-prepare-save-mail-hook
16607Hook run narrowed to an article before saving.
16608
16609@item nnml-marks-is-evil
16610@vindex nnml-marks-is-evil
16611If non-@code{nil}, this back end will ignore any @sc{marks} files. The
16612default is @code{nil}.
16613
16614@item nnml-marks-file-name
16615@vindex nnml-marks-file-name
16616The name of the @dfn{marks} files. The default is @file{.marks}.
16617
16618@item nnml-use-compressed-files
16619@vindex nnml-use-compressed-files
16620If non-@code{nil}, @code{nnml} will allow using compressed message
01c52d31
MB
16621files. This requires @code{auto-compression-mode} to be enabled
16622(@pxref{Compressed Files, ,Compressed Files, emacs, The Emacs Manual}).
16623If the value of @code{nnml-use-compressed-files} is a string, it is used
16624as the file extension specifying the compression program. You can set it
16625to @samp{.bz2} if your Emacs supports it. A value of @code{t} is
16626equivalent to @samp{.gz}.
16627
16628@item nnml-compressed-files-size-threshold
16629@vindex nnml-compressed-files-size-threshold
16630Default size threshold for compressed message files. Message files with
16631bodies larger than that many characters will be automatically compressed
16632if @code{nnml-use-compressed-files} is non-@code{nil}.
4009494e
GM
16633
16634@end table
16635
16636@findex nnml-generate-nov-databases
16637If your @code{nnml} groups and @acronym{NOV} files get totally out of
16638whack, you can do a complete update by typing @kbd{M-x
16639nnml-generate-nov-databases}. This command will trawl through the
16640entire @code{nnml} hierarchy, looking at each and every article, so it
16641might take a while to complete. A better interface to this
16642functionality can be found in the server buffer (@pxref{Server
16643Commands}).
16644
16645
16646@node MH Spool
16647@subsubsection MH Spool
16648@cindex nnmh
16649@cindex mh-e mail spool
16650
16651@code{nnmh} is just like @code{nnml}, except that is doesn't generate
16652@acronym{NOV} databases and it doesn't keep an active file or marks
16653file. This makes @code{nnmh} a @emph{much} slower back end than
16654@code{nnml}, but it also makes it easier to write procmail scripts
16655for.
16656
16657Virtual server settings:
16658
16659@table @code
16660@item nnmh-directory
16661@vindex nnmh-directory
16662All @code{nnmh} directories will be located under this directory. The
16663default is the value of @code{message-directory} (whose default is
16664@file{~/Mail})
16665
16666@item nnmh-get-new-mail
16667@vindex nnmh-get-new-mail
16668If non-@code{nil}, @code{nnmh} will read incoming mail. The default is
16669@code{t}.
16670
16671@item nnmh-be-safe
16672@vindex nnmh-be-safe
16673If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make
16674sure that the articles in the folder are actually what Gnus thinks
16675they are. It will check date stamps and stat everything in sight, so
16676setting this to @code{t} will mean a serious slow-down. If you never
16677use anything but Gnus to read the @code{nnmh} articles, you do not
16678have to set this variable to @code{t}. The default is @code{nil}.
16679@end table
16680
16681
16682@node Maildir
16683@subsubsection Maildir
16684@cindex nnmaildir
16685@cindex maildir
16686
16687@code{nnmaildir} stores mail in the maildir format, with each maildir
16688corresponding to a group in Gnus. This format is documented here:
16689@uref{http://cr.yp.to/proto/maildir.html} and here:
16690@uref{http://www.qmail.org/man/man5/maildir.html}. @code{nnmaildir}
16691also stores extra information in the @file{.nnmaildir/} directory
16692within a maildir.
16693
16694Maildir format was designed to allow concurrent deliveries and
16695reading, without needing locks. With other back ends, you would have
16696your mail delivered to a spool of some kind, and then you would
16697configure Gnus to split mail from that spool into your groups. You
16698can still do that with @code{nnmaildir}, but the more common
16699configuration is to have your mail delivered directly to the maildirs
16700that appear as group in Gnus.
16701
16702@code{nnmaildir} is designed to be perfectly reliable: @kbd{C-g} will
16703never corrupt its data in memory, and @code{SIGKILL} will never
16704corrupt its data in the filesystem.
16705
16706@code{nnmaildir} stores article marks and @acronym{NOV} data in each
16707maildir. So you can copy a whole maildir from one Gnus setup to
16708another, and you will keep your marks.
16709
16710Virtual server settings:
16711
16712@table @code
16713@item directory
16714For each of your @code{nnmaildir} servers (it's very unlikely that
16715you'd need more than one), you need to create a directory and populate
16716it with maildirs or symlinks to maildirs (and nothing else; do not
16717choose a directory already used for other purposes). Each maildir
16718will be represented in Gnus as a newsgroup on that server; the
16719filename of the symlink will be the name of the group. Any filenames
16720in the directory starting with @samp{.} are ignored. The directory is
16721scanned when you first start Gnus, and each time you type @kbd{g} in
16722the group buffer; if any maildirs have been removed or added,
16723@code{nnmaildir} notices at these times.
16724
16725The value of the @code{directory} parameter should be a Lisp form
16726which is processed by @code{eval} and @code{expand-file-name} to get
16727the path of the directory for this server. The form is @code{eval}ed
16728only when the server is opened; the resulting string is used until the
16729server is closed. (If you don't know about forms and @code{eval},
16730don't worry---a simple string will work.) This parameter is not
16731optional; you must specify it. I don't recommend using
16732@code{"~/Mail"} or a subdirectory of it; several other parts of Gnus
16733use that directory by default for various things, and may get confused
16734if @code{nnmaildir} uses it too. @code{"~/.nnmaildir"} is a typical
16735value.
16736
16737@item target-prefix
16738This should be a Lisp form which is processed by @code{eval} and
16739@code{expand-file-name}. The form is @code{eval}ed only when the
16740server is opened; the resulting string is used until the server is
16741closed.
16742
16743When you create a group on an @code{nnmaildir} server, the maildir is
16744created with @code{target-prefix} prepended to its name, and a symlink
16745pointing to that maildir is created, named with the plain group name.
16746So if @code{directory} is @code{"~/.nnmaildir"} and
16747@code{target-prefix} is @code{"../maildirs/"}, then when you create
16748the group @code{foo}, @code{nnmaildir} will create
16749@file{~/.nnmaildir/../maildirs/foo} as a maildir, and will create
16750@file{~/.nnmaildir/foo} as a symlink pointing to
16751@file{../maildirs/foo}.
16752
16753You can set @code{target-prefix} to a string without any slashes to
16754create both maildirs and symlinks in the same @code{directory}; in
16755this case, any maildirs found in @code{directory} whose names start
16756with @code{target-prefix} will not be listed as groups (but the
16757symlinks pointing to them will be).
16758
16759As a special case, if @code{target-prefix} is @code{""} (the default),
16760then when you create a group, the maildir will be created in
16761@code{directory} without a corresponding symlink. Beware that you
16762cannot use @code{gnus-group-delete-group} on such groups without the
16763@code{force} argument.
16764
16765@item directory-files
16766This should be a function with the same interface as
16767@code{directory-files} (such as @code{directory-files} itself). It is
16768used to scan the server's @code{directory} for maildirs. This
16769parameter is optional; the default is
16770@code{nnheader-directory-files-safe} if
16771@code{nnheader-directory-files-is-safe} is @code{nil}, and
16772@code{directory-files} otherwise.
16773(@code{nnheader-directory-files-is-safe} is checked only once when the
16774server is opened; if you want to check it each time the directory is
16775scanned, you'll have to provide your own function that does that.)
16776
16777@item get-new-mail
16778If non-@code{nil}, then after scanning for new mail in the group
16779maildirs themselves as usual, this server will also incorporate mail
16780the conventional Gnus way, from @code{mail-sources} according to
16781@code{nnmail-split-methods} or @code{nnmail-split-fancy}. The default
16782value is @code{nil}.
16783
16784Do @emph{not} use the same maildir both in @code{mail-sources} and as
16785an @code{nnmaildir} group. The results might happen to be useful, but
16786that would be by chance, not by design, and the results might be
16787different in the future. If your split rules create new groups,
16788remember to supply a @code{create-directory} server parameter.
16789@end table
16790
16791@subsubsection Group parameters
16792
16793@code{nnmaildir} uses several group parameters. It's safe to ignore
16794all this; the default behavior for @code{nnmaildir} is the same as the
16795default behavior for other mail back ends: articles are deleted after
16796one week, etc. Except for the expiry parameters, all this
16797functionality is unique to @code{nnmaildir}, so you can ignore it if
16798you're just trying to duplicate the behavior you already have with
16799another back end.
16800
16801If the value of any of these parameters is a vector, the first element
16802is evaluated as a Lisp form and the result is used, rather than the
16803original value. If the value is not a vector, the value itself is
16804evaluated as a Lisp form. (This is why these parameters use names
16805different from those of other, similar parameters supported by other
16806back ends: they have different, though similar, meanings.) (For
16807numbers, strings, @code{nil}, and @code{t}, you can ignore the
16808@code{eval} business again; for other values, remember to use an extra
16809quote and wrap the value in a vector when appropriate.)
16810
16811@table @code
16812@item expire-age
16813An integer specifying the minimum age, in seconds, of an article
16814before it will be expired, or the symbol @code{never} to specify that
16815articles should never be expired. If this parameter is not set,
16816@code{nnmaildir} falls back to the usual
16817@code{nnmail-expiry-wait}(@code{-function}) variables (the
16818@code{expiry-wait} group parameter overrides @code{nnmail-expiry-wait}
16819and makes @code{nnmail-expiry-wait-function} ineffective). If you
16820wanted a value of 3 days, you could use something like @code{[(* 3 24
1682160 60)]}; @code{nnmaildir} will evaluate the form and use the result.
16822An article's age is measured starting from the article file's
16823modification time. Normally, this is the same as the article's
16824delivery time, but editing an article makes it younger. Moving an
16825article (other than via expiry) may also make an article younger.
16826
16827@item expire-group
16828If this is set to a string such as a full Gnus group name, like
16829@example
16830"backend+server.address.string:group.name"
16831@end example
16832and if it is not the name of the same group that the parameter belongs
16833to, then articles will be moved to the specified group during expiry
16834before being deleted. @emph{If this is set to an @code{nnmaildir}
16835group, the article will be just as old in the destination group as it
16836was in the source group.} So be careful with @code{expire-age} in the
16837destination group. If this is set to the name of the same group that
16838the parameter belongs to, then the article is not expired at all. If
16839you use the vector form, the first element is evaluated once for each
16840article. So that form can refer to
16841@code{nnmaildir-article-file-name}, etc., to decide where to put the
16842article. @emph{Even if this parameter is not set, @code{nnmaildir}
16843does not fall back to the @code{expiry-target} group parameter or the
16844@code{nnmail-expiry-target} variable.}
16845
16846@item read-only
16847If this is set to @code{t}, @code{nnmaildir} will treat the articles
16848in this maildir as read-only. This means: articles are not renamed
16849from @file{new/} into @file{cur/}; articles are only found in
16850@file{new/}, not @file{cur/}; articles are never deleted; articles
16851cannot be edited. @file{new/} is expected to be a symlink to the
16852@file{new/} directory of another maildir---e.g., a system-wide mailbox
16853containing a mailing list of common interest. Everything in the
16854maildir outside @file{new/} is @emph{not} treated as read-only, so for
16855a shared mailbox, you do still need to set up your own maildir (or
16856have write permission to the shared mailbox); your maildir just won't
16857contain extra copies of the articles.
16858
16859@item directory-files
16860A function with the same interface as @code{directory-files}. It is
16861used to scan the directories in the maildir corresponding to this
16862group to find articles. The default is the function specified by the
16863server's @code{directory-files} parameter.
16864
16865@item distrust-Lines:
16866If non-@code{nil}, @code{nnmaildir} will always count the lines of an
16867article, rather than use the @code{Lines:} header field. If
16868@code{nil}, the header field will be used if present.
16869
16870@item always-marks
16871A list of mark symbols, such as @code{['(read expire)]}. Whenever
16872Gnus asks @code{nnmaildir} for article marks, @code{nnmaildir} will
16873say that all articles have these marks, regardless of whether the
16874marks stored in the filesystem say so. This is a proof-of-concept
16875feature that will probably be removed eventually; it ought to be done
16876in Gnus proper, or abandoned if it's not worthwhile.
16877
16878@item never-marks
16879A list of mark symbols, such as @code{['(tick expire)]}. Whenever
16880Gnus asks @code{nnmaildir} for article marks, @code{nnmaildir} will
16881say that no articles have these marks, regardless of whether the marks
16882stored in the filesystem say so. @code{never-marks} overrides
16883@code{always-marks}. This is a proof-of-concept feature that will
16884probably be removed eventually; it ought to be done in Gnus proper, or
16885abandoned if it's not worthwhile.
16886
16887@item nov-cache-size
16888An integer specifying the size of the @acronym{NOV} memory cache. To
16889speed things up, @code{nnmaildir} keeps @acronym{NOV} data in memory
16890for a limited number of articles in each group. (This is probably not
16891worthwhile, and will probably be removed in the future.) This
16892parameter's value is noticed only the first time a group is seen after
16893the server is opened---i.e., when you first start Gnus, typically.
16894The @acronym{NOV} cache is never resized until the server is closed
16895and reopened. The default is an estimate of the number of articles
16896that would be displayed in the summary buffer: a count of articles
16897that are either marked with @code{tick} or not marked with
16898@code{read}, plus a little extra.
16899@end table
16900
16901@subsubsection Article identification
16902Articles are stored in the @file{cur/} subdirectory of each maildir.
16903Each article file is named like @code{uniq:info}, where @code{uniq}
16904contains no colons. @code{nnmaildir} ignores, but preserves, the
16905@code{:info} part. (Other maildir readers typically use this part of
16906the filename to store marks.) The @code{uniq} part uniquely
16907identifies the article, and is used in various places in the
16908@file{.nnmaildir/} subdirectory of the maildir to store information
16909about the corresponding article. The full pathname of an article is
16910available in the variable @code{nnmaildir-article-file-name} after you
16911request the article in the summary buffer.
16912
16913@subsubsection NOV data
16914An article identified by @code{uniq} has its @acronym{NOV} data (used
16915to generate lines in the summary buffer) stored in
16916@code{.nnmaildir/nov/uniq}. There is no
16917@code{nnmaildir-generate-nov-databases} function. (There isn't much
16918need for it---an article's @acronym{NOV} data is updated automatically
16919when the article or @code{nnmail-extra-headers} has changed.) You can
16920force @code{nnmaildir} to regenerate the @acronym{NOV} data for a
16921single article simply by deleting the corresponding @acronym{NOV}
16922file, but @emph{beware}: this will also cause @code{nnmaildir} to
16923assign a new article number for this article, which may cause trouble
16924with @code{seen} marks, the Agent, and the cache.
16925
16926@subsubsection Article marks
16927An article identified by @code{uniq} is considered to have the mark
16928@code{flag} when the file @file{.nnmaildir/marks/flag/uniq} exists.
16929When Gnus asks @code{nnmaildir} for a group's marks, @code{nnmaildir}
16930looks for such files and reports the set of marks it finds. When Gnus
16931asks @code{nnmaildir} to store a new set of marks, @code{nnmaildir}
16932creates and deletes the corresponding files as needed. (Actually,
16933rather than create a new file for each mark, it just creates hard
16934links to @file{.nnmaildir/markfile}, to save inodes.)
16935
16936You can invent new marks by creating a new directory in
16937@file{.nnmaildir/marks/}. You can tar up a maildir and remove it from
16938your server, untar it later, and keep your marks. You can add and
16939remove marks yourself by creating and deleting mark files. If you do
16940this while Gnus is running and your @code{nnmaildir} server is open,
16941it's best to exit all summary buffers for @code{nnmaildir} groups and
16942type @kbd{s} in the group buffer first, and to type @kbd{g} or
16943@kbd{M-g} in the group buffer afterwards. Otherwise, Gnus might not
16944pick up the changes, and might undo them.
16945
16946
16947@node Mail Folders
16948@subsubsection Mail Folders
16949@cindex nnfolder
16950@cindex mbox folders
16951@cindex mail folders
16952
16953@code{nnfolder} is a back end for storing each mail group in a
16954separate file. Each file is in the standard Un*x mbox format.
16955@code{nnfolder} will add extra headers to keep track of article
16956numbers and arrival dates.
16957
16958@cindex self contained nnfolder servers
16959@cindex marks
16960When the marks file is used (which it is by default), @code{nnfolder}
16961servers have the property that you may backup them using @code{tar} or
16962similar, and later be able to restore them into Gnus (by adding the
16963proper @code{nnfolder} server) and have all your marks be preserved.
16964Marks for a group are usually stored in a file named as the mbox file
16965with @code{.mrk} concatenated to it (but see
16966@code{nnfolder-marks-file-suffix}) within the @code{nnfolder}
16967directory. Individual @code{nnfolder} groups are also possible to
16968backup, use @kbd{G m} to restore the group (after restoring the backup
16969into the @code{nnfolder} directory).
16970
16971Virtual server settings:
16972
16973@table @code
16974@item nnfolder-directory
16975@vindex nnfolder-directory
16976All the @code{nnfolder} mail boxes will be stored under this
16977directory. The default is the value of @code{message-directory}
16978(whose default is @file{~/Mail})
16979
16980@item nnfolder-active-file
16981@vindex nnfolder-active-file
16982The name of the active file. The default is @file{~/Mail/active}.
16983
16984@item nnfolder-newsgroups-file
16985@vindex nnfolder-newsgroups-file
16986The name of the group descriptions file. @xref{Newsgroups File
16987Format}. The default is @file{~/Mail/newsgroups}
16988
16989@item nnfolder-get-new-mail
16990@vindex nnfolder-get-new-mail
16991If non-@code{nil}, @code{nnfolder} will read incoming mail. The
16992default is @code{t}
16993
16994@item nnfolder-save-buffer-hook
16995@vindex nnfolder-save-buffer-hook
16996@cindex backup files
16997Hook run before saving the folders. Note that Emacs does the normal
16998backup renaming of files even with the @code{nnfolder} buffers. If
16999you wish to switch this off, you could say something like the
17000following in your @file{.emacs} file:
17001
17002@lisp
17003(defun turn-off-backup ()
17004 (set (make-local-variable 'backup-inhibited) t))
17005
17006(add-hook 'nnfolder-save-buffer-hook 'turn-off-backup)
17007@end lisp
17008
17009@item nnfolder-delete-mail-hook
17010@vindex nnfolder-delete-mail-hook
17011Hook run in a buffer narrowed to the message that is to be deleted.
17012This function can be used to copy the message to somewhere else, or to
17013extract some information from it before removing it.
17014
17015@item nnfolder-nov-is-evil
17016@vindex nnfolder-nov-is-evil
17017If non-@code{nil}, this back end will ignore any @acronym{NOV} files. The
17018default is @code{nil}.
17019
17020@item nnfolder-nov-file-suffix
17021@vindex nnfolder-nov-file-suffix
17022The extension for @acronym{NOV} files. The default is @file{.nov}.
17023
17024@item nnfolder-nov-directory
17025@vindex nnfolder-nov-directory
17026The directory where the @acronym{NOV} files should be stored. If
17027@code{nil}, @code{nnfolder-directory} is used.
17028
17029@item nnfolder-marks-is-evil
17030@vindex nnfolder-marks-is-evil
17031If non-@code{nil}, this back end will ignore any @sc{marks} files. The
17032default is @code{nil}.
17033
17034@item nnfolder-marks-file-suffix
17035@vindex nnfolder-marks-file-suffix
17036The extension for @sc{marks} files. The default is @file{.mrk}.
17037
17038@item nnfolder-marks-directory
17039@vindex nnfolder-marks-directory
17040The directory where the @sc{marks} files should be stored. If
17041@code{nil}, @code{nnfolder-directory} is used.
17042
17043@end table
17044
17045
17046@findex nnfolder-generate-active-file
17047@kindex M-x nnfolder-generate-active-file
17048If you have lots of @code{nnfolder}-like files you'd like to read with
17049@code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file}
17050command to make @code{nnfolder} aware of all likely files in
17051@code{nnfolder-directory}. This only works if you use long file names,
17052though.
17053
17054@node Comparing Mail Back Ends
17055@subsubsection Comparing Mail Back Ends
17056
17057First, just for terminology, the @dfn{back end} is the common word for a
17058low-level access method---a transport, if you will, by which something
17059is acquired. The sense is that one's mail has to come from somewhere,
17060and so selection of a suitable back end is required in order to get that
17061mail within spitting distance of Gnus.
17062
17063The same concept exists for Usenet itself: Though access to articles is
17064typically done by @acronym{NNTP} these days, once upon a midnight dreary, everyone
17065in the world got at Usenet by running a reader on the machine where the
17066articles lay (the machine which today we call an @acronym{NNTP} server), and
17067access was by the reader stepping into the articles' directory spool
17068area directly. One can still select between either the @code{nntp} or
17069@code{nnspool} back ends, to select between these methods, if one happens
17070actually to live on the server (or can see its spool directly, anyway,
17071via NFS).
17072
17073The goal in selecting a mail back end is to pick one which
17074simultaneously represents a suitable way of dealing with the original
17075format plus leaving mail in a form that is convenient to use in the
17076future. Here are some high and low points on each:
17077
17078@table @code
17079@item nnmbox
17080
17081UNIX systems have historically had a single, very common, and well-
17082defined format. All messages arrive in a single @dfn{spool file}, and
17083they are delineated by a line whose regular expression matches
17084@samp{^From_}. (My notational use of @samp{_} is to indicate a space,
17085to make it clear in this instance that this is not the RFC-specified
17086@samp{From:} header.) Because Emacs and therefore Gnus emanate
17087historically from the Unix environment, it is simplest if one does not
17088mess a great deal with the original mailbox format, so if one chooses
17089this back end, Gnus' primary activity in getting mail from the real spool
17090area to Gnus' preferred directory is simply to copy it, with no
17091(appreciable) format change in the process. It is the ``dumbest'' way
17092to move mail into availability in the Gnus environment. This makes it
17093fast to move into place, but slow to parse, when Gnus has to look at
17094what's where.
17095
17096@item nnbabyl
17097
17098Once upon a time, there was the DEC-10 and DEC-20, running operating
17099systems called TOPS and related things, and the usual (only?) mail
17100reading environment was a thing called Babyl. I don't know what format
17101was used for mail landing on the system, but Babyl had its own internal
17102format to which mail was converted, primarily involving creating a
17103spool-file-like entity with a scheme for inserting Babyl-specific
17104headers and status bits above the top of each message in the file.
17105Rmail was Emacs' first mail reader, it was written by Richard Stallman,
17106and Stallman came out of that TOPS/Babyl environment, so he wrote Rmail
17107to understand the mail files folks already had in existence. Gnus (and
17108VM, for that matter) continue to support this format because it's
17109perceived as having some good qualities in those mailer-specific
17110headers/status bits stuff. Rmail itself still exists as well, of
17111course, and is still maintained by Stallman.
17112
17113Both of the above forms leave your mail in a single file on your
17114file system, and they must parse that entire file each time you take a
17115look at your mail.
17116
17117@item nnml
17118
17119@code{nnml} is the back end which smells the most as though you were
17120actually operating with an @code{nnspool}-accessed Usenet system. (In
17121fact, I believe @code{nnml} actually derived from @code{nnspool} code,
17122lo these years ago.) One's mail is taken from the original spool file,
17123and is then cut up into individual message files, 1:1. It maintains a
17124Usenet-style active file (analogous to what one finds in an INN- or
17125CNews-based news system in (for instance) @file{/var/lib/news/active},
17126or what is returned via the @samp{NNTP LIST} verb) and also creates
17127@dfn{overview} files for efficient group entry, as has been defined for
17128@acronym{NNTP} servers for some years now. It is slower in mail-splitting,
17129due to the creation of lots of files, updates to the @code{nnml} active
17130file, and additions to overview files on a per-message basis, but it is
17131extremely fast on access because of what amounts to the indexing support
17132provided by the active file and overviews.
17133
17134@code{nnml} costs @dfn{inodes} in a big way; that is, it soaks up the
17135resource which defines available places in the file system to put new
17136files. Sysadmins take a dim view of heavy inode occupation within
17137tight, shared file systems. But if you live on a personal machine where
17138the file system is your own and space is not at a premium, @code{nnml}
17139wins big.
17140
17141It is also problematic using this back end if you are living in a
17142FAT16-based Windows world, since much space will be wasted on all these
17143tiny files.
17144
17145@item nnmh
17146
17147The Rand MH mail-reading system has been around UNIX systems for a very
17148long time; it operates by splitting one's spool file of messages into
17149individual files, but with little or no indexing support---@code{nnmh}
17150is considered to be semantically equivalent to ``@code{nnml} without
17151active file or overviews''. This is arguably the worst choice, because
17152one gets the slowness of individual file creation married to the
17153slowness of access parsing when learning what's new in one's groups.
17154
17155@item nnfolder
17156
17157Basically the effect of @code{nnfolder} is @code{nnmbox} (the first
17158method described above) on a per-group basis. That is, @code{nnmbox}
17159itself puts @emph{all} one's mail in one file; @code{nnfolder} provides a
17160little bit of optimization to this so that each of one's mail groups has
17161a Unix mail box file. It's faster than @code{nnmbox} because each group
17162can be parsed separately, and still provides the simple Unix mail box
17163format requiring minimal effort in moving the mail around. In addition,
17164it maintains an ``active'' file making it much faster for Gnus to figure
17165out how many messages there are in each separate group.
17166
17167If you have groups that are expected to have a massive amount of
17168messages, @code{nnfolder} is not the best choice, but if you receive
17169only a moderate amount of mail, @code{nnfolder} is probably the most
17170friendly mail back end all over.
17171
17172@item nnmaildir
17173
17174For configuring expiry and other things, @code{nnmaildir} uses
17175incompatible group parameters, slightly different from those of other
17176mail back ends.
17177
17178@code{nnmaildir} is largely similar to @code{nnml}, with some notable
17179differences. Each message is stored in a separate file, but the
17180filename is unrelated to the article number in Gnus. @code{nnmaildir}
17181also stores the equivalent of @code{nnml}'s overview files in one file
17182per article, so it uses about twice as many inodes as @code{nnml}. (Use
17183@code{df -i} to see how plentiful your inode supply is.) If this slows
17184you down or takes up very much space, consider switching to
17185@uref{http://www.namesys.com/, ReiserFS} or another non-block-structured
17186file system.
17187
17188Since maildirs don't require locking for delivery, the maildirs you use
17189as groups can also be the maildirs your mail is directly delivered to.
17190This means you can skip Gnus' mail splitting if your mail is already
17191organized into different mailboxes during delivery. A @code{directory}
17192entry in @code{mail-sources} would have a similar effect, but would
17193require one set of mailboxes for spooling deliveries (in mbox format,
17194thus damaging message bodies), and another set to be used as groups (in
17195whatever format you like). A maildir has a built-in spool, in the
17196@code{new/} subdirectory. Beware that currently, mail moved from
17197@code{new/} to @code{cur/} instead of via mail splitting will not
17198undergo treatment such as duplicate checking.
17199
17200@code{nnmaildir} stores article marks for a given group in the
17201corresponding maildir, in a way designed so that it's easy to manipulate
17202them from outside Gnus. You can tar up a maildir, unpack it somewhere
17203else, and still have your marks. @code{nnml} also stores marks, but
17204it's not as easy to work with them from outside Gnus as with
17205@code{nnmaildir}.
17206
17207@code{nnmaildir} uses a significant amount of memory to speed things up.
17208(It keeps in memory some of the things that @code{nnml} stores in files
17209and that @code{nnmh} repeatedly parses out of message files.) If this
17210is a problem for you, you can set the @code{nov-cache-size} group
17211parameter to something small (0 would probably not work, but 1 probably
17212would) to make it use less memory. This caching will probably be
17213removed in the future.
17214
17215Startup is likely to be slower with @code{nnmaildir} than with other
17216back ends. Everything else is likely to be faster, depending in part
17217on your file system.
17218
17219@code{nnmaildir} does not use @code{nnoo}, so you cannot use @code{nnoo}
17220to write an @code{nnmaildir}-derived back end.
17221
17222@end table
17223
17224
17225@node Browsing the Web
17226@section Browsing the Web
17227@cindex web
17228@cindex browsing the web
17229@cindex www
17230@cindex http
17231
17232Web-based discussion forums are getting more and more popular. On many
17233subjects, the web-based forums have become the most important forums,
17234eclipsing the importance of mailing lists and news groups. The reason
17235is easy to understand---they are friendly to new users; you just point
17236and click, and there's the discussion. With mailing lists, you have to
17237go through a cumbersome subscription procedure, and most people don't
17238even know what a news group is.
17239
17240The problem with this scenario is that web browsers are not very good at
17241being newsreaders. They do not keep track of what articles you've read;
17242they do not allow you to score on subjects you're interested in; they do
17243not allow off-line browsing; they require you to click around and drive
17244you mad in the end.
17245
17246So---if web browsers suck at reading discussion forums, why not use Gnus
17247to do it instead?
17248
17249Gnus has been getting a bit of a collection of back ends for providing
17250interfaces to these sources.
17251
17252@menu
17253* Archiving Mail::
17254* Web Searches:: Creating groups from articles that match a string.
17255* Slashdot:: Reading the Slashdot comments.
17256* Ultimate:: The Ultimate Bulletin Board systems.
17257* Web Archive:: Reading mailing list archived on web.
17258* RSS:: Reading RDF site summary.
17259* Customizing W3:: Doing stuff to Emacs/W3 from Gnus.
17260@end menu
17261
17262All the web sources require Emacs/W3 and the url library or those
17263alternatives to work.
17264
17265The main caveat with all these web sources is that they probably won't
17266work for a very long time. Gleaning information from the @acronym{HTML} data
17267is guesswork at best, and when the layout is altered, the Gnus back end
17268will fail. If you have reasonably new versions of these back ends,
17269though, you should be ok.
17270
17271One thing all these Web methods have in common is that the Web sources
17272are often down, unavailable or just plain too slow to be fun. In those
17273cases, it makes a lot of sense to let the Gnus Agent (@pxref{Gnus
17274Unplugged}) handle downloading articles, and then you can read them at
17275leisure from your local disk. No more World Wide Wait for you.
17276
17277@node Archiving Mail
17278@subsection Archiving Mail
17279@cindex archiving mail
17280@cindex backup of mail
17281
17282Some of the back ends, notably @code{nnml}, @code{nnfolder}, and
17283@code{nnmaildir}, now actually store the article marks with each group.
17284For these servers, archiving and restoring a group while preserving
17285marks is fairly simple.
17286
17287(Preserving the group level and group parameters as well still
17288requires ritual dancing and sacrifices to the @file{.newsrc.eld} deity
17289though.)
17290
17291To archive an entire @code{nnml}, @code{nnfolder}, or @code{nnmaildir}
17292server, take a recursive copy of the server directory. There is no need
17293to shut down Gnus, so archiving may be invoked by @code{cron} or
17294similar. You restore the data by restoring the directory tree, and
17295adding a server definition pointing to that directory in Gnus. The
17296@ref{Article Backlog}, @ref{Asynchronous Fetching} and other things
17297might interfere with overwriting data, so you may want to shut down Gnus
17298before you restore the data.
17299
17300It is also possible to archive individual @code{nnml},
17301@code{nnfolder}, or @code{nnmaildir} groups, while preserving marks.
17302For @code{nnml} or @code{nnmaildir}, you copy all files in the group's
17303directory. For @code{nnfolder} you need to copy both the base folder
17304file itself (@file{FOO}, say), and the marks file (@file{FOO.mrk} in
17305this example). Restoring the group is done with @kbd{G m} from the Group
17306buffer. The last step makes Gnus notice the new directory.
17307@code{nnmaildir} notices the new directory automatically, so @kbd{G m}
17308is unnecessary in that case.
17309
17310@node Web Searches
17311@subsection Web Searches
17312@cindex nnweb
17313@cindex Google
17314@cindex dejanews
17315@cindex gmane
17316@cindex Usenet searches
17317@cindex searching the Usenet
17318
17319It's, like, too neat to search the Usenet for articles that match a
17320string, but it, like, totally @emph{sucks}, like, totally, to use one of
17321those, like, Web browsers, and you, like, have to, rilly, like, look at
17322the commercials, so, like, with Gnus you can do @emph{rad}, rilly,
17323searches without having to use a browser.
17324
17325The @code{nnweb} back end allows an easy interface to the mighty search
17326engine. You create an @code{nnweb} group, enter a search pattern, and
17327then enter the group and read the articles like you would any normal
17328group. The @kbd{G w} command in the group buffer (@pxref{Foreign
17329Groups}) will do this in an easy-to-use fashion.
17330
17331@code{nnweb} groups don't really lend themselves to being solid
17332groups---they have a very fleeting idea of article numbers. In fact,
17333each time you enter an @code{nnweb} group (not even changing the search
17334pattern), you are likely to get the articles ordered in a different
17335manner. Not even using duplicate suppression (@pxref{Duplicate
17336Suppression}) will help, since @code{nnweb} doesn't even know the
17337@code{Message-ID} of the articles before reading them using some search
17338engines (Google, for instance). The only possible way to keep track
17339of which articles you've read is by scoring on the @code{Date}
17340header---mark all articles posted before the last date you read the
17341group as read.
17342
17343If the search engine changes its output substantially, @code{nnweb}
17344won't be able to parse it and will fail. One could hardly fault the Web
01c52d31 17345providers if they were to do this---their @emph{raison d'@^etre} is to
4009494e
GM
17346make money off of advertisements, not to provide services to the
17347community. Since @code{nnweb} washes the ads off all the articles, one
17348might think that the providers might be somewhat miffed. We'll see.
17349
17350You must have the @code{url} and @code{W3} package or those alternatives
17351(try @code{customize-group} on the @samp{mm-url} variable group)
17352installed to be able to use @code{nnweb}.
17353
17354Virtual server variables:
17355
17356@table @code
17357@item nnweb-type
17358@vindex nnweb-type
17359What search engine type is being used. The currently supported types
17360are @code{google}, @code{dejanews}, and @code{gmane}. Note that
17361@code{dejanews} is an alias to @code{google}.
17362
17363@item nnweb-search
17364@vindex nnweb-search
17365The search string to feed to the search engine.
17366
17367@item nnweb-max-hits
17368@vindex nnweb-max-hits
17369Advisory maximum number of hits per search to display. The default is
17370999.
17371
17372@item nnweb-type-definition
17373@vindex nnweb-type-definition
17374Type-to-definition alist. This alist says what @code{nnweb} should do
17375with the various search engine types. The following elements must be
17376present:
17377
17378@table @code
17379@item article
17380Function to decode the article and provide something that Gnus
17381understands.
17382
17383@item map
17384Function to create an article number to message header and URL alist.
17385
17386@item search
17387Function to send the search string to the search engine.
17388
17389@item address
17390The address the aforementioned function should send the search string
17391to.
17392
17393@item id
17394Format string URL to fetch an article by @code{Message-ID}.
17395@end table
17396
17397@end table
17398
17399
17400@node Slashdot
17401@subsection Slashdot
17402@cindex Slashdot
17403@cindex nnslashdot
17404
17405@uref{http://slashdot.org/, Slashdot} is a popular news site, with
17406lively discussion following the news articles. @code{nnslashdot} will
17407let you read this forum in a convenient manner.
17408
17409The easiest way to read this source is to put something like the
17410following in your @file{~/.gnus.el} file:
17411
17412@lisp
17413(setq gnus-secondary-select-methods
17414 '((nnslashdot "")))
17415@end lisp
17416
17417This will make Gnus query the @code{nnslashdot} back end for new comments
17418and groups. The @kbd{F} command will subscribe each new news article as
17419a new Gnus group, and you can read the comments by entering these
17420groups. (Note that the default subscription method is to subscribe new
17421groups as zombies. Other methods are available (@pxref{Subscription
17422Methods}).
17423
17424If you want to remove an old @code{nnslashdot} group, the @kbd{G DEL}
17425command is the most handy tool (@pxref{Foreign Groups}).
17426
17427When following up to @code{nnslashdot} comments (or posting new
17428comments), some light @acronym{HTML}izations will be performed. In
17429particular, text quoted with @samp{> } will be quoted with
17430@samp{blockquote} instead, and signatures will have @samp{br} added to
17431the end of each line. Other than that, you can just write @acronym{HTML}
17432directly into the message buffer. Note that Slashdot filters out some
17433@acronym{HTML} forms.
17434
17435The following variables can be altered to change its behavior:
17436
17437@table @code
17438@item nnslashdot-threaded
17439Whether @code{nnslashdot} should display threaded groups or not. The
17440default is @code{t}. To be able to display threads, @code{nnslashdot}
17441has to retrieve absolutely all comments in a group upon entry. If a
17442threaded display is not required, @code{nnslashdot} will only retrieve
17443the comments that are actually wanted by the user. Threading is nicer,
17444but much, much slower than unthreaded.
17445
17446@item nnslashdot-login-name
17447@vindex nnslashdot-login-name
17448The login name to use when posting.
17449
17450@item nnslashdot-password
17451@vindex nnslashdot-password
17452The password to use when posting.
17453
17454@item nnslashdot-directory
17455@vindex nnslashdot-directory
17456Where @code{nnslashdot} will store its files. The default is
17457@file{~/News/slashdot/}.
17458
17459@item nnslashdot-active-url
17460@vindex nnslashdot-active-url
17461The @acronym{URL} format string that will be used to fetch the
17462information on news articles and comments. The default is@*
17463@samp{http://slashdot.org/search.pl?section=&min=%d}.
17464
17465@item nnslashdot-comments-url
17466@vindex nnslashdot-comments-url
17467The @acronym{URL} format string that will be used to fetch comments.
17468
17469@item nnslashdot-article-url
17470@vindex nnslashdot-article-url
17471The @acronym{URL} format string that will be used to fetch the news
17472article. The default is
17473@samp{http://slashdot.org/article.pl?sid=%s&mode=nocomment}.
17474
17475@item nnslashdot-threshold
17476@vindex nnslashdot-threshold
17477The score threshold. The default is -1.
17478
17479@item nnslashdot-group-number
17480@vindex nnslashdot-group-number
17481The number of old groups, in addition to the ten latest, to keep
17482updated. The default is 0.
17483
17484@end table
17485
17486
17487
17488@node Ultimate
17489@subsection Ultimate
17490@cindex nnultimate
17491@cindex Ultimate Bulletin Board
17492
17493@uref{http://www.ultimatebb.com/, The Ultimate Bulletin Board} is
17494probably the most popular Web bulletin board system used. It has a
17495quite regular and nice interface, and it's possible to get the
17496information Gnus needs to keep groups updated.
17497
17498The easiest way to get started with @code{nnultimate} is to say
17499something like the following in the group buffer: @kbd{B nnultimate RET
17500http://www.tcj.com/messboard/ubbcgi/ RET}. (Substitute the @acronym{URL}
17501(not including @samp{Ultimate.cgi} or the like at the end) for a forum
17502you're interested in; there's quite a list of them on the Ultimate web
17503site.) Then subscribe to the groups you're interested in from the
17504server buffer, and read them from the group buffer.
17505
17506The following @code{nnultimate} variables can be altered:
17507
17508@table @code
17509@item nnultimate-directory
17510@vindex nnultimate-directory
17511The directory where @code{nnultimate} stores its files. The default is@*
17512@file{~/News/ultimate/}.
17513@end table
17514
17515
17516@node Web Archive
17517@subsection Web Archive
17518@cindex nnwarchive
17519@cindex Web Archive
17520
17521Some mailing lists only have archives on Web servers, such as
17522@uref{http://www.egroups.com/} and
17523@uref{http://www.mail-archive.com/}. It has a quite regular and nice
17524interface, and it's possible to get the information Gnus needs to keep
17525groups updated.
17526
17527@findex gnus-group-make-warchive-group
17528The easiest way to get started with @code{nnwarchive} is to say
17529something like the following in the group buffer: @kbd{M-x
17530gnus-group-make-warchive-group RET @var{an_egroup} RET egroups RET
17531www.egroups.com RET @var{your@@email.address} RET}. (Substitute the
17532@var{an_egroup} with the mailing list you subscribed, the
17533@var{your@@email.address} with your email address.), or to browse the
17534back end by @kbd{B nnwarchive RET mail-archive RET}.
17535
17536The following @code{nnwarchive} variables can be altered:
17537
17538@table @code
17539@item nnwarchive-directory
17540@vindex nnwarchive-directory
17541The directory where @code{nnwarchive} stores its files. The default is@*
17542@file{~/News/warchive/}.
17543
17544@item nnwarchive-login
17545@vindex nnwarchive-login
17546The account name on the web server.
17547
17548@item nnwarchive-passwd
17549@vindex nnwarchive-passwd
17550The password for your account on the web server.
17551@end table
17552
17553@node RSS
17554@subsection RSS
17555@cindex nnrss
17556@cindex RSS
17557
17558Some web sites have an RDF Site Summary (@acronym{RSS}).
17559@acronym{RSS} is a format for summarizing headlines from news related
17560sites (such as BBC or CNN). But basically anything list-like can be
17561presented as an @acronym{RSS} feed: weblogs, changelogs or recent
17562changes to a wiki (e.g. @url{http://cliki.net/recent-changes.rdf}).
17563
17564@acronym{RSS} has a quite regular and nice interface, and it's
17565possible to get the information Gnus needs to keep groups updated.
17566
17567Note: you had better use Emacs which supports the @code{utf-8} coding
17568system because @acronym{RSS} uses UTF-8 for encoding non-@acronym{ASCII}
17569text by default. It is also used by default for non-@acronym{ASCII}
17570group names.
17571
17572@kindex G R (Group)
17573Use @kbd{G R} from the group buffer to subscribe to a feed---you will be
17574prompted for the location, the title and the description of the feed.
17575The title, which allows any characters, will be used for the group name
17576and the name of the group data file. The description can be omitted.
17577
17578An easy way to get started with @code{nnrss} is to say something like
17579the following in the group buffer: @kbd{B nnrss RET RET y}, then
17580subscribe to groups.
17581
17582The @code{nnrss} back end saves the group data file in
17583@code{nnrss-directory} (see below) for each @code{nnrss} group. File
17584names containing non-@acronym{ASCII} characters will be encoded by the
17585coding system specified with the @code{nnmail-pathname-coding-system}
17586variable. If it is @code{nil}, in Emacs the coding system defaults to
17587the value of @code{default-file-name-coding-system}. If you are using
17588XEmacs and want to use non-@acronym{ASCII} group names, you should set
17589the value for the @code{nnmail-pathname-coding-system} variable properly.
17590
17591The @code{nnrss} back end generates @samp{multipart/alternative}
17592@acronym{MIME} articles in which each contains a @samp{text/plain} part
17593and a @samp{text/html} part.
17594
17595@cindex OPML
17596You can also use the following commands to import and export your
17597subscriptions from a file in @acronym{OPML} format (Outline Processor
17598Markup Language).
17599
17600@defun nnrss-opml-import file
17601Prompt for an @acronym{OPML} file, and subscribe to each feed in the
17602file.
17603@end defun
17604
17605@defun nnrss-opml-export
17606Write your current @acronym{RSS} subscriptions to a buffer in
17607@acronym{OPML} format.
17608@end defun
17609
17610The following @code{nnrss} variables can be altered:
17611
17612@table @code
17613@item nnrss-directory
17614@vindex nnrss-directory
17615The directory where @code{nnrss} stores its files. The default is
17616@file{~/News/rss/}.
17617
17618@item nnrss-file-coding-system
17619@vindex nnrss-file-coding-system
17620The coding system used when reading and writing the @code{nnrss} groups
17621data files. The default is the value of
17622@code{mm-universal-coding-system} (which defaults to @code{emacs-mule}
17623in Emacs or @code{escape-quoted} in XEmacs).
17624
01c52d31
MB
17625@item nnrss-ignore-article-fields
17626@vindex nnrss-ignore-article-fields
17627Some feeds update constantly article fields during their publications,
17628e.g. to indicate the number of comments. However, if there is
17629a difference between the local article and the distant one, the latter
17630is considered to be new. To avoid this and discard some fields, set this
17631variable to the list of fields to be ignored. The default is
17632@code{'(slash:comments)}.
17633
4009494e
GM
17634@item nnrss-use-local
17635@vindex nnrss-use-local
17636@findex nnrss-generate-download-script
17637If you set @code{nnrss-use-local} to @code{t}, @code{nnrss} will read
17638the feeds from local files in @code{nnrss-directory}. You can use
17639the command @code{nnrss-generate-download-script} to generate a
17640download script using @command{wget}.
17641
17642@item nnrss-wash-html-in-text-plain-parts
17643Non-@code{nil} means that @code{nnrss} renders text in @samp{text/plain}
17644parts as @acronym{HTML}. The function specified by the
17645@code{mm-text-html-renderer} variable (@pxref{Display Customization,
17646,Display Customization, emacs-mime, The Emacs MIME Manual}) will be used
17647to render text. If it is @code{nil}, which is the default, text will
17648simply be folded. Leave it @code{nil} if you prefer to see
17649@samp{text/html} parts.
17650@end table
17651
17652The following code may be helpful, if you want to show the description in
17653the summary buffer.
17654
17655@lisp
17656(add-to-list 'nnmail-extra-headers nnrss-description-field)
17657(setq gnus-summary-line-format "%U%R%z%I%(%[%4L: %-15,15f%]%) %s%uX\n")
17658
17659(defun gnus-user-format-function-X (header)
17660 (let ((descr
17661 (assq nnrss-description-field (mail-header-extra header))))
17662 (if descr (concat "\n\t" (cdr descr)) "")))
17663@end lisp
17664
17665The following code may be useful to open an nnrss url directly from the
17666summary buffer.
17667
17668@lisp
17669(require 'browse-url)
17670
01c52d31 17671(defun browse-nnrss-url (arg)
4009494e
GM
17672 (interactive "p")
17673 (let ((url (assq nnrss-url-field
17674 (mail-header-extra
17675 (gnus-data-header
17676 (assq (gnus-summary-article-number)
17677 gnus-newsgroup-data))))))
17678 (if url
17679 (progn
17680 (browse-url (cdr url))
17681 (gnus-summary-mark-as-read-forward 1))
17682 (gnus-summary-scroll-up arg))))
17683
17684(eval-after-load "gnus"
17685 #'(define-key gnus-summary-mode-map
17686 (kbd "<RET>") 'browse-nnrss-url))
17687(add-to-list 'nnmail-extra-headers nnrss-url-field)
17688@end lisp
17689
9b3ebcb6 17690Even if you have added @samp{text/html} to the
4009494e
GM
17691@code{mm-discouraged-alternatives} variable (@pxref{Display
17692Customization, ,Display Customization, emacs-mime, The Emacs MIME
17693Manual}) since you don't want to see @acronym{HTML} parts, it might be
17694more useful especially in @code{nnrss} groups to display
17695@samp{text/html} parts. Here's an example of setting
17696@code{mm-discouraged-alternatives} as a group parameter (@pxref{Group
17697Parameters}) in order to display @samp{text/html} parts only in
17698@code{nnrss} groups:
17699
17700@lisp
17701;; @r{Set the default value of @code{mm-discouraged-alternatives}.}
17702(eval-after-load "gnus-sum"
17703 '(add-to-list
17704 'gnus-newsgroup-variables
17705 '(mm-discouraged-alternatives
17706 . '("text/html" "image/.*"))))
17707
17708;; @r{Display @samp{text/html} parts in @code{nnrss} groups.}
17709(add-to-list
17710 'gnus-parameters
17711 '("\\`nnrss:" (mm-discouraged-alternatives nil)))
17712@end lisp
17713
17714
17715@node Customizing W3
17716@subsection Customizing W3
17717@cindex W3
17718@cindex html
17719@cindex url
17720@cindex Netscape
17721
17722Gnus uses the url library to fetch web pages and Emacs/W3 (or those
17723alternatives) to display web pages. Emacs/W3 is documented in its own
17724manual, but there are some things that may be more relevant for Gnus
17725users.
17726
17727For instance, a common question is how to make Emacs/W3 follow links
17728using the @code{browse-url} functions (which will call some external web
17729browser like Netscape). Here's one way:
17730
17731@lisp
17732(eval-after-load "w3"
17733 '(progn
17734 (fset 'w3-fetch-orig (symbol-function 'w3-fetch))
17735 (defun w3-fetch (&optional url target)
17736 (interactive (list (w3-read-url-with-default)))
17737 (if (eq major-mode 'gnus-article-mode)
17738 (browse-url url)
17739 (w3-fetch-orig url target)))))
17740@end lisp
17741
17742Put that in your @file{.emacs} file, and hitting links in W3-rendered
17743@acronym{HTML} in the Gnus article buffers will use @code{browse-url} to
17744follow the link.
17745
17746
17747@node IMAP
17748@section IMAP
17749@cindex nnimap
17750@cindex @acronym{IMAP}
17751
17752@acronym{IMAP} is a network protocol for reading mail (or news, or @dots{}),
17753think of it as a modernized @acronym{NNTP}. Connecting to a @acronym{IMAP}
17754server is much similar to connecting to a news server, you just
17755specify the network address of the server.
17756
17757@acronym{IMAP} has two properties. First, @acronym{IMAP} can do
17758everything that @acronym{POP} can, it can hence be viewed as a
17759@acronym{POP++}. Secondly, @acronym{IMAP} is a mail storage protocol,
17760similar to @acronym{NNTP} being a news storage protocol---however,
17761@acronym{IMAP} offers more features than @acronym{NNTP} because news
17762is more or less read-only whereas mail is read-write.
17763
17764If you want to use @acronym{IMAP} as a @acronym{POP++}, use an imap
17765entry in @code{mail-sources}. With this, Gnus will fetch mails from
17766the @acronym{IMAP} server and store them on the local disk. This is
17767not the usage described in this section---@xref{Mail Sources}.
17768
17769If you want to use @acronym{IMAP} as a mail storage protocol, use an nnimap
17770entry in @code{gnus-secondary-select-methods}. With this, Gnus will
17771manipulate mails stored on the @acronym{IMAP} server. This is the kind of
17772usage explained in this section.
17773
17774A server configuration in @file{~/.gnus.el} with a few @acronym{IMAP}
17775servers might look something like the following. (Note that for
17776@acronym{TLS}/@acronym{SSL}, you need external programs and libraries,
17777see below.)
17778
17779@lisp
17780(setq gnus-secondary-select-methods
17781 '((nnimap "simpleserver") ; @r{no special configuration}
17782 ; @r{perhaps a ssh port forwarded server:}
17783 (nnimap "dolk"
17784 (nnimap-address "localhost")
17785 (nnimap-server-port 1430))
17786 ; @r{a UW server running on localhost}
17787 (nnimap "barbar"
17788 (nnimap-server-port 143)
17789 (nnimap-address "localhost")
17790 (nnimap-list-pattern ("INBOX" "mail/*")))
17791 ; @r{anonymous public cyrus server:}
17792 (nnimap "cyrus.andrew.cmu.edu"
17793 (nnimap-authenticator anonymous)
17794 (nnimap-list-pattern "archive.*")
17795 (nnimap-stream network))
17796 ; @r{a ssl server on a non-standard port:}
17797 (nnimap "vic20"
17798 (nnimap-address "vic20.somewhere.com")
17799 (nnimap-server-port 9930)
17800 (nnimap-stream ssl))))
17801@end lisp
17802
17803After defining the new server, you can subscribe to groups on the
17804server using normal Gnus commands such as @kbd{U} in the Group Buffer
17805(@pxref{Subscription Commands}) or via the Server Buffer
17806(@pxref{Server Buffer}).
17807
17808The following variables can be used to create a virtual @code{nnimap}
17809server:
17810
17811@table @code
17812
17813@item nnimap-address
17814@vindex nnimap-address
17815
17816The address of the remote @acronym{IMAP} server. Defaults to the virtual
17817server name if not specified.
17818
17819@item nnimap-server-port
17820@vindex nnimap-server-port
17821Port on server to contact. Defaults to port 143, or 993 for @acronym{TLS}/@acronym{SSL}.
17822
17823Note that this should be an integer, example server specification:
17824
17825@lisp
17826(nnimap "mail.server.com"
17827 (nnimap-server-port 4711))
17828@end lisp
17829
17830@item nnimap-list-pattern
17831@vindex nnimap-list-pattern
17832String or list of strings of mailboxes to limit available groups to.
17833This is used when the server has very many mailboxes and you're only
17834interested in a few---some servers export your home directory via
17835@acronym{IMAP}, you'll probably want to limit the mailboxes to those in
17836@file{~/Mail/*} then.
17837
17838The string can also be a cons of REFERENCE and the string as above, what
17839REFERENCE is used for is server specific, but on the University of
17840Washington server it's a directory that will be concatenated with the
17841mailbox.
17842
17843Example server specification:
17844
17845@lisp
17846(nnimap "mail.server.com"
17847 (nnimap-list-pattern ("INBOX" "Mail/*" "alt.sex.*"
17848 ("~friend/Mail/" . "list/*"))))
17849@end lisp
17850
17851@item nnimap-stream
17852@vindex nnimap-stream
17853The type of stream used to connect to your server. By default, nnimap
17854will detect and automatically use all of the below, with the exception
17855of @acronym{TLS}/@acronym{SSL}. (@acronym{IMAP} over
17856@acronym{TLS}/@acronym{SSL} is being replaced by STARTTLS, which can
17857be automatically detected, but it's not widely deployed yet.)
17858
17859Example server specification:
17860
17861@lisp
17862(nnimap "mail.server.com"
17863 (nnimap-stream ssl))
17864@end lisp
17865
17866Please note that the value of @code{nnimap-stream} is a symbol!
17867
17868@itemize @bullet
17869@item
17870@dfn{gssapi:} Connect with GSSAPI (usually Kerberos 5). Requires the
17871@samp{gsasl} or @samp{imtest} program.
17872@item
17873@dfn{kerberos4:} Connect with Kerberos 4. Requires the @samp{imtest} program.
17874@item
17875@dfn{starttls:} Connect via the STARTTLS extension (similar to
17876@acronym{TLS}/@acronym{SSL}). Requires the external library @samp{starttls.el} and program
17877@samp{starttls}.
17878@item
17879@dfn{tls:} Connect through @acronym{TLS}. Requires GNUTLS (the program
17880@samp{gnutls-cli}).
17881@item
17882@dfn{ssl:} Connect through @acronym{SSL}. Requires OpenSSL (the program
17883@samp{openssl}) or SSLeay (@samp{s_client}).
17884@item
17885@dfn{shell:} Use a shell command to start @acronym{IMAP} connection.
17886@item
17887@dfn{network:} Plain, TCP/IP network connection.
17888@end itemize
17889
17890@vindex imap-kerberos4-program
17891The @samp{imtest} program is shipped with Cyrus IMAPD. If you're
17892using @samp{imtest} from Cyrus IMAPD < 2.0.14 (which includes version
178931.5.x and 1.6.x) you need to frob @code{imap-process-connection-type}
17894to make @code{imap.el} use a pty instead of a pipe when communicating
17895with @samp{imtest}. You will then suffer from a line length
17896restrictions on @acronym{IMAP} commands, which might make Gnus seem to hang
17897indefinitely if you have many articles in a mailbox. The variable
17898@code{imap-kerberos4-program} contain parameters to pass to the imtest
17899program.
17900
17901For @acronym{TLS} connection, the @code{gnutls-cli} program from GNUTLS is
17902needed. It is available from
17903@uref{http://www.gnu.org/software/gnutls/}.
17904
17905@vindex imap-gssapi-program
17906This parameter specifies a list of command lines that invoke a GSSAPI
17907authenticated @acronym{IMAP} stream in a subshell. They are tried
17908sequentially until a connection is made, or the list has been
17909exhausted. By default, @samp{gsasl} from GNU SASL, available from
17910@uref{http://www.gnu.org/software/gsasl/}, and the @samp{imtest}
17911program from Cyrus IMAPD (see @code{imap-kerberos4-program}), are
17912tried.
17913
17914@vindex imap-ssl-program
17915For @acronym{SSL} connections, the OpenSSL program is available from
17916@uref{http://www.openssl.org/}. OpenSSL was formerly known as SSLeay,
17917and nnimap support it too---although the most recent versions of
17918SSLeay, 0.9.x, are known to have serious bugs making it
17919useless. Earlier versions, especially 0.8.x, of SSLeay are known to
17920work. The variable @code{imap-ssl-program} contain parameters to pass
17921to OpenSSL/SSLeay.
17922
17923@vindex imap-shell-program
17924@vindex imap-shell-host
01c52d31
MB
17925For @acronym{IMAP} connections using the @code{shell} stream, the
17926variable @code{imap-shell-program} specify what program to call. Make
17927sure nothing is interfering with the output of the program, e.g., don't
17928forget to redirect the error output to the void.
4009494e
GM
17929
17930@item nnimap-authenticator
17931@vindex nnimap-authenticator
17932
17933The authenticator used to connect to the server. By default, nnimap
17934will use the most secure authenticator your server is capable of.
17935
17936Example server specification:
17937
17938@lisp
17939(nnimap "mail.server.com"
17940 (nnimap-authenticator anonymous))
17941@end lisp
17942
17943Please note that the value of @code{nnimap-authenticator} is a symbol!
17944
17945@itemize @bullet
17946@item
17947@dfn{gssapi:} GSSAPI (usually kerberos 5) authentication. Requires
17948external program @code{gsasl} or @code{imtest}.
17949@item
17950@dfn{kerberos4:} Kerberos 4 authentication. Requires external program
17951@code{imtest}.
17952@item
17953@dfn{digest-md5:} Encrypted username/password via DIGEST-MD5. Requires
17954external library @code{digest-md5.el}.
17955@item
17956@dfn{cram-md5:} Encrypted username/password via CRAM-MD5.
17957@item
17958@dfn{login:} Plain-text username/password via LOGIN.
17959@item
17960@dfn{anonymous:} Login as ``anonymous'', supplying your email address as password.
17961@end itemize
17962
17963@item nnimap-expunge-on-close
17964@cindex expunging
17965@vindex nnimap-expunge-on-close
17966Unlike Parmenides the @acronym{IMAP} designers have decided things that
17967don't exist actually do exist. More specifically, @acronym{IMAP} has
17968this concept of marking articles @code{Deleted} which doesn't actually
17969delete them, and this (marking them @code{Deleted}, that is) is what
17970nnimap does when you delete an article in Gnus (with @kbd{B DEL} or
17971similar).
17972
17973Since the articles aren't really removed when we mark them with the
17974@code{Deleted} flag we'll need a way to actually delete them. Feel like
17975running in circles yet?
17976
17977Traditionally, nnimap has removed all articles marked as @code{Deleted}
17978when closing a mailbox but this is now configurable by this server
17979variable.
17980
17981The possible options are:
17982
17983@table @code
17984
17985@item always
17986The default behavior, delete all articles marked as ``Deleted'' when
17987closing a mailbox.
17988@item never
17989Never actually delete articles. Currently there is no way of showing
17990the articles marked for deletion in nnimap, but other @acronym{IMAP} clients
17991may allow you to do this. If you ever want to run the EXPUNGE command
17992manually, @xref{Expunging mailboxes}.
17993@item ask
17994When closing mailboxes, nnimap will ask if you wish to expunge deleted
17995articles or not.
17996
17997@end table
17998
17999@item nnimap-importantize-dormant
18000@vindex nnimap-importantize-dormant
18001
18002If non-@code{nil} (the default), marks dormant articles as ticked (as
18003well), for other @acronym{IMAP} clients. Within Gnus, dormant articles will
18004naturally still (only) be marked as dormant. This is to make dormant
18005articles stand out, just like ticked articles, in other @acronym{IMAP}
18006clients. (In other words, Gnus has two ``Tick'' marks and @acronym{IMAP}
18007has only one.)
18008
18009Probably the only reason for frobbing this would be if you're trying
18010enable per-user persistent dormant flags, using something like:
18011
18012@lisp
18013(setcdr (assq 'dormant nnimap-mark-to-flag-alist)
18014 (format "gnus-dormant-%s" (user-login-name)))
18015(setcdr (assq 'dormant nnimap-mark-to-predicate-alist)
18016 (format "KEYWORD gnus-dormant-%s" (user-login-name)))
18017@end lisp
18018
18019In this case, you would not want the per-user dormant flag showing up
18020as ticked for other users.
18021
18022@item nnimap-expunge-search-string
18023@cindex expunging
18024@vindex nnimap-expunge-search-string
18025@cindex expiring @acronym{IMAP} mail
18026
18027This variable contain the @acronym{IMAP} search command sent to server when
18028searching for articles eligible for expiring. The default is
18029@code{"UID %s NOT SINCE %s"}, where the first @code{%s} is replaced by
18030UID set and the second @code{%s} is replaced by a date.
18031
18032Probably the only useful value to change this to is
18033@code{"UID %s NOT SENTSINCE %s"}, which makes nnimap use the Date: in
18034messages instead of the internal article date. See section 6.4.4 of
18035RFC 2060 for more information on valid strings.
18036
18037However, if @code{nnimap-search-uids-not-since-is-evil}
18038is true, this variable has no effect since the search logic
18039is reversed, as described below.
18040
18041@item nnimap-authinfo-file
18042@vindex nnimap-authinfo-file
18043
18044A file containing credentials used to log in on servers. The format is
18045(almost) the same as the @code{ftp} @file{~/.netrc} file. See the
18046variable @code{nntp-authinfo-file} for exact syntax; also see
18047@ref{NNTP}. An example of an .authinfo line for an IMAP server, is:
18048
18049@example
18050machine students.uio.no login larsi password geheimnis port imap
18051@end example
18052
18053Note that it should be @code{port imap}, or @code{port 143}, if you
18054use a @code{nnimap-stream} of @code{tls} or @code{ssl}, even if the
18055actual port number used is port 993 for secured IMAP. For
18056convenience, Gnus will accept @code{port imaps} as a synonym of
18057@code{port imap}.
18058
18059@item nnimap-need-unselect-to-notice-new-mail
18060@vindex nnimap-need-unselect-to-notice-new-mail
18061
18062Unselect mailboxes before looking for new mail in them. Some servers
18063seem to need this under some circumstances; it was reported that
18064Courier 1.7.1 did.
18065
18066@item nnimap-nov-is-evil
18067@vindex nnimap-nov-is-evil
18068@cindex Courier @acronym{IMAP} server
18069@cindex @acronym{NOV}
18070
18071Never generate or use a local @acronym{NOV} database. Defaults to the
18072value of @code{gnus-agent}.
18073
18074Using a @acronym{NOV} database usually makes header fetching much
18075faster, but it uses the @code{UID SEARCH UID} command, which is very
18076slow on some servers (notably some versions of Courier). Since the Gnus
18077Agent caches the information in the @acronym{NOV} database without using
18078the slow command, this variable defaults to true if the Agent is in use,
18079and false otherwise.
18080
18081@item nnimap-search-uids-not-since-is-evil
18082@vindex nnimap-search-uids-not-since-is-evil
18083@cindex Courier @acronym{IMAP} server
18084@cindex expiring @acronym{IMAP} mail
18085
18086Avoid the @code{UID SEARCH UID @var{message numbers} NOT SINCE
18087@var{date}} command, which is slow on some @acronym{IMAP} servers
18088(notably, some versions of Courier). Instead, use @code{UID SEARCH SINCE
18089@var{date}} and prune the list of expirable articles within Gnus.
18090
18091When Gnus expires your mail (@pxref{Expiring Mail}), it starts with a
18092list of expirable articles and asks the IMAP server questions like ``Of
18093these articles, which ones are older than a week?'' While this seems
18094like a perfectly reasonable question, some IMAP servers take a long time
18095to answer it, since they seemingly go looking into every old article to
18096see if it is one of the expirable ones. Curiously, the question ``Of
18097@emph{all} articles, which ones are newer than a week?'' seems to be
18098much faster to answer, so setting this variable causes Gnus to ask this
18099question and figure out the answer to the real question itself.
18100
18101This problem can really sneak up on you: when you first configure Gnus,
18102everything works fine, but once you accumulate a couple thousand
18103messages, you start cursing Gnus for being so slow. On the other hand,
18104if you get a lot of email within a week, setting this variable will
18105cause a lot of network traffic between Gnus and the IMAP server.
18106
01c52d31
MB
18107@item nnimap-logout-timeout
18108@vindex nnimap-logout-timeout
18109
18110There is a case where a connection to a @acronym{IMAP} server is unable
18111to close, when connecting to the server via a certain kind of network,
18112e.g. @acronym{VPN}. In that case, it will be observed that a connection
18113between Emacs and the local network looks alive even if the server has
18114closed a connection for some reason (typically, a timeout).
18115Consequently, Emacs continues waiting for a response from the server for
18116the @code{LOGOUT} command that Emacs sent, or hangs in other words. If
18117you are in such a network, setting this variable to a number of seconds
18118will be helpful. If it is set, a hung connection will be closed
18119forcibly, after this number of seconds from the time Emacs sends the
18120@code{LOGOUT} command. It should not be too small value but too large
18121value will be inconvenient too. Perhaps the value 1.0 will be a good
18122candidate but it might be worth trying some other values.
18123
18124Example server specification:
18125
18126@lisp
18127(nnimap "mail.server.com"
18128 (nnimap-logout-timeout 1.0))
18129@end lisp
18130
4009494e
GM
18131@end table
18132
18133@menu
18134* Splitting in IMAP:: Splitting mail with nnimap.
18135* Expiring in IMAP:: Expiring mail with nnimap.
18136* Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox.
18137* Expunging mailboxes:: Equivalent of a ``compress mailbox'' button.
18138* A note on namespaces:: How to (not) use @acronym{IMAP} namespace in Gnus.
18139* Debugging IMAP:: What to do when things don't work.
18140@end menu
18141
18142
18143
18144@node Splitting in IMAP
18145@subsection Splitting in IMAP
18146@cindex splitting imap mail
18147
18148Splitting is something Gnus users have loved and used for years, and now
18149the rest of the world is catching up. Yeah, dream on, not many
18150@acronym{IMAP} servers have server side splitting and those that have
18151splitting seem to use some non-standard protocol. This means that
18152@acronym{IMAP} support for Gnus has to do its own splitting.
18153
18154And it does.
18155
18156(Incidentally, people seem to have been dreaming on, and Sieve has
18157gaining a market share and is supported by several IMAP servers.
18158Fortunately, Gnus support it too, @xref{Sieve Commands}.)
18159
18160Here are the variables of interest:
18161
18162@table @code
18163
18164@item nnimap-split-crosspost
18165@cindex splitting, crosspost
18166@cindex crosspost
18167@vindex nnimap-split-crosspost
18168
18169If non-@code{nil}, do crossposting if several split methods match the
18170mail. If @code{nil}, the first match in @code{nnimap-split-rule}
18171found will be used.
18172
18173Nnmail equivalent: @code{nnmail-crosspost}.
18174
18175@item nnimap-split-inbox
18176@cindex splitting, inbox
18177@cindex inbox
18178@vindex nnimap-split-inbox
18179
18180A string or a list of strings that gives the name(s) of @acronym{IMAP}
18181mailboxes to split from. Defaults to @code{nil}, which means that
18182splitting is disabled!
18183
18184@lisp
18185(setq nnimap-split-inbox
18186 '("INBOX" ("~/friend/Mail" . "lists/*") "lists.imap"))
18187@end lisp
18188
18189No nnmail equivalent.
18190
18191@item nnimap-split-rule
18192@cindex splitting, rules
18193@vindex nnimap-split-rule
18194
18195New mail found in @code{nnimap-split-inbox} will be split according to
18196this variable.
18197
18198This variable contains a list of lists, where the first element in the
18199sublist gives the name of the @acronym{IMAP} mailbox to move articles
18200matching the regexp in the second element in the sublist. Got that?
18201Neither did I, we need examples.
18202
18203@lisp
18204(setq nnimap-split-rule
18205 '(("INBOX.nnimap"
18206 "^Sender: owner-nnimap@@vic20.globalcom.se")
18207 ("INBOX.junk" "^Subject:.*MAKE MONEY")
18208 ("INBOX.private" "")))
18209@end lisp
18210
18211This will put all articles from the nnimap mailing list into mailbox
18212INBOX.nnimap, all articles containing MAKE MONEY in the Subject: line
18213into INBOX.junk and everything else in INBOX.private.
18214
18215The first string may contain @samp{\\1} forms, like the ones used by
18216replace-match to insert sub-expressions from the matched text. For
18217instance:
18218
18219@lisp
18220("INBOX.lists.\\1" "^Sender: owner-\\([a-z-]+\\)@@")
18221@end lisp
18222
18223The first element can also be the symbol @code{junk} to indicate that
18224matching messages should simply be deleted. Use with care.
18225
18226The second element can also be a function. In that case, it will be
18227called with the first element of the rule as the argument, in a buffer
18228containing the headers of the article. It should return a
18229non-@code{nil} value if it thinks that the mail belongs in that group.
18230
18231Nnmail users might recollect that the last regexp had to be empty to
18232match all articles (like in the example above). This is not required in
18233nnimap. Articles not matching any of the regexps will not be moved out
18234of your inbox. (This might affect performance if you keep lots of
18235unread articles in your inbox, since the splitting code would go over
18236them every time you fetch new mail.)
18237
18238These rules are processed from the beginning of the alist toward the
18239end. The first rule to make a match will ``win'', unless you have
18240crossposting enabled. In that case, all matching rules will ``win''.
18241
18242This variable can also have a function as its value, the function will
18243be called with the headers narrowed and should return a group where it
18244thinks the article should be split to. See @code{nnimap-split-fancy}.
18245
18246The splitting code tries to create mailboxes if it needs to.
18247
18248To allow for different split rules on different virtual servers, and
18249even different split rules in different inboxes on the same server,
18250the syntax of this variable have been extended along the lines of:
18251
18252@lisp
18253(setq nnimap-split-rule
18254 '(("my1server" (".*" (("ding" "ding@@gnus.org")
18255 ("junk" "From:.*Simon"))))
18256 ("my2server" ("INBOX" nnimap-split-fancy))
18257 ("my[34]server" (".*" (("private" "To:.*Simon")
18258 ("junk" my-junk-func))))))
18259@end lisp
18260
18261The virtual server name is in fact a regexp, so that the same rules
18262may apply to several servers. In the example, the servers
18263@code{my3server} and @code{my4server} both use the same rules.
18264Similarly, the inbox string is also a regexp. The actual splitting
18265rules are as before, either a function, or a list with group/regexp or
18266group/function elements.
18267
18268Nnmail equivalent: @code{nnmail-split-methods}.
18269
18270@item nnimap-split-predicate
18271@cindex splitting
18272@vindex nnimap-split-predicate
18273
18274Mail matching this predicate in @code{nnimap-split-inbox} will be
18275split, it is a string and the default is @samp{UNSEEN UNDELETED}.
18276
18277This might be useful if you use another @acronym{IMAP} client to read mail in
18278your inbox but would like Gnus to split all articles in the inbox
18279regardless of readedness. Then you might change this to
18280@samp{UNDELETED}.
18281
18282@item nnimap-split-fancy
18283@cindex splitting, fancy
18284@findex nnimap-split-fancy
18285@vindex nnimap-split-fancy
18286
18287It's possible to set @code{nnimap-split-rule} to
18288@code{nnmail-split-fancy} if you want to use fancy
18289splitting. @xref{Fancy Mail Splitting}.
18290
18291However, to be able to have different fancy split rules for nnmail and
18292nnimap back ends you can set @code{nnimap-split-rule} to
18293@code{nnimap-split-fancy} and define the nnimap specific fancy split
18294rule in @code{nnimap-split-fancy}.
18295
18296Example:
18297
18298@lisp
18299(setq nnimap-split-rule 'nnimap-split-fancy
18300 nnimap-split-fancy ...)
18301@end lisp
18302
18303Nnmail equivalent: @code{nnmail-split-fancy}.
18304
18305@item nnimap-split-download-body
18306@findex nnimap-split-download-body
18307@vindex nnimap-split-download-body
18308
18309Set to non-@code{nil} to download entire articles during splitting.
18310This is generally not required, and will slow things down
18311considerably. You may need it if you want to use an advanced
18312splitting function that analyzes the body to split the article.
18313
18314@end table
18315
18316@node Expiring in IMAP
18317@subsection Expiring in IMAP
18318@cindex expiring @acronym{IMAP} mail
18319
18320Even though @code{nnimap} is not a proper @code{nnmail} derived back
18321end, it supports most features in regular expiring (@pxref{Expiring
18322Mail}). Unlike splitting in @acronym{IMAP} (@pxref{Splitting in
18323IMAP}) it does not clone the @code{nnmail} variables (i.e., creating
18324@var{nnimap-expiry-wait}) but reuse the @code{nnmail} variables. What
18325follows below are the variables used by the @code{nnimap} expiry
18326process.
18327
18328A note on how the expire mark is stored on the @acronym{IMAP} server is
18329appropriate here as well. The expire mark is translated into a
18330@code{imap} client specific mark, @code{gnus-expire}, and stored on the
18331message. This means that likely only Gnus will understand and treat
18332the @code{gnus-expire} mark properly, although other clients may allow
18333you to view client specific flags on the message. It also means that
18334your server must support permanent storage of client specific flags on
18335messages. Most do, fortunately.
18336
18337If expiring @acronym{IMAP} mail seems very slow, try setting the server
18338variable @code{nnimap-search-uids-not-since-is-evil}.
18339
18340@table @code
18341
18342@item nnmail-expiry-wait
18343@item nnmail-expiry-wait-function
18344
18345These variables are fully supported. The expire value can be a
18346number, the symbol @code{immediate} or @code{never}.
18347
18348@item nnmail-expiry-target
18349
18350This variable is supported, and internally implemented by calling the
18351@code{nnmail} functions that handle this. It contains an optimization
18352that if the destination is a @acronym{IMAP} group on the same server, the
18353article is copied instead of appended (that is, uploaded again).
18354
18355@end table
18356
18357@node Editing IMAP ACLs
18358@subsection Editing IMAP ACLs
18359@cindex editing imap acls
18360@cindex Access Control Lists
18361@cindex Editing @acronym{IMAP} ACLs
18362@kindex G l (Group)
18363@findex gnus-group-nnimap-edit-acl
18364
18365ACL stands for Access Control List. ACLs are used in @acronym{IMAP} for
18366limiting (or enabling) other users access to your mail boxes. Not all
18367@acronym{IMAP} servers support this, this function will give an error if it
18368doesn't.
18369
18370To edit an ACL for a mailbox, type @kbd{G l}
18371(@code{gnus-group-edit-nnimap-acl}) and you'll be presented with an ACL
18372editing window with detailed instructions.
18373
18374Some possible uses:
18375
18376@itemize @bullet
18377@item
18378Giving ``anyone'' the ``lrs'' rights (lookup, read, keep seen/unseen flags)
18379on your mailing list mailboxes enables other users on the same server to
18380follow the list without subscribing to it.
18381@item
18382At least with the Cyrus server, you are required to give the user
18383``anyone'' posting ("p") capabilities to have ``plussing'' work (that is,
18384mail sent to user+mailbox@@domain ending up in the @acronym{IMAP} mailbox
18385INBOX.mailbox).
18386@end itemize
18387
18388@node Expunging mailboxes
18389@subsection Expunging mailboxes
18390@cindex expunging
18391
18392@cindex expunge
18393@cindex manual expunging
18394@kindex G x (Group)
18395@findex gnus-group-nnimap-expunge
18396
18397If you're using the @code{never} setting of @code{nnimap-expunge-on-close},
18398you may want the option of expunging all deleted articles in a mailbox
18399manually. This is exactly what @kbd{G x} does.
18400
18401Currently there is no way of showing deleted articles, you can just
18402delete them.
18403
18404@node A note on namespaces
18405@subsection A note on namespaces
18406@cindex IMAP namespace
18407@cindex namespaces
18408
18409The @acronym{IMAP} protocol has a concept called namespaces, described
18410by the following text in the RFC2060:
18411
18412@display
184135.1.2. Mailbox Namespace Naming Convention
18414
18415 By convention, the first hierarchical element of any mailbox name
18416 which begins with "#" identifies the "namespace" of the remainder of
18417 the name. This makes it possible to disambiguate between different
18418 types of mailbox stores, each of which have their own namespaces.
18419
18420 For example, implementations which offer access to USENET
18421 newsgroups MAY use the "#news" namespace to partition the USENET
18422 newsgroup namespace from that of other mailboxes. Thus, the
18423 comp.mail.misc newsgroup would have an mailbox name of
18424 "#news.comp.mail.misc", and the name "comp.mail.misc" could refer
18425 to a different object (e.g. a user's private mailbox).
18426@end display
18427
18428While there is nothing in this text that warrants concern for the
18429@acronym{IMAP} implementation in Gnus, some servers use namespace
18430prefixes in a way that does not work with how Gnus uses mailbox names.
18431
18432Specifically, University of Washington's @acronym{IMAP} server uses
18433mailbox names like @code{#driver.mbx/read-mail} which are valid only
18434in the @sc{create} and @sc{append} commands. After the mailbox is
18435created (or a messages is appended to a mailbox), it must be accessed
18436without the namespace prefix, i.e. @code{read-mail}. Since Gnus do
18437not make it possible for the user to guarantee that user entered
18438mailbox names will only be used with the CREATE and APPEND commands,
18439you should simply not use the namespace prefixed mailbox names in
18440Gnus.
18441
18442See the UoW IMAPD documentation for the @code{#driver.*/} prefix
18443for more information on how to use the prefixes. They are a power
18444tool and should be used only if you are sure what the effects are.
18445
18446@node Debugging IMAP
18447@subsection Debugging IMAP
18448@cindex IMAP debugging
18449@cindex protocol dump (IMAP)
18450
18451@acronym{IMAP} is a complex protocol, more so than @acronym{NNTP} or
18452@acronym{POP3}. Implementation bugs are not unlikely, and we do our
18453best to fix them right away. If you encounter odd behavior, chances
18454are that either the server or Gnus is buggy.
18455
18456If you are familiar with network protocols in general, you will
18457probably be able to extract some clues from the protocol dump of the
18458exchanges between Gnus and the server. Even if you are not familiar
18459with network protocols, when you include the protocol dump in
18460@acronym{IMAP}-related bug reports you are helping us with data
18461critical to solving the problem. Therefore, we strongly encourage you
18462to include the protocol dump when reporting IMAP bugs in Gnus.
18463
18464
18465@vindex imap-log
18466Because the protocol dump, when enabled, generates lots of data, it is
18467disabled by default. You can enable it by setting @code{imap-log} as
18468follows:
18469
18470@lisp
18471(setq imap-log t)
18472@end lisp
18473
18474This instructs the @code{imap.el} package to log any exchanges with
18475the server. The log is stored in the buffer @samp{*imap-log*}. Look
18476for error messages, which sometimes are tagged with the keyword
18477@code{BAD}---but when submitting a bug, make sure to include all the
18478data.
18479
18480@node Other Sources
18481@section Other Sources
18482
18483Gnus can do more than just read news or mail. The methods described
18484below allow Gnus to view directories and files as if they were
18485newsgroups.
18486
18487@menu
18488* Directory Groups:: You can read a directory as if it was a newsgroup.
18489* Anything Groups:: Dired? Who needs dired?
18490* Document Groups:: Single files can be the basis of a group.
18491* SOUP:: Reading @sc{soup} packets ``offline''.
18492* Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
18493@end menu
18494
18495
18496@node Directory Groups
18497@subsection Directory Groups
18498@cindex nndir
18499@cindex directory groups
18500
18501If you have a directory that has lots of articles in separate files in
18502it, you might treat it as a newsgroup. The files have to have numerical
18503names, of course.
18504
18505This might be an opportune moment to mention @code{ange-ftp} (and its
18506successor @code{efs}), that most wonderful of all wonderful Emacs
18507packages. When I wrote @code{nndir}, I didn't think much about it---a
18508back end to read directories. Big deal.
18509
18510@code{ange-ftp} changes that picture dramatically. For instance, if you
18511enter the @code{ange-ftp} file name
18512@file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the directory name,
18513@code{ange-ftp} or @code{efs} will actually allow you to read this
18514directory over at @samp{sina} as a newsgroup. Distributed news ahoy!
18515
18516@code{nndir} will use @acronym{NOV} files if they are present.
18517
18518@code{nndir} is a ``read-only'' back end---you can't delete or expire
18519articles with this method. You can use @code{nnmh} or @code{nnml} for
18520whatever you use @code{nndir} for, so you could switch to any of those
18521methods if you feel the need to have a non-read-only @code{nndir}.
18522
18523
18524@node Anything Groups
18525@subsection Anything Groups
18526@cindex nneething
18527
18528From the @code{nndir} back end (which reads a single spool-like
18529directory), it's just a hop and a skip to @code{nneething}, which
18530pretends that any arbitrary directory is a newsgroup. Strange, but
18531true.
18532
18533When @code{nneething} is presented with a directory, it will scan this
18534directory and assign article numbers to each file. When you enter such
18535a group, @code{nneething} must create ``headers'' that Gnus can use.
18536After all, Gnus is a newsreader, in case you're forgetting.
18537@code{nneething} does this in a two-step process. First, it snoops each
18538file in question. If the file looks like an article (i.e., the first
18539few lines look like headers), it will use this as the head. If this is
18540just some arbitrary file without a head (e.g. a C source file),
18541@code{nneething} will cobble up a header out of thin air. It will use
18542file ownership, name and date and do whatever it can with these
18543elements.
18544
18545All this should happen automatically for you, and you will be presented
18546with something that looks very much like a newsgroup. Totally like a
18547newsgroup, to be precise. If you select an article, it will be displayed
18548in the article buffer, just as usual.
18549
18550If you select a line that represents a directory, Gnus will pop you into
18551a new summary buffer for this @code{nneething} group. And so on. You can
18552traverse the entire disk this way, if you feel like, but remember that
18553Gnus is not dired, really, and does not intend to be, either.
18554
18555There are two overall modes to this action---ephemeral or solid. When
18556doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus
18557will not store information on what files you have read, and what files
18558are new, and so on. If you create a solid @code{nneething} group the
18559normal way with @kbd{G m}, Gnus will store a mapping table between
18560article numbers and file names, and you can treat this group like any
18561other groups. When you activate a solid @code{nneething} group, you will
18562be told how many unread articles it contains, etc., etc.
18563
18564Some variables:
18565
18566@table @code
18567@item nneething-map-file-directory
18568@vindex nneething-map-file-directory
18569All the mapping files for solid @code{nneething} groups will be stored
18570in this directory, which defaults to @file{~/.nneething/}.
18571
18572@item nneething-exclude-files
18573@vindex nneething-exclude-files
18574All files that match this regexp will be ignored. Nice to use to exclude
18575auto-save files and the like, which is what it does by default.
18576
18577@item nneething-include-files
18578@vindex nneething-include-files
18579Regexp saying what files to include in the group. If this variable is
18580non-@code{nil}, only files matching this regexp will be included.
18581
18582@item nneething-map-file
18583@vindex nneething-map-file
18584Name of the map files.
18585@end table
18586
18587
18588@node Document Groups
18589@subsection Document Groups
18590@cindex nndoc
18591@cindex documentation group
18592@cindex help group
18593
18594@code{nndoc} is a cute little thing that will let you read a single file
18595as a newsgroup. Several files types are supported:
18596
18597@table @code
18598@cindex Babyl
18599@cindex Rmail mbox
18600@item babyl
18601The Babyl (Rmail) mail box.
18602
18603@cindex mbox
18604@cindex Unix mbox
18605@item mbox
18606The standard Unix mbox file.
18607
18608@cindex MMDF mail box
18609@item mmdf
18610The MMDF mail box format.
18611
18612@item news
18613Several news articles appended into a file.
18614
18615@cindex rnews batch files
18616@item rnews
18617The rnews batch transport format.
18618
18619@item nsmail
18620Netscape mail boxes.
18621
18622@item mime-parts
18623@acronym{MIME} multipart messages.
18624
18625@item standard-digest
18626The standard (RFC 1153) digest format.
18627
18628@item mime-digest
18629A @acronym{MIME} digest of messages.
18630
18631@item lanl-gov-announce
18632Announcement messages from LANL Gov Announce.
18633
18634@cindex forwarded messages
18635@item rfc822-forward
18636A message forwarded according to RFC822.
18637
18638@item outlook
18639The Outlook mail box.
18640
18641@item oe-dbx
18642The Outlook Express dbx mail box.
18643
18644@item exim-bounce
18645A bounce message from the Exim MTA.
18646
18647@item forward
18648A message forwarded according to informal rules.
18649
18650@item rfc934
18651An RFC934-forwarded message.
18652
18653@item mailman
18654A mailman digest.
18655
18656@item clari-briefs
18657A digest of Clarinet brief news items.
18658
18659@item slack-digest
18660Non-standard digest format---matches most things, but does it badly.
18661
18662@item mail-in-mail
18663The last resort.
18664@end table
18665
18666You can also use the special ``file type'' @code{guess}, which means
18667that @code{nndoc} will try to guess what file type it is looking at.
18668@code{digest} means that @code{nndoc} should guess what digest type the
18669file is.
18670
18671@code{nndoc} will not try to change the file or insert any extra headers into
18672it---it will simply, like, let you use the file as the basis for a
18673group. And that's it.
18674
18675If you have some old archived articles that you want to insert into your
18676new & spiffy Gnus mail back end, @code{nndoc} can probably help you with
18677that. Say you have an old @file{RMAIL} file with mail that you now want
18678to split into your new @code{nnml} groups. You look at that file using
18679@code{nndoc} (using the @kbd{G f} command in the group buffer
18680(@pxref{Foreign Groups})), set the process mark on all the articles in
18681the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r})
18682using @code{nnml}. If all goes well, all the mail in the @file{RMAIL}
18683file is now also stored in lots of @code{nnml} directories, and you can
18684delete that pesky @file{RMAIL} file. If you have the guts!
18685
18686Virtual server variables:
18687
18688@table @code
18689@item nndoc-article-type
18690@vindex nndoc-article-type
18691This should be one of @code{mbox}, @code{babyl}, @code{digest},
18692@code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
18693@code{rfc822-forward}, @code{mime-parts}, @code{standard-digest},
18694@code{slack-digest}, @code{clari-briefs}, @code{nsmail}, @code{outlook},
18695@code{oe-dbx}, @code{mailman}, and @code{mail-in-mail} or @code{guess}.
18696
18697@item nndoc-post-type
18698@vindex nndoc-post-type
18699This variable says whether Gnus is to consider the group a news group or
18700a mail group. There are two valid values: @code{mail} (the default)
18701and @code{news}.
18702@end table
18703
18704@menu
18705* Document Server Internals:: How to add your own document types.
18706@end menu
18707
18708
18709@node Document Server Internals
18710@subsubsection Document Server Internals
18711
18712Adding new document types to be recognized by @code{nndoc} isn't
18713difficult. You just have to whip up a definition of what the document
18714looks like, write a predicate function to recognize that document type,
18715and then hook into @code{nndoc}.
18716
18717First, here's an example document type definition:
18718
18719@example
18720(mmdf
18721 (article-begin . "^\^A\^A\^A\^A\n")
18722 (body-end . "^\^A\^A\^A\^A\n"))
18723@end example
18724
18725The definition is simply a unique @dfn{name} followed by a series of
18726regexp pseudo-variable settings. Below are the possible
18727variables---don't be daunted by the number of variables; most document
18728types can be defined with very few settings:
18729
18730@table @code
18731@item first-article
18732If present, @code{nndoc} will skip past all text until it finds
18733something that match this regexp. All text before this will be
18734totally ignored.
18735
18736@item article-begin
18737This setting has to be present in all document type definitions. It
18738says what the beginning of each article looks like. To do more
18739complicated things that cannot be dealt with a simple regexp, you can
18740use @code{article-begin-function} instead of this.
18741
18742@item article-begin-function
18743If present, this should be a function that moves point to the beginning
18744of each article. This setting overrides @code{article-begin}.
18745
18746@item head-begin
18747If present, this should be a regexp that matches the head of the
18748article. To do more complicated things that cannot be dealt with a
18749simple regexp, you can use @code{head-begin-function} instead of this.
18750
18751@item head-begin-function
18752If present, this should be a function that moves point to the head of
18753the article. This setting overrides @code{head-begin}.
18754
18755@item head-end
18756This should match the end of the head of the article. It defaults to
18757@samp{^$}---the empty line.
18758
18759@item body-begin
18760This should match the beginning of the body of the article. It defaults
18761to @samp{^\n}. To do more complicated things that cannot be dealt with
18762a simple regexp, you can use @code{body-begin-function} instead of this.
18763
18764@item body-begin-function
18765If present, this function should move point to the beginning of the body
18766of the article. This setting overrides @code{body-begin}.
18767
18768@item body-end
18769If present, this should match the end of the body of the article. To do
18770more complicated things that cannot be dealt with a simple regexp, you
18771can use @code{body-end-function} instead of this.
18772
18773@item body-end-function
18774If present, this function should move point to the end of the body of
18775the article. This setting overrides @code{body-end}.
18776
18777@item file-begin
18778If present, this should match the beginning of the file. All text
18779before this regexp will be totally ignored.
18780
18781@item file-end
18782If present, this should match the end of the file. All text after this
18783regexp will be totally ignored.
18784
18785@end table
18786
18787So, using these variables @code{nndoc} is able to dissect a document
18788file into a series of articles, each with a head and a body. However, a
18789few more variables are needed since not all document types are all that
18790news-like---variables needed to transform the head or the body into
18791something that's palatable for Gnus:
18792
18793@table @code
18794@item prepare-body-function
18795If present, this function will be called when requesting an article. It
18796will be called with point at the start of the body, and is useful if the
18797document has encoded some parts of its contents.
18798
18799@item article-transform-function
18800If present, this function is called when requesting an article. It's
18801meant to be used for more wide-ranging transformation of both head and
18802body of the article.
18803
18804@item generate-head-function
18805If present, this function is called to generate a head that Gnus can
18806understand. It is called with the article number as a parameter, and is
18807expected to generate a nice head for the article in question. It is
18808called when requesting the headers of all articles.
18809
18810@item generate-article-function
18811If present, this function is called to generate an entire article that
18812Gnus can understand. It is called with the article number as a
18813parameter when requesting all articles.
18814
18815@item dissection-function
18816If present, this function is called to dissect a document by itself,
18817overriding @code{first-article}, @code{article-begin},
18818@code{article-begin-function}, @code{head-begin},
18819@code{head-begin-function}, @code{head-end}, @code{body-begin},
18820@code{body-begin-function}, @code{body-end}, @code{body-end-function},
18821@code{file-begin}, and @code{file-end}.
18822
18823@end table
18824
18825Let's look at the most complicated example I can come up with---standard
18826digests:
18827
18828@example
18829(standard-digest
18830 (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+"))
18831 (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+"))
18832 (prepare-body-function . nndoc-unquote-dashes)
18833 (body-end-function . nndoc-digest-body-end)
18834 (head-end . "^ ?$")
18835 (body-begin . "^ ?\n")
18836 (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
18837 (subtype digest guess))
18838@end example
18839
18840We see that all text before a 70-width line of dashes is ignored; all
18841text after a line that starts with that @samp{^End of} is also ignored;
18842each article begins with a 30-width line of dashes; the line separating
18843the head from the body may contain a single space; and that the body is
18844run through @code{nndoc-unquote-dashes} before being delivered.
18845
18846To hook your own document definition into @code{nndoc}, use the
18847@code{nndoc-add-type} function. It takes two parameters---the first
18848is the definition itself and the second (optional) parameter says
18849where in the document type definition alist to put this definition.
18850The alist is traversed sequentially, and
18851@code{nndoc-@var{type}-type-p} is called for a given type @var{type}.
18852So @code{nndoc-mmdf-type-p} is called to see whether a document is of
18853@code{mmdf} type, and so on. These type predicates should return
18854@code{nil} if the document is not of the correct type; @code{t} if it
18855is of the correct type; and a number if the document might be of the
18856correct type. A high number means high probability; a low number
18857means low probability with @samp{0} being the lowest valid number.
18858
18859
18860@node SOUP
18861@subsection SOUP
18862@cindex SOUP
18863@cindex offline
18864
18865In the PC world people often talk about ``offline'' newsreaders. These
18866are thingies that are combined reader/news transport monstrosities.
18867With built-in modem programs. Yecchh!
18868
18869Of course, us Unix Weenie types of human beans use things like
18870@code{uucp} and, like, @code{nntpd} and set up proper news and mail
18871transport things like Ghod intended. And then we just use normal
18872newsreaders.
18873
18874However, it can sometimes be convenient to do something that's a bit
18875easier on the brain if you have a very slow modem, and you're not really
18876that interested in doing things properly.
18877
18878A file format called @sc{soup} has been developed for transporting news
18879and mail from servers to home machines and back again. It can be a bit
18880fiddly.
18881
18882First some terminology:
18883
18884@table @dfn
18885
18886@item server
18887This is the machine that is connected to the outside world and where you
18888get news and/or mail from.
18889
18890@item home machine
18891This is the machine that you want to do the actual reading and responding
18892on. It is typically not connected to the rest of the world in any way.
18893
18894@item packet
18895Something that contains messages and/or commands. There are two kinds
18896of packets:
18897
18898@table @dfn
18899@item message packets
18900These are packets made at the server, and typically contain lots of
18901messages for you to read. These are called @file{SoupoutX.tgz} by
18902default, where @var{x} is a number.
18903
18904@item response packets
18905These are packets made at the home machine, and typically contains
18906replies that you've written. These are called @file{SoupinX.tgz} by
18907default, where @var{x} is a number.
18908
18909@end table
18910
18911@end table
18912
18913
18914@enumerate
18915
18916@item
18917You log in on the server and create a @sc{soup} packet. You can either
18918use a dedicated @sc{soup} thingie (like the @code{awk} program), or you
18919can use Gnus to create the packet with its @sc{soup} commands (@kbd{O
18920s} and/or @kbd{G s b}; and then @kbd{G s p}) (@pxref{SOUP Commands}).
18921
18922@item
18923You transfer the packet home. Rail, boat, car or modem will do fine.
18924
18925@item
18926You put the packet in your home directory.
18927
18928@item
18929You fire up Gnus on your home machine using the @code{nnsoup} back end as
18930the native or secondary server.
18931
18932@item
18933You read articles and mail and answer and followup to the things you
18934want (@pxref{SOUP Replies}).
18935
18936@item
18937You do the @kbd{G s r} command to pack these replies into a @sc{soup}
18938packet.
18939
18940@item
18941You transfer this packet to the server.
18942
18943@item
18944You use Gnus to mail this packet out with the @kbd{G s s} command.
18945
18946@item
18947You then repeat until you die.
18948
18949@end enumerate
18950
18951So you basically have a bipartite system---you use @code{nnsoup} for
18952reading and Gnus for packing/sending these @sc{soup} packets.
18953
18954@menu
18955* SOUP Commands:: Commands for creating and sending @sc{soup} packets
18956* SOUP Groups:: A back end for reading @sc{soup} packets.
18957* SOUP Replies:: How to enable @code{nnsoup} to take over mail and news.
18958@end menu
18959
18960
18961@node SOUP Commands
18962@subsubsection SOUP Commands
18963
18964These are commands for creating and manipulating @sc{soup} packets.
18965
18966@table @kbd
18967@item G s b
18968@kindex G s b (Group)
18969@findex gnus-group-brew-soup
18970Pack all unread articles in the current group
18971(@code{gnus-group-brew-soup}). This command understands the
18972process/prefix convention.
18973
18974@item G s w
18975@kindex G s w (Group)
18976@findex gnus-soup-save-areas
18977Save all @sc{soup} data files (@code{gnus-soup-save-areas}).
18978
18979@item G s s
18980@kindex G s s (Group)
18981@findex gnus-soup-send-replies
18982Send all replies from the replies packet
18983(@code{gnus-soup-send-replies}).
18984
18985@item G s p
18986@kindex G s p (Group)
18987@findex gnus-soup-pack-packet
18988Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}).
18989
18990@item G s r
18991@kindex G s r (Group)
18992@findex nnsoup-pack-replies
18993Pack all replies into a replies packet (@code{nnsoup-pack-replies}).
18994
18995@item O s
18996@kindex O s (Summary)
18997@findex gnus-soup-add-article
18998This summary-mode command adds the current article to a @sc{soup} packet
18999(@code{gnus-soup-add-article}). It understands the process/prefix
19000convention (@pxref{Process/Prefix}).
19001
19002@end table
19003
19004
19005There are a few variables to customize where Gnus will put all these
19006thingies:
19007
19008@table @code
19009
19010@item gnus-soup-directory
19011@vindex gnus-soup-directory
19012Directory where Gnus will save intermediate files while composing
19013@sc{soup} packets. The default is @file{~/SoupBrew/}.
19014
19015@item gnus-soup-replies-directory
19016@vindex gnus-soup-replies-directory
19017This is what Gnus will use as a temporary directory while sending our
19018reply packets. @file{~/SoupBrew/SoupReplies/} is the default.
19019
19020@item gnus-soup-prefix-file
19021@vindex gnus-soup-prefix-file
19022Name of the file where Gnus stores the last used prefix. The default is
19023@samp{gnus-prefix}.
19024
19025@item gnus-soup-packer
19026@vindex gnus-soup-packer
19027A format string command for packing a @sc{soup} packet. The default is
19028@samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}.
19029
19030@item gnus-soup-unpacker
19031@vindex gnus-soup-unpacker
19032Format string command for unpacking a @sc{soup} packet. The default is
19033@samp{gunzip -c %s | tar xvf -}.
19034
19035@item gnus-soup-packet-directory
19036@vindex gnus-soup-packet-directory
19037Where Gnus will look for reply packets. The default is @file{~/}.
19038
19039@item gnus-soup-packet-regexp
19040@vindex gnus-soup-packet-regexp
19041Regular expression matching @sc{soup} reply packets in
19042@code{gnus-soup-packet-directory}.
19043
19044@end table
19045
19046
19047@node SOUP Groups
19048@subsubsection SOUP Groups
19049@cindex nnsoup
19050
19051@code{nnsoup} is the back end for reading @sc{soup} packets. It will
19052read incoming packets, unpack them, and put them in a directory where
19053you can read them at leisure.
19054
19055These are the variables you can use to customize its behavior:
19056
19057@table @code
19058
19059@item nnsoup-tmp-directory
19060@vindex nnsoup-tmp-directory
19061When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this
19062directory. (@file{/tmp/} by default.)
19063
19064@item nnsoup-directory
19065@vindex nnsoup-directory
19066@code{nnsoup} then moves each message and index file to this directory.
19067The default is @file{~/SOUP/}.
19068
19069@item nnsoup-replies-directory
19070@vindex nnsoup-replies-directory
19071All replies will be stored in this directory before being packed into a
19072reply packet. The default is @file{~/SOUP/replies/}.
19073
19074@item nnsoup-replies-format-type
19075@vindex nnsoup-replies-format-type
19076The @sc{soup} format of the replies packets. The default is @samp{?n}
19077(rnews), and I don't think you should touch that variable. I probably
19078shouldn't even have documented it. Drats! Too late!
19079
19080@item nnsoup-replies-index-type
19081@vindex nnsoup-replies-index-type
19082The index type of the replies packet. The default is @samp{?n}, which
19083means ``none''. Don't fiddle with this one either!
19084
19085@item nnsoup-active-file
19086@vindex nnsoup-active-file
19087Where @code{nnsoup} stores lots of information. This is not an ``active
19088file'' in the @code{nntp} sense; it's an Emacs Lisp file. If you lose
19089this file or mess it up in any way, you're dead. The default is
19090@file{~/SOUP/active}.
19091
19092@item nnsoup-packer
19093@vindex nnsoup-packer
19094Format string command for packing a reply @sc{soup} packet. The default
19095is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}.
19096
19097@item nnsoup-unpacker
19098@vindex nnsoup-unpacker
19099Format string command for unpacking incoming @sc{soup} packets. The
19100default is @samp{gunzip -c %s | tar xvf -}.
19101
19102@item nnsoup-packet-directory
19103@vindex nnsoup-packet-directory
19104Where @code{nnsoup} will look for incoming packets. The default is
19105@file{~/}.
19106
19107@item nnsoup-packet-regexp
19108@vindex nnsoup-packet-regexp
19109Regular expression matching incoming @sc{soup} packets. The default is
19110@samp{Soupout}.
19111
19112@item nnsoup-always-save
19113@vindex nnsoup-always-save
19114If non-@code{nil}, save the replies buffer after each posted message.
19115
19116@end table
19117
19118
19119@node SOUP Replies
19120@subsubsection SOUP Replies
19121
19122Just using @code{nnsoup} won't mean that your postings and mailings end
19123up in @sc{soup} reply packets automagically. You have to work a bit
19124more for that to happen.
19125
19126@findex nnsoup-set-variables
19127The @code{nnsoup-set-variables} command will set the appropriate
19128variables to ensure that all your followups and replies end up in the
19129@sc{soup} system.
19130
19131In specific, this is what it does:
19132
19133@lisp
19134(setq message-send-news-function 'nnsoup-request-post)
19135(setq message-send-mail-function 'nnsoup-request-mail)
19136@end lisp
19137
19138And that's it, really. If you only want news to go into the @sc{soup}
19139system you just use the first line. If you only want mail to be
19140@sc{soup}ed you use the second.
19141
19142
19143@node Mail-To-News Gateways
19144@subsection Mail-To-News Gateways
19145@cindex mail-to-news gateways
19146@cindex gateways
19147
19148If your local @code{nntp} server doesn't allow posting, for some reason
19149or other, you can post using one of the numerous mail-to-news gateways.
19150The @code{nngateway} back end provides the interface.
19151
19152Note that you can't read anything from this back end---it can only be
19153used to post with.
19154
19155Server variables:
19156
19157@table @code
19158@item nngateway-address
19159@vindex nngateway-address
19160This is the address of the mail-to-news gateway.
19161
19162@item nngateway-header-transformation
19163@vindex nngateway-header-transformation
19164News headers often have to be transformed in some odd way or other
19165for the mail-to-news gateway to accept it. This variable says what
19166transformation should be called, and defaults to
19167@code{nngateway-simple-header-transformation}. The function is called
19168narrowed to the headers to be transformed and with one parameter---the
19169gateway address.
19170
19171This default function just inserts a new @code{To} header based on the
19172@code{Newsgroups} header and the gateway address.
19173For instance, an article with this @code{Newsgroups} header:
19174
19175@example
19176Newsgroups: alt.religion.emacs
19177@end example
19178
19179will get this @code{To} header inserted:
19180
19181@example
19182To: alt-religion-emacs@@GATEWAY
19183@end example
19184
19185The following pre-defined functions exist:
19186
19187@findex nngateway-simple-header-transformation
19188@table @code
19189
19190@item nngateway-simple-header-transformation
19191Creates a @code{To} header that looks like
19192@var{newsgroup}@@@code{nngateway-address}.
19193
19194@findex nngateway-mail2news-header-transformation
19195
19196@item nngateway-mail2news-header-transformation
19197Creates a @code{To} header that looks like
19198@code{nngateway-address}.
19199@end table
19200
19201@end table
19202
19203Here's an example:
19204
19205@lisp
19206(setq gnus-post-method
19207 '(nngateway
19208 "mail2news@@replay.com"
19209 (nngateway-header-transformation
19210 nngateway-mail2news-header-transformation)))
19211@end lisp
19212
19213So, to use this, simply say something like:
19214
19215@lisp
19216(setq gnus-post-method '(nngateway "GATEWAY.ADDRESS"))
19217@end lisp
19218
19219
19220
19221@node Combined Groups
19222@section Combined Groups
19223
19224Gnus allows combining a mixture of all the other group types into bigger
19225groups.
19226
19227@menu
19228* Virtual Groups:: Combining articles from many groups.
19229* Kibozed Groups:: Looking through parts of the newsfeed for articles.
19230@end menu
19231
19232
19233@node Virtual Groups
19234@subsection Virtual Groups
19235@cindex nnvirtual
19236@cindex virtual groups
19237@cindex merging groups
19238
19239An @dfn{nnvirtual group} is really nothing more than a collection of
19240other groups.
19241
19242For instance, if you are tired of reading many small groups, you can
19243put them all in one big group, and then grow tired of reading one
19244big, unwieldy group. The joys of computing!
19245
19246You specify @code{nnvirtual} as the method. The address should be a
19247regexp to match component groups.
19248
19249All marks in the virtual group will stick to the articles in the
19250component groups. So if you tick an article in a virtual group, the
19251article will also be ticked in the component group from whence it
19252came. (And vice versa---marks from the component groups will also be
19253shown in the virtual group.). To create an empty virtual group, run
19254@kbd{G V} (@code{gnus-group-make-empty-virtual}) in the group buffer
19255and edit the method regexp with @kbd{M-e}
19256(@code{gnus-group-edit-group-method})
19257
19258Here's an example @code{nnvirtual} method that collects all Andrea Dworkin
19259newsgroups into one, big, happy newsgroup:
19260
19261@lisp
19262(nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*")
19263@end lisp
19264
19265The component groups can be native or foreign; everything should work
19266smoothly, but if your computer explodes, it was probably my fault.
19267
19268Collecting the same group from several servers might actually be a good
19269idea if users have set the Distribution header to limit distribution.
19270If you would like to read @samp{soc.motss} both from a server in Japan
19271and a server in Norway, you could use the following as the group regexp:
19272
19273@example
19274"^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$"
19275@end example
19276
19277(Remember, though, that if you're creating the group with @kbd{G m}, you
19278shouldn't double the backslashes, and you should leave off the quote
19279characters at the beginning and the end of the string.)
19280
19281This should work kinda smoothly---all articles from both groups should
19282end up in this one, and there should be no duplicates. Threading (and
19283the rest) will still work as usual, but there might be problems with the
19284sequence of articles. Sorting on date might be an option here
19285(@pxref{Selecting a Group}).
19286
19287One limitation, however---all groups included in a virtual
19288group have to be alive (i.e., subscribed or unsubscribed). Killed or
19289zombie groups can't be component groups for @code{nnvirtual} groups.
19290
19291@vindex nnvirtual-always-rescan
19292If the @code{nnvirtual-always-rescan} variable is non-@code{nil} (which
19293is the default), @code{nnvirtual} will always scan groups for unread
19294articles when entering a virtual group. If this variable is @code{nil}
19295and you read articles in a component group after the virtual group has
19296been activated, the read articles from the component group will show up
19297when you enter the virtual group. You'll also see this effect if you
19298have two virtual groups that have a component group in common. If
19299that's the case, you should set this variable to @code{t}. Or you can
19300just tap @code{M-g} on the virtual group every time before you enter
19301it---it'll have much the same effect.
19302
19303@code{nnvirtual} can have both mail and news groups as component groups.
19304When responding to articles in @code{nnvirtual} groups, @code{nnvirtual}
19305has to ask the back end of the component group the article comes from
19306whether it is a news or mail back end. However, when you do a @kbd{^},
19307there is typically no sure way for the component back end to know this,
19308and in that case @code{nnvirtual} tells Gnus that the article came from a
19309not-news back end. (Just to be on the safe side.)
19310
19311@kbd{C-c C-n} in the message buffer will insert the @code{Newsgroups}
19312line from the article you respond to in these cases.
19313
19314@code{nnvirtual} groups do not inherit anything but articles and marks
19315from component groups---group parameters, for instance, are not
19316inherited.
19317
19318
19319@node Kibozed Groups
19320@subsection Kibozed Groups
19321@cindex nnkiboze
19322@cindex kibozing
19323
19324@dfn{Kibozing} is defined by the @acronym{OED} as ``grepping through
19325(parts of) the news feed''. @code{nnkiboze} is a back end that will
19326do this for you. Oh joy! Now you can grind any @acronym{NNTP} server
19327down to a halt with useless requests! Oh happiness!
19328
19329@kindex G k (Group)
19330To create a kibozed group, use the @kbd{G k} command in the group
19331buffer.
19332
19333The address field of the @code{nnkiboze} method is, as with
19334@code{nnvirtual}, a regexp to match groups to be ``included'' in the
19335@code{nnkiboze} group. That's where most similarities between
19336@code{nnkiboze} and @code{nnvirtual} end.
19337
19338In addition to this regexp detailing component groups, an
19339@code{nnkiboze} group must have a score file to say what articles are
19340to be included in the group (@pxref{Scoring}).
19341
19342@kindex M-x nnkiboze-generate-groups
19343@findex nnkiboze-generate-groups
19344You must run @kbd{M-x nnkiboze-generate-groups} after creating the
19345@code{nnkiboze} groups you want to have. This command will take time.
19346Lots of time. Oodles and oodles of time. Gnus has to fetch the
19347headers from all the articles in all the component groups and run them
19348through the scoring process to determine if there are any articles in
19349the groups that are to be part of the @code{nnkiboze} groups.
19350
19351Please limit the number of component groups by using restrictive
19352regexps. Otherwise your sysadmin may become annoyed with you, and the
19353@acronym{NNTP} site may throw you off and never let you back in again.
19354Stranger things have happened.
19355
19356@code{nnkiboze} component groups do not have to be alive---they can be dead,
19357and they can be foreign. No restrictions.
19358
19359@vindex nnkiboze-directory
19360The generation of an @code{nnkiboze} group means writing two files in
19361@code{nnkiboze-directory}, which is @file{~/News/kiboze/} by default.
19362One contains the @acronym{NOV} header lines for all the articles in
19363the group, and the other is an additional @file{.newsrc} file to store
19364information on what groups have been searched through to find
19365component articles.
19366
19367Articles marked as read in the @code{nnkiboze} group will have
19368their @acronym{NOV} lines removed from the @acronym{NOV} file.
19369
19370
19371@node Email Based Diary
19372@section Email Based Diary
19373@cindex diary
19374@cindex email based diary
19375@cindex calendar
19376
19377This section describes a special mail back end called @code{nndiary},
19378and its companion library @code{gnus-diary}. It is ``special'' in the
19379sense that it is not meant to be one of the standard alternatives for
19380reading mail with Gnus. See @ref{Choosing a Mail Back End} for that.
19381Instead, it is used to treat @emph{some} of your mails in a special way,
19382namely, as event reminders.
19383
19384Here is a typical scenario:
19385
19386@itemize @bullet
19387@item
19388You've got a date with Andy Mc Dowell or Bruce Willis (select according
19389to your sexual preference) in one month. You don't want to forget it.
19390@item
19391So you send a ``reminder'' message (actually, a diary one) to yourself.
19392@item
19393You forget all about it and keep on getting and reading new mail, as usual.
19394@item
19395From time to time, as you type `g' in the group buffer and as the date
19396is getting closer, the message will pop up again to remind you of your
19397appointment, just as if it were new and unread.
19398@item
19399Read your ``new'' messages, this one included, and start dreaming again
19400of the night you're gonna have.
19401@item
19402Once the date is over (you actually fell asleep just after dinner), the
19403message will be automatically deleted if it is marked as expirable.
19404@end itemize
19405
19406The Gnus Diary back end has the ability to handle regular appointments
19407(that wouldn't ever be deleted) as well as punctual ones, operates as a
19408real mail back end and is configurable in many ways. All of this is
19409explained in the sections below.
19410
19411@menu
19412* The NNDiary Back End:: Basic setup and usage.
19413* The Gnus Diary Library:: Utility toolkit on top of nndiary.
19414* Sending or Not Sending:: A final note on sending diary messages.
19415@end menu
19416
19417
19418@node The NNDiary Back End
19419@subsection The NNDiary Back End
19420@cindex nndiary
19421@cindex the nndiary back end
19422
19423@code{nndiary} is a back end very similar to @code{nnml} (@pxref{Mail
19424Spool}). Actually, it could appear as a mix of @code{nnml} and
19425@code{nndraft}. If you know @code{nnml}, you're already familiar with
19426the message storing scheme of @code{nndiary}: one file per message, one
19427directory per group.
19428
19429 Before anything, there is one requirement to be able to run
19430@code{nndiary} properly: you @emph{must} use the group timestamp feature
19431of Gnus. This adds a timestamp to each group's parameters. @ref{Group
19432Timestamp} to see how it's done.
19433
19434@menu
19435* Diary Messages:: What makes a message valid for nndiary.
19436* Running NNDiary:: NNDiary has two modes of operation.
19437* Customizing NNDiary:: Bells and whistles.
19438@end menu
19439
19440@node Diary Messages
19441@subsubsection Diary Messages
19442@cindex nndiary messages
19443@cindex nndiary mails
19444
19445@code{nndiary} messages are just normal ones, except for the mandatory
19446presence of 7 special headers. These headers are of the form
19447@code{X-Diary-<something>}, @code{<something>} being one of
19448@code{Minute}, @code{Hour}, @code{Dom}, @code{Month}, @code{Year},
19449@code{Time-Zone} and @code{Dow}. @code{Dom} means ``Day of Month'', and
19450@code{dow} means ``Day of Week''. These headers actually behave like
19451crontab specifications and define the event date(s):
19452
19453@itemize @bullet
19454@item
19455For all headers except the @code{Time-Zone} one, a header value is
19456either a star (meaning all possible values), or a list of fields
19457(separated by a comma).
19458@item
19459A field is either an integer, or a range.
19460@item
19461A range is two integers separated by a dash.
19462@item
19463Possible integer values are 0--59 for @code{Minute}, 0--23 for
19464@code{Hour}, 1--31 for @code{Dom}, 1--12 for @code{Month}, above 1971
19465for @code{Year} and 0--6 for @code{Dow} (0 meaning Sunday).
19466@item
19467As a special case, a star in either @code{Dom} or @code{Dow} doesn't
19468mean ``all possible values'', but ``use only the other field''. Note
19469that if both are star'ed, the use of either one gives the same result.
19470@item
19471The @code{Time-Zone} header is special in that it can only have one
19472value (@code{GMT}, for instance). A star doesn't mean ``all possible
19473values'' (because it makes no sense), but ``the current local time
19474zone''. Most of the time, you'll be using a star here. However, for a
19475list of available time zone values, see the variable
19476@code{nndiary-headers}.
19477@end itemize
19478
19479As a concrete example, here are the diary headers to add to your message
19480for specifying ``Each Monday and each 1st of month, at 12:00, 20:00,
1948121:00, 22:00, 23:00 and 24:00, from 1999 to 2010'' (I'll let you find
19482what to do then):
19483
19484@example
19485X-Diary-Minute: 0
19486X-Diary-Hour: 12, 20-24
19487X-Diary-Dom: 1
19488X-Diary-Month: *
19489X-Diary-Year: 1999-2010
19490X-Diary-Dow: 1
19491X-Diary-Time-Zone: *
19492@end example
19493
19494@node Running NNDiary
19495@subsubsection Running NNDiary
19496@cindex running nndiary
19497@cindex nndiary operation modes
19498
19499@code{nndiary} has two modes of operation: ``traditional'' (the default)
19500and ``autonomous''. In traditional mode, @code{nndiary} does not get new
19501mail by itself. You have to move (@kbd{B m}) or copy (@kbd{B c}) mails
19502from your primary mail back end to nndiary groups in order to handle them
19503as diary messages. In autonomous mode, @code{nndiary} retrieves its own
19504mail and handles it independently from your primary mail back end.
19505
19506One should note that Gnus is not inherently designed to allow several
19507``master'' mail back ends at the same time. However, this does make
19508sense with @code{nndiary}: you really want to send and receive diary
19509messages to your diary groups directly. So, @code{nndiary} supports
19510being sort of a ``second primary mail back end'' (to my knowledge, it is
19511the only back end offering this feature). However, there is a limitation
19512(which I hope to fix some day): respooling doesn't work in autonomous
19513mode.
19514
19515In order to use @code{nndiary} in autonomous mode, you have several
19516things to do:
19517
19518@itemize @bullet
19519@item
19520Allow @code{nndiary} to retrieve new mail by itself. Put the following
19521line in your @file{~/.gnus.el} file:
19522
19523@lisp
19524(setq nndiary-get-new-mail t)
19525@end lisp
19526@item
19527You must arrange for diary messages (those containing @code{X-Diary-*}
19528headers) to be split in a private folder @emph{before} Gnus treat them.
19529Again, this is needed because Gnus cannot (yet ?) properly handle
19530multiple primary mail back ends. Getting those messages from a separate
19531source will compensate this misfeature to some extent.
19532
19533As an example, here's my procmailrc entry to store diary files in
19534@file{~/.nndiary} (the default @code{nndiary} mail source file):
19535
19536@example
19537:0 HD :
19538* ^X-Diary
19539.nndiary
19540@end example
19541@end itemize
19542
19543Once this is done, you might want to customize the following two options
19544that affect the diary mail retrieval and splitting processes:
19545
19546@defvar nndiary-mail-sources
19547This is the diary-specific replacement for the standard
19548@code{mail-sources} variable. It obeys the same syntax, and defaults to
19549@code{(file :path "~/.nndiary")}.
19550@end defvar
19551
19552@defvar nndiary-split-methods
19553This is the diary-specific replacement for the standard
19554@code{nnmail-split-methods} variable. It obeys the same syntax.
19555@end defvar
19556
19557 Finally, you may add a permanent @code{nndiary} virtual server
19558(something like @code{(nndiary "diary")} should do) to your
19559@code{gnus-secondary-select-methods}.
19560
19561 Hopefully, almost everything (see the TODO section in
19562@file{nndiary.el}) will work as expected when you restart Gnus: in
19563autonomous mode, typing @kbd{g} and @kbd{M-g} in the group buffer, will
19564also get your new diary mails and split them according to your
19565diary-specific rules, @kbd{F} will find your new diary groups etc.
19566
19567@node Customizing NNDiary
19568@subsubsection Customizing NNDiary
19569@cindex customizing nndiary
19570@cindex nndiary customization
19571
19572Now that @code{nndiary} is up and running, it's time to customize it.
19573The custom group is called @code{nndiary} (no, really ?!). You should
19574browse it to figure out which options you'd like to tweak. The following
19575two variables are probably the only ones you will want to change:
19576
19577@defvar nndiary-reminders
19578This is the list of times when you want to be reminded of your
19579appointments (e.g. 3 weeks before, then 2 days before, then 1 hour
19580before and that's it). Remember that ``being reminded'' means that the
19581diary message will pop up as brand new and unread again when you get new
19582mail.
19583@end defvar
19584
19585@defvar nndiary-week-starts-on-monday
19586Rather self-explanatory. Otherwise, Sunday is assumed (this is the
19587default).
19588@end defvar
19589
19590
19591@node The Gnus Diary Library
19592@subsection The Gnus Diary Library
19593@cindex gnus-diary
19594@cindex the gnus diary library
19595
19596Using @code{nndiary} manually (I mean, writing the headers by hand and
19597so on) would be rather boring. Fortunately, there is a library called
19598@code{gnus-diary} written on top of @code{nndiary}, that does many
19599useful things for you.
19600
19601 In order to use it, add the following line to your @file{~/.gnus.el} file:
19602
19603@lisp
19604(require 'gnus-diary)
19605@end lisp
19606
19607 Also, you shouldn't use any @code{gnus-user-format-function-[d|D]}
19608(@pxref{Summary Buffer Lines}). @code{gnus-diary} provides both of these
19609(sorry if you used them before).
19610
19611
19612@menu
19613* Diary Summary Line Format:: A nicer summary buffer line format.
19614* Diary Articles Sorting:: A nicer way to sort messages.
19615* Diary Headers Generation:: Not doing it manually.
19616* Diary Group Parameters:: Not handling them manually.
19617@end menu
19618
19619@node Diary Summary Line Format
19620@subsubsection Diary Summary Line Format
19621@cindex diary summary buffer line
19622@cindex diary summary line format
19623
19624Displaying diary messages in standard summary line format (usually
19625something like @samp{From Joe: Subject}) is pretty useless. Most of
19626the time, you're the one who wrote the message, and you mostly want to
19627see the event's date.
19628
19629 @code{gnus-diary} provides two supplemental user formats to be used in
19630summary line formats. @code{D} corresponds to a formatted time string
19631for the next occurrence of the event (e.g. ``Sat, Sep 22 01, 12:00''),
19632while @code{d} corresponds to an approximative remaining time until the
19633next occurrence of the event (e.g. ``in 6 months, 1 week'').
19634
19635 For example, here's how Joe's birthday is displayed in my
19636@code{nndiary+diary:birthdays} summary buffer (note that the message is
19637expirable, but will never be deleted, as it specifies a periodic event):
19638
19639@example
19640 E Sat, Sep 22 01, 12:00: Joe's birthday (in 6 months, 1 week)
19641@end example
19642
19643In order to get something like the above, you would normally add the
19644following line to your diary groups'parameters:
19645
19646@lisp
19647(gnus-summary-line-format "%U%R%z %uD: %(%s%) (%ud)\n")
19648@end lisp
19649
19650However, @code{gnus-diary} does it automatically (@pxref{Diary Group
19651Parameters}). You can however customize the provided summary line format
19652with the following user options:
19653
19654@defvar gnus-diary-summary-line-format
19655Defines the summary line format used for diary groups (@pxref{Summary
19656Buffer Lines}). @code{gnus-diary} uses it to automatically update the
19657diary groups'parameters.
19658@end defvar
19659
19660@defvar gnus-diary-time-format
19661Defines the format to display dates in diary summary buffers. This is
19662used by the @code{D} user format. See the docstring for details.
19663@end defvar
19664
19665@defvar gnus-diary-delay-format-function
19666Defines the format function to use for displaying delays (remaining
19667times) in diary summary buffers. This is used by the @code{d} user
19668format. There are currently built-in functions for English and French;
19669you can also define your own. See the docstring for details.
19670@end defvar
19671
19672@node Diary Articles Sorting
19673@subsubsection Diary Articles Sorting
19674@cindex diary articles sorting
19675@cindex diary summary lines sorting
19676@findex gnus-summary-sort-by-schedule
19677@findex gnus-thread-sort-by-schedule
19678@findex gnus-article-sort-by-schedule
19679
19680@code{gnus-diary} provides new sorting functions (@pxref{Sorting the
19681Summary Buffer} ) called @code{gnus-summary-sort-by-schedule},
19682@code{gnus-thread-sort-by-schedule} and
19683@code{gnus-article-sort-by-schedule}. These functions let you organize
19684your diary summary buffers from the closest event to the farthest one.
19685
19686@code{gnus-diary} automatically installs
19687@code{gnus-summary-sort-by-schedule} as a menu item in the summary
19688buffer's ``sort'' menu, and the two others as the primary (hence
19689default) sorting functions in the group parameters (@pxref{Diary Group
19690Parameters}).
19691
19692@node Diary Headers Generation
19693@subsubsection Diary Headers Generation
19694@cindex diary headers generation
19695@findex gnus-diary-check-message
19696
19697@code{gnus-diary} provides a function called
19698@code{gnus-diary-check-message} to help you handle the @code{X-Diary-*}
19699headers. This function ensures that the current message contains all the
19700required diary headers, and prompts you for values or corrections if
19701needed.
19702
19703 This function is hooked into the @code{nndiary} back end, so that
19704moving or copying an article to a diary group will trigger it
d55fe5bb
MB
19705automatically. It is also bound to @kbd{C-c C-f d} in
19706@code{message-mode} and @code{article-edit-mode} in order to ease the
19707process of converting a usual mail to a diary one.
4009494e
GM
19708
19709 This function takes a prefix argument which will force prompting of
19710all diary headers, regardless of their presence or validity. That way,
19711you can very easily reschedule an already valid diary message, for
19712instance.
19713
19714@node Diary Group Parameters
19715@subsubsection Diary Group Parameters
19716@cindex diary group parameters
19717
19718When you create a new diary group, or visit one, @code{gnus-diary}
19719automatically checks your group parameters and if needed, sets the
19720summary line format to the diary-specific value, installs the
19721diary-specific sorting functions, and also adds the different
19722@code{X-Diary-*} headers to the group's posting-style. It is then easier
19723to send a diary message, because if you use @kbd{C-u a} or @kbd{C-u m}
19724on a diary group to prepare a message, these headers will be inserted
19725automatically (although not filled with proper values yet).
19726
19727@node Sending or Not Sending
19728@subsection Sending or Not Sending
19729
19730Well, assuming you've read all of the above, here are two final notes on
19731mail sending with @code{nndiary}:
19732
19733@itemize @bullet
19734@item
19735@code{nndiary} is a @emph{real} mail back end. You really send real diary
19736messsages for real. This means for instance that you can give
19737appointments to anybody (provided they use Gnus and @code{nndiary}) by
19738sending the diary message to them as well.
19739@item
19740However, since @code{nndiary} also has a @code{request-post} method, you
19741can also use @kbd{C-u a} instead of @kbd{C-u m} on a diary group and the
19742message won't actually be sent; just stored locally in the group. This
19743comes in very handy for private appointments.
19744@end itemize
19745
19746@node Gnus Unplugged
19747@section Gnus Unplugged
19748@cindex offline
19749@cindex unplugged
19750@cindex agent
19751@cindex Gnus agent
19752@cindex Gnus unplugged
19753
19754In olden times (ca. February '88), people used to run their newsreaders
19755on big machines with permanent connections to the net. News transport
19756was dealt with by news servers, and all the newsreaders had to do was to
19757read news. Believe it or not.
19758
19759Nowadays most people read news and mail at home, and use some sort of
19760modem to connect to the net. To avoid running up huge phone bills, it
19761would be nice to have a way to slurp down all the news and mail, hang up
19762the phone, read for several hours, and then upload any responses you
19763have to make. And then you repeat the procedure.
19764
19765Of course, you can use news servers for doing this as well. I've used
19766@code{inn} together with @code{slurp}, @code{pop} and @code{sendmail}
19767for some years, but doing that's a bore. Moving the news server
19768functionality up to the newsreader makes sense if you're the only person
19769reading news on a machine.
19770
19771Setting up Gnus as an ``offline'' newsreader is quite simple. In
01c52d31
MB
19772fact, you don't have to configure anything as the agent is now enabled
19773by default (@pxref{Agent Variables, gnus-agent}).
4009494e
GM
19774
19775Of course, to use it as such, you have to learn a few new commands.
19776
19777@menu
19778* Agent Basics:: How it all is supposed to work.
19779* Agent Categories:: How to tell the Gnus Agent what to download.
19780* Agent Commands:: New commands for all the buffers.
19781* Agent Visuals:: Ways that the agent may effect your summary buffer.
19782* Agent as Cache:: The Agent is a big cache too.
19783* Agent Expiry:: How to make old articles go away.
19784* Agent Regeneration:: How to recover from lost connections and other accidents.
01c52d31 19785* Agent and flags:: How the Agent maintains flags.
4009494e
GM
19786* Agent and IMAP:: How to use the Agent with @acronym{IMAP}.
19787* Outgoing Messages:: What happens when you post/mail something?
19788* Agent Variables:: Customizing is fun.
19789* Example Setup:: An example @file{~/.gnus.el} file for offline people.
19790* Batching Agents:: How to fetch news from a @code{cron} job.
19791* Agent Caveats:: What you think it'll do and what it does.
19792@end menu
19793
19794
19795@node Agent Basics
19796@subsection Agent Basics
19797
19798First, let's get some terminology out of the way.
19799
19800The Gnus Agent is said to be @dfn{unplugged} when you have severed the
19801connection to the net (and notified the Agent that this is the case).
19802When the connection to the net is up again (and Gnus knows this), the
19803Agent is @dfn{plugged}.
19804
19805The @dfn{local} machine is the one you're running on, and which isn't
19806connected to the net continuously.
19807
19808@dfn{Downloading} means fetching things from the net to your local
19809machine. @dfn{Uploading} is doing the opposite.
19810
19811You know that Gnus gives you all the opportunity you'd ever want for
19812shooting yourself in the foot. Some people call it flexibility. Gnus
19813is also customizable to a great extent, which means that the user has a
19814say on how Gnus behaves. Other newsreaders might unconditionally shoot
19815you in your foot, but with Gnus, you have a choice!
19816
19817Gnus is never really in plugged or unplugged state. Rather, it applies
19818that state to each server individually. This means that some servers
19819can be plugged while others can be unplugged. Additionally, some
19820servers can be ignored by the Agent altogether (which means that
19821they're kinda like plugged always).
19822
19823So when you unplug the Agent and then wonder why is Gnus opening a
19824connection to the Net, the next step to do is to look whether all
19825servers are agentized. If there is an unagentized server, you found
19826the culprit.
19827
19828Another thing is the @dfn{offline} state. Sometimes, servers aren't
19829reachable. When Gnus notices this, it asks you whether you want the
19830server to be switched to offline state. If you say yes, then the
19831server will behave somewhat as if it was unplugged, except that Gnus
19832will ask you whether you want to switch it back online again.
19833
19834Let's take a typical Gnus session using the Agent.
19835
19836@itemize @bullet
19837
19838@item
19839@findex gnus-unplugged
19840You start Gnus with @code{gnus-unplugged}. This brings up the Gnus
19841Agent in a disconnected state. You can read all the news that you have
19842already fetched while in this mode.
19843
19844@item
19845You then decide to see whether any new news has arrived. You connect
19846your machine to the net (using PPP or whatever), and then hit @kbd{J j}
19847to make Gnus become @dfn{plugged} and use @kbd{g} to check for new mail
19848as usual. To check for new mail in unplugged mode (@pxref{Mail
19849Source Specifiers}).
19850
19851@item
19852You can then read the new news immediately, or you can download the
19853news onto your local machine. If you want to do the latter, you press
19854@kbd{g} to check if there are any new news and then @kbd{J s} to fetch
19855all the eligible articles in all the groups. (To let Gnus know which
19856articles you want to download, @pxref{Agent Categories}).
19857
19858@item
19859After fetching the articles, you press @kbd{J j} to make Gnus become
19860unplugged again, and you shut down the PPP thing (or whatever). And
19861then you read the news offline.
19862
19863@item
19864And then you go to step 2.
19865@end itemize
19866
19867Here are some things you should do the first time (or so) that you use
19868the Agent.
19869
19870@itemize @bullet
19871
19872@item
19873Decide which servers should be covered by the Agent. If you have a mail
19874back end, it would probably be nonsensical to have it covered by the
19875Agent. Go to the server buffer (@kbd{^} in the group buffer) and press
19876@kbd{J a} on the server (or servers) that you wish to have covered by the
19877Agent (@pxref{Server Agent Commands}), or @kbd{J r} on automatically
19878added servers you do not wish to have covered by the Agent. By default,
19879all @code{nntp} and @code{nnimap} servers in @code{gnus-select-method} and
19880@code{gnus-secondary-select-methods} are agentized.
19881
19882@item
19883Decide on download policy. It's fairly simple once you decide whether
19884you are going to use agent categories, topic parameters, and/or group
19885parameters to implement your policy. If you're new to gnus, it
19886is probably best to start with a category, @xref{Agent Categories}.
19887
19888Both topic parameters (@pxref{Topic Parameters}) and agent categories
19889(@pxref{Agent Categories}) provide for setting a policy that applies
19890to multiple groups. Which you use is entirely up to you. Topic
19891parameters do override categories so, if you mix the two, you'll have
19892to take that into account. If you have a few groups that deviate from
19893your policy, you can use group parameters (@pxref{Group Parameters}) to
19894configure them.
19895
19896@item
19897Uhm@dots{} that's it.
19898@end itemize
19899
19900
19901@node Agent Categories
19902@subsection Agent Categories
19903
19904One of the main reasons to integrate the news transport layer into the
19905newsreader is to allow greater control over what articles to download.
19906There's not much point in downloading huge amounts of articles, just to
19907find out that you're not interested in reading any of them. It's better
19908to be somewhat more conservative in choosing what to download, and then
19909mark the articles for downloading manually if it should turn out that
19910you're interested in the articles anyway.
19911
19912One of the more effective methods for controlling what is to be
19913downloaded is to create a @dfn{category} and then assign some (or all)
19914groups to this category. Groups that do not belong in any other
19915category belong to the @code{default} category. Gnus has its own
19916buffer for creating and managing categories.
19917
19918If you prefer, you can also use group parameters (@pxref{Group
19919Parameters}) and topic parameters (@pxref{Topic Parameters}) for an
19920alternative approach to controlling the agent. The only real
19921difference is that categories are specific to the agent (so there is
19922less to learn) while group and topic parameters include the kitchen
19923sink.
19924
19925Since you can set agent parameters in several different places we have
19926a rule to decide which source to believe. This rule specifies that
19927the parameter sources are checked in the following order: group
19928parameters, topic parameters, agent category, and finally customizable
19929variables. So you can mix all of these sources to produce a wide range
19930of behavior, just don't blame me if you don't remember where you put
19931your settings.
19932
19933@menu
19934* Category Syntax:: What a category looks like.
19935* Category Buffer:: A buffer for maintaining categories.
19936* Category Variables:: Customize'r'Us.
19937@end menu
19938
19939
19940@node Category Syntax
19941@subsubsection Category Syntax
19942
19943A category consists of a name, the list of groups belonging to the
19944category, and a number of optional parameters that override the
19945customizable variables. The complete list of agent parameters are
19946listed below.
19947
19948@cindex Agent Parameters
19949@table @code
01c52d31 19950@item agent-groups
4009494e
GM
19951The list of groups that are in this category.
19952
01c52d31 19953@item agent-predicate
4009494e
GM
19954A predicate which (generally) gives a rough outline of which articles
19955are eligible for downloading; and
19956
01c52d31 19957@item agent-score
4009494e
GM
19958a score rule which (generally) gives you a finer granularity when
19959deciding what articles to download. (Note that this @dfn{download
19960score} is not necessarily related to normal scores.)
19961
01c52d31 19962@item agent-enable-expiration
4009494e
GM
19963a boolean indicating whether the agent should expire old articles in
19964this group. Most groups should be expired to conserve disk space. In
19965fact, its probably safe to say that the gnus.* hierarchy contains the
19966only groups that should not be expired.
19967
01c52d31 19968@item agent-days-until-old
4009494e
GM
19969an integer indicating the number of days that the agent should wait
19970before deciding that a read article is safe to expire.
19971
01c52d31 19972@item agent-low-score
4009494e
GM
19973an integer that overrides the value of @code{gnus-agent-low-score}.
19974
01c52d31 19975@item agent-high-score
4009494e
GM
19976an integer that overrides the value of @code{gnus-agent-high-score}.
19977
01c52d31 19978@item agent-short-article
4009494e
GM
19979an integer that overrides the value of
19980@code{gnus-agent-short-article}.
19981
01c52d31 19982@item agent-long-article
4009494e
GM
19983an integer that overrides the value of @code{gnus-agent-long-article}.
19984
01c52d31 19985@item agent-enable-undownloaded-faces
4009494e 19986a symbol indicating whether the summary buffer should display
01c52d31
MB
19987undownloaded articles using the @code{gnus-summary-*-undownloaded-face}
19988faces. Any symbol other than @code{nil} will enable the use of
19989undownloaded faces.
4009494e
GM
19990@end table
19991
19992The name of a category can not be changed once the category has been
19993created.
19994
19995Each category maintains a list of groups that are exclusive members of
19996that category. The exclusivity rule is automatically enforced, add a
19997group to a new category and it is automatically removed from its old
19998category.
19999
20000A predicate in its simplest form can be a single predicate such as
20001@code{true} or @code{false}. These two will download every available
20002article or nothing respectively. In the case of these two special
20003predicates an additional score rule is superfluous.
20004
20005Predicates of @code{high} or @code{low} download articles in respect of
20006their scores in relationship to @code{gnus-agent-high-score} and
20007@code{gnus-agent-low-score} as described below.
20008
20009To gain even finer control of what is to be regarded eligible for
20010download a predicate can consist of a number of predicates with logical
20011operators sprinkled in between.
20012
20013Perhaps some examples are in order.
20014
20015Here's a simple predicate. (It's the default predicate, in fact, used
20016for all groups that don't belong to any other category.)
20017
20018@lisp
20019short
20020@end lisp
20021
20022Quite simple, eh? This predicate is true if and only if the article is
20023short (for some value of ``short'').
20024
20025Here's a more complex predicate:
20026
20027@lisp
20028(or high
20029 (and
20030 (not low)
20031 (not long)))
20032@end lisp
20033
20034This means that an article should be downloaded if it has a high score,
20035or if the score is not low and the article is not long. You get the
20036drift.
20037
20038The available logical operators are @code{or}, @code{and} and
20039@code{not}. (If you prefer, you can use the more ``C''-ish operators
20040@samp{|}, @code{&} and @code{!} instead.)
20041
20042The following predicates are pre-defined, but if none of these fit what
20043you want to do, you can write your own.
20044
20045When evaluating each of these predicates, the named constant will be
20046bound to the value determined by calling
20047@code{gnus-agent-find-parameter} on the appropriate parameter. For
20048example, gnus-agent-short-article will be bound to
20049@code{(gnus-agent-find-parameter group 'agent-short-article)}. This
20050means that you can specify a predicate in your category then tune that
20051predicate to individual groups.
20052
20053@table @code
20054@item short
20055True if the article is shorter than @code{gnus-agent-short-article}
20056lines; default 100.
20057
20058@item long
20059True if the article is longer than @code{gnus-agent-long-article}
20060lines; default 200.
20061
20062@item low
20063True if the article has a download score less than
20064@code{gnus-agent-low-score}; default 0.
20065
20066@item high
20067True if the article has a download score greater than
20068@code{gnus-agent-high-score}; default 0.
20069
20070@item spam
20071True if the Gnus Agent guesses that the article is spam. The
20072heuristics may change over time, but at present it just computes a
20073checksum and sees whether articles match.
20074
20075@item true
20076Always true.
20077
20078@item false
20079Always false.
20080@end table
20081
20082If you want to create your own predicate function, here's what you have
20083to know: The functions are called with no parameters, but the
20084@code{gnus-headers} and @code{gnus-score} dynamic variables are bound to
20085useful values.
20086
20087For example, you could decide that you don't want to download articles
20088that were posted more than a certain number of days ago (e.g. posted
20089more than @code{gnus-agent-expire-days} ago) you might write a function
20090something along the lines of the following:
20091
20092@lisp
20093(defun my-article-old-p ()
20094 "Say whether an article is old."
20095 (< (time-to-days (date-to-time (mail-header-date gnus-headers)))
20096 (- (time-to-days (current-time)) gnus-agent-expire-days)))
20097@end lisp
20098
20099with the predicate then defined as:
20100
20101@lisp
20102(not my-article-old-p)
20103@end lisp
20104
20105or you could append your predicate to the predefined
20106@code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or
20107wherever.
20108
20109@lisp
20110(require 'gnus-agent)
20111(setq gnus-category-predicate-alist
20112 (append gnus-category-predicate-alist
20113 '((old . my-article-old-p))))
20114@end lisp
20115
20116and simply specify your predicate as:
20117
20118@lisp
20119(not old)
20120@end lisp
20121
20122If/when using something like the above, be aware that there are many
20123misconfigured systems/mailers out there and so an article's date is not
20124always a reliable indication of when it was posted. Hell, some people
20125just don't give a damn.
20126
20127The above predicates apply to @emph{all} the groups which belong to the
20128category. However, if you wish to have a specific predicate for an
20129individual group within a category, or you're just too lazy to set up a
20130new category, you can enter a group's individual predicate in its group
20131parameters like so:
20132
20133@lisp
20134(agent-predicate . short)
20135@end lisp
20136
20137This is the group/topic parameter equivalent of the agent category default.
20138Note that when specifying a single word predicate like this, the
20139@code{agent-predicate} specification must be in dotted pair notation.
20140
20141The equivalent of the longer example from above would be:
20142
20143@lisp
20144(agent-predicate or high (and (not low) (not long)))
20145@end lisp
20146
20147The outer parenthesis required in the category specification are not
20148entered here as, not being in dotted pair notation, the value of the
20149predicate is assumed to be a list.
20150
20151
20152Now, the syntax of the download score is the same as the syntax of
20153normal score files, except that all elements that require actually
20154seeing the article itself are verboten. This means that only the
20155following headers can be scored on: @code{Subject}, @code{From},
20156@code{Date}, @code{Message-ID}, @code{References}, @code{Chars},
20157@code{Lines}, and @code{Xref}.
20158
20159As with predicates, the specification of the @code{download score rule}
20160to use in respect of a group can be in either the category definition if
20161it's to be applicable to all groups in therein, or a group's parameters
20162if it's to be specific to that group.
20163
20164In both of these places the @code{download score rule} can take one of
20165three forms:
20166
20167@enumerate
20168@item
20169Score rule
20170
20171This has the same syntax as a normal Gnus score file except only a
20172subset of scoring keywords are available as mentioned above.
20173
20174example:
20175
20176@itemize @bullet
20177@item
20178Category specification
20179
20180@lisp
20181(("from"
20182 ("Lars Ingebrigtsen" 1000000 nil s))
20183("lines"
20184 (500 -100 nil <)))
20185@end lisp
20186
20187@item
20188Group/Topic Parameter specification
20189
20190@lisp
20191(agent-score ("from"
20192 ("Lars Ingebrigtsen" 1000000 nil s))
20193 ("lines"
20194 (500 -100 nil <)))
20195@end lisp
20196
20197Again, note the omission of the outermost parenthesis here.
20198@end itemize
20199
20200@item
20201Agent score file
20202
20203These score files must @emph{only} contain the permitted scoring
20204keywords stated above.
20205
20206example:
20207
20208@itemize @bullet
20209@item
20210Category specification
20211
20212@lisp
20213("~/News/agent.SCORE")
20214@end lisp
20215
20216or perhaps
20217
20218@lisp
20219("~/News/agent.SCORE" "~/News/agent.group.SCORE")
20220@end lisp
20221
20222@item
20223Group Parameter specification
20224
20225@lisp
20226(agent-score "~/News/agent.SCORE")
20227@end lisp
20228
20229Additional score files can be specified as above. Need I say anything
20230about parenthesis?
20231@end itemize
20232
20233@item
20234Use @code{normal} score files
20235
20236If you don't want to maintain two sets of scoring rules for a group, and
20237your desired @code{downloading} criteria for a group are the same as your
20238@code{reading} criteria then you can tell the agent to refer to your
20239@code{normal} score files when deciding what to download.
20240
20241These directives in either the category definition or a group's
20242parameters will cause the agent to read in all the applicable score
20243files for a group, @emph{filtering out} those sections that do not
20244relate to one of the permitted subset of scoring keywords.
20245
20246@itemize @bullet
20247@item
20248Category Specification
20249
20250@lisp
20251file
20252@end lisp
20253
20254@item
20255Group Parameter specification
20256
20257@lisp
20258(agent-score . file)
20259@end lisp
20260@end itemize
20261@end enumerate
20262
20263@node Category Buffer
20264@subsubsection Category Buffer
20265
20266You'd normally do all category maintenance from the category buffer.
20267When you enter it for the first time (with the @kbd{J c} command from
20268the group buffer), you'll only see the @code{default} category.
20269
20270The following commands are available in this buffer:
20271
20272@table @kbd
20273@item q
20274@kindex q (Category)
20275@findex gnus-category-exit
20276Return to the group buffer (@code{gnus-category-exit}).
20277
20278@item e
20279@kindex e (Category)
20280@findex gnus-category-customize-category
20281Use a customization buffer to set all of the selected category's
20282parameters at one time (@code{gnus-category-customize-category}).
20283
20284@item k
20285@kindex k (Category)
20286@findex gnus-category-kill
20287Kill the current category (@code{gnus-category-kill}).
20288
20289@item c
20290@kindex c (Category)
20291@findex gnus-category-copy
20292Copy the current category (@code{gnus-category-copy}).
20293
20294@item a
20295@kindex a (Category)
20296@findex gnus-category-add
20297Add a new category (@code{gnus-category-add}).
20298
20299@item p
20300@kindex p (Category)
20301@findex gnus-category-edit-predicate
20302Edit the predicate of the current category
20303(@code{gnus-category-edit-predicate}).
20304
20305@item g
20306@kindex g (Category)
20307@findex gnus-category-edit-groups
20308Edit the list of groups belonging to the current category
20309(@code{gnus-category-edit-groups}).
20310
20311@item s
20312@kindex s (Category)
20313@findex gnus-category-edit-score
20314Edit the download score rule of the current category
20315(@code{gnus-category-edit-score}).
20316
20317@item l
20318@kindex l (Category)
20319@findex gnus-category-list
20320List all the categories (@code{gnus-category-list}).
20321@end table
20322
20323
20324@node Category Variables
20325@subsubsection Category Variables
20326
20327@table @code
20328@item gnus-category-mode-hook
20329@vindex gnus-category-mode-hook
20330Hook run in category buffers.
20331
20332@item gnus-category-line-format
20333@vindex gnus-category-line-format
20334Format of the lines in the category buffer (@pxref{Formatting
20335Variables}). Valid elements are:
20336
20337@table @samp
20338@item c
20339The name of the category.
20340
20341@item g
20342The number of groups in the category.
20343@end table
20344
20345@item gnus-category-mode-line-format
20346@vindex gnus-category-mode-line-format
20347Format of the category mode line (@pxref{Mode Line Formatting}).
20348
20349@item gnus-agent-short-article
20350@vindex gnus-agent-short-article
20351Articles that have fewer lines than this are short. Default 100.
20352
20353@item gnus-agent-long-article
20354@vindex gnus-agent-long-article
20355Articles that have more lines than this are long. Default 200.
20356
20357@item gnus-agent-low-score
20358@vindex gnus-agent-low-score
20359Articles that have a score lower than this have a low score. Default
203600.
20361
20362@item gnus-agent-high-score
20363@vindex gnus-agent-high-score
20364Articles that have a score higher than this have a high score. Default
203650.
20366
20367@item gnus-agent-expire-days
20368@vindex gnus-agent-expire-days
20369The number of days that a @samp{read} article must stay in the agent's
20370local disk before becoming eligible for expiration (While the name is
20371the same, this doesn't mean expiring the article on the server. It
20372just means deleting the local copy of the article). What is also
20373important to understand is that the counter starts with the time the
20374article was written to the local disk and not the time the article was
20375read.
20376Default 7.
20377
20378@item gnus-agent-enable-expiration
20379@vindex gnus-agent-enable-expiration
20380Determines whether articles in a group are, by default, expired or
20381retained indefinitely. The default is @code{ENABLE} which means that
20382you'll have to disable expiration when desired. On the other hand,
20383you could set this to @code{DISABLE}. In that case, you would then
20384have to enable expiration in selected groups.
20385
20386@end table
20387
20388
20389@node Agent Commands
20390@subsection Agent Commands
20391@findex gnus-agent-toggle-plugged
20392@kindex J j (Agent)
20393
20394All the Gnus Agent commands are on the @kbd{J} submap. The @kbd{J j}
20395(@code{gnus-agent-toggle-plugged}) command works in all modes, and
20396toggles the plugged/unplugged state of the Gnus Agent.
20397
20398
20399@menu
20400* Group Agent Commands:: Configure groups and fetch their contents.
20401* Summary Agent Commands:: Manually select then fetch specific articles.
20402* Server Agent Commands:: Select the servers that are supported by the agent.
20403@end menu
20404
20405
20406
20407
20408@node Group Agent Commands
20409@subsubsection Group Agent Commands
20410
20411@table @kbd
20412@item J u
20413@kindex J u (Agent Group)
20414@findex gnus-agent-fetch-groups
20415Fetch all eligible articles in the current group
20416(@code{gnus-agent-fetch-groups}).
20417
20418@item J c
20419@kindex J c (Agent Group)
20420@findex gnus-enter-category-buffer
20421Enter the Agent category buffer (@code{gnus-enter-category-buffer}).
20422
20423@item J s
20424@kindex J s (Agent Group)
20425@findex gnus-agent-fetch-session
20426Fetch all eligible articles in all groups
20427(@code{gnus-agent-fetch-session}).
20428
20429@item J S
20430@kindex J S (Agent Group)
20431@findex gnus-group-send-queue
20432Send all sendable messages in the queue group
20433(@code{gnus-group-send-queue}). @xref{Drafts}.
20434
20435@item J a
20436@kindex J a (Agent Group)
20437@findex gnus-agent-add-group
20438Add the current group to an Agent category
20439(@code{gnus-agent-add-group}). This command understands the
20440process/prefix convention (@pxref{Process/Prefix}).
20441
20442@item J r
20443@kindex J r (Agent Group)
20444@findex gnus-agent-remove-group
20445Remove the current group from its category, if any
20446(@code{gnus-agent-remove-group}). This command understands the
20447process/prefix convention (@pxref{Process/Prefix}).
20448
20449@item J Y
20450@kindex J Y (Agent Group)
20451@findex gnus-agent-synchronize-flags
20452Synchronize flags changed while unplugged with remote server, if any.
20453
20454
20455@end table
20456
20457
20458@node Summary Agent Commands
20459@subsubsection Summary Agent Commands
20460
20461@table @kbd
20462@item J #
20463@kindex J # (Agent Summary)
20464@findex gnus-agent-mark-article
20465Mark the article for downloading (@code{gnus-agent-mark-article}).
20466
20467@item J M-#
20468@kindex J M-# (Agent Summary)
20469@findex gnus-agent-unmark-article
20470Remove the downloading mark from the article
20471(@code{gnus-agent-unmark-article}).
20472
20473@cindex %
20474@item @@
20475@kindex @@ (Agent Summary)
20476@findex gnus-agent-toggle-mark
20477Toggle whether to download the article
20478(@code{gnus-agent-toggle-mark}). The download mark is @samp{%} by
20479default.
20480
20481@item J c
20482@kindex J c (Agent Summary)
20483@findex gnus-agent-catchup
20484Mark all articles as read (@code{gnus-agent-catchup}) that are neither cached, downloaded, nor downloadable.
20485
20486@item J S
20487@kindex J S (Agent Summary)
20488@findex gnus-agent-fetch-group
20489Download all eligible (@pxref{Agent Categories}) articles in this group.
20490(@code{gnus-agent-fetch-group}).
20491
20492@item J s
20493@kindex J s (Agent Summary)
01c52d31 20494@findex gnus-agent-summary-fetch-series
4009494e 20495Download all processable articles in this group.
01c52d31 20496(@code{gnus-agent-summary-fetch-series}).
4009494e
GM
20497
20498@item J u
20499@kindex J u (Agent Summary)
20500@findex gnus-agent-summary-fetch-group
20501Download all downloadable articles in the current group
20502(@code{gnus-agent-summary-fetch-group}).
20503
20504@end table
20505
20506
20507@node Server Agent Commands
20508@subsubsection Server Agent Commands
20509
20510@table @kbd
20511@item J a
20512@kindex J a (Agent Server)
20513@findex gnus-agent-add-server
20514Add the current server to the list of servers covered by the Gnus Agent
20515(@code{gnus-agent-add-server}).
20516
20517@item J r
20518@kindex J r (Agent Server)
20519@findex gnus-agent-remove-server
20520Remove the current server from the list of servers covered by the Gnus
20521Agent (@code{gnus-agent-remove-server}).
20522
20523@end table
20524
20525
20526@node Agent Visuals
20527@subsection Agent Visuals
20528
20529If you open a summary while unplugged and, Gnus knows from the group's
20530active range that there are more articles than the headers currently
20531stored in the Agent, you may see some articles whose subject looks
20532something like @samp{[Undownloaded article #####]}. These are
20533placeholders for the missing headers. Aside from setting a mark,
20534there is not much that can be done with one of these placeholders.
20535When Gnus finally gets a chance to fetch the group's headers, the
20536placeholders will automatically be replaced by the actual headers.
20537You can configure the summary buffer's maneuvering to skip over the
20538placeholders if you care (See @code{gnus-auto-goto-ignores}).
20539
20540While it may be obvious to all, the only headers and articles
20541available while unplugged are those headers and articles that were
20542fetched into the Agent while previously plugged. To put it another
20543way, ``If you forget to fetch something while plugged, you might have a
20544less than satisfying unplugged session''. For this reason, the Agent
20545adds two visual effects to your summary buffer. These effects display
20546the download status of each article so that you always know which
20547articles will be available when unplugged.
20548
20549The first visual effect is the @samp{%O} spec. If you customize
20550@code{gnus-summary-line-format} to include this specifier, you will add
20551a single character field that indicates an article's download status.
20552Articles that have been fetched into either the Agent or the Cache,
20553will display @code{gnus-downloaded-mark} (defaults to @samp{+}). All
20554other articles will display @code{gnus-undownloaded-mark} (defaults to
20555@samp{-}). If you open a group that has not been agentized, a space
20556(@samp{ }) will be displayed.
20557
20558The second visual effect are the undownloaded faces. The faces, there
20559are three indicating the article's score (low, normal, high), seem to
20560result in a love/hate response from many Gnus users. The problem is
20561that the face selection is controlled by a list of condition tests and
20562face names (See @code{gnus-summary-highlight}). Each condition is
20563tested in the order in which it appears in the list so early
20564conditions have precedence over later conditions. All of this means
20565that, if you tick an undownloaded article, the article will continue
20566to be displayed in the undownloaded face rather than the ticked face.
20567
20568If you use the Agent as a cache (to avoid downloading the same article
20569each time you visit it or to minimize your connection time), the
20570undownloaded face will probably seem like a good idea. The reason
20571being that you do all of our work (marking, reading, deleting) with
01c52d31
MB
20572downloaded articles so the normal faces always appear. For those
20573users using the agent to improve online performance by caching the NOV
20574database (most users since 5.10.2), the undownloaded faces may appear
20575to be an absolutely horrible idea. The issue being that, since none
20576of their articles have been fetched into the Agent, all of the
20577normal faces will be obscured by the undownloaded faces.
20578
20579If you would like to use the undownloaded faces, you must enable the
20580undownloaded faces by setting the @code{agent-enable-undownloaded-faces}
20581group parameter to @code{t}. This parameter, like all other agent
20582parameters, may be set on an Agent Category (@pxref{Agent Categories}),
20583a Group Topic (@pxref{Topic Parameters}), or an individual group
20584(@pxref{Group Parameters}).
20585
20586The one problem common to all users using the agent is how quickly it
20587can consume disk space. If you using the agent on many groups, it is
20588even more difficult to effectively recover disk space. One solution
20589is the @samp{%F} format available in @code{gnus-group-line-format}.
20590This format will display the actual disk space used by articles
20591fetched into both the agent and cache. By knowing which groups use
20592the most space, users know where to focus their efforts when ``agent
20593expiring'' articles.
4009494e
GM
20594
20595@node Agent as Cache
20596@subsection Agent as Cache
20597
20598When Gnus is plugged, it is not efficient to download headers or
20599articles from the server again, if they are already stored in the
20600Agent. So, Gnus normally only downloads headers once, and stores them
20601in the Agent. These headers are later used when generating the summary
20602buffer, regardless of whether you are plugged or unplugged. Articles
20603are not cached in the Agent by default though (that would potentially
20604consume lots of disk space), but if you have already downloaded an
20605article into the Agent, Gnus will not download the article from the
20606server again but use the locally stored copy instead.
20607
20608If you so desire, you can configure the agent (see @code{gnus-agent-cache}
20609@pxref{Agent Variables}) to always download headers and articles while
20610plugged. Gnus will almost certainly be slower, but it will be kept
20611synchronized with the server. That last point probably won't make any
20612sense if you are using a nntp or nnimap back end.
20613
20614@node Agent Expiry
20615@subsection Agent Expiry
20616
20617@vindex gnus-agent-expire-days
20618@findex gnus-agent-expire
20619@kindex M-x gnus-agent-expire
20620@kindex M-x gnus-agent-expire-group
20621@findex gnus-agent-expire-group
20622@cindex agent expiry
20623@cindex Gnus agent expiry
20624@cindex expiry, in Gnus agent
20625
20626The Agent back end, @code{nnagent}, doesn't handle expiry. Well, at
20627least it doesn't handle it like other back ends. Instead, there are
20628special @code{gnus-agent-expire} and @code{gnus-agent-expire-group}
20629commands that will expire all read articles that are older than
20630@code{gnus-agent-expire-days} days. They can be run whenever you feel
20631that you're running out of space. Neither are particularly fast or
20632efficient, and it's not a particularly good idea to interrupt them (with
20633@kbd{C-g} or anything else) once you've started one of them.
20634
20635Note that other functions, e.g. @code{gnus-request-expire-articles},
20636might run @code{gnus-agent-expire} for you to keep the agent
20637synchronized with the group.
20638
20639The agent parameter @code{agent-enable-expiration} may be used to
20640prevent expiration in selected groups.
20641
20642@vindex gnus-agent-expire-all
20643If @code{gnus-agent-expire-all} is non-@code{nil}, the agent
20644expiration commands will expire all articles---unread, read, ticked
20645and dormant. If @code{nil} (which is the default), only read articles
20646are eligible for expiry, and unread, ticked and dormant articles will
20647be kept indefinitely.
20648
20649If you find that some articles eligible for expiry are never expired,
20650perhaps some Gnus Agent files are corrupted. There's are special
20651commands, @code{gnus-agent-regenerate} and
20652@code{gnus-agent-regenerate-group}, to fix possible problems.
20653
20654@node Agent Regeneration
20655@subsection Agent Regeneration
20656
20657@cindex agent regeneration
20658@cindex Gnus agent regeneration
20659@cindex regeneration
20660
20661The local data structures used by @code{nnagent} may become corrupted
20662due to certain exceptional conditions. When this happens,
20663@code{nnagent} functionality may degrade or even fail. The solution
20664to this problem is to repair the local data structures by removing all
20665internal inconsistencies.
20666
20667For example, if your connection to your server is lost while
20668downloaded articles into the agent, the local data structures will not
20669know about articles successfully downloaded prior to the connection
20670failure. Running @code{gnus-agent-regenerate} or
20671@code{gnus-agent-regenerate-group} will update the data structures
20672such that you don't need to download these articles a second time.
20673
20674@findex gnus-agent-regenerate
20675@kindex M-x gnus-agent-regenerate
20676The command @code{gnus-agent-regenerate} will perform
20677@code{gnus-agent-regenerate-group} on every agentized group. While
20678you can run @code{gnus-agent-regenerate} in any buffer, it is strongly
20679recommended that you first close all summary buffers.
20680
20681@findex gnus-agent-regenerate-group
20682@kindex M-x gnus-agent-regenerate-group
20683The command @code{gnus-agent-regenerate-group} uses the local copies
20684of individual articles to repair the local @acronym{NOV}(header) database. It
20685then updates the internal data structures that document which articles
20686are stored locally. An optional argument will mark articles in the
20687agent as unread.
20688
01c52d31
MB
20689@node Agent and flags
20690@subsection Agent and flags
4009494e 20691
01c52d31
MB
20692The Agent works with any Gnus back end including those, such as
20693nnimap, that store flags (read, ticked, etc) on the server. Sadly,
20694the Agent does not actually know which backends keep their flags in
20695the backend server rather than in @file{.newsrc}. This means that the
20696Agent, while unplugged or disconnected, will always record all changes
20697to the flags in its own files.
4009494e 20698
01c52d31
MB
20699When you plug back in, Gnus will then check to see if you have any
20700changed any flags and ask if you wish to synchronize these with the
20701server. This behavior is customizable by @code{gnus-agent-synchronize-flags}.
4009494e
GM
20702
20703@vindex gnus-agent-synchronize-flags
20704If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
20705never automatically synchronize flags. If it is @code{ask}, which is
20706the default, the Agent will check if you made any changes and if so
20707ask if you wish to synchronize these when you re-connect. If it has
20708any other value, all flags will be synchronized automatically.
20709
20710If you do not wish to synchronize flags automatically when you
20711re-connect, you can do it manually with the
20712@code{gnus-agent-synchronize-flags} command that is bound to @kbd{J Y}
20713in the group buffer.
20714
01c52d31
MB
20715Technical note: the synchronization algorithm does not work by ``pushing''
20716all local flags to the server, but rather by incrementally updated the
20717server view of flags by changing only those flags that were changed by
20718the user. Thus, if you set one flag on an article, quit the group then
20719re-select the group and remove the flag; the flag will be set and
20720removed from the server when you ``synchronize''. The queued flag
20721operations can be found in the per-server @code{flags} file in the Agent
20722directory. It's emptied when you synchronize flags.
20723
20724@node Agent and IMAP
20725@subsection Agent and IMAP
20726
20727The Agent works with any Gnus back end, including nnimap. However,
20728since there are some conceptual differences between @acronym{NNTP} and
20729@acronym{IMAP}, this section (should) provide you with some information to
20730make Gnus Agent work smoother as a @acronym{IMAP} Disconnected Mode client.
20731
4009494e
GM
20732Some things are currently not implemented in the Agent that you'd might
20733expect from a disconnected @acronym{IMAP} client, including:
20734
20735@itemize @bullet
20736
20737@item
20738Copying/moving articles into nnimap groups when unplugged.
20739
20740@item
20741Creating/deleting nnimap groups when unplugged.
20742
20743@end itemize
20744
4009494e
GM
20745@node Outgoing Messages
20746@subsection Outgoing Messages
20747
01c52d31
MB
20748By default, when Gnus is unplugged, all outgoing messages (both mail
20749and news) are stored in the draft group ``queue'' (@pxref{Drafts}).
20750You can view them there after posting, and edit them at will.
4009494e 20751
01c52d31
MB
20752You can control the circumstances under which outgoing mail is queued
20753(see @code{gnus-agent-queue-mail}, @pxref{Agent Variables}). Outgoing
20754news is always queued when Gnus is unplugged, and never otherwise.
4009494e 20755
01c52d31
MB
20756You can send the messages either from the draft group with the special
20757commands available there, or you can use the @kbd{J S} command in the
20758group buffer to send all the sendable messages in the draft group.
20759Posting news will only work when Gnus is plugged, but you can send
20760mail at any time.
4009494e 20761
01c52d31
MB
20762If sending mail while unplugged does not work for you and you worry
20763about hitting @kbd{J S} by accident when unplugged, you can have Gnus
20764ask you to confirm your action (see
20765@code{gnus-agent-prompt-send-queue}, @pxref{Agent Variables}).
4009494e
GM
20766
20767@node Agent Variables
20768@subsection Agent Variables
20769
20770@table @code
01c52d31
MB
20771@item gnus-agent
20772@vindex gnus-agent
20773Is the agent enabled? The default is @code{t}. When first enabled,
20774the agent will use @code{gnus-agent-auto-agentize-methods} to
20775automatically mark some back ends as agentized. You may change which
20776back ends are agentized using the agent commands in the server buffer.
20777
20778To enter the server buffer, use the @kbd{^}
20779(@code{gnus-group-enter-server-mode}) command in the group buffer.
20780
20781
4009494e
GM
20782@item gnus-agent-directory
20783@vindex gnus-agent-directory
20784Where the Gnus Agent will store its files. The default is
20785@file{~/News/agent/}.
20786
20787@item gnus-agent-handle-level
20788@vindex gnus-agent-handle-level
20789Groups on levels (@pxref{Group Levels}) higher than this variable will
20790be ignored by the Agent. The default is @code{gnus-level-subscribed},
20791which means that only subscribed group will be considered by the Agent
20792by default.
20793
20794@item gnus-agent-plugged-hook
20795@vindex gnus-agent-plugged-hook
20796Hook run when connecting to the network.
20797
20798@item gnus-agent-unplugged-hook
20799@vindex gnus-agent-unplugged-hook
20800Hook run when disconnecting from the network.
20801
20802@item gnus-agent-fetched-hook
20803@vindex gnus-agent-fetched-hook
20804Hook run when finished fetching articles.
20805
20806@item gnus-agent-cache
20807@vindex gnus-agent-cache
20808Variable to control whether use the locally stored @acronym{NOV} and
20809articles when plugged, e.g. essentially using the Agent as a cache.
20810The default is non-@code{nil}, which means to use the Agent as a cache.
20811
20812@item gnus-agent-go-online
20813@vindex gnus-agent-go-online
20814If @code{gnus-agent-go-online} is @code{nil}, the Agent will never
20815automatically switch offline servers into online status. If it is
20816@code{ask}, the default, the Agent will ask if you wish to switch
20817offline servers into online status when you re-connect. If it has any
20818other value, all offline servers will be automatically switched into
20819online status.
20820
20821@item gnus-agent-mark-unread-after-downloaded
20822@vindex gnus-agent-mark-unread-after-downloaded
20823If @code{gnus-agent-mark-unread-after-downloaded} is non-@code{nil},
20824mark articles as unread after downloading. This is usually a safe
20825thing to do as the newly downloaded article has obviously not been
20826read. The default is @code{t}.
20827
01c52d31
MB
20828@item gnus-agent-synchronize-flags
20829@vindex gnus-agent-synchronize-flags
20830If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
20831never automatically synchronize flags. If it is @code{ask}, which is
20832the default, the Agent will check if you made any changes and if so
20833ask if you wish to synchronize these when you re-connect. If it has
20834any other value, all flags will be synchronized automatically.
20835
4009494e
GM
20836@item gnus-agent-consider-all-articles
20837@vindex gnus-agent-consider-all-articles
20838If @code{gnus-agent-consider-all-articles} is non-@code{nil}, the
20839agent will let the agent predicate decide whether articles need to be
20840downloaded or not, for all articles. When @code{nil}, the default,
20841the agent will only let the predicate decide whether unread articles
20842are downloaded or not. If you enable this, you may also want to look
20843into the agent expiry settings (@pxref{Category Variables}), so that
20844the agent doesn't download articles which the agent will later expire,
20845over and over again.
20846
20847@item gnus-agent-max-fetch-size
20848@vindex gnus-agent-max-fetch-size
20849The agent fetches articles into a temporary buffer prior to parsing
20850them into individual files. To avoid exceeding the max. buffer size,
20851the agent alternates between fetching and parsing until all articles
20852have been fetched. @code{gnus-agent-max-fetch-size} provides a size
20853limit to control how often the cycling occurs. A large value improves
20854performance. A small value minimizes the time lost should the
20855connection be lost while fetching (You may need to run
20856@code{gnus-agent-regenerate-group} to update the group's state.
20857However, all articles parsed prior to loosing the connection will be
20858available while unplugged). The default is 10M so it is unusual to
20859see any cycling.
20860
20861@item gnus-server-unopen-status
20862@vindex gnus-server-unopen-status
20863Perhaps not an Agent variable, but closely related to the Agent, this
20864variable says what will happen if Gnus cannot open a server. If the
20865Agent is enabled, the default, @code{nil}, makes Gnus ask the user
20866whether to deny the server or whether to unplug the agent. If the
20867Agent is disabled, Gnus always simply deny the server. Other choices
20868for this variable include @code{denied} and @code{offline} the latter
20869is only valid if the Agent is used.
20870
20871@item gnus-auto-goto-ignores
20872@vindex gnus-auto-goto-ignores
20873Another variable that isn't an Agent variable, yet so closely related
20874that most will look for it here, this variable tells the summary
20875buffer how to maneuver around undownloaded (only headers stored in the
20876agent) and unfetched (neither article nor headers stored) articles.
20877
20878The valid values are @code{nil} (maneuver to any article),
20879@code{undownloaded} (maneuvering while unplugged ignores articles that
20880have not been fetched), @code{always-undownloaded} (maneuvering always
20881ignores articles that have not been fetched), @code{unfetched}
20882(maneuvering ignores articles whose headers have not been fetched).
20883
01c52d31
MB
20884@item gnus-agent-queue-mail
20885@vindex gnus-agent-queue-mail
20886When @code{gnus-agent-queue-mail} is @code{always}, Gnus will always
20887queue mail rather than sending it straight away. When @code{t}, Gnus
20888will queue mail when unplugged only. When @code{nil}, never queue
20889mail. The default is @code{t}.
20890
20891@item gnus-agent-prompt-send-queue
20892@vindex gnus-agent-prompt-send-queue
20893When @code{gnus-agent-prompt-send-queue} is non-@code{nil} Gnus will
20894prompt you to confirm that you really wish to proceed if you hit
20895@kbd{J S} while unplugged. The default is @code{nil}.
20896
4009494e
GM
20897@item gnus-agent-auto-agentize-methods
20898@vindex gnus-agent-auto-agentize-methods
20899If you have never used the Agent before (or more technically, if
20900@file{~/News/agent/lib/servers} does not exist), Gnus will
20901automatically agentize a few servers for you. This variable control
01c52d31
MB
20902which back ends should be auto-agentized. It is typically only useful
20903to agentize remote back ends. The auto-agentizing has the same effect
4009494e
GM
20904as running @kbd{J a} on the servers (@pxref{Server Agent Commands}).
20905If the file exist, you must manage the servers manually by adding or
20906removing them, this variable is only applicable the first time you
20907start Gnus. The default is @samp{(nntp nnimap)}.
20908
20909@end table
20910
20911
20912@node Example Setup
20913@subsection Example Setup
20914
20915If you don't want to read this manual, and you have a fairly standard
20916setup, you may be able to use something like the following as your
20917@file{~/.gnus.el} file to get started.
20918
20919@lisp
20920;; @r{Define how Gnus is to fetch news. We do this over @acronym{NNTP}}
20921;; @r{from your ISP's server.}
20922(setq gnus-select-method '(nntp "news.your-isp.com"))
20923
20924;; @r{Define how Gnus is to read your mail. We read mail from}
20925;; @r{your ISP's @acronym{POP} server.}
20926(setq mail-sources '((pop :server "pop.your-isp.com")))
20927
20928;; @r{Say how Gnus is to store the mail. We use nnml groups.}
20929(setq gnus-secondary-select-methods '((nnml "")))
20930
20931;; @r{Make Gnus into an offline newsreader.}
20932;; (gnus-agentize) ; @r{The obsolete setting.}
20933;; (setq gnus-agent t) ; @r{Now the default.}
20934@end lisp
20935
20936That should be it, basically. Put that in your @file{~/.gnus.el} file,
20937edit to suit your needs, start up PPP (or whatever), and type @kbd{M-x
20938gnus}.
20939
20940If this is the first time you've run Gnus, you will be subscribed
20941automatically to a few default newsgroups. You'll probably want to
20942subscribe to more groups, and to do that, you have to query the
20943@acronym{NNTP} server for a complete list of groups with the @kbd{A A}
20944command. This usually takes quite a while, but you only have to do it
20945once.
20946
20947After reading and parsing a while, you'll be presented with a list of
20948groups. Subscribe to the ones you want to read with the @kbd{u}
20949command. @kbd{l} to make all the killed groups disappear after you've
20950subscribe to all the groups you want to read. (@kbd{A k} will bring
20951back all the killed groups.)
20952
20953You can now read the groups at once, or you can download the articles
20954with the @kbd{J s} command. And then read the rest of this manual to
20955find out which of the other gazillion things you want to customize.
20956
20957
20958@node Batching Agents
20959@subsection Batching Agents
20960@findex gnus-agent-batch
20961
20962Having the Gnus Agent fetch articles (and post whatever messages you've
20963written) is quite easy once you've gotten things set up properly. The
20964following shell script will do everything that is necessary:
20965
20966You can run a complete batch command from the command line with the
20967following incantation:
20968
20969@example
20970#!/bin/sh
20971emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-agent-batch >/dev/null 2>&1
20972@end example
20973
20974
20975@node Agent Caveats
20976@subsection Agent Caveats
20977
20978The Gnus Agent doesn't seem to work like most other offline
20979newsreaders. Here are some common questions that some imaginary people
20980may ask:
20981
20982@table @dfn
20983@item If I read an article while plugged, do they get entered into the Agent?
20984
20985@strong{No}. If you want this behavior, add
20986@code{gnus-agent-fetch-selected-article} to
20987@code{gnus-select-article-hook}.
20988
20989@item If I read an article while plugged, and the article already exists in
20990the Agent, will it get downloaded once more?
20991
20992@strong{No}, unless @code{gnus-agent-cache} is @code{nil}.
20993
20994@end table
20995
20996In short, when Gnus is unplugged, it only looks into the locally stored
20997articles; when it's plugged, it talks to your ISP and may also use the
20998locally stored articles.
20999
21000
21001@node Scoring
21002@chapter Scoring
21003@cindex scoring
21004
21005Other people use @dfn{kill files}, but we here at Gnus Towers like
21006scoring better than killing, so we'd rather switch than fight. They do
21007something completely different as well, so sit up straight and pay
21008attention!
21009
21010@vindex gnus-summary-mark-below
21011All articles have a default score (@code{gnus-summary-default-score}),
21012which is 0 by default. This score may be raised or lowered either
21013interactively or by score files. Articles that have a score lower than
21014@code{gnus-summary-mark-below} are marked as read.
21015
21016Gnus will read any @dfn{score files} that apply to the current group
21017before generating the summary buffer.
21018
21019There are several commands in the summary buffer that insert score
21020entries based on the current article. You can, for instance, ask Gnus to
21021lower or increase the score of all articles with a certain subject.
21022
21023There are two sorts of scoring entries: Permanent and temporary.
21024Temporary score entries are self-expiring entries. Any entries that are
21025temporary and have not been used for, say, a week, will be removed
21026silently to help keep the sizes of the score files down.
21027
21028@menu
21029* Summary Score Commands:: Adding score entries for the current group.
21030* Group Score Commands:: General score commands.
21031* Score Variables:: Customize your scoring. (My, what terminology).
21032* Score File Format:: What a score file may contain.
21033* Score File Editing:: You can edit score files by hand as well.
21034* Adaptive Scoring:: Big Sister Gnus knows what you read.
21035* Home Score File:: How to say where new score entries are to go.
21036* Followups To Yourself:: Having Gnus notice when people answer you.
21037* Scoring On Other Headers:: Scoring on non-standard headers.
21038* Scoring Tips:: How to score effectively.
21039* Reverse Scoring:: That problem child of old is not problem.
21040* Global Score Files:: Earth-spanning, ear-splitting score files.
21041* Kill Files:: They are still here, but they can be ignored.
21042* Converting Kill Files:: Translating kill files to score files.
4009494e
GM
21043* Advanced Scoring:: Using logical expressions to build score rules.
21044* Score Decays:: It can be useful to let scores wither away.
21045@end menu
21046
21047
21048@node Summary Score Commands
21049@section Summary Score Commands
21050@cindex score commands
21051
21052The score commands that alter score entries do not actually modify real
21053score files. That would be too inefficient. Gnus maintains a cache of
21054previously loaded score files, one of which is considered the
21055@dfn{current score file alist}. The score commands simply insert
21056entries into this list, and upon group exit, this list is saved.
21057
21058The current score file is by default the group's local score file, even
21059if no such score file actually exists. To insert score commands into
21060some other score file (e.g. @file{all.SCORE}), you must first make this
21061score file the current one.
21062
21063General score commands that don't actually change the score file:
21064
21065@table @kbd
21066
21067@item V s
21068@kindex V s (Summary)
21069@findex gnus-summary-set-score
21070Set the score of the current article (@code{gnus-summary-set-score}).
21071
21072@item V S
21073@kindex V S (Summary)
21074@findex gnus-summary-current-score
21075Display the score of the current article
21076(@code{gnus-summary-current-score}).
21077
21078@item V t
21079@kindex V t (Summary)
21080@findex gnus-score-find-trace
21081Display all score rules that have been used on the current article
21082(@code{gnus-score-find-trace}). In the @code{*Score Trace*} buffer, you
21083may type @kbd{e} to edit score file corresponding to the score rule on
21084current line and @kbd{f} to format (@code{gnus-score-pretty-print}) the
21085score file and edit it.
21086
21087@item V w
21088@kindex V w (Summary)
21089@findex gnus-score-find-favourite-words
21090List words used in scoring (@code{gnus-score-find-favourite-words}).
21091
21092@item V R
21093@kindex V R (Summary)
21094@findex gnus-summary-rescore
21095Run the current summary through the scoring process
21096(@code{gnus-summary-rescore}). This might be useful if you're playing
21097around with your score files behind Gnus' back and want to see the
21098effect you're having.
21099
21100@item V c
21101@kindex V c (Summary)
21102@findex gnus-score-change-score-file
21103Make a different score file the current
21104(@code{gnus-score-change-score-file}).
21105
21106@item V e
21107@kindex V e (Summary)
21108@findex gnus-score-edit-current-scores
21109Edit the current score file (@code{gnus-score-edit-current-scores}).
21110You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score
21111File Editing}).
21112
21113@item V f
21114@kindex V f (Summary)
21115@findex gnus-score-edit-file
21116Edit a score file and make this score file the current one
21117(@code{gnus-score-edit-file}).
21118
21119@item V F
21120@kindex V F (Summary)
21121@findex gnus-score-flush-cache
21122Flush the score cache (@code{gnus-score-flush-cache}). This is useful
21123after editing score files.
21124
21125@item V C
21126@kindex V C (Summary)
21127@findex gnus-score-customize
21128Customize a score file in a visually pleasing manner
21129(@code{gnus-score-customize}).
21130
21131@end table
21132
21133The rest of these commands modify the local score file.
21134
21135@table @kbd
21136
21137@item V m
21138@kindex V m (Summary)
21139@findex gnus-score-set-mark-below
21140Prompt for a score, and mark all articles with a score below this as
21141read (@code{gnus-score-set-mark-below}).
21142
21143@item V x
21144@kindex V x (Summary)
21145@findex gnus-score-set-expunge-below
21146Prompt for a score, and add a score rule to the current score file to
21147expunge all articles below this score
21148(@code{gnus-score-set-expunge-below}).
21149@end table
21150
21151The keystrokes for actually making score entries follow a very regular
21152pattern, so there's no need to list all the commands. (Hundreds of
21153them.)
21154
21155@findex gnus-summary-increase-score
21156@findex gnus-summary-lower-score
21157
21158@enumerate
21159@item
21160The first key is either @kbd{I} (upper case i) for increasing the score
21161or @kbd{L} for lowering the score.
21162@item
21163The second key says what header you want to score on. The following
21164keys are available:
21165@table @kbd
21166
21167@item a
21168Score on the author name.
21169
21170@item s
21171Score on the subject line.
21172
21173@item x
21174Score on the @code{Xref} line---i.e., the cross-posting line.
21175
21176@item r
21177Score on the @code{References} line.
21178
21179@item d
21180Score on the date.
21181
21182@item l
21183Score on the number of lines.
21184
21185@item i
21186Score on the @code{Message-ID} header.
21187
21188@item e
21189Score on an ``extra'' header, that is, one of those in gnus-extra-headers,
21190if your @acronym{NNTP} server tracks additional header data in overviews.
21191
21192@item f
21193Score on followups---this matches the author name, and adds scores to
21194the followups to this author. (Using this key leads to the creation of
21195@file{ADAPT} files.)
21196
21197@item b
21198Score on the body.
21199
21200@item h
21201Score on the head.
21202
21203@item t
21204Score on thread. (Using this key leads to the creation of @file{ADAPT}
21205files.)
21206
21207@end table
21208
21209@item
21210The third key is the match type. Which match types are valid depends on
21211what headers you are scoring on.
21212
21213@table @code
21214
21215@item strings
21216
21217@table @kbd
21218
21219@item e
21220Exact matching.
21221
21222@item s
21223Substring matching.
21224
21225@item f
21226Fuzzy matching (@pxref{Fuzzy Matching}).
21227
21228@item r
21229Regexp matching
21230@end table
21231
21232@item date
21233@table @kbd
21234
21235@item b
21236Before date.
21237
21238@item a
21239After date.
21240
21241@item n
21242This date.
21243@end table
21244
21245@item number
21246@table @kbd
21247
21248@item <
21249Less than number.
21250
21251@item =
21252Equal to number.
21253
21254@item >
21255Greater than number.
21256@end table
21257@end table
21258
21259@item
21260The fourth and usually final key says whether this is a temporary (i.e.,
21261expiring) score entry, or a permanent (i.e., non-expiring) score entry,
21262or whether it is to be done immediately, without adding to the score
21263file.
21264@table @kbd
21265
21266@item t
21267Temporary score entry.
21268
21269@item p
21270Permanent score entry.
21271
21272@item i
21273Immediately scoring.
21274@end table
21275
21276@item
21277If you are scoring on `e' (extra) headers, you will then be prompted for
21278the header name on which you wish to score. This must be a header named
21279in gnus-extra-headers, and @samp{TAB} completion is available.
21280
21281@end enumerate
21282
21283So, let's say you want to increase the score on the current author with
21284exact matching permanently: @kbd{I a e p}. If you want to lower the
21285score based on the subject line, using substring matching, and make a
21286temporary score entry: @kbd{L s s t}. Pretty easy.
21287
21288To make things a bit more complicated, there are shortcuts. If you use
21289a capital letter on either the second or third keys, Gnus will use
21290defaults for the remaining one or two keystrokes. The defaults are
21291``substring'' and ``temporary''. So @kbd{I A} is the same as @kbd{I a s
21292t}, and @kbd{I a R} is the same as @kbd{I a r t}.
21293
21294These functions take both the numerical prefix and the symbolic prefix
21295(@pxref{Symbolic Prefixes}). A numerical prefix says how much to lower
21296(or increase) the score of the article. A symbolic prefix of @code{a}
21297says to use the @file{all.SCORE} file for the command instead of the
21298current score file.
21299
21300@vindex gnus-score-mimic-keymap
21301The @code{gnus-score-mimic-keymap} says whether these commands will
21302pretend they are keymaps or not.
21303
21304
21305@node Group Score Commands
21306@section Group Score Commands
21307@cindex group score commands
21308
21309There aren't many of these as yet, I'm afraid.
21310
21311@table @kbd
21312
01c52d31
MB
21313@item W e
21314@kindex W e (Group)
21315@findex gnus-score-edit-all-score
21316Edit the apply-to-all-groups all.SCORE file. You will be popped into
21317a @code{gnus-score-mode} buffer (@pxref{Score File Editing}).
21318
4009494e
GM
21319@item W f
21320@kindex W f (Group)
21321@findex gnus-score-flush-cache
21322Gnus maintains a cache of score alists to avoid having to reload them
21323all the time. This command will flush the cache
21324(@code{gnus-score-flush-cache}).
21325
21326@end table
21327
21328You can do scoring from the command line by saying something like:
21329
21330@findex gnus-batch-score
21331@cindex batch scoring
21332@example
21333$ emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score
21334@end example
21335
21336
21337@node Score Variables
21338@section Score Variables
21339@cindex score variables
21340
21341@table @code
21342
21343@item gnus-use-scoring
21344@vindex gnus-use-scoring
21345If @code{nil}, Gnus will not check for score files, and will not, in
21346general, do any score-related work. This is @code{t} by default.
21347
21348@item gnus-kill-killed
21349@vindex gnus-kill-killed
21350If this variable is @code{nil}, Gnus will never apply score files to
21351articles that have already been through the kill process. While this
21352may save you lots of time, it also means that if you apply a kill file
21353to a group, and then change the kill file and want to run it over you
21354group again to kill more articles, it won't work. You have to set this
21355variable to @code{t} to do that. (It is @code{t} by default.)
21356
21357@item gnus-kill-files-directory
21358@vindex gnus-kill-files-directory
21359All kill and score files will be stored in this directory, which is
21360initialized from the @env{SAVEDIR} environment variable by default.
21361This is @file{~/News/} by default.
21362
21363@item gnus-score-file-suffix
21364@vindex gnus-score-file-suffix
21365Suffix to add to the group name to arrive at the score file name
21366(@file{SCORE} by default.)
21367
21368@item gnus-score-uncacheable-files
21369@vindex gnus-score-uncacheable-files
21370@cindex score cache
21371All score files are normally cached to avoid excessive re-loading of
bbbe940b 21372score files. However, this might make your Emacs grow big and
4009494e
GM
21373bloated, so this regexp can be used to weed out score files unlikely
21374to be needed again. It would be a bad idea to deny caching of
21375@file{all.SCORE}, while it might be a good idea to not cache
21376@file{comp.infosystems.www.authoring.misc.ADAPT}. In fact, this
21377variable is @samp{ADAPT$} by default, so no adaptive score files will
21378be cached.
21379
21380@item gnus-save-score
21381@vindex gnus-save-score
21382If you have really complicated score files, and do lots of batch
21383scoring, then you might set this variable to @code{t}. This will make
21384Gnus save the scores into the @file{.newsrc.eld} file.
21385
21386If you do not set this to @code{t}, then manual scores (like those set
21387with @kbd{V s} (@code{gnus-summary-set-score})) will not be preserved
21388across group visits.
21389
21390@item gnus-score-interactive-default-score
21391@vindex gnus-score-interactive-default-score
21392Score used by all the interactive raise/lower commands to raise/lower
21393score with. Default is 1000, which may seem excessive, but this is to
21394ensure that the adaptive scoring scheme gets enough room to play with.
21395We don't want the small changes from the adaptive scoring to overwrite
21396manually entered data.
21397
21398@item gnus-summary-default-score
21399@vindex gnus-summary-default-score
21400Default score of an article, which is 0 by default.
21401
21402@item gnus-summary-expunge-below
21403@vindex gnus-summary-expunge-below
21404Don't display the summary lines of articles that have scores lower than
21405this variable. This is @code{nil} by default, which means that no
21406articles will be hidden. This variable is local to the summary buffers,
21407and has to be set from @code{gnus-summary-mode-hook}.
21408
21409@item gnus-score-over-mark
21410@vindex gnus-score-over-mark
21411Mark (in the third column) used for articles with a score over the
21412default. Default is @samp{+}.
21413
21414@item gnus-score-below-mark
21415@vindex gnus-score-below-mark
21416Mark (in the third column) used for articles with a score below the
21417default. Default is @samp{-}.
21418
21419@item gnus-score-find-score-files-function
21420@vindex gnus-score-find-score-files-function
21421Function used to find score files for the current group. This function
21422is called with the name of the group as the argument.
21423
21424Predefined functions available are:
21425@table @code
21426
21427@item gnus-score-find-single
21428@findex gnus-score-find-single
21429Only apply the group's own score file.
21430
21431@item gnus-score-find-bnews
21432@findex gnus-score-find-bnews
21433Apply all score files that match, using bnews syntax. This is the
21434default. If the current group is @samp{gnu.emacs.gnus}, for instance,
21435@file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and
21436@file{gnu.all.SCORE} would all apply. In short, the instances of
21437@samp{all} in the score file names are translated into @samp{.*}, and
21438then a regexp match is done.
21439
21440This means that if you have some score entries that you want to apply to
21441all groups, then you put those entries in the @file{all.SCORE} file.
21442
21443The score files are applied in a semi-random order, although Gnus will
21444try to apply the more general score files before the more specific score
21445files. It does this by looking at the number of elements in the score
21446file names---discarding the @samp{all} elements.
21447
21448@item gnus-score-find-hierarchical
21449@findex gnus-score-find-hierarchical
21450Apply all score files from all the parent groups. This means that you
21451can't have score files like @file{all.SCORE}, but you can have
21452@file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE} for each
21453server.
21454
21455@end table
21456This variable can also be a list of functions. In that case, all
21457these functions will be called with the group name as argument, and
21458all the returned lists of score files will be applied. These
21459functions can also return lists of lists of score alists directly. In
21460that case, the functions that return these non-file score alists
21461should probably be placed before the ``real'' score file functions, to
21462ensure that the last score file returned is the local score file.
21463Phu.
21464
21465For example, to do hierarchical scoring but use a non-server-specific
21466overall score file, you could use the value
21467@example
21468(list (lambda (group) ("all.SCORE"))
21469 'gnus-score-find-hierarchical)
21470@end example
21471
21472@item gnus-score-expiry-days
21473@vindex gnus-score-expiry-days
21474This variable says how many days should pass before an unused score file
21475entry is expired. If this variable is @code{nil}, no score file entries
21476are expired. It's 7 by default.
21477
21478@item gnus-update-score-entry-dates
21479@vindex gnus-update-score-entry-dates
21480If this variable is non-@code{nil}, temporary score entries that have
21481been triggered (matched) will have their dates updated. (This is how Gnus
21482controls expiry---all non-matched-entries will become too old while
21483matched entries will stay fresh and young.) However, if you set this
21484variable to @code{nil}, even matched entries will grow old and will
21485have to face that oh-so grim reaper.
21486
21487@item gnus-score-after-write-file-function
21488@vindex gnus-score-after-write-file-function
21489Function called with the name of the score file just written.
21490
21491@item gnus-score-thread-simplify
21492@vindex gnus-score-thread-simplify
21493If this variable is non-@code{nil}, article subjects will be
21494simplified for subject scoring purposes in the same manner as with
21495threading---according to the current value of
21496@code{gnus-simplify-subject-functions}. If the scoring entry uses
21497@code{substring} or @code{exact} matching, the match will also be
21498simplified in this manner.
21499
21500@end table
21501
21502
21503@node Score File Format
21504@section Score File Format
21505@cindex score file format
21506
21507A score file is an @code{emacs-lisp} file that normally contains just a
21508single form. Casual users are not expected to edit these files;
21509everything can be changed from the summary buffer.
21510
21511Anyway, if you'd like to dig into it yourself, here's an example:
21512
21513@lisp
21514(("from"
21515 ("Lars Ingebrigtsen" -10000)
21516 ("Per Abrahamsen")
21517 ("larsi\\|lmi" -50000 nil R))
21518 ("subject"
21519 ("Ding is Badd" nil 728373))
21520 ("xref"
21521 ("alt.politics" -1000 728372 s))
21522 ("lines"
21523 (2 -100 nil <))
21524 (mark 0)
21525 (expunge -1000)
21526 (mark-and-expunge -10)
21527 (read-only nil)
21528 (orphan -10)
21529 (adapt t)
21530 (files "/hom/larsi/News/gnu.SCORE")
21531 (exclude-files "all.SCORE")
21532 (local (gnus-newsgroup-auto-expire t)
21533 (gnus-summary-make-false-root empty))
21534 (eval (ding)))
21535@end lisp
21536
21537This example demonstrates most score file elements. @xref{Advanced
21538Scoring}, for a different approach.
21539
21540Even though this looks much like Lisp code, nothing here is actually
21541@code{eval}ed. The Lisp reader is used to read this form, though, so it
21542has to be valid syntactically, if not semantically.
21543
21544Six keys are supported by this alist:
21545
21546@table @code
21547
21548@item STRING
21549If the key is a string, it is the name of the header to perform the
21550match on. Scoring can only be performed on these eight headers:
21551@code{From}, @code{Subject}, @code{References}, @code{Message-ID},
21552@code{Xref}, @code{Lines}, @code{Chars} and @code{Date}. In addition to
21553these headers, there are three strings to tell Gnus to fetch the entire
21554article and do the match on larger parts of the article: @code{Body}
21555will perform the match on the body of the article, @code{Head} will
21556perform the match on the head of the article, and @code{All} will
21557perform the match on the entire article. Note that using any of these
21558last three keys will slow down group entry @emph{considerably}. The
21559final ``header'' you can score on is @code{Followup}. These score
21560entries will result in new score entries being added for all follow-ups
21561to articles that matches these score entries.
21562
21563Following this key is an arbitrary number of score entries, where each
21564score entry has one to four elements.
21565@enumerate
21566
21567@item
21568The first element is the @dfn{match element}. On most headers this will
21569be a string, but on the Lines and Chars headers, this must be an
21570integer.
21571
21572@item
21573If the second element is present, it should be a number---the @dfn{score
21574element}. This number should be an integer in the neginf to posinf
21575interval. This number is added to the score of the article if the match
21576is successful. If this element is not present, the
21577@code{gnus-score-interactive-default-score} number will be used
21578instead. This is 1000 by default.
21579
21580@item
21581If the third element is present, it should be a number---the @dfn{date
21582element}. This date says when the last time this score entry matched,
21583which provides a mechanism for expiring the score entries. It this
21584element is not present, the score entry is permanent. The date is
21585represented by the number of days since December 31, 1 BCE.
21586
21587@item
21588If the fourth element is present, it should be a symbol---the @dfn{type
21589element}. This element specifies what function should be used to see
21590whether this score entry matches the article. What match types that can
21591be used depends on what header you wish to perform the match on.
21592@table @dfn
21593
21594@item From, Subject, References, Xref, Message-ID
21595For most header types, there are the @code{r} and @code{R} (regexp), as
21596well as @code{s} and @code{S} (substring) types, and @code{e} and
21597@code{E} (exact match), and @code{w} (word match) types. If this
21598element is not present, Gnus will assume that substring matching should
21599be used. @code{R}, @code{S}, and @code{E} differ from the others in
21600that the matches will be done in a case-sensitive manner. All these
21601one-letter types are really just abbreviations for the @code{regexp},
21602@code{string}, @code{exact}, and @code{word} types, which you can use
21603instead, if you feel like.
21604
21605@item Extra
21606Just as for the standard string overview headers, if you are using
21607gnus-extra-headers, you can score on these headers' values. In this
21608case, there is a 5th element in the score entry, being the name of the
21609header to be scored. The following entry is useful in your
21610@file{all.SCORE} file in case of spam attacks from a single origin
21611host, if your @acronym{NNTP} server tracks @samp{NNTP-Posting-Host} in
21612overviews:
21613
21614@lisp
21615("111.222.333.444" -1000 nil s
21616 "NNTP-Posting-Host")
21617@end lisp
21618
21619@item Lines, Chars
21620These two headers use different match types: @code{<}, @code{>},
21621@code{=}, @code{>=} and @code{<=}.
21622
21623These predicates are true if
21624
21625@example
21626(PREDICATE HEADER MATCH)
21627@end example
21628
21629evaluates to non-@code{nil}. For instance, the advanced match
21630@code{("lines" 4 <)} (@pxref{Advanced Scoring}) will result in the
21631following form:
21632
21633@lisp
21634(< header-value 4)
21635@end lisp
21636
21637Or to put it another way: When using @code{<} on @code{Lines} with 4 as
21638the match, we get the score added if the article has less than 4 lines.
21639(It's easy to get confused and think it's the other way around. But
21640it's not. I think.)
21641
21642When matching on @code{Lines}, be careful because some back ends (like
21643@code{nndir}) do not generate @code{Lines} header, so every article ends
21644up being marked as having 0 lines. This can lead to strange results if
21645you happen to lower score of the articles with few lines.
21646
21647@item Date
21648For the Date header we have three kinda silly match types:
21649@code{before}, @code{at} and @code{after}. I can't really imagine this
21650ever being useful, but, like, it would feel kinda silly not to provide
21651this function. Just in case. You never know. Better safe than sorry.
21652Once burnt, twice shy. Don't judge a book by its cover. Never not have
21653sex on a first date. (I have been told that at least one person, and I
21654quote, ``found this function indispensable'', however.)
21655
21656@cindex ISO8601
21657@cindex date
21658A more useful match type is @code{regexp}. With it, you can match the
21659date string using a regular expression. The date is normalized to
21660ISO8601 compact format first---@var{YYYYMMDD}@code{T}@var{HHMMSS}. If
21661you want to match all articles that have been posted on April 1st in
21662every year, you could use @samp{....0401.........} as a match string,
21663for instance. (Note that the date is kept in its original time zone, so
21664this will match articles that were posted when it was April 1st where
21665the article was posted from. Time zones are such wholesome fun for the
21666whole family, eh?)
21667
21668@item Head, Body, All
21669These three match keys use the same match types as the @code{From} (etc)
21670header uses.
21671
21672@item Followup
21673This match key is somewhat special, in that it will match the
21674@code{From} header, and affect the score of not only the matching
21675articles, but also all followups to the matching articles. This allows
21676you e.g. increase the score of followups to your own articles, or
21677decrease the score of followups to the articles of some known
21678trouble-maker. Uses the same match types as the @code{From} header
21679uses. (Using this match key will lead to creation of @file{ADAPT}
21680files.)
21681
21682@item Thread
21683This match key works along the same lines as the @code{Followup} match
21684key. If you say that you want to score on a (sub-)thread started by an
21685article with a @code{Message-ID} @var{x}, then you add a @samp{thread}
21686match. This will add a new @samp{thread} match for each article that
21687has @var{x} in its @code{References} header. (These new @samp{thread}
21688matches will use the @code{Message-ID}s of these matching articles.)
21689This will ensure that you can raise/lower the score of an entire thread,
21690even though some articles in the thread may not have complete
21691@code{References} headers. Note that using this may lead to
21692undeterministic scores of the articles in the thread. (Using this match
21693key will lead to creation of @file{ADAPT} files.)
21694@end table
21695@end enumerate
21696
21697@cindex score file atoms
21698@item mark
21699The value of this entry should be a number. Any articles with a score
21700lower than this number will be marked as read.
21701
21702@item expunge
21703The value of this entry should be a number. Any articles with a score
21704lower than this number will be removed from the summary buffer.
21705
21706@item mark-and-expunge
21707The value of this entry should be a number. Any articles with a score
21708lower than this number will be marked as read and removed from the
21709summary buffer.
21710
21711@item thread-mark-and-expunge
21712The value of this entry should be a number. All articles that belong to
21713a thread that has a total score below this number will be marked as read
21714and removed from the summary buffer. @code{gnus-thread-score-function}
21715says how to compute the total score for a thread.
21716
21717@item files
21718The value of this entry should be any number of file names. These files
21719are assumed to be score files as well, and will be loaded the same way
21720this one was.
21721
21722@item exclude-files
21723The clue of this entry should be any number of files. These files will
21724not be loaded, even though they would normally be so, for some reason or
21725other.
21726
21727@item eval
21728The value of this entry will be @code{eval}el. This element will be
21729ignored when handling global score files.
21730
21731@item read-only
21732Read-only score files will not be updated or saved. Global score files
21733should feature this atom (@pxref{Global Score Files}). (Note:
21734@dfn{Global} here really means @dfn{global}; not your personal
21735apply-to-all-groups score files.)
21736
21737@item orphan
21738The value of this entry should be a number. Articles that do not have
21739parents will get this number added to their scores. Imagine you follow
21740some high-volume newsgroup, like @samp{comp.lang.c}. Most likely you
21741will only follow a few of the threads, also want to see any new threads.
21742
21743You can do this with the following two score file entries:
21744
21745@example
21746 (orphan -500)
21747 (mark-and-expunge -100)
21748@end example
21749
21750When you enter the group the first time, you will only see the new
21751threads. You then raise the score of the threads that you find
21752interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) the
21753rest. Next time you enter the group, you will see new articles in the
21754interesting threads, plus any new threads.
21755
21756I.e.---the orphan score atom is for high-volume groups where a few
21757interesting threads which can't be found automatically by ordinary
21758scoring rules exist.
21759
21760@item adapt
21761This entry controls the adaptive scoring. If it is @code{t}, the
21762default adaptive scoring rules will be used. If it is @code{ignore}, no
21763adaptive scoring will be performed on this group. If it is a list, this
21764list will be used as the adaptive scoring rules. If it isn't present,
21765or is something other than @code{t} or @code{ignore}, the default
21766adaptive scoring rules will be used. If you want to use adaptive
21767scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to
21768@code{t}, and insert an @code{(adapt ignore)} in the groups where you do
21769not want adaptive scoring. If you only want adaptive scoring in a few
21770groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and
21771insert @code{(adapt t)} in the score files of the groups where you want
21772it.
21773
21774@item adapt-file
21775All adaptive score entries will go to the file named by this entry. It
21776will also be applied when entering the group. This atom might be handy
21777if you want to adapt on several groups at once, using the same adaptive
21778file for a number of groups.
21779
21780@item local
21781@cindex local variables
21782The value of this entry should be a list of @code{(@var{var}
21783@var{value})} pairs. Each @var{var} will be made buffer-local to the
21784current summary buffer, and set to the value specified. This is a
21785convenient, if somewhat strange, way of setting variables in some
21786groups if you don't like hooks much. Note that the @var{value} won't
21787be evaluated.
21788@end table
21789
21790
21791@node Score File Editing
21792@section Score File Editing
21793
21794You normally enter all scoring commands from the summary buffer, but you
21795might feel the urge to edit them by hand as well, so we've supplied you
21796with a mode for that.
21797
21798It's simply a slightly customized @code{emacs-lisp} mode, with these
21799additional commands:
21800
21801@table @kbd
21802
21803@item C-c C-c
21804@kindex C-c C-c (Score)
87035689 21805@findex gnus-score-edit-exit
4009494e 21806Save the changes you have made and return to the summary buffer
87035689 21807(@code{gnus-score-edit-exit}).
4009494e
GM
21808
21809@item C-c C-d
21810@kindex C-c C-d (Score)
21811@findex gnus-score-edit-insert-date
21812Insert the current date in numerical format
21813(@code{gnus-score-edit-insert-date}). This is really the day number, if
21814you were wondering.
21815
21816@item C-c C-p
21817@kindex C-c C-p (Score)
21818@findex gnus-score-pretty-print
21819The adaptive score files are saved in an unformatted fashion. If you
21820intend to read one of these files, you want to @dfn{pretty print} it
21821first. This command (@code{gnus-score-pretty-print}) does that for
21822you.
21823
21824@end table
21825
21826Type @kbd{M-x gnus-score-mode} to use this mode.
21827
21828@vindex gnus-score-mode-hook
21829@code{gnus-score-menu-hook} is run in score mode buffers.
21830
21831In the summary buffer you can use commands like @kbd{V f}, @kbd{V e} and
21832@kbd{V t} to begin editing score files.
21833
21834
21835@node Adaptive Scoring
21836@section Adaptive Scoring
21837@cindex adaptive scoring
21838
21839If all this scoring is getting you down, Gnus has a way of making it all
21840happen automatically---as if by magic. Or rather, as if by artificial
21841stupidity, to be precise.
21842
21843@vindex gnus-use-adaptive-scoring
21844When you read an article, or mark an article as read, or kill an
21845article, you leave marks behind. On exit from the group, Gnus can sniff
21846these marks and add score elements depending on what marks it finds.
21847You turn on this ability by setting @code{gnus-use-adaptive-scoring} to
21848@code{t} or @code{(line)}. If you want score adaptively on separate
21849words appearing in the subjects, you should set this variable to
21850@code{(word)}. If you want to use both adaptive methods, set this
21851variable to @code{(word line)}.
21852
21853@vindex gnus-default-adaptive-score-alist
21854To give you complete control over the scoring process, you can customize
21855the @code{gnus-default-adaptive-score-alist} variable. For instance, it
21856might look something like this:
21857
21858@lisp
21859(setq gnus-default-adaptive-score-alist
21860 '((gnus-unread-mark)
21861 (gnus-ticked-mark (from 4))
21862 (gnus-dormant-mark (from 5))
21863 (gnus-del-mark (from -4) (subject -1))
21864 (gnus-read-mark (from 4) (subject 2))
21865 (gnus-expirable-mark (from -1) (subject -1))
21866 (gnus-killed-mark (from -1) (subject -3))
21867 (gnus-kill-file-mark)
21868 (gnus-ancient-mark)
21869 (gnus-low-score-mark)
21870 (gnus-catchup-mark (from -1) (subject -1))))
21871@end lisp
21872
21873As you see, each element in this alist has a mark as a key (either a
21874variable name or a ``real'' mark---a character). Following this key is
21875a arbitrary number of header/score pairs. If there are no header/score
21876pairs following the key, no adaptive scoring will be done on articles
21877that have that key as the article mark. For instance, articles with
21878@code{gnus-unread-mark} in the example above will not get adaptive score
21879entries.
21880
21881Each article can have only one mark, so just a single of these rules
21882will be applied to each article.
21883
21884To take @code{gnus-del-mark} as an example---this alist says that all
21885articles that have that mark (i.e., are marked with @samp{e}) will have a
21886score entry added to lower based on the @code{From} header by -4, and
21887lowered by @code{Subject} by -1. Change this to fit your prejudices.
21888
21889If you have marked 10 articles with the same subject with
21890@code{gnus-del-mark}, the rule for that mark will be applied ten times.
21891That means that that subject will get a score of ten times -1, which
21892should be, unless I'm much mistaken, -10.
21893
21894If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), all
21895the read articles will be marked with the @samp{E} mark. This'll
21896probably make adaptive scoring slightly impossible, so auto-expiring and
21897adaptive scoring doesn't really mix very well.
21898
21899The headers you can score on are @code{from}, @code{subject},
21900@code{message-id}, @code{references}, @code{xref}, @code{lines},
21901@code{chars} and @code{date}. In addition, you can score on
21902@code{followup}, which will create an adaptive score entry that matches
21903on the @code{References} header using the @code{Message-ID} of the
21904current article, thereby matching the following thread.
21905
21906If you use this scheme, you should set the score file atom @code{mark}
21907to something small---like -300, perhaps, to avoid having small random
21908changes result in articles getting marked as read.
21909
21910After using adaptive scoring for a week or so, Gnus should start to
21911become properly trained and enhance the authors you like best, and kill
21912the authors you like least, without you having to say so explicitly.
21913
21914You can control what groups the adaptive scoring is to be performed on
21915by using the score files (@pxref{Score File Format}). This will also
21916let you use different rules in different groups.
21917
21918@vindex gnus-adaptive-file-suffix
21919The adaptive score entries will be put into a file where the name is the
21920group name with @code{gnus-adaptive-file-suffix} appended. The default
21921is @file{ADAPT}.
21922
01c52d31
MB
21923@vindex gnus-adaptive-pretty-print
21924Adaptive score files can get huge and are not meant to be edited by
21925human hands. If @code{gnus-adaptive-pretty-print} is @code{nil} (the
21926deafult) those files will not be written in a human readable way.
21927
4009494e
GM
21928@vindex gnus-score-exact-adapt-limit
21929When doing adaptive scoring, substring or fuzzy matching would probably
21930give you the best results in most cases. However, if the header one
21931matches is short, the possibility for false positives is great, so if
21932the length of the match is less than
21933@code{gnus-score-exact-adapt-limit}, exact matching will be used. If
21934this variable is @code{nil}, exact matching will always be used to avoid
21935this problem.
21936
21937@vindex gnus-default-adaptive-word-score-alist
21938As mentioned above, you can adapt either on individual words or entire
21939headers. If you adapt on words, the
21940@code{gnus-default-adaptive-word-score-alist} variable says what score
21941each instance of a word should add given a mark.
21942
21943@lisp
21944(setq gnus-default-adaptive-word-score-alist
21945 `((,gnus-read-mark . 30)
21946 (,gnus-catchup-mark . -10)
21947 (,gnus-killed-mark . -20)
21948 (,gnus-del-mark . -15)))
21949@end lisp
21950
21951This is the default value. If you have adaption on words enabled, every
21952word that appears in subjects of articles marked with
21953@code{gnus-read-mark} will result in a score rule that increase the
21954score with 30 points.
21955
21956@vindex gnus-default-ignored-adaptive-words
21957@vindex gnus-ignored-adaptive-words
21958Words that appear in the @code{gnus-default-ignored-adaptive-words} list
21959will be ignored. If you wish to add more words to be ignored, use the
21960@code{gnus-ignored-adaptive-words} list instead.
21961
21962@vindex gnus-adaptive-word-length-limit
21963Some may feel that short words shouldn't count when doing adaptive
21964scoring. If so, you may set @code{gnus-adaptive-word-length-limit} to
21965an integer. Words shorter than this number will be ignored. This
21966variable defaults to @code{nil}.
21967
21968@vindex gnus-adaptive-word-syntax-table
21969When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the
21970syntax table in effect. It is similar to the standard syntax table, but
21971it considers numbers to be non-word-constituent characters.
21972
21973@vindex gnus-adaptive-word-minimum
21974If @code{gnus-adaptive-word-minimum} is set to a number, the adaptive
21975word scoring process will never bring down the score of an article to
21976below this number. The default is @code{nil}.
21977
21978@vindex gnus-adaptive-word-no-group-words
21979If @code{gnus-adaptive-word-no-group-words} is set to @code{t}, gnus
21980won't adaptively word score any of the words in the group name. Useful
21981for groups like @samp{comp.editors.emacs}, where most of the subject
21982lines contain the word @samp{emacs}.
21983
21984After using this scheme for a while, it might be nice to write a
21985@code{gnus-psychoanalyze-user} command to go through the rules and see
21986what words you like and what words you don't like. Or perhaps not.
21987
21988Note that the adaptive word scoring thing is highly experimental and is
21989likely to change in the future. Initial impressions seem to indicate
21990that it's totally useless as it stands. Some more work (involving more
21991rigorous statistical methods) will have to be done to make this useful.
21992
21993
21994@node Home Score File
21995@section Home Score File
21996
21997The score file where new score file entries will go is called the
21998@dfn{home score file}. This is normally (and by default) the score file
21999for the group itself. For instance, the home score file for
22000@samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}.
22001
22002However, this may not be what you want. It is often convenient to share
22003a common home score file among many groups---all @samp{emacs} groups
22004could perhaps use the same home score file.
22005
22006@vindex gnus-home-score-file
22007The variable that controls this is @code{gnus-home-score-file}. It can
22008be:
22009
22010@enumerate
22011@item
22012A string. Then this file will be used as the home score file for all
22013groups.
22014
22015@item
22016A function. The result of this function will be used as the home score
22017file. The function will be called with the name of the group as the
22018parameter.
22019
22020@item
22021A list. The elements in this list can be:
22022
22023@enumerate
22024@item
22025@code{(@var{regexp} @var{file-name})}. If the @var{regexp} matches the
22026group name, the @var{file-name} will be used as the home score file.
22027
22028@item
22029A function. If the function returns non-@code{nil}, the result will
22030be used as the home score file. The function will be called with the
22031name of the group as the parameter.
22032
22033@item
22034A string. Use the string as the home score file.
22035@end enumerate
22036
22037The list will be traversed from the beginning towards the end looking
22038for matches.
22039
22040@end enumerate
22041
22042So, if you want to use just a single score file, you could say:
22043
22044@lisp
22045(setq gnus-home-score-file
22046 "my-total-score-file.SCORE")
22047@end lisp
22048
22049If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and
22050@file{rec.SCORE} for all @samp{rec} groups (and so on), you can say:
22051
22052@findex gnus-hierarchial-home-score-file
22053@lisp
22054(setq gnus-home-score-file
22055 'gnus-hierarchial-home-score-file)
22056@end lisp
22057
22058This is a ready-made function provided for your convenience.
22059Other functions include
22060
22061@table @code
22062@item gnus-current-home-score-file
22063@findex gnus-current-home-score-file
22064Return the ``current'' regular score file. This will make scoring
22065commands add entry to the ``innermost'' matching score file.
22066
22067@end table
22068
22069If you want to have one score file for the @samp{emacs} groups and
22070another for the @samp{comp} groups, while letting all other groups use
22071their own home score files:
22072
22073@lisp
22074(setq gnus-home-score-file
22075 ;; @r{All groups that match the regexp @code{"\\.emacs"}}
22076 '(("\\.emacs" "emacs.SCORE")
22077 ;; @r{All the comp groups in one score file}
22078 ("^comp" "comp.SCORE")))
22079@end lisp
22080
22081@vindex gnus-home-adapt-file
22082@code{gnus-home-adapt-file} works exactly the same way as
22083@code{gnus-home-score-file}, but says what the home adaptive score file
22084is instead. All new adaptive file entries will go into the file
22085specified by this variable, and the same syntax is allowed.
22086
22087In addition to using @code{gnus-home-score-file} and
22088@code{gnus-home-adapt-file}, you can also use group parameters
22089(@pxref{Group Parameters}) and topic parameters (@pxref{Topic
22090Parameters}) to achieve much the same. Group and topic parameters take
22091precedence over this variable.
22092
22093
22094@node Followups To Yourself
22095@section Followups To Yourself
22096
22097Gnus offers two commands for picking out the @code{Message-ID} header in
22098the current buffer. Gnus will then add a score rule that scores using
22099this @code{Message-ID} on the @code{References} header of other
22100articles. This will, in effect, increase the score of all articles that
22101respond to the article in the current buffer. Quite useful if you want
22102to easily note when people answer what you've said.
22103
22104@table @code
22105
22106@item gnus-score-followup-article
22107@findex gnus-score-followup-article
22108This will add a score to articles that directly follow up your own
22109article.
22110
22111@item gnus-score-followup-thread
22112@findex gnus-score-followup-thread
22113This will add a score to all articles that appear in a thread ``below''
22114your own article.
22115@end table
22116
22117@vindex message-sent-hook
22118These two functions are both primarily meant to be used in hooks like
22119@code{message-sent-hook}, like this:
22120@lisp
22121(add-hook 'message-sent-hook 'gnus-score-followup-thread)
22122@end lisp
22123
22124
22125If you look closely at your own @code{Message-ID}, you'll notice that
22126the first two or three characters are always the same. Here's two of
22127mine:
22128
22129@example
22130<x6u3u47icf.fsf@@eyesore.no>
22131<x6sp9o7ibw.fsf@@eyesore.no>
22132@end example
22133
22134So ``my'' ident on this machine is @samp{x6}. This can be
22135exploited---the following rule will raise the score on all followups to
22136myself:
22137
22138@lisp
22139("references"
22140 ("<x6[0-9a-z]+\\.fsf\\(_-_\\)?@@.*eyesore\\.no>"
22141 1000 nil r))
22142@end lisp
22143
22144Whether it's the first two or first three characters that are ``yours''
22145is system-dependent.
22146
22147
22148@node Scoring On Other Headers
22149@section Scoring On Other Headers
22150@cindex scoring on other headers
22151
22152Gnus is quite fast when scoring the ``traditional''
22153headers---@samp{From}, @samp{Subject} and so on. However, scoring
22154other headers requires writing a @code{head} scoring rule, which means
22155that Gnus has to request every single article from the back end to find
22156matches. This takes a long time in big groups.
22157
58333467
MB
22158@vindex gnus-inhibit-slow-scoring
22159You can inhibit this slow scoring on headers or body by setting the
22160variable @code{gnus-inhibit-slow-scoring}. If
22161@code{gnus-inhibit-slow-scoring} is regexp, slow scoring is inhibited if
22162the group matches the regexp. If it is t, slow scoring on it is
22163inhibited for all groups.
22164
22165Now, there's not much you can do about the slowness for news groups, but for
4009494e
GM
22166mail groups, you have greater control. In @ref{To From Newsgroups},
22167it's explained in greater detail what this mechanism does, but here's
22168a cookbook example for @code{nnml} on how to allow scoring on the
22169@samp{To} and @samp{Cc} headers.
22170
22171Put the following in your @file{~/.gnus.el} file.
22172
22173@lisp
22174(setq gnus-extra-headers '(To Cc Newsgroups Keywords)
22175 nnmail-extra-headers gnus-extra-headers)
22176@end lisp
22177
22178Restart Gnus and rebuild your @code{nnml} overview files with the
22179@kbd{M-x nnml-generate-nov-databases} command. This will take a long
22180time if you have much mail.
22181
22182Now you can score on @samp{To} and @samp{Cc} as ``extra headers'' like
22183so: @kbd{I e s p To RET <your name> RET}.
22184
22185See? Simple.
22186
22187
22188@node Scoring Tips
22189@section Scoring Tips
22190@cindex scoring tips
22191
22192@table @dfn
22193
22194@item Crossposts
22195@cindex crossposts
22196@cindex scoring crossposts
22197If you want to lower the score of crossposts, the line to match on is
22198the @code{Xref} header.
22199@lisp
22200("xref" (" talk.politics.misc:" -1000))
22201@end lisp
22202
22203@item Multiple crossposts
22204If you want to lower the score of articles that have been crossposted to
22205more than, say, 3 groups:
22206@lisp
22207("xref"
22208 ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+"
22209 -1000 nil r))
22210@end lisp
22211
22212@item Matching on the body
22213This is generally not a very good idea---it takes a very long time.
22214Gnus actually has to fetch each individual article from the server. But
22215you might want to anyway, I guess. Even though there are three match
22216keys (@code{Head}, @code{Body} and @code{All}), you should choose one
22217and stick with it in each score file. If you use any two, each article
22218will be fetched @emph{twice}. If you want to match a bit on the
22219@code{Head} and a bit on the @code{Body}, just use @code{All} for all
22220the matches.
22221
22222@item Marking as read
22223You will probably want to mark articles that have scores below a certain
22224number as read. This is most easily achieved by putting the following
22225in your @file{all.SCORE} file:
22226@lisp
22227((mark -100))
22228@end lisp
22229You may also consider doing something similar with @code{expunge}.
22230
22231@item Negated character classes
22232If you say stuff like @code{[^abcd]*}, you may get unexpected results.
22233That will match newlines, which might lead to, well, The Unknown. Say
22234@code{[^abcd\n]*} instead.
22235@end table
22236
22237
22238@node Reverse Scoring
22239@section Reverse Scoring
22240@cindex reverse scoring
22241
22242If you want to keep just articles that have @samp{Sex with Emacs} in the
22243subject header, and expunge all other articles, you could put something
22244like this in your score file:
22245
22246@lisp
22247(("subject"
22248 ("Sex with Emacs" 2))
22249 (mark 1)
22250 (expunge 1))
22251@end lisp
22252
22253So, you raise all articles that match @samp{Sex with Emacs} and mark the
22254rest as read, and expunge them to boot.
22255
22256
22257@node Global Score Files
22258@section Global Score Files
22259@cindex global score files
22260
22261Sure, other newsreaders have ``global kill files''. These are usually
22262nothing more than a single kill file that applies to all groups, stored
22263in the user's home directory. Bah! Puny, weak newsreaders!
22264
22265What I'm talking about here are Global Score Files. Score files from
22266all over the world, from users everywhere, uniting all nations in one
22267big, happy score file union! Ange-score! New and untested!
22268
22269@vindex gnus-global-score-files
22270All you have to do to use other people's score files is to set the
22271@code{gnus-global-score-files} variable. One entry for each score file,
22272or each score file directory. Gnus will decide by itself what score
22273files are applicable to which group.
22274
22275To use the score file
22276@file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} and
22277all score files in the @file{/ftp@@ftp.some-where:/pub/score} directory,
22278say this:
22279
22280@lisp
22281(setq gnus-global-score-files
22282 '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE"
22283 "/ftp@@ftp.some-where:/pub/score/"))
22284@end lisp
22285
22286@findex gnus-score-search-global-directories
22287@noindent
22288Simple, eh? Directory names must end with a @samp{/}. These
22289directories are typically scanned only once during each Gnus session.
22290If you feel the need to manually re-scan the remote directories, you can
22291use the @code{gnus-score-search-global-directories} command.
22292
22293Note that, at present, using this option will slow down group entry
22294somewhat. (That is---a lot.)
22295
22296If you want to start maintaining score files for other people to use,
22297just put your score file up for anonymous ftp and announce it to the
22298world. Become a retro-moderator! Participate in the retro-moderator
22299wars sure to ensue, where retro-moderators battle it out for the
22300sympathy of the people, luring them to use their score files on false
22301premises! Yay! The net is saved!
22302
22303Here are some tips for the would-be retro-moderator, off the top of my
22304head:
22305
22306@itemize @bullet
22307
22308@item
22309Articles heavily crossposted are probably junk.
22310@item
22311To lower a single inappropriate article, lower by @code{Message-ID}.
22312@item
22313Particularly brilliant authors can be raised on a permanent basis.
22314@item
22315Authors that repeatedly post off-charter for the group can safely be
22316lowered out of existence.
22317@item
22318Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest
22319articles completely.
22320
22321@item
22322Use expiring score entries to keep the size of the file down. You
22323should probably have a long expiry period, though, as some sites keep
22324old articles for a long time.
22325@end itemize
22326
22327@dots{} I wonder whether other newsreaders will support global score files
22328in the future. @emph{Snicker}. Yup, any day now, newsreaders like Blue
22329Wave, xrn and 1stReader are bound to implement scoring. Should we start
22330holding our breath yet?
22331
22332
22333@node Kill Files
22334@section Kill Files
22335@cindex kill files
22336
22337Gnus still supports those pesky old kill files. In fact, the kill file
22338entries can now be expiring, which is something I wrote before Daniel
22339Quinlan thought of doing score files, so I've left the code in there.
22340
22341In short, kill processing is a lot slower (and I do mean @emph{a lot})
22342than score processing, so it might be a good idea to rewrite your kill
22343files into score files.
22344
22345Anyway, a kill file is a normal @code{emacs-lisp} file. You can put any
22346forms into this file, which means that you can use kill files as some
22347sort of primitive hook function to be run on group entry, even though
22348that isn't a very good idea.
22349
22350Normal kill files look like this:
22351
22352@lisp
22353(gnus-kill "From" "Lars Ingebrigtsen")
22354(gnus-kill "Subject" "ding")
22355(gnus-expunge "X")
22356@end lisp
22357
22358This will mark every article written by me as read, and remove the
22359marked articles from the summary buffer. Very useful, you'll agree.
22360
22361Other programs use a totally different kill file syntax. If Gnus
22362encounters what looks like a @code{rn} kill file, it will take a stab at
22363interpreting it.
22364
22365Two summary functions for editing a @sc{gnus} kill file:
22366
22367@table @kbd
22368
22369@item M-k
22370@kindex M-k (Summary)
22371@findex gnus-summary-edit-local-kill
22372Edit this group's kill file (@code{gnus-summary-edit-local-kill}).
22373
22374@item M-K
22375@kindex M-K (Summary)
22376@findex gnus-summary-edit-global-kill
22377Edit the general kill file (@code{gnus-summary-edit-global-kill}).
22378@end table
22379
22380Two group mode functions for editing the kill files:
22381
22382@table @kbd
22383
22384@item M-k
22385@kindex M-k (Group)
22386@findex gnus-group-edit-local-kill
22387Edit this group's kill file (@code{gnus-group-edit-local-kill}).
22388
22389@item M-K
22390@kindex M-K (Group)
22391@findex gnus-group-edit-global-kill
22392Edit the general kill file (@code{gnus-group-edit-global-kill}).
22393@end table
22394
22395Kill file variables:
22396
22397@table @code
22398@item gnus-kill-file-name
22399@vindex gnus-kill-file-name
22400A kill file for the group @samp{soc.motss} is normally called
22401@file{soc.motss.KILL}. The suffix appended to the group name to get
22402this file name is detailed by the @code{gnus-kill-file-name} variable.
22403The ``global'' kill file (not in the score file sense of ``global'', of
22404course) is just called @file{KILL}.
22405
22406@vindex gnus-kill-save-kill-file
22407@item gnus-kill-save-kill-file
22408If this variable is non-@code{nil}, Gnus will save the
22409kill file after processing, which is necessary if you use expiring
22410kills.
22411
22412@item gnus-apply-kill-hook
22413@vindex gnus-apply-kill-hook
22414@findex gnus-apply-kill-file-unless-scored
22415@findex gnus-apply-kill-file
22416A hook called to apply kill files to a group. It is
22417@code{(gnus-apply-kill-file)} by default. If you want to ignore the
22418kill file if you have a score file for the same group, you can set this
22419hook to @code{(gnus-apply-kill-file-unless-scored)}. If you don't want
22420kill files to be processed, you should set this variable to @code{nil}.
22421
22422@item gnus-kill-file-mode-hook
22423@vindex gnus-kill-file-mode-hook
22424A hook called in kill-file mode buffers.
22425
22426@end table
22427
22428
22429@node Converting Kill Files
22430@section Converting Kill Files
22431@cindex kill files
22432@cindex converting kill files
22433
22434If you have loads of old kill files, you may want to convert them into
22435score files. If they are ``regular'', you can use
22436the @file{gnus-kill-to-score.el} package; if not, you'll have to do it
22437by hand.
22438
22439The kill to score conversion package isn't included in Gnus by default.
22440You can fetch it from
22441@uref{http://www.stud.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el}.
22442
22443If your old kill files are very complex---if they contain more
22444non-@code{gnus-kill} forms than not, you'll have to convert them by
22445hand. Or just let them be as they are. Gnus will still use them as
22446before.
22447
22448
4009494e
GM
22449@node Advanced Scoring
22450@section Advanced Scoring
22451
22452Scoring on Subjects and From headers is nice enough, but what if you're
22453really interested in what a person has to say only when she's talking
22454about a particular subject? Or what if you really don't want to
22455read what person A has to say when she's following up to person B, but
22456want to read what she says when she's following up to person C?
22457
22458By using advanced scoring rules you may create arbitrarily complex
22459scoring patterns.
22460
22461@menu
22462* Advanced Scoring Syntax:: A definition.
22463* Advanced Scoring Examples:: What they look like.
22464* Advanced Scoring Tips:: Getting the most out of it.
22465@end menu
22466
22467
22468@node Advanced Scoring Syntax
22469@subsection Advanced Scoring Syntax
22470
22471Ordinary scoring rules have a string as the first element in the rule.
22472Advanced scoring rules have a list as the first element. The second
22473element is the score to be applied if the first element evaluated to a
22474non-@code{nil} value.
22475
22476These lists may consist of three logical operators, one redirection
22477operator, and various match operators.
22478
22479Logical operators:
22480
22481@table @code
22482@item &
22483@itemx and
22484This logical operator will evaluate each of its arguments until it finds
22485one that evaluates to @code{false}, and then it'll stop. If all arguments
22486evaluate to @code{true} values, then this operator will return
22487@code{true}.
22488
22489@item |
22490@itemx or
22491This logical operator will evaluate each of its arguments until it finds
22492one that evaluates to @code{true}. If no arguments are @code{true},
22493then this operator will return @code{false}.
22494
22495@item !
22496@itemx not
22497