Merge changes made in Gnus trunk.
[bpt/emacs.git] / doc / misc / gnus.texi
CommitLineData
4009494e
GM
1\input texinfo
2
db78a8cb 3@setfilename ../../info/gnus
4009494e
GM
4@settitle Gnus Manual
5@syncodeindex fn cp
6@syncodeindex vr cp
7@syncodeindex pg cp
8
01c52d31
MB
9@documentencoding ISO-8859-1
10
4009494e 11@copying
e3e955fe 12Copyright @copyright{} 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
c57008f6 132003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4009494e
GM
14
15@quotation
16Permission is granted to copy, distribute and/or modify this document
6a2c4aec 17under the terms of the GNU Free Documentation License, Version 1.3 or
4009494e 18any later version published by the Free Software Foundation; with no
debf4439
GM
19Invariant Sections, with the Front-Cover texts being ``A GNU Manual'',
20and with the Back-Cover Texts as in (a) below. A copy of the license
21is included in the section entitled ``GNU Free Documentation License''.
4009494e 22
6f093307
GM
23(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
24modify this GNU manual. Buying copies from the FSF supports it in
25developing GNU and promoting software freedom.''
4009494e
GM
26@end quotation
27@end copying
28
29@iftex
30@iflatex
31\documentclass[twoside,a4paper,openright,11pt]{book}
32\usepackage[latin1]{inputenc}
33\usepackage{pagestyle}
34\usepackage{epsfig}
35\usepackage{pixidx}
36\input{gnusconfig.tex}
37
38\ifx\pdfoutput\undefined
39\else
40\usepackage[pdftex,bookmarks,colorlinks=true]{hyperref}
41\usepackage{thumbpdf}
42\pdfcompresslevel=9
43\fi
44
45\makeindex
46\begin{document}
47
48% Adjust ../Makefile.in if you change the following line:
c7ff939a 49\newcommand{\gnusversionname}{Gnus v5.13}
4009494e
GM
50\newcommand{\gnuschaptername}{}
51\newcommand{\gnussectionname}{}
52
53\newcommand{\gnusbackslash}{/}
54
55\newcommand{\gnusref}[1]{``#1'' on page \pageref{#1}}
56\ifx\pdfoutput\undefined
57\newcommand{\gnusuref}[1]{\gnustt{#1}}
58\else
59\newcommand{\gnusuref}[1]{\href{#1}{\gnustt{#1}}}
60\fi
61\newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}}
62\newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}}
63
64\newcommand{\gnuskindex}[1]{\index{#1}}
65\newcommand{\gnusindex}[1]{\index{#1}}
66
67\newcommand{\gnustt}[1]{{\gnusselectttfont{}#1}}
68\newcommand{\gnuscode}[1]{\gnustt{#1}}
69\newcommand{\gnusasis}[1]{\gnustt{#1}}
70\newcommand{\gnusurl}[1]{\gnustt{#1}}
71\newcommand{\gnuscommand}[1]{\gnustt{#1}}
72\newcommand{\gnusenv}[1]{\gnustt{#1}}
73\newcommand{\gnussamp}[1]{``{\fontencoding{OT1}\gnusselectttfont{}#1}''}
74\newcommand{\gnuslisp}[1]{\gnustt{#1}}
75\newcommand{\gnuskbd}[1]{`\gnustt{#1}'}
76\newcommand{\gnuskey}[1]{`\gnustt{#1}'}
77\newcommand{\gnusfile}[1]{`\gnustt{#1}'}
78\newcommand{\gnusdfn}[1]{\textit{#1}}
79\newcommand{\gnusi}[1]{\textit{#1}}
80\newcommand{\gnusr}[1]{\textrm{#1}}
81\newcommand{\gnusstrong}[1]{\textbf{#1}}
82\newcommand{\gnusemph}[1]{\textit{#1}}
83\newcommand{\gnusvar}[1]{{\fontsize{10pt}{10}\selectfont\textsl{\textsf{#1}}}}
84\newcommand{\gnussc}[1]{\textsc{#1}}
85\newcommand{\gnustitle}[1]{{\huge\textbf{#1}}}
86\newcommand{\gnusversion}[1]{{\small\textit{#1}}}
87\newcommand{\gnusauthor}[1]{{\large\textbf{#1}}}
88\newcommand{\gnusresult}[1]{\gnustt{=> #1}}
89\newcommand{\gnusacronym}[1]{\textsc{#1}}
90\newcommand{\gnusemail}[1]{\textit{#1}}
91
92\newcommand{\gnusbullet}{{${\bullet}$}}
93\newcommand{\gnusdollar}{\$}
94\newcommand{\gnusampersand}{\&}
95\newcommand{\gnuspercent}{\%}
96\newcommand{\gnushash}{\#}
97\newcommand{\gnushat}{\symbol{"5E}}
98\newcommand{\gnusunderline}{\symbol{"5F}}
99\newcommand{\gnusnot}{$\neg$}
100\newcommand{\gnustilde}{\symbol{"7E}}
101\newcommand{\gnusless}{{$<$}}
102\newcommand{\gnusgreater}{{$>$}}
103\newcommand{\gnusbraceleft}{{$>$}}
104\newcommand{\gnusbraceright}{{$>$}}
105
106\newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head,height=1cm}}}
107\newcommand{\gnusinteresting}{
108\marginpar[\mbox{}\hfill\gnushead]{\gnushead}
109}
110
111\newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
112
113\newcommand{\gnuspagechapter}[1]{
114{\mbox{}}
115}
116
117\newdimen{\gnusdimen}
118\gnusdimen 0pt
119
120\newcommand{\gnuschapter}[2]{
121\gnuscleardoublepage
122\ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi
123\chapter{#2}
124\renewcommand{\gnussectionname}{}
125\renewcommand{\gnuschaptername}{#2}
126\thispagestyle{empty}
127\hspace*{-2cm}
128\begin{picture}(500,500)(0,0)
129\put(480,350){\makebox(0,0)[tr]{#1}}
130\put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}}
131\end{picture}
132\clearpage
133}
134
135\newcommand{\gnusfigure}[3]{
136\begin{figure}
137\mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2)
138#3
139\end{picture}
140\caption{#1}
141\end{figure}
142}
143
144\newcommand{\gnusicon}[1]{
145\marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=ps/#1-up,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=ps/#1-up,height=1cm}}}
146}
147
148\newcommand{\gnuspicon}[1]{
149\margindex{\epsfig{figure=#1,width=2cm}}
150}
151
152\newcommand{\gnusxface}[2]{
153\margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}}
154}
155
156\newcommand{\gnussmiley}[2]{
157\margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}}
158}
159
160\newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1}
161
162\newcommand{\gnussection}[1]{
163\renewcommand{\gnussectionname}{#1}
164\section{#1}
165}
166
167\newenvironment{codelist}%
168{\begin{list}{}{
169}
170}{\end{list}}
171
172\newenvironment{asislist}%
173{\begin{list}{}{
174}
175}{\end{list}}
176
177\newenvironment{kbdlist}%
178{\begin{list}{}{
179\labelwidth=0cm
180}
181}{\end{list}}
182
183\newenvironment{dfnlist}%
184{\begin{list}{}{
185}
186}{\end{list}}
187
188\newenvironment{stronglist}%
189{\begin{list}{}{
190}
191}{\end{list}}
192
193\newenvironment{samplist}%
194{\begin{list}{}{
195}
196}{\end{list}}
197
198\newenvironment{varlist}%
199{\begin{list}{}{
200}
201}{\end{list}}
202
203\newenvironment{emphlist}%
204{\begin{list}{}{
205}
206}{\end{list}}
207
208\newlength\gnusheadtextwidth
209\setlength{\gnusheadtextwidth}{\headtextwidth}
210\addtolength{\gnusheadtextwidth}{1cm}
211
212\newpagestyle{gnuspreamble}%
213{
214{
215\ifodd\count0
216{
217\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}}
218}
219\else
220{
221\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}}
222}
223}
224\fi
225}
226}
227{
228\ifodd\count0
229\mbox{} \hfill
230\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
231\else
232\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
233\hfill \mbox{}
234\fi
235}
236
237\newpagestyle{gnusindex}%
238{
239{
240\ifodd\count0
241{
242\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}}
243}
244\else
245{
246\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}
247}
248\fi
249}
250}
251{
252\ifodd\count0
253\mbox{} \hfill
254\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
255\else
256\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
257\hfill \mbox{}
258\fi
259}
260
261\newpagestyle{gnus}%
262{
263{
264\ifodd\count0
265{
266\makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}}
267}
268\else
269{
270\makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}}
271}
272\fi
273}
274}
275{
276\ifodd\count0
277\mbox{} \hfill
278\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
279\else
280\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
281\hfill \mbox{}
282\fi
283}
284
285\pagenumbering{roman}
286\pagestyle{gnuspreamble}
287
288@end iflatex
289@end iftex
290
291@iftex
292@iflatex
293
294\begin{titlepage}
295{
296
297%\addtolength{\oddsidemargin}{-5cm}
298%\addtolength{\evensidemargin}{-5cm}
299\parindent=0cm
300\addtolength{\textheight}{2cm}
301
302\gnustitle{\gnustitlename}\hfill\gnusversion{\gnusversionname}\\
303\rule{15cm}{1mm}\\
304\vfill
305\hspace*{0cm}\epsfig{figure=ps/gnus-big-logo,height=15cm}
306\vfill
307\rule{15cm}{1mm}\\
308\gnusauthor{by Lars Magne Ingebrigtsen}
309\newpage
310}
311
312\mbox{}
313\vfill
314
315\thispagestyle{empty}
316
317@c @insertcopying
318\newpage
319\end{titlepage}
320@end iflatex
321@end iftex
322
4009494e
GM
323@dircategory Emacs
324@direntry
62e034c2 325* Gnus: (gnus). The newsreader Gnus.
4009494e
GM
326@end direntry
327@iftex
328@finalout
329@end iftex
4009494e
GM
330
331
332@titlepage
333@title Gnus Manual
334
335@author by Lars Magne Ingebrigtsen
336@page
337@vskip 0pt plus 1filll
338@insertcopying
339@end titlepage
340
5dc584b5
KB
341@summarycontents
342@contents
4009494e
GM
343
344@node Top
345@top The Gnus Newsreader
346
347@ifinfo
348
349You can read news (and mail) from within Emacs by using Gnus. The news
350can be gotten by any nefarious means you can think of---@acronym{NNTP}, local
351spool or your mbox file. All at the same time, if you want to push your
352luck.
353
354@c Adjust ../Makefile.in if you change the following line:
c7ff939a 355This manual corresponds to Gnus v5.13
4009494e 356
5dc584b5
KB
357@ifnottex
358@insertcopying
359@end ifnottex
360
4009494e
GM
361@end ifinfo
362
363@iftex
364
365@iflatex
366\tableofcontents
367\gnuscleardoublepage
368@end iflatex
369
370Gnus is the advanced, self-documenting, customizable, extensible
371unreal-time newsreader for GNU Emacs.
372
373Oops. That sounds oddly familiar, so let's start over again to avoid
374being accused of plagiarism:
375
376Gnus is a message-reading laboratory. It will let you look at just
377about anything as if it were a newsgroup. You can read mail with it,
378you can browse directories with it, you can @code{ftp} with it---you
379can even read news with it!
380
381Gnus tries to empower people who read news the same way Emacs empowers
382people who edit text. Gnus sets no limits to what the user should be
383allowed to do. Users are encouraged to extend Gnus to make it behave
384like they want it to behave. A program should not control people;
385people should be empowered to do what they want by using (or abusing)
386the program.
387
9b3ebcb6 388@c Adjust ../Makefile.in if you change the following line:
2e4089ab 389This manual corresponds to Gnus v5.13
9b3ebcb6
MB
390
391@heading Other related manuals
392@itemize
393@item Message manual: Composing messages
394@item Emacs-MIME: Composing messages; @acronym{MIME}-specific parts.
395@item Sieve: Managing Sieve scripts in Emacs.
396@item PGG: @acronym{PGP/MIME} with Gnus.
2e4089ab 397@item SASL: @acronym{SASL} authentication in Emacs.
9b3ebcb6
MB
398@end itemize
399
4009494e
GM
400@end iftex
401
402@menu
403* Starting Up:: Finding news can be a pain.
404* Group Buffer:: Selecting, subscribing and killing groups.
405* Summary Buffer:: Reading, saving and posting articles.
406* Article Buffer:: Displaying and handling articles.
407* Composing Messages:: Information on sending mail and news.
408* Select Methods:: Gnus reads all messages from various select methods.
409* Scoring:: Assigning values to articles.
410* Various:: General purpose settings.
411* The End:: Farewell and goodbye.
412* Appendices:: Terminology, Emacs intro, @acronym{FAQ}, History, Internals.
413* GNU Free Documentation License:: The license for this documentation.
414* Index:: Variable, function and concept index.
415* Key Index:: Key Index.
416
417Other related manuals
418
419* Message:(message). Composing messages.
420* Emacs-MIME:(emacs-mime). Composing messages; @acronym{MIME}-specific parts.
421* Sieve:(sieve). Managing Sieve scripts in Emacs.
422* PGG:(pgg). @acronym{PGP/MIME} with Gnus.
01c52d31 423* SASL:(sasl). @acronym{SASL} authentication in Emacs.
4009494e
GM
424
425@detailmenu
426 --- The Detailed Node Listing ---
427
428Starting Gnus
429
430* Finding the News:: Choosing a method for getting news.
431* The First Time:: What does Gnus do the first time you start it?
432* The Server is Down:: How can I read my mail then?
433* Slave Gnusae:: You can have more than one Gnus active at a time.
434* Fetching a Group:: Starting Gnus just to read a group.
435* New Groups:: What is Gnus supposed to do with new groups?
436* Changing Servers:: You may want to move from one server to another.
437* Startup Files:: Those pesky startup files---@file{.newsrc}.
438* Auto Save:: Recovering from a crash.
439* The Active File:: Reading the active file over a slow line Takes Time.
440* Startup Variables:: Other variables you might change.
441
442New Groups
443
444* Checking New Groups:: Determining what groups are new.
445* Subscription Methods:: What Gnus should do with new groups.
446* Filtering New Groups:: Making Gnus ignore certain new groups.
447
448Group Buffer
449
450* Group Buffer Format:: Information listed and how you can change it.
451* Group Maneuvering:: Commands for moving in the group buffer.
452* Selecting a Group:: Actually reading news.
453* Subscription Commands:: Unsubscribing, killing, subscribing.
454* Group Data:: Changing the info for a group.
455* Group Levels:: Levels? What are those, then?
456* Group Score:: A mechanism for finding out what groups you like.
457* Marking Groups:: You can mark groups for later processing.
458* Foreign Groups:: Creating and editing groups.
459* Group Parameters:: Each group may have different parameters set.
460* Listing Groups:: Gnus can list various subsets of the groups.
461* Sorting Groups:: Re-arrange the group order.
462* Group Maintenance:: Maintaining a tidy @file{.newsrc} file.
463* Browse Foreign Server:: You can browse a server. See what it has to offer.
464* Exiting Gnus:: Stop reading news and get some work done.
465* Group Topics:: A folding group mode divided into topics.
01c52d31 466* Non-ASCII Group Names:: Accessing groups of non-English names.
4009494e
GM
467* Misc Group Stuff:: Other stuff that you can to do.
468
469Group Buffer Format
470
471* Group Line Specification:: Deciding how the group buffer is to look.
472* Group Mode Line Specification:: The group buffer mode line.
473* Group Highlighting:: Having nice colors in the group buffer.
474
475Group Topics
476
477* Topic Commands:: Interactive E-Z commands.
478* Topic Variables:: How to customize the topics the Lisp Way.
479* Topic Sorting:: Sorting each topic individually.
480* Topic Topology:: A map of the world.
481* Topic Parameters:: Parameters that apply to all groups in a topic.
482
483Misc Group Stuff
484
485* Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
486* Group Information:: Information and help on groups and Gnus.
487* Group Timestamp:: Making Gnus keep track of when you last read a group.
488* File Commands:: Reading and writing the Gnus files.
489* Sieve Commands:: Managing Sieve scripts.
490
491Summary Buffer
492
493* Summary Buffer Format:: Deciding how the summary buffer is to look.
494* Summary Maneuvering:: Moving around the summary buffer.
495* Choosing Articles:: Reading articles.
496* Paging the Article:: Scrolling the current article.
497* Reply Followup and Post:: Posting articles.
498* Delayed Articles:: Send articles at a later time.
499* Marking Articles:: Marking articles as read, expirable, etc.
500* Limiting:: You can limit the summary buffer.
501* Threading:: How threads are made.
502* Sorting the Summary Buffer:: How articles and threads are sorted.
503* Asynchronous Fetching:: Gnus might be able to pre-fetch articles.
504* Article Caching:: You may store articles in a cache.
505* Persistent Articles:: Making articles expiry-resistant.
01c52d31 506* Sticky Articles:: Article buffers that are not reused.
4009494e
GM
507* Article Backlog:: Having already read articles hang around.
508* Saving Articles:: Ways of customizing article saving.
509* Decoding Articles:: Gnus can treat series of (uu)encoded articles.
510* Article Treatment:: The article buffer can be mangled at will.
511* MIME Commands:: Doing MIMEy things with the articles.
512* Charsets:: Character set issues.
513* Article Commands:: Doing various things with the article buffer.
514* Summary Sorting:: Sorting the summary buffer in various ways.
515* Finding the Parent:: No child support? Get the parent.
516* Alternative Approaches:: Reading using non-default summaries.
517* Tree Display:: A more visual display of threads.
518* Mail Group Commands:: Some commands can only be used in mail groups.
519* Various Summary Stuff:: What didn't fit anywhere else.
520* Exiting the Summary Buffer:: Returning to the Group buffer,
521 or reselecting the current group.
522* Crosspost Handling:: How crossposted articles are dealt with.
523* Duplicate Suppression:: An alternative when crosspost handling fails.
524* Security:: Decrypt and Verify.
525* Mailing List:: Mailing list minor mode.
526
527Summary Buffer Format
528
529* Summary Buffer Lines:: You can specify how summary lines should look.
530* To From Newsgroups:: How to not display your own name.
531* Summary Buffer Mode Line:: You can say how the mode line should look.
532* Summary Highlighting:: Making the summary buffer all pretty and nice.
533
534Choosing Articles
535
536* Choosing Commands:: Commands for choosing articles.
537* Choosing Variables:: Variables that influence these commands.
538
539Reply, Followup and Post
540
541* Summary Mail Commands:: Sending mail.
542* Summary Post Commands:: Sending news.
543* Summary Message Commands:: Other Message-related commands.
544* Canceling and Superseding::
545
546Marking Articles
547
548* Unread Articles:: Marks for unread articles.
549* Read Articles:: Marks for read articles.
550* Other Marks:: Marks that do not affect readedness.
551* Setting Marks:: How to set and remove marks.
552* Generic Marking Commands:: How to customize the marking.
553* Setting Process Marks:: How to mark articles for later processing.
554
555Threading
556
557* Customizing Threading:: Variables you can change to affect the threading.
558* Thread Commands:: Thread based commands in the summary buffer.
559
560Customizing Threading
561
562* Loose Threads:: How Gnus gathers loose threads into bigger threads.
563* Filling In Threads:: Making the threads displayed look fuller.
564* More Threading:: Even more variables for fiddling with threads.
565* Low-Level Threading:: You thought it was over@dots{} but you were wrong!
566
567Decoding Articles
568
569* Uuencoded Articles:: Uudecode articles.
570* Shell Archives:: Unshar articles.
571* PostScript Files:: Split PostScript.
572* Other Files:: Plain save and binhex.
573* Decoding Variables:: Variables for a happy decoding.
574* Viewing Files:: You want to look at the result of the decoding?
575
576Decoding Variables
577
578* Rule Variables:: Variables that say how a file is to be viewed.
579* Other Decode Variables:: Other decode variables.
580* Uuencoding and Posting:: Variables for customizing uuencoding.
581
582Article Treatment
583
584* Article Highlighting:: You want to make the article look like fruit salad.
585* Article Fontisizing:: Making emphasized text look nice.
586* Article Hiding:: You also want to make certain info go away.
587* Article Washing:: Lots of way-neat functions to make life better.
588* Article Header:: Doing various header transformations.
589* Article Buttons:: Click on URLs, Message-IDs, addresses and the like.
590* Article Button Levels:: Controlling appearance of buttons.
591* Article Date:: Grumble, UT!
61b1af82 592* Article Display:: Display various stuff---X-Face, Picons, Smileys, Gravatars
4009494e
GM
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.
229b59da 632* Using IMAP:: Reading mail from @acronym{IMAP}.
4009494e
GM
633* Getting Mail:: Reading your personal mail with Gnus.
634* Browsing the Web:: Getting messages from a plethora of Web sources.
c4d82de8 635* Other Sources:: Reading directories, files.
4009494e
GM
636* Combined Groups:: Combining groups into one group.
637* Email Based Diary:: Using mails to manage diary events in Gnus.
638* Gnus Unplugged:: Reading news and mail offline.
639
640Server Buffer
641
642* Server Buffer Format:: You can customize the look of this buffer.
643* Server Commands:: Commands to manipulate servers.
644* Example Methods:: Examples server specifications.
645* Creating a Virtual Server:: An example session.
646* Server Variables:: Which variables to set.
647* Servers and Methods:: You can use server names as select methods.
648* Unavailable Servers:: Some servers you try to contact may be down.
649
650Getting News
651
652* NNTP:: Reading news from an @acronym{NNTP} server.
653* News Spool:: Reading news from the local spool.
654
655@acronym{NNTP}
656
657* Direct Functions:: Connecting directly to the server.
658* Indirect Functions:: Connecting indirectly to the server.
659* Common Variables:: Understood by several connection functions.
01c52d31 660* NNTP marks:: Storing marks for @acronym{NNTP} servers.
4009494e
GM
661
662Getting Mail
663
664* Mail in a Newsreader:: Important introductory notes.
665* Getting Started Reading Mail:: A simple cookbook example.
666* Splitting Mail:: How to create mail groups.
667* Mail Sources:: How to tell Gnus where to get mail from.
668* Mail Back End Variables:: Variables for customizing mail handling.
669* Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.
670* Group Mail Splitting:: Use group customize to drive mail splitting.
671* Incorporating Old Mail:: What about the old mail you have?
672* Expiring Mail:: Getting rid of unwanted mail.
673* Washing Mail:: Removing cruft from the mail you get.
674* Duplicates:: Dealing with duplicated mail.
675* Not Reading Mail:: Using mail back ends for reading other files.
676* Choosing a Mail Back End:: Gnus can read a variety of mail formats.
677
678Mail Sources
679
680* Mail Source Specifiers:: How to specify what a mail source is.
681* Mail Source Customization:: Some variables that influence things.
682* Fetching Mail:: Using the mail source specifiers.
683
684Choosing a Mail Back End
685
686* Unix Mail Box:: Using the (quite) standard Un*x mbox.
bc79f9ab 687* Babyl:: Babyl was used by older versions of Rmail.
4009494e
GM
688* Mail Spool:: Store your mail in a private spool?
689* MH Spool:: An mhspool-like back end.
690* Maildir:: Another one-file-per-message format.
691* Mail Folders:: Having one file for each group.
692* Comparing Mail Back Ends:: An in-depth looks at pros and cons.
693
694Browsing the Web
695
696* Archiving Mail::
697* Web Searches:: Creating groups from articles that match a string.
4009494e
GM
698* RSS:: Reading RDF site summary.
699* Customizing W3:: Doing stuff to Emacs/W3 from Gnus.
700
4009494e
GM
701Other Sources
702
703* Directory Groups:: You can read a directory as if it was a newsgroup.
704* Anything Groups:: Dired? Who needs dired?
705* Document Groups:: Single files can be the basis of a group.
4009494e
GM
706* Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
707
708Document Groups
709
710* Document Server Internals:: How to add your own document types.
711
4009494e
GM
712Combined Groups
713
714* Virtual Groups:: Combining articles from many groups.
4009494e
GM
715
716Email Based Diary
717
718* The NNDiary Back End:: Basic setup and usage.
719* The Gnus Diary Library:: Utility toolkit on top of nndiary.
720* Sending or Not Sending:: A final note on sending diary messages.
721
722The NNDiary Back End
723
724* Diary Messages:: What makes a message valid for nndiary.
725* Running NNDiary:: NNDiary has two modes of operation.
726* Customizing NNDiary:: Bells and whistles.
727
728The Gnus Diary Library
729
730* Diary Summary Line Format:: A nicer summary buffer line format.
731* Diary Articles Sorting:: A nicer way to sort messages.
732* Diary Headers Generation:: Not doing it manually.
733* Diary Group Parameters:: Not handling them manually.
734
735Gnus Unplugged
736
737* Agent Basics:: How it all is supposed to work.
738* Agent Categories:: How to tell the Gnus Agent what to download.
739* Agent Commands:: New commands for all the buffers.
740* Agent Visuals:: Ways that the agent may effect your summary buffer.
741* Agent as Cache:: The Agent is a big cache too.
742* Agent Expiry:: How to make old articles go away.
743* Agent Regeneration:: How to recover from lost connections and other accidents.
01c52d31 744* Agent and flags:: How the Agent maintains flags.
4009494e
GM
745* Agent and IMAP:: How to use the Agent with @acronym{IMAP}.
746* Outgoing Messages:: What happens when you post/mail something?
747* Agent Variables:: Customizing is fun.
748* Example Setup:: An example @file{~/.gnus.el} file for offline people.
749* Batching Agents:: How to fetch news from a @code{cron} job.
750* Agent Caveats:: What you think it'll do and what it does.
751
752Agent Categories
753
754* Category Syntax:: What a category looks like.
755* Category Buffer:: A buffer for maintaining categories.
756* Category Variables:: Customize'r'Us.
757
758Agent Commands
759
760* Group Agent Commands:: Configure groups and fetch their contents.
761* Summary Agent Commands:: Manually select then fetch specific articles.
762* Server Agent Commands:: Select the servers that are supported by the agent.
763
764Scoring
765
766* Summary Score Commands:: Adding score entries for the current group.
767* Group Score Commands:: General score commands.
768* Score Variables:: Customize your scoring. (My, what terminology).
769* Score File Format:: What a score file may contain.
770* Score File Editing:: You can edit score files by hand as well.
771* Adaptive Scoring:: Big Sister Gnus knows what you read.
772* Home Score File:: How to say where new score entries are to go.
773* Followups To Yourself:: Having Gnus notice when people answer you.
774* Scoring On Other Headers:: Scoring on non-standard headers.
775* Scoring Tips:: How to score effectively.
776* Reverse Scoring:: That problem child of old is not problem.
777* Global Score Files:: Earth-spanning, ear-splitting score files.
778* Kill Files:: They are still here, but they can be ignored.
779* Converting Kill Files:: Translating kill files to score files.
4009494e
GM
780* Advanced Scoring:: Using logical expressions to build score rules.
781* Score Decays:: It can be useful to let scores wither away.
782
4009494e
GM
783Advanced Scoring
784
785* Advanced Scoring Syntax:: A definition.
786* Advanced Scoring Examples:: What they look like.
787* Advanced Scoring Tips:: Getting the most out of it.
788
789Various
790
791* Process/Prefix:: A convention used by many treatment commands.
792* Interactive:: Making Gnus ask you many questions.
793* Symbolic Prefixes:: How to supply some Gnus functions with options.
794* Formatting Variables:: You can specify what buffers should look like.
795* Window Layout:: Configuring the Gnus buffer windows.
796* Faces and Fonts:: How to change how faces look.
797* Compilation:: How to speed Gnus up.
798* Mode Lines:: Displaying information in the mode lines.
799* Highlighting and Menus:: Making buffers look all nice and cozy.
800* Buttons:: Get tendinitis in ten easy steps!
801* Daemons:: Gnus can do things behind your back.
4009494e
GM
802* Undo:: Some actions can be undone.
803* Predicate Specifiers:: Specifying predicates.
804* Moderation:: What to do if you're a moderator.
805* Image Enhancements:: Modern versions of Emacs/XEmacs can display images.
806* Fuzzy Matching:: What's the big fuzz?
807* Thwarting Email Spam:: Simple ways to avoid unsolicited commercial email.
808* Spam Package:: A package for filtering and processing spam.
64763fe3 809* The Gnus Registry:: A package for tracking messages by Message-ID.
4009494e
GM
810* Other modes:: Interaction with other modes.
811* Various Various:: Things that are really various.
812
813Formatting Variables
814
815* Formatting Basics:: A formatting variable is basically a format string.
816* Mode Line Formatting:: Some rules about mode line formatting variables.
817* Advanced Formatting:: Modifying output in various ways.
818* User-Defined Specs:: Having Gnus call your own functions.
819* Formatting Fonts:: Making the formatting look colorful and nice.
820* Positioning Point:: Moving point to a position after an operation.
821* Tabulation:: Tabulating your output.
822* Wide Characters:: Dealing with wide characters.
823
824Image Enhancements
825
826* X-Face:: Display a funky, teensy black-and-white image.
827* Face:: Display a funkier, teensier colored image.
828* Smileys:: Show all those happy faces the way they were
829 meant to be shown.
830* Picons:: How to display pictures of what you're reading.
831* XVarious:: Other XEmacsy Gnusey variables.
832
833Thwarting Email Spam
834
835* The problem of spam:: Some background, and some solutions
836* Anti-Spam Basics:: Simple steps to reduce the amount of spam.
837* SpamAssassin:: How to use external anti-spam tools.
838* Hashcash:: Reduce spam by burning CPU time.
839
840Spam Package
841
842* Spam Package Introduction::
843* Filtering Incoming Mail::
844* Detecting Spam in Groups::
845* Spam and Ham Processors::
846* Spam Package Configuration Examples::
847* Spam Back Ends::
848* Extending the Spam package::
849* Spam Statistics Package::
850
851Spam Statistics Package
852
853* Creating a spam-stat dictionary::
854* Splitting mail using spam-stat::
855* Low-level interface to the spam-stat dictionary::
856
857Appendices
858
859* XEmacs:: Requirements for installing under XEmacs.
860* History:: How Gnus got where it is today.
861* On Writing Manuals:: Why this is not a beginner's guide.
862* Terminology:: We use really difficult, like, words here.
863* Customization:: Tailoring Gnus to your needs.
864* Troubleshooting:: What you might try if things do not work.
865* Gnus Reference Guide:: Rilly, rilly technical stuff.
866* Emacs for Heathens:: A short introduction to Emacsian terms.
867* Frequently Asked Questions:: The Gnus FAQ
868
869History
870
871* Gnus Versions:: What Gnus versions have been released.
872* Other Gnus Versions:: Other Gnus versions that also have been released.
873* Why?:: What's the point of Gnus?
874* Compatibility:: Just how compatible is Gnus with @sc{gnus}?
875* Conformity:: Gnus tries to conform to all standards.
876* Emacsen:: Gnus can be run on a few modern Emacsen.
877* Gnus Development:: How Gnus is developed.
878* Contributors:: Oodles of people.
879* New Features:: Pointers to some of the new stuff in Gnus.
880
881New Features
882
883* ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus.
884* September Gnus:: The Thing Formally Known As Gnus 5.2/5.3.
885* Red Gnus:: Third time best---Gnus 5.4/5.5.
886* Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7.
887* Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9.
888* Oort Gnus:: It's big. It's far out. Gnus 5.10/5.11.
01c52d31 889* No Gnus:: Very punny.
4009494e
GM
890
891Customization
892
893* Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.
894* Slow Terminal Connection:: You run a remote Emacs.
895* Little Disk Space:: You feel that having large setup files is icky.
896* Slow Machine:: You feel like buying a faster machine.
897
898Gnus Reference Guide
899
900* Gnus Utility Functions:: Common functions and variable to use.
901* Back End Interface:: How Gnus communicates with the servers.
902* Score File Syntax:: A BNF definition of the score file standard.
903* Headers:: How Gnus stores headers internally.
904* Ranges:: A handy format for storing mucho numbers.
905* Group Info:: The group info format.
906* Extended Interactive:: Symbolic prefixes and stuff.
907* Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen.
908* Various File Formats:: Formats of files that Gnus use.
909
910Back End Interface
911
912* Required Back End Functions:: Functions that must be implemented.
913* Optional Back End Functions:: Functions that need not be implemented.
914* Error Messaging:: How to get messages and report errors.
915* Writing New Back Ends:: Extending old back ends.
916* Hooking New Back Ends Into Gnus:: What has to be done on the Gnus end.
917* Mail-like Back Ends:: Some tips on mail back ends.
918
919Various File Formats
920
921* Active File Format:: Information on articles and groups available.
922* Newsgroups File Format:: Group descriptions.
923
924Emacs for Heathens
925
926* Keystrokes:: Entering text and executing commands.
927* Emacs Lisp:: The built-in Emacs programming language.
928
929@end detailmenu
930@end menu
931
932@node Starting Up
933@chapter Starting Gnus
934@cindex starting up
935
936If you haven't used Emacs much before using Gnus, read @ref{Emacs for
937Heathens} first.
938
939@kindex M-x gnus
940@findex gnus
941If your system administrator has set things up properly, starting Gnus
942and reading news is extremely easy---you just type @kbd{M-x gnus} in
943your Emacs. If not, you should customize the variable
944@code{gnus-select-method} as described in @ref{Finding the News}. For a
945minimal setup for posting should also customize the variables
946@code{user-full-name} and @code{user-mail-address}.
947
948@findex gnus-other-frame
949@kindex M-x gnus-other-frame
950If you want to start Gnus in a different frame, you can use the command
951@kbd{M-x gnus-other-frame} instead.
952
953If things do not go smoothly at startup, you have to twiddle some
954variables in your @file{~/.gnus.el} file. This file is similar to
955@file{~/.emacs}, but is read when Gnus starts.
956
957If you puzzle at any terms used in this manual, please refer to the
958terminology section (@pxref{Terminology}).
959
960@menu
961* Finding the News:: Choosing a method for getting news.
962* The First Time:: What does Gnus do the first time you start it?
963* The Server is Down:: How can I read my mail then?
964* Slave Gnusae:: You can have more than one Gnus active at a time.
965* New Groups:: What is Gnus supposed to do with new groups?
966* Changing Servers:: You may want to move from one server to another.
967* Startup Files:: Those pesky startup files---@file{.newsrc}.
968* Auto Save:: Recovering from a crash.
969* The Active File:: Reading the active file over a slow line Takes Time.
970* Startup Variables:: Other variables you might change.
971@end menu
972
973
974@node Finding the News
975@section Finding the News
976@cindex finding news
977
357e2d8e
KY
978First of all, you should know that there is a special buffer called
979@code{*Server*} that lists all the servers Gnus knows about. You can
980press @kbd{^} from the Group buffer to see it. In the Server buffer,
981you can press @kbd{RET} on a defined server to see all the groups it
982serves (subscribed or not!). You can also add or delete servers, edit
983a foreign server's definition, agentize or de-agentize a server, and
984do many other neat things. @xref{Server Buffer}.
985@xref{Foreign Groups}. @xref{Agent Basics}.
986
4009494e
GM
987@vindex gnus-select-method
988@c @head
989The @code{gnus-select-method} variable says where Gnus should look for
990news. This variable should be a list where the first element says
991@dfn{how} and the second element says @dfn{where}. This method is your
992native method. All groups not fetched with this method are
993foreign groups.
994
995For instance, if the @samp{news.somewhere.edu} @acronym{NNTP} server is where
996you want to get your daily dosage of news from, you'd say:
997
998@lisp
999(setq gnus-select-method '(nntp "news.somewhere.edu"))
1000@end lisp
1001
1002If you want to read directly from the local spool, say:
1003
1004@lisp
1005(setq gnus-select-method '(nnspool ""))
1006@end lisp
1007
1008If you can use a local spool, you probably should, as it will almost
1009certainly be much faster. But do not use the local spool if your
1010server is running Leafnode (which is a simple, standalone private news
1011server); in this case, use @code{(nntp "localhost")}.
1012
1013@vindex gnus-nntpserver-file
1014@cindex NNTPSERVER
1015@cindex @acronym{NNTP} server
1016If this variable is not set, Gnus will take a look at the
1017@env{NNTPSERVER} environment variable. If that variable isn't set,
1018Gnus will see whether @code{gnus-nntpserver-file}
1019(@file{/etc/nntpserver} by default) has any opinions on the matter.
1020If that fails as well, Gnus will try to use the machine running Emacs
1021as an @acronym{NNTP} server. That's a long shot, though.
1022
1023@vindex gnus-nntp-server
1024If @code{gnus-nntp-server} is set, this variable will override
1025@code{gnus-select-method}. You should therefore set
1026@code{gnus-nntp-server} to @code{nil}, which is what it is by default.
1027
1028@vindex gnus-secondary-servers
1029@vindex gnus-nntp-server
1030You can also make Gnus prompt you interactively for the name of an
1031@acronym{NNTP} server. If you give a non-numerical prefix to @code{gnus}
1032(i.e., @kbd{C-u M-x gnus}), Gnus will let you choose between the servers
1033in the @code{gnus-secondary-servers} list (if any). You can also just
1034type in the name of any server you feel like visiting. (Note that this
1035will set @code{gnus-nntp-server}, which means that if you then @kbd{M-x
1036gnus} later in the same Emacs session, Gnus will contact the same
1037server.)
1038
1039@findex gnus-group-browse-foreign-server
1040@kindex B (Group)
1041However, if you use one @acronym{NNTP} server regularly and are just
1042interested in a couple of groups from a different server, you would be
1043better served by using the @kbd{B} command in the group buffer. It will
1044let you have a look at what groups are available, and you can subscribe
1045to any of the groups you want to. This also makes @file{.newsrc}
1046maintenance much tidier. @xref{Foreign Groups}.
1047
1048@vindex gnus-secondary-select-methods
1049@c @head
1050A slightly different approach to foreign groups is to set the
1051@code{gnus-secondary-select-methods} variable. The select methods
1052listed in this variable are in many ways just as native as the
1053@code{gnus-select-method} server. They will also be queried for active
1054files during startup (if that's required), and new newsgroups that
1055appear on these servers will be subscribed (or not) just as native
1056groups are.
1057
1058For instance, if you use the @code{nnmbox} back end to read your mail,
1059you would typically set this variable to
1060
1061@lisp
1062(setq gnus-secondary-select-methods '((nnmbox "")))
1063@end lisp
1064
01c52d31
MB
1065Note: the @acronym{NNTP} back end stores marks in marks files
1066(@pxref{NNTP marks}). This feature makes it easy to share marks between
1067several Gnus installations, but may slow down things a bit when fetching
1068new articles. @xref{NNTP marks}, for more information.
1069
4009494e
GM
1070
1071@node The First Time
1072@section The First Time
1073@cindex first time usage
1074
1075If no startup files exist (@pxref{Startup Files}), Gnus will try to
1076determine what groups should be subscribed by default.
1077
1078@vindex gnus-default-subscribed-newsgroups
1079If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus
1080will subscribe you to just those groups in that list, leaving the rest
1081killed. Your system administrator should have set this variable to
1082something useful.
1083
1084Since she hasn't, Gnus will just subscribe you to a few arbitrarily
1085picked groups (i.e., @samp{*.newusers}). (@dfn{Arbitrary} is defined
1086here as @dfn{whatever Lars thinks you should read}.)
1087
1088You'll also be subscribed to the Gnus documentation group, which should
1089help you with most common problems.
1090
1091If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will just
1092use the normal functions for handling new groups, and not do anything
1093special.
1094
1095
1096@node The Server is Down
1097@section The Server is Down
1098@cindex server errors
1099
1100If the default server is down, Gnus will understandably have some
1101problems starting. However, if you have some mail groups in addition to
1102the news groups, you may want to start Gnus anyway.
1103
1104Gnus, being the trusting sort of program, will ask whether to proceed
1105without a native select method if that server can't be contacted. This
1106will happen whether the server doesn't actually exist (i.e., you have
1107given the wrong address) or the server has just momentarily taken ill
1108for some reason or other. If you decide to continue and have no foreign
1109groups, you'll find it difficult to actually do anything in the group
1110buffer. But, hey, that's your problem. Blllrph!
1111
1112@findex gnus-no-server
1113@kindex M-x gnus-no-server
1114@c @head
1115If you know that the server is definitely down, or you just want to read
1116your mail without bothering with the server at all, you can use the
1117@code{gnus-no-server} command to start Gnus. That might come in handy
1118if you're in a hurry as well. This command will not attempt to contact
1119your primary server---instead, it will just activate all groups on level
11201 and 2. (You should preferably keep no native groups on those two
1121levels.) Also @pxref{Group Levels}.
1122
1123
1124@node Slave Gnusae
1125@section Slave Gnusae
1126@cindex slave
1127
1128You might want to run more than one Emacs with more than one Gnus at the
1129same time. If you are using different @file{.newsrc} files (e.g., if you
1130are using the two different Gnusae to read from two different servers),
1131that is no problem whatsoever. You just do it.
1132
1133The problem appears when you want to run two Gnusae that use the same
1134@file{.newsrc} file.
1135
1136To work around that problem some, we here at the Think-Tank at the Gnus
1137Towers have come up with a new concept: @dfn{Masters} and
1138@dfn{slaves}. (We have applied for a patent on this concept, and have
1139taken out a copyright on those words. If you wish to use those words in
1140conjunction with each other, you have to send $1 per usage instance to
1141me. Usage of the patent (@dfn{Master/Slave Relationships In Computer
1142Applications}) will be much more expensive, of course.)
1143
1144@findex gnus-slave
1145Anyway, you start one Gnus up the normal way with @kbd{M-x gnus} (or
1146however you do it). Each subsequent slave Gnusae should be started with
1147@kbd{M-x gnus-slave}. These slaves won't save normal @file{.newsrc}
1148files, but instead save @dfn{slave files} that contain information only
1149on what groups have been read in the slave session. When a master Gnus
1150starts, it will read (and delete) these slave files, incorporating all
1151information from them. (The slave files will be read in the sequence
1152they were created, so the latest changes will have precedence.)
1153
1154Information from the slave files has, of course, precedence over the
1155information in the normal (i.e., master) @file{.newsrc} file.
1156
1157If the @file{.newsrc*} files have not been saved in the master when the
1158slave starts, you may be prompted as to whether to read an auto-save
1159file. If you answer ``yes'', the unsaved changes to the master will be
1160incorporated into the slave. If you answer ``no'', the slave may see some
1161messages as unread that have been read in the master.
1162
1163
1164
1165@node New Groups
1166@section New Groups
1167@cindex new groups
1168@cindex subscription
1169
1170@vindex gnus-check-new-newsgroups
1171If you are satisfied that you really never want to see any new groups,
1172you can set @code{gnus-check-new-newsgroups} to @code{nil}. This will
1173also save you some time at startup. Even if this variable is
1174@code{nil}, you can always subscribe to the new groups just by pressing
1175@kbd{U} in the group buffer (@pxref{Group Maintenance}). This variable
1176is @code{ask-server} by default. If you set this variable to
1177@code{always}, then Gnus will query the back ends for new groups even
1178when you do the @kbd{g} command (@pxref{Scanning New Messages}).
1179
1180@menu
1181* Checking New Groups:: Determining what groups are new.
1182* Subscription Methods:: What Gnus should do with new groups.
1183* Filtering New Groups:: Making Gnus ignore certain new groups.
1184@end menu
1185
1186
1187@node Checking New Groups
1188@subsection Checking New Groups
1189
1190Gnus normally determines whether a group is new or not by comparing the
1191list of groups from the active file(s) with the lists of subscribed and
1192dead groups. This isn't a particularly fast method. If
1193@code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask the
1194server for new groups since the last time. This is both faster and
1195cheaper. This also means that you can get rid of the list of killed
1196groups altogether, so you may set @code{gnus-save-killed-list} to
1197@code{nil}, which will save time both at startup, at exit, and all over.
1198Saves disk space, too. Why isn't this the default, then?
1199Unfortunately, not all servers support this command.
1200
1201I bet I know what you're thinking now: How do I find out whether my
1202server supports @code{ask-server}? No? Good, because I don't have a
1203fail-safe answer. I would suggest just setting this variable to
1204@code{ask-server} and see whether any new groups appear within the next
1205few days. If any do, then it works. If none do, then it doesn't
1206work. I could write a function to make Gnus guess whether the server
1207supports @code{ask-server}, but it would just be a guess. So I won't.
1208You could @code{telnet} to the server and say @code{HELP} and see
1209whether it lists @samp{NEWGROUPS} among the commands it understands. If
1210it does, then it might work. (But there are servers that lists
1211@samp{NEWGROUPS} without supporting the function properly.)
1212
1213This variable can also be a list of select methods. If so, Gnus will
1214issue an @code{ask-server} command to each of the select methods, and
1215subscribe them (or not) using the normal methods. This might be handy
1216if you are monitoring a few servers for new groups. A side effect is
1217that startup will take much longer, so you can meditate while waiting.
1218Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss.
1219
1220
1221@node Subscription Methods
1222@subsection Subscription Methods
1223
1224@vindex gnus-subscribe-newsgroup-method
1225What Gnus does when it encounters a new group is determined by the
1226@code{gnus-subscribe-newsgroup-method} variable.
1227
1228This variable should contain a function. This function will be called
1229with the name of the new group as the only parameter.
1230
1231Some handy pre-fab functions are:
1232
1233@table @code
1234
1235@item gnus-subscribe-zombies
1236@vindex gnus-subscribe-zombies
1237Make all new groups zombies. This is the default. You can browse the
1238zombies later (with @kbd{A z}) and either kill them all off properly
1239(with @kbd{S z}), or subscribe to them (with @kbd{u}).
1240
1241@item gnus-subscribe-randomly
1242@vindex gnus-subscribe-randomly
1243Subscribe all new groups in arbitrary order. This really means that all
1244new groups will be added at ``the top'' of the group buffer.
1245
1246@item gnus-subscribe-alphabetically
1247@vindex gnus-subscribe-alphabetically
1248Subscribe all new groups in alphabetical order.
1249
1250@item gnus-subscribe-hierarchically
1251@vindex gnus-subscribe-hierarchically
1252Subscribe all new groups hierarchically. The difference between this
1253function and @code{gnus-subscribe-alphabetically} is slight.
1254@code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly
1255alphabetical fashion, while this function will enter groups into its
1256hierarchy. So if you want to have the @samp{rec} hierarchy before the
1257@samp{comp} hierarchy, this function will not mess that configuration
1258up. Or something like that.
1259
1260@item gnus-subscribe-interactively
1261@vindex gnus-subscribe-interactively
1262Subscribe new groups interactively. This means that Gnus will ask
1263you about @strong{all} new groups. The groups you choose to subscribe
1264to will be subscribed hierarchically.
1265
1266@item gnus-subscribe-killed
1267@vindex gnus-subscribe-killed
1268Kill all new groups.
1269
1270@item gnus-subscribe-topics
1271@vindex gnus-subscribe-topics
1272Put the groups into the topic that has a matching @code{subscribe} topic
1273parameter (@pxref{Topic Parameters}). For instance, a @code{subscribe}
1274topic parameter that looks like
1275
1276@example
77ae8989 1277"nnml"
4009494e
GM
1278@end example
1279
1280will mean that all groups that match that regex will be subscribed under
1281that topic.
1282
1283If no topics match the groups, the groups will be subscribed in the
1284top-level topic.
1285
1286@end table
1287
1288@vindex gnus-subscribe-hierarchical-interactive
1289A closely related variable is
1290@code{gnus-subscribe-hierarchical-interactive}. (That's quite a
1291mouthful.) If this variable is non-@code{nil}, Gnus will ask you in a
1292hierarchical fashion whether to subscribe to new groups or not. Gnus
1293will ask you for each sub-hierarchy whether you want to descend the
1294hierarchy or not.
1295
1296One common mistake is to set the variable a few paragraphs above
1297(@code{gnus-subscribe-newsgroup-method}) to
1298@code{gnus-subscribe-hierarchical-interactive}. This is an error. This
1299will not work. This is ga-ga. So don't do it.
1300
1301
1302@node Filtering New Groups
1303@subsection Filtering New Groups
1304
1305A nice and portable way to control which new newsgroups should be
1306subscribed (or ignored) is to put an @dfn{options} line at the start of
1307the @file{.newsrc} file. Here's an example:
1308
1309@example
1310options -n !alt.all !rec.all sci.all
1311@end example
1312
1313@vindex gnus-subscribe-options-newsgroup-method
1314This line obviously belongs to a serious-minded intellectual scientific
1315person (or she may just be plain old boring), because it says that all
1316groups that have names beginning with @samp{alt} and @samp{rec} should
1317be ignored, and all groups with names beginning with @samp{sci} should
1318be subscribed. Gnus will not use the normal subscription method for
1319subscribing these groups.
1320@code{gnus-subscribe-options-newsgroup-method} is used instead. This
1321variable defaults to @code{gnus-subscribe-alphabetically}.
1322
1323@vindex gnus-options-not-subscribe
1324@vindex gnus-options-subscribe
1325If you don't want to mess with your @file{.newsrc} file, you can just
1326set the two variables @code{gnus-options-subscribe} and
1327@code{gnus-options-not-subscribe}. These two variables do exactly the
1328same as the @file{.newsrc} @samp{options -n} trick. Both are regexps,
1329and if the new group matches the former, it will be unconditionally
1330subscribed, and if it matches the latter, it will be ignored.
1331
1332@vindex gnus-auto-subscribed-groups
1333Yet another variable that meddles here is
1334@code{gnus-auto-subscribed-groups}. It works exactly like
1335@code{gnus-options-subscribe}, and is therefore really superfluous,
1336but I thought it would be nice to have two of these. This variable is
1337more meant for setting some ground rules, while the other variable is
1338used more for user fiddling. By default this variable makes all new
1339groups that come from mail back ends (@code{nnml}, @code{nnbabyl},
1340@code{nnfolder}, @code{nnmbox}, @code{nnmh}, and @code{nnmaildir})
1341subscribed. If you don't like that, just set this variable to
1342@code{nil}.
1343
1344New groups that match this regexp are subscribed using
1345@code{gnus-subscribe-options-newsgroup-method}.
1346
1347
1348@node Changing Servers
1349@section Changing Servers
1350@cindex changing servers
1351
1352Sometimes it is necessary to move from one @acronym{NNTP} server to another.
1353This happens very rarely, but perhaps you change jobs, or one server is
1354very flaky and you want to use another.
1355
1356Changing the server is pretty easy, right? You just change
1357@code{gnus-select-method} to point to the new server?
1358
1359@emph{Wrong!}
1360
1361Article numbers are not (in any way) kept synchronized between different
1362@acronym{NNTP} servers, and the only way Gnus keeps track of what articles
1363you have read is by keeping track of article numbers. So when you
1364change @code{gnus-select-method}, your @file{.newsrc} file becomes
1365worthless.
1366
4009494e
GM
1367@kindex M-x gnus-group-clear-data-on-native-groups
1368@findex gnus-group-clear-data-on-native-groups
f02566ce
KY
1369You can use the @kbd{M-x gnus-group-clear-data-on-native-groups}
1370command to clear out all data that you have on your native groups.
1371Use with caution.
4009494e
GM
1372
1373@kindex M-x gnus-group-clear-data
1374@findex gnus-group-clear-data
1375Clear the data from the current group only---nix out marks and the
1376list of read articles (@code{gnus-group-clear-data}).
1377
1378After changing servers, you @strong{must} move the cache hierarchy away,
1379since the cached articles will have wrong article numbers, which will
1380affect which articles Gnus thinks are read.
1381@code{gnus-group-clear-data-on-native-groups} will ask you if you want
1382to have it done automatically; for @code{gnus-group-clear-data}, you
1383can use @kbd{M-x gnus-cache-move-cache} (but beware, it will move the
1384cache for all groups).
1385
1386
1387@node Startup Files
1388@section Startup Files
1389@cindex startup files
1390@cindex .newsrc
1391@cindex .newsrc.el
1392@cindex .newsrc.eld
1393
1394Most common Unix news readers use a shared startup file called
1395@file{.newsrc}. This file contains all the information about what
1396groups are subscribed, and which articles in these groups have been
1397read.
1398
1399Things got a bit more complicated with @sc{gnus}. In addition to
1400keeping the @file{.newsrc} file updated, it also used a file called
1401@file{.newsrc.el} for storing all the information that didn't fit into
1402the @file{.newsrc} file. (Actually, it also duplicated everything in
1403the @file{.newsrc} file.) @sc{gnus} would read whichever one of these
1404files was the most recently saved, which enabled people to swap between
1405@sc{gnus} and other newsreaders.
1406
1407That was kinda silly, so Gnus went one better: In addition to the
1408@file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called
1409@file{.newsrc.eld}. It will read whichever of these files that are most
1410recent, but it will never write a @file{.newsrc.el} file. You should
1411never delete the @file{.newsrc.eld} file---it contains much information
1412not stored in the @file{.newsrc} file.
1413
1414@vindex gnus-save-newsrc-file
1415@vindex gnus-read-newsrc-file
1416You can turn off writing the @file{.newsrc} file by setting
1417@code{gnus-save-newsrc-file} to @code{nil}, which means you can delete
1418the file and save some space, as well as exiting from Gnus faster.
1419However, this will make it impossible to use other newsreaders than
1420Gnus. But hey, who would want to, right? Similarly, setting
1421@code{gnus-read-newsrc-file} to @code{nil} makes Gnus ignore the
1422@file{.newsrc} file and any @file{.newsrc-SERVER} files, which can be
1423convenient if you use a different news reader occasionally, and you
1424want to read a different subset of the available groups with that
1425news reader.
1426
1427@vindex gnus-save-killed-list
1428If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus
1429will not save the list of killed groups to the startup file. This will
1430save both time (when starting and quitting) and space (on disk). It
1431will also mean that Gnus has no record of what groups are new or old,
1432so the automatic new groups subscription methods become meaningless.
1433You should always set @code{gnus-check-new-newsgroups} to @code{nil} or
1434@code{ask-server} if you set this variable to @code{nil} (@pxref{New
1435Groups}). This variable can also be a regular expression. If that's
1436the case, remove all groups that do not match this regexp before
1437saving. This can be useful in certain obscure situations that involve
1438several servers where not all servers support @code{ask-server}.
1439
1440@vindex gnus-startup-file
1441@vindex gnus-backup-startup-file
1442@vindex version-control
1443The @code{gnus-startup-file} variable says where the startup files are.
1444The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup
1445file being whatever that one is, with a @samp{.eld} appended.
1446If you want version control for this file, set
1447@code{gnus-backup-startup-file}. It respects the same values as the
1448@code{version-control} variable.
1449
1450@vindex gnus-save-newsrc-hook
1451@vindex gnus-save-quick-newsrc-hook
1452@vindex gnus-save-standard-newsrc-hook
1453@code{gnus-save-newsrc-hook} is called before saving any of the newsrc
1454files, while @code{gnus-save-quick-newsrc-hook} is called just before
1455saving the @file{.newsrc.eld} file, and
1456@code{gnus-save-standard-newsrc-hook} is called just before saving the
1457@file{.newsrc} file. The latter two are commonly used to turn version
1458control on or off. Version control is on by default when saving the
1459startup files. If you want to turn backup creation off, say something like:
1460
1461@lisp
1462(defun turn-off-backup ()
1463 (set (make-local-variable 'backup-inhibited) t))
1464
1465(add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup)
1466(add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup)
1467@end lisp
1468
1469@vindex gnus-init-file
1470@vindex gnus-site-init-file
1471When Gnus starts, it will read the @code{gnus-site-init-file}
1472(@file{.../site-lisp/gnus-init} by default) and @code{gnus-init-file}
1473(@file{~/.gnus} by default) files. These are normal Emacs Lisp files
1474and can be used to avoid cluttering your @file{~/.emacs} and
1475@file{site-init} files with Gnus stuff. Gnus will also check for files
1476with the same names as these, but with @file{.elc} and @file{.el}
1477suffixes. In other words, if you have set @code{gnus-init-file} to
1478@file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el},
1479and finally @file{~/.gnus} (in this order). If Emacs was invoked with
1480the @option{-q} or @option{--no-init-file} options (@pxref{Initial
1481Options, ,Initial Options, emacs, The Emacs Manual}), Gnus doesn't read
1482@code{gnus-init-file}.
1483
1484
1485@node Auto Save
1486@section Auto Save
1487@cindex dribble file
1488@cindex auto-save
1489
1490Whenever you do something that changes the Gnus data (reading articles,
1491catching up, killing/subscribing groups), the change is added to a
1492special @dfn{dribble buffer}. This buffer is auto-saved the normal
1493Emacs way. If your Emacs should crash before you have saved the
1494@file{.newsrc} files, all changes you have made can be recovered from
1495this file.
1496
1497If Gnus detects this file at startup, it will ask the user whether to
1498read it. The auto save file is deleted whenever the real startup file is
1499saved.
1500
1501@vindex gnus-use-dribble-file
1502If @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create and
1503maintain a dribble buffer. The default is @code{t}.
1504
1505@vindex gnus-dribble-directory
1506Gnus will put the dribble file(s) in @code{gnus-dribble-directory}. If
1507this variable is @code{nil}, which it is by default, Gnus will dribble
1508into the directory where the @file{.newsrc} file is located. (This is
1509normally the user's home directory.) The dribble file will get the same
1510file permissions as the @file{.newsrc} file.
1511
1512@vindex gnus-always-read-dribble-file
1513If @code{gnus-always-read-dribble-file} is non-@code{nil}, Gnus will
1514read the dribble file on startup without querying the user.
1515
1516
1517@node The Active File
1518@section The Active File
1519@cindex active file
1520@cindex ignored groups
1521
1522When Gnus starts, or indeed whenever it tries to determine whether new
1523articles have arrived, it reads the active file. This is a very large
1524file that lists all the active groups and articles on the server.
1525
1526@vindex gnus-ignored-newsgroups
1527Before examining the active file, Gnus deletes all lines that match the
1528regexp @code{gnus-ignored-newsgroups}. This is done primarily to reject
1529any groups with bogus names, but you can use this variable to make Gnus
1530ignore hierarchies you aren't ever interested in. However, this is not
1531recommended. In fact, it's highly discouraged. Instead, @pxref{New
1532Groups} for an overview of other variables that can be used instead.
1533
1534@c This variable is
1535@c @code{nil} by default, and will slow down active file handling somewhat
1536@c if you set it to anything else.
1537
1538@vindex gnus-read-active-file
1539@c @head
1540The active file can be rather Huge, so if you have a slow network, you
1541can set @code{gnus-read-active-file} to @code{nil} to prevent Gnus from
1542reading the active file. This variable is @code{some} by default.
1543
1544Gnus will try to make do by getting information just on the groups that
1545you actually subscribe to.
1546
1547Note that if you subscribe to lots and lots of groups, setting this
1548variable to @code{nil} will probably make Gnus slower, not faster. At
1549present, having this variable @code{nil} will slow Gnus down
1550considerably, unless you read news over a 2400 baud modem.
1551
1552This variable can also have the value @code{some}. Gnus will then
1553attempt to read active info only on the subscribed groups. On some
1554servers this is quite fast (on sparkling, brand new INN servers that
1555support the @code{LIST ACTIVE group} command), on others this isn't fast
1556at all. In any case, @code{some} should be faster than @code{nil}, and
1557is certainly faster than @code{t} over slow lines.
1558
1559Some news servers (old versions of Leafnode and old versions of INN, for
1560instance) do not support the @code{LIST ACTIVE group}. For these
1561servers, @code{nil} is probably the most efficient value for this
1562variable.
1563
1564If this variable is @code{nil}, Gnus will ask for group info in total
1565lock-step, which isn't very fast. If it is @code{some} and you use an
1566@acronym{NNTP} server, Gnus will pump out commands as fast as it can, and
1567read all the replies in one swoop. This will normally result in better
1568performance, but if the server does not support the aforementioned
1569@code{LIST ACTIVE group} command, this isn't very nice to the server.
1570
1571If you think that starting up Gnus takes too long, try all the three
1572different values for this variable and see what works best for you.
1573
1574In any case, if you use @code{some} or @code{nil}, you should definitely
1575kill all groups that you aren't interested in to speed things up.
1576
1577Note that this variable also affects active file retrieval from
1578secondary select methods.
1579
1580
1581@node Startup Variables
1582@section Startup Variables
1583
1584@table @code
1585
1586@item gnus-load-hook
1587@vindex gnus-load-hook
1588A hook run while Gnus is being loaded. Note that this hook will
1589normally be run just once in each Emacs session, no matter how many
1590times you start Gnus.
1591
1592@item gnus-before-startup-hook
1593@vindex gnus-before-startup-hook
e3e955fe 1594A hook called as the first thing when Gnus is started.
4009494e
GM
1595
1596@item gnus-startup-hook
1597@vindex gnus-startup-hook
1598A hook run as the very last thing after starting up Gnus
1599
1600@item gnus-started-hook
1601@vindex gnus-started-hook
1602A hook that is run as the very last thing after starting up Gnus
1603successfully.
1604
1605@item gnus-setup-news-hook
1606@vindex gnus-setup-news-hook
1607A hook that is run after reading the @file{.newsrc} file(s), but before
1608generating the group buffer.
1609
1610@item gnus-check-bogus-newsgroups
1611@vindex gnus-check-bogus-newsgroups
1612If non-@code{nil}, Gnus will check for and delete all bogus groups at
1613startup. A @dfn{bogus group} is a group that you have in your
1614@file{.newsrc} file, but doesn't exist on the news server. Checking for
1615bogus groups can take quite a while, so to save time and resources it's
1616best to leave this option off, and do the checking for bogus groups once
1617in a while from the group buffer instead (@pxref{Group Maintenance}).
1618
1619@item gnus-inhibit-startup-message
1620@vindex gnus-inhibit-startup-message
1621If non-@code{nil}, the startup message won't be displayed. That way,
1622your boss might not notice as easily that you are reading news instead
1623of doing your job. Note that this variable is used before
1624@file{~/.gnus.el} is loaded, so it should be set in @file{.emacs} instead.
1625
1626@item gnus-no-groups-message
1627@vindex gnus-no-groups-message
1628Message displayed by Gnus when no groups are available.
1629
b1ae92ba
G
1630@item gnus-use-backend-marks
1631@vindex gnus-use-backend-marks
1632If non-@code{nil}, Gnus will store article marks both in the
1633@file{.newsrc.eld} file and in the backends. This will slow down
1634group operation some.
1635
4009494e
GM
1636@end table
1637
1638
1639@node Group Buffer
1640@chapter Group Buffer
1641@cindex group buffer
1642
1643@c Alex Schroeder suggests to rearrange this as follows:
1644@c
1645@c <kensanata> ok, just save it for reference. I'll go to bed in a minute.
1646@c 1. Selecting a Group, 2. (new) Finding a Group, 3. Group Levels,
1647@c 4. Subscription Commands, 5. Group Maneuvering, 6. Group Data,
1648@c 7. Group Score, 8. Group Buffer Format
1649@c <kensanata> Group Levels should have more information on levels 5 to 9. I
1650@c suggest to split the 4th paragraph ("Gnus considers groups...") as follows:
1651@c <kensanata> First, "Gnus considers groups... (default 9)."
1652@c <kensanata> New, a table summarizing what levels 1 to 9 mean.
1653@c <kensanata> Third, "Gnus treats subscribed ... reasons of efficiency"
1654@c <kensanata> Then expand the next paragraph or add some more to it.
1655@c This short one sentence explains levels 1 and 2, therefore I understand
1656@c that I should keep important news at 3 and boring news at 4.
1657@c Say so! Then go on to explain why I should bother with levels 6 to 9.
1658@c Maybe keep those that you don't want to read temporarily at 6,
1659@c those that you never want to read at 8, those that offend your
1660@c human rights at 9...
1661
1662
1663The @dfn{group buffer} lists all (or parts) of the available groups. It
1664is the first buffer shown when Gnus starts, and will never be killed as
1665long as Gnus is active.
1666
1667@iftex
1668@iflatex
1669\gnusfigure{The Group Buffer}{320}{
1670\put(75,50){\epsfig{figure=ps/group,height=9cm}}
1671\put(120,37){\makebox(0,0)[t]{Buffer name}}
1672\put(120,38){\vector(1,2){10}}
1673\put(40,60){\makebox(0,0)[r]{Mode line}}
1674\put(40,58){\vector(1,0){30}}
1675\put(200,28){\makebox(0,0)[t]{Native select method}}
1676\put(200,26){\vector(-1,2){15}}
1677}
1678@end iflatex
1679@end iftex
1680
1681@menu
1682* Group Buffer Format:: Information listed and how you can change it.
1683* Group Maneuvering:: Commands for moving in the group buffer.
1684* Selecting a Group:: Actually reading news.
1685* Subscription Commands:: Unsubscribing, killing, subscribing.
1686* Group Data:: Changing the info for a group.
1687* Group Levels:: Levels? What are those, then?
1688* Group Score:: A mechanism for finding out what groups you like.
1689* Marking Groups:: You can mark groups for later processing.
1690* Foreign Groups:: Creating and editing groups.
1691* Group Parameters:: Each group may have different parameters set.
1692* Listing Groups:: Gnus can list various subsets of the groups.
1693* Sorting Groups:: Re-arrange the group order.
1694* Group Maintenance:: Maintaining a tidy @file{.newsrc} file.
1695* Browse Foreign Server:: You can browse a server. See what it has to offer.
1696* Exiting Gnus:: Stop reading news and get some work done.
1697* Group Topics:: A folding group mode divided into topics.
01c52d31 1698* Non-ASCII Group Names:: Accessing groups of non-English names.
e6d2d263 1699* Searching:: Mail search engines.
4009494e
GM
1700* Misc Group Stuff:: Other stuff that you can to do.
1701@end menu
1702
1703
1704@node Group Buffer Format
1705@section Group Buffer Format
1706
1707@menu
1708* Group Line Specification:: Deciding how the group buffer is to look.
1709* Group Mode Line Specification:: The group buffer mode line.
1710* Group Highlighting:: Having nice colors in the group buffer.
1711@end menu
1712
1713You can customize the Group Mode tool bar, see @kbd{M-x
1714customize-apropos RET gnus-group-tool-bar}. This feature is only
1715available in Emacs.
1716
1717The tool bar icons are now (de)activated correctly depending on the
1718cursor position. Therefore, moving around in the Group Buffer is
1719slower. You can disable this via the variable
1720@code{gnus-group-update-tool-bar}. Its default value depends on your
1721Emacs version.
1722
1723@node Group Line Specification
1724@subsection Group Line Specification
1725@cindex group buffer format
1726
1727The default format of the group buffer is nice and dull, but you can
1728make it as exciting and ugly as you feel like.
1729
1730Here's a couple of example group lines:
1731
1732@example
1733 25: news.announce.newusers
1734 * 0: alt.fan.andrea-dworkin
1735@end example
1736
1737Quite simple, huh?
1738
1739You can see that there are 25 unread articles in
1740@samp{news.announce.newusers}. There are no unread articles, but some
1741ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little
1742asterisk at the beginning of the line?).
1743
1744@vindex gnus-group-line-format
1745You can change that format to whatever you want by fiddling with the
1746@code{gnus-group-line-format} variable. This variable works along the
1747lines of a @code{format} specification, which is pretty much the same as
1748a @code{printf} specifications, for those of you who use (feh!) C.
1749@xref{Formatting Variables}.
1750
1751@samp{%M%S%5y:%B%(%g%)\n} is the value that produced those lines above.
1752
1753There should always be a colon on the line; the cursor always moves to
1754the colon after performing an operation. @xref{Positioning
1755Point}. Nothing else is required---not even the group name. All
1756displayed text is just window dressing, and is never examined by Gnus.
1757Gnus stores all real information it needs using text properties.
1758
1759(Note that if you make a really strange, wonderful, spreadsheet-like
1760layout, everybody will believe you are hard at work with the accounting
1761instead of wasting time reading news.)
1762
1763Here's a list of all available format characters:
1764
1765@table @samp
1766
1767@item M
1768An asterisk if the group only has marked articles.
1769
1770@item S
1771Whether the group is subscribed.
1772
1773@item L
1774Level of subscribedness.
1775
1776@item N
1777Number of unread articles.
1778
1779@item I
1780Number of dormant articles.
1781
1782@item T
1783Number of ticked articles.
1784
1785@item R
1786Number of read articles.
1787
1788@item U
1789Number of unseen articles.
1790
1791@item t
1792Estimated total number of articles. (This is really @var{max-number}
1793minus @var{min-number} plus 1.)
1794
1795Gnus uses this estimation because the @acronym{NNTP} protocol provides
1796efficient access to @var{max-number} and @var{min-number} but getting
1797the true unread message count is not possible efficiently. For
1798hysterical raisins, even the mail back ends, where the true number of
1799unread messages might be available efficiently, use the same limited
1800interface. To remove this restriction from Gnus means that the back
01c52d31
MB
1801end interface has to be changed, which is not an easy job.
1802
1803The nnml backend (@pxref{Mail Spool}) has a feature called ``group
1804compaction'' which circumvents this deficiency: the idea is to
1805renumber all articles from 1, removing all gaps between numbers, hence
1806getting a correct total count. Other backends may support this in the
1807future. In order to keep your total article count relatively up to
1808date, you might want to compact your groups (or even directly your
1809server) from time to time. @xref{Misc Group Stuff}, @xref{Server Commands}.
4009494e
GM
1810
1811@item y
1812Number of unread, unticked, non-dormant articles.
1813
1814@item i
1815Number of ticked and dormant articles.
1816
1817@item g
1818Full group name.
1819
1820@item G
1821Group name.
1822
1823@item C
1824Group comment (@pxref{Group Parameters}) or group name if there is no
1825comment element in the group parameters.
1826
1827@item D
1828Newsgroup description. You need to read the group descriptions
1829before these will appear, and to do that, you either have to set
1830@code{gnus-read-active-file} or use the group buffer @kbd{M-d}
1831command.
1832
1833@item o
1834@samp{m} if moderated.
1835
1836@item O
1837@samp{(m)} if moderated.
1838
1839@item s
1840Select method.
1841
1842@item B
1843If the summary buffer for the group is open or not.
1844
1845@item n
1846Select from where.
1847
1848@item z
1849A string that looks like @samp{<%s:%n>} if a foreign select method is
1850used.
1851
1852@item P
1853Indentation based on the level of the topic (@pxref{Group Topics}).
1854
1855@item c
1856@vindex gnus-group-uncollapsed-levels
1857Short (collapsed) group name. The @code{gnus-group-uncollapsed-levels}
1858variable says how many levels to leave at the end of the group name.
1859The default is 1---this will mean that group names like
1860@samp{gnu.emacs.gnus} will be shortened to @samp{g.e.gnus}.
1861
1862@item m
1863@vindex gnus-new-mail-mark
1864@cindex %
1865@samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail to
1866the group lately.
1867
1868@item p
1869@samp{#} (@code{gnus-process-mark}) if the group is process marked.
1870
1871@item d
1872A string that says when you last read the group (@pxref{Group
1873Timestamp}).
1874
01c52d31
MB
1875@item F
1876The disk space used by the articles fetched by both the cache and
1877agent. The value is automatically scaled to bytes(B), kilobytes(K),
1878megabytes(M), or gigabytes(G) to minimize the column width. A format
1879of %7F is sufficient for a fixed-width column.
1880
4009494e
GM
1881@item u
1882User defined specifier. The next character in the format string should
1883be a letter. Gnus will call the function
1884@code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
1885following @samp{%u}. The function will be passed a single dummy
1886parameter as argument. The function should return a string, which will
1887be inserted into the buffer just like information from any other
1888specifier.
1889@end table
1890
1891@cindex *
1892All the ``number-of'' specs will be filled with an asterisk (@samp{*})
1893if no info is available---for instance, if it is a non-activated foreign
1894group, or a bogus native group.
1895
1896
1897@node Group Mode Line Specification
1898@subsection Group Mode Line Specification
1899@cindex group mode line
1900
1901@vindex gnus-group-mode-line-format
1902The mode line can be changed by setting
1903@code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}). It
1904doesn't understand that many format specifiers:
1905
1906@table @samp
1907@item S
1908The native news server.
1909@item M
1910The native select method.
1911@end table
1912
1913
1914@node Group Highlighting
1915@subsection Group Highlighting
1916@cindex highlighting
1917@cindex group highlighting
1918
1919@vindex gnus-group-highlight
1920Highlighting in the group buffer is controlled by the
1921@code{gnus-group-highlight} variable. This is an alist with elements
1922that look like @code{(@var{form} . @var{face})}. If @var{form} evaluates to
1923something non-@code{nil}, the @var{face} will be used on the line.
1924
1925Here's an example value for this variable that might look nice if the
1926background is dark:
1927
1928@lisp
1929(cond (window-system
1930 (setq custom-background-mode 'light)
1931 (defface my-group-face-1
1932 '((t (:foreground "Red" :bold t))) "First group face")
1933 (defface my-group-face-2
1934 '((t (:foreground "DarkSeaGreen4" :bold t)))
1935 "Second group face")
1936 (defface my-group-face-3
1937 '((t (:foreground "Green4" :bold t))) "Third group face")
1938 (defface my-group-face-4
1939 '((t (:foreground "SteelBlue" :bold t))) "Fourth group face")
1940 (defface my-group-face-5
1941 '((t (:foreground "Blue" :bold t))) "Fifth group face")))
1942
1943(setq gnus-group-highlight
1944 '(((> unread 200) . my-group-face-1)
1945 ((and (< level 3) (zerop unread)) . my-group-face-2)
1946 ((< level 3) . my-group-face-3)
1947 ((zerop unread) . my-group-face-4)
1948 (t . my-group-face-5)))
1949@end lisp
1950
1951Also @pxref{Faces and Fonts}.
1952
1953Variables that are dynamically bound when the forms are evaluated
1954include:
1955
1956@table @code
1957@item group
1958The group name.
1959@item unread
1960The number of unread articles in the group.
1961@item method
1962The select method.
1963@item mailp
1964Whether the group is a mail group.
1965@item level
1966The level of the group.
1967@item score
1968The score of the group.
1969@item ticked
1970The number of ticked articles in the group.
1971@item total
1972The total number of articles in the group. Or rather,
1973@var{max-number} minus @var{min-number} plus one.
1974@item topic
1975When using the topic minor mode, this variable is bound to the current
1976topic being inserted.
1977@end table
1978
1979When the forms are @code{eval}ed, point is at the beginning of the line
1980of the group in question, so you can use many of the normal Gnus
1981functions for snarfing info on the group.
1982
1983@vindex gnus-group-update-hook
1984@findex gnus-group-highlight-line
1985@code{gnus-group-update-hook} is called when a group line is changed.
b069e5a6 1986It will not be called when @code{gnus-visual} is @code{nil}.
4009494e
GM
1987
1988
1989@node Group Maneuvering
1990@section Group Maneuvering
1991@cindex group movement
1992
1993All movement commands understand the numeric prefix and will behave as
1994expected, hopefully.
1995
1996@table @kbd
1997
1998@item n
1999@kindex n (Group)
2000@findex gnus-group-next-unread-group
2001Go to the next group that has unread articles
2002(@code{gnus-group-next-unread-group}).
2003
2004@item p
2005@itemx DEL
2006@kindex DEL (Group)
2007@kindex p (Group)
2008@findex gnus-group-prev-unread-group
2009Go to the previous group that has unread articles
2010(@code{gnus-group-prev-unread-group}).
2011
2012@item N
2013@kindex N (Group)
2014@findex gnus-group-next-group
2015Go to the next group (@code{gnus-group-next-group}).
2016
2017@item P
2018@kindex P (Group)
2019@findex gnus-group-prev-group
2020Go to the previous group (@code{gnus-group-prev-group}).
2021
2022@item M-n
2023@kindex M-n (Group)
2024@findex gnus-group-next-unread-group-same-level
2025Go to the next unread group on the same (or lower) level
2026(@code{gnus-group-next-unread-group-same-level}).
2027
2028@item M-p
2029@kindex M-p (Group)
2030@findex gnus-group-prev-unread-group-same-level
2031Go to the previous unread group on the same (or lower) level
2032(@code{gnus-group-prev-unread-group-same-level}).
2033@end table
2034
2035Three commands for jumping to groups:
2036
2037@table @kbd
2038
2039@item j
2040@kindex j (Group)
2041@findex gnus-group-jump-to-group
2042Jump to a group (and make it visible if it isn't already)
2043(@code{gnus-group-jump-to-group}). Killed groups can be jumped to, just
2044like living groups.
2045
2046@item ,
2047@kindex , (Group)
2048@findex gnus-group-best-unread-group
2049Jump to the unread group with the lowest level
2050(@code{gnus-group-best-unread-group}).
2051
2052@item .
2053@kindex . (Group)
2054@findex gnus-group-first-unread-group
2055Jump to the first group with unread articles
2056(@code{gnus-group-first-unread-group}).
2057@end table
2058
2059@vindex gnus-group-goto-unread
2060If @code{gnus-group-goto-unread} is @code{nil}, all the movement
2061commands will move to the next group, not the next unread group. Even
2062the commands that say they move to the next unread group. The default
2063is @code{t}.
2064
01c52d31
MB
2065@vindex gnus-summary-next-group-on-exit
2066If @code{gnus-summary-next-group-on-exit} is @code{t}, when a summary is
2067exited, the point in the group buffer is moved to the next unread group.
2068Otherwise, the point is set to the group just exited. The default is
2069@code{t}.
4009494e
GM
2070
2071@node Selecting a Group
2072@section Selecting a Group
2073@cindex group selection
2074
2075@table @kbd
2076
2077@item SPACE
2078@kindex SPACE (Group)
2079@findex gnus-group-read-group
2080Select the current group, switch to the summary buffer and display the
2081first unread article (@code{gnus-group-read-group}). If there are no
2082unread articles in the group, or if you give a non-numerical prefix to
2083this command, Gnus will offer to fetch all the old articles in this
2084group from the server. If you give a numerical prefix @var{n}, @var{n}
2085determines the number of articles Gnus will fetch. If @var{n} is
2086positive, Gnus fetches the @var{n} newest articles, if @var{n} is
2087negative, Gnus fetches the @code{abs(@var{n})} oldest articles.
2088
2089Thus, @kbd{SPC} enters the group normally, @kbd{C-u SPC} offers old
2090articles, @kbd{C-u 4 2 SPC} fetches the 42 newest articles, and @kbd{C-u
2091- 4 2 SPC} fetches the 42 oldest ones.
2092
2093When you are in the group (in the Summary buffer), you can type
2094@kbd{M-g} to fetch new articles, or @kbd{C-u M-g} to also show the old
2095ones.
2096
2097@item RET
2098@kindex RET (Group)
2099@findex gnus-group-select-group
2100Select the current group and switch to the summary buffer
2101(@code{gnus-group-select-group}). Takes the same arguments as
2102@code{gnus-group-read-group}---the only difference is that this command
2103does not display the first unread article automatically upon group
2104entry.
2105
2106@item M-RET
2107@kindex M-RET (Group)
2108@findex gnus-group-quick-select-group
2109This does the same as the command above, but tries to do it with the
2110minimum amount of fuzz (@code{gnus-group-quick-select-group}). No
2111scoring/killing will be performed, there will be no highlights and no
2112expunging. This might be useful if you're in a real hurry and have to
2113enter some humongous group. If you give a 0 prefix to this command
2114(i.e., @kbd{0 M-RET}), Gnus won't even generate the summary buffer,
2115which is useful if you want to toggle threading before generating the
2116summary buffer (@pxref{Summary Generation Commands}).
2117
2118@item M-SPACE
2119@kindex M-SPACE (Group)
2120@findex gnus-group-visible-select-group
2121This is yet one more command that does the same as the @kbd{RET}
2122command, but this one does it without expunging and hiding dormants
2123(@code{gnus-group-visible-select-group}).
2124
2125@item C-M-RET
2126@kindex C-M-RET (Group)
2127@findex gnus-group-select-group-ephemerally
2128Finally, this command selects the current group ephemerally without
2129doing any processing of its contents
2130(@code{gnus-group-select-group-ephemerally}). Even threading has been
2131turned off. Everything you do in the group after selecting it in this
2132manner will have no permanent effects.
2133
2134@end table
2135
2136@vindex gnus-large-newsgroup
2137The @code{gnus-large-newsgroup} variable says what Gnus should
2138consider to be a big group. If it is @code{nil}, no groups are
2139considered big. The default value is 200. If the group has more
2140(unread and/or ticked) articles than this, Gnus will query the user
2141before entering the group. The user can then specify how many
2142articles should be fetched from the server. If the user specifies a
2143negative number (@var{-n}), the @var{n} oldest articles will be
2144fetched. If it is positive, the @var{n} articles that have arrived
2145most recently will be fetched.
2146
2147@vindex gnus-large-ephemeral-newsgroup
2148@code{gnus-large-ephemeral-newsgroup} is the same as
2149@code{gnus-large-newsgroup}, but is only used for ephemeral
2150newsgroups.
2151
4b70e299 2152@vindex gnus-newsgroup-maximum-articles
4009494e
GM
2153In groups in some news servers, there might be a big gap between a few
2154very old articles that will never be expired and the recent ones. In
2155such a case, the server will return the data like @code{(1 . 30000000)}
2156for the @code{LIST ACTIVE group} command, for example. Even if there
2157are actually only the articles 1-10 and 29999900-30000000, Gnus doesn't
2158know it at first and prepares for getting 30000000 articles. However,
2159it will consume hundreds megabytes of memories and might make Emacs get
2160stuck as the case may be. If you use such news servers, set the
4b70e299
MB
2161variable @code{gnus-newsgroup-maximum-articles} to a positive number.
2162The value means that Gnus ignores articles other than this number of the
2163latest ones in every group. For instance, the value 10000 makes Gnus
2164get only the articles 29990001-30000000 (if the latest article number is
216530000000 in a group). Note that setting this variable to a number might
2166prevent you from reading very old articles. The default value of the
2167variable @code{gnus-newsgroup-maximum-articles} is @code{nil}, which
2168means Gnus never ignores old articles.
4009494e
GM
2169
2170@vindex gnus-select-group-hook
2171@vindex gnus-auto-select-first
2172@vindex gnus-auto-select-subject
2173If @code{gnus-auto-select-first} is non-@code{nil}, select an article
2174automatically when entering a group with the @kbd{SPACE} command.
867d4bb3 2175Which article this is controlled by the
4009494e
GM
2176@code{gnus-auto-select-subject} variable. Valid values for this
2177variable are:
2178
2179@table @code
2180
2181@item unread
2182Place point on the subject line of the first unread article.
2183
2184@item first
2185Place point on the subject line of the first article.
2186
2187@item unseen
2188Place point on the subject line of the first unseen article.
2189
2190@item unseen-or-unread
2191Place point on the subject line of the first unseen article, and if
2192there is no such article, place point on the subject line of the first
2193unread article.
2194
2195@item best
2196Place point on the subject line of the highest-scored unread article.
2197
2198@end table
2199
2200This variable can also be a function. In that case, that function
2201will be called to place point on a subject line.
2202
2203If you want to prevent automatic selection in some group (say, in a
2204binary group with Huge articles) you can set the
2205@code{gnus-auto-select-first} variable to @code{nil} in
2206@code{gnus-select-group-hook}, which is called when a group is
2207selected.
2208
2209
2210@node Subscription Commands
2211@section Subscription Commands
2212@cindex subscription
2213
2214@table @kbd
2215
2216@item S t
2217@itemx u
2218@kindex S t (Group)
2219@kindex u (Group)
2220@findex gnus-group-unsubscribe-current-group
2221@c @icon{gnus-group-unsubscribe}
2222Toggle subscription to the current group
2223(@code{gnus-group-unsubscribe-current-group}).
2224
2225@item S s
2226@itemx U
2227@kindex S s (Group)
2228@kindex U (Group)
2229@findex gnus-group-unsubscribe-group
2230Prompt for a group to subscribe, and then subscribe it. If it was
2231subscribed already, unsubscribe it instead
2232(@code{gnus-group-unsubscribe-group}).
2233
2234@item S k
2235@itemx C-k
2236@kindex S k (Group)
2237@kindex C-k (Group)
2238@findex gnus-group-kill-group
2239@c @icon{gnus-group-kill-group}
2240Kill the current group (@code{gnus-group-kill-group}).
2241
2242@item S y
2243@itemx C-y
2244@kindex S y (Group)
2245@kindex C-y (Group)
2246@findex gnus-group-yank-group
2247Yank the last killed group (@code{gnus-group-yank-group}).
2248
2249@item C-x C-t
2250@kindex C-x C-t (Group)
2251@findex gnus-group-transpose-groups
2252Transpose two groups (@code{gnus-group-transpose-groups}). This isn't
2253really a subscription command, but you can use it instead of a
2254kill-and-yank sequence sometimes.
2255
2256@item S w
2257@itemx C-w
2258@kindex S w (Group)
2259@kindex C-w (Group)
2260@findex gnus-group-kill-region
2261Kill all groups in the region (@code{gnus-group-kill-region}).
2262
2263@item S z
2264@kindex S z (Group)
2265@findex gnus-group-kill-all-zombies
2266Kill all zombie groups (@code{gnus-group-kill-all-zombies}).
2267
2268@item S C-k
2269@kindex S C-k (Group)
2270@findex gnus-group-kill-level
2271Kill all groups on a certain level (@code{gnus-group-kill-level}).
2272These groups can't be yanked back after killing, so this command should
2273be used with some caution. The only time where this command comes in
2274really handy is when you have a @file{.newsrc} with lots of unsubscribed
2275groups that you want to get rid off. @kbd{S C-k} on level 7 will
2276kill off all unsubscribed groups that do not have message numbers in the
2277@file{.newsrc} file.
2278
2279@end table
2280
2281Also @pxref{Group Levels}.
2282
2283
2284@node Group Data
2285@section Group Data
2286
2287@table @kbd
2288
2289@item c
2290@kindex c (Group)
2291@findex gnus-group-catchup-current
2292@vindex gnus-group-catchup-group-hook
2293@c @icon{gnus-group-catchup-current}
2294Mark all unticked articles in this group as read
2295(@code{gnus-group-catchup-current}).
2296@code{gnus-group-catchup-group-hook} is called when catching up a group from
2297the group buffer.
2298
2299@item C
2300@kindex C (Group)
2301@findex gnus-group-catchup-current-all
2302Mark all articles in this group, even the ticked ones, as read
2303(@code{gnus-group-catchup-current-all}).
2304
2305@item M-c
2306@kindex M-c (Group)
2307@findex gnus-group-clear-data
2308Clear the data from the current group---nix out marks and the list of
2309read articles (@code{gnus-group-clear-data}).
2310
2311@item M-x gnus-group-clear-data-on-native-groups
2312@kindex M-x gnus-group-clear-data-on-native-groups
2313@findex gnus-group-clear-data-on-native-groups
2314If you have switched from one @acronym{NNTP} server to another, all your marks
2315and read ranges have become worthless. You can use this command to
2316clear out all data that you have on your native groups. Use with
2317caution.
2318
2319@end table
2320
2321
2322@node Group Levels
2323@section Group Levels
2324@cindex group level
2325@cindex level
2326
2327All groups have a level of @dfn{subscribedness}. For instance, if a
2328group is on level 2, it is more subscribed than a group on level 5. You
2329can ask Gnus to just list groups on a given level or lower
2330(@pxref{Listing Groups}), or to just check for new articles in groups on
2331a given level or lower (@pxref{Scanning New Messages}).
2332
2333Remember: The higher the level of the group, the less important it is.
2334
2335@table @kbd
2336
2337@item S l
2338@kindex S l (Group)
2339@findex gnus-group-set-current-level
2340Set the level of the current group. If a numeric prefix is given, the
2341next @var{n} groups will have their levels set. The user will be
2342prompted for a level.
2343@end table
2344
2345@vindex gnus-level-killed
2346@vindex gnus-level-zombie
2347@vindex gnus-level-unsubscribed
2348@vindex gnus-level-subscribed
2349Gnus considers groups from levels 1 to
2350@code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed,
2351@code{gnus-level-subscribed} (exclusive) and
2352@code{gnus-level-unsubscribed} (inclusive) (default 7) to be
2353unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead)
2354(default 8) and @code{gnus-level-killed} to be killed (completely dead)
2355(default 9). Gnus treats subscribed and unsubscribed groups exactly the
2356same, but zombie and killed groups have no information on what articles
2357you have read, etc, stored. This distinction between dead and living
2358groups isn't done because it is nice or clever, it is done purely for
2359reasons of efficiency.
2360
2361It is recommended that you keep all your mail groups (if any) on quite
2362low levels (e.g. 1 or 2).
2363
2364Maybe the following description of the default behavior of Gnus helps to
2365understand what these levels are all about. By default, Gnus shows you
2366subscribed nonempty groups, but by hitting @kbd{L} you can have it show
2367empty subscribed groups and unsubscribed groups, too. Type @kbd{l} to
2368go back to showing nonempty subscribed groups again. Thus, unsubscribed
2369groups are hidden, in a way.
2370
2371Zombie and killed groups are similar to unsubscribed groups in that they
2372are hidden by default. But they are different from subscribed and
2373unsubscribed groups in that Gnus doesn't ask the news server for
2374information (number of messages, number of unread messages) on zombie
2375and killed groups. Normally, you use @kbd{C-k} to kill the groups you
2376aren't interested in. If most groups are killed, Gnus is faster.
2377
2378Why does Gnus distinguish between zombie and killed groups? Well, when
2379a new group arrives on the server, Gnus by default makes it a zombie
2380group. This means that you are normally not bothered with new groups,
2381but you can type @kbd{A z} to get a list of all new groups. Subscribe
2382the ones you like and kill the ones you don't want. (@kbd{A k} shows a
2383list of killed groups.)
2384
2385If you want to play with the level variables, you should show some care.
2386Set them once, and don't touch them ever again. Better yet, don't touch
2387them at all unless you know exactly what you're doing.
2388
2389@vindex gnus-level-default-unsubscribed
2390@vindex gnus-level-default-subscribed
2391Two closely related variables are @code{gnus-level-default-subscribed}
2392(default 3) and @code{gnus-level-default-unsubscribed} (default 6),
2393which are the levels that new groups will be put on if they are
2394(un)subscribed. These two variables should, of course, be inside the
2395relevant valid ranges.
2396
2397@vindex gnus-keep-same-level
2398If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands
2399will only move to groups of the same level (or lower). In
2400particular, going from the last article in one group to the next group
2401will go to the next group of the same level (or lower). This might be
2402handy if you want to read the most important groups before you read the
2403rest.
2404
2405If this variable is @code{best}, Gnus will make the next newsgroup the
2406one with the best level.
2407
2408@vindex gnus-group-default-list-level
2409All groups with a level less than or equal to
2410@code{gnus-group-default-list-level} will be listed in the group buffer
2411by default.
2412
2413@vindex gnus-group-list-inactive-groups
2414If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active
2415groups will be listed along with the unread groups. This variable is
2416@code{t} by default. If it is @code{nil}, inactive groups won't be
2417listed.
2418
2419@vindex gnus-group-use-permanent-levels
2420If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you
2421give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
2422use this level as the ``work'' level.
2423
2424@vindex gnus-activate-level
2425Gnus will normally just activate (i. e., query the server about) groups
2426on level @code{gnus-activate-level} or less. If you don't want to
2427activate unsubscribed groups, for instance, you might set this variable
2428to 5. The default is 6.
2429
2430
2431@node Group Score
2432@section Group Score
2433@cindex group score
2434@cindex group rank
2435@cindex rank
2436
2437You would normally keep important groups on high levels, but that scheme
2438is somewhat restrictive. Don't you wish you could have Gnus sort the
2439group buffer according to how often you read groups, perhaps? Within
2440reason?
2441
2442This is what @dfn{group score} is for. You can have Gnus assign a score
2443to each group through the mechanism described below. You can then sort
2444the group buffer based on this score. Alternatively, you can sort on
2445score and then level. (Taken together, the level and the score is
2446called the @dfn{rank} of the group. A group that is on level 4 and has
2447a score of 1 has a higher rank than a group on level 5 that has a score
2448of 300. (The level is the most significant part and the score is the
2449least significant part.))
2450
2451@findex gnus-summary-bubble-group
2452If you want groups you read often to get higher scores than groups you
2453read seldom you can add the @code{gnus-summary-bubble-group} function to
2454the @code{gnus-summary-exit-hook} hook. This will result (after
2455sorting) in a bubbling sort of action. If you want to see that in
2456action after each summary exit, you can add
2457@code{gnus-group-sort-groups-by-rank} or
2458@code{gnus-group-sort-groups-by-score} to the same hook, but that will
2459slow things down somewhat.
2460
2461
2462@node Marking Groups
2463@section Marking Groups
2464@cindex marking groups
2465
2466If you want to perform some command on several groups, and they appear
2467subsequently in the group buffer, you would normally just give a
2468numerical prefix to the command. Most group commands will then do your
2469bidding on those groups.
2470
2471However, if the groups are not in sequential order, you can still
2472perform a command on several groups. You simply mark the groups first
2473with the process mark and then execute the command.
2474
2475@table @kbd
2476
2477@item #
2478@kindex # (Group)
2479@itemx M m
2480@kindex M m (Group)
2481@findex gnus-group-mark-group
2482Set the mark on the current group (@code{gnus-group-mark-group}).
2483
2484@item M-#
2485@kindex M-# (Group)
2486@itemx M u
2487@kindex M u (Group)
2488@findex gnus-group-unmark-group
2489Remove the mark from the current group
2490(@code{gnus-group-unmark-group}).
2491
2492@item M U
2493@kindex M U (Group)
2494@findex gnus-group-unmark-all-groups
2495Remove the mark from all groups (@code{gnus-group-unmark-all-groups}).
2496
2497@item M w
2498@kindex M w (Group)
2499@findex gnus-group-mark-region
2500Mark all groups between point and mark (@code{gnus-group-mark-region}).
2501
2502@item M b
2503@kindex M b (Group)
2504@findex gnus-group-mark-buffer
2505Mark all groups in the buffer (@code{gnus-group-mark-buffer}).
2506
2507@item M r
2508@kindex M r (Group)
2509@findex gnus-group-mark-regexp
2510Mark all groups that match some regular expression
2511(@code{gnus-group-mark-regexp}).
2512@end table
2513
2514Also @pxref{Process/Prefix}.
2515
2516@findex gnus-group-universal-argument
2517If you want to execute some command on all groups that have been marked
2518with the process mark, you can use the @kbd{M-&}
2519(@code{gnus-group-universal-argument}) command. It will prompt you for
2520the command to be executed.
2521
2522
2523@node Foreign Groups
2524@section Foreign Groups
2525@cindex foreign groups
2526
2527Below are some group mode commands for making and editing general foreign
2528groups, as well as commands to ease the creation of a few
2529special-purpose groups. All these commands insert the newly created
2530groups under point---@code{gnus-subscribe-newsgroup-method} is not
2531consulted.
2532
2533Changes from the group editing commands are stored in
2534@file{~/.newsrc.eld} (@code{gnus-startup-file}). An alternative is the
2535variable @code{gnus-parameters}, @xref{Group Parameters}.
2536
2537@table @kbd
2538
2539@item G m
2540@kindex G m (Group)
2541@findex gnus-group-make-group
2542@cindex making groups
2543Make a new group (@code{gnus-group-make-group}). Gnus will prompt you
2544for a name, a method and possibly an @dfn{address}. For an easier way
2545to subscribe to @acronym{NNTP} groups (@pxref{Browse Foreign Server}).
2546
2547@item G M
2548@kindex G M (Group)
2549@findex gnus-group-read-ephemeral-group
2550Make an ephemeral group (@code{gnus-group-read-ephemeral-group}). Gnus
2551will prompt you for a name, a method and an @dfn{address}.
2552
2553@item G r
2554@kindex G r (Group)
2555@findex gnus-group-rename-group
2556@cindex renaming groups
2557Rename the current group to something else
2558(@code{gnus-group-rename-group}). This is valid only on some
2559groups---mail groups mostly. This command might very well be quite slow
2560on some back ends.
2561
2562@item G c
2563@kindex G c (Group)
2564@cindex customizing
2565@findex gnus-group-customize
2566Customize the group parameters (@code{gnus-group-customize}).
2567
2568@item G e
2569@kindex G e (Group)
2570@findex gnus-group-edit-group-method
2571@cindex renaming groups
2572Enter a buffer where you can edit the select method of the current
2573group (@code{gnus-group-edit-group-method}).
2574
2575@item G p
2576@kindex G p (Group)
2577@findex gnus-group-edit-group-parameters
2578Enter a buffer where you can edit the group parameters
2579(@code{gnus-group-edit-group-parameters}).
2580
2581@item G E
2582@kindex G E (Group)
2583@findex gnus-group-edit-group
2584Enter a buffer where you can edit the group info
2585(@code{gnus-group-edit-group}).
2586
2587@item G d
2588@kindex G d (Group)
2589@findex gnus-group-make-directory-group
2590@cindex nndir
2591Make a directory group (@pxref{Directory Groups}). You will be prompted
2592for a directory name (@code{gnus-group-make-directory-group}).
2593
2594@item G h
2595@kindex G h (Group)
2596@cindex help group
2597@findex gnus-group-make-help-group
2598Make the Gnus help group (@code{gnus-group-make-help-group}).
2599
4009494e
GM
2600@item G D
2601@kindex G D (Group)
2602@findex gnus-group-enter-directory
2603@cindex nneething
2604Read an arbitrary directory as if it were a newsgroup with the
2605@code{nneething} back end (@code{gnus-group-enter-directory}).
2606@xref{Anything Groups}.
2607
2608@item G f
2609@kindex G f (Group)
2610@findex gnus-group-make-doc-group
2611@cindex ClariNet Briefs
2612@cindex nndoc
2613Make a group based on some file or other
2614(@code{gnus-group-make-doc-group}). If you give a prefix to this
2615command, you will be prompted for a file name and a file type.
2616Currently supported types are @code{mbox}, @code{babyl},
2617@code{digest}, @code{news}, @code{rnews}, @code{mmdf}, @code{forward},
2618@code{rfc934}, @code{rfc822-forward}, @code{mime-parts},
2619@code{standard-digest}, @code{slack-digest}, @code{clari-briefs},
2620@code{nsmail}, @code{outlook}, @code{oe-dbx}, and @code{mailman}. If
2621you run this command without a prefix, Gnus will guess at the file
2622type. @xref{Document Groups}.
2623
2624@item G u
2625@kindex G u (Group)
2626@vindex gnus-useful-groups
2627@findex gnus-group-make-useful-group
2628Create one of the groups mentioned in @code{gnus-useful-groups}
2629(@code{gnus-group-make-useful-group}).
2630
2631@item G w
2632@kindex G w (Group)
2633@findex gnus-group-make-web-group
2634@cindex Google
2635@cindex nnweb
2636@cindex gmane
2637Make an ephemeral group based on a web search
2638(@code{gnus-group-make-web-group}). If you give a prefix to this
2639command, make a solid group instead. You will be prompted for the
2640search engine type and the search string. Valid search engine types
2641include @code{google}, @code{dejanews}, and @code{gmane}.
2642@xref{Web Searches}.
2643
2644If you use the @code{google} search engine, you can limit the search
2645to a particular group by using a match string like
2646@samp{shaving group:alt.sysadmin.recovery}.
2647
2648@item G R
2649@kindex G R (Group)
2650@findex gnus-group-make-rss-group
2651Make a group based on an @acronym{RSS} feed
2652(@code{gnus-group-make-rss-group}). You will be prompted for an URL.
2653@xref{RSS}.
2654
2655@item G DEL
2656@kindex G DEL (Group)
2657@findex gnus-group-delete-group
2658This function will delete the current group
2659(@code{gnus-group-delete-group}). If given a prefix, this function will
2660actually delete all the articles in the group, and forcibly remove the
2661group itself from the face of the Earth. Use a prefix only if you are
2662absolutely sure of what you are doing. This command can't be used on
2663read-only groups (like @code{nntp} groups), though.
2664
2665@item G V
2666@kindex G V (Group)
2667@findex gnus-group-make-empty-virtual
2668Make a new, fresh, empty @code{nnvirtual} group
2669(@code{gnus-group-make-empty-virtual}). @xref{Virtual Groups}.
2670
2671@item G v
2672@kindex G v (Group)
2673@findex gnus-group-add-to-virtual
2674Add the current group to an @code{nnvirtual} group
2675(@code{gnus-group-add-to-virtual}). Uses the process/prefix convention.
2676@end table
2677
2678@xref{Select Methods}, for more information on the various select
2679methods.
2680
2681@vindex gnus-activate-foreign-newsgroups
2682If @code{gnus-activate-foreign-newsgroups} is a positive number,
2683Gnus will check all foreign groups with this level or lower at startup.
2684This might take quite a while, especially if you subscribe to lots of
2685groups from different @acronym{NNTP} servers. Also @pxref{Group Levels};
2686@code{gnus-activate-level} also affects activation of foreign
2687newsgroups.
2688
2689
9b3ebcb6
MB
2690The following commands create ephemeral groups. They can be called not
2691only from the Group buffer, but in any Gnus buffer.
2692
2693@table @code
2694@item gnus-read-ephemeral-gmane-group
2695@findex gnus-read-ephemeral-gmane-group
2696@vindex gnus-gmane-group-download-format
2697Read an ephemeral group on Gmane.org. The articles are downloaded via
2698HTTP using the URL specified by @code{gnus-gmane-group-download-format}.
2699Gnus will prompt you for a group name, the start article number and an
2700the article range.
2701
2702@item gnus-read-ephemeral-gmane-group-url
2703@findex gnus-read-ephemeral-gmane-group-url
2704This command is similar to @code{gnus-read-ephemeral-gmane-group}, but
2705the group name and the article number and range are constructed from a
2706given @acronym{URL}. Supported @acronym{URL} formats include e.g.
2707@url{http://thread.gmane.org/gmane.foo.bar/12300/focus=12399},
2708@url{http://thread.gmane.org/gmane.foo.bar/12345/},
2709@url{http://article.gmane.org/gmane.foo.bar/12345/},
2710@url{http://permalink.gmane.org/gmane.foo.bar/12345/}, and
2711@url{http://news.gmane.org/group/gmane.foo.bar/thread=12345}.
2712
2713@item gnus-read-ephemeral-emacs-bug-group
2714@findex gnus-read-ephemeral-emacs-bug-group
2715Read an Emacs bug report in an ephemeral group. Gnus will prompt for a
2716bug number. The default is the number at point. The @acronym{URL} is
2717specified in @code{gnus-bug-group-download-format-alist}.
2718
2719@item gnus-read-ephemeral-debian-bug-group
2720@findex gnus-read-ephemeral-debian-bug-group
2721Read a Debian bug report in an ephemeral group. Analog to
2722@code{gnus-read-ephemeral-emacs-bug-group}.
2723@end table
2724
2725Some of these command are also useful for article buttons, @xref{Article
2726Buttons}.
2727
2728Here is an example:
2729@lisp
2730(require 'gnus-art)
2731(add-to-list
2732 'gnus-button-alist
2733 '("#\\([0-9]+\\)\\>" 1
2734 (string-match "\\<emacs\\>" (or gnus-newsgroup-name ""))
2735 gnus-read-ephemeral-emacs-bug-group 1))
2736@end lisp
2737
2738
4009494e
GM
2739@node Group Parameters
2740@section Group Parameters
2741@cindex group parameters
2742
2743The group parameters store information local to a particular group.
87035689
MB
2744
2745Use the @kbd{G p} or the @kbd{G c} command to edit group parameters of a
2746group. (@kbd{G p} presents you with a Lisp-based interface, @kbd{G c}
2747presents you with a Customize-like interface. The latter helps avoid
2748silly Lisp errors.) You might also be interested in reading about topic
2749parameters (@pxref{Topic Parameters}).
2750Additionally, you can set group parameters via the
2751@code{gnus-parameters} variable, see below.
2752
4009494e
GM
2753Here's an example group parameter list:
2754
2755@example
2756((to-address . "ding@@gnus.org")
2757 (auto-expire . t))
2758@end example
2759
2760We see that each element consists of a ``dotted pair''---the thing before
2761the dot is the key, while the thing after the dot is the value. All the
2762parameters have this form @emph{except} local variable specs, which are
2763not dotted pairs, but proper lists.
2764
2765Some parameters have correspondent customizable variables, each of which
2766is an alist of regexps and values.
2767
2768The following group parameters can be used:
2769
2770@table @code
2771@item to-address
2772@cindex to-address
2773Address used by when doing followups and new posts.
2774
2775@example
2776(to-address . "some@@where.com")
2777@end example
2778
2779This is primarily useful in mail groups that represent closed mailing
2780lists---mailing lists where it's expected that everybody that writes to
2781the mailing list is subscribed to it. Since using this parameter
2782ensures that the mail only goes to the mailing list itself, it means
2783that members won't receive two copies of your followups.
2784
2785Using @code{to-address} will actually work whether the group is foreign
2786or not. Let's say there's a group on the server that is called
2787@samp{fa.4ad-l}. This is a real newsgroup, but the server has gotten
2788the articles from a mail-to-news gateway. Posting directly to this
2789group is therefore impossible---you have to send mail to the mailing
2790list address instead.
2791
2792See also @code{gnus-parameter-to-address-alist}.
2793
2794@item to-list
2795@cindex to-list
2796Address used when doing @kbd{a} in that group.
2797
2798@example
2799(to-list . "some@@where.com")
2800@end example
2801
2802It is totally ignored
2803when doing a followup---except that if it is present in a news group,
2804you'll get mail group semantics when doing @kbd{f}.
2805
2806If you do an @kbd{a} command in a mail group and you have neither a
2807@code{to-list} group parameter nor a @code{to-address} group parameter,
2808then a @code{to-list} group parameter will be added automatically upon
2809sending the message if @code{gnus-add-to-list} is set to @code{t}.
2810@vindex gnus-add-to-list
2811
2812@findex gnus-mailing-list-mode
2813@cindex mail list groups
2814If this variable is set, @code{gnus-mailing-list-mode} is turned on when
2815entering summary buffer.
2816
2817See also @code{gnus-parameter-to-list-alist}.
2818
2819@anchor{subscribed}
2820@item subscribed
2821@cindex subscribed
2822@cindex Mail-Followup-To
2823@findex gnus-find-subscribed-addresses
2824If this parameter is set to @code{t}, Gnus will consider the
2825to-address and to-list parameters for this group as addresses of
2826mailing lists you are subscribed to. Giving Gnus this information is
2827(only) a first step in getting it to generate correct Mail-Followup-To
2828headers for your posts to these lists. The second step is to put the
2829following in your @file{.gnus.el}
2830
2831@lisp
2832(setq message-subscribed-address-functions
2833 '(gnus-find-subscribed-addresses))
2834@end lisp
2835
2836@xref{Mailing Lists, ,Mailing Lists, message, The Message Manual}, for
2837a complete treatment of available MFT support.
2838
2839@item visible
2840@cindex visible
2841If the group parameter list has the element @code{(visible . t)},
2842that group will always be visible in the Group buffer, regardless
2843of whether it has any unread articles.
2844
2845This parameter cannot be set via @code{gnus-parameters}. See
2846@code{gnus-permanently-visible-groups} as an alternative.
2847
2848@item broken-reply-to
2849@cindex broken-reply-to
2850Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
2851headers in this group are to be ignored, and for the header to be hidden
2852if @code{reply-to} is part of @code{gnus-boring-article-headers}. This
2853can be useful if you're reading a mailing list group where the listserv
2854has inserted @code{Reply-To} headers that point back to the listserv
2855itself. That is broken behavior. So there!
2856
2857@item to-group
2858@cindex to-group
2859Elements like @code{(to-group . "some.group.name")} means that all
2860posts in that group will be sent to @code{some.group.name}.
2861
2862@item newsgroup
2863@cindex newsgroup
2864If you have @code{(newsgroup . t)} in the group parameter list, Gnus
2865will treat all responses as if they were responses to news articles.
2866This can be useful if you have a mail group that's really a mirror of a
2867news group.
2868
2869@item gcc-self
2870@cindex gcc-self
2871If @code{(gcc-self . t)} is present in the group parameter list, newly
2872composed messages will be @code{Gcc}'d to the current group. If
2873@code{(gcc-self . none)} is present, no @code{Gcc:} header will be
2874generated, if @code{(gcc-self . "string")} is present, this string will
2875be inserted literally as a @code{gcc} header. This parameter takes
2876precedence over any default @code{Gcc} rules as described later
2877(@pxref{Archived Messages}).
2878
2879@strong{Caveat}: Adding @code{(gcc-self . t)} to the parameter list of
2880@code{nntp} groups (or the like) isn't valid. An @code{nntp} server
2881doesn't accept articles.
2882
2883@item auto-expire
2884@cindex auto-expire
2885@cindex expiring mail
2886If the group parameter has an element that looks like @code{(auto-expire
2887. t)}, all articles read will be marked as expirable. For an
2888alternative approach, @pxref{Expiring Mail}.
2889
2890See also @code{gnus-auto-expirable-newsgroups}.
2891
2892@item total-expire
2893@cindex total-expire
2894@cindex expiring mail
2895If the group parameter has an element that looks like
2896@code{(total-expire . t)}, all read articles will be put through the
2897expiry process, even if they are not marked as expirable. Use with
2898caution. Unread, ticked and dormant articles are not eligible for
2899expiry.
2900
2901See also @code{gnus-total-expirable-newsgroups}.
2902
2903@item expiry-wait
2904@cindex expiry-wait
2905@vindex nnmail-expiry-wait-function
2906If the group parameter has an element that looks like
2907@code{(expiry-wait . 10)}, this value will override any
2908@code{nnmail-expiry-wait} and @code{nnmail-expiry-wait-function}
2909(@pxref{Expiring Mail}) when expiring expirable messages. The value
2910can either be a number of days (not necessarily an integer) or the
2911symbols @code{never} or @code{immediate}.
2912
2913@item expiry-target
2914@cindex expiry-target
2915Where expired messages end up. This parameter overrides
2916@code{nnmail-expiry-target}.
2917
2918@item score-file
2919@cindex score file group parameter
2920Elements that look like @code{(score-file . "file")} will make
2921@file{file} into the current score file for the group in question. All
2922interactive score entries will be put into this file.
2923
2924@item adapt-file
2925@cindex adapt file group parameter
2926Elements that look like @code{(adapt-file . "file")} will make
2927@file{file} into the current adaptive file for the group in question.
2928All adaptive score entries will be put into this file.
2929
2930@item admin-address
2931@cindex admin-address
2932When unsubscribing from a mailing list you should never send the
2933unsubscription notice to the mailing list itself. Instead, you'd send
2934messages to the administrative address. This parameter allows you to
2935put the admin address somewhere convenient.
2936
2937@item display
2938@cindex display
2939Elements that look like @code{(display . MODE)} say which articles to
2940display on entering the group. Valid values are:
2941
2942@table @code
2943@item all
2944Display all articles, both read and unread.
2945
2946@item an integer
2947Display the last @var{integer} articles in the group. This is the same as
2948entering the group with @kbd{C-u @var{integer}}.
2949
2950@item default
2951Display the default visible articles, which normally includes unread and
2952ticked articles.
2953
2954@item an array
2955Display articles that satisfy a predicate.
2956
2957Here are some examples:
2958
2959@table @code
2960@item [unread]
2961Display only unread articles.
2962
2963@item [not expire]
2964Display everything except expirable articles.
2965
2966@item [and (not reply) (not expire)]
2967Display everything except expirable and articles you've already
2968responded to.
2969@end table
2970
2971The available operators are @code{not}, @code{and} and @code{or}.
2972Predicates include @code{tick}, @code{unsend}, @code{undownload},
2973@code{unread}, @code{dormant}, @code{expire}, @code{reply},
2974@code{killed}, @code{bookmark}, @code{score}, @code{save},
2975@code{cache}, @code{forward}, @code{unseen} and @code{recent}.
2976
2977@end table
2978
2979The @code{display} parameter works by limiting the summary buffer to
2980the subset specified. You can pop the limit by using the @kbd{/ w}
2981command (@pxref{Limiting}).
2982
2983@item comment
2984@cindex comment
2985Elements that look like @code{(comment . "This is a comment")} are
2986arbitrary comments on the group. You can display comments in the
2987group line (@pxref{Group Line Specification}).
2988
2989@item charset
2990@cindex charset
2991Elements that look like @code{(charset . iso-8859-1)} will make
2992@code{iso-8859-1} the default charset; that is, the charset that will be
2993used for all articles that do not specify a charset.
2994
2995See also @code{gnus-group-charset-alist}.
2996
2997@item ignored-charsets
2998@cindex ignored-charset
2999Elements that look like @code{(ignored-charsets x-unknown iso-8859-1)}
3000will make @code{iso-8859-1} and @code{x-unknown} ignored; that is, the
3001default charset will be used for decoding articles.
3002
3003See also @code{gnus-group-ignored-charsets-alist}.
3004
3005@item posting-style
3006@cindex posting-style
3007You can store additional posting style information for this group
3008here (@pxref{Posting Styles}). The format is that of an entry in the
3009@code{gnus-posting-styles} alist, except that there's no regexp matching
3010the group name (of course). Style elements in this group parameter will
3011take precedence over the ones found in @code{gnus-posting-styles}.
3012
3013For instance, if you want a funky name and signature in this group only,
3014instead of hacking @code{gnus-posting-styles}, you could put something
3015like this in the group parameters:
3016
3017@example
3018(posting-style
3019 (name "Funky Name")
3020 ("X-My-Header" "Funky Value")
3021 (signature "Funky Signature"))
3022@end example
3023
01c52d31
MB
3024If you're using topics to organize your group buffer
3025(@pxref{Group Topics}), note that posting styles can also be set in
3026the topics parameters. Posting styles in topic parameters apply to all
3027groups in this topic. More precisely, the posting-style settings for a
3028group result from the hierarchical merging of all posting-style
3029entries in the parameters of this group and all the topics it belongs
3030to.
3031
3032
4009494e
GM
3033@item post-method
3034@cindex post-method
3035If it is set, the value is used as the method for posting message
3036instead of @code{gnus-post-method}.
3037
a1da1e37
MB
3038@item mail-source
3039@cindex mail-source
3040If it is set, and the setting of @code{mail-sources} includes a
3041@code{group} mail source (@pxref{Mail Sources}), the value is a
3042mail source for this group.
3043
4009494e
GM
3044@item banner
3045@cindex banner
3046An item like @code{(banner . @var{regexp})} causes any part of an article
3047that matches the regular expression @var{regexp} to be stripped. Instead of
3048@var{regexp}, you can also use the symbol @code{signature} which strips the
3049last signature or any of the elements of the alist
3050@code{gnus-article-banner-alist}.
3051
3052@item sieve
3053@cindex sieve
3054This parameter contains a Sieve test that should match incoming mail
3055that should be placed in this group. From this group parameter, a
3056Sieve @samp{IF} control structure is generated, having the test as the
3057condition and @samp{fileinto "group.name";} as the body.
3058
3059For example, if the @samp{INBOX.list.sieve} group has the @code{(sieve
3060address "sender" "sieve-admin@@extundo.com")} group parameter, when
3061translating the group parameter into a Sieve script (@pxref{Sieve
3062Commands}) the following Sieve code is generated:
3063
3064@example
01c52d31
MB
3065if address "sender" "sieve-admin@@extundo.com" @{
3066 fileinto "INBOX.list.sieve";
3067@}
3068@end example
3069
3070To generate tests for multiple email-addresses use a group parameter
3071like @code{(sieve address "sender" ("name@@one.org" else@@two.org"))}.
3072When generating a sieve script (@pxref{Sieve Commands}) Sieve code
3073like the following is generated:
3074
3075@example
3076if address "sender" ["name@@one.org", "else@@two.org"] @{
3077 fileinto "INBOX.list.sieve";
4009494e
GM
3078@}
3079@end example
3080
01c52d31
MB
3081See @pxref{Sieve Commands} for commands and variables that might be of
3082interest in relation to the sieve parameter.
3083
4009494e
GM
3084The Sieve language is described in RFC 3028. @xref{Top, Emacs Sieve,
3085Top, sieve, Emacs Sieve}.
3086
3087@item (agent parameters)
3088If the agent has been enabled, you can set any of the its parameters
3089to control the behavior of the agent in individual groups. See Agent
3090Parameters in @ref{Category Syntax}. Most users will choose to set
3091agent parameters in either an agent category or group topic to
3092minimize the configuration effort.
3093
3094@item (@var{variable} @var{form})
3095You can use the group parameters to set variables local to the group you
3096are entering. If you want to turn threading off in @samp{news.answers},
3097you could put @code{(gnus-show-threads nil)} in the group parameters of
3098that group. @code{gnus-show-threads} will be made into a local variable
3099in the summary buffer you enter, and the form @code{nil} will be
3100@code{eval}ed there.
3101
e3e955fe
MB
3102Note that this feature sets the variable locally to the summary buffer
3103if and only if @var{variable} has been bound as a variable. Otherwise,
3104only evaluating the form will take place. So, you may want to bind the
3105variable in advance using @code{defvar} or other if the result of the
3106form needs to be set to it.
3107
4009494e
GM
3108But some variables are evaluated in the article buffer, or in the
3109message buffer (of a reply or followup or otherwise newly created
3110message). As a workaround, it might help to add the variable in
3111question to @code{gnus-newsgroup-variables}. @xref{Various Summary
3112Stuff}. So if you want to set @code{message-from-style} via the group
3113parameters, then you may need the following statement elsewhere in your
e6d2d263 3114@file{~/.gnus.el} file:
4009494e
GM
3115
3116@lisp
3117(add-to-list 'gnus-newsgroup-variables 'message-from-style)
3118@end lisp
3119
3120@vindex gnus-list-identifiers
3121A use for this feature is to remove a mailing list identifier tag in
3122the subject fields of articles. E.g. if the news group
3123
3124@example
3125nntp+news.gnus.org:gmane.text.docbook.apps
3126@end example
3127
3128has the tag @samp{DOC-BOOK-APPS:} in the subject of all articles, this
3129tag can be removed from the article subjects in the summary buffer for
3130the group by putting @code{(gnus-list-identifiers "DOCBOOK-APPS:")}
3131into the group parameters for the group.
3132
3133This can also be used as a group-specific hook function. If you want to
3134hear a beep when you enter a group, you could put something like
e3e955fe
MB
3135@code{(dummy-variable (ding))} in the parameters of that group. If
3136@code{dummy-variable} has been bound (see above), it will be set to the
3137(meaningless) result of the @code{(ding)} form.
4009494e
GM
3138
3139Alternatively, since the VARIABLE becomes local to the group, this
3140pattern can be used to temporarily change a hook. For example, if the
3141following is added to a group parameter
3142
3143@lisp
3144(gnus-summary-prepared-hook
3145 '(lambda nil (local-set-key "d" (local-key-binding "n"))))
3146@end lisp
3147
3148when the group is entered, the 'd' key will not mark the article as
3149expired.
3150
3151@end table
3152
4009494e
GM
3153@vindex gnus-parameters
3154Group parameters can be set via the @code{gnus-parameters} variable too.
3155But some variables, such as @code{visible}, have no effect (For this
3156case see @code{gnus-permanently-visible-groups} as an alternative.).
3157For example:
3158
3159@lisp
3160(setq gnus-parameters
3161 '(("mail\\..*"
3162 (gnus-show-threads nil)
3163 (gnus-use-scoring nil)
3164 (gnus-summary-line-format
3165 "%U%R%z%I%(%[%d:%ub%-23,23f%]%) %s\n")
3166 (gcc-self . t)
3167 (display . all))
3168
3169 ("^nnimap:\\(foo.bar\\)$"
3170 (to-group . "\\1"))
3171
3172 ("mail\\.me"
3173 (gnus-use-scoring t))
3174
3175 ("list\\..*"
3176 (total-expire . t)
3177 (broken-reply-to . t))))
3178@end lisp
3179
3180String value of parameters will be subjected to regexp substitution, as
3181the @code{to-group} example shows.
3182
3183@vindex gnus-parameters-case-fold-search
3184By default, whether comparing the group name and one of those regexps
3185specified in @code{gnus-parameters} is done in a case-sensitive manner
3186or a case-insensitive manner depends on the value of
3187@code{case-fold-search} at the time when the comparison is done. The
3188value of @code{case-fold-search} is typically @code{t}; it means, for
3189example, the element @code{("INBOX\\.FOO" (total-expire . t))} might be
3190applied to both the @samp{INBOX.FOO} group and the @samp{INBOX.foo}
3191group. If you want to make those regexps always case-sensitive, set the
3192value of the @code{gnus-parameters-case-fold-search} variable to
3193@code{nil}. Otherwise, set it to @code{t} if you want to compare them
3194always in a case-insensitive manner.
3195
01c52d31
MB
3196You can define different sorting to different groups via
3197@code{gnus-parameters}. Here is an example to sort an @acronym{NNTP}
3198group by reverse date to see the latest news at the top and an
3199@acronym{RSS} group by subject. In this example, the first group is the
3200Debian daily news group @code{gmane.linux.debian.user.news} from
3201news.gmane.org. The @acronym{RSS} group corresponds to the Debian
3202weekly news RSS feed
3203@url{http://packages.debian.org/unstable/newpkg_main.en.rdf},
3204@xref{RSS}.
3205
3206@lisp
3207(setq
3208 gnus-parameters
3209 '(("nntp.*gmane\\.debian\\.user\\.news"
3210 (gnus-show-threads nil)
3211 (gnus-article-sort-functions '((not gnus-article-sort-by-date)))
3212 (gnus-use-adaptive-scoring nil)
3213 (gnus-use-scoring nil))
3214 ("nnrss.*debian"
3215 (gnus-show-threads nil)
3216 (gnus-article-sort-functions 'gnus-article-sort-by-subject)
3217 (gnus-use-adaptive-scoring nil)
3218 (gnus-use-scoring t)
3219 (gnus-score-find-score-files-function 'gnus-score-find-single)
3220 (gnus-summary-line-format "%U%R%z%d %I%(%[ %s %]%)\n"))))
3221@end lisp
3222
4009494e
GM
3223
3224@node Listing Groups
3225@section Listing Groups
3226@cindex group listing
3227
3228These commands all list various slices of the groups available.
3229
3230@table @kbd
3231
3232@item l
3233@itemx A s
3234@kindex A s (Group)
3235@kindex l (Group)
3236@findex gnus-group-list-groups
3237List all groups that have unread articles
3238(@code{gnus-group-list-groups}). If the numeric prefix is used, this
3239command will list only groups of level ARG and lower. By default, it
3240only lists groups of level five (i.e.,
3241@code{gnus-group-default-list-level}) or lower (i.e., just subscribed
3242groups).
3243
3244@item L
3245@itemx A u
3246@kindex A u (Group)
3247@kindex L (Group)
3248@findex gnus-group-list-all-groups
3249List all groups, whether they have unread articles or not
3250(@code{gnus-group-list-all-groups}). If the numeric prefix is used,
3251this command will list only groups of level ARG and lower. By default,
3252it lists groups of level seven or lower (i.e., just subscribed and
3253unsubscribed groups).
3254
3255@item A l
3256@kindex A l (Group)
3257@findex gnus-group-list-level
3258List all unread groups on a specific level
3259(@code{gnus-group-list-level}). If given a prefix, also list the groups
3260with no unread articles.
3261
3262@item A k
3263@kindex A k (Group)
3264@findex gnus-group-list-killed
3265List all killed groups (@code{gnus-group-list-killed}). If given a
3266prefix argument, really list all groups that are available, but aren't
3267currently (un)subscribed. This could entail reading the active file
3268from the server.
3269
3270@item A z
3271@kindex A z (Group)
3272@findex gnus-group-list-zombies
3273List all zombie groups (@code{gnus-group-list-zombies}).
3274
3275@item A m
3276@kindex A m (Group)
3277@findex gnus-group-list-matching
3278List all unread, subscribed groups with names that match a regexp
3279(@code{gnus-group-list-matching}).
3280
3281@item A M
3282@kindex A M (Group)
3283@findex gnus-group-list-all-matching
3284List groups that match a regexp (@code{gnus-group-list-all-matching}).
3285
3286@item A A
3287@kindex A A (Group)
3288@findex gnus-group-list-active
3289List absolutely all groups in the active file(s) of the
3290server(s) you are connected to (@code{gnus-group-list-active}). This
3291might very well take quite a while. It might actually be a better idea
3292to do a @kbd{A M} to list all matching, and just give @samp{.} as the
3293thing to match on. Also note that this command may list groups that
3294don't exist (yet)---these will be listed as if they were killed groups.
3295Take the output with some grains of salt.
3296
3297@item A a
3298@kindex A a (Group)
3299@findex gnus-group-apropos
3300List all groups that have names that match a regexp
3301(@code{gnus-group-apropos}).
3302
3303@item A d
3304@kindex A d (Group)
3305@findex gnus-group-description-apropos
3306List all groups that have names or descriptions that match a regexp
3307(@code{gnus-group-description-apropos}).
3308
3309@item A c
3310@kindex A c (Group)
3311@findex gnus-group-list-cached
3312List all groups with cached articles (@code{gnus-group-list-cached}).
3313
3314@item A ?
3315@kindex A ? (Group)
3316@findex gnus-group-list-dormant
3317List all groups with dormant articles (@code{gnus-group-list-dormant}).
3318
3319@item A /
3320@kindex A / (Group)
3321@findex gnus-group-list-limit
3322List groups limited within the current selection
3323(@code{gnus-group-list-limit}).
3324
3325@item A f
3326@kindex A f (Group)
3327@findex gnus-group-list-flush
3328Flush groups from the current selection (@code{gnus-group-list-flush}).
3329
3330@item A p
3331@kindex A p (Group)
3332@findex gnus-group-list-plus
3333List groups plus the current selection (@code{gnus-group-list-plus}).
3334
3335@end table
3336
3337@vindex gnus-permanently-visible-groups
3338@cindex visible group parameter
3339Groups that match the @code{gnus-permanently-visible-groups} regexp will
3340always be shown, whether they have unread articles or not. You can also
3341add the @code{visible} element to the group parameters in question to
3342get the same effect.
3343
3344@vindex gnus-list-groups-with-ticked-articles
3345Groups that have just ticked articles in it are normally listed in the
3346group buffer. If @code{gnus-list-groups-with-ticked-articles} is
3347@code{nil}, these groups will be treated just like totally empty
3348groups. It is @code{t} by default.
3349
3350
3351@node Sorting Groups
3352@section Sorting Groups
3353@cindex sorting groups
3354
3355@kindex C-c C-s (Group)
3356@findex gnus-group-sort-groups
3357@vindex gnus-group-sort-function
3358The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the
3359group buffer according to the function(s) given by the
3360@code{gnus-group-sort-function} variable. Available sorting functions
3361include:
3362
3363@table @code
3364
3365@item gnus-group-sort-by-alphabet
3366@findex gnus-group-sort-by-alphabet
3367Sort the group names alphabetically. This is the default.
3368
3369@item gnus-group-sort-by-real-name
3370@findex gnus-group-sort-by-real-name
3371Sort the group alphabetically on the real (unprefixed) group names.
3372
3373@item gnus-group-sort-by-level
3374@findex gnus-group-sort-by-level
3375Sort by group level.
3376
3377@item gnus-group-sort-by-score
3378@findex gnus-group-sort-by-score
3379Sort by group score. @xref{Group Score}.
3380
3381@item gnus-group-sort-by-rank
3382@findex gnus-group-sort-by-rank
3383Sort by group score and then the group level. The level and the score
3384are, when taken together, the group's @dfn{rank}. @xref{Group Score}.
3385
3386@item gnus-group-sort-by-unread
3387@findex gnus-group-sort-by-unread
3388Sort by number of unread articles.
3389
3390@item gnus-group-sort-by-method
3391@findex gnus-group-sort-by-method
3392Sort alphabetically on the select method.
3393
3394@item gnus-group-sort-by-server
3395@findex gnus-group-sort-by-server
3396Sort alphabetically on the Gnus server name.
3397
3398
3399@end table
3400
3401@code{gnus-group-sort-function} can also be a list of sorting
3402functions. In that case, the most significant sort key function must be
3403the last one.
3404
3405
3406There are also a number of commands for sorting directly according to
3407some sorting criteria:
3408
3409@table @kbd
3410@item G S a
3411@kindex G S a (Group)
3412@findex gnus-group-sort-groups-by-alphabet
3413Sort the group buffer alphabetically by group name
3414(@code{gnus-group-sort-groups-by-alphabet}).
3415
3416@item G S u
3417@kindex G S u (Group)
3418@findex gnus-group-sort-groups-by-unread
3419Sort the group buffer by the number of unread articles
3420(@code{gnus-group-sort-groups-by-unread}).
3421
3422@item G S l
3423@kindex G S l (Group)
3424@findex gnus-group-sort-groups-by-level
3425Sort the group buffer by group level
3426(@code{gnus-group-sort-groups-by-level}).
3427
3428@item G S v
3429@kindex G S v (Group)
3430@findex gnus-group-sort-groups-by-score
3431Sort the group buffer by group score
3432(@code{gnus-group-sort-groups-by-score}). @xref{Group Score}.
3433
3434@item G S r
3435@kindex G S r (Group)
3436@findex gnus-group-sort-groups-by-rank
3437Sort the group buffer by group rank
3438(@code{gnus-group-sort-groups-by-rank}). @xref{Group Score}.
3439
3440@item G S m
3441@kindex G S m (Group)
3442@findex gnus-group-sort-groups-by-method
3443Sort the group buffer alphabetically by back end name@*
3444(@code{gnus-group-sort-groups-by-method}).
3445
3446@item G S n
3447@kindex G S n (Group)
3448@findex gnus-group-sort-groups-by-real-name
3449Sort the group buffer alphabetically by real (unprefixed) group name
3450(@code{gnus-group-sort-groups-by-real-name}).
3451
3452@end table
3453
3454All the commands below obey the process/prefix convention
3455(@pxref{Process/Prefix}).
3456
3457When given a symbolic prefix (@pxref{Symbolic Prefixes}), all these
3458commands will sort in reverse order.
3459
3460You can also sort a subset of the groups:
3461
3462@table @kbd
3463@item G P a
3464@kindex G P a (Group)
3465@findex gnus-group-sort-selected-groups-by-alphabet
3466Sort the groups alphabetically by group name
3467(@code{gnus-group-sort-selected-groups-by-alphabet}).
3468
3469@item G P u
3470@kindex G P u (Group)
3471@findex gnus-group-sort-selected-groups-by-unread
3472Sort the groups by the number of unread articles
3473(@code{gnus-group-sort-selected-groups-by-unread}).
3474
3475@item G P l
3476@kindex G P l (Group)
3477@findex gnus-group-sort-selected-groups-by-level
3478Sort the groups by group level
3479(@code{gnus-group-sort-selected-groups-by-level}).
3480
3481@item G P v
3482@kindex G P v (Group)
3483@findex gnus-group-sort-selected-groups-by-score
3484Sort the groups by group score
3485(@code{gnus-group-sort-selected-groups-by-score}). @xref{Group Score}.
3486
3487@item G P r
3488@kindex G P r (Group)
3489@findex gnus-group-sort-selected-groups-by-rank
3490Sort the groups by group rank
3491(@code{gnus-group-sort-selected-groups-by-rank}). @xref{Group Score}.
3492
3493@item G P m
3494@kindex G P m (Group)
3495@findex gnus-group-sort-selected-groups-by-method
3496Sort the groups alphabetically by back end name@*
3497(@code{gnus-group-sort-selected-groups-by-method}).
3498
3499@item G P n
3500@kindex G P n (Group)
3501@findex gnus-group-sort-selected-groups-by-real-name
3502Sort the groups alphabetically by real (unprefixed) group name
3503(@code{gnus-group-sort-selected-groups-by-real-name}).
3504
3505@item G P s
3506@kindex G P s (Group)
3507@findex gnus-group-sort-selected-groups
3508Sort the groups according to @code{gnus-group-sort-function}.
3509
3510@end table
3511
3512And finally, note that you can use @kbd{C-k} and @kbd{C-y} to manually
3513move groups around.
3514
3515
3516@node Group Maintenance
3517@section Group Maintenance
3518@cindex bogus groups
3519
3520@table @kbd
3521@item b
3522@kindex b (Group)
3523@findex gnus-group-check-bogus-groups
3524Find bogus groups and delete them
3525(@code{gnus-group-check-bogus-groups}).
3526
3527@item F
3528@kindex F (Group)
3529@findex gnus-group-find-new-groups
3530Find new groups and process them (@code{gnus-group-find-new-groups}).
3531With 1 @kbd{C-u}, use the @code{ask-server} method to query the server
3532for new groups. With 2 @kbd{C-u}'s, use most complete method possible
3533to query the server for new groups, and subscribe the new groups as
3534zombies.
3535
3536@item C-c C-x
3537@kindex C-c C-x (Group)
3538@findex gnus-group-expire-articles
3539@cindex expiring mail
3540Run all expirable articles in the current group through the expiry
3541process (if any) (@code{gnus-group-expire-articles}). That is, delete
3542all expirable articles in the group that have been around for a while.
3543(@pxref{Expiring Mail}).
3544
3545@item C-c C-M-x
3546@kindex C-c C-M-x (Group)
3547@findex gnus-group-expire-all-groups
3548@cindex expiring mail
3549Run all expirable articles in all groups through the expiry process
3550(@code{gnus-group-expire-all-groups}).
3551
3552@end table
3553
3554
3555@node Browse Foreign Server
3556@section Browse Foreign Server
3557@cindex foreign servers
3558@cindex browsing servers
3559
3560@table @kbd
3561@item B
3562@kindex B (Group)
3563@findex gnus-group-browse-foreign-server
3564You will be queried for a select method and a server name. Gnus will
3565then attempt to contact this server and let you browse the groups there
3566(@code{gnus-group-browse-foreign-server}).
3567@end table
3568
3569@findex gnus-browse-mode
3570A new buffer with a list of available groups will appear. This buffer
3571will use the @code{gnus-browse-mode}. This buffer looks a bit (well,
3572a lot) like a normal group buffer.
3573
3574Here's a list of keystrokes available in the browse mode:
3575
3576@table @kbd
3577@item n
3578@kindex n (Browse)
3579@findex gnus-group-next-group
3580Go to the next group (@code{gnus-group-next-group}).
3581
3582@item p
3583@kindex p (Browse)
3584@findex gnus-group-prev-group
3585Go to the previous group (@code{gnus-group-prev-group}).
3586
3587@item SPACE
3588@kindex SPACE (Browse)
3589@findex gnus-browse-read-group
3590Enter the current group and display the first article
3591(@code{gnus-browse-read-group}).
3592
3593@item RET
3594@kindex RET (Browse)
3595@findex gnus-browse-select-group
3596Enter the current group (@code{gnus-browse-select-group}).
3597
3598@item u
3599@kindex u (Browse)
3600@findex gnus-browse-unsubscribe-current-group
8ccbef23 3601@vindex gnus-browse-subscribe-newsgroup-method
4009494e 3602Unsubscribe to the current group, or, as will be the case here,
8ccbef23
G
3603subscribe to it (@code{gnus-browse-unsubscribe-current-group}). You
3604can affect the way the new group is entered into the Group buffer
3605using the variable @code{gnus-browse-subscribe-newsgroup-method}. See
3606@pxref{Subscription Methods} for available options.
4009494e
GM
3607
3608@item l
3609@itemx q
3610@kindex q (Browse)
3611@kindex l (Browse)
3612@findex gnus-browse-exit
3613Exit browse mode (@code{gnus-browse-exit}).
3614
3615@item d
3616@kindex d (Browse)
3617@findex gnus-browse-describe-group
3618Describe the current group (@code{gnus-browse-describe-group}).
3619
3620@item ?
3621@kindex ? (Browse)
3622@findex gnus-browse-describe-briefly
3623Describe browse mode briefly (well, there's not much to describe, is
3624there) (@code{gnus-browse-describe-briefly}).
3625@end table
3626
3627
3628@node Exiting Gnus
3629@section Exiting Gnus
3630@cindex exiting Gnus
3631
3632Yes, Gnus is ex(c)iting.
3633
3634@table @kbd
3635@item z
3636@kindex z (Group)
3637@findex gnus-group-suspend
3638Suspend Gnus (@code{gnus-group-suspend}). This doesn't really exit Gnus,
3639but it kills all buffers except the Group buffer. I'm not sure why this
3640is a gain, but then who am I to judge?
3641
3642@item q
3643@kindex q (Group)
3644@findex gnus-group-exit
3645@c @icon{gnus-group-exit}
3646Quit Gnus (@code{gnus-group-exit}).
3647
3648@item Q
3649@kindex Q (Group)
3650@findex gnus-group-quit
3651Quit Gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}).
3652The dribble file will be saved, though (@pxref{Auto Save}).
3653@end table
3654
3655@vindex gnus-exit-gnus-hook
3656@vindex gnus-suspend-gnus-hook
3657@vindex gnus-after-exiting-gnus-hook
3658@code{gnus-suspend-gnus-hook} is called when you suspend Gnus and
3659@code{gnus-exit-gnus-hook} is called when you quit Gnus, while
3660@code{gnus-after-exiting-gnus-hook} is called as the final item when
3661exiting Gnus.
3662
3663Note:
3664
3665@quotation
3666Miss Lisa Cannifax, while sitting in English class, felt her feet go
3667numbly heavy and herself fall into a hazy trance as the boy sitting
3668behind her drew repeated lines with his pencil across the back of her
3669plastic chair.
3670@end quotation
3671
3672
3673@node Group Topics
3674@section Group Topics
3675@cindex topics
3676
3677If you read lots and lots of groups, it might be convenient to group
3678them hierarchically according to topics. You put your Emacs groups over
3679here, your sex groups over there, and the rest (what, two groups or so?)
3680you put in some misc section that you never bother with anyway. You can
3681even group the Emacs sex groups as a sub-topic to either the Emacs
3682groups or the sex groups---or both! Go wild!
3683
3684@iftex
3685@iflatex
3686\gnusfigure{Group Topics}{400}{
3687\put(75,50){\epsfig{figure=ps/group-topic,height=9cm}}
3688}
3689@end iflatex
3690@end iftex
3691
3692Here's an example:
3693
3694@example
3695Gnus
3696 Emacs -- I wuw it!
3697 3: comp.emacs
3698 2: alt.religion.emacs
3699 Naughty Emacs
3700 452: alt.sex.emacs
3701 0: comp.talk.emacs.recovery
3702 Misc
3703 8: comp.binaries.fractals
3704 13: comp.sources.unix
3705@end example
3706
3707@findex gnus-topic-mode
3708@kindex t (Group)
3709To get this @emph{fab} functionality you simply turn on (ooh!) the
3710@code{gnus-topic} minor mode---type @kbd{t} in the group buffer. (This
3711is a toggling command.)
3712
3713Go ahead, just try it. I'll still be here when you get back. La de
3714dum@dots{} Nice tune, that@dots{} la la la@dots{} What, you're back?
3715Yes, and now press @kbd{l}. There. All your groups are now listed
3716under @samp{misc}. Doesn't that make you feel all warm and fuzzy?
3717Hot and bothered?
3718
3719If you want this permanently enabled, you should add that minor mode to
3720the hook for the group mode. Put the following line in your
3721@file{~/.gnus.el} file:
3722
3723@lisp
3724(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
3725@end lisp
3726
3727@menu
3728* Topic Commands:: Interactive E-Z commands.
3729* Topic Variables:: How to customize the topics the Lisp Way.
3730* Topic Sorting:: Sorting each topic individually.
3731* Topic Topology:: A map of the world.
3732* Topic Parameters:: Parameters that apply to all groups in a topic.
3733@end menu
3734
3735
3736@node Topic Commands
3737@subsection Topic Commands
3738@cindex topic commands
3739
3740When the topic minor mode is turned on, a new @kbd{T} submap will be
3741available. In addition, a few of the standard keys change their
3742definitions slightly.
3743
3744In general, the following kinds of operations are possible on topics.
3745First of all, you want to create topics. Secondly, you want to put
3746groups in topics and to move them around until you have an order you
3747like. The third kind of operation is to show/hide parts of the whole
3748shebang. You might want to hide a topic including its subtopics and
3749groups, to get a better overview of the other groups.
3750
3751Here is a list of the basic keys that you might need to set up topics
3752the way you like.
3753
3754@table @kbd
3755
3756@item T n
3757@kindex T n (Topic)
3758@findex gnus-topic-create-topic
3759Prompt for a new topic name and create it
3760(@code{gnus-topic-create-topic}).
3761
3762@item T TAB
3763@itemx TAB
3764@kindex T TAB (Topic)
3765@kindex TAB (Topic)
3766@findex gnus-topic-indent
3767``Indent'' the current topic so that it becomes a sub-topic of the
3768previous topic (@code{gnus-topic-indent}). If given a prefix,
3769``un-indent'' the topic instead.
3770
3771@item M-TAB
3772@kindex M-TAB (Topic)
3773@findex gnus-topic-unindent
3774``Un-indent'' the current topic so that it becomes a sub-topic of the
3775parent of its current parent (@code{gnus-topic-unindent}).
3776
3777@end table
3778
3779The following two keys can be used to move groups and topics around.
3780They work like the well-known cut and paste. @kbd{C-k} is like cut and
3781@kbd{C-y} is like paste. Of course, this being Emacs, we use the terms
3782kill and yank rather than cut and paste.
3783
3784@table @kbd
3785
3786@item C-k
3787@kindex C-k (Topic)
3788@findex gnus-topic-kill-group
3789Kill a group or topic (@code{gnus-topic-kill-group}). All groups in the
3790topic will be removed along with the topic.
3791
3792@item C-y
3793@kindex C-y (Topic)
3794@findex gnus-topic-yank-group
3795Yank the previously killed group or topic
3796(@code{gnus-topic-yank-group}). Note that all topics will be yanked
3797before all groups.
3798
3799So, to move a topic to the beginning of the list of topics, just hit
3800@kbd{C-k} on it. This is like the ``cut'' part of cut and paste. Then,
3801move the cursor to the beginning of the buffer (just below the ``Gnus''
3802topic) and hit @kbd{C-y}. This is like the ``paste'' part of cut and
3803paste. Like I said -- E-Z.
3804
3805You can use @kbd{C-k} and @kbd{C-y} on groups as well as on topics. So
3806you can move topics around as well as groups.
3807
3808@end table
3809
3810After setting up the topics the way you like them, you might wish to
3811hide a topic, or to show it again. That's why we have the following
3812key.
3813
3814@table @kbd
3815
3816@item RET
3817@kindex RET (Topic)
3818@findex gnus-topic-select-group
3819@itemx SPACE
3820Either select a group or fold a topic (@code{gnus-topic-select-group}).
3821When you perform this command on a group, you'll enter the group, as
3822usual. When done on a topic line, the topic will be folded (if it was
3823visible) or unfolded (if it was folded already). So it's basically a
3824toggling command on topics. In addition, if you give a numerical
3825prefix, group on that level (and lower) will be displayed.
3826
3827@end table
3828
3829Now for a list of other commands, in no particular order.
3830
3831@table @kbd
3832
3833@item T m
3834@kindex T m (Topic)
3835@findex gnus-topic-move-group
3836Move the current group to some other topic
3837(@code{gnus-topic-move-group}). This command uses the process/prefix
3838convention (@pxref{Process/Prefix}).
3839
3840@item T j
3841@kindex T j (Topic)
3842@findex gnus-topic-jump-to-topic
3843Go to a topic (@code{gnus-topic-jump-to-topic}).
3844
3845@item T c
3846@kindex T c (Topic)
3847@findex gnus-topic-copy-group
3848Copy the current group to some other topic
3849(@code{gnus-topic-copy-group}). This command uses the process/prefix
3850convention (@pxref{Process/Prefix}).
3851
3852@item T h
3853@kindex T h (Topic)
3854@findex gnus-topic-hide-topic
3855Hide the current topic (@code{gnus-topic-hide-topic}). If given
3856a prefix, hide the topic permanently.
3857
3858@item T s
3859@kindex T s (Topic)
3860@findex gnus-topic-show-topic
3861Show the current topic (@code{gnus-topic-show-topic}). If given
3862a prefix, show the topic permanently.
3863
3864@item T D
3865@kindex T D (Topic)
3866@findex gnus-topic-remove-group
3867Remove a group from the current topic (@code{gnus-topic-remove-group}).
3868This command is mainly useful if you have the same group in several
3869topics and wish to remove it from one of the topics. You may also
3870remove a group from all topics, but in that case, Gnus will add it to
3871the root topic the next time you start Gnus. In fact, all new groups
3872(which, naturally, don't belong to any topic) will show up in the root
3873topic.
3874
3875This command uses the process/prefix convention
3876(@pxref{Process/Prefix}).
3877
3878@item T M
3879@kindex T M (Topic)
3880@findex gnus-topic-move-matching
3881Move all groups that match some regular expression to a topic
3882(@code{gnus-topic-move-matching}).
3883
3884@item T C
3885@kindex T C (Topic)
3886@findex gnus-topic-copy-matching
3887Copy all groups that match some regular expression to a topic
3888(@code{gnus-topic-copy-matching}).
3889
3890@item T H
3891@kindex T H (Topic)
3892@findex gnus-topic-toggle-display-empty-topics
3893Toggle hiding empty topics
3894(@code{gnus-topic-toggle-display-empty-topics}).
3895
3896@item T #
3897@kindex T # (Topic)
3898@findex gnus-topic-mark-topic
3899Mark all groups in the current topic with the process mark
3900(@code{gnus-topic-mark-topic}). This command works recursively on
3901sub-topics unless given a prefix.
3902
3903@item T M-#
3904@kindex T M-# (Topic)
3905@findex gnus-topic-unmark-topic
3906Remove the process mark from all groups in the current topic
3907(@code{gnus-topic-unmark-topic}). This command works recursively on
3908sub-topics unless given a prefix.
3909
3910@item C-c C-x
3911@kindex C-c C-x (Topic)
3912@findex gnus-topic-expire-articles
3913@cindex expiring mail
3914Run all expirable articles in the current group or topic through the
3915expiry process (if any)
3916(@code{gnus-topic-expire-articles}). (@pxref{Expiring Mail}).
3917
3918@item T r
3919@kindex T r (Topic)
3920@findex gnus-topic-rename
3921Rename a topic (@code{gnus-topic-rename}).
3922
3923@item T DEL
3924@kindex T DEL (Topic)
3925@findex gnus-topic-delete
3926Delete an empty topic (@code{gnus-topic-delete}).
3927
3928@item A T
3929@kindex A T (Topic)
3930@findex gnus-topic-list-active
3931List all groups that Gnus knows about in a topics-ified way
3932(@code{gnus-topic-list-active}).
3933
3934@item T M-n
3935@kindex T M-n (Topic)
3936@findex gnus-topic-goto-next-topic
3937Go to the next topic (@code{gnus-topic-goto-next-topic}).
3938
3939@item T M-p
3940@kindex T M-p (Topic)
3941@findex gnus-topic-goto-previous-topic
01c52d31 3942Go to the previous topic (@code{gnus-topic-goto-previous-topic}).
4009494e
GM
3943
3944@item G p
3945@kindex G p (Topic)
3946@findex gnus-topic-edit-parameters
3947@cindex group parameters
3948@cindex topic parameters
3949@cindex parameters
3950Edit the topic parameters (@code{gnus-topic-edit-parameters}).
3951@xref{Topic Parameters}.
3952
3953@end table
3954
3955
3956@node Topic Variables
3957@subsection Topic Variables
3958@cindex topic variables
3959
3960The previous section told you how to tell Gnus which topics to display.
3961This section explains how to tell Gnus what to display about each topic.
3962
3963@vindex gnus-topic-line-format
3964The topic lines themselves are created according to the
3965@code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
3966Valid elements are:
3967
3968@table @samp
3969@item i
3970Indentation.
3971@item n
3972Topic name.
3973@item v
3974Visibility.
3975@item l
3976Level.
3977@item g
3978Number of groups in the topic.
3979@item a
3980Number of unread articles in the topic.
3981@item A
3982Number of unread articles in the topic and all its subtopics.
3983@end table
3984
3985@vindex gnus-topic-indent-level
3986Each sub-topic (and the groups in the sub-topics) will be indented with
3987@code{gnus-topic-indent-level} times the topic level number of spaces.
3988The default is 2.
3989
3990@vindex gnus-topic-mode-hook
3991@code{gnus-topic-mode-hook} is called in topic minor mode buffers.
3992
3993@vindex gnus-topic-display-empty-topics
3994The @code{gnus-topic-display-empty-topics} says whether to display even
3995topics that have no unread articles in them. The default is @code{t}.
3996
3997
3998@node Topic Sorting
3999@subsection Topic Sorting
4000@cindex topic sorting
4001
4002You can sort the groups in each topic individually with the following
4003commands:
4004
4005
4006@table @kbd
4007@item T S a
4008@kindex T S a (Topic)
4009@findex gnus-topic-sort-groups-by-alphabet
4010Sort the current topic alphabetically by group name
4011(@code{gnus-topic-sort-groups-by-alphabet}).
4012
4013@item T S u
4014@kindex T S u (Topic)
4015@findex gnus-topic-sort-groups-by-unread
4016Sort the current topic by the number of unread articles
4017(@code{gnus-topic-sort-groups-by-unread}).
4018
4019@item T S l
4020@kindex T S l (Topic)
4021@findex gnus-topic-sort-groups-by-level
4022Sort the current topic by group level
4023(@code{gnus-topic-sort-groups-by-level}).
4024
4025@item T S v
4026@kindex T S v (Topic)
4027@findex gnus-topic-sort-groups-by-score
4028Sort the current topic by group score
4029(@code{gnus-topic-sort-groups-by-score}). @xref{Group Score}.
4030
4031@item T S r
4032@kindex T S r (Topic)
4033@findex gnus-topic-sort-groups-by-rank
4034Sort the current topic by group rank
4035(@code{gnus-topic-sort-groups-by-rank}). @xref{Group Score}.
4036
4037@item T S m
4038@kindex T S m (Topic)
4039@findex gnus-topic-sort-groups-by-method
4040Sort the current topic alphabetically by back end name
4041(@code{gnus-topic-sort-groups-by-method}).
4042
4043@item T S e
4044@kindex T S e (Topic)
4045@findex gnus-topic-sort-groups-by-server
4046Sort the current topic alphabetically by server name
4047(@code{gnus-topic-sort-groups-by-server}).
4048
4049@item T S s
4050@kindex T S s (Topic)
4051@findex gnus-topic-sort-groups
4052Sort the current topic according to the function(s) given by the
4053@code{gnus-group-sort-function} variable
4054(@code{gnus-topic-sort-groups}).
4055
4056@end table
4057
4058When given a prefix argument, all these commands will sort in reverse
4059order. @xref{Sorting Groups}, for more information about group
4060sorting.
4061
4062
4063@node Topic Topology
4064@subsection Topic Topology
4065@cindex topic topology
4066@cindex topology
4067
4068So, let's have a look at an example group buffer:
4069
4070@example
4071@group
4072Gnus
4073 Emacs -- I wuw it!
4074 3: comp.emacs
4075 2: alt.religion.emacs
4076 Naughty Emacs
4077 452: alt.sex.emacs
4078 0: comp.talk.emacs.recovery
4079 Misc
4080 8: comp.binaries.fractals
4081 13: comp.sources.unix
4082@end group
4083@end example
4084
4085So, here we have one top-level topic (@samp{Gnus}), two topics under
4086that, and one sub-topic under one of the sub-topics. (There is always
4087just one (1) top-level topic). This topology can be expressed as
4088follows:
4089
4090@lisp
4091(("Gnus" visible)
4092 (("Emacs -- I wuw it!" visible)
4093 (("Naughty Emacs" visible)))
4094 (("Misc" visible)))
4095@end lisp
4096
4097@vindex gnus-topic-topology
4098This is in fact how the variable @code{gnus-topic-topology} would look
4099for the display above. That variable is saved in the @file{.newsrc.eld}
4100file, and shouldn't be messed with manually---unless you really want
4101to. Since this variable is read from the @file{.newsrc.eld} file,
4102setting it in any other startup files will have no effect.
4103
4104This topology shows what topics are sub-topics of what topics (right),
4105and which topics are visible. Two settings are currently
4106allowed---@code{visible} and @code{invisible}.
4107
4108
4109@node Topic Parameters
4110@subsection Topic Parameters
4111@cindex topic parameters
4112
4113All groups in a topic will inherit group parameters from the parent
4114(and ancestor) topic parameters. All valid group parameters are valid
4115topic parameters (@pxref{Group Parameters}). When the agent is
4116enabled, all agent parameters (See Agent Parameters in @ref{Category
4117Syntax}) are also valid topic parameters.
4118
4119In addition, the following parameters are only valid as topic
4120parameters:
4121
4122@table @code
4123@item subscribe
4124When subscribing new groups by topic (@pxref{Subscription Methods}), the
4125@code{subscribe} topic parameter says what groups go in what topic. Its
4126value should be a regexp to match the groups that should go in that
4127topic.
4128
4129@item subscribe-level
4130When subscribing new groups by topic (see the @code{subscribe} parameter),
4131the group will be subscribed with the level specified in the
4132@code{subscribe-level} instead of @code{gnus-level-default-subscribed}.
4133
4134@end table
4135
4136Group parameters (of course) override topic parameters, and topic
4137parameters in sub-topics override topic parameters in super-topics. You
4138know. Normal inheritance rules. (@dfn{Rules} is here a noun, not a
4139verb, although you may feel free to disagree with me here.)
4140
4141@example
4142@group
4143Gnus
4144 Emacs
4145 3: comp.emacs
4146 2: alt.religion.emacs
4147 452: alt.sex.emacs
4148 Relief
4149 452: alt.sex.emacs
4150 0: comp.talk.emacs.recovery
4151 Misc
4152 8: comp.binaries.fractals
4153 13: comp.sources.unix
4154 452: alt.sex.emacs
4155@end group
4156@end example
4157
4158The @samp{Emacs} topic has the topic parameter @code{(score-file
4159. "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter
4160@code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has the
4161topic parameter @code{(score-file . "emacs.SCORE")}. In addition,
4162@* @samp{alt.religion.emacs} has the group parameter @code{(score-file
4163. "religion.SCORE")}.
4164
4165Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you
4166will get the @file{relief.SCORE} home score file. If you enter the same
4167group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home
4168score file. If you enter the group @samp{alt.religion.emacs}, you'll
4169get the @file{religion.SCORE} home score file.
4170
4171This seems rather simple and self-evident, doesn't it? Well, yes. But
4172there are some problems, especially with the @code{total-expiry}
4173parameter. Say you have a mail group in two topics; one with
4174@code{total-expiry} and one without. What happens when you do @kbd{M-x
4175gnus-expire-all-expirable-groups}? Gnus has no way of telling which one
4176of these topics you mean to expire articles from, so anything may
4177happen. In fact, I hereby declare that it is @dfn{undefined} what
4178happens. You just have to be careful if you do stuff like that.
4179
4180
01c52d31
MB
4181@node Non-ASCII Group Names
4182@section Accessing groups of non-English names
4183@cindex non-ascii group names
4184
4185There are some news servers that provide groups of which the names are
4186expressed with their native languages in the world. For instance, in a
4187certain news server there are some newsgroups of which the names are
4188spelled in Chinese, where people are talking in Chinese. You can, of
4189course, subscribe to such news groups using Gnus. Currently Gnus
4190supports non-@acronym{ASCII} group names not only with the @code{nntp}
4191back end but also with the @code{nnml} back end and the @code{nnrss}
4192back end.
4193
4194Every such group name is encoded by a certain charset in the server
4195side (in an @acronym{NNTP} server its administrator determines the
4196charset, but for groups in the other back ends it is determined by you).
4197Gnus has to display the decoded ones for you in the group buffer and the
4198article buffer, and needs to use the encoded ones when communicating
4199with servers. However, Gnus doesn't know what charset is used for each
4200non-@acronym{ASCII} group name. The following two variables are just
4201the ones for telling Gnus what charset should be used for each group:
4202
4203@table @code
4204@item gnus-group-name-charset-method-alist
4205@vindex gnus-group-name-charset-method-alist
4206An alist of select methods and charsets. The default value is
4207@code{nil}. The names of groups in the server specified by that select
4208method are all supposed to use the corresponding charset. For example:
4209
4210@lisp
4211(setq gnus-group-name-charset-method-alist
4212 '(((nntp "news.com.cn") . cn-gb-2312)))
4213@end lisp
4214
4215Charsets specified for groups with this variable are preferred to the
4216ones specified for the same groups with the
4217@code{gnus-group-name-charset-group-alist} variable (see below).
4218
4219A select method can be very long, like:
4220
4221@lisp
4222(nntp "gmane"
4223 (nntp-address "news.gmane.org")
4224 (nntp-end-of-line "\n")
4225 (nntp-open-connection-function
4226 nntp-open-via-rlogin-and-telnet)
4227 (nntp-via-rlogin-command "ssh")
4228 (nntp-via-rlogin-command-switches
4229 ("-C" "-t" "-e" "none"))
4230 (nntp-via-address @dots{}))
4231@end lisp
4232
4233In that case, you can truncate it into @code{(nntp "gmane")} in this
4234variable. That is, it is enough to contain only the back end name and
4235the server name.
4236
4237@item gnus-group-name-charset-group-alist
4238@cindex UTF-8 group names
4239@vindex gnus-group-name-charset-group-alist
4240An alist of regexp of group name and the charset for group names.
4241@code{((".*" . utf-8))} is the default value if UTF-8 is supported,
4242otherwise the default is @code{nil}. For example:
4243
4244@lisp
4245(setq gnus-group-name-charset-group-alist
4246 '(("\\.com\\.cn:" . cn-gb-2312)
4247 (".*" . utf-8)))
4248@end lisp
4249
4250Note that this variable is ignored if the match is made with
4251@code{gnus-group-name-charset-method-alist}.
4252@end table
4253
4254Those two variables are used also to determine the charset for encoding
4255and decoding non-@acronym{ASCII} group names that are in the back ends
4256other than @code{nntp}. It means that it is you who determine it. If
4257you do nothing, the charset used for group names in those back ends will
4258all be @code{utf-8} because of the last element of
4259@code{gnus-group-name-charset-group-alist}.
4260
4261There is one more important variable for non-@acronym{ASCII} group
26b9f88d 4262names:
01c52d31
MB
4263
4264@table @code
4265@item nnmail-pathname-coding-system
26b9f88d
MB
4266@vindex nnmail-pathname-coding-system
4267The value of this variable should be a coding system or @code{nil}. The
4268default is @code{nil} in Emacs, or is the aliasee of the coding system
4269named @code{file-name} (a certain coding system of which an alias is
4270@code{file-name}) in XEmacs.
4271
4272The @code{nnml} back end, the @code{nnrss} back end, the @acronym{NNTP}
4273marks feature (@pxref{NNTP marks}), the agent, and the cache use
4274non-@acronym{ASCII} group names in those files and directories. This
4275variable overrides the value of @code{file-name-coding-system} which
4276specifies the coding system used when encoding and decoding those file
4277names and directory names.
01c52d31
MB
4278
4279In XEmacs (with the @code{mule} feature), @code{file-name-coding-system}
4280is the only means to specify the coding system used to encode and decode
26b9f88d 4281file names. On the other hand, Emacs uses the value of
01c52d31 4282@code{default-file-name-coding-system} if @code{file-name-coding-system}
26b9f88d
MB
4283is @code{nil} or it is bound to the value of
4284@code{nnmail-pathname-coding-system} which is @code{nil}.
4285
4286Normally the value of @code{default-file-name-coding-system} in Emacs or
4287@code{nnmail-pathname-coding-system} in XEmacs is initialized according
4288to the locale, so you will need to do nothing if the value is suitable
4289to encode and decode non-@acronym{ASCII} group names.
01c52d31
MB
4290
4291The value of this variable (or @code{default-file-name-coding-system})
4292does not necessarily need to be the same value that is determined by
4293@code{gnus-group-name-charset-method-alist} and
4294@code{gnus-group-name-charset-group-alist}.
4295
26b9f88d
MB
4296If @code{default-file-name-coding-system} or this variable is
4297initialized by default to @code{iso-latin-1} for example, although you
4298want to subscribe to the groups spelled in Chinese, that is the most
4299typical case where you have to customize
4300@code{nnmail-pathname-coding-system}. The @code{utf-8} coding system is
4301a good candidate for it. Otherwise, you may change the locale in your
4302system so that @code{default-file-name-coding-system} or this variable
4303may be initialized to an appropriate value.
01c52d31
MB
4304@end table
4305
4306Note that when you copy or move articles from a non-@acronym{ASCII}
4307group to another group, the charset used to encode and decode group
4308names should be the same in both groups. Otherwise the Newsgroups
4309header will be displayed incorrectly in the article buffer.
4310
4311
e6d2d263
MB
4312@node Searching
4313@section Searching
4314
4315@menu
4316* nnir:: Searching on IMAP, with swish, namazu, etc.
4317* nnmairix:: Searching maildir, MH or mbox with Mairix.
4318@end menu
4319
4320@cindex Searching
4321
4322FIXME: This node is a stub.
4323
4324FIXME: Add a brief overview of Gnus search capabilities. A brief
4325comparison of nnir, nnmairix, contrib/gnus-namazu would be nice
4326as well.
4327
4328FIXME: Explain difference to @ref{Searching for Articles}, add reference
4329and back-reference.
4330
4331@node nnir
4332@subsection nnir
4333
4334FIXME: As a first step, convert the commentary of @file{nnir} to texi.
4335@cindex nnir
4336
4337@node nnmairix
4338@subsection nnmairix
4339
867d4bb3 4340@cindex mairix
e6d2d263
MB
4341@cindex nnmairix
4342This paragraph describes how to set up mairix and the back end
4343@code{nnmairix} for indexing and searching your mail from within
4344Gnus. Additionally, you can create permanent ``smart'' groups which are
4345bound to mairix searches and are automatically updated.
4346
4347@menu
4348* About mairix:: About the mairix mail search engine
4349* nnmairix requirements:: What you will need for using nnmairix
4350* What nnmairix does:: What does nnmairix actually do?
4351* Setting up mairix:: Set up your mairix installation
4352* Configuring nnmairix:: Set up the nnmairix back end
4353* nnmairix keyboard shortcuts:: List of available keyboard shortcuts
4354* Propagating marks:: How to propagate marks from nnmairix groups
4355* nnmairix tips and tricks:: Some tips, tricks and examples
4356* nnmairix caveats:: Some more stuff you might want to know
4357@end menu
4358
2b968687
MB
4359@c FIXME: The markup in this section might need improvement.
4360@c E.g. adding @samp, @var, @file, @command, etc.
4361@c Cf. (info "(texinfo)Indicating")
e6d2d263
MB
4362
4363@node About mairix
4364@subsubsection About mairix
4365
4366Mairix is a tool for indexing and searching words in locally stored
4367mail. It was written by Richard Curnow and is licensed under the
4368GPL. Mairix comes with most popular GNU/Linux distributions, but it also
4369runs under Windows (with cygwin), Mac OS X and Solaris. The homepage can
4370be found at
4371@uref{http://www.rpcurnow.force9.co.uk/mairix/index.html}
4372
4373Though mairix might not be as flexible as other search tools like
4374swish++ or namazu, which you can use via the @code{nnir} back end, it
4375has the prime advantage of being incredibly fast. On current systems, it
4376can easily search through headers and message bodies of thousands and
4377thousands of mails in well under a second. Building the database
4378necessary for searching might take a minute or two, but only has to be
4379done once fully. Afterwards, the updates are done incrementally and
4380therefore are really fast, too. Additionally, mairix is very easy to set
4381up.
4382
4383For maximum speed though, mairix should be used with mails stored in
4384@code{Maildir} or @code{MH} format (this includes the @code{nnml} back
4385end), although it also works with mbox. Mairix presents the search
4386results by populating a @emph{virtual} maildir/MH folder with symlinks
4387which point to the ``real'' message files (if mbox is used, copies are
4388made). Since mairix already presents search results in such a virtual
4389mail folder, it is very well suited for using it as an external program
4390for creating @emph{smart} mail folders, which represent certain mail
f7362445 4391searches.
e6d2d263
MB
4392
4393@node nnmairix requirements
4394@subsubsection nnmairix requirements
4395
2b968687 4396Mairix searches local mail---that means, mairix absolutely must have
e6d2d263
MB
4397direct access to your mail folders. If your mail resides on another
4398server (e.g. an @acronym{IMAP} server) and you happen to have shell
4399access, @code{nnmairix} supports running mairix remotely, e.g. via ssh.
4400
4401Additionally, @code{nnmairix} only supports the following Gnus back
2b968687
MB
4402ends: @code{nnml}, @code{nnmaildir}, and @code{nnimap}. You must use
4403one of these back ends for using @code{nnmairix}. Other back ends, like
4404@code{nnmbox}, @code{nnfolder} or @code{nnmh}, won't work.
e6d2d263
MB
4405
4406If you absolutely must use mbox and still want to use @code{nnmairix},
4407you can set up a local @acronym{IMAP} server, which you then access via
4408@code{nnimap}. This is a rather massive setup for accessing some mbox
030cca00
MB
4409files, so just change to MH or Maildir already... However, if you're
4410really, really passionate about using mbox, you might want to look into
4411the package @file{mairix.el}, which comes with Emacs 23.
e6d2d263
MB
4412
4413@node What nnmairix does
4414@subsubsection What nnmairix does
4415
4416The back end @code{nnmairix} enables you to call mairix from within Gnus,
4417either to query mairix with a search term or to update the
4418database. While visiting a message in the summary buffer, you can use
4419several pre-defined shortcuts for calling mairix, e.g. to quickly
4420search for all mails from the sender of the current message or to
4421display the whole thread associated with the message, even if the
4422mails are in different folders.
4423
4424Additionally, you can create permanent @code{nnmairix} groups which are bound
4425to certain mairix searches. This way, you can easily create a group
4426containing mails from a certain sender, with a certain subject line or
4427even for one specific thread based on the Message-ID. If you check for
4428new mail in these folders (e.g. by pressing @kbd{g} or @kbd{M-g}), they
867d4bb3 4429automatically update themselves by calling mairix.
e6d2d263
MB
4430
4431You might ask why you need @code{nnmairix} at all, since mairix already
4432creates the group, populates it with links to the mails so that you can
030cca00 4433then access it with Gnus, right? Well, this @emph{might} work, but often
2b968687 4434does not---at least not without problems. Most probably you will get
e6d2d263
MB
4435strange article counts, and sometimes you might see mails which Gnus
4436claims have already been canceled and are inaccessible. This is due to
4437the fact that Gnus isn't really amused when things are happening behind
4438its back. Another problem can be the mail back end itself, e.g. if you
4439use mairix with an @acronym{IMAP} server (I had Dovecot complaining
4440about corrupt index files when mairix changed the contents of the search
4441group). Using @code{nnmairix} should circumvent these problems.
4442
030cca00
MB
4443@code{nnmairix} is not really a mail back end---it's actually more like
4444a wrapper, sitting between a ``real'' mail back end where mairix stores
4445the searches and the Gnus front end. You can choose between three
4446different mail back ends for the mairix folders: @code{nnml},
4447@code{nnmaildir} or @code{nnimap}. @code{nnmairix} will call the mairix
4448binary so that the search results are stored in folders named
e6d2d263 4449@code{zz_mairix-<NAME>-<NUMBER>} on this mail back end, but it will
030cca00
MB
4450present these folders in the Gnus front end only with @code{<NAME>}.
4451You can use an existing mail back end where you already store your mail,
4452but if you're uncomfortable with @code{nnmairix} creating new mail
4453groups alongside your other mail, you can also create e.g. a new
4454@code{nnmaildir} or @code{nnml} server exclusively for mairix, but then
4455make sure those servers do not accidentally receive your new mail
4456(@pxref{nnmairix caveats}). A special case exists if you want to use
4457mairix remotely on an IMAP server with @code{nnimap}---here the mairix
4458folders and your other mail must be on the same @code{nnimap} back end.
e6d2d263
MB
4459
4460@node Setting up mairix
4461@subsubsection Setting up mairix
4462
4463First: create a backup of your mail folders (@pxref{nnmairix caveats}).
4464
4465Setting up mairix is easy: simply create a @file{.mairixrc} file with
4466(at least) the following entries:
4467
4468@example
4469# Your Maildir/MH base folder
4470base=~/Maildir
4471@end example
4472
2b968687
MB
4473This is the base folder for your mails. All the following directories
4474are relative to this base folder. If you want to use @code{nnmairix}
4475with @code{nnimap}, this base directory has to point to the mail
4476directory where the @acronym{IMAP} server stores the mail folders!
e6d2d263 4477
e6d2d263
MB
4478@example
4479maildir= ... your maildir folders which should be indexed ...
4480mh= ... your nnml/mh folders which should be indexed ...
4481mbox = ... your mbox files which should be indexed ...
4482@end example
4483
9e601b8d
MB
4484This specifies all your mail folders and mbox files (relative to the
4485base directory!) you want to index with mairix. Note that the
4486@code{nnml} back end saves mails in MH format, so you have to put those
4487directories in the @code{mh} line. See the example at the end of this
4488section and mairixrc's man-page for further details.
e6d2d263
MB
4489
4490@example
4491omit=zz_mairix-*
4492@end example
4493
4494@vindex nnmairix-group-prefix
4495This should make sure that you don't accidentally index the mairix
4496search results. You can change the prefix of these folders with the
4497variable @code{nnmairix-group-prefix}.
4498
e6d2d263
MB
4499@example
4500mformat= ... 'maildir' or 'mh' ...
4501database= ... location of database file ...
4502@end example
4503
4504The @code{format} setting specifies the output format for the mairix
4505search folder. Set this to @code{mh} if you want to access search results
4506with @code{nnml}. Otherwise choose @code{maildir}.
4507
2b968687
MB
4508To summarize, here is my shortened @file{.mairixrc} file as an example:
4509
4510@example
4511base=~/Maildir
4512maildir=.personal:.work:.logcheck:.sent
4513mh=../Mail/nnml/*...
4514mbox=../mboxmail/mailarchive_year*
4515mformat=maildir
4516omit=zz_mairix-*
4517database=~/.mairixdatabase
4518@end example
4519
4520In this case, the base directory is @file{~/Maildir}, where all my Maildir
4521folders are stored. As you can see, the folders are separated by
4522colons. If you wonder why every folder begins with a dot: this is
4523because I use Dovecot as @acronym{IMAP} server, which again uses
4524@code{Maildir++} folders. For testing nnmairix, I also have some
4525@code{nnml} mail, which is saved in @file{~/Mail/nnml}. Since this has
4526to be specified relative to the @code{base} directory, the @code{../Mail}
4527notation is needed. Note that the line ends in @code{*...}, which means
4528to recursively scan all files under this directory. Without the three
4529dots, the wildcard @code{*} will not work recursively. I also have some
4530old mbox files with archived mail lying around in @file{~/mboxmail}.
4531The other lines should be obvious.
4532
4533See the man page for @code{mairixrc} for details and further options,
4534especially regarding wildcard usage, which may be a little different
4535than you are used to.
4536
4537Now simply call @code{mairix} to create the index for the first time.
4538Note that this may take a few minutes, but every following index will do
4539the updates incrementally and hence is very fast.
e6d2d263
MB
4540
4541@node Configuring nnmairix
4542@subsubsection Configuring nnmairix
4543
4544In group mode, type @kbd{G b c}
4545(@code{nnmairix-create-server-and-default-group}). This will ask you for all
4546necessary information and create a @code{nnmairix} server as a foreign
4547server. You will have to specify the following:
4548
4549@itemize @bullet
4550
4551@item
2b968687 4552The @strong{name} of the @code{nnmairix} server---choose whatever you
e6d2d263
MB
4553want.
4554
4555@item
9e601b8d
MB
4556The name of the @strong{back end server} where mairix should store its
4557searches. This must be a full server name, like @code{nnml:mymail}.
4558Just hit @kbd{TAB} to see the available servers. Currently, servers
4559which are accessed through @code{nnmaildir}, @code{nnimap} and
4560@code{nnml} are supported. As explained above, for locally stored
4561mails, this can be an existing server where you store your mails.
030cca00
MB
4562However, you can also create e.g. a new @code{nnmaildir} or @code{nnml}
4563server exclusively for @code{nnmairix} in your secondary select methods
4564(@pxref{Finding the News}). If you use a secondary @code{nnml} server
4565just for mairix, make sure that you explicitly set the server variable
4566@code{nnml-get-new-mail} to @code{nil}, or you might loose mail
4567(@pxref{nnmairix caveats}). If you want to use mairix remotely on an
9e601b8d
MB
4568@acronym{IMAP} server, you have to choose the corresponding
4569@code{nnimap} server here.
e6d2d263
MB
4570
4571@item
4572@vindex nnmairix-mairix-search-options
4573The @strong{command} to call the mairix binary. This will usually just
4574be @code{mairix}, but you can also choose something like @code{ssh
4575SERVER mairix} if you want to call mairix remotely, e.g. on your
4576@acronym{IMAP} server. If you want to add some default options to
4577mairix, you could do this here, but better use the variable
4578@code{nnmairix-mairix-search-options} instead.
4579
4580@item
4581The name of the @strong{default search group}. This will be the group
4582where all temporary mairix searches are stored, i.e. all searches which
4583are not bound to permanent @code{nnmairix} groups. Choose whatever you
4584like.
4585
4586@item
4587If the mail back end is @code{nnimap} or @code{nnmaildir}, you will be
4588asked if you work with @strong{Maildir++}, i.e. with hidden maildir
4589folders (=beginning with a dot). For example, you have to answer
4590@samp{yes} here if you work with the Dovecot @acronym{IMAP}
4591server. Otherwise, you should answer @samp{no} here.
4592
4593@end itemize
4594
4595@node nnmairix keyboard shortcuts
4596@subsubsection nnmairix keyboard shortcuts
4597
4598In group mode:
4599
4600@table @kbd
4601
4602@item G b c
4603@kindex G b c (Group)
4604@findex nnmairix-create-server-and-default-group
4605Creates @code{nnmairix} server and default search group for this server
4606(@code{nnmairix-create-server-and-default-group}). You should have done
4607this by now (@pxref{Configuring nnmairix}).
4608
4609@item G b s
4610@kindex G b s (Group)
4611@findex nnmairix-search
4612Prompts for query which is then sent to the mairix binary. Search
4613results are put into the default search group which is automatically
4614displayed (@code{nnmairix-search}).
4615
4616@item G b m
4617@kindex G b m (Group)
4618@findex nnmairix-widget-search
4619Allows you to create a mairix search or a permanent group more
4620comfortably using graphical widgets, similar to a customization
4621group. Just try it to see how it works (@code{nnmairix-widget-search}).
4622
4623@item G b i
4624@kindex G b i (Group)
4625@findex nnmairix-search-interactive
4626Another command for creating a mairix query more comfortably, but uses
4627only the minibuffer (@code{nnmairix-search-interactive}).
4628
4629@item G b g
4630@kindex G b g (Group)
4631@findex nnmairix-create-search-group
4632Creates a permanent group which is associated with a search query
4633(@code{nnmairix-create-search-group}). The @code{nnmairix} back end
4634automatically calls mairix when you update this group with @kbd{g} or
4635@kbd{M-g}.
4636
4637@item G b q
4638@kindex G b q (Group)
4639@findex nnmairix-group-change-query-this-group
4640Changes the search query for the @code{nnmairix} group under cursor
4641(@code{nnmairix-group-change-query-this-group}).
4642
4643@item G b t
4644@kindex G b t (Group)
4645@findex nnmairix-group-toggle-threads-this-group
4646Toggles the 'threads' parameter for the @code{nnmairix} group under cursor,
4647i.e. if you want see the whole threads of the found messages
4648(@code{nnmairix-group-toggle-threads-this-group}).
4649
4650@item G b u
4651@kindex G b u (Group)
4652@findex nnmairix-update-database
4653@vindex nnmairix-mairix-update-options
4654Calls mairix binary for updating the database
4655(@code{nnmairix-update-database}). The default parameters are @code{-F}
4656and @code{-Q} for making this as fast as possible (see variable
4657@code{nnmairix-mairix-update-options} for defining these default
4658options).
4659
4660@item G b r
4661@kindex G b r (Group)
4662@findex nnmairix-group-toggle-readmarks-this-group
4663Keep articles in this @code{nnmairix} group always read or unread, or leave the
4664marks unchanged (@code{nnmairix-group-toggle-readmarks-this-group}).
4665
4666@item G b d
4667@kindex G b d (Group)
4668@findex nnmairix-group-delete-recreate-this-group
4669Recreate @code{nnmairix} group on the ``real'' mail back end
4670(@code{nnmairix-group-delete-recreate-this-group}). You can do this if
4671you always get wrong article counts with a @code{nnmairix} group.
4672
4673@item G b a
4674@kindex G b a (Group)
4675@findex nnmairix-group-toggle-allowfast-this-group
4676Toggles the @code{allow-fast} parameters for group under cursor
4677(@code{nnmairix-group-toggle-allowfast-this-group}). The default
4678behavior of @code{nnmairix} is to do a mairix search every time you
4679update or enter the group. With the @code{allow-fast} parameter set,
4680mairix will only be called when you explicitly update the group, but not
4681upon entering. This makes entering the group faster, but it may also
4682lead to dangling symlinks if something changed between updating and
4683entering the group which is not yet in the mairix database.
4684
4685@item G b p
4686@kindex G b p (Group)
4687@findex nnmairix-group-toggle-propmarks-this-group
4688Toggle marks propagation for this group
4689(@code{nnmairix-group-toggle-propmarks-this-group}). (@pxref{Propagating
4690marks}).
4691
4692@item G b o
4693@kindex G b o (Group)
4694@findex nnmairix-propagate-marks
4695Manually propagate marks (@code{nnmairix-propagate-marks}); needed only when
4696@code{nnmairix-propagate-marks-upon-close} is set to @code{nil}.
4697
4698@end table
4699
4700In summary mode:
4701
4702@table @kbd
4703
4704@item $ m
4705@kindex $ m (Summary)
4706@findex nnmairix-widget-search-from-this-article
4707Allows you to create a mairix query or group based on the current
4708message using graphical widgets (same as @code{nnmairix-widget-search})
4709(@code{nnmairix-widget-search-from-this-article}).
4710
4711@item $ g
4712@kindex $ g (Summary)
4713@findex nnmairix-create-search-group-from-message
4714Interactively creates a new search group with query based on the current
4715message, but uses the minibuffer instead of graphical widgets
4716(@code{nnmairix-create-search-group-from-message}).
4717
4718@item $ t
4719@kindex $ t (Summary)
4720@findex nnmairix-search-thread-this-article
4721Searches thread for the current article
4722(@code{nnmairix-search-thread-this-article}). This is effectively a
4723shortcut for calling @code{nnmairix-search} with @samp{m:msgid} of the
4724current article and enabled threads.
4725
4726@item $ f
4727@kindex $ f (Summary)
4728@findex nnmairix-search-from-this-article
4729Searches all messages from sender of the current article
4730(@code{nnmairix-search-from-this-article}). This is a shortcut for
4731calling @code{nnmairix-search} with @samp{f:From}.
4732
4733@item $ o
4734@kindex $ o (Summary)
4735@findex nnmairix-goto-original-article
4736(Only in @code{nnmairix} groups!) Tries determine the group this article
4737originally came from and displays the article in this group, so that
4738e.g. replying to this article the correct posting styles/group
4739parameters are applied (@code{nnmairix-goto-original-article}). This
4740function will use the registry if available, but can also parse the
2b968687 4741article file name as a fallback method.
e6d2d263
MB
4742
4743@item $ u
4744@kindex $ u (Summary)
4745@findex nnmairix-remove-tick-mark-original-article
4746Remove possibly existing tick mark from original article
4747(@code{nnmairix-remove-tick-mark-original-article}). (@pxref{nnmairix
4748tips and tricks}).
4749
4750@end table
4751
4752@node Propagating marks
4753@subsubsection Propagating marks
4754
4755First of: you really need a patched mairix binary for using the marks
4756propagation feature efficiently. Otherwise, you would have to update
4757the mairix database all the time. You can get the patch at
4758
030cca00 4759@uref{http://www.randomsample.de/mairix-maildir-patch.tar}
e6d2d263
MB
4760
4761You need the mairix v0.21 source code for this patch; everything else
4762is explained in the accompanied readme file. If you don't want to use
4763marks propagation, you don't have to apply these patches, but they also
4764fix some annoyances regarding changing maildir flags, so it might still
4765be useful to you.
4766
4767With the patched mairix binary, you can use @code{nnmairix} as an
4768alternative to mail splitting (@pxref{Fancy Mail Splitting}). For
4769example, instead of splitting all mails from @samp{david@@foobar.com}
4770into a group, you can simply create a search group with the query
4771@samp{f:david@@foobar.com}. This is actually what ``smart folders'' are
4772all about: simply put everything in one mail folder and dynamically
4773create searches instead of splitting. This is more flexible, since you
4774can dynamically change your folders any time you want to. This also
4775implies that you will usually read your mails in the @code{nnmairix}
4776groups instead of your ``real'' mail groups.
4777
4778There is one problem, though: say you got a new mail from
2b968687 4779@samp{david@@foobar.com}; it will now show up in two groups, the
e6d2d263
MB
4780``real'' group (your INBOX, for example) and in the @code{nnmairix}
4781search group (provided you have updated the mairix database). Now you
4782enter the @code{nnmairix} group and read the mail. The mail will be
2b968687 4783marked as read, but only in the @code{nnmairix} group---in the ``real''
e6d2d263
MB
4784mail group it will be still shown as unread.
4785
4786You could now catch up the mail group (@pxref{Group Data}), but this is
4787tedious and error prone, since you may overlook mails you don't have
4788created @code{nnmairix} groups for. Of course, you could first use
4789@code{nnmairix-goto-original-article} (@pxref{nnmairix keyboard
4790shortcuts}) and then read the mail in the original group, but that's
4791even more cumbersome.
4792
4793Clearly, the easiest way would be if marks could somehow be
4794automatically set for the original article. This is exactly what
4795@emph{marks propagation} is about.
4796
4797Marks propagation is deactivated by default. You can activate it for a
4798certain @code{nnmairix} group with
4799@code{nnmairix-group-toggle-propmarks-this-group} (bound to @kbd{G b
4800p}). This function will warn you if you try to use it with your default
4801search group; the reason is that the default search group is used for
4802temporary searches, and it's easy to accidentally propagate marks from
4803this group. However, you can ignore this warning if you really want to.
4804
4805With marks propagation enabled, all the marks you set in a @code{nnmairix}
4806group should now be propagated to the original article. For example,
4807you can now tick an article (by default with @kbd{!}) and this mark should
4808magically be set for the original article, too.
4809
4810A few more remarks which you may or may not want to know:
4811
4812@vindex nnmairix-propagate-marks-upon-close
4813Marks will not be set immediately, but only upon closing a group. This
4814not only makes marks propagation faster, it also avoids problems with
4815dangling symlinks when dealing with maildir files (since changing flags
4816will change the file name). You can also control when to propagate marks
4817via @code{nnmairix-propagate-marks-upon-close} (see the doc-string for
4818details).
4819
4820Obviously, @code{nnmairix} will have to look up the original group for every
4821article you want to set marks for. If available, @code{nnmairix} will first use
4822the registry for determining the original group. The registry is very
4823fast, hence you should really, really enable the registry when using
4824marks propagation. If you don't have to worry about RAM and disc space,
4825set @code{gnus-registry-max-entries} to a large enough value; to be on
4826the safe side, choose roughly the amount of mails you index with mairix.
4827
4828@vindex nnmairix-only-use-registry
4829If you don't want to use the registry or the registry hasn't seen the
2b968687
MB
4830original article yet, @code{nnmairix} will use an additional mairix
4831search for determining the file name of the article. This, of course, is
4832way slower than the registry---if you set hundreds or even thousands of
4833marks this way, it might take some time. You can avoid this situation by
4834setting @code{nnmairix-only-use-registry} to t.
e6d2d263
MB
4835
4836Maybe you also want to propagate marks the other way round, i.e. if you
4837tick an article in a "real" mail group, you'd like to have the same
4838article in a @code{nnmairix} group ticked, too. For several good
4839reasons, this can only be done efficiently if you use maildir. To
4840immediately contradict myself, let me mention that it WON'T work with
4841@code{nnmaildir}, since @code{nnmaildir} stores the marks externally and
4842not in the file name. Therefore, propagating marks to @code{nnmairix}
4843groups will usually only work if you use an IMAP server which uses
4844maildir as its file format.
4845
4846@vindex nnmairix-propagate-marks-to-nnmairix-groups
4847If you work with this setup, just set
4848@code{nnmairix-propagate-marks-to-nnmairix-groups} to @code{t} and see what
4849happens. If you don't like what you see, just set it to @code{nil} again. One
4850problem might be that you get a wrong number of unread articles; this
4851usually happens when you delete or expire articles in the original
4852groups. When this happens, you can recreate the @code{nnmairix} group on the
4853back end using @kbd{G b d}.
4854
4855@node nnmairix tips and tricks
4856@subsubsection nnmairix tips and tricks
4857
4858@itemize
4859@item
4860Checking Mail
4861
4862@findex nnmairix-update-groups
4863I put all my important mail groups at group level 1. The mairix groups
4864have group level 5, so they do not get checked at start up (@pxref{Group
4865Levels}).
4866
4867I use the following to check for mails:
4868
4869@lisp
4870(defun my-check-mail-mairix-update (level)
4871 (interactive "P")
4872 ;; if no prefix given, set level=1
4873 (gnus-group-get-new-news (or level 1))
4874 (nnmairix-update-groups "mairixsearch" t t)
4875 (gnus-group-list-groups))
4876
4877(define-key gnus-group-mode-map "g" 'my-check-mail-mairix-update)
4878@end lisp
4879
4880Instead of @samp{"mairixsearch"} use the name of your @code{nnmairix}
4881server. See the doc string for @code{nnmairix-update-groups} for
4882details.
4883
4884@item
4885Example: search group for ticked articles
4886
4887For example, you can create a group for all ticked articles, where the
4888articles always stay unread:
4889
4890Hit @kbd{G b g}, enter group name (e.g. @samp{important}), use
4891@samp{F:f} as query and do not include threads.
4892
4893Now activate marks propagation for this group by using @kbd{G b p}. Then
4894activate the always-unread feature by using @kbd{G b r} twice.
4895
2b968687 4896So far so good---but how do you remove the tick marks in the @code{nnmairix}
e6d2d263
MB
4897group? There are two options: You may simply use
4898@code{nnmairix-remove-tick-mark-original-article} (bound to @kbd{$ u}) to remove
4899tick marks from the original article. The other possibility is to set
4900@code{nnmairix-propagate-marks-to-nnmairix-groups} to @code{t}, but see the above
4901comments about this option. If it works for you, the tick marks should
4902also exist in the @code{nnmairix} group and you can remove them as usual,
4903e.g. by marking an article as read.
4904
4905When you have removed a tick mark from the original article, this
4906article should vanish from the @code{nnmairix} group after you have updated the
4907mairix database and updated the group. Fortunately, there is a function
4908for doing exactly that: @code{nnmairix-update-groups}. See the previous code
4909snippet and the doc string for details.
4910
4911@item
4912Dealing with auto-subscription of mail groups
4913
4914As described before, all @code{nnmairix} groups are in fact stored on
4915the mail back end in the form @samp{zz_mairix-<NAME>-<NUMBER>}. You can
4916see them when you enter the back end server in the server buffer. You
4917should not subscribe these groups! Unfortunately, these groups will
2b968687 4918usually get @emph{auto-subscribed} when you use @code{nnmaildir} or
e6d2d263
MB
4919@code{nnml}, i.e. you will suddenly see groups of the form
4920@samp{zz_mairix*} pop up in your group buffer. If this happens to you,
4921simply kill these groups with C-k. For avoiding this, turn off
4922auto-subscription completely by setting the variable
4923@code{gnus-auto-subscribed-groups} to @code{nil} (@pxref{Filtering New
4924Groups}), or if you like to keep this feature use the following kludge
4925for turning it off for all groups beginning with @samp{zz_}:
4926
4927@lisp
4928(setq gnus-auto-subscribed-groups
4929 "^\\(nnml\\|nnfolder\\|nnmbox\\|nnmh\\|nnbabyl\\|nnmaildir\\).*:\\([^z]\\|z$\\|\\z[^z]\\|zz$\\|zz[^_]\\|zz_$\\).*")
4930@end lisp
4931
4932@end itemize
4933
4934@node nnmairix caveats
4935@subsubsection nnmairix caveats
4936
4937@itemize
4938@item
030cca00
MB
4939You can create a secondary @code{nnml} server just for nnmairix, but then
4940you have to explicitly set the corresponding server variable
4941@code{nnml-get-new-mail} to @code{nil}. Otherwise, new mail might get
4942put into this secondary server (and would never show up again). Here's
4943an example server definition:
4944
4945@lisp
4946(nnml "mairix" (nnml-directory "mairix") (nnml-get-new-mail nil))
4947@end lisp
4948
4949(The @code{nnmaildir} back end also has a server variabe
4950@code{get-new-mail}, but its default value is @code{nil}, so you don't
4951have to explicitly set it if you use a @code{nnmaildir} server just for
4952mairix.)
e6d2d263
MB
4953
4954@item
4955If you use the Gnus registry: don't use the registry with
4956@code{nnmairix} groups (put them in
2b968687
MB
4957@code{gnus-registry-unfollowed-groups}). Be @emph{extra careful} if
4958you use @code{gnus-registry-split-fancy-with-parent}; mails which are
e6d2d263
MB
4959split into @code{nnmairix} groups are usually gone for good as soon as
4960you check the group for new mail (yes, it has happened to me...).
4961
4962@item
2b968687 4963Therefore: @emph{Never ever} put ``real'' mails into @code{nnmairix}
e6d2d263
MB
4964groups (you shouldn't be able to, anyway).
4965
030cca00
MB
4966@item
4967If you use the Gnus agent (@pxref{Gnus Unplugged}): don't agentize
4968@code{nnmairix} groups (though I have no idea what happens if you do).
4969
e6d2d263
MB
4970@item
4971mairix does only support us-ascii characters.
4972
4973@item
4974@code{nnmairix} uses a rather brute force method to force Gnus to
4975completely reread the group on the mail back end after mairix was
2b968687 4976called---it simply deletes and re-creates the group on the mail
e6d2d263
MB
4977back end. So far, this has worked for me without any problems, and I
4978don't see how @code{nnmairix} could delete other mail groups than its
4979own, but anyway: you really should have a backup of your mail
4980folders.
4981
4982@item
4983All necessary information is stored in the group parameters
4984(@pxref{Group Parameters}). This has the advantage that no active file
4985is needed, but also implies that when you kill a @code{nnmairix} group,
4986it is gone for good.
4987
4988@item
4989@findex nnmairix-purge-old-groups
4990If you create and kill a lot of @code{nnmairix} groups, the
4991``zz_mairix-*'' groups will accumulate on the mail back end server. To
4992delete old groups which are no longer needed, call
4993@code{nnmairix-purge-old-groups}. Note that this assumes that you don't
4994save any ``real'' mail in folders of the form
4995@code{zz_mairix-<NAME>-<NUMBER>}. You can change the prefix of
4996@code{nnmairix} groups by changing the variable
4997@code{nnmairix-group-prefix}.
4998
4999@item
2b968687 5000The following only applies if you @emph{don't} use the mentioned patch
e6d2d263
MB
5001for mairix (@pxref{Propagating marks}):
5002
5003A problem can occur when using @code{nnmairix} with maildir folders and
5004comes with the fact that maildir stores mail flags like @samp{Seen} or
5005@samp{Replied} by appending chars @samp{S} and @samp{R} to the message
5006file name, respectively. This implies that currently you would have to
5007update the mairix database not only when new mail arrives, but also when
5008mail flags are changing. The same applies to new mails which are indexed
5009while they are still in the @samp{new} folder but then get moved to
5010@samp{cur} when Gnus has seen the mail. If you don't update the database
5011after this has happened, a mairix query can lead to symlinks pointing to
5012non-existing files. In Gnus, these messages will usually appear with
5013``(none)'' entries in the header and can't be accessed. If this happens
5014to you, using @kbd{G b u} and updating the group will usually fix this.
5015
5016@end itemize
5017
4009494e
GM
5018@node Misc Group Stuff
5019@section Misc Group Stuff
5020
5021@menu
5022* Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
5023* Group Information:: Information and help on groups and Gnus.
5024* Group Timestamp:: Making Gnus keep track of when you last read a group.
5025* File Commands:: Reading and writing the Gnus files.
5026* Sieve Commands:: Managing Sieve scripts.
5027@end menu
5028
5029@table @kbd
5030
5031@item v
5032@kindex v (Group)
5033@cindex keys, reserved for users (Group)
5034The key @kbd{v} is reserved for users. You can bind it to some
5035command or better use it as a prefix key. For example:
5036
5037@lisp
5038(define-key gnus-group-mode-map (kbd "v j d")
5039 (lambda ()
5040 (interactive)
5041 (gnus-group-jump-to-group "nndraft:drafts")))
5042@end lisp
5043
5044On keys reserved for users in Emacs and on keybindings in general
5045@xref{Keymaps, Keymaps, , emacs, The Emacs Editor}.
5046
5047@item ^
5048@kindex ^ (Group)
5049@findex gnus-group-enter-server-mode
5050Enter the server buffer (@code{gnus-group-enter-server-mode}).
5051@xref{Server Buffer}.
5052
5053@item a
5054@kindex a (Group)
5055@findex gnus-group-post-news
5056Start composing a message (a news by default)
5057(@code{gnus-group-post-news}). If given a prefix, post to the group
5058under the point. If the prefix is 1, prompt for a group to post to.
5059Contrary to what the name of this function suggests, the prepared
5060article might be a mail instead of a news, if a mail group is specified
5061with the prefix argument. @xref{Composing Messages}.
5062
5063@item m
5064@kindex m (Group)
5065@findex gnus-group-mail
5066Mail a message somewhere (@code{gnus-group-mail}). If given a prefix,
5067use the posting style of the group under the point. If the prefix is 1,
5068prompt for a group name to find the posting style.
5069@xref{Composing Messages}.
5070
5071@item i
5072@kindex i (Group)
5073@findex gnus-group-news
5074Start composing a news (@code{gnus-group-news}). If given a prefix,
5075post to the group under the point. If the prefix is 1, prompt
5076for group to post to. @xref{Composing Messages}.
5077
5078This function actually prepares a news even when using mail groups.
5079This is useful for ``posting'' messages to mail groups without actually
5080sending them over the network: they're just saved directly to the group
5081in question. The corresponding back end must have a request-post method
5082for this to work though.
5083
01c52d31
MB
5084@item G z
5085@kindex G z (Group)
5086@findex gnus-group-compact-group
5087
5088Compact the group under point (@code{gnus-group-compact-group}).
5089Currently implemented only in nnml (@pxref{Mail Spool}). This removes
5090gaps between article numbers, hence getting a correct total article
5091count.
5092
4009494e
GM
5093@end table
5094
5095Variables for the group buffer:
5096
5097@table @code
5098
5099@item gnus-group-mode-hook
5100@vindex gnus-group-mode-hook
5101is called after the group buffer has been
5102created.
5103
5104@item gnus-group-prepare-hook
5105@vindex gnus-group-prepare-hook
5106is called after the group buffer is
5107generated. It may be used to modify the buffer in some strange,
5108unnatural way.
5109
5110@item gnus-group-prepared-hook
5111@vindex gnus-group-prepare-hook
5112is called as the very last thing after the group buffer has been
5113generated. It may be used to move point around, for instance.
5114
5115@item gnus-permanently-visible-groups
5116@vindex gnus-permanently-visible-groups
5117Groups matching this regexp will always be listed in the group buffer,
5118whether they are empty or not.
5119
4009494e
GM
5120@end table
5121
5122@node Scanning New Messages
5123@subsection Scanning New Messages
5124@cindex new messages
5125@cindex scanning new news
5126
5127@table @kbd
5128
5129@item g
5130@kindex g (Group)
5131@findex gnus-group-get-new-news
5132@c @icon{gnus-group-get-new-news}
5133Check the server(s) for new articles. If the numerical prefix is used,
5134this command will check only groups of level @var{arg} and lower
5135(@code{gnus-group-get-new-news}). If given a non-numerical prefix, this
5136command will force a total re-reading of the active file(s) from the
5137back end(s).
5138
5139@item M-g
5140@kindex M-g (Group)
5141@findex gnus-group-get-new-news-this-group
5142@vindex gnus-goto-next-group-when-activating
5143@c @icon{gnus-group-get-new-news-this-group}
5144Check whether new articles have arrived in the current group
5145(@code{gnus-group-get-new-news-this-group}).
5146@code{gnus-goto-next-group-when-activating} says whether this command is
5147to move point to the next group or not. It is @code{t} by default.
5148
5149@findex gnus-activate-all-groups
5150@cindex activating groups
5151@item C-c M-g
5152@kindex C-c M-g (Group)
5153Activate absolutely all groups (@code{gnus-activate-all-groups}).
5154
5155@item R
5156@kindex R (Group)
5157@cindex restarting
5158@findex gnus-group-restart
5159Restart Gnus (@code{gnus-group-restart}). This saves the @file{.newsrc}
5160file(s), closes the connection to all servers, clears up all run-time
5161Gnus variables, and then starts Gnus all over again.
5162
5163@end table
5164
5165@vindex gnus-get-new-news-hook
5166@code{gnus-get-new-news-hook} is run just before checking for new news.
5167
5168@vindex gnus-after-getting-new-news-hook
5169@code{gnus-after-getting-new-news-hook} is run after checking for new
5170news.
5171
5172
5173@node Group Information
5174@subsection Group Information
5175@cindex group information
5176@cindex information on groups
5177
5178@table @kbd
5179
5180
5181@item H f
5182@kindex H f (Group)
5183@findex gnus-group-fetch-faq
5184@vindex gnus-group-faq-directory
5185@cindex FAQ
5186@cindex ange-ftp
5187Try to fetch the @acronym{FAQ} for the current group
5188(@code{gnus-group-fetch-faq}). Gnus will try to get the @acronym{FAQ}
5189from @code{gnus-group-faq-directory}, which is usually a directory on
5190a remote machine. This variable can also be a list of directories.
5191In that case, giving a prefix to this command will allow you to choose
5192between the various sites. @code{ange-ftp} (or @code{efs}) will be
5193used for fetching the file.
5194
5195If fetching from the first site is unsuccessful, Gnus will attempt to go
5196through @code{gnus-group-faq-directory} and try to open them one by one.
5197
4009494e
GM
5198@item H C
5199@kindex H C (Group)
5200@findex gnus-group-fetch-control
5201@vindex gnus-group-fetch-control-use-browse-url
5202@cindex control message
5203Fetch the control messages for the group from the archive at
5204@code{ftp.isc.org} (@code{gnus-group-fetch-control}). Query for a
5205group if given a prefix argument.
5206
5207If @code{gnus-group-fetch-control-use-browse-url} is non-@code{nil},
5208Gnus will open the control messages in a browser using
5209@code{browse-url}. Otherwise they are fetched using @code{ange-ftp}
5210and displayed in an ephemeral group.
5211
5212Note that the control messages are compressed. To use this command
5213you need to turn on @code{auto-compression-mode} (@pxref{Compressed
5214Files, ,Compressed Files, emacs, The Emacs Manual}).
5215
5216@item H d
5217@itemx C-c C-d
5218@c @icon{gnus-group-describe-group}
5219@kindex H d (Group)
5220@kindex C-c C-d (Group)
5221@cindex describing groups
5222@cindex group description
5223@findex gnus-group-describe-group
5224Describe the current group (@code{gnus-group-describe-group}). If given
5225a prefix, force Gnus to re-read the description from the server.
5226
5227@item M-d
5228@kindex M-d (Group)
5229@findex gnus-group-describe-all-groups
5230Describe all groups (@code{gnus-group-describe-all-groups}). If given a
5231prefix, force Gnus to re-read the description file from the server.
5232
5233@item H v
5234@itemx V
5235@kindex V (Group)
5236@kindex H v (Group)
5237@cindex version
5238@findex gnus-version
5239Display current Gnus version numbers (@code{gnus-version}).
5240
5241@item ?
5242@kindex ? (Group)
5243@findex gnus-group-describe-briefly
5244Give a very short help message (@code{gnus-group-describe-briefly}).
5245
5246@item C-c C-i
5247@kindex C-c C-i (Group)
5248@cindex info
5249@cindex manual
5250@findex gnus-info-find-node
5251Go to the Gnus info node (@code{gnus-info-find-node}).
5252@end table
5253
5254
5255@node Group Timestamp
5256@subsection Group Timestamp
5257@cindex timestamps
5258@cindex group timestamps
5259
5260It can be convenient to let Gnus keep track of when you last read a
5261group. To set the ball rolling, you should add
5262@code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}:
5263
5264@lisp
5265(add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
5266@end lisp
5267
5268After doing this, each time you enter a group, it'll be recorded.
5269
5270This information can be displayed in various ways---the easiest is to
5271use the @samp{%d} spec in the group line format:
5272
5273@lisp
5274(setq gnus-group-line-format
5275 "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n")
5276@end lisp
5277
5278This will result in lines looking like:
5279
5280@example
5281* 0: mail.ding 19961002T012943
5282 0: custom 19961002T012713
5283@end example
5284
5285As you can see, the date is displayed in compact ISO 8601 format. This
5286may be a bit too much, so to just display the date, you could say
5287something like:
5288
5289@lisp
5290(setq gnus-group-line-format
5291 "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n")
5292@end lisp
5293
5294If you would like greater control of the time format, you can use a
5295user-defined format spec. Something like the following should do the
5296trick:
5297
5298@lisp
5299(setq gnus-group-line-format
5300 "%M\%S\%p\%P\%5y: %(%-40,40g%) %ud\n")
5301(defun gnus-user-format-function-d (headers)
5302 (let ((time (gnus-group-timestamp gnus-tmp-group)))
5303 (if time
5304 (format-time-string "%b %d %H:%M" time)
5305 "")))
5306@end lisp
5307
5308
5309@node File Commands
5310@subsection File Commands
5311@cindex file commands
5312
5313@table @kbd
5314
5315@item r
5316@kindex r (Group)
5317@findex gnus-group-read-init-file
5318@vindex gnus-init-file
5319@cindex reading init file
5320Re-read the init file (@code{gnus-init-file}, which defaults to
5321@file{~/.gnus.el}) (@code{gnus-group-read-init-file}).
5322
5323@item s
5324@kindex s (Group)
5325@findex gnus-group-save-newsrc
5326@cindex saving .newsrc
5327Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted)
5328(@code{gnus-group-save-newsrc}). If given a prefix, force saving the
5329file(s) whether Gnus thinks it is necessary or not.
5330
5331@c @item Z
5332@c @kindex Z (Group)
5333@c @findex gnus-group-clear-dribble
5334@c Clear the dribble buffer (@code{gnus-group-clear-dribble}).
5335
5336@end table
5337
5338
5339@node Sieve Commands
5340@subsection Sieve Commands
5341@cindex group sieve commands
5342
5343Sieve is a server-side mail filtering language. In Gnus you can use
5344the @code{sieve} group parameter (@pxref{Group Parameters}) to specify
5345sieve rules that should apply to each group. Gnus provides two
5346commands to translate all these group parameters into a proper Sieve
5347script that can be transfered to the server somehow.
5348
5349@vindex gnus-sieve-file
5350@vindex gnus-sieve-region-start
5351@vindex gnus-sieve-region-end
5352The generated Sieve script is placed in @code{gnus-sieve-file} (by
5353default @file{~/.sieve}). The Sieve code that Gnus generate is placed
5354between two delimiters, @code{gnus-sieve-region-start} and
5355@code{gnus-sieve-region-end}, so you may write additional Sieve code
5356outside these delimiters that will not be removed the next time you
5357regenerate the Sieve script.
5358
5359@vindex gnus-sieve-crosspost
5360The variable @code{gnus-sieve-crosspost} controls how the Sieve script
5361is generated. If it is non-@code{nil} (the default) articles is
5362placed in all groups that have matching rules, otherwise the article
5363is only placed in the group with the first matching rule. For
5364example, the group parameter @samp{(sieve address "sender"
5365"owner-ding@@hpc.uh.edu")} will generate the following piece of Sieve
5366code if @code{gnus-sieve-crosspost} is @code{nil}. (When
5367@code{gnus-sieve-crosspost} is non-@code{nil}, it looks the same
5368except that the line containing the call to @code{stop} is removed.)
5369
5370@example
5371if address "sender" "owner-ding@@hpc.uh.edu" @{
5372 fileinto "INBOX.ding";
5373 stop;
5374@}
5375@end example
5376
5377@xref{Top, Emacs Sieve, Top, sieve, Emacs Sieve}.
5378
5379@table @kbd
5380
5381@item D g
5382@kindex D g (Group)
5383@findex gnus-sieve-generate
5384@vindex gnus-sieve-file
5385@cindex generating sieve script
5386Regenerate a Sieve script from the @code{sieve} group parameters and
5387put you into the @code{gnus-sieve-file} without saving it.
5388
5389@item D u
5390@kindex D u (Group)
5391@findex gnus-sieve-update
5392@vindex gnus-sieve-file
5393@cindex updating sieve script
5394Regenerates the Gnus managed part of @code{gnus-sieve-file} using the
5395@code{sieve} group parameters, save the file and upload it to the
5396server using the @code{sieveshell} program.
5397
5398@end table
5399
5400
5401@node Summary Buffer
5402@chapter Summary Buffer
5403@cindex summary buffer
5404
5405A line for each article is displayed in the summary buffer. You can
5406move around, read articles, post articles and reply to articles.
5407
5408The most common way to a summary buffer is to select a group from the
5409group buffer (@pxref{Selecting a Group}).
5410
5411You can have as many summary buffers open as you wish.
5412
5413You can customize the Summary Mode tool bar, see @kbd{M-x
5414customize-apropos RET gnus-summary-tool-bar}. This feature is only
5415available in Emacs.
5416
5417@kindex v (Summary)
5418@cindex keys, reserved for users (Summary)
5419The key @kbd{v} is reserved for users. You can bind it to some
5420command or better use it as a prefix key. For example:
5421@lisp
5422(define-key gnus-summary-mode-map (kbd "v -") "LrS") ;; lower subthread
5423@end lisp
5424
5425@menu
5426* Summary Buffer Format:: Deciding how the summary buffer is to look.
5427* Summary Maneuvering:: Moving around the summary buffer.
5428* Choosing Articles:: Reading articles.
5429* Paging the Article:: Scrolling the current article.
5430* Reply Followup and Post:: Posting articles.
5431* Delayed Articles:: Send articles at a later time.
5432* Marking Articles:: Marking articles as read, expirable, etc.
5433* Limiting:: You can limit the summary buffer.
5434* Threading:: How threads are made.
5435* Sorting the Summary Buffer:: How articles and threads are sorted.
5436* Asynchronous Fetching:: Gnus might be able to pre-fetch articles.
5437* Article Caching:: You may store articles in a cache.
5438* Persistent Articles:: Making articles expiry-resistant.
01c52d31 5439* Sticky Articles:: Article buffers that are not reused.
4009494e
GM
5440* Article Backlog:: Having already read articles hang around.
5441* Saving Articles:: Ways of customizing article saving.
5442* Decoding Articles:: Gnus can treat series of (uu)encoded articles.
5443* Article Treatment:: The article buffer can be mangled at will.
5444* MIME Commands:: Doing MIMEy things with the articles.
5445* Charsets:: Character set issues.
5446* Article Commands:: Doing various things with the article buffer.
5447* Summary Sorting:: Sorting the summary buffer in various ways.
5448* Finding the Parent:: No child support? Get the parent.
5449* Alternative Approaches:: Reading using non-default summaries.
5450* Tree Display:: A more visual display of threads.
5451* Mail Group Commands:: Some commands can only be used in mail groups.
5452* Various Summary Stuff:: What didn't fit anywhere else.
5453* Exiting the Summary Buffer:: Returning to the Group buffer,
5454 or reselecting the current group.
5455* Crosspost Handling:: How crossposted articles are dealt with.
5456* Duplicate Suppression:: An alternative when crosspost handling fails.
5457* Security:: Decrypt and Verify.
5458* Mailing List:: Mailing list minor mode.
5459@end menu
5460
5461
5462@node Summary Buffer Format
5463@section Summary Buffer Format
5464@cindex summary buffer format
5465
5466@iftex
5467@iflatex
5468\gnusfigure{The Summary Buffer}{180}{
5469\put(0,0){\epsfig{figure=ps/summary,width=7.5cm}}
5470\put(445,0){\makebox(0,0)[br]{\epsfig{figure=ps/summary-article,width=7.5cm}}}
5471}
5472@end iflatex
5473@end iftex
5474
5475@menu
5476* Summary Buffer Lines:: You can specify how summary lines should look.
5477* To From Newsgroups:: How to not display your own name.
5478* Summary Buffer Mode Line:: You can say how the mode line should look.
5479* Summary Highlighting:: Making the summary buffer all pretty and nice.
5480@end menu
5481
5482@findex mail-extract-address-components
5483@findex gnus-extract-address-components
5484@vindex gnus-extract-address-components
5485Gnus will use the value of the @code{gnus-extract-address-components}
5486variable as a function for getting the name and address parts of a
5487@code{From} header. Two pre-defined functions exist:
5488@code{gnus-extract-address-components}, which is the default, quite
5489fast, and too simplistic solution; and
5490@code{mail-extract-address-components}, which works very nicely, but is
5491slower. The default function will return the wrong answer in 5% of the
5492cases. If this is unacceptable to you, use the other function instead:
5493
5494@lisp
5495(setq gnus-extract-address-components
5496 'mail-extract-address-components)
5497@end lisp
5498
5499@vindex gnus-summary-same-subject
5500@code{gnus-summary-same-subject} is a string indicating that the current
5501article has the same subject as the previous. This string will be used
5502with those specs that require it. The default is @code{""}.
5503
5504
5505@node Summary Buffer Lines
5506@subsection Summary Buffer Lines
5507
5508@vindex gnus-summary-line-format
5509You can change the format of the lines in the summary buffer by changing
5510the @code{gnus-summary-line-format} variable. It works along the same
5511lines as a normal @code{format} string, with some extensions
5512(@pxref{Formatting Variables}).
5513
5514There should always be a colon or a point position marker on the line;
5515the cursor always moves to the point position marker or the colon after
5516performing an operation. (Of course, Gnus wouldn't be Gnus if it wasn't
5517possible to change this. Just write a new function
5518@code{gnus-goto-colon} which does whatever you like with the cursor.)
5519@xref{Positioning Point}.
5520
5521The default string is @samp{%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n}.
5522
5523The following format specification characters and extended format
5524specification(s) are understood:
5525
5526@table @samp
5527@item N
5528Article number.
5529@item S
5530Subject string. List identifiers stripped,
5531@code{gnus-list-identifiers}. @xref{Article Hiding}.
5532@item s
5533Subject if the article is the root of the thread or the previous article
5534had a different subject, @code{gnus-summary-same-subject} otherwise.
5535(@code{gnus-summary-same-subject} defaults to @code{""}.)
5536@item F
5537Full @code{From} header.
5538@item n
5539The name (from the @code{From} header).
5540@item f
5541The name, @code{To} header or the @code{Newsgroups} header (@pxref{To
5542From Newsgroups}).
5543@item a
5544The name (from the @code{From} header). This differs from the @code{n}
5545spec in that it uses the function designated by the
5546@code{gnus-extract-address-components} variable, which is slower, but
5547may be more thorough.
5548@item A
5549The address (from the @code{From} header). This works the same way as
5550the @code{a} spec.
5551@item L
5552Number of lines in the article.
5553@item c
5554Number of characters in the article. This specifier is not supported
5555in some methods (like nnfolder).
5556@item k
5557Pretty-printed version of the number of characters in the article;
5558for example, @samp{1.2k} or @samp{0.4M}.
5559@item I
5560Indentation based on thread level (@pxref{Customizing Threading}).
5561@item B
5562A complex trn-style thread tree, showing response-connecting trace
5563lines. A thread could be drawn like this:
5564
5565@example
5566>
5567+->
5568| +->
5569| | \->
5570| | \->
5571| \->
5572+->
5573\->
5574@end example
5575
5576You can customize the appearance with the following options. Note
5577that it is possible to make the thread display look really neat by
5578replacing the default @acronym{ASCII} characters with graphic
5579line-drawing glyphs.
5580@table @code
5581@item gnus-sum-thread-tree-root
5582@vindex gnus-sum-thread-tree-root
5583Used for the root of a thread. If @code{nil}, use subject
5584instead. The default is @samp{> }.
5585
5586@item gnus-sum-thread-tree-false-root
5587@vindex gnus-sum-thread-tree-false-root
5588Used for the false root of a thread (@pxref{Loose Threads}). If
5589@code{nil}, use subject instead. The default is @samp{> }.
5590
5591@item gnus-sum-thread-tree-single-indent
5592@vindex gnus-sum-thread-tree-single-indent
5593Used for a thread with just one message. If @code{nil}, use subject
5594instead. The default is @samp{}.
5595
5596@item gnus-sum-thread-tree-vertical
5597@vindex gnus-sum-thread-tree-vertical
5598Used for drawing a vertical line. The default is @samp{| }.
5599
5600@item gnus-sum-thread-tree-indent
5601@vindex gnus-sum-thread-tree-indent
5602Used for indenting. The default is @samp{ }.
5603
5604@item gnus-sum-thread-tree-leaf-with-other
5605@vindex gnus-sum-thread-tree-leaf-with-other
5606Used for a leaf with brothers. The default is @samp{+-> }.
5607
5608@item gnus-sum-thread-tree-single-leaf
5609@vindex gnus-sum-thread-tree-single-leaf
5610Used for a leaf without brothers. The default is @samp{\-> }
5611
5612@end table
5613
5614@item T
5615Nothing if the article is a root and lots of spaces if it isn't (it
5616pushes everything after it off the screen).
5617@item [
5618Opening bracket, which is normally @samp{[}, but can also be @samp{<}
5619for adopted articles (@pxref{Customizing Threading}).
5620@item ]
5621Closing bracket, which is normally @samp{]}, but can also be @samp{>}
5622for adopted articles.
5623@item >
5624One space for each thread level.
5625@item <
5626Twenty minus thread level spaces.
5627@item U
5628Unread. @xref{Read Articles}.
5629
5630@item R
5631This misleadingly named specifier is the @dfn{secondary mark}. This
5632mark will say whether the article has been replied to, has been cached,
5633or has been saved. @xref{Other Marks}.
5634
5635@item i
5636Score as a number (@pxref{Scoring}).
5637@item z
5638@vindex gnus-summary-zcore-fuzz
5639Zcore, @samp{+} if above the default level and @samp{-} if below the
5640default level. If the difference between
5641@code{gnus-summary-default-score} and the score is less than
5642@code{gnus-summary-zcore-fuzz}, this spec will not be used.
5643@item V
5644Total thread score.
5645@item x
5646@code{Xref}.
5647@item D
5648@code{Date}.
5649@item d
5650The @code{Date} in @code{DD-MMM} format.
5651@item o
5652The @code{Date} in @var{YYYYMMDD}@code{T}@var{HHMMSS} format.
5653@item M
5654@code{Message-ID}.
5655@item r
5656@code{References}.
5657@item t
5658Number of articles in the current sub-thread. Using this spec will slow
5659down summary buffer generation somewhat.
5660@item e
5661An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the
5662article has any children.
5663@item P
5664The line number.
5665@item O
5666Download mark.
5667@item *
5668Desired cursor position (instead of after first colon).
5669@item &user-date;
5670Age sensitive date format. Various date format is defined in
5671@code{gnus-user-date-format-alist}.
5672@item u
5673User defined specifier. The next character in the format string should
5674be a letter. Gnus will call the function
5675@code{gnus-user-format-function-@var{x}}, where @var{x} is the letter
5676following @samp{%u}. The function will be passed the current header as
5677argument. The function should return a string, which will be inserted
5678into the summary just like information from any other summary specifier.
5679@end table
5680
5681Text between @samp{%(} and @samp{%)} will be highlighted with
5682@code{gnus-mouse-face} when the mouse point is placed inside the area.
5683There can only be one such area.
5684
5685The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs
5686have to be handled with care. For reasons of efficiency, Gnus will
5687compute what column these characters will end up in, and ``hard-code''
5688that. This means that it is invalid to have these specs after a
5689variable-length spec. Well, you might not be arrested, but your summary
5690buffer will look strange, which is bad enough.
5691
5692The smart choice is to have these specs as far to the left as possible.
5693(Isn't that the case with everything, though? But I digress.)
5694
5695This restriction may disappear in later versions of Gnus.
5696
5697
5698@node To From Newsgroups
5699@subsection To From Newsgroups
5700@cindex To
5701@cindex Newsgroups
5702
5703In some groups (particularly in archive groups), the @code{From} header
5704isn't very interesting, since all the articles there are written by
5705you. To display the information in the @code{To} or @code{Newsgroups}
5706headers instead, you need to decide three things: What information to
5707gather; where to display it; and when to display it.
5708
5709@enumerate
5710@item
5711@vindex gnus-extra-headers
5712The reading of extra header information is controlled by the
5713@code{gnus-extra-headers}. This is a list of header symbols. For
5714instance:
5715
5716@lisp
5717(setq gnus-extra-headers
5718 '(To Newsgroups X-Newsreader))
5719@end lisp
5720
5721This will result in Gnus trying to obtain these three headers, and
5722storing it in header structures for later easy retrieval.
5723
5724@item
5725@findex gnus-extra-header
5726The value of these extra headers can be accessed via the
5727@code{gnus-extra-header} function. Here's a format line spec that will
5728access the @code{X-Newsreader} header:
5729
5730@example
5731"%~(form (gnus-extra-header 'X-Newsreader))@@"
5732@end example
5733
5734@item
5735@vindex gnus-ignored-from-addresses
5736The @code{gnus-ignored-from-addresses} variable says when the @samp{%f}
5737summary line spec returns the @code{To}, @code{Newsreader} or
5738@code{From} header. If this regexp matches the contents of the
5739@code{From} header, the value of the @code{To} or @code{Newsreader}
5740headers are used instead.
5741
01c52d31
MB
5742To distinguish regular articles from those where the @code{From} field
5743has been swapped, a string is prefixed to the @code{To} or
5744@code{Newsgroups} header in the summary line. By default the string is
5745@samp{-> } for @code{To} and @samp{=> } for @code{Newsgroups}, you can
5746customize these strings with @code{gnus-summary-to-prefix} and
5747@code{gnus-summary-newsgroup-prefix}.
5748
4009494e
GM
5749@end enumerate
5750
5751@vindex nnmail-extra-headers
5752A related variable is @code{nnmail-extra-headers}, which controls when
5753to include extra headers when generating overview (@acronym{NOV}) files.
5754If you have old overview files, you should regenerate them after
5755changing this variable, by entering the server buffer using @kbd{^},
5756and then @kbd{g} on the appropriate mail server (e.g. nnml) to cause
5757regeneration.
5758
5759@vindex gnus-summary-line-format
5760You also have to instruct Gnus to display the data by changing the
5761@code{%n} spec to the @code{%f} spec in the
5762@code{gnus-summary-line-format} variable.
5763
5764In summary, you'd typically put something like the following in
5765@file{~/.gnus.el}:
5766
5767@lisp
5768(setq gnus-extra-headers
5769 '(To Newsgroups))
5770(setq nnmail-extra-headers gnus-extra-headers)
5771(setq gnus-summary-line-format
5772 "%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n")
5773(setq gnus-ignored-from-addresses
5774 "Your Name Here")
5775@end lisp
5776
5777(The values listed above are the default values in Gnus. Alter them
5778to fit your needs.)
5779
5780A note for news server administrators, or for users who wish to try to
5781convince their news server administrator to provide some additional
5782support:
5783
5784The above is mostly useful for mail groups, where you have control over
5785the @acronym{NOV} files that are created. However, if you can persuade your
5786nntp admin to add (in the usual implementation, notably INN):
5787
5788@example
5789Newsgroups:full
5790@end example
5791
5792to the end of her @file{overview.fmt} file, then you can use that just
5793as you would the extra headers from the mail groups.
5794
5795
5796@node Summary Buffer Mode Line
5797@subsection Summary Buffer Mode Line
5798
5799@vindex gnus-summary-mode-line-format
5800You can also change the format of the summary mode bar (@pxref{Mode Line
5801Formatting}). Set @code{gnus-summary-mode-line-format} to whatever you
5802like. The default is @samp{Gnus: %%b [%A] %Z}.
5803
5804Here are the elements you can play with:
5805
5806@table @samp
5807@item G
5808Group name.
5809@item p
5810Unprefixed group name.
5811@item A
5812Current article number.
5813@item z
5814Current article score.
5815@item V
5816Gnus version.
5817@item U
5818Number of unread articles in this group.
5819@item e
5820Number of unread articles in this group that aren't displayed in the
5821summary buffer.
5822@item Z
5823A string with the number of unread and unselected articles represented
5824either as @samp{<%U(+%e) more>} if there are both unread and unselected
5825articles, and just as @samp{<%U more>} if there are just unread articles
5826and no unselected ones.
5827@item g
5828Shortish group name. For instance, @samp{rec.arts.anime} will be
5829shortened to @samp{r.a.anime}.
5830@item S
5831Subject of the current article.
5832@item u
5833User-defined spec (@pxref{User-Defined Specs}).
5834@item s
5835Name of the current score file (@pxref{Scoring}).
5836@item d
5837Number of dormant articles (@pxref{Unread Articles}).
5838@item t
5839Number of ticked articles (@pxref{Unread Articles}).
5840@item r
5841Number of articles that have been marked as read in this session.
5842@item E
5843Number of articles expunged by the score files.
5844@end table
5845
5846
5847@node Summary Highlighting
5848@subsection Summary Highlighting
5849
5850@table @code
5851
5852@item gnus-visual-mark-article-hook
5853@vindex gnus-visual-mark-article-hook
5854This hook is run after selecting an article. It is meant to be used for
5855highlighting the article in some way. It is not run if
5856@code{gnus-visual} is @code{nil}.
5857
5858@item gnus-summary-update-hook
5859@vindex gnus-summary-update-hook
5860This hook is called when a summary line is changed. It is not run if
5861@code{gnus-visual} is @code{nil}.
5862
5863@item gnus-summary-selected-face
5864@vindex gnus-summary-selected-face
5865This is the face (or @dfn{font} as some people call it) used to
5866highlight the current article in the summary buffer.
5867
5868@item gnus-summary-highlight
5869@vindex gnus-summary-highlight
5870Summary lines are highlighted according to this variable, which is a
5871list where the elements are of the format @code{(@var{form}
5872. @var{face})}. If you would, for instance, like ticked articles to be
5873italic and high-scored articles to be bold, you could set this variable
5874to something like
5875@lisp
5876(((eq mark gnus-ticked-mark) . italic)
5877 ((> score default) . bold))
5878@end lisp
5879As you may have guessed, if @var{form} returns a non-@code{nil} value,
5880@var{face} will be applied to the line.
5881@end table
5882
5883
5884@node Summary Maneuvering
5885@section Summary Maneuvering
5886@cindex summary movement
5887
5888All the straight movement commands understand the numeric prefix and
5889behave pretty much as you'd expect.
5890
5891None of these commands select articles.
5892
5893@table @kbd
5894@item G M-n
5895@itemx M-n
5896@kindex M-n (Summary)
5897@kindex G M-n (Summary)
5898@findex gnus-summary-next-unread-subject
5899Go to the next summary line of an unread article
5900(@code{gnus-summary-next-unread-subject}).
5901
5902@item G M-p
5903@itemx M-p
5904@kindex M-p (Summary)
5905@kindex G M-p (Summary)
5906@findex gnus-summary-prev-unread-subject
5907Go to the previous summary line of an unread article
5908(@code{gnus-summary-prev-unread-subject}).
5909
5910@item G g
5911@kindex G g (Summary)
5912@findex gnus-summary-goto-subject
5913Ask for an article number and then go to the summary line of that article
5914without displaying the article (@code{gnus-summary-goto-subject}).
5915@end table
5916
5917If Gnus asks you to press a key to confirm going to the next group, you
5918can use the @kbd{C-n} and @kbd{C-p} keys to move around the group
5919buffer, searching for the next group to read without actually returning
5920to the group buffer.
5921
5922Variables related to summary movement:
5923
5924@table @code
5925
5926@vindex gnus-auto-select-next
5927@item gnus-auto-select-next
5928If you issue one of the movement commands (like @kbd{n}) and there are
5929no more unread articles after the current one, Gnus will offer to go to
5930the next group. If this variable is @code{t} and the next group is
5931empty, Gnus will exit summary mode and return to the group buffer. If
5932this variable is neither @code{t} nor @code{nil}, Gnus will select the
5933next group with unread articles. As a special case, if this variable
5934is @code{quietly}, Gnus will select the next group without asking for
5935confirmation. If this variable is @code{almost-quietly}, the same
5936will happen only if you are located on the last article in the group.
5937Finally, if this variable is @code{slightly-quietly}, the @kbd{Z n}
5938command will go to the next group without confirmation. Also
5939@pxref{Group Levels}.
5940
5941@item gnus-auto-select-same
5942@vindex gnus-auto-select-same
5943If non-@code{nil}, all the movement commands will try to go to the next
5944article with the same subject as the current. (@dfn{Same} here might
5945mean @dfn{roughly equal}. See @code{gnus-summary-gather-subject-limit}
5946for details (@pxref{Customizing Threading}).) If there are no more
5947articles with the same subject, go to the first unread article.
5948
5949This variable is not particularly useful if you use a threaded display.
5950
5951@item gnus-summary-check-current
5952@vindex gnus-summary-check-current
5953If non-@code{nil}, all the ``unread'' movement commands will not proceed
5954to the next (or previous) article if the current article is unread.
5955Instead, they will choose the current article.
5956
5957@item gnus-auto-center-summary
5958@vindex gnus-auto-center-summary
5959If non-@code{nil}, Gnus will keep the point in the summary buffer
5960centered at all times. This makes things quite tidy, but if you have a
5961slow network connection, or simply do not like this un-Emacsism, you can
5962set this variable to @code{nil} to get the normal Emacs scrolling
5963action. This will also inhibit horizontal re-centering of the summary
5964buffer, which might make it more inconvenient to read extremely long
5965threads.
5966
5967This variable can also be a number. In that case, center the window at
5968the given number of lines from the top.
5969
85115796
KY
5970@item gnus-summary-stop-at-end-of-message
5971@vindex gnus-summary-stop-at-end-of-message
5972If non-@code{nil}, don't go to the next article when hitting
5973@kbd{SPC}, and you're at the end of the article.
5974
4009494e
GM
5975@end table
5976
5977
5978@node Choosing Articles
5979@section Choosing Articles
5980@cindex selecting articles
5981
5982@menu
5983* Choosing Commands:: Commands for choosing articles.
5984* Choosing Variables:: Variables that influence these commands.
5985@end menu
5986
5987
5988@node Choosing Commands
5989@subsection Choosing Commands
5990
5991None of the following movement commands understand the numeric prefix,
5992and they all select and display an article.
5993
5994If you want to fetch new articles or redisplay the group, see
5995@ref{Exiting the Summary Buffer}.
5996
5997@table @kbd
5998@item SPACE
5999@kindex SPACE (Summary)
6000@findex gnus-summary-next-page
6001Select the current article, or, if that one's read already, the next
6002unread article (@code{gnus-summary-next-page}).
6003
6004If you have an article window open already and you press @kbd{SPACE}
6005again, the article will be scrolled. This lets you conveniently
6006@kbd{SPACE} through an entire newsgroup. @xref{Paging the Article}.
6007
6008@item G n
6009@itemx n
6010@kindex n (Summary)
6011@kindex G n (Summary)
6012@findex gnus-summary-next-unread-article
6013@c @icon{gnus-summary-next-unread}
6014Go to next unread article (@code{gnus-summary-next-unread-article}).
6015
6016@item G p
6017@itemx p
6018@kindex p (Summary)
6019@findex gnus-summary-prev-unread-article
6020@c @icon{gnus-summary-prev-unread}
6021Go to previous unread article (@code{gnus-summary-prev-unread-article}).
6022
6023@item G N
6024@itemx N
6025@kindex N (Summary)
6026@kindex G N (Summary)
6027@findex gnus-summary-next-article
6028Go to the next article (@code{gnus-summary-next-article}).
6029
6030@item G P
6031@itemx P
6032@kindex P (Summary)
6033@kindex G P (Summary)
6034@findex gnus-summary-prev-article
6035Go to the previous article (@code{gnus-summary-prev-article}).
6036
6037@item G C-n
6038@kindex G C-n (Summary)
6039@findex gnus-summary-next-same-subject
6040Go to the next article with the same subject
6041(@code{gnus-summary-next-same-subject}).
6042
6043@item G C-p
6044@kindex G C-p (Summary)
6045@findex gnus-summary-prev-same-subject
6046Go to the previous article with the same subject
6047(@code{gnus-summary-prev-same-subject}).
6048
6049@item G f
6050@itemx .
6051@kindex G f (Summary)
6052@kindex . (Summary)
6053@findex gnus-summary-first-unread-article
6054Go to the first unread article
6055(@code{gnus-summary-first-unread-article}).
6056
6057@item G b
6058@itemx ,
6059@kindex G b (Summary)
6060@kindex , (Summary)
6061@findex gnus-summary-best-unread-article
6062Go to the unread article with the highest score
6063(@code{gnus-summary-best-unread-article}). If given a prefix argument,
6064go to the first unread article that has a score over the default score.
6065
6066@item G l
6067@itemx l
6068@kindex l (Summary)
6069@kindex G l (Summary)
6070@findex gnus-summary-goto-last-article
6071Go to the previous article read (@code{gnus-summary-goto-last-article}).
6072
6073@item G o
6074@kindex G o (Summary)
6075@findex gnus-summary-pop-article
6076@cindex history
6077@cindex article history
6078Pop an article off the summary history and go to this article
6079(@code{gnus-summary-pop-article}). This command differs from the
6080command above in that you can pop as many previous articles off the
6081history as you like, while @kbd{l} toggles the two last read articles.
6082For a somewhat related issue (if you use these commands a lot),
6083@pxref{Article Backlog}.
6084
6085@item G j
6086@itemx j
6087@kindex j (Summary)
6088@kindex G j (Summary)
6089@findex gnus-summary-goto-article
6090Ask for an article number or @code{Message-ID}, and then go to that
6091article (@code{gnus-summary-goto-article}).
6092
6093@end table
6094
6095
6096@node Choosing Variables
6097@subsection Choosing Variables
6098
6099Some variables relevant for moving and selecting articles:
6100
6101@table @code
6102@item gnus-auto-extend-newsgroup
6103@vindex gnus-auto-extend-newsgroup
6104All the movement commands will try to go to the previous (or next)
6105article, even if that article isn't displayed in the Summary buffer if
6106this variable is non-@code{nil}. Gnus will then fetch the article from
6107the server and display it in the article buffer.
6108
6109@item gnus-select-article-hook
6110@vindex gnus-select-article-hook
6111This hook is called whenever an article is selected. The default is
6112@code{nil}. If you would like each article to be saved in the Agent as
6113you read it, putting @code{gnus-agent-fetch-selected-article} on this
6114hook will do so.
6115
6116@item gnus-mark-article-hook
6117@vindex gnus-mark-article-hook
6118@findex gnus-summary-mark-unread-as-read
6119@findex gnus-summary-mark-read-and-unread-as-read
6120@findex gnus-unread-mark
6121This hook is called whenever an article is selected. It is intended to
6122be used for marking articles as read. The default value is
6123@code{gnus-summary-mark-read-and-unread-as-read}, and will change the
6124mark of almost any article you read to @code{gnus-read-mark}. The only
6125articles not affected by this function are ticked, dormant, and
6126expirable articles. If you'd instead like to just have unread articles
6127marked as read, you can use @code{gnus-summary-mark-unread-as-read}
6128instead. It will leave marks like @code{gnus-low-score-mark},
6129@code{gnus-del-mark} (and so on) alone.
6130
6131@end table
6132
6133
6134@node Paging the Article
6135@section Scrolling the Article
6136@cindex article scrolling
6137
6138@table @kbd
6139
6140@item SPACE
6141@kindex SPACE (Summary)
6142@findex gnus-summary-next-page
6143Pressing @kbd{SPACE} will scroll the current article forward one page,
6144or, if you have come to the end of the current article, will choose the
6145next article (@code{gnus-summary-next-page}).
6146
6147@vindex gnus-article-boring-faces
6148@vindex gnus-article-skip-boring
6149If @code{gnus-article-skip-boring} is non-@code{nil} and the rest of
6150the article consists only of citations and signature, then it will be
6151skipped; the next article will be shown instead. You can customize
6152what is considered uninteresting with
6153@code{gnus-article-boring-faces}. You can manually view the article's
6154pages, no matter how boring, using @kbd{C-M-v}.
6155
6156@item DEL
6157@kindex DEL (Summary)
6158@findex gnus-summary-prev-page
6159Scroll the current article back one page (@code{gnus-summary-prev-page}).
6160
6161@item RET
6162@kindex RET (Summary)
6163@findex gnus-summary-scroll-up
6164Scroll the current article one line forward
6165(@code{gnus-summary-scroll-up}).
6166
6167@item M-RET
6168@kindex M-RET (Summary)
6169@findex gnus-summary-scroll-down
6170Scroll the current article one line backward
6171(@code{gnus-summary-scroll-down}).
6172
6173@item A g
6174@itemx g
6175@kindex A g (Summary)
6176@kindex g (Summary)
6177@findex gnus-summary-show-article
6178@vindex gnus-summary-show-article-charset-alist
6179(Re)fetch the current article (@code{gnus-summary-show-article}). If
6180given a prefix, fetch the current article, but don't run any of the
6181article treatment functions. This will give you a ``raw'' article, just
6182the way it came from the server.
6183
e3e955fe 6184@cindex charset, view article with different charset
4009494e
GM
6185If given a numerical prefix, you can do semi-manual charset stuff.
6186@kbd{C-u 0 g cn-gb-2312 RET} will decode the message as if it were
6187encoded in the @code{cn-gb-2312} charset. If you have
6188
6189@lisp
6190(setq gnus-summary-show-article-charset-alist
6191 '((1 . cn-gb-2312)
6192 (2 . big5)))
6193@end lisp
6194
6195then you can say @kbd{C-u 1 g} to get the same effect.
6196
6197@item A <
6198@itemx <
6199@kindex < (Summary)
6200@kindex A < (Summary)
6201@findex gnus-summary-beginning-of-article
6202Scroll to the beginning of the article
6203(@code{gnus-summary-beginning-of-article}).
6204
6205@item A >
6206@itemx >
6207@kindex > (Summary)
6208@kindex A > (Summary)
6209@findex gnus-summary-end-of-article
6210Scroll to the end of the article (@code{gnus-summary-end-of-article}).
6211
6212@item A s
6213@itemx s
6214@kindex A s (Summary)
6215@kindex s (Summary)
6216@findex gnus-summary-isearch-article
6217Perform an isearch in the article buffer
6218(@code{gnus-summary-isearch-article}).
6219
6220@item h
6221@kindex h (Summary)
6222@findex gnus-summary-select-article-buffer
6223Select the article buffer (@code{gnus-summary-select-article-buffer}).
6224
6225@end table
6226
6227
6228@node Reply Followup and Post
6229@section Reply, Followup and Post
6230
6231@menu
6232* Summary Mail Commands:: Sending mail.
6233* Summary Post Commands:: Sending news.
6234* Summary Message Commands:: Other Message-related commands.
6235* Canceling and Superseding::
6236@end menu
6237
6238
6239@node Summary Mail Commands
6240@subsection Summary Mail Commands
6241@cindex mail
6242@cindex composing mail
6243
6244Commands for composing a mail message:
6245
6246@table @kbd
6247
6248@item S r
6249@itemx r
6250@kindex S r (Summary)
6251@kindex r (Summary)
6252@findex gnus-summary-reply
6253@c @icon{gnus-summary-mail-reply}
6254@c @icon{gnus-summary-reply}
6255Mail a reply to the author of the current article
6256(@code{gnus-summary-reply}).
6257
6258@item S R
6259@itemx R
6260@kindex R (Summary)
6261@kindex S R (Summary)
6262@findex gnus-summary-reply-with-original
6263@c @icon{gnus-summary-reply-with-original}
6264Mail a reply to the author of the current article and include the
6265original message (@code{gnus-summary-reply-with-original}). This
6266command uses the process/prefix convention.
6267
6268@item S w
6269@kindex S w (Summary)
6270@findex gnus-summary-wide-reply
6271Mail a wide reply to the author of the current article
6272(@code{gnus-summary-wide-reply}). A @dfn{wide reply} is a reply that
6273goes out to all people listed in the @code{To}, @code{From} (or
6274@code{Reply-to}) and @code{Cc} headers. If @code{Mail-Followup-To} is
6275present, that's used instead.
6276
6277@item S W
6278@kindex S W (Summary)
6279@findex gnus-summary-wide-reply-with-original
6280Mail a wide reply to the current article and include the original
6281message (@code{gnus-summary-wide-reply-with-original}). This command uses
b0e4f3fc
KY
6282the process/prefix convention, but only uses the headers from the
6283first article to determine the recipients.
4009494e
GM
6284
6285@item S v
6286@kindex S v (Summary)
6287@findex gnus-summary-very-wide-reply
6288Mail a very wide reply to the author of the current article
6289(@code{gnus-summary-wide-reply}). A @dfn{very wide reply} is a reply
6290that goes out to all people listed in the @code{To}, @code{From} (or
6291@code{Reply-to}) and @code{Cc} headers in all the process/prefixed
6292articles. This command uses the process/prefix convention.
6293
6294@item S V
6295@kindex S V (Summary)
6296@findex gnus-summary-very-wide-reply-with-original
6297Mail a very wide reply to the author of the current article and include the
6298original message (@code{gnus-summary-very-wide-reply-with-original}). This
6299command uses the process/prefix convention.
6300
6301@item S B r
6302@kindex S B r (Summary)
6303@findex gnus-summary-reply-broken-reply-to
6304Mail a reply to the author of the current article but ignore the
6305@code{Reply-To} field (@code{gnus-summary-reply-broken-reply-to}).
6306If you need this because a mailing list incorrectly sets a
6307@code{Reply-To} header pointing to the list, you probably want to set
6308the @code{broken-reply-to} group parameter instead, so things will work
6309correctly. @xref{Group Parameters}.
6310
6311@item S B R
6312@kindex S B R (Summary)
6313@findex gnus-summary-reply-broken-reply-to-with-original
6314Mail a reply to the author of the current article and include the
6315original message but ignore the @code{Reply-To} field
6316(@code{gnus-summary-reply-broken-reply-to-with-original}).
6317
6318@item S o m
6319@itemx C-c C-f
6320@kindex S o m (Summary)
6321@kindex C-c C-f (Summary)
6322@findex gnus-summary-mail-forward
6323@c @icon{gnus-summary-mail-forward}
6324Forward the current article to some other person
6325(@code{gnus-summary-mail-forward}). If no prefix is given, the message
6326is forwarded according to the value of (@code{message-forward-as-mime})
6327and (@code{message-forward-show-mml}); if the prefix is 1, decode the
6328message and forward directly inline; if the prefix is 2, forward message
6329as an rfc822 @acronym{MIME} section; if the prefix is 3, decode message and
6330forward as an rfc822 @acronym{MIME} section; if the prefix is 4, forward message
6331directly inline; otherwise, the message is forwarded as no prefix given
6332but use the flipped value of (@code{message-forward-as-mime}). By
6333default, the message is decoded and forwarded as an rfc822 @acronym{MIME}
6334section.
6335
6336@item S m
6337@itemx m
6338@kindex m (Summary)
6339@kindex S m (Summary)
6340@findex gnus-summary-mail-other-window
6341@c @icon{gnus-summary-mail-originate}
6342Prepare a mail (@code{gnus-summary-mail-other-window}). By default, use
6343the posting style of the current group. If given a prefix, disable that.
6344If the prefix is 1, prompt for a group name to find the posting style.
6345
6346@item S i
4009494e
GM
6347@kindex S i (Summary)
6348@findex gnus-summary-news-other-window
6349Prepare a news (@code{gnus-summary-news-other-window}). By default,
6350post to the current group. If given a prefix, disable that. If the
6351prefix is 1, prompt for a group to post to.
6352
6353This function actually prepares a news even when using mail groups.
6354This is useful for ``posting'' messages to mail groups without actually
6355sending them over the network: they're just saved directly to the group
6356in question. The corresponding back end must have a request-post method
6357for this to work though.
6358
6359@item S D b
6360@kindex S D b (Summary)
6361@findex gnus-summary-resend-bounced-mail
6362@cindex bouncing mail
6363If you have sent a mail, but the mail was bounced back to you for some
6364reason (wrong address, transient failure), you can use this command to
6365resend that bounced mail (@code{gnus-summary-resend-bounced-mail}). You
6366will be popped into a mail buffer where you can edit the headers before
6367sending the mail off again. If you give a prefix to this command, and
6368the bounced mail is a reply to some other mail, Gnus will try to fetch
6369that mail and display it for easy perusal of its headers. This might
6370very well fail, though.
6371
6372@item S D r
6373@kindex S D r (Summary)
6374@findex gnus-summary-resend-message
6375Not to be confused with the previous command,
6376@code{gnus-summary-resend-message} will prompt you for an address to
6377send the current message off to, and then send it to that place. The
6378headers of the message won't be altered---but lots of headers that say
6379@code{Resent-To}, @code{Resent-From} and so on will be added. This
6380means that you actually send a mail to someone that has a @code{To}
6381header that (probably) points to yourself. This will confuse people.
6382So, natcherly you'll only do that if you're really eVIl.
6383
6384This command is mainly used if you have several accounts and want to
6385ship a mail to a different account of yours. (If you're both
6386@code{root} and @code{postmaster} and get a mail for @code{postmaster}
6387to the @code{root} account, you may want to resend it to
6388@code{postmaster}. Ordnung muss sein!
6389
6390This command understands the process/prefix convention
6391(@pxref{Process/Prefix}).
6392
6393@item S D e
6394@kindex S D e (Summary)
6395@findex gnus-summary-resend-message-edit
6396
6397Like the previous command, but will allow you to edit the message as
6398if it were a new message before resending.
6399
6400@item S O m
6401@kindex S O m (Summary)
6402@findex gnus-uu-digest-mail-forward
6403Digest the current series (@pxref{Decoding Articles}) and forward the
6404result using mail (@code{gnus-uu-digest-mail-forward}). This command
6405uses the process/prefix convention (@pxref{Process/Prefix}).
6406
6407@item S M-c
6408@kindex S M-c (Summary)
6409@findex gnus-summary-mail-crosspost-complaint
6410@cindex crossposting
6411@cindex excessive crossposting
6412Send a complaint about excessive crossposting to the author of the
6413current article (@code{gnus-summary-mail-crosspost-complaint}).
6414
6415@findex gnus-crosspost-complaint
6416This command is provided as a way to fight back against the current
6417crossposting pandemic that's sweeping Usenet. It will compose a reply
6418using the @code{gnus-crosspost-complaint} variable as a preamble. This
6419command understands the process/prefix convention
6420(@pxref{Process/Prefix}) and will prompt you before sending each mail.
6421
6422@end table
6423
6424Also @xref{Header Commands, ,Header Commands, message, The Message
6425Manual}, for more information.
6426
6427
6428@node Summary Post Commands
6429@subsection Summary Post Commands
6430@cindex post
6431@cindex composing news
6432
6433Commands for posting a news article:
6434
6435@table @kbd
6436@item S p
6437@itemx a
6438@kindex a (Summary)
6439@kindex S p (Summary)
6440@findex gnus-summary-post-news
6441@c @icon{gnus-summary-post-news}
6442Prepare for posting an article (@code{gnus-summary-post-news}). By
6443default, post to the current group. If given a prefix, disable that.
6444If the prefix is 1, prompt for another group instead.
6445
6446@item S f
6447@itemx f
6448@kindex f (Summary)
6449@kindex S f (Summary)
6450@findex gnus-summary-followup
6451@c @icon{gnus-summary-followup}
6452Post a followup to the current article (@code{gnus-summary-followup}).
6453
6454@item S F
6455@itemx F
6456@kindex S F (Summary)
6457@kindex F (Summary)
6458@c @icon{gnus-summary-followup-with-original}
6459@findex gnus-summary-followup-with-original
6460Post a followup to the current article and include the original message
6461(@code{gnus-summary-followup-with-original}). This command uses the
6462process/prefix convention.
6463
6464@item S n
6465@kindex S n (Summary)
6466@findex gnus-summary-followup-to-mail
6467Post a followup to the current article via news, even if you got the
6468message through mail (@code{gnus-summary-followup-to-mail}).
6469
6470@item S N
6471@kindex S N (Summary)
6472@findex gnus-summary-followup-to-mail-with-original
6473Post a followup to the current article via news, even if you got the
6474message through mail and include the original message
6475(@code{gnus-summary-followup-to-mail-with-original}). This command uses
6476the process/prefix convention.
6477
6478@item S o p
6479@kindex S o p (Summary)
6480@findex gnus-summary-post-forward
6481Forward the current article to a newsgroup
6482(@code{gnus-summary-post-forward}).
6483 If no prefix is given, the message is forwarded according to the value
6484of (@code{message-forward-as-mime}) and
6485(@code{message-forward-show-mml}); if the prefix is 1, decode the
6486message and forward directly inline; if the prefix is 2, forward message
6487as an rfc822 @acronym{MIME} section; if the prefix is 3, decode message and
6488forward as an rfc822 @acronym{MIME} section; if the prefix is 4, forward message
6489directly inline; otherwise, the message is forwarded as no prefix given
6490but use the flipped value of (@code{message-forward-as-mime}). By
6491default, the message is decoded and forwarded as an rfc822 @acronym{MIME} section.
6492
6493@item S O p
6494@kindex S O p (Summary)
6495@findex gnus-uu-digest-post-forward
6496@cindex digests
6497@cindex making digests
6498Digest the current series and forward the result to a newsgroup
6499(@code{gnus-uu-digest-post-forward}). This command uses the
6500process/prefix convention.
6501
6502@item S u
6503@kindex S u (Summary)
6504@findex gnus-uu-post-news
6505@c @icon{gnus-uu-post-news}
6506Uuencode a file, split it into parts, and post it as a series
6507(@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}).
6508@end table
6509
6510Also @xref{Header Commands, ,Header Commands, message, The Message
6511Manual}, for more information.
6512
6513
6514@node Summary Message Commands
6515@subsection Summary Message Commands
6516
6517@table @kbd
6518@item S y
6519@kindex S y (Summary)
6520@findex gnus-summary-yank-message
6521Yank the current article into an already existing Message composition
6522buffer (@code{gnus-summary-yank-message}). This command prompts for
6523what message buffer you want to yank into, and understands the
6524process/prefix convention (@pxref{Process/Prefix}).
6525
6526@end table
6527
6528
6529@node Canceling and Superseding
6530@subsection Canceling Articles
6531@cindex canceling articles
6532@cindex superseding articles
6533
6534Have you ever written something, and then decided that you really,
6535really, really wish you hadn't posted that?
6536
6537Well, you can't cancel mail, but you can cancel posts.
6538
6539@findex gnus-summary-cancel-article
6540@kindex C (Summary)
6541@c @icon{gnus-summary-cancel-article}
6542Find the article you wish to cancel (you can only cancel your own
6543articles, so don't try any funny stuff). Then press @kbd{C} or @kbd{S
6544c} (@code{gnus-summary-cancel-article}). Your article will be
6545canceled---machines all over the world will be deleting your article.
6546This command uses the process/prefix convention (@pxref{Process/Prefix}).
6547
6548Be aware, however, that not all sites honor cancels, so your article may
6549live on here and there, while most sites will delete the article in
6550question.
6551
6552Gnus will use the ``current'' select method when canceling. If you
6553want to use the standard posting method, use the @samp{a} symbolic
6554prefix (@pxref{Symbolic Prefixes}).
6555
6556Gnus ensures that only you can cancel your own messages using a
6557@code{Cancel-Lock} header (@pxref{Canceling News, Canceling News, ,
6558message, Message Manual}).
6559
6560If you discover that you have made some mistakes and want to do some
6561corrections, you can post a @dfn{superseding} article that will replace
6562your original article.
6563
6564@findex gnus-summary-supersede-article
6565@kindex S (Summary)
6566Go to the original article and press @kbd{S s}
6567(@code{gnus-summary-supersede-article}). You will be put in a buffer
6568where you can edit the article all you want before sending it off the
6569usual way.
6570
6571The same goes for superseding as for canceling, only more so: Some
6572sites do not honor superseding. On those sites, it will appear that you
6573have posted almost the same article twice.
6574
6575If you have just posted the article, and change your mind right away,
6576there is a trick you can use to cancel/supersede the article without
6577waiting for the article to appear on your site first. You simply return
6578to the post buffer (which is called @code{*sent ...*}). There you will
6579find the article you just posted, with all the headers intact. Change
6580the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes}
6581header by substituting one of those words for the word
6582@code{Message-ID}. Then just press @kbd{C-c C-c} to send the article as
6583you would do normally. The previous article will be
6584canceled/superseded.
6585
6586Just remember, kids: There is no 'c' in 'supersede'.
6587
6588@node Delayed Articles
6589@section Delayed Articles
6590@cindex delayed sending
6591@cindex send delayed
6592
6593Sometimes, you might wish to delay the sending of a message. For
6594example, you might wish to arrange for a message to turn up just in time
6595to remind your about the birthday of your Significant Other. For this,
6596there is the @code{gnus-delay} package. Setup is simple:
6597
6598@lisp
6599(gnus-delay-initialize)
6600@end lisp
6601
6602@findex gnus-delay-article
6603Normally, to send a message you use the @kbd{C-c C-c} command from
6604Message mode. To delay a message, use @kbd{C-c C-j}
6605(@code{gnus-delay-article}) instead. This will ask you for how long the
6606message should be delayed. Possible answers are:
6607
6608@itemize @bullet
6609@item
6610A time span. Consists of an integer and a letter. For example,
6611@code{42d} means to delay for 42 days. Available letters are @code{m}
6612(minutes), @code{h} (hours), @code{d} (days), @code{w} (weeks), @code{M}
6613(months) and @code{Y} (years).
6614
6615@item
6616A specific date. Looks like @code{YYYY-MM-DD}. The message will be
6617delayed until that day, at a specific time (eight o'clock by default).
6618See also @code{gnus-delay-default-hour}.
6619
6620@item
6621A specific time of day. Given in @code{hh:mm} format, 24h, no am/pm
6622stuff. The deadline will be at that time today, except if that time has
6623already passed, then it's at the given time tomorrow. So if it's ten
6624o'clock in the morning and you specify @code{11:15}, then the deadline
6625is one hour and fifteen minutes hence. But if you specify @code{9:20},
6626that means a time tomorrow.
6627@end itemize
6628
6629The action of the @code{gnus-delay-article} command is influenced by a
6630couple of variables:
6631
6632@table @code
6633@item gnus-delay-default-hour
6634@vindex gnus-delay-default-hour
6635When you specify a specific date, the message will be due on that hour
6636on the given date. Possible values are integers 0 through 23.
6637
6638@item gnus-delay-default-delay
6639@vindex gnus-delay-default-delay
6640This is a string and gives the default delay. It can be of any of the
6641formats described above.
6642
6643@item gnus-delay-group
6644@vindex gnus-delay-group
6645Delayed articles will be kept in this group on the drafts server until
6646they are due. You probably don't need to change this. The default
6647value is @code{"delayed"}.
6648
6649@item gnus-delay-header
6650@vindex gnus-delay-header
6651The deadline for each article will be stored in a header. This variable
6652is a string and gives the header name. You probably don't need to
6653change this. The default value is @code{"X-Gnus-Delayed"}.
6654@end table
6655
6656The way delaying works is like this: when you use the
6657@code{gnus-delay-article} command, you give a certain delay. Gnus
6658calculates the deadline of the message and stores it in the
6659@code{X-Gnus-Delayed} header and puts the message in the
6660@code{nndraft:delayed} group.
6661
6662@findex gnus-delay-send-queue
6663And whenever you get new news, Gnus looks through the group for articles
6664which are due and sends them. It uses the @code{gnus-delay-send-queue}
6665function for this. By default, this function is added to the hook
6666@code{gnus-get-new-news-hook}. But of course, you can change this.
6667Maybe you want to use the demon to send drafts? Just tell the demon to
6668execute the @code{gnus-delay-send-queue} function.
6669
6670@table @code
6671@item gnus-delay-initialize
6672@findex gnus-delay-initialize
6673By default, this function installs @code{gnus-delay-send-queue} in
6674@code{gnus-get-new-news-hook}. But it accepts the optional second
6675argument @code{no-check}. If it is non-@code{nil},
6676@code{gnus-get-new-news-hook} is not changed. The optional first
6677argument is ignored.
6678
6679For example, @code{(gnus-delay-initialize nil t)} means to do nothing.
6680Presumably, you want to use the demon for sending due delayed articles.
6681Just don't forget to set that up :-)
6682@end table
6683
e7842e69
KY
6684When delaying an article with @kbd{C-c C-j}, Message mode will
6685automatically add a @code{"Date"} header with the current time. In
6686many cases you probably want the @code{"Date"} header to reflect the
6687time the message is sent instead. To do this, you have to delete
6688@code{Date} from @code{message-draft-headers}.
6689
4009494e
GM
6690
6691@node Marking Articles
6692@section Marking Articles
6693@cindex article marking
6694@cindex article ticking
6695@cindex marks
6696
6697There are several marks you can set on an article.
6698
6699You have marks that decide the @dfn{readedness} (whoo, neato-keano
6700neologism ohoy!) of the article. Alphabetic marks generally mean
6701@dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.
6702
6703In addition, you also have marks that do not affect readedness.
6704
6705@ifinfo
6706There's a plethora of commands for manipulating these marks.
6707@end ifinfo
6708
6709@menu
6710* Unread Articles:: Marks for unread articles.
6711* Read Articles:: Marks for read articles.
6712* Other Marks:: Marks that do not affect readedness.
6713* Setting Marks:: How to set and remove marks.
6714* Generic Marking Commands:: How to customize the marking.
6715* Setting Process Marks:: How to mark articles for later processing.
6716@end menu
6717
6718
6719@node Unread Articles
6720@subsection Unread Articles
6721
6722The following marks mark articles as (kinda) unread, in one form or
6723other.
6724
6725@table @samp
6726@item !
6727@vindex gnus-ticked-mark
6728Marked as ticked (@code{gnus-ticked-mark}).
6729
6730@dfn{Ticked articles} are articles that will remain visible always. If
6731you see an article that you find interesting, or you want to put off
6732reading it, or replying to it, until sometime later, you'd typically
6733tick it. However, articles can be expired (from news servers by the
6734news server software, Gnus itself never expires ticked messages), so if
6735you want to keep an article forever, you'll have to make it persistent
6736(@pxref{Persistent Articles}).
6737
6738@item ?
6739@vindex gnus-dormant-mark
6740Marked as dormant (@code{gnus-dormant-mark}).
6741
6742@dfn{Dormant articles} will only appear in the summary buffer if there
6743are followups to it. If you want to see them even if they don't have
6744followups, you can use the @kbd{/ D} command (@pxref{Limiting}).
6745Otherwise (except for the visibility issue), they are just like ticked
6746messages.
6747
6748@item SPACE
6749@vindex gnus-unread-mark
6750Marked as unread (@code{gnus-unread-mark}).
6751
6752@dfn{Unread articles} are articles that haven't been read at all yet.
6753@end table
6754
6755
6756@node Read Articles
6757@subsection Read Articles
6758@cindex expirable mark
6759
6760All the following marks mark articles as read.
6761
6762@table @samp
6763
6764@item r
6765@vindex gnus-del-mark
6766These are articles that the user has marked as read with the @kbd{d}
6767command manually, more or less (@code{gnus-del-mark}).
6768
6769@item R
6770@vindex gnus-read-mark
6771Articles that have actually been read (@code{gnus-read-mark}).
6772
6773@item O
6774@vindex gnus-ancient-mark
6775Articles that were marked as read in previous sessions and are now
6776@dfn{old} (@code{gnus-ancient-mark}).
6777
6778@item K
6779@vindex gnus-killed-mark
6780Marked as killed (@code{gnus-killed-mark}).
6781
6782@item X
6783@vindex gnus-kill-file-mark
6784Marked as killed by kill files (@code{gnus-kill-file-mark}).
6785
6786@item Y
6787@vindex gnus-low-score-mark
6788Marked as read by having too low a score (@code{gnus-low-score-mark}).
6789
6790@item C
6791@vindex gnus-catchup-mark
6792Marked as read by a catchup (@code{gnus-catchup-mark}).
6793
6794@item G
6795@vindex gnus-canceled-mark
6796Canceled article (@code{gnus-canceled-mark})
6797
4009494e
GM
6798@item Q
6799@vindex gnus-sparse-mark
6800Sparsely reffed article (@code{gnus-sparse-mark}). @xref{Customizing
6801Threading}.
6802
6803@item M
6804@vindex gnus-duplicate-mark
6805Article marked as read by duplicate suppression
6806(@code{gnus-duplicate-mark}). @xref{Duplicate Suppression}.
6807
6808@end table
6809
6810All these marks just mean that the article is marked as read, really.
6811They are interpreted differently when doing adaptive scoring, though.
6812
6813One more special mark, though:
6814
6815@table @samp
6816@item E
6817@vindex gnus-expirable-mark
6818Marked as expirable (@code{gnus-expirable-mark}).
6819
6820Marking articles as @dfn{expirable} (or have them marked as such
6821automatically) doesn't make much sense in normal groups---a user doesn't
6822control expiring of news articles, but in mail groups, for instance,
6823articles marked as @dfn{expirable} can be deleted by Gnus at
6824any time.
6825@end table
6826
6827
6828@node Other Marks
6829@subsection Other Marks
6830@cindex process mark
6831@cindex bookmarks
6832
6833There are some marks that have nothing to do with whether the article is
6834read or not.
6835
6836@itemize @bullet
6837
6838@item
6839You can set a bookmark in the current article. Say you are reading a
6840long thesis on cats' urinary tracts, and have to go home for dinner
6841before you've finished reading the thesis. You can then set a bookmark
6842in the article, and Gnus will jump to this bookmark the next time it
6843encounters the article. @xref{Setting Marks}.
6844
6845@item
6846@vindex gnus-replied-mark
6847All articles that you have replied to or made a followup to (i.e., have
6848answered) will be marked with an @samp{A} in the second column
6849(@code{gnus-replied-mark}).
6850
6851@item
6852@vindex gnus-forwarded-mark
6853All articles that you have forwarded will be marked with an @samp{F} in
6854the second column (@code{gnus-forwarded-mark}).
6855
6856@item
6857@vindex gnus-cached-mark
6858Articles stored in the article cache will be marked with an @samp{*} in
6859the second column (@code{gnus-cached-mark}). @xref{Article Caching}.
6860
6861@item
6862@vindex gnus-saved-mark
6863Articles ``saved'' (in some manner or other; not necessarily
6864religiously) are marked with an @samp{S} in the second column
6865(@code{gnus-saved-mark}).
6866
6867@item
6868@vindex gnus-recent-mark
6869Articles that according to the server haven't been shown to the user
6870before are marked with a @samp{N} in the second column
6871(@code{gnus-recent-mark}). Note that not all servers support this
6872mark, in which case it simply never appears. Compare with
6873@code{gnus-unseen-mark}.
6874
6875@item
6876@vindex gnus-unseen-mark
6877Articles that haven't been seen before in Gnus by the user are marked
6878with a @samp{.} in the second column (@code{gnus-unseen-mark}).
6879Compare with @code{gnus-recent-mark}.
6880
6881@item
6882@vindex gnus-downloaded-mark
6883When using the Gnus agent (@pxref{Agent Basics}), articles may be
6884downloaded for unplugged (offline) viewing. If you are using the
6885@samp{%O} spec, these articles get the @samp{+} mark in that spec.
6886(The variable @code{gnus-downloaded-mark} controls which character to
6887use.)
6888
6889@item
6890@vindex gnus-undownloaded-mark
6891When using the Gnus agent (@pxref{Agent Basics}), some articles might
6892not have been downloaded. Such articles cannot be viewed while you
6893are unplugged (offline). If you are using the @samp{%O} spec, these
6894articles get the @samp{-} mark in that spec. (The variable
6895@code{gnus-undownloaded-mark} controls which character to use.)
6896
6897@item
6898@vindex gnus-downloadable-mark
6899The Gnus agent (@pxref{Agent Basics}) downloads some articles
6900automatically, but it is also possible to explicitly mark articles for
6901download, even if they would not be downloaded automatically. Such
6902explicitly-marked articles get the @samp{%} mark in the first column.
6903(The variable @code{gnus-downloadable-mark} controls which character to
6904use.)
6905
6906@item
6907@vindex gnus-not-empty-thread-mark
6908@vindex gnus-empty-thread-mark
6909If the @samp{%e} spec is used, the presence of threads or not will be
6910marked with @code{gnus-not-empty-thread-mark} and
6911@code{gnus-empty-thread-mark} in the third column, respectively.
6912
6913@item
6914@vindex gnus-process-mark
6915Finally we have the @dfn{process mark} (@code{gnus-process-mark}). A
6916variety of commands react to the presence of the process mark. For
6917instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view
6918all articles that have been marked with the process mark. Articles
6919marked with the process mark have a @samp{#} in the second column.
6920
6921@end itemize
6922
6923You might have noticed that most of these ``non-readedness'' marks
6924appear in the second column by default. So if you have a cached, saved,
6925replied article that you have process-marked, what will that look like?
6926
6927Nothing much. The precedence rules go as follows: process -> cache ->
6928replied -> saved. So if the article is in the cache and is replied,
6929you'll only see the cache mark and not the replied mark.
6930
6931
6932@node Setting Marks
6933@subsection Setting Marks
6934@cindex setting marks
6935
6936All the marking commands understand the numeric prefix.
6937
6938@table @kbd
6939@item M c
6940@itemx M-u
6941@kindex M c (Summary)
6942@kindex M-u (Summary)
6943@findex gnus-summary-clear-mark-forward
6944@cindex mark as unread
6945Clear all readedness-marks from the current article
6946(@code{gnus-summary-clear-mark-forward}). In other words, mark the
6947article as unread.
6948
6949@item M t
6950@itemx !
6951@kindex ! (Summary)
6952@kindex M t (Summary)
6953@findex gnus-summary-tick-article-forward
6954Tick the current article (@code{gnus-summary-tick-article-forward}).
6955@xref{Article Caching}.
6956
6957@item M ?
6958@itemx ?
6959@kindex ? (Summary)
6960@kindex M ? (Summary)
6961@findex gnus-summary-mark-as-dormant
6962Mark the current article as dormant
6963(@code{gnus-summary-mark-as-dormant}). @xref{Article Caching}.
6964
6965@item M d
6966@itemx d
6967@kindex M d (Summary)
6968@kindex d (Summary)
6969@findex gnus-summary-mark-as-read-forward
6970Mark the current article as read
6971(@code{gnus-summary-mark-as-read-forward}).
6972
6973@item D
6974@kindex D (Summary)
6975@findex gnus-summary-mark-as-read-backward
6976Mark the current article as read and move point to the previous line
6977(@code{gnus-summary-mark-as-read-backward}).
6978
6979@item M k
6980@itemx k
6981@kindex k (Summary)
6982@kindex M k (Summary)
6983@findex gnus-summary-kill-same-subject-and-select
6984Mark all articles that have the same subject as the current one as read,
6985and then select the next unread article
6986(@code{gnus-summary-kill-same-subject-and-select}).
6987
6988@item M K
6989@itemx C-k
6990@kindex M K (Summary)
6991@kindex C-k (Summary)
6992@findex gnus-summary-kill-same-subject
6993Mark all articles that have the same subject as the current one as read
6994(@code{gnus-summary-kill-same-subject}).
6995
6996@item M C
6997@kindex M C (Summary)
6998@findex gnus-summary-catchup
6999@c @icon{gnus-summary-catchup}
7000Mark all unread articles as read (@code{gnus-summary-catchup}).
7001
7002@item M C-c
7003@kindex M C-c (Summary)
7004@findex gnus-summary-catchup-all
7005Mark all articles in the group as read---even the ticked and dormant
7006articles (@code{gnus-summary-catchup-all}).
7007
7008@item M H
7009@kindex M H (Summary)
7010@findex gnus-summary-catchup-to-here
7011Catchup the current group to point (before the point)
7012(@code{gnus-summary-catchup-to-here}).
7013
7014@item M h
7015@kindex M h (Summary)
7016@findex gnus-summary-catchup-from-here
7017Catchup the current group from point (after the point)
7018(@code{gnus-summary-catchup-from-here}).
7019
7020@item C-w
7021@kindex C-w (Summary)
7022@findex gnus-summary-mark-region-as-read
7023Mark all articles between point and mark as read
7024(@code{gnus-summary-mark-region-as-read}).
7025
7026@item M V k
7027@kindex M V k (Summary)
7028@findex gnus-summary-kill-below
7029Kill all articles with scores below the default score (or below the
7030numeric prefix) (@code{gnus-summary-kill-below}).
7031
7032@item M e
7033@itemx E
7034@kindex M e (Summary)
7035@kindex E (Summary)
7036@findex gnus-summary-mark-as-expirable
7037Mark the current article as expirable
7038(@code{gnus-summary-mark-as-expirable}).
7039
7040@item M b
7041@kindex M b (Summary)
7042@findex gnus-summary-set-bookmark
7043Set a bookmark in the current article
7044(@code{gnus-summary-set-bookmark}).
7045
7046@item M B
7047@kindex M B (Summary)
7048@findex gnus-summary-remove-bookmark
7049Remove the bookmark from the current article
7050(@code{gnus-summary-remove-bookmark}).
7051
7052@item M V c
7053@kindex M V c (Summary)
7054@findex gnus-summary-clear-above
7055Clear all marks from articles with scores over the default score (or
7056over the numeric prefix) (@code{gnus-summary-clear-above}).
7057
7058@item M V u
7059@kindex M V u (Summary)
7060@findex gnus-summary-tick-above
7061Tick all articles with scores over the default score (or over the
7062numeric prefix) (@code{gnus-summary-tick-above}).
7063
7064@item M V m
7065@kindex M V m (Summary)
7066@findex gnus-summary-mark-above
7067Prompt for a mark, and mark all articles with scores over the default
7068score (or over the numeric prefix) with this mark
7069(@code{gnus-summary-clear-above}).
7070@end table
7071
7072@vindex gnus-summary-goto-unread
7073The @code{gnus-summary-goto-unread} variable controls what action should
7074be taken after setting a mark. If non-@code{nil}, point will move to
7075the next/previous unread article. If @code{nil}, point will just move
7076one line up or down. As a special case, if this variable is
7077@code{never}, all the marking commands as well as other commands (like
7078@kbd{SPACE}) will move to the next article, whether it is unread or not.
7079The default is @code{t}.
7080
7081
7082@node Generic Marking Commands
7083@subsection Generic Marking Commands
7084
7085Some people would like the command that ticks an article (@kbd{!}) go to
7086the next article. Others would like it to go to the next unread
7087article. Yet others would like it to stay on the current article. And
7088even though I haven't heard of anybody wanting it to go to the
7089previous (unread) article, I'm sure there are people that want that as
7090well.
7091
7092Multiply these five behaviors with five different marking commands, and
7093you get a potentially complex set of variable to control what each
7094command should do.
7095
7096To sidestep that mess, Gnus provides commands that do all these
7097different things. They can be found on the @kbd{M M} map in the summary
7098buffer. Type @kbd{M M C-h} to see them all---there are too many of them
7099to list in this manual.
7100
7101While you can use these commands directly, most users would prefer
7102altering the summary mode keymap. For instance, if you would like the
7103@kbd{!} command to go to the next article instead of the next unread
7104article, you could say something like:
7105
7106@lisp
7107@group
7108(add-hook 'gnus-summary-mode-hook 'my-alter-summary-map)
7109(defun my-alter-summary-map ()
7110 (local-set-key "!" 'gnus-summary-put-mark-as-ticked-next))
7111@end group
7112@end lisp
7113
7114@noindent
7115or
7116
7117@lisp
7118(defun my-alter-summary-map ()
7119 (local-set-key "!" "MM!n"))
7120@end lisp
7121
7122
7123@node Setting Process Marks
7124@subsection Setting Process Marks
7125@cindex setting process marks
7126
7127Process marks are displayed as @code{#} in the summary buffer, and are
7128used for marking articles in such a way that other commands will
7129process these articles. For instance, if you process mark four
7130articles and then use the @kbd{*} command, Gnus will enter these four
7131articles into the cache. For more information,
7132@pxref{Process/Prefix}.
7133
7134@table @kbd
7135
7136@item M P p
7137@itemx #
7138@kindex # (Summary)
7139@kindex M P p (Summary)
7140@findex gnus-summary-mark-as-processable
7141Mark the current article with the process mark
7142(@code{gnus-summary-mark-as-processable}).
7143@findex gnus-summary-unmark-as-processable
7144
7145@item M P u
7146@itemx M-#
7147@kindex M P u (Summary)
7148@kindex M-# (Summary)
7149Remove the process mark, if any, from the current article
7150(@code{gnus-summary-unmark-as-processable}).
7151
7152@item M P U
7153@kindex M P U (Summary)
7154@findex gnus-summary-unmark-all-processable
7155Remove the process mark from all articles
7156(@code{gnus-summary-unmark-all-processable}).
7157
7158@item M P i
7159@kindex M P i (Summary)
7160@findex gnus-uu-invert-processable
7161Invert the list of process marked articles
7162(@code{gnus-uu-invert-processable}).
7163
7164@item M P R
7165@kindex M P R (Summary)
7166@findex gnus-uu-mark-by-regexp
7167Mark articles that have a @code{Subject} header that matches a regular
7168expression (@code{gnus-uu-mark-by-regexp}).
7169
7170@item M P G
7171@kindex M P G (Summary)
7172@findex gnus-uu-unmark-by-regexp
7173Unmark articles that have a @code{Subject} header that matches a regular
7174expression (@code{gnus-uu-unmark-by-regexp}).
7175
7176@item M P r
7177@kindex M P r (Summary)
7178@findex gnus-uu-mark-region
7179Mark articles in region (@code{gnus-uu-mark-region}).
7180
7181@item M P g
7182@kindex M P g (Summary)
7183@findex gnus-uu-unmark-region
7184Unmark articles in region (@code{gnus-uu-unmark-region}).
7185
7186@item M P t
7187@kindex M P t (Summary)
7188@findex gnus-uu-mark-thread
7189Mark all articles in the current (sub)thread
7190(@code{gnus-uu-mark-thread}).
7191
7192@item M P T
7193@kindex M P T (Summary)
7194@findex gnus-uu-unmark-thread
7195Unmark all articles in the current (sub)thread
7196(@code{gnus-uu-unmark-thread}).
7197
7198@item M P v
7199@kindex M P v (Summary)
7200@findex gnus-uu-mark-over
7201Mark all articles that have a score above the prefix argument
7202(@code{gnus-uu-mark-over}).
7203
7204@item M P s
7205@kindex M P s (Summary)
7206@findex gnus-uu-mark-series
7207Mark all articles in the current series (@code{gnus-uu-mark-series}).
7208
7209@item M P S
7210@kindex M P S (Summary)
7211@findex gnus-uu-mark-sparse
7212Mark all series that have already had some articles marked
7213(@code{gnus-uu-mark-sparse}).
7214
7215@item M P a
7216@kindex M P a (Summary)
7217@findex gnus-uu-mark-all
7218Mark all articles in series order (@code{gnus-uu-mark-all}).
7219
7220@item M P b
7221@kindex M P b (Summary)
7222@findex gnus-uu-mark-buffer
7223Mark all articles in the buffer in the order they appear
7224(@code{gnus-uu-mark-buffer}).
7225
7226@item M P k
7227@kindex M P k (Summary)
7228@findex gnus-summary-kill-process-mark
7229Push the current process mark set onto the stack and unmark all articles
7230(@code{gnus-summary-kill-process-mark}).
7231
7232@item M P y
7233@kindex M P y (Summary)
7234@findex gnus-summary-yank-process-mark
7235Pop the previous process mark set from the stack and restore it
7236(@code{gnus-summary-yank-process-mark}).
7237
7238@item M P w
7239@kindex M P w (Summary)
7240@findex gnus-summary-save-process-mark
7241Push the current process mark set onto the stack
7242(@code{gnus-summary-save-process-mark}).
7243
7244@end table
7245
7246Also see the @kbd{&} command in @ref{Searching for Articles}, for how to
7247set process marks based on article body contents.
7248
7249
7250@node Limiting
7251@section Limiting
7252@cindex limiting
7253
7254It can be convenient to limit the summary buffer to just show some
7255subset of the articles currently in the group. The effect most limit
7256commands have is to remove a few (or many) articles from the summary
7257buffer.
7258
26b9f88d
MB
7259Limiting commands work on subsets of the articles already fetched from
7260the servers. These commands don't query the server for additional
7261articles.
4009494e
GM
7262
7263@table @kbd
7264
7265@item / /
7266@itemx / s
7267@kindex / / (Summary)
7268@findex gnus-summary-limit-to-subject
7269Limit the summary buffer to articles that match some subject
7270(@code{gnus-summary-limit-to-subject}). If given a prefix, exclude
7271matching articles.
7272
7273@item / a
7274@kindex / a (Summary)
7275@findex gnus-summary-limit-to-author
7276Limit the summary buffer to articles that match some author
7277(@code{gnus-summary-limit-to-author}). If given a prefix, exclude
7278matching articles.
7279
01c52d31
MB
7280@item / R
7281@kindex / R (Summary)
7282@findex gnus-summary-limit-to-recipient
7283Limit the summary buffer to articles that match some recipient
7284(@code{gnus-summary-limit-to-recipient}). If given a prefix, exclude
7285matching articles.
7286
7287@item / A
7288@kindex / A (Summary)
7289@findex gnus-summary-limit-to-address
7290Limit the summary buffer to articles in which contents of From, To or Cc
7291header match a given address (@code{gnus-summary-limit-to-address}). If
7292given a prefix, exclude matching articles.
7293
7294@item / S
7295@kindex / S (Summary)
7296@findex gnus-summary-limit-to-singletons
7297Limit the summary buffer to articles that aren't part of any displayed
7298threads (@code{gnus-summary-limit-to-singletons}). If given a prefix,
7299limit to articles that are part of displayed threads.
7300
4009494e
GM
7301@item / x
7302@kindex / x (Summary)
7303@findex gnus-summary-limit-to-extra
7304Limit the summary buffer to articles that match one of the ``extra''
7305headers (@pxref{To From Newsgroups})
7306(@code{gnus-summary-limit-to-extra}). If given a prefix, exclude
7307matching articles.
7308
7309@item / u
7310@itemx x
7311@kindex / u (Summary)
7312@kindex x (Summary)
7313@findex gnus-summary-limit-to-unread
7314Limit the summary buffer to articles not marked as read
7315(@code{gnus-summary-limit-to-unread}). If given a prefix, limit the
7316buffer to articles strictly unread. This means that ticked and
7317dormant articles will also be excluded.
7318
7319@item / m
7320@kindex / m (Summary)
7321@findex gnus-summary-limit-to-marks
7322Ask for a mark and then limit to all articles that have been marked
7323with that mark (@code{gnus-summary-limit-to-marks}).
7324
7325@item / t
7326@kindex / t (Summary)
7327@findex gnus-summary-limit-to-age
7328Ask for a number and then limit the summary buffer to articles older than (or equal to) that number of days
7329(@code{gnus-summary-limit-to-age}). If given a prefix, limit to
7330articles younger than that number of days.
7331
7332@item / n
7333@kindex / n (Summary)
7334@findex gnus-summary-limit-to-articles
7335With prefix @samp{n}, limit the summary buffer to the next @samp{n}
7336articles. If not given a prefix, use the process marked articles
7337instead. (@code{gnus-summary-limit-to-articles}).
7338
7339@item / w
7340@kindex / w (Summary)
7341@findex gnus-summary-pop-limit
7342Pop the previous limit off the stack and restore it
7343(@code{gnus-summary-pop-limit}). If given a prefix, pop all limits off
7344the stack.
7345
7346@item / .
7347@kindex / . (Summary)
7348@findex gnus-summary-limit-to-unseen
7349Limit the summary buffer to the unseen articles
7350(@code{gnus-summary-limit-to-unseen}).
7351
7352@item / v
7353@kindex / v (Summary)
7354@findex gnus-summary-limit-to-score
7355Limit the summary buffer to articles that have a score at or above some
7356score (@code{gnus-summary-limit-to-score}).
7357
7358@item / p
7359@kindex / p (Summary)
7360@findex gnus-summary-limit-to-display-predicate
7361Limit the summary buffer to articles that satisfy the @code{display}
7362group parameter predicate
7363(@code{gnus-summary-limit-to-display-predicate}). @xref{Group
7364Parameters}, for more on this predicate.
7365
01c52d31
MB
7366@item / r
7367@kindex / r (Summary)
7368@findex gnus-summary-limit-to-replied
7369Limit the summary buffer to replied articles
7370(@code{gnus-summary-limit-to-replied}). If given a prefix, exclude
7371replied articles.
7372
4009494e
GM
7373@item / E
7374@itemx M S
7375@kindex M S (Summary)
7376@kindex / E (Summary)
7377@findex gnus-summary-limit-include-expunged
7378Include all expunged articles in the limit
7379(@code{gnus-summary-limit-include-expunged}).
7380
7381@item / D
7382@kindex / D (Summary)
7383@findex gnus-summary-limit-include-dormant
7384Include all dormant articles in the limit
7385(@code{gnus-summary-limit-include-dormant}).
7386
7387@item / *
7388@kindex / * (Summary)
7389@findex gnus-summary-limit-include-cached
7390Include all cached articles in the limit
7391(@code{gnus-summary-limit-include-cached}).
7392
7393@item / d
7394@kindex / d (Summary)
7395@findex gnus-summary-limit-exclude-dormant
7396Exclude all dormant articles from the limit
7397(@code{gnus-summary-limit-exclude-dormant}).
7398
7399@item / M
7400@kindex / M (Summary)
7401@findex gnus-summary-limit-exclude-marks
7402Exclude all marked articles (@code{gnus-summary-limit-exclude-marks}).
7403
7404@item / T
7405@kindex / T (Summary)
7406@findex gnus-summary-limit-include-thread
7407Include all the articles in the current thread in the limit.
7408
7409@item / c
7410@kindex / c (Summary)
7411@findex gnus-summary-limit-exclude-childless-dormant
7412Exclude all dormant articles that have no children from the limit@*
7413(@code{gnus-summary-limit-exclude-childless-dormant}).
7414
7415@item / C
7416@kindex / C (Summary)
7417@findex gnus-summary-limit-mark-excluded-as-read
7418Mark all excluded unread articles as read
7419(@code{gnus-summary-limit-mark-excluded-as-read}). If given a prefix,
7420also mark excluded ticked and dormant articles as read.
7421
01c52d31
MB
7422@item / b
7423@kindex / b (Summary)
7424@findex gnus-summary-limit-to-bodies
7425Limit the summary buffer to articles that have bodies that match a
7426certain regexp (@code{gnus-summary-limit-to-bodies}). If given a
7427prefix, reverse the limit. This command is quite slow since it
7428requires selecting each article to find the matches.
7429
7430@item / h
7431@kindex / h (Summary)
7432@findex gnus-summary-limit-to-headers
7433Like the previous command, only limit to headers instead
7434(@code{gnus-summary-limit-to-headers}).
7435
4009494e
GM
7436@end table
7437
7438
26b9f88d
MB
7439The following commands aren't limiting commands, but use the @kbd{/}
7440prefix as well.
7441
7442@table @kbd
7443@item / N
7444@kindex / N (Summary)
7445@findex gnus-summary-insert-new-articles
7446Insert all new articles in the summary buffer. It scans for new emails
7447if @var{back-end}@code{-get-new-mail} is non-@code{nil}.
7448
7449@item / o
7450@kindex / o (Summary)
7451@findex gnus-summary-insert-old-articles
7452Insert all old articles in the summary buffer. If given a numbered
7453prefix, fetch this number of articles.
7454
7455@end table
7456
7457
4009494e
GM
7458@node Threading
7459@section Threading
7460@cindex threading
7461@cindex article threading
7462
7463Gnus threads articles by default. @dfn{To thread} is to put responses
7464to articles directly after the articles they respond to---in a
7465hierarchical fashion.
7466
7467Threading is done by looking at the @code{References} headers of the
7468articles. In a perfect world, this would be enough to build pretty
7469trees, but unfortunately, the @code{References} header is often broken
7470or simply missing. Weird news propagation exacerbates the problem,
7471so one has to employ other heuristics to get pleasing results. A
7472plethora of approaches exists, as detailed in horrible detail in
7473@ref{Customizing Threading}.
7474
7475First, a quick overview of the concepts:
7476
7477@table @dfn
7478@item root
7479The top-most article in a thread; the first article in the thread.
7480
7481@item thread
7482A tree-like article structure.
7483
7484@item sub-thread
7485A small(er) section of this tree-like structure.
7486
7487@item loose threads
7488Threads often lose their roots due to article expiry, or due to the root
7489already having been read in a previous session, and not displayed in the
7490summary buffer. We then typically have many sub-threads that really
7491belong to one thread, but are without connecting roots. These are
7492called loose threads.
7493
7494@item thread gathering
7495An attempt to gather loose threads into bigger threads.
7496
7497@item sparse threads
7498A thread where the missing articles have been ``guessed'' at, and are
7499displayed as empty lines in the summary buffer.
7500
7501@end table
7502
7503
7504@menu
7505* Customizing Threading:: Variables you can change to affect the threading.
7506* Thread Commands:: Thread based commands in the summary buffer.
7507@end menu
7508
7509
7510@node Customizing Threading
7511@subsection Customizing Threading
7512@cindex customizing threading
7513
7514@menu
7515* Loose Threads:: How Gnus gathers loose threads into bigger threads.
7516* Filling In Threads:: Making the threads displayed look fuller.
7517* More Threading:: Even more variables for fiddling with threads.
7518* Low-Level Threading:: You thought it was over@dots{} but you were wrong!
7519@end menu
7520
7521
7522@node Loose Threads
7523@subsubsection Loose Threads
7524@cindex <
7525@cindex >
7526@cindex loose threads
7527
7528@table @code
7529@item gnus-summary-make-false-root
7530@vindex gnus-summary-make-false-root
7531If non-@code{nil}, Gnus will gather all loose subtrees into one big tree
7532and create a dummy root at the top. (Wait a minute. Root at the top?
7533Yup.) Loose subtrees occur when the real root has expired, or you've
7534read or killed the root in a previous session.
7535
7536When there is no real root of a thread, Gnus will have to fudge
7537something. This variable says what fudging method Gnus should use.
7538There are four possible values:
7539
7540@iftex
7541@iflatex
7542\gnusfigure{The Summary Buffer}{390}{
7543\put(0,0){\epsfig{figure=ps/summary-adopt,width=7.5cm}}
7544\put(445,0){\makebox(0,0)[br]{\epsfig{figure=ps/summary-empty,width=7.5cm}}}
7545\put(0,400){\makebox(0,0)[tl]{\epsfig{figure=ps/summary-none,width=7.5cm}}}
7546\put(445,400){\makebox(0,0)[tr]{\epsfig{figure=ps/summary-dummy,width=7.5cm}}}
7547}
7548@end iflatex
7549@end iftex
7550
7551@cindex adopting articles
7552
7553@table @code
7554
7555@item adopt
7556Gnus will make the first of the orphaned articles the parent. This
7557parent will adopt all the other articles. The adopted articles will be
7558marked as such by pointy brackets (@samp{<>}) instead of the standard
7559square brackets (@samp{[]}). This is the default method.
7560
7561@item dummy
7562@vindex gnus-summary-dummy-line-format
7563@vindex gnus-summary-make-false-root-always
7564Gnus will create a dummy summary line that will pretend to be the
7565parent. This dummy line does not correspond to any real article, so
7566selecting it will just select the first real article after the dummy
7567article. @code{gnus-summary-dummy-line-format} is used to specify the
7568format of the dummy roots. It accepts only one format spec: @samp{S},
7569which is the subject of the article. @xref{Formatting Variables}.
7570If you want all threads to have a dummy root, even the non-gathered
7571ones, set @code{gnus-summary-make-false-root-always} to @code{t}.
7572
7573@item empty
7574Gnus won't actually make any article the parent, but simply leave the
7575subject field of all orphans except the first empty. (Actually, it will
7576use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
7577Buffer Format}).)
7578
7579@item none
7580Don't make any article parent at all. Just gather the threads and
7581display them after one another.
7582
7583@item nil
7584Don't gather loose threads.
7585@end table
7586
7587@item gnus-summary-gather-subject-limit
7588@vindex gnus-summary-gather-subject-limit
7589Loose threads are gathered by comparing subjects of articles. If this
7590variable is @code{nil}, Gnus requires an exact match between the
7591subjects of the loose threads before gathering them into one big
7592super-thread. This might be too strict a requirement, what with the
7593presence of stupid newsreaders that chop off long subject lines. If
7594you think so, set this variable to, say, 20 to require that only the
7595first 20 characters of the subjects have to match. If you set this
7596variable to a really low number, you'll find that Gnus will gather
7597everything in sight into one thread, which isn't very helpful.
7598
7599@cindex fuzzy article gathering
7600If you set this variable to the special value @code{fuzzy}, Gnus will
7601use a fuzzy string comparison algorithm on the subjects (@pxref{Fuzzy
7602Matching}).
7603
7604@item gnus-simplify-subject-fuzzy-regexp
7605@vindex gnus-simplify-subject-fuzzy-regexp
7606This can either be a regular expression or list of regular expressions
7607that match strings that will be removed from subjects if fuzzy subject
7608simplification is used.
7609
7610@item gnus-simplify-ignored-prefixes
7611@vindex gnus-simplify-ignored-prefixes
7612If you set @code{gnus-summary-gather-subject-limit} to something as low
7613as 10, you might consider setting this variable to something sensible:
7614
7615@c Written by Michael Ernst <mernst@cs.rice.edu>
7616@lisp
7617(setq gnus-simplify-ignored-prefixes
7618 (concat
7619 "\\`\\[?\\("
7620 (mapconcat
7621 'identity
7622 '("looking"
7623 "wanted" "followup" "summary\\( of\\)?"
7624 "help" "query" "problem" "question"
7625 "answer" "reference" "announce"
7626 "How can I" "How to" "Comparison of"
7627 ;; ...
7628 )
7629 "\\|")
7630 "\\)\\s *\\("
7631 (mapconcat 'identity
7632 '("for" "for reference" "with" "about")
7633 "\\|")
7634 "\\)?\\]?:?[ \t]*"))
7635@end lisp
7636
7637All words that match this regexp will be removed before comparing two
7638subjects.
7639
7640@item gnus-simplify-subject-functions
7641@vindex gnus-simplify-subject-functions
7642If non-@code{nil}, this variable overrides
7643@code{gnus-summary-gather-subject-limit}. This variable should be a
7644list of functions to apply to the @code{Subject} string iteratively to
7645arrive at the simplified version of the string.
7646
7647Useful functions to put in this list include:
7648
7649@table @code
7650@item gnus-simplify-subject-re
7651@findex gnus-simplify-subject-re
7652Strip the leading @samp{Re:}.
7653
7654@item gnus-simplify-subject-fuzzy
7655@findex gnus-simplify-subject-fuzzy
7656Simplify fuzzily.
7657
7658@item gnus-simplify-whitespace
7659@findex gnus-simplify-whitespace
7660Remove excessive whitespace.
7661
7662@item gnus-simplify-all-whitespace
7663@findex gnus-simplify-all-whitespace
7664Remove all whitespace.
7665@end table
7666
7667You may also write your own functions, of course.
7668
7669
7670@item gnus-summary-gather-exclude-subject
7671@vindex gnus-summary-gather-exclude-subject
7672Since loose thread gathering is done on subjects only, that might lead
7673to many false hits, especially with certain common subjects like
7674@samp{} and @samp{(none)}. To make the situation slightly better,
7675you can use the regexp @code{gnus-summary-gather-exclude-subject} to say
7676what subjects should be excluded from the gathering process.@*
7677The default is @samp{^ *$\\|^(none)$}.
7678
7679@item gnus-summary-thread-gathering-function
7680@vindex gnus-summary-thread-gathering-function
7681Gnus gathers threads by looking at @code{Subject} headers. This means
7682that totally unrelated articles may end up in the same ``thread'', which
7683is confusing. An alternate approach is to look at all the
7684@code{Message-ID}s in all the @code{References} headers to find matches.
7685This will ensure that no gathered threads ever include unrelated
7686articles, but it also means that people who have posted with broken
7687newsreaders won't be gathered properly. The choice is yours---plague or
7688cholera:
7689
7690@table @code
7691@item gnus-gather-threads-by-subject
7692@findex gnus-gather-threads-by-subject
7693This function is the default gathering function and looks at
7694@code{Subject}s exclusively.
7695
7696@item gnus-gather-threads-by-references
7697@findex gnus-gather-threads-by-references
7698This function looks at @code{References} headers exclusively.
7699@end table
7700
7701If you want to test gathering by @code{References}, you could say
7702something like:
7703
7704@lisp
7705(setq gnus-summary-thread-gathering-function
7706 'gnus-gather-threads-by-references)
7707@end lisp
7708
7709@end table
7710
7711
7712@node Filling In Threads
7713@subsubsection Filling In Threads
7714
7715@table @code
7716@item gnus-fetch-old-headers
7717@vindex gnus-fetch-old-headers
7718If non-@code{nil}, Gnus will attempt to build old threads by fetching
7719more old headers---headers to articles marked as read. If you would
7720like to display as few summary lines as possible, but still connect as
7721many loose threads as possible, you should set this variable to
7722@code{some} or a number. If you set it to a number, no more than that
7723number of extra old headers will be fetched. In either case, fetching
7724old headers only works if the back end you are using carries overview
7725files---this would normally be @code{nntp}, @code{nnspool},
7726@code{nnml}, and @code{nnmaildir}. Also remember that if the root of
7727the thread has been expired by the server, there's not much Gnus can
7728do about that.
7729
7730This variable can also be set to @code{invisible}. This won't have any
7731visible effects, but is useful if you use the @kbd{A T} command a lot
7732(@pxref{Finding the Parent}).
7733
f394fa25
MB
7734The server has to support @acronym{NOV} for any of this to work.
7735
7736@cindex Gmane, gnus-fetch-old-headers
7737This feature can seriously impact performance it ignores all locally
7738cached header entries. Setting it to @code{t} for groups for a server
7739that doesn't expire articles (such as news.gmane.org), leads to very
7740slow summary generation.
7741
4009494e
GM
7742@item gnus-fetch-old-ephemeral-headers
7743@vindex gnus-fetch-old-ephemeral-headers
7744Same as @code{gnus-fetch-old-headers}, but only used for ephemeral
7745newsgroups.
7746
7747@item gnus-build-sparse-threads
7748@vindex gnus-build-sparse-threads
7749Fetching old headers can be slow. A low-rent similar effect can be
7750gotten by setting this variable to @code{some}. Gnus will then look at
7751the complete @code{References} headers of all articles and try to string
7752together articles that belong in the same thread. This will leave
7753@dfn{gaps} in the threading display where Gnus guesses that an article
7754is missing from the thread. (These gaps appear like normal summary
7755lines. If you select a gap, Gnus will try to fetch the article in
7756question.) If this variable is @code{t}, Gnus will display all these
7757``gaps'' without regard for whether they are useful for completing the
7758thread or not. Finally, if this variable is @code{more}, Gnus won't cut
7759off sparse leaf nodes that don't lead anywhere. This variable is
7760@code{nil} by default.
7761
7762@item gnus-read-all-available-headers
7763@vindex gnus-read-all-available-headers
7764This is a rather obscure variable that few will find useful. It's
7765intended for those non-news newsgroups where the back end has to fetch
7766quite a lot to present the summary buffer, and where it's impossible to
7767go back to parents of articles. This is mostly the case in the
c4d82de8 7768web-based groups.
4009494e
GM
7769
7770If you don't use those, then it's safe to leave this as the default
7771@code{nil}. If you want to use this variable, it should be a regexp
7772that matches the group name, or @code{t} for all groups.
7773
7774@end table
7775
7776
7777@node More Threading
7778@subsubsection More Threading
7779
7780@table @code
7781@item gnus-show-threads
7782@vindex gnus-show-threads
7783If this variable is @code{nil}, no threading will be done, and all of
7784the rest of the variables here will have no effect. Turning threading
7785off will speed group selection up a bit, but it is sure to make reading
7786slower and more awkward.
7787
7788@item gnus-thread-hide-subtree
7789@vindex gnus-thread-hide-subtree
7790If non-@code{nil}, all threads will be hidden when the summary buffer is
7791generated.
7792
7793This can also be a predicate specifier (@pxref{Predicate Specifiers}).
7794Available predicates are @code{gnus-article-unread-p} and
7795@code{gnus-article-unseen-p}.
7796
7797Here's an example:
7798
7799@lisp
7800(setq gnus-thread-hide-subtree
7801 '(or gnus-article-unread-p
7802 gnus-article-unseen-p))
7803@end lisp
7804
7805(It's a pretty nonsensical example, since all unseen articles are also
7806unread, but you get my drift.)
7807
7808
7809@item gnus-thread-expunge-below
7810@vindex gnus-thread-expunge-below
7811All threads that have a total score (as defined by
7812@code{gnus-thread-score-function}) less than this number will be
7813expunged. This variable is @code{nil} by default, which means that no
7814threads are expunged.
7815
7816@item gnus-thread-hide-killed
7817@vindex gnus-thread-hide-killed
7818if you kill a thread and this variable is non-@code{nil}, the subtree
7819will be hidden.
7820
7821@item gnus-thread-ignore-subject
7822@vindex gnus-thread-ignore-subject
7823Sometimes somebody changes the subject in the middle of a thread. If
7824this variable is non-@code{nil}, which is the default, the subject
7825change is ignored. If it is @code{nil}, a change in the subject will
7826result in a new thread.
7827
7828@item gnus-thread-indent-level
7829@vindex gnus-thread-indent-level
7830This is a number that says how much each sub-thread should be indented.
7831The default is 4.
7832
7833@item gnus-sort-gathered-threads-function
7834@vindex gnus-sort-gathered-threads-function
7835Sometimes, particularly with mailing lists, the order in which mails
7836arrive locally is not necessarily the same as the order in which they
7837arrived on the mailing list. Consequently, when sorting sub-threads
7838using the default @code{gnus-thread-sort-by-number}, responses can end
7839up appearing before the article to which they are responding to.
7840Setting this variable to an alternate value
7841(e.g. @code{gnus-thread-sort-by-date}), in a group's parameters or in an
7842appropriate hook (e.g. @code{gnus-summary-generate-hook}) can produce a
7843more logical sub-thread ordering in such instances.
7844
7845@end table
7846
7847
7848@node Low-Level Threading
7849@subsubsection Low-Level Threading
7850
7851@table @code
7852
7853@item gnus-parse-headers-hook
7854@vindex gnus-parse-headers-hook
7855Hook run before parsing any headers.
7856
7857@item gnus-alter-header-function
7858@vindex gnus-alter-header-function
7859If non-@code{nil}, this function will be called to allow alteration of
7860article header structures. The function is called with one parameter,
7861the article header vector, which it may alter in any way. For instance,
7862if you have a mail-to-news gateway which alters the @code{Message-ID}s
7863in systematic ways (by adding prefixes and such), you can use this
7864variable to un-scramble the @code{Message-ID}s so that they are more
7865meaningful. Here's one example:
7866
7867@lisp
7868(setq gnus-alter-header-function 'my-alter-message-id)
7869
7870(defun my-alter-message-id (header)
7871 (let ((id (mail-header-id header)))
7872 (when (string-match
7873 "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id)
7874 (mail-header-set-id
7875 (concat (match-string 1 id) "@@" (match-string 2 id))
7876 header))))
7877@end lisp
7878
7879@end table
7880
7881
7882@node Thread Commands
7883@subsection Thread Commands
7884@cindex thread commands
7885
7886@table @kbd
7887
7888@item T k
7889@itemx C-M-k
7890@kindex T k (Summary)
7891@kindex C-M-k (Summary)
7892@findex gnus-summary-kill-thread
7893Mark all articles in the current (sub-)thread as read
7894(@code{gnus-summary-kill-thread}). If the prefix argument is positive,
7895remove all marks instead. If the prefix argument is negative, tick
7896articles instead.
7897
7898@item T l
7899@itemx C-M-l
7900@kindex T l (Summary)
7901@kindex C-M-l (Summary)
7902@findex gnus-summary-lower-thread
7903Lower the score of the current (sub-)thread
7904(@code{gnus-summary-lower-thread}).
7905
7906@item T i
7907@kindex T i (Summary)
7908@findex gnus-summary-raise-thread
7909Increase the score of the current (sub-)thread
7910(@code{gnus-summary-raise-thread}).
7911
7912@item T #
7913@kindex T # (Summary)
7914@findex gnus-uu-mark-thread
7915Set the process mark on the current (sub-)thread
7916(@code{gnus-uu-mark-thread}).
7917
7918@item T M-#
7919@kindex T M-# (Summary)
7920@findex gnus-uu-unmark-thread
7921Remove the process mark from the current (sub-)thread
7922(@code{gnus-uu-unmark-thread}).
7923
7924@item T T
7925@kindex T T (Summary)
7926@findex gnus-summary-toggle-threads
7927Toggle threading (@code{gnus-summary-toggle-threads}).
7928
7929@item T s
7930@kindex T s (Summary)
7931@findex gnus-summary-show-thread
7932Expose the (sub-)thread hidden under the current article, if any@*
7933(@code{gnus-summary-show-thread}).
7934
7935@item T h
7936@kindex T h (Summary)
7937@findex gnus-summary-hide-thread
7938Hide the current (sub-)thread (@code{gnus-summary-hide-thread}).
7939
7940@item T S
7941@kindex T S (Summary)
7942@findex gnus-summary-show-all-threads
7943Expose all hidden threads (@code{gnus-summary-show-all-threads}).
7944
7945@item T H
7946@kindex T H (Summary)
7947@findex gnus-summary-hide-all-threads
7948Hide all threads (@code{gnus-summary-hide-all-threads}).
7949
7950@item T t
7951@kindex T t (Summary)
7952@findex gnus-summary-rethread-current
7953Re-thread the current article's thread
7954(@code{gnus-summary-rethread-current}). This works even when the
7955summary buffer is otherwise unthreaded.
7956
7957@item T ^
7958@kindex T ^ (Summary)
7959@findex gnus-summary-reparent-thread
7960Make the current article the child of the marked (or previous) article
7961(@code{gnus-summary-reparent-thread}).
7962
01c52d31
MB
7963@item T M-^
7964@kindex T M-^ (Summary)
7965@findex gnus-summary-reparent-children
7966Make the current article the parent of the marked articles
7967(@code{gnus-summary-reparent-children}).
7968
4009494e
GM
7969@end table
7970
7971The following commands are thread movement commands. They all
7972understand the numeric prefix.
7973
7974@table @kbd
7975
7976@item T n
7977@kindex T n (Summary)
7978@itemx C-M-f
7979@kindex C-M-n (Summary)
7980@itemx M-down
7981@kindex M-down (Summary)
7982@findex gnus-summary-next-thread
7983Go to the next thread (@code{gnus-summary-next-thread}).
7984
7985@item T p
7986@kindex T p (Summary)
7987@itemx C-M-b
7988@kindex C-M-p (Summary)
7989@itemx M-up
7990@kindex M-up (Summary)
7991@findex gnus-summary-prev-thread
7992Go to the previous thread (@code{gnus-summary-prev-thread}).
7993
7994@item T d
7995@kindex T d (Summary)
7996@findex gnus-summary-down-thread
7997Descend the thread (@code{gnus-summary-down-thread}).
7998
7999@item T u
8000@kindex T u (Summary)
8001@findex gnus-summary-up-thread
8002Ascend the thread (@code{gnus-summary-up-thread}).
8003
8004@item T o
8005@kindex T o (Summary)
8006@findex gnus-summary-top-thread
8007Go to the top of the thread (@code{gnus-summary-top-thread}).
8008@end table
8009
8010@vindex gnus-thread-operation-ignore-subject
8011If you ignore subject while threading, you'll naturally end up with
8012threads that have several different subjects in them. If you then issue
8013a command like @kbd{T k} (@code{gnus-summary-kill-thread}) you might not
8014wish to kill the entire thread, but just those parts of the thread that
8015have the same subject as the current article. If you like this idea,
8016you can fiddle with @code{gnus-thread-operation-ignore-subject}. If it
8017is non-@code{nil} (which it is by default), subjects will be ignored
8018when doing thread commands. If this variable is @code{nil}, articles in
8019the same thread with different subjects will not be included in the
8020operation in question. If this variable is @code{fuzzy}, only articles
8021that have subjects fuzzily equal will be included (@pxref{Fuzzy
8022Matching}).
8023
8024
8025@node Sorting the Summary Buffer
8026@section Sorting the Summary Buffer
8027
8028@findex gnus-thread-sort-by-total-score
8029@findex gnus-thread-sort-by-date
8030@findex gnus-thread-sort-by-score
8031@findex gnus-thread-sort-by-subject
8032@findex gnus-thread-sort-by-author
01c52d31 8033@findex gnus-thread-sort-by-recipient
4009494e
GM
8034@findex gnus-thread-sort-by-number
8035@findex gnus-thread-sort-by-random
8036@vindex gnus-thread-sort-functions
8037@findex gnus-thread-sort-by-most-recent-number
8038@findex gnus-thread-sort-by-most-recent-date
8039If you are using a threaded summary display, you can sort the threads by
8040setting @code{gnus-thread-sort-functions}, which can be either a single
8041function, a list of functions, or a list containing functions and
8042@code{(not some-function)} elements.
8043
8044By default, sorting is done on article numbers. Ready-made sorting
8045predicate functions include @code{gnus-thread-sort-by-number},
01c52d31
MB
8046@code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-recipient},
8047@code{gnus-thread-sort-by-subject},
8048@code{gnus-thread-sort-by-date},
8049@code{gnus-thread-sort-by-score},
4009494e
GM
8050@code{gnus-thread-sort-by-most-recent-number},
8051@code{gnus-thread-sort-by-most-recent-date},
8052@code{gnus-thread-sort-by-random} and
8053@code{gnus-thread-sort-by-total-score}.
8054
8055Each function takes two threads and returns non-@code{nil} if the first
8056thread should be sorted before the other. Note that sorting really is
8057normally done by looking only at the roots of each thread.
8058
8059If you use more than one function, the primary sort key should be the
8060last function in the list. You should probably always include
8061@code{gnus-thread-sort-by-number} in the list of sorting
8062functions---preferably first. This will ensure that threads that are
8063equal with respect to the other sort criteria will be displayed in
8064ascending article order.
8065
8066If you would like to sort by reverse score, then by subject, and finally
8067by number, you could do something like:
8068
8069@lisp
8070(setq gnus-thread-sort-functions
8071 '(gnus-thread-sort-by-number
8072 gnus-thread-sort-by-subject
8073 (not gnus-thread-sort-by-total-score)))
8074@end lisp
8075
8076The threads that have highest score will be displayed first in the
8077summary buffer. When threads have the same score, they will be sorted
8078alphabetically. The threads that have the same score and the same
8079subject will be sorted by number, which is (normally) the sequence in
8080which the articles arrived.
8081
8082If you want to sort by score and then reverse arrival order, you could
8083say something like:
8084
8085@lisp
8086(setq gnus-thread-sort-functions
01c52d31 8087 '((not gnus-thread-sort-by-number)
4009494e
GM
8088 gnus-thread-sort-by-score))
8089@end lisp
8090
8091@vindex gnus-thread-score-function
8092The function in the @code{gnus-thread-score-function} variable (default
8093@code{+}) is used for calculating the total score of a thread. Useful
8094functions might be @code{max}, @code{min}, or squared means, or whatever
8095tickles your fancy.
8096
8097@findex gnus-article-sort-functions
8098@findex gnus-article-sort-by-date
6ecfe5c2 8099@findex gnus-article-sort-by-most-recent-date
4009494e
GM
8100@findex gnus-article-sort-by-score
8101@findex gnus-article-sort-by-subject
8102@findex gnus-article-sort-by-author
8103@findex gnus-article-sort-by-random
8104@findex gnus-article-sort-by-number
6ecfe5c2 8105@findex gnus-article-sort-by-most-recent-number
4009494e
GM
8106If you are using an unthreaded display for some strange reason or
8107other, you have to fiddle with the @code{gnus-article-sort-functions}
8108variable. It is very similar to the
8109@code{gnus-thread-sort-functions}, except that it uses slightly
8110different functions for article comparison. Available sorting
8111predicate functions are @code{gnus-article-sort-by-number},
8112@code{gnus-article-sort-by-author},
8113@code{gnus-article-sort-by-subject}, @code{gnus-article-sort-by-date},
8114@code{gnus-article-sort-by-random}, and
8115@code{gnus-article-sort-by-score}.
8116
8117If you want to sort an unthreaded summary display by subject, you could
8118say something like:
8119
8120@lisp
8121(setq gnus-article-sort-functions
8122 '(gnus-article-sort-by-number
8123 gnus-article-sort-by-subject))
8124@end lisp
8125
01c52d31
MB
8126You can define group specific sorting via @code{gnus-parameters},
8127@xref{Group Parameters}.
4009494e
GM
8128
8129
8130@node Asynchronous Fetching
8131@section Asynchronous Article Fetching
8132@cindex asynchronous article fetching
8133@cindex article pre-fetch
8134@cindex pre-fetch
8135
8136If you read your news from an @acronym{NNTP} server that's far away, the
8137network latencies may make reading articles a chore. You have to wait
8138for a while after pressing @kbd{n} to go to the next article before the
8139article appears. Why can't Gnus just go ahead and fetch the article
8140while you are reading the previous one? Why not, indeed.
8141
8142First, some caveats. There are some pitfalls to using asynchronous
8143article fetching, especially the way Gnus does it.
8144
8145Let's say you are reading article 1, which is short, and article 2 is
8146quite long, and you are not interested in reading that. Gnus does not
8147know this, so it goes ahead and fetches article 2. You decide to read
8148article 3, but since Gnus is in the process of fetching article 2, the
8149connection is blocked.
8150
8151To avoid these situations, Gnus will open two (count 'em two)
8152connections to the server. Some people may think this isn't a very nice
8153thing to do, but I don't see any real alternatives. Setting up that
8154extra connection takes some time, so Gnus startup will be slower.
8155
8156Gnus will fetch more articles than you will read. This will mean that
8157the link between your machine and the @acronym{NNTP} server will become more
8158loaded than if you didn't use article pre-fetch. The server itself will
8159also become more loaded---both with the extra article requests, and the
8160extra connection.
8161
8162Ok, so now you know that you shouldn't really use this thing@dots{} unless
8163you really want to.
8164
8165@vindex gnus-asynchronous
8166Here's how: Set @code{gnus-asynchronous} to @code{t}. The rest should
8167happen automatically.
8168
8169@vindex gnus-use-article-prefetch
8170You can control how many articles are to be pre-fetched by setting
8171@code{gnus-use-article-prefetch}. This is 30 by default, which means
8172that when you read an article in the group, the back end will pre-fetch
8173the next 30 articles. If this variable is @code{t}, the back end will
8174pre-fetch all the articles it can without bound. If it is
8175@code{nil}, no pre-fetching will be done.
8176
8177@vindex gnus-async-prefetch-article-p
8178@findex gnus-async-unread-p
8179There are probably some articles that you don't want to pre-fetch---read
8180articles, for instance. The @code{gnus-async-prefetch-article-p}
8181variable controls whether an article is to be pre-fetched. This
8182function should return non-@code{nil} when the article in question is
8183to be pre-fetched. The default is @code{gnus-async-unread-p}, which
8184returns @code{nil} on read articles. The function is called with an
8185article data structure as the only parameter.
8186
8187If, for instance, you wish to pre-fetch only unread articles shorter
8188than 100 lines, you could say something like:
8189
8190@lisp
8191(defun my-async-short-unread-p (data)
8192 "Return non-nil for short, unread articles."
8193 (and (gnus-data-unread-p data)
8194 (< (mail-header-lines (gnus-data-header data))
8195 100)))
8196
8197(setq gnus-async-prefetch-article-p 'my-async-short-unread-p)
8198@end lisp
8199
8200These functions will be called many, many times, so they should
8201preferably be short and sweet to avoid slowing down Gnus too much.
8202It's probably a good idea to byte-compile things like this.
8203
85115796
KY
8204@vindex gnus-async-post-fetch-function
8205@findex gnus-html-prefetch-images
8206After an article has been prefetched, this
8207@code{gnus-async-post-fetch-function} will be called. The buffer will
8208be narrowed to the region of the article that was fetched. A useful
8209value would be @code{gnus-html-prefetch-images}, which will prefetch
8210and store images referenced in the article, so that you don't have to
8211wait for them to be fetched when you read the article. This is useful
8212for @acronym{HTML} messages that have external images.
8213
4009494e
GM
8214@vindex gnus-prefetched-article-deletion-strategy
8215Articles have to be removed from the asynch buffer sooner or later. The
8216@code{gnus-prefetched-article-deletion-strategy} says when to remove
8217articles. This is a list that may contain the following elements:
8218
8219@table @code
8220@item read
8221Remove articles when they are read.
8222
8223@item exit
8224Remove articles when exiting the group.
8225@end table
8226
8227The default value is @code{(read exit)}.
8228
8229@c @vindex gnus-use-header-prefetch
8230@c If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles
8231@c from the next group.
8232
8233
8234@node Article Caching
8235@section Article Caching
8236@cindex article caching
8237@cindex caching
8238
8239If you have an @emph{extremely} slow @acronym{NNTP} connection, you may
8240consider turning article caching on. Each article will then be stored
8241locally under your home directory. As you may surmise, this could
8242potentially use @emph{huge} amounts of disk space, as well as eat up all
8243your inodes so fast it will make your head swim. In vodka.
8244
8245Used carefully, though, it could be just an easier way to save articles.
8246
8247@vindex gnus-use-long-file-name
8248@vindex gnus-cache-directory
8249@vindex gnus-use-cache
8250To turn caching on, set @code{gnus-use-cache} to @code{t}. By default,
8251all articles ticked or marked as dormant will then be copied
8252over to your local cache (@code{gnus-cache-directory}). Whether this
8253cache is flat or hierarchical is controlled by the
8254@code{gnus-use-long-file-name} variable, as usual.
8255
8256When re-selecting a ticked or dormant article, it will be fetched from the
8257cache instead of from the server. As articles in your cache will never
8258expire, this might serve as a method of saving articles while still
8259keeping them where they belong. Just mark all articles you want to save
8260as dormant, and don't worry.
8261
8262When an article is marked as read, is it removed from the cache.
8263
8264@vindex gnus-cache-remove-articles
8265@vindex gnus-cache-enter-articles
8266The entering/removal of articles from the cache is controlled by the
8267@code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}
8268variables. Both are lists of symbols. The first is @code{(ticked
8269dormant)} by default, meaning that ticked and dormant articles will be
8270put in the cache. The latter is @code{(read)} by default, meaning that
8271articles marked as read are removed from the cache. Possibly
8272symbols in these two lists are @code{ticked}, @code{dormant},
8273@code{unread} and @code{read}.
8274
8275@findex gnus-jog-cache
8276So where does the massive article-fetching and storing come into the
8277picture? The @code{gnus-jog-cache} command will go through all
8278subscribed newsgroups, request all unread articles, score them, and
8279store them in the cache. You should only ever, ever ever ever, use this
8280command if 1) your connection to the @acronym{NNTP} server is really, really,
8281really slow and 2) you have a really, really, really huge disk.
8282Seriously. One way to cut down on the number of articles downloaded is
8283to score unwanted articles down and have them marked as read. They will
8284not then be downloaded by this command.
8285
8286@vindex gnus-uncacheable-groups
8287@vindex gnus-cacheable-groups
8288It is likely that you do not want caching on all groups. For instance,
8289if your @code{nnml} mail is located under your home directory, it makes no
8290sense to cache it somewhere else under your home directory. Unless you
8291feel that it's neat to use twice as much space.
8292
8293To limit the caching, you could set @code{gnus-cacheable-groups} to a
8294regexp of groups to cache, @samp{^nntp} for instance, or set the
8295@code{gnus-uncacheable-groups} regexp to @samp{^nnml}, for instance.
8296Both variables are @code{nil} by default. If a group matches both
8297variables, the group is not cached.
8298
8299@findex gnus-cache-generate-nov-databases
8300@findex gnus-cache-generate-active
8301@vindex gnus-cache-active-file
8302The cache stores information on what articles it contains in its active
8303file (@code{gnus-cache-active-file}). If this file (or any other parts
8304of the cache) becomes all messed up for some reason or other, Gnus
8305offers two functions that will try to set things right. @kbd{M-x
8306gnus-cache-generate-nov-databases} will (re)build all the @acronym{NOV}
8307files, and @kbd{gnus-cache-generate-active} will (re)generate the active
8308file.
8309
8310@findex gnus-cache-move-cache
8311@code{gnus-cache-move-cache} will move your whole
8312@code{gnus-cache-directory} to some other location. You get asked to
8313where, isn't that cool?
8314
8315@node Persistent Articles
8316@section Persistent Articles
8317@cindex persistent articles
8318
8319Closely related to article caching, we have @dfn{persistent articles}.
8320In fact, it's just a different way of looking at caching, and much more
8321useful in my opinion.
8322
8323Say you're reading a newsgroup, and you happen on to some valuable gem
8324that you want to keep and treasure forever. You'd normally just save it
8325(using one of the many saving commands) in some file. The problem with
8326that is that it's just, well, yucky. Ideally you'd prefer just having
8327the article remain in the group where you found it forever; untouched by
8328the expiry going on at the news server.
8329
8330This is what a @dfn{persistent article} is---an article that just won't
8331be deleted. It's implemented using the normal cache functions, but
8332you use two explicit commands for managing persistent articles:
8333
8334@table @kbd
8335
8336@item *
8337@kindex * (Summary)
8338@findex gnus-cache-enter-article
8339Make the current article persistent (@code{gnus-cache-enter-article}).
8340
8341@item M-*
8342@kindex M-* (Summary)
8343@findex gnus-cache-remove-article
8344Remove the current article from the persistent articles
8345(@code{gnus-cache-remove-article}). This will normally delete the
8346article.
8347@end table
8348
8349Both these commands understand the process/prefix convention.
8350
8351To avoid having all ticked articles (and stuff) entered into the cache,
8352you should set @code{gnus-use-cache} to @code{passive} if you're just
8353interested in persistent articles:
8354
8355@lisp
8356(setq gnus-use-cache 'passive)
8357@end lisp
8358
01c52d31
MB
8359@node Sticky Articles
8360@section Sticky Articles
8361@cindex sticky articles
8362
8363When you select an article the current article buffer will be reused
8364according to the value of the variable
8365@code{gnus-single-article-buffer}. If its value is non-@code{nil} (the
8366default) all articles reuse the same article buffer. Else each group
8367has its own article buffer.
8368
8369This implies that it's not possible to have more than one article buffer
8370in a group at a time. But sometimes you might want to display all the
8371latest emails from your mother, your father, your aunt, your uncle and
8372your 17 cousins to coordinate the next christmas party.
8373
8374That's where sticky articles come in handy. A sticky article buffer
8375basically is a normal article buffer, but it won't be reused when you
8376select another article. You can make an article sticky with:
8377
8378@table @kbd
8379@item A S
8380@kindex A S (Summary)
8381@findex gnus-sticky-article
8382Make the current article sticky. If a prefix arg is given, ask for a
8383name for this sticky article buffer.
8384@end table
8385
8386To close a sticky article buffer you can use these commands:
8387
8388@table @kbd
8389@item q
8390@kindex q (Article)
8391@findex bury-buffer
8392Puts this sticky article buffer at the end of the list of all buffers.
8393
8394@item k
8395@kindex k (Article)
8396@findex gnus-kill-sticky-article-buffer
8397Kills this sticky article buffer.
8398@end table
8399
8400To kill all sticky article buffers you can use:
8401
8402@defun gnus-kill-sticky-article-buffers ARG
8403Kill all sticky article buffers.
8404If a prefix ARG is given, ask for confirmation.
8405@end defun
4009494e
GM
8406
8407@node Article Backlog
8408@section Article Backlog
8409@cindex backlog
8410@cindex article backlog
8411
8412If you have a slow connection, but the idea of using caching seems
8413unappealing to you (and it is, really), you can help the situation some
8414by switching on the @dfn{backlog}. This is where Gnus will buffer
8415already read articles so that it doesn't have to re-fetch articles
8416you've already read. This only helps if you are in the habit of
8417re-selecting articles you've recently read, of course. If you never do
8418that, turning the backlog on will slow Gnus down a little bit, and
8419increase memory usage some.
8420
8421@vindex gnus-keep-backlog
8422If you set @code{gnus-keep-backlog} to a number @var{n}, Gnus will store
8423at most @var{n} old articles in a buffer for later re-fetching. If this
8424variable is non-@code{nil} and is not a number, Gnus will store
8425@emph{all} read articles, which means that your Emacs will grow without
8426bound before exploding and taking your machine down with you. I put
8427that in there just to keep y'all on your toes.
8428
8429The default value is 20.
8430
8431
8432@node Saving Articles
8433@section Saving Articles
8434@cindex saving articles
8435
8436Gnus can save articles in a number of ways. Below is the documentation
8437for saving articles in a fairly straight-forward fashion (i.e., little
8438processing of the article is done before it is saved). For a different
8439approach (uudecoding, unsharing) you should use @code{gnus-uu}
8440(@pxref{Decoding Articles}).
8441
8442For the commands listed here, the target is a file. If you want to
8443save to a group, see the @kbd{B c} (@code{gnus-summary-copy-article})
8444command (@pxref{Mail Group Commands}).
8445
8446@vindex gnus-save-all-headers
8447If @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not delete
8448unwanted headers before saving the article.
8449
8450@vindex gnus-saved-headers
8451If the preceding variable is @code{nil}, all headers that match the
8452@code{gnus-saved-headers} regexp will be kept, while the rest will be
8453deleted before saving.
8454
8455@table @kbd
8456
8457@item O o
8458@itemx o
8459@kindex O o (Summary)
8460@kindex o (Summary)
8461@findex gnus-summary-save-article
8462@c @icon{gnus-summary-save-article}
8463Save the current article using the default article saver
8464(@code{gnus-summary-save-article}).
8465
8466@item O m
8467@kindex O m (Summary)
8468@findex gnus-summary-save-article-mail
8469Save the current article in a Unix mail box (mbox) file
8470(@code{gnus-summary-save-article-mail}).
8471
8472@item O r
8473@kindex O r (Summary)
8474@findex gnus-summary-save-article-rmail
8475Save the current article in Rmail format
bc79f9ab
GM
8476(@code{gnus-summary-save-article-rmail}). This is mbox since Emacs 23,
8477Babyl in older versions.
4009494e
GM
8478
8479@item O f
8480@kindex O f (Summary)
8481@findex gnus-summary-save-article-file
8482@c @icon{gnus-summary-save-article-file}
8483Save the current article in plain file format
8484(@code{gnus-summary-save-article-file}).
8485
8486@item O F
8487@kindex O F (Summary)
8488@findex gnus-summary-write-article-file
8489Write the current article in plain file format, overwriting any previous
8490file contents (@code{gnus-summary-write-article-file}).
8491
8492@item O b
8493@kindex O b (Summary)
8494@findex gnus-summary-save-article-body-file
8495Save the current article body in plain file format
8496(@code{gnus-summary-save-article-body-file}).
8497
8498@item O h
8499@kindex O h (Summary)
8500@findex gnus-summary-save-article-folder
8501Save the current article in mh folder format
8502(@code{gnus-summary-save-article-folder}).
8503
8504@item O v
8505@kindex O v (Summary)
8506@findex gnus-summary-save-article-vm
8507Save the current article in a VM folder
8508(@code{gnus-summary-save-article-vm}).
8509
8510@item O p
8511@itemx |
8512@kindex O p (Summary)
8513@kindex | (Summary)
8514@findex gnus-summary-pipe-output
89167438 8515@vindex gnus-summary-pipe-output-default-command
4009494e
GM
8516Save the current article in a pipe. Uhm, like, what I mean is---Pipe
8517the current article to a process (@code{gnus-summary-pipe-output}).
8518If given a symbolic prefix (@pxref{Symbolic Prefixes}), include the
6ecfe5c2
MB
8519complete headers in the piped output. The symbolic prefix @code{r} is
8520special; it lets this command pipe a raw article including all headers.
8521The @code{gnus-summary-pipe-output-default-command} variable can be set
8522to a string containing the default command and options (default
8523@code{nil}).
4009494e
GM
8524
8525@item O P
8526@kindex O P (Summary)
8527@findex gnus-summary-muttprint
8528@vindex gnus-summary-muttprint-program
8529Save the current article into muttprint. That is, print it using the
8530external program @uref{http://muttprint.sourceforge.net/,
8531Muttprint}. The program name and options to use is controlled by the
8532variable @code{gnus-summary-muttprint-program}.
8533(@code{gnus-summary-muttprint}).
8534
8535@end table
8536
8537@vindex gnus-prompt-before-saving
8538All these commands use the process/prefix convention
8539(@pxref{Process/Prefix}). If you save bunches of articles using these
8540functions, you might get tired of being prompted for files to save each
8541and every article in. The prompting action is controlled by
8542the @code{gnus-prompt-before-saving} variable, which is @code{always} by
8543default, giving you that excessive prompting action you know and
8544loathe. If you set this variable to @code{t} instead, you'll be prompted
8545just once for each series of articles you save. If you like to really
8546have Gnus do all your thinking for you, you can even set this variable
8547to @code{nil}, which means that you will never be prompted for files to
8548save articles in. Gnus will simply save all the articles in the default
8549files.
8550
8551
8552@vindex gnus-default-article-saver
8553You can customize the @code{gnus-default-article-saver} variable to make
8554Gnus do what you want it to. You can use any of the eight ready-made
8555functions below, or you can create your own.
8556
8557@table @code
8558
8559@item gnus-summary-save-in-rmail
8560@findex gnus-summary-save-in-rmail
8561@vindex gnus-rmail-save-name
8562@findex gnus-plain-save-name
bc79f9ab
GM
8563This is the default format, that used by the Rmail package. Since Emacs
856423, Rmail uses standard mbox format. Before this, it used the
8565@dfn{Babyl} format. Accordingly, this command writes mbox format since
8566Emacs 23, unless appending to an existing Babyl file. In older versions
8567of Emacs, it always uses Babyl format. Uses the function in the
4009494e
GM
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!
61b1af82
G
9218* Article Display:: Display various stuff:
9219 X-Face, Picons, Gravatars, Smileys.
4009494e
GM
9220* Article Signature:: What is a signature?
9221* Article Miscellanea:: Various other stuff.
9222@end menu
9223
9224
9225@node Article Highlighting
9226@subsection Article Highlighting
9227@cindex highlighting
9228
9229Not only do you want your article buffer to look like fruit salad, but
9230you want it to look like technicolor fruit salad.
9231
9232@table @kbd
9233
9234@item W H a
9235@kindex W H a (Summary)
9236@findex gnus-article-highlight
9237@findex gnus-article-maybe-highlight
9238Do much highlighting of the current article
9239(@code{gnus-article-highlight}). This function highlights header, cited
9240text, the signature, and adds buttons to the body and the head.
9241
9242@item W H h
9243@kindex W H h (Summary)
9244@findex gnus-article-highlight-headers
9245@vindex gnus-header-face-alist
9246Highlight the headers (@code{gnus-article-highlight-headers}). The
9247highlighting will be done according to the @code{gnus-header-face-alist}
9248variable, which is a list where each element has the form
9249@code{(@var{regexp} @var{name} @var{content})}.
9250@var{regexp} is a regular expression for matching the
9251header, @var{name} is the face used for highlighting the header name
9252(@pxref{Faces and Fonts}) and @var{content} is the face for highlighting
9253the header value. The first match made will be used. Note that
9254@var{regexp} shouldn't have @samp{^} prepended---Gnus will add one.
9255
9256@item W H c
9257@kindex W H c (Summary)
9258@findex gnus-article-highlight-citation
9259Highlight cited text (@code{gnus-article-highlight-citation}).
9260
9261Some variables to customize the citation highlights:
9262
9263@table @code
9264@vindex gnus-cite-parse-max-size
9265
9266@item gnus-cite-parse-max-size
9267If the article size in bytes is bigger than this variable (which is
926825000 by default), no citation highlighting will be performed.
9269
9270@item gnus-cite-max-prefix
9271@vindex gnus-cite-max-prefix
9272Maximum possible length for a citation prefix (default 20).
9273
9274@item gnus-cite-face-list
9275@vindex gnus-cite-face-list
9276List of faces used for highlighting citations (@pxref{Faces and Fonts}).
9277When there are citations from multiple articles in the same message,
9278Gnus will try to give each citation from each article its own face.
9279This should make it easier to see who wrote what.
9280
9281@item gnus-supercite-regexp
9282@vindex gnus-supercite-regexp
9283Regexp matching normal Supercite attribution lines.
9284
9285@item gnus-supercite-secondary-regexp
9286@vindex gnus-supercite-secondary-regexp
9287Regexp matching mangled Supercite attribution lines.
9288
9289@item gnus-cite-minimum-match-count
9290@vindex gnus-cite-minimum-match-count
9291Minimum number of identical prefixes we have to see before we believe
9292that it's a citation.
9293
9294@item gnus-cite-attribution-prefix
9295@vindex gnus-cite-attribution-prefix
9296Regexp matching the beginning of an attribution line.
9297
9298@item gnus-cite-attribution-suffix
9299@vindex gnus-cite-attribution-suffix
9300Regexp matching the end of an attribution line.
9301
9302@item gnus-cite-attribution-face
9303@vindex gnus-cite-attribution-face
9304Face used for attribution lines. It is merged with the face for the
9305cited text belonging to the attribution.
9306
9307@item gnus-cite-ignore-quoted-from
9308@vindex gnus-cite-ignore-quoted-from
9309If non-@code{nil}, no citation highlighting will be performed on lines
9310beginning with @samp{>From }. Those lines may have been quoted by MTAs
9311in order not to mix up with the envelope From line. The default value
9312is @code{t}.
9313
9314@end table
9315
9316
9317@item W H s
9318@kindex W H s (Summary)
9319@vindex gnus-signature-separator
9320@vindex gnus-signature-face
9321@findex gnus-article-highlight-signature
9322Highlight the signature (@code{gnus-article-highlight-signature}).
9323Everything after @code{gnus-signature-separator} (@pxref{Article
9324Signature}) in an article will be considered a signature and will be
9325highlighted with @code{gnus-signature-face}, which is @code{italic} by
9326default.
9327
9328@end table
9329
9330@xref{Customizing Articles}, for how to highlight articles automatically.
9331
9332
9333@node Article Fontisizing
9334@subsection Article Fontisizing
9335@cindex emphasis
9336@cindex article emphasis
9337
9338@findex gnus-article-emphasize
9339@kindex W e (Summary)
9340People commonly add emphasis to words in news articles by writing things
9341like @samp{_this_} or @samp{*this*} or @samp{/this/}. Gnus can make
9342this look nicer by running the article through the @kbd{W e}
9343(@code{gnus-article-emphasize}) command.
9344
9345@vindex gnus-emphasis-alist
9346How the emphasis is computed is controlled by the
9347@code{gnus-emphasis-alist} variable. This is an alist where the first
9348element is a regular expression to be matched. The second is a number
9349that says what regular expression grouping is used to find the entire
9350emphasized word. The third is a number that says what regexp grouping
9351should be displayed and highlighted. (The text between these two
9352groupings will be hidden.) The fourth is the face used for
9353highlighting.
9354
9355@lisp
9356(setq gnus-emphasis-alist
9357 '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline)
9358 ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold)))
9359@end lisp
9360
9361@cindex slash
9362@cindex asterisk
9363@cindex underline
9364@cindex /
9365@cindex *
9366
9367@vindex gnus-emphasis-underline
9368@vindex gnus-emphasis-bold
9369@vindex gnus-emphasis-italic
9370@vindex gnus-emphasis-underline-bold
9371@vindex gnus-emphasis-underline-italic
9372@vindex gnus-emphasis-bold-italic
9373@vindex gnus-emphasis-underline-bold-italic
9374By default, there are seven rules, and they use the following faces:
9375@code{gnus-emphasis-bold}, @code{gnus-emphasis-italic},
9376@code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic},
9377@code{gnus-emphasis-underline-italic},
9378@code{gnus-emphasis-underline-bold}, and
9379@code{gnus-emphasis-underline-bold-italic}.
9380
9381If you want to change these faces, you can either use @kbd{M-x
9382customize}, or you can use @code{copy-face}. For instance, if you want
9383to make @code{gnus-emphasis-italic} use a red face instead, you could
9384say something like:
9385
9386@lisp
9387(copy-face 'red 'gnus-emphasis-italic)
9388@end lisp
9389
9390@vindex gnus-group-highlight-words-alist
9391
9392If you want to highlight arbitrary words, you can use the
9393@code{gnus-group-highlight-words-alist} variable, which uses the same
9394syntax as @code{gnus-emphasis-alist}. The @code{highlight-words} group
9395parameter (@pxref{Group Parameters}) can also be used.
9396
9397@xref{Customizing Articles}, for how to fontize articles automatically.
9398
9399
9400@node Article Hiding
9401@subsection Article Hiding
9402@cindex article hiding
9403
9404Or rather, hiding certain things in each article. There usually is much
9405too much cruft in most articles.
9406
9407@table @kbd
9408
9409@item W W a
9410@kindex W W a (Summary)
9411@findex gnus-article-hide
9412Do quite a lot of hiding on the article buffer
9413(@kbd{gnus-article-hide}). In particular, this function will hide
9414headers, @acronym{PGP}, cited text and the signature.
9415
9416@item W W h
9417@kindex W W h (Summary)
9418@findex gnus-article-hide-headers
9419Hide headers (@code{gnus-article-hide-headers}). @xref{Hiding
9420Headers}.
9421
9422@item W W b
9423@kindex W W b (Summary)
9424@findex gnus-article-hide-boring-headers
9425Hide headers that aren't particularly interesting
9426(@code{gnus-article-hide-boring-headers}). @xref{Hiding Headers}.
9427
9428@item W W s
9429@kindex W W s (Summary)
9430@findex gnus-article-hide-signature
9431Hide signature (@code{gnus-article-hide-signature}). @xref{Article
9432Signature}.
9433
9434@item W W l
9435@kindex W W l (Summary)
9436@findex gnus-article-hide-list-identifiers
9437@vindex gnus-list-identifiers
9438Strip list identifiers specified in @code{gnus-list-identifiers}. These
9439are strings some mailing list servers add to the beginning of all
9440@code{Subject} headers---for example, @samp{[zebra 4711]}. Any leading
9441@samp{Re: } is skipped before stripping. @code{gnus-list-identifiers}
9442may not contain @code{\\(..\\)}.
9443
9444@table @code
9445
9446@item gnus-list-identifiers
9447@vindex gnus-list-identifiers
9448A regular expression that matches list identifiers to be removed from
9449subject. This can also be a list of regular expressions.
9450
9451@end table
9452
9453@item W W P
9454@kindex W W P (Summary)
9455@findex gnus-article-hide-pem
9456Hide @acronym{PEM} (privacy enhanced messages) cruft
9457(@code{gnus-article-hide-pem}).
9458
9459@item W W B
9460@kindex W W B (Summary)
9461@findex gnus-article-strip-banner
9462@vindex gnus-article-banner-alist
9463@vindex gnus-article-address-banner-alist
9464@cindex banner
9465@cindex OneList
9466@cindex stripping advertisements
9467@cindex advertisements
9468Strip the banner specified by the @code{banner} group parameter
9469(@code{gnus-article-strip-banner}). This is mainly used to hide those
9470annoying banners and/or signatures that some mailing lists and moderated
9471groups adds to all the messages. The way to use this function is to add
9472the @code{banner} group parameter (@pxref{Group Parameters}) to the
9473group you want banners stripped from. The parameter either be a string,
9474which will be interpreted as a regular expression matching text to be
9475removed, or the symbol @code{signature}, meaning that the (last)
9476signature should be removed, or other symbol, meaning that the
9477corresponding regular expression in @code{gnus-article-banner-alist} is
9478used.
9479
a3f57c41
G
9480For instance:
9481
9482@lisp
9483(setq gnus-article-banner-alist
9484 ((googleGroups .
9485 "^\n*--~--~---------\\(.+\n\\)+")))
9486@end lisp
9487
4009494e
GM
9488Regardless of a group, you can hide things like advertisements only when
9489the sender of an article has a certain mail address specified in
9490@code{gnus-article-address-banner-alist}.
9491
9492@table @code
9493
9494@item gnus-article-address-banner-alist
9495@vindex gnus-article-address-banner-alist
9496Alist of mail addresses and banners. Each element has the form
9497@code{(@var{address} . @var{banner})}, where @var{address} is a regexp
9498matching a mail address in the From header, @var{banner} is one of a
9499symbol @code{signature}, an item in @code{gnus-article-banner-alist},
9500a regexp and @code{nil}. If @var{address} matches author's mail
9501address, it will remove things like advertisements. For example, if a
9502sender has the mail address @samp{hail@@yoo-hoo.co.jp} and there is a
9503banner something like @samp{Do You Yoo-hoo!?} in all articles he
9504sends, you can use the following element to remove them:
9505
9506@lisp
9507("@@yoo-hoo\\.co\\.jp\\'" .
9508 "\n_+\nDo You Yoo-hoo!\\?\n.*\n.*\n")
9509@end lisp
9510
9511@end table
9512
9513@item W W c
9514@kindex W W c (Summary)
9515@findex gnus-article-hide-citation
9516Hide citation (@code{gnus-article-hide-citation}). Some variables for
9517customizing the hiding:
9518
9519@table @code
9520
9521@item gnus-cited-opened-text-button-line-format
9522@itemx gnus-cited-closed-text-button-line-format
9523@vindex gnus-cited-closed-text-button-line-format
9524@vindex gnus-cited-opened-text-button-line-format
9525Gnus adds buttons to show where the cited text has been hidden, and to
9526allow toggle hiding the text. The format of the variable is specified
9527by these format-like variable (@pxref{Formatting Variables}). These
9528specs are valid:
9529
9530@table @samp
9531@item b
9532Starting point of the hidden text.
9533@item e
9534Ending point of the hidden text.
9535@item l
9536Number of characters in the hidden region.
9537@item n
9538Number of lines of hidden text.
9539@end table
9540
9541@item gnus-cited-lines-visible
9542@vindex gnus-cited-lines-visible
9543The number of lines at the beginning of the cited text to leave
9544shown. This can also be a cons cell with the number of lines at the top
9545and bottom of the text, respectively, to remain visible.
9546
9547@end table
9548
9549@item W W C-c
9550@kindex W W C-c (Summary)
9551@findex gnus-article-hide-citation-maybe
9552
9553Hide citation (@code{gnus-article-hide-citation-maybe}) depending on the
9554following two variables:
9555
9556@table @code
9557@item gnus-cite-hide-percentage
9558@vindex gnus-cite-hide-percentage
9559If the cited text is of a bigger percentage than this variable (default
956050), hide the cited text.
9561
9562@item gnus-cite-hide-absolute
9563@vindex gnus-cite-hide-absolute
9564The cited text must have at least this length (default 10) before it
9565is hidden.
9566@end table
9567
9568@item W W C
9569@kindex W W C (Summary)
9570@findex gnus-article-hide-citation-in-followups
9571Hide cited text in articles that aren't roots
9572(@code{gnus-article-hide-citation-in-followups}). This isn't very
9573useful as an interactive command, but might be a handy function to stick
9574have happen automatically (@pxref{Customizing Articles}).
9575
9576@end table
9577
9578All these ``hiding'' commands are toggles, but if you give a negative
9579prefix to these commands, they will show what they have previously
9580hidden. If you give a positive prefix, they will always hide.
9581
9582Also @pxref{Article Highlighting} for further variables for
9583citation customization.
9584
9585@xref{Customizing Articles}, for how to hide article elements
9586automatically.
9587
9588
9589@node Article Washing
9590@subsection Article Washing
9591@cindex washing
9592@cindex article washing
9593
9594We call this ``article washing'' for a really good reason. Namely, the
9595@kbd{A} key was taken, so we had to use the @kbd{W} key instead.
9596
9597@dfn{Washing} is defined by us as ``changing something from something to
9598something else'', but normally results in something looking better.
9599Cleaner, perhaps.
9600
9601@xref{Customizing Articles}, if you want to change how Gnus displays
9602articles by default.
9603
9604@table @kbd
9605
9606@item C-u g
9607This is not really washing, it's sort of the opposite of washing. If
9608you type this, you see the article exactly as it exists on disk or on
9609the server.
9610
9611@item g
9612Force redisplaying of the current article
9613(@code{gnus-summary-show-article}). This is also not really washing.
9614If you type this, you see the article without any previously applied
9615interactive Washing functions but with all default treatments
9616(@pxref{Customizing Articles}).
9617
9618@item W l
9619@kindex W l (Summary)
9620@findex gnus-summary-stop-page-breaking
9621Remove page breaks from the current article
9622(@code{gnus-summary-stop-page-breaking}). @xref{Misc Article}, for page
9623delimiters.
9624
9625@item W r
9626@kindex W r (Summary)
9627@findex gnus-summary-caesar-message
9628@c @icon{gnus-summary-caesar-message}
9629Do a Caesar rotate (rot13) on the article buffer
9630(@code{gnus-summary-caesar-message}).
9631Unreadable articles that tell you to read them with Caesar rotate or rot13.
9632(Typically offensive jokes and such.)
9633
9634It's commonly called ``rot13'' because each letter is rotated 13
9635positions in the alphabet, e. g. @samp{B} (letter #2) -> @samp{O} (letter
9636#15). It is sometimes referred to as ``Caesar rotate'' because Caesar
9637is rumored to have employed this form of, uh, somewhat weak encryption.
9638
9639@item W m
9640@kindex W m (Summary)
9641@findex gnus-summary-morse-message
9642Morse decode the article buffer (@code{gnus-summary-morse-message}).
9643
01c52d31
MB
9644@item W i
9645@kindex W i (Summary)
9646@findex gnus-summary-idna-message
9647Decode IDNA encoded domain names in the current articles. IDNA
9648encoded domain names looks like @samp{xn--bar}. If a string remain
9649unencoded after running invoking this, it is likely an invalid IDNA
9650string (@samp{xn--bar} is invalid). You must have GNU Libidn
9651(@url{http://www.gnu.org/software/libidn/}) installed for this command
9652to work.
9653
4009494e
GM
9654@item W t
9655@item t
9656@kindex W t (Summary)
9657@kindex t (Summary)
9658@findex gnus-summary-toggle-header
9659Toggle whether to display all headers in the article buffer
9660(@code{gnus-summary-toggle-header}).
9661
9662@item W v
9663@kindex W v (Summary)
9664@findex gnus-summary-verbose-headers
9665Toggle whether to display all headers in the article buffer permanently
9666(@code{gnus-summary-verbose-headers}).
9667
9668@item W o
9669@kindex W o (Summary)
9670@findex gnus-article-treat-overstrike
9671Treat overstrike (@code{gnus-article-treat-overstrike}).
9672
9673@item W d
9674@kindex W d (Summary)
9675@findex gnus-article-treat-dumbquotes
9676@vindex gnus-article-dumbquotes-map
9677@cindex Smartquotes
9678@cindex M****s*** sm*rtq**t*s
9679@cindex Latin 1
9680Treat M****s*** sm*rtq**t*s according to
9681@code{gnus-article-dumbquotes-map}
9682(@code{gnus-article-treat-dumbquotes}). Note that this function guesses
9683whether a character is a sm*rtq**t* or not, so it should only be used
9684interactively.
9685
9686Sm*rtq**t*s are M****s***'s unilateral extension to the character map in
9687an attempt to provide more quoting characters. If you see something
9688like @code{\222} or @code{\264} where you're expecting some kind of
9689apostrophe or quotation mark, then try this wash.
9690
9691@item W Y f
9692@kindex W Y f (Summary)
9693@findex gnus-article-outlook-deuglify-article
9694@cindex Outlook Express
9695Full deuglify of broken Outlook (Express) articles: Treat dumbquotes,
9696unwrap lines, repair attribution and rearrange citation.
9697(@code{gnus-article-outlook-deuglify-article}).
9698
9699@item W Y u
9700@kindex W Y u (Summary)
9701@findex gnus-article-outlook-unwrap-lines
9702@vindex gnus-outlook-deuglify-unwrap-min
9703@vindex gnus-outlook-deuglify-unwrap-max
9704Unwrap lines that appear to be wrapped citation lines. You can control
9705what lines will be unwrapped by frobbing
9706@code{gnus-outlook-deuglify-unwrap-min} and
9707@code{gnus-outlook-deuglify-unwrap-max}, indicating the minimum and
9708maximum length of an unwrapped citation line.
9709(@code{gnus-article-outlook-unwrap-lines}).
9710
9711@item W Y a
9712@kindex W Y a (Summary)
9713@findex gnus-article-outlook-repair-attribution
9714Repair a broken attribution line.@*
9715(@code{gnus-article-outlook-repair-attribution}).
9716
9717@item W Y c
9718@kindex W Y c (Summary)
9719@findex gnus-article-outlook-rearrange-citation
9720Repair broken citations by rearranging the text.
9721(@code{gnus-article-outlook-rearrange-citation}).
9722
9723@item W w
9724@kindex W w (Summary)
9725@findex gnus-article-fill-cited-article
9726Do word wrap (@code{gnus-article-fill-cited-article}).
9727
9728You can give the command a numerical prefix to specify the width to use
9729when filling.
9730
9731@item W Q
9732@kindex W Q (Summary)
9733@findex gnus-article-fill-long-lines
9734Fill long lines (@code{gnus-article-fill-long-lines}).
9735
9736@item W C
9737@kindex W C (Summary)
9738@findex gnus-article-capitalize-sentences
9739Capitalize the first word in each sentence
9740(@code{gnus-article-capitalize-sentences}).
9741
9742@item W c
9743@kindex W c (Summary)
9744@findex gnus-article-remove-cr
9745Translate CRLF pairs (i. e., @samp{^M}s on the end of the lines) into LF
9746(this takes care of DOS line endings), and then translate any remaining
9747CRs into LF (this takes care of Mac line endings)
9748(@code{gnus-article-remove-cr}).
9749
9750@item W q
9751@kindex W q (Summary)
9752@findex gnus-article-de-quoted-unreadable
9753Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}).
9754Quoted-Printable is one common @acronym{MIME} encoding employed when
9755sending non-@acronym{ASCII} (i.e., 8-bit) articles. It typically
01c52d31
MB
9756makes strings like @samp{d@'ej@`a vu} look like @samp{d=E9j=E0 vu},
9757which doesn't look very readable to me. Note that this is usually
9758done automatically by Gnus if the message in question has a
4009494e
GM
9759@code{Content-Transfer-Encoding} header that says that this encoding
9760has been done. If a prefix is given, a charset will be asked for.
9761
9762@item W 6
9763@kindex W 6 (Summary)
9764@findex gnus-article-de-base64-unreadable
9765Treat base64 (@code{gnus-article-de-base64-unreadable}). Base64 is
9766one common @acronym{MIME} encoding employed when sending
9767non-@acronym{ASCII} (i.e., 8-bit) articles. Note that this is
9768usually done automatically by Gnus if the message in question has a
9769@code{Content-Transfer-Encoding} header that says that this encoding
9770has been done. If a prefix is given, a charset will be asked for.
9771
9772@item W Z
9773@kindex W Z (Summary)
9774@findex gnus-article-decode-HZ
9775Treat HZ or HZP (@code{gnus-article-decode-HZ}). HZ (or HZP) is one
9776common encoding employed when sending Chinese articles. It typically
9777makes strings look like @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}}.
9778
01c52d31
MB
9779@item W A
9780@kindex W A (Summary)
9781@findex gnus-article-treat-ansi-sequences
9782@cindex @acronym{ANSI} control sequences
9783Translate @acronym{ANSI} SGR control sequences into overlays or
9784extents (@code{gnus-article-treat-ansi-sequences}). @acronym{ANSI}
9785sequences are used in some Chinese hierarchies for highlighting.
9786
4009494e
GM
9787@item W u
9788@kindex W u (Summary)
9789@findex gnus-article-unsplit-urls
9790Remove newlines from within URLs. Some mailers insert newlines into
9791outgoing email messages to keep lines short. This reformatting can
9792split long URLs onto multiple lines. Repair those URLs by removing
9793the newlines (@code{gnus-article-unsplit-urls}).
9794
9795@item W h
9796@kindex W h (Summary)
9797@findex gnus-article-wash-html
9798Treat @acronym{HTML} (@code{gnus-article-wash-html}). Note that this is
9799usually done automatically by Gnus if the message in question has a
9800@code{Content-Type} header that says that the message is @acronym{HTML}.
9801
9802If a prefix is given, a charset will be asked for. If it is a number,
9803the charset defined in @code{gnus-summary-show-article-charset-alist}
9804(@pxref{Paging the Article}) will be used.
9805
9806@vindex gnus-article-wash-function
9807The default is to use the function specified by
9808@code{mm-text-html-renderer} (@pxref{Display Customization, ,Display
9809Customization, emacs-mime, The Emacs MIME Manual}) to convert the
9810@acronym{HTML}, but this is controlled by the
9811@code{gnus-article-wash-function} variable. Pre-defined functions you
9812can use include:
9813
9814@table @code
0e6b7ca0
JD
9815@item gnus-article-html
9816Use Gnus rendered based on w3m.
9817
4009494e
GM
9818@item w3
9819Use Emacs/W3.
9820
9821@item w3m
9822Use @uref{http://emacs-w3m.namazu.org/, emacs-w3m}.
9823
9824@item w3m-standalone
9825Use @uref{http://w3m.sourceforge.net/, w3m}.
9826
9827@item links
9828Use @uref{http://links.sf.net/, Links}.
9829
9830@item lynx
9831Use @uref{http://lynx.isc.org/, Lynx}.
9832
9833@item html2text
9834Use html2text---a simple @acronym{HTML} converter included with Gnus.
9835
9836@end table
9837
9838@item W b
9839@kindex W b (Summary)
9840@findex gnus-article-add-buttons
9841Add clickable buttons to the article (@code{gnus-article-add-buttons}).
9842@xref{Article Buttons}.
9843
9844@item W B
9845@kindex W B (Summary)
9846@findex gnus-article-add-buttons-to-head
9847Add clickable buttons to the article headers
9848(@code{gnus-article-add-buttons-to-head}).
9849
9850@item W p
9851@kindex W p (Summary)
9852@findex gnus-article-verify-x-pgp-sig
9853Verify a signed control message
9854(@code{gnus-article-verify-x-pgp-sig}). Control messages such as
9855@code{newgroup} and @code{checkgroups} are usually signed by the
9856hierarchy maintainer. You need to add the @acronym{PGP} public key of
9857the maintainer to your keyring to verify the
9858message.@footnote{@acronym{PGP} keys for many hierarchies are
9859available at @uref{ftp://ftp.isc.org/pub/pgpcontrol/README.html}}
9860
9861@item W s
9862@kindex W s (Summary)
9863@findex gnus-summary-force-verify-and-decrypt
9864Verify a signed (@acronym{PGP}, @acronym{PGP/MIME} or
9865@acronym{S/MIME}) message
9866(@code{gnus-summary-force-verify-and-decrypt}). @xref{Security}.
9867
9868@item W a
9869@kindex W a (Summary)
9870@findex gnus-article-strip-headers-in-body
9871Strip headers like the @code{X-No-Archive} header from the beginning of
9872article bodies (@code{gnus-article-strip-headers-in-body}).
9873
9874@item W E l
9875@kindex W E l (Summary)
9876@findex gnus-article-strip-leading-blank-lines
9877Remove all blank lines from the beginning of the article
9878(@code{gnus-article-strip-leading-blank-lines}).
9879
9880@item W E m
9881@kindex W E m (Summary)
9882@findex gnus-article-strip-multiple-blank-lines
9883Replace all blank lines with empty lines and then all multiple empty
9884lines with a single empty line.
9885(@code{gnus-article-strip-multiple-blank-lines}).
9886
9887@item W E t
9888@kindex W E t (Summary)
9889@findex gnus-article-remove-trailing-blank-lines
9890Remove all blank lines at the end of the article
9891(@code{gnus-article-remove-trailing-blank-lines}).
9892
9893@item W E a
9894@kindex W E a (Summary)
9895@findex gnus-article-strip-blank-lines
9896Do all the three commands above
9897(@code{gnus-article-strip-blank-lines}).
9898
9899@item W E A
9900@kindex W E A (Summary)
9901@findex gnus-article-strip-all-blank-lines
9902Remove all blank lines
9903(@code{gnus-article-strip-all-blank-lines}).
9904
9905@item W E s
9906@kindex W E s (Summary)
9907@findex gnus-article-strip-leading-space
9908Remove all white space from the beginning of all lines of the article
9909body (@code{gnus-article-strip-leading-space}).
9910
9911@item W E e
9912@kindex W E e (Summary)
9913@findex gnus-article-strip-trailing-space
9914Remove all white space from the end of all lines of the article
9915body (@code{gnus-article-strip-trailing-space}).
9916
9917@end table
9918
9919@xref{Customizing Articles}, for how to wash articles automatically.
9920
9921
9922@node Article Header
9923@subsection Article Header
9924
9925These commands perform various transformations of article header.
9926
9927@table @kbd
9928
9929@item W G u
9930@kindex W G u (Summary)
9931@findex gnus-article-treat-unfold-headers
9932Unfold folded header lines (@code{gnus-article-treat-unfold-headers}).
9933
9934@item W G n
9935@kindex W G n (Summary)
9936@findex gnus-article-treat-fold-newsgroups
9937Fold the @code{Newsgroups} and @code{Followup-To} headers
9938(@code{gnus-article-treat-fold-newsgroups}).
9939
9940@item W G f
9941@kindex W G f (Summary)
9942@findex gnus-article-treat-fold-headers
9943Fold all the message headers
9944(@code{gnus-article-treat-fold-headers}).
9945
9946@item W E w
9947@kindex W E w (Summary)
9948@findex gnus-article-remove-leading-whitespace
9949Remove excessive whitespace from all headers
9950(@code{gnus-article-remove-leading-whitespace}).
9951
9952@end table
9953
9954
9955@node Article Buttons
9956@subsection Article Buttons
9957@cindex buttons
9958
9959People often include references to other stuff in articles, and it would
9960be nice if Gnus could just fetch whatever it is that people talk about
9961with the minimum of fuzz when you hit @kbd{RET} or use the middle mouse
9962button on these references.
9963
9964@vindex gnus-button-man-handler
9965Gnus adds @dfn{buttons} to certain standard references by default:
9966Well-formed URLs, mail addresses, Message-IDs, Info links, man pages and
9967Emacs or Gnus related references. This is controlled by two variables,
9968one that handles article bodies and one that handles article heads:
9969
9970@table @code
9971
9972@item gnus-button-alist
9973@vindex gnus-button-alist
9974This is an alist where each entry has this form:
9975
9976@lisp
9977(@var{regexp} @var{button-par} @var{use-p} @var{function} @var{data-par})
9978@end lisp
9979
9980@table @var
9981
9982@item regexp
9983All text that match this regular expression (case insensitive) will be
9984considered an external reference. Here's a typical regexp that matches
9985embedded URLs: @samp{<URL:\\([^\n\r>]*\\)>}. This can also be a
9986variable containing a regexp, useful variables to use include
9987@code{gnus-button-url-regexp} and @code{gnus-button-mid-or-mail-regexp}.
9988
9989@item button-par
9990Gnus has to know which parts of the matches is to be highlighted. This
9991is a number that says what sub-expression of the regexp is to be
9992highlighted. If you want it all highlighted, you use 0 here.
9993
9994@item use-p
9995This form will be @code{eval}ed, and if the result is non-@code{nil},
9996this is considered a match. This is useful if you want extra sifting to
9997avoid false matches. Often variables named
9998@code{gnus-button-@var{*}-level} are used here, @xref{Article Button
9999Levels}, but any other form may be used too.
10000
10001@c @code{use-p} is @code{eval}ed only if @code{regexp} matches.
10002
10003@item function
10004This function will be called when you click on this button.
10005
10006@item data-par
10007As with @var{button-par}, this is a sub-expression number, but this one
10008says which part of the match is to be sent as data to @var{function}.
10009
10010@end table
10011
10012So the full entry for buttonizing URLs is then
10013
10014@lisp
10015("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)
10016@end lisp
10017
10018@item gnus-header-button-alist
10019@vindex gnus-header-button-alist
10020This is just like the other alist, except that it is applied to the
10021article head only, and that each entry has an additional element that is
10022used to say what headers to apply the buttonize coding to:
10023
10024@lisp
10025(@var{header} @var{regexp} @var{button-par} @var{use-p} @var{function} @var{data-par})
10026@end lisp
10027
10028@var{header} is a regular expression.
10029@end table
10030
10031@subsubsection Related variables and functions
10032
10033@table @code
10034@item gnus-button-@var{*}-level
10035@xref{Article Button Levels}.
10036
10037@c Stuff related to gnus-button-browse-level
10038
10039@item gnus-button-url-regexp
10040@vindex gnus-button-url-regexp
10041A regular expression that matches embedded URLs. It is used in the
10042default values of the variables above.
10043
10044@c Stuff related to gnus-button-man-level
10045
10046@item gnus-button-man-handler
10047@vindex gnus-button-man-handler
10048The function to use for displaying man pages. It must take at least one
10049argument with a string naming the man page.
10050
10051@c Stuff related to gnus-button-message-level
10052
10053@item gnus-button-mid-or-mail-regexp
10054@vindex gnus-button-mid-or-mail-regexp
10055Regular expression that matches a message ID or a mail address.
10056
10057@item gnus-button-prefer-mid-or-mail
10058@vindex gnus-button-prefer-mid-or-mail
10059This variable determines what to do when the button on a string as
10060@samp{foo123@@bar.invalid} is pushed. Strings like this can be either a
10061message ID or a mail address. If it is one of the symbols @code{mid} or
10062@code{mail}, Gnus will always assume that the string is a message ID or
10063a mail address, respectively. If this variable is set to the symbol
10064@code{ask}, always query the user what to do. If it is a function, this
10065function will be called with the string as its only argument. The
10066function must return @code{mid}, @code{mail}, @code{invalid} or
10067@code{ask}. The default value is the function
10068@code{gnus-button-mid-or-mail-heuristic}.
10069
10070@item gnus-button-mid-or-mail-heuristic
10071@findex gnus-button-mid-or-mail-heuristic
10072Function that guesses whether its argument is a message ID or a mail
10073address. Returns @code{mid} if it's a message IDs, @code{mail} if
10074it's a mail address, @code{ask} if unsure and @code{invalid} if the
10075string is invalid.
10076
10077@item gnus-button-mid-or-mail-heuristic-alist
10078@vindex gnus-button-mid-or-mail-heuristic-alist
10079An alist of @code{(RATE . REGEXP)} pairs used by the function
10080@code{gnus-button-mid-or-mail-heuristic}.
10081
4009494e
GM
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
4009494e
GM
10154@end table
10155
10156
10157@node Article Date
10158@subsection Article Date
10159
10160The date is most likely generated in some obscure timezone you've never
10161heard of, so it's quite nice to be able to find out what the time was
10162when the article was sent.
10163
10164@table @kbd
10165
10166@item W T u
10167@kindex W T u (Summary)
10168@findex gnus-article-date-ut
10169Display the date in UT (aka. GMT, aka ZULU)
10170(@code{gnus-article-date-ut}).
10171
10172@item W T i
10173@kindex W T i (Summary)
10174@findex gnus-article-date-iso8601
10175@cindex ISO 8601
10176Display the date in international format, aka. ISO 8601
10177(@code{gnus-article-date-iso8601}).
10178
10179@item W T l
10180@kindex W T l (Summary)
10181@findex gnus-article-date-local
10182Display the date in the local timezone (@code{gnus-article-date-local}).
10183
10184@item W T p
10185@kindex W T p (Summary)
10186@findex gnus-article-date-english
10187Display the date in a format that's easily pronounceable in English
10188(@code{gnus-article-date-english}).
10189
10190@item W T s
10191@kindex W T s (Summary)
10192@vindex gnus-article-time-format
10193@findex gnus-article-date-user
10194@findex format-time-string
10195Display the date using a user-defined format
10196(@code{gnus-article-date-user}). The format is specified by the
10197@code{gnus-article-time-format} variable, and is a string that's passed
10198to @code{format-time-string}. See the documentation of that variable
10199for a list of possible format specs.
10200
10201@item W T e
10202@kindex W T e (Summary)
10203@findex gnus-article-date-lapsed
10204@findex gnus-start-date-timer
10205@findex gnus-stop-date-timer
10206Say how much time has elapsed between the article was posted and now
10207(@code{gnus-article-date-lapsed}). It looks something like:
10208
10209@example
10210X-Sent: 6 weeks, 4 days, 1 hour, 3 minutes, 8 seconds ago
10211@end example
10212
10213@vindex gnus-article-date-lapsed-new-header
10214The value of @code{gnus-article-date-lapsed-new-header} determines
10215whether this header will just be added below the old Date one, or will
10216replace it.
10217
10218An advantage of using Gnus to read mail is that it converts simple bugs
10219into wonderful absurdities.
10220
10221If you want to have this line updated continually, you can put
10222
10223@lisp
10224(gnus-start-date-timer)
10225@end lisp
10226
10227in your @file{~/.gnus.el} file, or you can run it off of some hook. If
10228you want to stop the timer, you can use the @code{gnus-stop-date-timer}
10229command.
10230
10231@item W T o
10232@kindex W T o (Summary)
10233@findex gnus-article-date-original
10234Display the original date (@code{gnus-article-date-original}). This can
10235be useful if you normally use some other conversion function and are
10236worried that it might be doing something totally wrong. Say, claiming
10237that the article was posted in 1854. Although something like that is
10238@emph{totally} impossible. Don't you trust me? *titter*
10239
10240@end table
10241
10242@xref{Customizing Articles}, for how to display the date in your
10243preferred format automatically.
10244
10245
10246@node Article Display
10247@subsection Article Display
10248@cindex picons
10249@cindex x-face
10250@cindex smileys
61b1af82 10251@cindex gravatars
4009494e
GM
10252
10253These commands add various frivolous display gimmicks to the article
10254buffer in Emacs versions that support them.
10255
10256@code{X-Face} headers are small black-and-white images supplied by the
10257message headers (@pxref{X-Face}).
10258
10259@code{Face} headers are small colored images supplied by the message
10260headers (@pxref{Face}).
10261
10262Smileys are those little @samp{:-)} symbols that people like to litter
10263their messages with (@pxref{Smileys}).
10264
10265Picons, on the other hand, reside on your own system, and Gnus will
10266try to match the headers to what you have (@pxref{Picons}).
10267
61b1af82
G
10268Gravatars reside on-line and are fetched from
10269@uref{http://www.gravatar.com/} (@pxref{Gravatars}).
10270
4009494e
GM
10271All these functions are toggles---if the elements already exist,
10272they'll be removed.
10273
10274@table @kbd
10275@item W D x
10276@kindex W D x (Summary)
10277@findex gnus-article-display-x-face
10278Display an @code{X-Face} in the @code{From} header.
10279(@code{gnus-article-display-x-face}).
10280
10281@item W D d
10282@kindex W D d (Summary)
10283@findex gnus-article-display-face
10284Display a @code{Face} in the @code{From} header.
10285(@code{gnus-article-display-face}).
10286
10287@item W D s
10288@kindex W D s (Summary)
10289@findex gnus-treat-smiley
10290Display smileys (@code{gnus-treat-smiley}).
10291
10292@item W D f
10293@kindex W D f (Summary)
10294@findex gnus-treat-from-picon
10295Piconify the @code{From} header (@code{gnus-treat-from-picon}).
10296
10297@item W D m
10298@kindex W D m (Summary)
10299@findex gnus-treat-mail-picon
10300Piconify all mail headers (i. e., @code{Cc}, @code{To})
10301(@code{gnus-treat-mail-picon}).
10302
10303@item W D n
10304@kindex W D n (Summary)
10305@findex gnus-treat-newsgroups-picon
10306Piconify all news headers (i. e., @code{Newsgroups} and
10307@code{Followup-To}) (@code{gnus-treat-newsgroups-picon}).
10308
61b1af82
G
10309@item W D g
10310@kindex W D g (Summary)
10311@findex gnus-treat-from-gravatar
10312Gravatarify the @code{From} header (@code{gnus-treat-from-gravatar}).
10313
10314@item W D h
10315@kindex W D h (Summary)
10316@findex gnus-treat-mail-gravatar
10317Gravatarify all mail headers (i. e., @code{Cc}, @code{To})
10318(@code{gnus-treat-from-gravatar}).
10319
4009494e
GM
10320@item W D D
10321@kindex W D D (Summary)
10322@findex gnus-article-remove-images
10323Remove all images from the article buffer
10324(@code{gnus-article-remove-images}).
10325
25f28806
LMI
10326@item W D W
10327@kindex W D W (Summary)
10328@findex gnus-html-show-images
10329If you're reading an @acronym{HTML} article rendered with
10330@code{gnus-article-html}, then you can insert any blocked images in
10331the buffer with this command.
10332(@code{gnus-html-show-images}).
10333
4009494e
GM
10334@end table
10335
10336
10337
10338@node Article Signature
10339@subsection Article Signature
10340@cindex signatures
10341@cindex article signature
10342
10343@vindex gnus-signature-separator
10344Each article is divided into two parts---the head and the body. The
10345body can be divided into a signature part and a text part. The variable
10346that says what is to be considered a signature is
10347@code{gnus-signature-separator}. This is normally the standard
10348@samp{^-- $} as mandated by son-of-RFC 1036. However, many people use
10349non-standard signature separators, so this variable can also be a list
10350of regular expressions to be tested, one by one. (Searches are done
10351from the end of the body towards the beginning.) One likely value is:
10352
10353@lisp
10354(setq gnus-signature-separator
10355 '("^-- $" ; @r{The standard}
10356 "^-- *$" ; @r{A common mangling}
10357 "^-------*$" ; @r{Many people just use a looong}
10358 ; @r{line of dashes. Shame!}
10359 "^ *--------*$" ; @r{Double-shame!}
10360 "^________*$" ; @r{Underscores are also popular}
10361 "^========*$")) ; @r{Pervert!}
10362@end lisp
10363
10364The more permissive you are, the more likely it is that you'll get false
10365positives.
10366
10367@vindex gnus-signature-limit
10368@code{gnus-signature-limit} provides a limit to what is considered a
10369signature when displaying articles.
10370
10371@enumerate
10372@item
10373If it is an integer, no signature may be longer (in characters) than
10374that integer.
10375@item
10376If it is a floating point number, no signature may be longer (in lines)
10377than that number.
10378@item
10379If it is a function, the function will be called without any parameters,
10380and if it returns @code{nil}, there is no signature in the buffer.
10381@item
10382If it is a string, it will be used as a regexp. If it matches, the text
10383in question is not a signature.
10384@end enumerate
10385
10386This variable can also be a list where the elements may be of the types
10387listed above. Here's an example:
10388
10389@lisp
10390(setq gnus-signature-limit
10391 '(200.0 "^---*Forwarded article"))
10392@end lisp
10393
10394This means that if there are more than 200 lines after the signature
10395separator, or the text after the signature separator is matched by
10396the regular expression @samp{^---*Forwarded article}, then it isn't a
10397signature after all.
10398
10399
10400@node Article Miscellanea
10401@subsection Article Miscellanea
10402
10403@table @kbd
10404@item A t
10405@kindex A t (Summary)
10406@findex gnus-article-babel
10407Translate the article from one language to another
10408(@code{gnus-article-babel}).
10409
10410@end table
10411
10412
10413@node MIME Commands
10414@section MIME Commands
10415@cindex MIME decoding
10416@cindex attachments
10417@cindex viewing attachments
10418
10419The following commands all understand the numerical prefix. For
01c52d31 10420instance, @kbd{3 K v} means ``view the third @acronym{MIME} part''.
4009494e
GM
10421
10422@table @kbd
10423@item b
10424@itemx K v
10425@kindex b (Summary)
10426@kindex K v (Summary)
10427View the @acronym{MIME} part.
10428
10429@item K o
10430@kindex K o (Summary)
10431Save the @acronym{MIME} part.
10432
01c52d31
MB
10433@item K O
10434@kindex K O (Summary)
10435Prompt for a file name, then save the @acronym{MIME} part and strip it
10436from the article. The stripped @acronym{MIME} object will be referred
10437via the message/external-body @acronym{MIME} type.
10438
10439@item K r
10440@kindex K r (Summary)
10441Replace the @acronym{MIME} part with an external body.
10442
10443@item K d
10444@kindex K d (Summary)
10445Delete the @acronym{MIME} part and add some information about the
10446removed part.
10447
4009494e
GM
10448@item K c
10449@kindex K c (Summary)
10450Copy the @acronym{MIME} part.
10451
10452@item K e
10453@kindex K e (Summary)
10454View the @acronym{MIME} part externally.
10455
10456@item K i
10457@kindex K i (Summary)
10458View the @acronym{MIME} part internally.
10459
10460@item K |
10461@kindex K | (Summary)
10462Pipe the @acronym{MIME} part to an external command.
10463@end table
10464
10465The rest of these @acronym{MIME} commands do not use the numerical prefix in
10466the same manner:
10467
10468@table @kbd
9b3ebcb6
MB
10469@item K H
10470@kindex K H (Summary)
10471@findex gnus-article-browse-html-article
10472View @samp{text/html} parts of the current article with a WWW browser.
1d4d7664
KY
10473Inline images embedded in a message using the @code{cid} scheme, as they
10474are generally considered to be safe, will be processed properly. The
10475message header is added to the beginning of every @acronym{HTML} part
10476unless the prefix argument is given.
9b3ebcb6 10477
1d4d7664
KY
10478Warning: Spammers use links to images (using the @code{http} scheme) in
10479@acronym{HTML} articles to verify whether you have read the message. As
10480this command passes the @acronym{HTML} content to the browser without
10481eliminating these ``web bugs'' you should only use it for mails from
10482trusted senders.
9b3ebcb6
MB
10483
10484If you always want to display @acronym{HTML} parts in the browser, set
10485@code{mm-text-html-renderer} to @code{nil}.
10486
1d4d7664
KY
10487This command creates temporary files to pass @acronym{HTML} contents
10488including images if any to the browser, and deletes them when exiting
10489the group (if you want).
10490
4009494e
GM
10491@item K b
10492@kindex K b (Summary)
10493Make all the @acronym{MIME} parts have buttons in front of them. This is
10494mostly useful if you wish to save (or perform other actions) on inlined
10495parts.
10496
10497@item K m
10498@kindex K m (Summary)
10499@findex gnus-summary-repair-multipart
10500Some multipart messages are transmitted with missing or faulty headers.
10501This command will attempt to ``repair'' these messages so that they can
10502be viewed in a more pleasant manner
10503(@code{gnus-summary-repair-multipart}).
10504
10505@item X m
10506@kindex X m (Summary)
10507@findex gnus-summary-save-parts
10508Save all parts matching a @acronym{MIME} type to a directory
10509(@code{gnus-summary-save-parts}). Understands the process/prefix
10510convention (@pxref{Process/Prefix}).
10511
10512@item M-t
10513@kindex M-t (Summary)
10514@findex gnus-summary-toggle-display-buttonized
10515Toggle the buttonized display of the article buffer
10516(@code{gnus-summary-toggle-display-buttonized}).
10517
10518@item W M w
10519@kindex W M w (Summary)
10520@findex gnus-article-decode-mime-words
10521Decode RFC 2047-encoded words in the article headers
10522(@code{gnus-article-decode-mime-words}).
10523
10524@item W M c
10525@kindex W M c (Summary)
10526@findex gnus-article-decode-charset
10527Decode encoded article bodies as well as charsets
10528(@code{gnus-article-decode-charset}).
10529
10530This command looks in the @code{Content-Type} header to determine the
10531charset. If there is no such header in the article, you can give it a
10532prefix, which will prompt for the charset to decode as. In regional
10533groups where people post using some common encoding (but do not
10534include @acronym{MIME} headers), you can set the @code{charset} group/topic
10535parameter to the required charset (@pxref{Group Parameters}).
10536
10537@item W M v
10538@kindex W M v (Summary)
10539@findex gnus-mime-view-all-parts
10540View all the @acronym{MIME} parts in the current article
10541(@code{gnus-mime-view-all-parts}).
10542
10543@end table
10544
10545Relevant variables:
10546
10547@table @code
10548@item gnus-ignored-mime-types
10549@vindex gnus-ignored-mime-types
10550This is a list of regexps. @acronym{MIME} types that match a regexp from
10551this list will be completely ignored by Gnus. The default value is
10552@code{nil}.
10553
10554To have all Vcards be ignored, you'd say something like this:
10555
10556@lisp
10557(setq gnus-ignored-mime-types
10558 '("text/x-vcard"))
10559@end lisp
10560
10561@item gnus-article-loose-mime
10562@vindex gnus-article-loose-mime
10563If non-@code{nil}, Gnus won't require the @samp{MIME-Version} header
10564before interpreting the message as a @acronym{MIME} message. This helps
10565when reading messages from certain broken mail user agents. The
b890d447 10566default is @code{t}.
4009494e
GM
10567
10568@item gnus-article-emulate-mime
10569@vindex gnus-article-emulate-mime
10570@cindex uuencode
10571@cindex yEnc
10572There are other, non-@acronym{MIME} encoding methods used. The most common
10573is @samp{uuencode}, but yEncode is also getting to be popular. If
10574this variable is non-@code{nil}, Gnus will look in message bodies to
10575see if it finds these encodings, and if so, it'll run them through the
10576Gnus @acronym{MIME} machinery. The default is @code{t}. Only
10577single-part yEnc encoded attachments can be decoded. There's no support
10578for encoding in Gnus.
10579
10580@item gnus-unbuttonized-mime-types
10581@vindex gnus-unbuttonized-mime-types
10582This is a list of regexps. @acronym{MIME} types that match a regexp from
10583this list won't have @acronym{MIME} buttons inserted unless they aren't
10584displayed or this variable is overridden by
10585@code{gnus-buttonized-mime-types}. The default value is
10586@code{(".*/.*")}. This variable is only used when
10587@code{gnus-inhibit-mime-unbuttonizing} is @code{nil}.
10588
10589@item gnus-buttonized-mime-types
10590@vindex gnus-buttonized-mime-types
10591This is a list of regexps. @acronym{MIME} types that match a regexp from
10592this list will have @acronym{MIME} buttons inserted unless they aren't
10593displayed. This variable overrides
10594@code{gnus-unbuttonized-mime-types}. The default value is @code{nil}.
10595This variable is only used when @code{gnus-inhibit-mime-unbuttonizing}
10596is @code{nil}.
10597
10598To see e.g. security buttons but no other buttons, you could set this
10599variable to @code{("multipart/signed")} and leave
10600@code{gnus-unbuttonized-mime-types} at the default value.
10601
10602You could also add @code{"multipart/alternative"} to this list to
10603display radio buttons that allow you to choose one of two media types
10604those mails include. See also @code{mm-discouraged-alternatives}
10605(@pxref{Display Customization, ,Display Customization, emacs-mime, The
10606Emacs MIME Manual}).
10607
10608@item gnus-inhibit-mime-unbuttonizing
10609@vindex gnus-inhibit-mime-unbuttonizing
10610If this is non-@code{nil}, then all @acronym{MIME} parts get buttons. The
10611default value is @code{nil}.
10612
10613@item gnus-article-mime-part-function
10614@vindex gnus-article-mime-part-function
10615For each @acronym{MIME} part, this function will be called with the @acronym{MIME}
10616handle as the parameter. The function is meant to be used to allow
10617users to gather information from the article (e. g., add Vcard info to
10618the bbdb database) or to do actions based on parts (e. g., automatically
10619save all jpegs into some directory).
10620
10621Here's an example function the does the latter:
10622
10623@lisp
10624(defun my-save-all-jpeg-parts (handle)
10625 (when (equal (car (mm-handle-type handle)) "image/jpeg")
10626 (with-temp-buffer
10627 (insert (mm-get-part handle))
10628 (write-region (point-min) (point-max)
10629 (read-file-name "Save jpeg to: ")))))
10630(setq gnus-article-mime-part-function
10631 'my-save-all-jpeg-parts)
10632@end lisp
10633
10634@vindex gnus-mime-multipart-functions
10635@item gnus-mime-multipart-functions
10636Alist of @acronym{MIME} multipart types and functions to handle them.
10637
10638@vindex gnus-mime-display-multipart-alternative-as-mixed
10639@item gnus-mime-display-multipart-alternative-as-mixed
10640Display "multipart/alternative" parts as "multipart/mixed".
10641
10642@vindex gnus-mime-display-multipart-related-as-mixed
10643@item gnus-mime-display-multipart-related-as-mixed
10644Display "multipart/related" parts as "multipart/mixed".
10645
9b3ebcb6 10646If displaying @samp{text/html} is discouraged, see
4009494e
GM
10647@code{mm-discouraged-alternatives}, images or other material inside a
10648"multipart/related" part might be overlooked when this variable is
10649@code{nil}. @ref{Display Customization, Display Customization, ,
10650emacs-mime, Emacs-Mime Manual}.
10651
10652@vindex gnus-mime-display-multipart-as-mixed
10653@item gnus-mime-display-multipart-as-mixed
10654Display "multipart" parts as "multipart/mixed". If @code{t}, it
10655overrides @code{nil} values of
10656@code{gnus-mime-display-multipart-alternative-as-mixed} and
10657@code{gnus-mime-display-multipart-related-as-mixed}.
10658
10659@vindex mm-file-name-rewrite-functions
10660@item mm-file-name-rewrite-functions
10661List of functions used for rewriting file names of @acronym{MIME} parts.
10662Each function takes a file name as input and returns a file name.
10663
10664Ready-made functions include@*
10665@code{mm-file-name-delete-whitespace},
10666@code{mm-file-name-trim-whitespace},
10667@code{mm-file-name-collapse-whitespace}, and
10668@code{mm-file-name-replace-whitespace}. The later uses the value of
10669the variable @code{mm-file-name-replace-whitespace} to replace each
10670whitespace character in a file name with that string; default value
10671is @code{"_"} (a single underscore).
10672@findex mm-file-name-delete-whitespace
10673@findex mm-file-name-trim-whitespace
10674@findex mm-file-name-collapse-whitespace
10675@findex mm-file-name-replace-whitespace
10676@vindex mm-file-name-replace-whitespace
10677
10678The standard functions @code{capitalize}, @code{downcase},
10679@code{upcase}, and @code{upcase-initials} may be useful, too.
10680
10681Everybody knows that whitespace characters in file names are evil,
10682except those who don't know. If you receive lots of attachments from
10683such unenlightened users, you can make live easier by adding
10684
10685@lisp
10686(setq mm-file-name-rewrite-functions
10687 '(mm-file-name-trim-whitespace
10688 mm-file-name-collapse-whitespace
10689 mm-file-name-replace-whitespace))
10690@end lisp
10691
10692@noindent
10693to your @file{~/.gnus.el} file.
10694
10695@end table
10696
10697
10698@node Charsets
10699@section Charsets
10700@cindex charsets
10701
10702People use different charsets, and we have @acronym{MIME} to let us know what
10703charsets they use. Or rather, we wish we had. Many people use
10704newsreaders and mailers that do not understand or use @acronym{MIME}, and
10705just send out messages without saying what character sets they use. To
10706help a bit with this, some local news hierarchies have policies that say
10707what character set is the default. For instance, the @samp{fj}
10708hierarchy uses @code{iso-2022-jp}.
10709
10710@vindex gnus-group-charset-alist
10711This knowledge is encoded in the @code{gnus-group-charset-alist}
10712variable, which is an alist of regexps (use the first item to match full
10713group names) and default charsets to be used when reading these groups.
10714
10715@vindex gnus-newsgroup-ignored-charsets
10716In addition, some people do use soi-disant @acronym{MIME}-aware agents that
10717aren't. These blithely mark messages as being in @code{iso-8859-1}
10718even if they really are in @code{koi-8}. To help here, the
10719@code{gnus-newsgroup-ignored-charsets} variable can be used. The
10720charsets that are listed here will be ignored. The variable can be
10721set on a group-by-group basis using the group parameters (@pxref{Group
10722Parameters}). The default value is @code{(unknown-8bit x-unknown)},
10723which includes values some agents insist on having in there.
10724
10725@vindex gnus-group-posting-charset-alist
10726When posting, @code{gnus-group-posting-charset-alist} is used to
10727determine which charsets should not be encoded using the @acronym{MIME}
10728encodings. For instance, some hierarchies discourage using
10729quoted-printable header encoding.
10730
10731This variable is an alist of regexps and permitted unencoded charsets
10732for posting. Each element of the alist has the form @code{(}@var{test
10733header body-list}@code{)}, where:
10734
10735@table @var
10736@item test
10737is either a regular expression matching the newsgroup header or a
10738variable to query,
10739@item header
10740is the charset which may be left unencoded in the header (@code{nil}
10741means encode all charsets),
10742@item body-list
10743is a list of charsets which may be encoded using 8bit content-transfer
10744encoding in the body, or one of the special values @code{nil} (always
10745encode using quoted-printable) or @code{t} (always use 8bit).
10746@end table
10747
10748@cindex Russian
10749@cindex koi8-r
10750@cindex koi8-u
10751@cindex iso-8859-5
10752@cindex coding system aliases
10753@cindex preferred charset
10754
10755@xref{Encoding Customization, , Encoding Customization, emacs-mime,
10756The Emacs MIME Manual}, for additional variables that control which
10757MIME charsets are used when sending messages.
10758
10759Other charset tricks that may be useful, although not Gnus-specific:
10760
10761If there are several @acronym{MIME} charsets that encode the same Emacs
10762charset, you can choose what charset to use by saying the following:
10763
10764@lisp
10765(put-charset-property 'cyrillic-iso8859-5
10766 'preferred-coding-system 'koi8-r)
10767@end lisp
10768
10769This means that Russian will be encoded using @code{koi8-r} instead of
10770the default @code{iso-8859-5} @acronym{MIME} charset.
10771
10772If you want to read messages in @code{koi8-u}, you can cheat and say
10773
10774@lisp
10775(define-coding-system-alias 'koi8-u 'koi8-r)
10776@end lisp
10777
10778This will almost do the right thing.
10779
10780And finally, to read charsets like @code{windows-1251}, you can say
10781something like
10782
10783@lisp
10784(codepage-setup 1251)
10785(define-coding-system-alias 'windows-1251 'cp1251)
10786@end lisp
10787
10788
10789@node Article Commands
10790@section Article Commands
10791
10792@table @kbd
10793
10794@item A P
10795@cindex PostScript
10796@cindex printing
10797@kindex A P (Summary)
10798@vindex gnus-ps-print-hook
10799@findex gnus-summary-print-article
10800Generate and print a PostScript image of the article buffer
10801(@code{gnus-summary-print-article}). @code{gnus-ps-print-hook} will
10802be run just before printing the buffer. An alternative way to print
10803article is to use Muttprint (@pxref{Saving Articles}).
10804
8ccbef23
G
10805@item A C
10806@vindex gnus-fetch-partial-articles
10807@findex gnus-summary-show-complete-article
229b59da 10808If @code{<backend>-fetch-partial-articles} is non-@code{nil}, Gnus will
8ccbef23
G
10809fetch partial articles, if the backend it fetches them from supports
10810it. Currently only @code{nnimap} does. If you're looking at a
10811partial article, and want to see the complete article instead, then
10812the @kbd{A C} command (@code{gnus-summary-show-complete-article}) will
10813do so.
10814
4009494e
GM
10815@end table
10816
10817
10818@node Summary Sorting
10819@section Summary Sorting
10820@cindex summary sorting
10821
10822You can have the summary buffer sorted in various ways, even though I
10823can't really see why you'd want that.
10824
10825@table @kbd
10826
10827@item C-c C-s C-n
10828@kindex C-c C-s C-n (Summary)
10829@findex gnus-summary-sort-by-number
10830Sort by article number (@code{gnus-summary-sort-by-number}).
10831
6ecfe5c2
MB
10832@item C-c C-s C-m C-n
10833@kindex C-c C-s C-n (Summary)
10834@findex gnus-summary-sort-by-most-recent-number
10835Sort by most recent article number
10836(@code{gnus-summary-sort-by-most-recent-number}).
10837
4009494e
GM
10838@item C-c C-s C-a
10839@kindex C-c C-s C-a (Summary)
10840@findex gnus-summary-sort-by-author
10841Sort by author (@code{gnus-summary-sort-by-author}).
10842
01c52d31
MB
10843@item C-c C-s C-t
10844@kindex C-c C-s C-t (Summary)
10845@findex gnus-summary-sort-by-recipient
10846Sort by recipient (@code{gnus-summary-sort-by-recipient}).
10847
4009494e
GM
10848@item C-c C-s C-s
10849@kindex C-c C-s C-s (Summary)
10850@findex gnus-summary-sort-by-subject
10851Sort by subject (@code{gnus-summary-sort-by-subject}).
10852
10853@item C-c C-s C-d
10854@kindex C-c C-s C-d (Summary)
10855@findex gnus-summary-sort-by-date
10856Sort by date (@code{gnus-summary-sort-by-date}).
10857
6ecfe5c2
MB
10858@item C-c C-s C-m C-d
10859@kindex C-c C-s C-m C-d (Summary)
10860@findex gnus-summary-sort-by-most-recent-date
10861Sort by most recent date (@code{gnus-summary-sort-by-most-recent-date}).
10862
4009494e
GM
10863@item C-c C-s C-l
10864@kindex C-c C-s C-l (Summary)
10865@findex gnus-summary-sort-by-lines
10866Sort by lines (@code{gnus-summary-sort-by-lines}).
10867
10868@item C-c C-s C-c
10869@kindex C-c C-s C-c (Summary)
10870@findex gnus-summary-sort-by-chars
10871Sort by article length (@code{gnus-summary-sort-by-chars}).
10872
10873@item C-c C-s C-i
10874@kindex C-c C-s C-i (Summary)
10875@findex gnus-summary-sort-by-score
10876Sort by score (@code{gnus-summary-sort-by-score}).
10877
10878@item C-c C-s C-r
10879@kindex C-c C-s C-r (Summary)
10880@findex gnus-summary-sort-by-random
10881Randomize (@code{gnus-summary-sort-by-random}).
10882
10883@item C-c C-s C-o
10884@kindex C-c C-s C-o (Summary)
10885@findex gnus-summary-sort-by-original
10886Sort using the default sorting method
10887(@code{gnus-summary-sort-by-original}).
10888@end table
10889
10890These functions will work both when you use threading and when you don't
10891use threading. In the latter case, all summary lines will be sorted,
10892line by line. In the former case, sorting will be done on a
10893root-by-root basis, which might not be what you were looking for. To
10894toggle whether to use threading, type @kbd{T T} (@pxref{Thread
10895Commands}).
10896
6ecfe5c2
MB
10897If a prefix argument if given, the sort order is reversed.
10898
4009494e
GM
10899
10900@node Finding the Parent
10901@section Finding the Parent
10902@cindex parent articles
10903@cindex referring articles
10904
10905@table @kbd
10906@item ^
10907@kindex ^ (Summary)
10908@findex gnus-summary-refer-parent-article
10909If you'd like to read the parent of the current article, and it is not
10910displayed in the summary buffer, you might still be able to. That is,
10911if the current group is fetched by @acronym{NNTP}, the parent hasn't expired
10912and the @code{References} in the current article are not mangled, you
10913can just press @kbd{^} or @kbd{A r}
10914(@code{gnus-summary-refer-parent-article}). If everything goes well,
10915you'll get the parent. If the parent is already displayed in the
10916summary buffer, point will just move to this article.
10917
10918If given a positive numerical prefix, fetch that many articles back into
10919the ancestry. If given a negative numerical prefix, fetch just that
10920ancestor. So if you say @kbd{3 ^}, Gnus will fetch the parent, the
10921grandparent and the grandgrandparent of the current article. If you say
10922@kbd{-3 ^}, Gnus will only fetch the grandgrandparent of the current
10923article.
10924
10925@item A R (Summary)
10926@findex gnus-summary-refer-references
10927@kindex A R (Summary)
10928Fetch all articles mentioned in the @code{References} header of the
10929article (@code{gnus-summary-refer-references}).
10930
10931@item A T (Summary)
10932@findex gnus-summary-refer-thread
10933@kindex A T (Summary)
10934Display the full thread where the current article appears
10935(@code{gnus-summary-refer-thread}). This command has to fetch all the
10936headers in the current group to work, so it usually takes a while. If
10937you do it often, you may consider setting @code{gnus-fetch-old-headers}
10938to @code{invisible} (@pxref{Filling In Threads}). This won't have any
10939visible effects normally, but it'll make this command work a whole lot
10940faster. Of course, it'll make group entry somewhat slow.
10941
10942@vindex gnus-refer-thread-limit
10943The @code{gnus-refer-thread-limit} variable says how many old (i. e.,
10944articles before the first displayed in the current group) headers to
10945fetch when doing this command. The default is 200. If @code{t}, all
10946the available headers will be fetched. This variable can be overridden
10947by giving the @kbd{A T} command a numerical prefix.
10948
10949@item M-^ (Summary)
10950@findex gnus-summary-refer-article
10951@kindex M-^ (Summary)
10952@cindex Message-ID
10953@cindex fetching by Message-ID
10954You can also ask Gnus for an arbitrary article, no matter what group it
10955belongs to. @kbd{M-^} (@code{gnus-summary-refer-article}) will ask you
10956for a @code{Message-ID}, which is one of those long, hard-to-read
10957thingies that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}.
10958You have to get it all exactly right. No fuzzy searches, I'm afraid.
10959
10960Gnus looks for the @code{Message-ID} in the headers that have already
10961been fetched, but also tries all the select methods specified by
10962@code{gnus-refer-article-method} if it is not found.
10963@end table
10964
10965@vindex gnus-refer-article-method
10966If the group you are reading is located on a back end that does not
10967support fetching by @code{Message-ID} very well (like @code{nnspool}),
10968you can set @code{gnus-refer-article-method} to an @acronym{NNTP} method. It
10969would, perhaps, be best if the @acronym{NNTP} server you consult is the one
10970updating the spool you are reading from, but that's not really
10971necessary.
10972
10973It can also be a list of select methods, as well as the special symbol
10974@code{current}, which means to use the current select method. If it
10975is a list, Gnus will try all the methods in the list until it finds a
10976match.
10977
10978Here's an example setting that will first try the current method, and
10979then ask Google if that fails:
10980
10981@lisp
10982(setq gnus-refer-article-method
10983 '(current
10984 (nnweb "google" (nnweb-type google))))
10985@end lisp
10986
10987Most of the mail back ends support fetching by @code{Message-ID}, but
10988do not do a particularly excellent job at it. That is, @code{nnmbox},
10989@code{nnbabyl}, @code{nnmaildir}, @code{nnml}, are able to locate
10990articles from any groups, while @code{nnfolder}, and @code{nnimap} are
10991only able to locate articles that have been posted to the current
10992group. (Anything else would be too time consuming.) @code{nnmh} does
10993not support this at all.
10994
10995
10996@node Alternative Approaches
10997@section Alternative Approaches
10998
10999Different people like to read news using different methods. This being
11000Gnus, we offer a small selection of minor modes for the summary buffers.
11001
11002@menu
11003* Pick and Read:: First mark articles and then read them.
11004* Binary Groups:: Auto-decode all articles.
11005@end menu
11006
11007
11008@node Pick and Read
11009@subsection Pick and Read
11010@cindex pick and read
11011
11012Some newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) use
11013a two-phased reading interface. The user first marks in a summary
11014buffer the articles she wants to read. Then she starts reading the
11015articles with just an article buffer displayed.
11016
11017@findex gnus-pick-mode
11018@kindex M-x gnus-pick-mode
11019Gnus provides a summary buffer minor mode that allows
11020this---@code{gnus-pick-mode}. This basically means that a few process
11021mark commands become one-keystroke commands to allow easy marking, and
11022it provides one additional command for switching to the summary buffer.
11023
11024Here are the available keystrokes when using pick mode:
11025
11026@table @kbd
11027@item .
11028@kindex . (Pick)
11029@findex gnus-pick-article-or-thread
11030Pick the article or thread on the current line
11031(@code{gnus-pick-article-or-thread}). If the variable
11032@code{gnus-thread-hide-subtree} is true, then this key selects the
11033entire thread when used at the first article of the thread. Otherwise,
11034it selects just the article. If given a numerical prefix, go to that
11035thread or article and pick it. (The line number is normally displayed
11036at the beginning of the summary pick lines.)
11037
11038@item SPACE
11039@kindex SPACE (Pick)
11040@findex gnus-pick-next-page
11041Scroll the summary buffer up one page (@code{gnus-pick-next-page}). If
11042at the end of the buffer, start reading the picked articles.
11043
11044@item u
11045@kindex u (Pick)
11046@findex gnus-pick-unmark-article-or-thread.
11047Unpick the thread or article
11048(@code{gnus-pick-unmark-article-or-thread}). If the variable
11049@code{gnus-thread-hide-subtree} is true, then this key unpicks the
11050thread if used at the first article of the thread. Otherwise it unpicks
11051just the article. You can give this key a numerical prefix to unpick
11052the thread or article at that line.
11053
11054@item RET
11055@kindex RET (Pick)
11056@findex gnus-pick-start-reading
11057@vindex gnus-pick-display-summary
11058Start reading the picked articles (@code{gnus-pick-start-reading}). If
11059given a prefix, mark all unpicked articles as read first. If
11060@code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer
11061will still be visible when you are reading.
11062
11063@end table
11064
11065All the normal summary mode commands are still available in the
11066pick-mode, with the exception of @kbd{u}. However @kbd{!} is available
11067which is mapped to the same function
11068@code{gnus-summary-tick-article-forward}.
11069
11070If this sounds like a good idea to you, you could say:
11071
11072@lisp
11073(add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
11074@end lisp
11075
11076@vindex gnus-pick-mode-hook
11077@code{gnus-pick-mode-hook} is run in pick minor mode buffers.
11078
11079@vindex gnus-mark-unpicked-articles-as-read
11080If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark
11081all unpicked articles as read. The default is @code{nil}.
11082
11083@vindex gnus-summary-pick-line-format
11084The summary line format in pick mode is slightly different from the
11085standard format. At the beginning of each line the line number is
11086displayed. The pick mode line format is controlled by the
11087@code{gnus-summary-pick-line-format} variable (@pxref{Formatting
11088Variables}). It accepts the same format specs that
11089@code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}).
11090
11091
11092@node Binary Groups
11093@subsection Binary Groups
11094@cindex binary groups
11095
11096@findex gnus-binary-mode
11097@kindex M-x gnus-binary-mode
11098If you spend much time in binary groups, you may grow tired of hitting
11099@kbd{X u}, @kbd{n}, @kbd{RET} all the time. @kbd{M-x gnus-binary-mode}
11100is a minor mode for summary buffers that makes all ordinary Gnus article
11101selection functions uudecode series of articles and display the result
11102instead of just displaying the articles the normal way.
11103
11104@kindex g (Binary)
11105@findex gnus-binary-show-article
11106The only way, in fact, to see the actual articles is the @kbd{g}
11107command, when you have turned on this mode
11108(@code{gnus-binary-show-article}).
11109
11110@vindex gnus-binary-mode-hook
11111@code{gnus-binary-mode-hook} is called in binary minor mode buffers.
11112
11113
11114@node Tree Display
11115@section Tree Display
11116@cindex trees
11117
11118@vindex gnus-use-trees
11119If you don't like the normal Gnus summary display, you might try setting
11120@code{gnus-use-trees} to @code{t}. This will create (by default) an
11121additional @dfn{tree buffer}. You can execute all summary mode commands
11122in the tree buffer.
11123
11124There are a few variables to customize the tree display, of course:
11125
11126@table @code
11127@item gnus-tree-mode-hook
11128@vindex gnus-tree-mode-hook
11129A hook called in all tree mode buffers.
11130
11131@item gnus-tree-mode-line-format
11132@vindex gnus-tree-mode-line-format
11133A format string for the mode bar in the tree mode buffers (@pxref{Mode
11134Line Formatting}). The default is @samp{Gnus: %%b %S %Z}. For a list
11135of valid specs, @pxref{Summary Buffer Mode Line}.
11136
11137@item gnus-selected-tree-face
11138@vindex gnus-selected-tree-face
11139Face used for highlighting the selected article in the tree buffer. The
11140default is @code{modeline}.
11141
11142@item gnus-tree-line-format
11143@vindex gnus-tree-line-format
11144A format string for the tree nodes. The name is a bit of a misnomer,
11145though---it doesn't define a line, but just the node. The default value
11146is @samp{%(%[%3,3n%]%)}, which displays the first three characters of
11147the name of the poster. It is vital that all nodes are of the same
11148length, so you @emph{must} use @samp{%4,4n}-like specifiers.
11149
11150Valid specs are:
11151
11152@table @samp
11153@item n
11154The name of the poster.
11155@item f
11156The @code{From} header.
11157@item N
11158The number of the article.
11159@item [
11160The opening bracket.
11161@item ]
11162The closing bracket.
11163@item s
11164The subject.
11165@end table
11166
11167@xref{Formatting Variables}.
11168
11169Variables related to the display are:
11170
11171@table @code
11172@item gnus-tree-brackets
11173@vindex gnus-tree-brackets
11174This is used for differentiating between ``real'' articles and
11175``sparse'' articles. The format is
11176@example
11177((@var{real-open} . @var{real-close})
11178 (@var{sparse-open} . @var{sparse-close})
11179 (@var{dummy-open} . @var{dummy-close}))
11180@end example
11181and the default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))}.
11182
11183@item gnus-tree-parent-child-edges
11184@vindex gnus-tree-parent-child-edges
11185This is a list that contains the characters used for connecting parent
11186nodes to their children. The default is @code{(?- ?\\ ?|)}.
11187
11188@end table
11189
11190@item gnus-tree-minimize-window
11191@vindex gnus-tree-minimize-window
11192If this variable is non-@code{nil}, Gnus will try to keep the tree
11193buffer as small as possible to allow more room for the other Gnus
11194windows. If this variable is a number, the tree buffer will never be
11195higher than that number. The default is @code{t}. Note that if you
11196have several windows displayed side-by-side in a frame and the tree
11197buffer is one of these, minimizing the tree window will also resize all
11198other windows displayed next to it.
11199
11200You may also wish to add the following hook to keep the window minimized
11201at all times:
11202
11203@lisp
11204(add-hook 'gnus-configure-windows-hook
11205 'gnus-tree-perhaps-minimize)
11206@end lisp
11207
11208@item gnus-generate-tree-function
11209@vindex gnus-generate-tree-function
11210@findex gnus-generate-horizontal-tree
11211@findex gnus-generate-vertical-tree
11212The function that actually generates the thread tree. Two predefined
11213functions are available: @code{gnus-generate-horizontal-tree} and
11214@code{gnus-generate-vertical-tree} (which is the default).
11215
11216@end table
11217
11218Here's an example from a horizontal tree buffer:
11219
11220@example
11221@{***@}-(***)-[odd]-[Gun]
11222 | \[Jan]
11223 | \[odd]-[Eri]
11224 | \(***)-[Eri]
11225 | \[odd]-[Paa]
11226 \[Bjo]
11227 \[Gun]
11228 \[Gun]-[Jor]
11229@end example
11230
11231Here's the same thread displayed in a vertical tree buffer:
11232
11233@example
11234@group
11235@{***@}
11236 |--------------------------\-----\-----\
11237(***) [Bjo] [Gun] [Gun]
11238 |--\-----\-----\ |
11239[odd] [Jan] [odd] (***) [Jor]
11240 | | |--\
11241[Gun] [Eri] [Eri] [odd]
11242 |
11243 [Paa]
11244@end group
11245@end example
11246
11247If you're using horizontal trees, it might be nice to display the trees
11248side-by-side with the summary buffer. You could add something like the
11249following to your @file{~/.gnus.el} file:
11250
11251@lisp
11252(setq gnus-use-trees t
11253 gnus-generate-tree-function 'gnus-generate-horizontal-tree
11254 gnus-tree-minimize-window nil)
11255(gnus-add-configuration
11256 '(article
11257 (vertical 1.0
11258 (horizontal 0.25
11259 (summary 0.75 point)
11260 (tree 1.0))
11261 (article 1.0))))
11262@end lisp
11263
11264@xref{Window Layout}.
11265
11266
11267@node Mail Group Commands
11268@section Mail Group Commands
11269@cindex mail group commands
11270
11271Some commands only make sense in mail groups. If these commands are
11272invalid in the current group, they will raise a hell and let you know.
11273
11274All these commands (except the expiry and edit commands) use the
11275process/prefix convention (@pxref{Process/Prefix}).
11276
11277@table @kbd
11278
11279@item B e
11280@kindex B e (Summary)
11281@findex gnus-summary-expire-articles
11282@cindex expiring mail
11283Run all expirable articles in the current group through the expiry
11284process (@code{gnus-summary-expire-articles}). That is, delete all
11285expirable articles in the group that have been around for a while.
11286(@pxref{Expiring Mail}).
11287
11288@item B C-M-e
11289@kindex B C-M-e (Summary)
11290@findex gnus-summary-expire-articles-now
11291@cindex expiring mail
11292Delete all the expirable articles in the group
11293(@code{gnus-summary-expire-articles-now}). This means that @strong{all}
11294articles eligible for expiry in the current group will
11295disappear forever into that big @file{/dev/null} in the sky.
11296
11297@item B DEL
11298@kindex B DEL (Summary)
b1519d85 11299@cindex deleting mail
4009494e
GM
11300@findex gnus-summary-delete-article
11301@c @icon{gnus-summary-mail-delete}
11302Delete the mail article. This is ``delete'' as in ``delete it from your
11303disk forever and ever, never to return again.'' Use with caution.
11304(@code{gnus-summary-delete-article}).
11305
11306@item B m
11307@kindex B m (Summary)
11308@cindex move mail
11309@findex gnus-summary-move-article
11310@vindex gnus-preserve-marks
11311Move the article from one mail group to another
11312(@code{gnus-summary-move-article}). Marks will be preserved if
11313@code{gnus-preserve-marks} is non-@code{nil} (which is the default).
11314
11315@item B c
11316@kindex B c (Summary)
11317@cindex copy mail
11318@findex gnus-summary-copy-article
11319@c @icon{gnus-summary-mail-copy}
11320Copy the article from one group (mail group or not) to a mail group
11321(@code{gnus-summary-copy-article}). Marks will be preserved if
11322@code{gnus-preserve-marks} is non-@code{nil} (which is the default).
11323
11324@item B B
11325@kindex B B (Summary)
11326@cindex crosspost mail
11327@findex gnus-summary-crosspost-article
11328Crosspost the current article to some other group
11329(@code{gnus-summary-crosspost-article}). This will create a new copy of
11330the article in the other group, and the Xref headers of the article will
11331be properly updated.
11332
11333@item B i
11334@kindex B i (Summary)
11335@findex gnus-summary-import-article
11336Import an arbitrary file into the current mail newsgroup
11337(@code{gnus-summary-import-article}). You will be prompted for a file
11338name, a @code{From} header and a @code{Subject} header.
11339
11340@item B I
11341@kindex B I (Summary)
11342@findex gnus-summary-create-article
11343Create an empty article in the current mail newsgroups
11344(@code{gnus-summary-create-article}). You will be prompted for a
11345@code{From} header and a @code{Subject} header.
11346
11347@item B r
11348@kindex B r (Summary)
11349@findex gnus-summary-respool-article
11350@vindex gnus-summary-respool-default-method
11351Respool the mail article (@code{gnus-summary-respool-article}).
11352@code{gnus-summary-respool-default-method} will be used as the default
11353select method when respooling. This variable is @code{nil} by default,
11354which means that the current group select method will be used instead.
11355Marks will be preserved if @code{gnus-preserve-marks} is non-@code{nil}
11356(which is the default).
11357
11358@item B w
11359@itemx e
11360@kindex B w (Summary)
11361@kindex e (Summary)
11362@findex gnus-summary-edit-article
11363@kindex C-c C-c (Article)
11364@findex gnus-summary-edit-article-done
11365Edit the current article (@code{gnus-summary-edit-article}). To finish
11366editing and make the changes permanent, type @kbd{C-c C-c}
11367(@code{gnus-summary-edit-article-done}). If you give a prefix to the
11368@kbd{C-c C-c} command, Gnus won't re-highlight the article.
11369
11370@item B q
11371@kindex B q (Summary)
11372@findex gnus-summary-respool-query
11373If you want to re-spool an article, you might be curious as to what group
11374the article will end up in before you do the re-spooling. This command
11375will tell you (@code{gnus-summary-respool-query}).
11376
11377@item B t
11378@kindex B t (Summary)
11379@findex gnus-summary-respool-trace
11380Similarly, this command will display all fancy splitting patterns used
11381when respooling, if any (@code{gnus-summary-respool-trace}).
11382
11383@item B p
11384@kindex B p (Summary)
11385@findex gnus-summary-article-posted-p
11386Some people have a tendency to send you ``courtesy'' copies when they
11387follow up to articles you have posted. These usually have a
11388@code{Newsgroups} header in them, but not always. This command
11389(@code{gnus-summary-article-posted-p}) will try to fetch the current
11390article from your news server (or rather, from
11391@code{gnus-refer-article-method} or @code{gnus-select-method}) and will
11392report back whether it found the article or not. Even if it says that
11393it didn't find the article, it may have been posted anyway---mail
11394propagation is much faster than news propagation, and the news copy may
11395just not have arrived yet.
11396
11397@item K E
11398@kindex K E (Summary)
11399@findex gnus-article-encrypt-body
11400@vindex gnus-article-encrypt-protocol
11401Encrypt the body of an article (@code{gnus-article-encrypt-body}).
11402The body is encrypted with the encryption protocol specified by the
11403variable @code{gnus-article-encrypt-protocol}.
11404
11405@end table
11406
11407@vindex gnus-move-split-methods
11408@cindex moving articles
11409If you move (or copy) articles regularly, you might wish to have Gnus
11410suggest where to put the articles. @code{gnus-move-split-methods} is a
11411variable that uses the same syntax as @code{gnus-split-methods}
11412(@pxref{Saving Articles}). You may customize that variable to create
11413suggestions you find reasonable. (Note that
11414@code{gnus-move-split-methods} uses group names where
11415@code{gnus-split-methods} uses file names.)
11416
11417@lisp
11418(setq gnus-move-split-methods
11419 '(("^From:.*Lars Magne" "nnml:junk")
11420 ("^Subject:.*gnus" "nnfolder:important")
11421 (".*" "nnml:misc")))
11422@end lisp
11423
11424
11425@node Various Summary Stuff
11426@section Various Summary Stuff
11427
11428@menu
11429* Summary Group Information:: Information oriented commands.
11430* Searching for Articles:: Multiple article commands.
11431* Summary Generation Commands::
11432* Really Various Summary Commands:: Those pesky non-conformant commands.
11433@end menu
11434
11435@table @code
11436@vindex gnus-summary-display-while-building
11437@item gnus-summary-display-while-building
11438If non-@code{nil}, show and update the summary buffer as it's being
11439built. If @code{t}, update the buffer after every line is inserted.
11440If the value is an integer, @var{n}, update the display every @var{n}
11441lines. The default is @code{nil}.
11442
11443@vindex gnus-summary-display-arrow
11444@item gnus-summary-display-arrow
11445If non-@code{nil}, display an arrow in the fringe to indicate the
11446current article.
11447
11448@vindex gnus-summary-mode-hook
11449@item gnus-summary-mode-hook
11450This hook is called when creating a summary mode buffer.
11451
11452@vindex gnus-summary-generate-hook
11453@item gnus-summary-generate-hook
11454This is called as the last thing before doing the threading and the
11455generation of the summary buffer. It's quite convenient for customizing
11456the threading variables based on what data the newsgroup has. This hook
11457is called from the summary buffer after most summary buffer variables
11458have been set.
11459
11460@vindex gnus-summary-prepare-hook
11461@item gnus-summary-prepare-hook
11462It is called after the summary buffer has been generated. You might use
11463it to, for instance, highlight lines or modify the look of the buffer in
11464some other ungodly manner. I don't care.
11465
11466@vindex gnus-summary-prepared-hook
11467@item gnus-summary-prepared-hook
11468A hook called as the very last thing after the summary buffer has been
11469generated.
11470
11471@vindex gnus-summary-ignore-duplicates
11472@item gnus-summary-ignore-duplicates
11473When Gnus discovers two articles that have the same @code{Message-ID},
11474it has to do something drastic. No articles are allowed to have the
11475same @code{Message-ID}, but this may happen when reading mail from some
11476sources. Gnus allows you to customize what happens with this variable.
11477If it is @code{nil} (which is the default), Gnus will rename the
11478@code{Message-ID} (for display purposes only) and display the article as
11479any other article. If this variable is @code{t}, it won't display the
11480article---it'll be as if it never existed.
11481
11482@vindex gnus-alter-articles-to-read-function
11483@item gnus-alter-articles-to-read-function
11484This function, which takes two parameters (the group name and the list
11485of articles to be selected), is called to allow the user to alter the
11486list of articles to be selected.
11487
11488For instance, the following function adds the list of cached articles to
11489the list in one particular group:
11490
11491@lisp
11492(defun my-add-cached-articles (group articles)
11493 (if (string= group "some.group")
11494 (append gnus-newsgroup-cached articles)
11495 articles))
11496@end lisp
11497
11498@vindex gnus-newsgroup-variables
11499@item gnus-newsgroup-variables
11500A list of newsgroup (summary buffer) local variables, or cons of
11501variables and their default expressions to be evalled (when the default
11502values are not @code{nil}), that should be made global while the summary
11503buffer is active.
11504
11505Note: The default expressions will be evaluated (using function
11506@code{eval}) before assignment to the local variable rather than just
11507assigned to it. If the default expression is the symbol @code{global},
11508that symbol will not be evaluated but the global value of the local
11509variable will be used instead.
11510
11511These variables can be used to set variables in the group parameters
11512while still allowing them to affect operations done in other
11513buffers. For example:
11514
11515@lisp
11516(setq gnus-newsgroup-variables
11517 '(message-use-followup-to
11518 (gnus-visible-headers .
11519 "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^To:")))
11520@end lisp
11521
11522Also @pxref{Group Parameters}.
3a23a519
MB
11523
11524@vindex gnus-propagate-marks
11525@item gnus-propagate-marks
11526If non-@code{nil}, propagate marks to the backends for possible
11527storing. @xref{NNTP marks}, and friends, for a more fine-grained
11528sieve.
11529
4009494e
GM
11530@end table
11531
11532
11533@node Summary Group Information
11534@subsection Summary Group Information
11535
11536@table @kbd
11537
4009494e
GM
11538@item H d
11539@kindex H d (Summary)
11540@findex gnus-summary-describe-group
11541Give a brief description of the current group
11542(@code{gnus-summary-describe-group}). If given a prefix, force
11543rereading the description from the server.
11544
11545@item H h
11546@kindex H h (Summary)
11547@findex gnus-summary-describe-briefly
11548Give an extremely brief description of the most important summary
11549keystrokes (@code{gnus-summary-describe-briefly}).
11550
11551@item H i
11552@kindex H i (Summary)
11553@findex gnus-info-find-node
11554Go to the Gnus info node (@code{gnus-info-find-node}).
11555@end table
11556
11557
11558@node Searching for Articles
11559@subsection Searching for Articles
11560
11561@table @kbd
11562
11563@item M-s
11564@kindex M-s (Summary)
11565@findex gnus-summary-search-article-forward
11566Search through all subsequent (raw) articles for a regexp
11567(@code{gnus-summary-search-article-forward}).
11568
11569@item M-r
11570@kindex M-r (Summary)
11571@findex gnus-summary-search-article-backward
11572Search through all previous (raw) articles for a regexp
11573(@code{gnus-summary-search-article-backward}).
11574
01c52d31
MB
11575@item M-S
11576@kindex M-S (Summary)
11577@findex gnus-summary-repeat-search-article-forward
11578Repeat the previous search forwards
11579(@code{gnus-summary-repeat-search-article-forward}).
11580
11581@item M-R
11582@kindex M-R (Summary)
11583@findex gnus-summary-repeat-search-article-backward
11584Repeat the previous search backwards
11585(@code{gnus-summary-repeat-search-article-backward}).
11586
4009494e
GM
11587@item &
11588@kindex & (Summary)
11589@findex gnus-summary-execute-command
11590This command will prompt you for a header, a regular expression to match
11591on this field, and a command to be executed if the match is made
11592(@code{gnus-summary-execute-command}). If the header is an empty
11593string, the match is done on the entire article. If given a prefix,
11594search backward instead.
11595
11596For instance, @kbd{& RET some.*string RET #} will put the process mark on
11597all articles that have heads or bodies that match @samp{some.*string}.
11598
11599@item M-&
11600@kindex M-& (Summary)
11601@findex gnus-summary-universal-argument
11602Perform any operation on all articles that have been marked with
11603the process mark (@code{gnus-summary-universal-argument}).
11604@end table
11605
11606@node Summary Generation Commands
11607@subsection Summary Generation Commands
11608
11609@table @kbd
11610
11611@item Y g
11612@kindex Y g (Summary)
11613@findex gnus-summary-prepare
11614Regenerate the current summary buffer (@code{gnus-summary-prepare}).
11615
11616@item Y c
11617@kindex Y c (Summary)
11618@findex gnus-summary-insert-cached-articles
11619Pull all cached articles (for the current group) into the summary buffer
11620(@code{gnus-summary-insert-cached-articles}).
11621
11622@item Y d
11623@kindex Y d (Summary)
11624@findex gnus-summary-insert-dormant-articles
11625Pull all dormant articles (for the current group) into the summary buffer
11626(@code{gnus-summary-insert-dormant-articles}).
11627
01c52d31
MB
11628@item Y t
11629@kindex Y t (Summary)
11630@findex gnus-summary-insert-ticked-articles
11631Pull all ticked articles (for the current group) into the summary buffer
11632(@code{gnus-summary-insert-ticked-articles}).
11633
4009494e
GM
11634@end table
11635
11636
11637@node Really Various Summary Commands
11638@subsection Really Various Summary Commands
11639
11640@table @kbd
11641
11642@item A D
11643@itemx C-d
11644@kindex C-d (Summary)
11645@kindex A D (Summary)
11646@findex gnus-summary-enter-digest-group
11647If the current article is a collection of other articles (for instance,
11648a digest), you might use this command to enter a group based on the that
11649article (@code{gnus-summary-enter-digest-group}). Gnus will try to
11650guess what article type is currently displayed unless you give a prefix
11651to this command, which forces a ``digest'' interpretation. Basically,
11652whenever you see a message that is a collection of other messages of
11653some format, you @kbd{C-d} and read these messages in a more convenient
11654fashion.
11655
01c52d31
MB
11656@vindex gnus-auto-select-on-ephemeral-exit
11657The variable @code{gnus-auto-select-on-ephemeral-exit} controls what
11658article should be selected after exiting a digest group. Valid values
11659include:
11660
11661@table @code
11662@item next
11663Select the next article.
11664
11665@item next-unread
11666Select the next unread article.
11667
11668@item next-noselect
11669Move the cursor to the next article. This is the default.
11670
11671@item next-unread-noselect
11672Move the cursor to the next unread article.
11673@end table
11674
11675If it has any other value or there is no next (unread) article, the
11676article selected before entering to the digest group will appear.
11677
4009494e
GM
11678@item C-M-d
11679@kindex C-M-d (Summary)
11680@findex gnus-summary-read-document
11681This command is very similar to the one above, but lets you gather
11682several documents into one biiig group
11683(@code{gnus-summary-read-document}). It does this by opening several
11684@code{nndoc} groups for each document, and then opening an
11685@code{nnvirtual} group on top of these @code{nndoc} groups. This
11686command understands the process/prefix convention
11687(@pxref{Process/Prefix}).
11688
11689@item C-t
11690@kindex C-t (Summary)
11691@findex gnus-summary-toggle-truncation
11692Toggle truncation of summary lines
11693(@code{gnus-summary-toggle-truncation}). This will probably confuse the
11694line centering function in the summary buffer, so it's not a good idea
11695to have truncation switched off while reading articles.
11696
11697@item =
11698@kindex = (Summary)
11699@findex gnus-summary-expand-window
11700Expand the summary buffer window (@code{gnus-summary-expand-window}).
11701If given a prefix, force an @code{article} window configuration.
11702
11703@item C-M-e
11704@kindex C-M-e (Summary)
11705@findex gnus-summary-edit-parameters
11706Edit the group parameters (@pxref{Group Parameters}) of the current
11707group (@code{gnus-summary-edit-parameters}).
11708
11709@item C-M-a
11710@kindex C-M-a (Summary)
11711@findex gnus-summary-customize-parameters
11712Customize the group parameters (@pxref{Group Parameters}) of the current
11713group (@code{gnus-summary-customize-parameters}).
11714
11715@end table
11716
11717
11718@node Exiting the Summary Buffer
11719@section Exiting the Summary Buffer
11720@cindex summary exit
11721@cindex exiting groups
11722
11723Exiting from the summary buffer will normally update all info on the
11724group and return you to the group buffer.
11725
11726@table @kbd
11727
11728@item Z Z
11729@itemx Z Q
11730@itemx q
11731@kindex Z Z (Summary)
11732@kindex Z Q (Summary)
11733@kindex q (Summary)
11734@findex gnus-summary-exit
11735@vindex gnus-summary-exit-hook
11736@vindex gnus-summary-prepare-exit-hook
11737@vindex gnus-group-no-more-groups-hook
11738@c @icon{gnus-summary-exit}
11739Exit the current group and update all information on the group
11740(@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} is
11741called before doing much of the exiting, which calls
11742@code{gnus-summary-expire-articles} by default.
11743@code{gnus-summary-exit-hook} is called after finishing the exit
11744process. @code{gnus-group-no-more-groups-hook} is run when returning to
11745group mode having no more (unread) groups.
11746
11747@item Z E
11748@itemx Q
11749@kindex Z E (Summary)
11750@kindex Q (Summary)
11751@findex gnus-summary-exit-no-update
11752Exit the current group without updating any information on the group
11753(@code{gnus-summary-exit-no-update}).
11754
11755@item Z c
11756@itemx c
11757@kindex Z c (Summary)
11758@kindex c (Summary)
11759@findex gnus-summary-catchup-and-exit
11760@c @icon{gnus-summary-catchup-and-exit}
11761Mark all unticked articles in the group as read and then exit
11762(@code{gnus-summary-catchup-and-exit}).
11763
11764@item Z C
11765@kindex Z C (Summary)
11766@findex gnus-summary-catchup-all-and-exit
11767Mark all articles, even the ticked ones, as read and then exit
11768(@code{gnus-summary-catchup-all-and-exit}).
11769
11770@item Z n
11771@kindex Z n (Summary)
11772@findex gnus-summary-catchup-and-goto-next-group
11773Mark all articles as read and go to the next group
11774(@code{gnus-summary-catchup-and-goto-next-group}).
11775
01c52d31
MB
11776@item Z p
11777@kindex Z p (Summary)
11778@findex gnus-summary-catchup-and-goto-prev-group
11779Mark all articles as read and go to the previous group
11780(@code{gnus-summary-catchup-and-goto-prev-group}).
11781
4009494e
GM
11782@item Z R
11783@itemx C-x C-s
11784@kindex Z R (Summary)
11785@kindex C-x C-s (Summary)
11786@findex gnus-summary-reselect-current-group
11787Exit this group, and then enter it again
11788(@code{gnus-summary-reselect-current-group}). If given a prefix, select
11789all articles, both read and unread.
11790
11791@item Z G
11792@itemx M-g
11793@kindex Z G (Summary)
11794@kindex M-g (Summary)
11795@findex gnus-summary-rescan-group
11796@c @icon{gnus-summary-mail-get}
11797Exit the group, check for new articles in the group, and select the
11798group (@code{gnus-summary-rescan-group}). If given a prefix, select all
11799articles, both read and unread.
11800
11801@item Z N
11802@kindex Z N (Summary)
11803@findex gnus-summary-next-group
11804Exit the group and go to the next group
11805(@code{gnus-summary-next-group}).
11806
11807@item Z P
11808@kindex Z P (Summary)
11809@findex gnus-summary-prev-group
11810Exit the group and go to the previous group
11811(@code{gnus-summary-prev-group}).
11812
11813@item Z s
11814@kindex Z s (Summary)
11815@findex gnus-summary-save-newsrc
11816Save the current number of read/marked articles in the dribble buffer
11817and then save the dribble buffer (@code{gnus-summary-save-newsrc}). If
11818given a prefix, also save the @file{.newsrc} file(s). Using this
11819command will make exit without updating (the @kbd{Q} command) worthless.
11820@end table
11821
11822@vindex gnus-exit-group-hook
11823@code{gnus-exit-group-hook} is called when you exit the current group
11824with an ``updating'' exit. For instance @kbd{Q}
11825(@code{gnus-summary-exit-no-update}) does not call this hook.
11826
11827@findex gnus-summary-wake-up-the-dead
11828@findex gnus-dead-summary-mode
11829@vindex gnus-kill-summary-on-exit
11830If you're in the habit of exiting groups, and then changing your mind
11831about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}.
11832If you do that, Gnus won't kill the summary buffer when you exit it.
11833(Quelle surprise!) Instead it will change the name of the buffer to
11834something like @samp{*Dead Summary ... *} and install a minor mode
11835called @code{gnus-dead-summary-mode}. Now, if you switch back to this
11836buffer, you'll find that all keys are mapped to a function called
11837@code{gnus-summary-wake-up-the-dead}. So tapping any keys in a dead
11838summary buffer will result in a live, normal summary buffer.
11839
11840There will never be more than one dead summary buffer at any one time.
11841
11842@vindex gnus-use-cross-reference
11843The data on the current group will be updated (which articles you have
11844read, which articles you have replied to, etc.) when you exit the
11845summary buffer. If the @code{gnus-use-cross-reference} variable is
11846@code{t} (which is the default), articles that are cross-referenced to
11847this group and are marked as read, will also be marked as read in the
11848other subscribed groups they were cross-posted to. If this variable is
11849neither @code{nil} nor @code{t}, the article will be marked as read in
11850both subscribed and unsubscribed groups (@pxref{Crosspost Handling}).
11851
11852
11853@node Crosspost Handling
11854@section Crosspost Handling
11855
11856@cindex velveeta
11857@cindex spamming
11858Marking cross-posted articles as read ensures that you'll never have to
11859read the same article more than once. Unless, of course, somebody has
11860posted it to several groups separately. Posting the same article to
11861several groups (not cross-posting) is called @dfn{spamming}, and you are
11862by law required to send nasty-grams to anyone who perpetrates such a
8ccbef23 11863heinous crime.
4009494e
GM
11864
11865Remember: Cross-posting is kinda ok, but posting the same article
11866separately to several groups is not. Massive cross-posting (aka.
11867@dfn{velveeta}) is to be avoided at all costs, and you can even use the
11868@code{gnus-summary-mail-crosspost-complaint} command to complain about
11869excessive crossposting (@pxref{Summary Mail Commands}).
11870
11871@cindex cross-posting
11872@cindex Xref
11873@cindex @acronym{NOV}
11874One thing that may cause Gnus to not do the cross-posting thing
11875correctly is if you use an @acronym{NNTP} server that supports @sc{xover}
11876(which is very nice, because it speeds things up considerably) which
11877does not include the @code{Xref} header in its @acronym{NOV} lines. This is
11878Evil, but all too common, alas, alack. Gnus tries to Do The Right Thing
11879even with @sc{xover} by registering the @code{Xref} lines of all
11880articles you actually read, but if you kill the articles, or just mark
11881them as read without reading them, Gnus will not get a chance to snoop
11882the @code{Xref} lines out of these articles, and will be unable to use
11883the cross reference mechanism.
11884
11885@cindex LIST overview.fmt
11886@cindex overview.fmt
11887To check whether your @acronym{NNTP} server includes the @code{Xref} header
11888in its overview files, try @samp{telnet your.nntp.server nntp},
11889@samp{MODE READER} on @code{inn} servers, and then say @samp{LIST
11890overview.fmt}. This may not work, but if it does, and the last line you
11891get does not read @samp{Xref:full}, then you should shout and whine at
11892your news admin until she includes the @code{Xref} header in the
11893overview files.
11894
4009494e 11895If you want Gnus to get the @code{Xref}s right all the time, you have to
4b70e299
MB
11896set @code{nntp-nov-is-evil} to @code{t}, which slows things down
11897considerably. Also @pxref{Slow/Expensive Connection}.
4009494e
GM
11898
11899C'est la vie.
11900
11901For an alternative approach, @pxref{Duplicate Suppression}.
11902
11903
11904@node Duplicate Suppression
11905@section Duplicate Suppression
11906
11907By default, Gnus tries to make sure that you don't have to read the same
11908article more than once by utilizing the crossposting mechanism
11909(@pxref{Crosspost Handling}). However, that simple and efficient
11910approach may not work satisfactory for some users for various
11911reasons.
11912
11913@enumerate
11914@item
11915The @acronym{NNTP} server may fail to generate the @code{Xref} header. This
11916is evil and not very common.
11917
11918@item
11919The @acronym{NNTP} server may fail to include the @code{Xref} header in the
11920@file{.overview} data bases. This is evil and all too common, alas.
11921
11922@item
11923You may be reading the same group (or several related groups) from
11924different @acronym{NNTP} servers.
11925
11926@item
11927You may be getting mail that duplicates articles posted to groups.
11928@end enumerate
11929
11930I'm sure there are other situations where @code{Xref} handling fails as
11931well, but these four are the most common situations.
11932
11933If, and only if, @code{Xref} handling fails for you, then you may
11934consider switching on @dfn{duplicate suppression}. If you do so, Gnus
11935will remember the @code{Message-ID}s of all articles you have read or
11936otherwise marked as read, and then, as if by magic, mark them as read
11937all subsequent times you see them---in @emph{all} groups. Using this
11938mechanism is quite likely to be somewhat inefficient, but not overly
11939so. It's certainly preferable to reading the same articles more than
11940once.
11941
11942Duplicate suppression is not a very subtle instrument. It's more like a
11943sledge hammer than anything else. It works in a very simple
11944fashion---if you have marked an article as read, it adds this Message-ID
11945to a cache. The next time it sees this Message-ID, it will mark the
11946article as read with the @samp{M} mark. It doesn't care what group it
11947saw the article in.
11948
11949@table @code
11950@item gnus-suppress-duplicates
11951@vindex gnus-suppress-duplicates
11952If non-@code{nil}, suppress duplicates.
11953
11954@item gnus-save-duplicate-list
11955@vindex gnus-save-duplicate-list
11956If non-@code{nil}, save the list of duplicates to a file. This will
11957make startup and shutdown take longer, so the default is @code{nil}.
11958However, this means that only duplicate articles read in a single Gnus
11959session are suppressed.
11960
11961@item gnus-duplicate-list-length
11962@vindex gnus-duplicate-list-length
11963This variable says how many @code{Message-ID}s to keep in the duplicate
11964suppression list. The default is 10000.
11965
11966@item gnus-duplicate-file
11967@vindex gnus-duplicate-file
11968The name of the file to store the duplicate suppression list in. The
11969default is @file{~/News/suppression}.
11970@end table
11971
11972If you have a tendency to stop and start Gnus often, setting
11973@code{gnus-save-duplicate-list} to @code{t} is probably a good idea. If
11974you leave Gnus running for weeks on end, you may have it @code{nil}. On
11975the other hand, saving the list makes startup and shutdown much slower,
11976so that means that if you stop and start Gnus often, you should set
11977@code{gnus-save-duplicate-list} to @code{nil}. Uhm. I'll leave this up
11978to you to figure out, I think.
11979
11980@node Security
11981@section Security
11982
11983Gnus is able to verify signed messages or decrypt encrypted messages.
11984The formats that are supported are @acronym{PGP}, @acronym{PGP/MIME}
11985and @acronym{S/MIME}, however you need some external programs to get
11986things to work:
11987
11988@enumerate
11989@item
11990To handle @acronym{PGP} and @acronym{PGP/MIME} messages, you have to
11991install an OpenPGP implementation such as GnuPG. The Lisp interface
8c9bb6f5
DU
11992to GnuPG included with Emacs is called EasyPG (@pxref{Top, ,EasyPG,
11993epa, EasyPG Assistant user's manual}), but PGG (@pxref{Top, ,PGG, pgg,
8ccbef23 11994PGG Manual}), and Mailcrypt are also supported.
4009494e
GM
11995
11996@item
11997To handle @acronym{S/MIME} message, you need to install OpenSSL. OpenSSL 0.9.6
11998or newer is recommended.
11999
12000@end enumerate
12001
4146636e
KY
12002The variables that control security functionality on reading/composing
12003messages include:
4009494e
GM
12004
12005@table @code
12006@item mm-verify-option
12007@vindex mm-verify-option
12008Option of verifying signed parts. @code{never}, not verify;
12009@code{always}, always verify; @code{known}, only verify known
12010protocols. Otherwise, ask user.
12011
12012@item mm-decrypt-option
12013@vindex mm-decrypt-option
12014Option of decrypting encrypted parts. @code{never}, no decryption;
12015@code{always}, always decrypt; @code{known}, only decrypt known
12016protocols. Otherwise, ask user.
12017
4146636e
KY
12018@item mm-sign-option
12019@vindex mm-sign-option
12020Option of creating signed parts. @code{nil}, use default signing
12021keys; @code{guided}, ask user to select signing keys from the menu.
12022
12023@item mm-encrypt-option
12024@vindex mm-encrypt-option
12025Option of creating encrypted parts. @code{nil}, use the first
12026public-key matching the @samp{From:} header as the recipient;
12027@code{guided}, ask user to select recipient keys from the menu.
12028
4009494e
GM
12029@item mml1991-use
12030@vindex mml1991-use
12031Symbol indicating elisp interface to OpenPGP implementation for
7f3bc720 12032@acronym{PGP} messages. The default is @code{epg}, but @code{pgg},
8ccbef23 12033and @code{mailcrypt} are also supported although
8c9bb6f5 12034deprecated. By default, Gnus uses the first available interface in
71fbd643 12035this order.
4009494e
GM
12036
12037@item mml2015-use
12038@vindex mml2015-use
12039Symbol indicating elisp interface to OpenPGP implementation for
7f3bc720 12040@acronym{PGP/MIME} messages. The default is @code{epg}, but
8ccbef23 12041@code{pgg}, and @code{mailcrypt} are also supported
71fbd643 12042although deprecated. By default, Gnus uses the first available
8c9bb6f5 12043interface in this order.
4009494e
GM
12044
12045@end table
12046
12047By default the buttons that display security information are not
12048shown, because they clutter reading the actual e-mail. You can type
12049@kbd{K b} manually to display the information. Use the
12050@code{gnus-buttonized-mime-types} and
12051@code{gnus-unbuttonized-mime-types} variables to control this
12052permanently. @ref{MIME Commands} for further details, and hints on
12053how to customize these variables to always display security
12054information.
12055
12056@cindex snarfing keys
12057@cindex importing PGP keys
12058@cindex PGP key ring import
12059Snarfing OpenPGP keys (i.e., importing keys from articles into your
12060key ring) is not supported explicitly through a menu item or command,
12061rather Gnus do detect and label keys as @samp{application/pgp-keys},
12062allowing you to specify whatever action you think is appropriate
12063through the usual @acronym{MIME} infrastructure. You can use a
12064@file{~/.mailcap} entry (@pxref{mailcap, , mailcap, emacs-mime, The
12065Emacs MIME Manual}) such as the following to import keys using GNU
12066Privacy Guard when you click on the @acronym{MIME} button
12067(@pxref{Using MIME}).
12068
12069@example
12070application/pgp-keys; gpg --import --interactive --verbose; needsterminal
12071@end example
12072@noindent
12073This happens to also be the default action defined in
12074@code{mailcap-mime-data}.
12075
12076More information on how to set things for sending outgoing signed and
12077encrypted messages up can be found in the message manual
12078(@pxref{Security, ,Security, message, Message Manual}).
12079
12080@node Mailing List
12081@section Mailing List
12082@cindex mailing list
12083@cindex RFC 2396
12084
12085@kindex A M (summary)
12086@findex gnus-mailing-list-insinuate
12087Gnus understands some mailing list fields of RFC 2369. To enable it,
12088add a @code{to-list} group parameter (@pxref{Group Parameters}),
12089possibly using @kbd{A M} (@code{gnus-mailing-list-insinuate}) in the
12090summary buffer.
12091
12092That enables the following commands to the summary buffer:
12093
12094@table @kbd
12095
12096@item C-c C-n h
12097@kindex C-c C-n h (Summary)
12098@findex gnus-mailing-list-help
12099Send a message to fetch mailing list help, if List-Help field exists.
12100
12101@item C-c C-n s
12102@kindex C-c C-n s (Summary)
12103@findex gnus-mailing-list-subscribe
12104Send a message to subscribe the mailing list, if List-Subscribe field exists.
12105
12106@item C-c C-n u
12107@kindex C-c C-n u (Summary)
12108@findex gnus-mailing-list-unsubscribe
12109Send a message to unsubscribe the mailing list, if List-Unsubscribe
12110field exists.
12111
12112@item C-c C-n p
12113@kindex C-c C-n p (Summary)
12114@findex gnus-mailing-list-post
12115Post to the mailing list, if List-Post field exists.
12116
12117@item C-c C-n o
12118@kindex C-c C-n o (Summary)
12119@findex gnus-mailing-list-owner
12120Send a message to the mailing list owner, if List-Owner field exists.
12121
12122@item C-c C-n a
12123@kindex C-c C-n a (Summary)
01c52d31 12124@findex gnus-mailing-list-archive
4009494e
GM
12125Browse the mailing list archive, if List-Archive field exists.
12126
12127@end table
12128
12129
12130@node Article Buffer
12131@chapter Article Buffer
12132@cindex article buffer
12133
12134The articles are displayed in the article buffer, of which there is only
12135one. All the summary buffers share the same article buffer unless you
12136tell Gnus otherwise.
12137
12138@menu
12139* Hiding Headers:: Deciding what headers should be displayed.
12140* Using MIME:: Pushing articles through @acronym{MIME} before reading them.
85115796 12141* HTML:: Reading @acronym{HTML} messages.
4009494e
GM
12142* Customizing Articles:: Tailoring the look of the articles.
12143* Article Keymap:: Keystrokes available in the article buffer.
12144* Misc Article:: Other stuff.
12145@end menu
12146
12147
12148@node Hiding Headers
12149@section Hiding Headers
12150@cindex hiding headers
12151@cindex deleting headers
12152
12153The top section of each article is the @dfn{head}. (The rest is the
12154@dfn{body}, but you may have guessed that already.)
12155
12156@vindex gnus-show-all-headers
12157There is a lot of useful information in the head: the name of the person
12158who wrote the article, the date it was written and the subject of the
12159article. That's well and nice, but there's also lots of information
12160most people do not want to see---what systems the article has passed
12161through before reaching you, the @code{Message-ID}, the
12162@code{References}, etc. ad nauseam---and you'll probably want to get rid
12163of some of those lines. If you want to keep all those lines in the
12164article buffer, you can set @code{gnus-show-all-headers} to @code{t}.
12165
12166Gnus provides you with two variables for sifting headers:
12167
12168@table @code
12169
12170@item gnus-visible-headers
12171@vindex gnus-visible-headers
12172If this variable is non-@code{nil}, it should be a regular expression
12173that says what headers you wish to keep in the article buffer. All
12174headers that do not match this variable will be hidden.
12175
12176For instance, if you only want to see the name of the person who wrote
12177the article and the subject, you'd say:
12178
12179@lisp
12180(setq gnus-visible-headers "^From:\\|^Subject:")
12181@end lisp
12182
12183This variable can also be a list of regexps to match headers to
12184remain visible.
12185
12186@item gnus-ignored-headers
12187@vindex gnus-ignored-headers
12188This variable is the reverse of @code{gnus-visible-headers}. If this
12189variable is set (and @code{gnus-visible-headers} is @code{nil}), it
12190should be a regular expression that matches all lines that you want to
12191hide. All lines that do not match this variable will remain visible.
12192
12193For instance, if you just want to get rid of the @code{References} line
12194and the @code{Xref} line, you might say:
12195
12196@lisp
12197(setq gnus-ignored-headers "^References:\\|^Xref:")
12198@end lisp
12199
12200This variable can also be a list of regexps to match headers to
12201be removed.
12202
12203Note that if @code{gnus-visible-headers} is non-@code{nil}, this
12204variable will have no effect.
12205
12206@end table
12207
12208@vindex gnus-sorted-header-list
12209Gnus can also sort the headers for you. (It does this by default.) You
12210can control the sorting by setting the @code{gnus-sorted-header-list}
12211variable. It is a list of regular expressions that says in what order
12212the headers are to be displayed.
12213
12214For instance, if you want the name of the author of the article first,
12215and then the subject, you might say something like:
12216
12217@lisp
12218(setq gnus-sorted-header-list '("^From:" "^Subject:"))
12219@end lisp
12220
12221Any headers that are to remain visible, but are not listed in this
12222variable, will be displayed in random order after all the headers listed in this variable.
12223
12224@findex gnus-article-hide-boring-headers
12225@vindex gnus-boring-article-headers
12226You can hide further boring headers by setting
12227@code{gnus-treat-hide-boring-headers} to @code{head}. What this function
12228does depends on the @code{gnus-boring-article-headers} variable. It's a
12229list, but this list doesn't actually contain header names. Instead it
12230lists various @dfn{boring conditions} that Gnus can check and remove
12231from sight.
12232
12233These conditions are:
12234@table @code
12235@item empty
12236Remove all empty headers.
12237@item followup-to
12238Remove the @code{Followup-To} header if it is identical to the
12239@code{Newsgroups} header.
12240@item reply-to
12241Remove the @code{Reply-To} header if it lists the same addresses as
12242the @code{From} header, or if the @code{broken-reply-to} group
12243parameter is set.
12244@item newsgroups
12245Remove the @code{Newsgroups} header if it only contains the current group
12246name.
12247@item to-address
12248Remove the @code{To} header if it only contains the address identical to
12249the current group's @code{to-address} parameter.
12250@item to-list
12251Remove the @code{To} header if it only contains the address identical to
12252the current group's @code{to-list} parameter.
12253@item cc-list
12254Remove the @code{Cc} header if it only contains the address identical to
12255the current group's @code{to-list} parameter.
12256@item date
12257Remove the @code{Date} header if the article is less than three days
12258old.
12259@item long-to
12260Remove the @code{To} and/or @code{Cc} header if it is very long.
12261@item many-to
12262Remove all @code{To} and/or @code{Cc} headers if there are more than one.
12263@end table
12264
12265To include these three elements, you could say something like:
12266
12267@lisp
12268(setq gnus-boring-article-headers
12269 '(empty followup-to reply-to))
12270@end lisp
12271
12272This is also the default value for this variable.
12273
12274
12275@node Using MIME
12276@section Using MIME
12277@cindex @acronym{MIME}
12278
12279Mime is a standard for waving your hands through the air, aimlessly,
12280while people stand around yawning.
12281
12282@acronym{MIME}, however, is a standard for encoding your articles, aimlessly,
12283while all newsreaders die of fear.
12284
12285@acronym{MIME} may specify what character set the article uses, the encoding
12286of the characters, and it also makes it possible to embed pictures and
12287other naughty stuff in innocent-looking articles.
12288
12289@vindex gnus-display-mime-function
12290@findex gnus-display-mime
12291Gnus pushes @acronym{MIME} articles through @code{gnus-display-mime-function}
12292to display the @acronym{MIME} parts. This is @code{gnus-display-mime} by
12293default, which creates a bundle of clickable buttons that can be used to
12294display, save and manipulate the @acronym{MIME} objects.
12295
12296The following commands are available when you have placed point over a
12297@acronym{MIME} button:
12298
12299@table @kbd
12300@findex gnus-article-press-button
12301@item RET (Article)
12302@kindex RET (Article)
12303@itemx BUTTON-2 (Article)
12304Toggle displaying of the @acronym{MIME} object
12305(@code{gnus-article-press-button}). If built-in viewers can not display
12306the object, Gnus resorts to external viewers in the @file{mailcap}
12307files. If a viewer has the @samp{copiousoutput} specification, the
12308object is displayed inline.
12309
12310@findex gnus-mime-view-part
12311@item M-RET (Article)
12312@kindex M-RET (Article)
12313@itemx v (Article)
12314Prompt for a method, and then view the @acronym{MIME} object using this
12315method (@code{gnus-mime-view-part}).
12316
12317@findex gnus-mime-view-part-as-type
12318@item t (Article)
12319@kindex t (Article)
12320View the @acronym{MIME} object as if it were a different @acronym{MIME} media type
12321(@code{gnus-mime-view-part-as-type}).
12322
12323@findex gnus-mime-view-part-as-charset
12324@item C (Article)
12325@kindex C (Article)
12326Prompt for a charset, and then view the @acronym{MIME} object using this
12327charset (@code{gnus-mime-view-part-as-charset}).
12328
12329@findex gnus-mime-save-part
12330@item o (Article)
12331@kindex o (Article)
12332Prompt for a file name, and then save the @acronym{MIME} object
12333(@code{gnus-mime-save-part}).
12334
12335@findex gnus-mime-save-part-and-strip
12336@item C-o (Article)
12337@kindex C-o (Article)
12338Prompt for a file name, then save the @acronym{MIME} object and strip it from
12339the article. Then proceed to article editing, where a reasonable
12340suggestion is being made on how the altered article should look
12341like. The stripped @acronym{MIME} object will be referred via the
12342message/external-body @acronym{MIME} type.
12343(@code{gnus-mime-save-part-and-strip}).
12344
01c52d31
MB
12345@findex gnus-mime-replace-part
12346@item r (Article)
12347@kindex r (Article)
12348Prompt for a file name, replace the @acronym{MIME} object with an
12349external body refering to the file via the message/external-body
12350@acronym{MIME} type. (@code{gnus-mime-replace-part}).
12351
4009494e
GM
12352@findex gnus-mime-delete-part
12353@item d (Article)
12354@kindex d (Article)
12355Delete the @acronym{MIME} object from the article and replace it with some
12356information about the removed @acronym{MIME} object
12357(@code{gnus-mime-delete-part}).
12358
01c52d31
MB
12359@c FIXME: gnus-auto-select-part should be documented here
12360
4009494e
GM
12361@findex gnus-mime-copy-part
12362@item c (Article)
12363@kindex c (Article)
12364Copy the @acronym{MIME} object to a fresh buffer and display this buffer
01c52d31
MB
12365(@code{gnus-mime-copy-part}). If given a prefix, copy the raw contents
12366without decoding. If given a numerical prefix, you can do semi-manual
12367charset stuff (see @code{gnus-summary-show-article-charset-alist} in
12368@ref{Paging the Article}). Compressed files like @file{.gz} and
4009494e
GM
12369@file{.bz2} are automatically decompressed if
12370@code{auto-compression-mode} is enabled (@pxref{Compressed Files,,
12371Accessing Compressed Files, emacs, The Emacs Editor}).
12372
12373@findex gnus-mime-print-part
12374@item p (Article)
12375@kindex p (Article)
12376Print the @acronym{MIME} object (@code{gnus-mime-print-part}). This
12377command respects the @samp{print=} specifications in the
12378@file{.mailcap} file.
12379
12380@findex gnus-mime-inline-part
12381@item i (Article)
12382@kindex i (Article)
12383Insert the contents of the @acronym{MIME} object into the buffer
9b3ebcb6 12384(@code{gnus-mime-inline-part}) as @samp{text/plain}. If given a prefix, insert
4009494e
GM
12385the raw contents without decoding. If given a numerical prefix, you can
12386do semi-manual charset stuff (see
12387@code{gnus-summary-show-article-charset-alist} in @ref{Paging the
01c52d31
MB
12388Article}). Compressed files like @file{.gz} and @file{.bz2} are
12389automatically decompressed depending on @code{jka-compr} regardless of
12390@code{auto-compression-mode} (@pxref{Compressed Files,, Accessing
12391Compressed Files, emacs, The Emacs Editor}).
4009494e
GM
12392
12393@findex gnus-mime-view-part-internally
12394@item E (Article)
12395@kindex E (Article)
12396View the @acronym{MIME} object with an internal viewer. If no internal
12397viewer is available, use an external viewer
12398(@code{gnus-mime-view-part-internally}).
12399
12400@findex gnus-mime-view-part-externally
12401@item e (Article)
12402@kindex e (Article)
12403View the @acronym{MIME} object with an external viewer.
12404(@code{gnus-mime-view-part-externally}).
12405
12406@findex gnus-mime-pipe-part
12407@item | (Article)
12408@kindex | (Article)
12409Output the @acronym{MIME} object to a process (@code{gnus-mime-pipe-part}).
12410
12411@findex gnus-mime-action-on-part
12412@item . (Article)
12413@kindex . (Article)
12414Interactively run an action on the @acronym{MIME} object
12415(@code{gnus-mime-action-on-part}).
12416
12417@end table
12418
12419Gnus will display some @acronym{MIME} objects automatically. The way Gnus
12420determines which parts to do this with is described in the Emacs
12421@acronym{MIME} manual.
12422
12423It might be best to just use the toggling functions from the article
12424buffer to avoid getting nasty surprises. (For instance, you enter the
12425group @samp{alt.sing-a-long} and, before you know it, @acronym{MIME} has
12426decoded the sound file in the article and some horrible sing-a-long song
12427comes screaming out your speakers, and you can't find the volume button,
12428because there isn't one, and people are starting to look at you, and you
12429try to stop the program, but you can't, and you can't find the program
12430to control the volume, and everybody else in the room suddenly decides
12431to look at you disdainfully, and you'll feel rather stupid.)
12432
12433Any similarity to real events and people is purely coincidental. Ahem.
12434
12435Also @pxref{MIME Commands}.
12436
12437
85115796
KY
12438@node HTML
12439@section @acronym{HTML}
12440@cindex @acronym{HTML}
12441
12442If you have @code{w3m} installed on your system, Gnus can display
12443@acronym{HTML} articles in the article buffer. There are many Gnus
12444add-ons for doing this, using various approaches, but there's one
12445(sort of) built-in method that's used by default.
12446
12447For a complete overview, consult @xref{Display Customization,
12448,Display Customization, emacs-mime, The Emacs MIME Manual}. This
12449section only describes the default method.
12450
12451@table @code
12452@item mm-text-html-renderer
12453@vindex mm-text-html-renderer
12454If set to @code{gnus-article-html}, Gnus will use the built-in method,
12455that's based on @code{curl} and @code{w3m}.
12456
51dee5ef
KY
12457@item gnus-blocked-images
12458@vindex gnus-blocked-images
12459Images that have @acronym{URL}s that match this regexp won't be
12460fetched and displayed. For instance, do block all @acronym{URL}s that
12461have the string ``ads'' in them, do the following:
12462
12463@lisp
12464(setq gnus-blocked-images "ads")
12465@end lisp
12466
12467The default is to block all external images.
12468
85115796
KY
12469@item gnus-html-cache-directory
12470@vindex gnus-html-cache-directory
12471Gnus will download and cache images according to how
51dee5ef 12472@code{gnus-blocked-images} is set. These images will be stored in
85115796
KY
12473this directory.
12474
12475@item gnus-html-cache-size
12476@vindex gnus-html-cache-size
12477When @code{gnus-html-cache-size} bytes have been used in that
12478directory, the oldest files will be deleted. The default is 500MB.
12479
12480@item gnus-html-frame-width
12481@vindex gnus-html-frame-width
12482The width to use when rendering HTML. The default is 70.
12483
59d09f15
LMI
12484@item gnus-max-image-proportion
12485@vindex gnus-max-image-proportion
12486How big pictures displayed are in relation to the window they're in.
12487A value of 0.7 (the default) means that they are allowed to take up
1248870% of the width and height of the window. If they are larger than
12489this, and Emacs supports it, then the images will be rescaled down to
12490fit these criteria.
12491
85115796
KY
12492@end table
12493
12494To use this, make sure that you have @code{w3m} and @code{curl}
12495installed. If you have, then Gnus should display @acronym{HTML}
12496automatically.
12497
12498
12499
4009494e
GM
12500@node Customizing Articles
12501@section Customizing Articles
12502@cindex article customization
12503
12504A slew of functions for customizing how the articles are to look like
12505exist. You can call these functions interactively
12506(@pxref{Article Washing}), or you can have them
12507called automatically when you select the articles.
12508
12509To have them called automatically, you should set the corresponding
12510``treatment'' variable. For instance, to have headers hidden, you'd set
12511@code{gnus-treat-hide-headers}. Below is a list of variables that can
12512be set, but first we discuss the values these variables can have.
12513
12514Note: Some values, while valid, make little sense. Check the list below
12515for sensible values.
12516
12517@enumerate
12518@item
12519@code{nil}: Don't do this treatment.
12520
12521@item
12522@code{t}: Do this treatment on all body parts.
12523
12524@item
12525@code{head}: Do the treatment on the headers.
12526
12527@item
01c52d31
MB
12528@code{first}: Do this treatment on the first body part.
12529
12530@item
12531@code{last}: Do this treatment on the last body part.
4009494e
GM
12532
12533@item
12534An integer: Do this treatment on all body parts that have a length less
12535than this number.
12536
12537@item
12538A list of strings: Do this treatment on all body parts that are in
12539articles that are read in groups that have names that match one of the
12540regexps in the list.
12541
12542@item
12543A list where the first element is not a string:
12544
12545The list is evaluated recursively. The first element of the list is a
12546predicate. The following predicates are recognized: @code{or},
12547@code{and}, @code{not} and @code{typep}. Here's an example:
12548
12549@lisp
12550(or last
12551 (typep "text/x-vcard"))
12552@end lisp
12553
12554@end enumerate
12555
12556You may have noticed that the word @dfn{part} is used here. This refers
12557to the fact that some messages are @acronym{MIME} multipart articles that may
12558be divided into several parts. Articles that are not multiparts are
12559considered to contain just a single part.
12560
12561@vindex gnus-article-treat-types
12562Are the treatments applied to all sorts of multipart parts? Yes, if you
12563want to, but by default, only @samp{text/plain} parts are given the
12564treatment. This is controlled by the @code{gnus-article-treat-types}
12565variable, which is a list of regular expressions that are matched to the
12566type of the part. This variable is ignored if the value of the
12567controlling variable is a predicate list, as described above.
12568
12569@ifinfo
12570@c Avoid sort of redundant entries in the same section for the printed
12571@c manual, but add them in info to allow `i gnus-treat-foo-bar RET' or
12572@c `i foo-bar'.
12573@vindex gnus-treat-buttonize
12574@vindex gnus-treat-buttonize-head
12575@vindex gnus-treat-capitalize-sentences
12576@vindex gnus-treat-overstrike
12577@vindex gnus-treat-strip-cr
12578@vindex gnus-treat-strip-headers-in-body
12579@vindex gnus-treat-strip-leading-blank-lines
12580@vindex gnus-treat-strip-multiple-blank-lines
12581@vindex gnus-treat-strip-pem
12582@vindex gnus-treat-strip-trailing-blank-lines
12583@vindex gnus-treat-unsplit-urls
12584@vindex gnus-treat-wash-html
12585@vindex gnus-treat-date-english
12586@vindex gnus-treat-date-iso8601
12587@vindex gnus-treat-date-lapsed
12588@vindex gnus-treat-date-local
12589@vindex gnus-treat-date-original
12590@vindex gnus-treat-date-user-defined
12591@vindex gnus-treat-date-ut
12592@vindex gnus-treat-from-picon
12593@vindex gnus-treat-mail-picon
12594@vindex gnus-treat-newsgroups-picon
61b1af82
G
12595@vindex gnus-treat-from-gravatar
12596@vindex gnus-treat-mail-gravatar
4009494e
GM
12597@vindex gnus-treat-display-smileys
12598@vindex gnus-treat-body-boundary
12599@vindex gnus-treat-display-x-face
12600@vindex gnus-treat-display-face
12601@vindex gnus-treat-emphasize
12602@vindex gnus-treat-fill-article
12603@vindex gnus-treat-fill-long-lines
12604@vindex gnus-treat-hide-boring-headers
12605@vindex gnus-treat-hide-citation
12606@vindex gnus-treat-hide-citation-maybe
12607@vindex gnus-treat-hide-headers
12608@vindex gnus-treat-hide-signature
12609@vindex gnus-treat-strip-banner
12610@vindex gnus-treat-strip-list-identifiers
12611@vindex gnus-treat-highlight-citation
12612@vindex gnus-treat-highlight-headers
12613@vindex gnus-treat-highlight-signature
12614@vindex gnus-treat-play-sounds
4009494e
GM
12615@vindex gnus-treat-x-pgp-sig
12616@vindex gnus-treat-unfold-headers
12617@vindex gnus-treat-fold-headers
12618@vindex gnus-treat-fold-newsgroups
12619@vindex gnus-treat-leading-whitespace
12620@end ifinfo
12621
12622The following treatment options are available. The easiest way to
12623customize this is to examine the @code{gnus-article-treat} customization
12624group. Values in parenthesis are suggested sensible values. Others are
12625possible but those listed are probably sufficient for most people.
12626
12627@table @code
12628@item gnus-treat-buttonize (t, integer)
12629@item gnus-treat-buttonize-head (head)
12630
12631@xref{Article Buttons}.
12632
12633@item gnus-treat-capitalize-sentences (t, integer)
12634@item gnus-treat-overstrike (t, integer)
12635@item gnus-treat-strip-cr (t, integer)
12636@item gnus-treat-strip-headers-in-body (t, integer)
01c52d31 12637@item gnus-treat-strip-leading-blank-lines (t, first, integer)
4009494e
GM
12638@item gnus-treat-strip-multiple-blank-lines (t, integer)
12639@item gnus-treat-strip-pem (t, last, integer)
12640@item gnus-treat-strip-trailing-blank-lines (t, last, integer)
12641@item gnus-treat-unsplit-urls (t, integer)
12642@item gnus-treat-wash-html (t, integer)
12643
12644@xref{Article Washing}.
12645
12646@item gnus-treat-date-english (head)
12647@item gnus-treat-date-iso8601 (head)
12648@item gnus-treat-date-lapsed (head)
12649@item gnus-treat-date-local (head)
12650@item gnus-treat-date-original (head)
12651@item gnus-treat-date-user-defined (head)
12652@item gnus-treat-date-ut (head)
12653
12654@xref{Article Date}.
12655
12656@item gnus-treat-from-picon (head)
12657@item gnus-treat-mail-picon (head)
12658@item gnus-treat-newsgroups-picon (head)
12659
12660@xref{Picons}.
12661
61b1af82
G
12662@item gnus-treat-from-gravatar (head)
12663@item gnus-treat-mail-gravatar (head)
12664
12665@xref{Gravatars}.
12666
4009494e
GM
12667@item gnus-treat-display-smileys (t, integer)
12668
12669@item gnus-treat-body-boundary (head)
12670
12671@vindex gnus-body-boundary-delimiter
12672Adds a delimiter between header and body, the string used as delimiter
12673is controlled by @code{gnus-body-boundary-delimiter}.
12674
12675@xref{Smileys}.
12676
12677@vindex gnus-treat-display-x-face
12678@item gnus-treat-display-x-face (head)
12679
12680@xref{X-Face}.
12681
12682@vindex gnus-treat-display-face
12683@item gnus-treat-display-face (head)
12684
12685@xref{Face}.
12686
12687@vindex gnus-treat-emphasize
12688@item gnus-treat-emphasize (t, head, integer)
12689@vindex gnus-treat-fill-article
12690@item gnus-treat-fill-article (t, integer)
12691@vindex gnus-treat-fill-long-lines
12692@item gnus-treat-fill-long-lines (t, integer)
12693@vindex gnus-treat-hide-boring-headers
12694@item gnus-treat-hide-boring-headers (head)
12695@vindex gnus-treat-hide-citation
12696@item gnus-treat-hide-citation (t, integer)
12697@vindex gnus-treat-hide-citation-maybe
12698@item gnus-treat-hide-citation-maybe (t, integer)
12699@vindex gnus-treat-hide-headers
12700@item gnus-treat-hide-headers (head)
12701@vindex gnus-treat-hide-signature
12702@item gnus-treat-hide-signature (t, last)
12703@vindex gnus-treat-strip-banner
12704@item gnus-treat-strip-banner (t, last)
12705@vindex gnus-treat-strip-list-identifiers
12706@item gnus-treat-strip-list-identifiers (head)
12707
12708@xref{Article Hiding}.
12709
12710@vindex gnus-treat-highlight-citation
12711@item gnus-treat-highlight-citation (t, integer)
12712@vindex gnus-treat-highlight-headers
12713@item gnus-treat-highlight-headers (head)
12714@vindex gnus-treat-highlight-signature
12715@item gnus-treat-highlight-signature (t, last, integer)
12716
12717@xref{Article Highlighting}.
12718
12719@vindex gnus-treat-play-sounds
12720@item gnus-treat-play-sounds
01c52d31 12721@item gnus-treat-ansi-sequences (t)
4009494e
GM
12722@vindex gnus-treat-x-pgp-sig
12723@item gnus-treat-x-pgp-sig (head)
12724
12725@vindex gnus-treat-unfold-headers
12726@item gnus-treat-unfold-headers (head)
12727@vindex gnus-treat-fold-headers
12728@item gnus-treat-fold-headers (head)
12729@vindex gnus-treat-fold-newsgroups
12730@item gnus-treat-fold-newsgroups (head)
12731@vindex gnus-treat-leading-whitespace
12732@item gnus-treat-leading-whitespace (head)
12733
12734@xref{Article Header}.
12735
12736
12737@end table
12738
12739@vindex gnus-part-display-hook
12740You can, of course, write your own functions to be called from
12741@code{gnus-part-display-hook}. The functions are called narrowed to the
12742part, and you can do anything you like, pretty much. There is no
12743information that you have to keep in the buffer---you can change
12744everything.
12745
12746
12747@node Article Keymap
12748@section Article Keymap
12749
12750Most of the keystrokes in the summary buffer can also be used in the
12751article buffer. They should behave as if you typed them in the summary
12752buffer, which means that you don't actually have to have a summary
12753buffer displayed while reading. You can do it all from the article
12754buffer.
12755
12756@kindex v (Article)
12757@cindex keys, reserved for users (Article)
12758The key @kbd{v} is reserved for users. You can bind it to some
12759command or better use it as a prefix key.
12760
12761A few additional keystrokes are available:
12762
12763@table @kbd
12764
12765@item SPACE
12766@kindex SPACE (Article)
12767@findex gnus-article-next-page
12768Scroll forwards one page (@code{gnus-article-next-page}).
12769This is exactly the same as @kbd{h SPACE h}.
12770
12771@item DEL
12772@kindex DEL (Article)
12773@findex gnus-article-prev-page
12774Scroll backwards one page (@code{gnus-article-prev-page}).
12775This is exactly the same as @kbd{h DEL h}.
12776
12777@item C-c ^
12778@kindex C-c ^ (Article)
12779@findex gnus-article-refer-article
12780If point is in the neighborhood of a @code{Message-ID} and you press
12781@kbd{C-c ^}, Gnus will try to get that article from the server
12782(@code{gnus-article-refer-article}).
12783
12784@item C-c C-m
12785@kindex C-c C-m (Article)
12786@findex gnus-article-mail
12787Send a reply to the address near point (@code{gnus-article-mail}). If
12788given a prefix, include the mail.
12789
12790@item s
12791@kindex s (Article)
12792@findex gnus-article-show-summary
12793Reconfigure the buffers so that the summary buffer becomes visible
12794(@code{gnus-article-show-summary}).
12795
12796@item ?
12797@kindex ? (Article)
12798@findex gnus-article-describe-briefly
12799Give a very brief description of the available keystrokes
12800(@code{gnus-article-describe-briefly}).
12801
12802@item TAB
12803@kindex TAB (Article)
12804@findex gnus-article-next-button
12805Go to the next button, if any (@code{gnus-article-next-button}). This
12806only makes sense if you have buttonizing turned on.
12807
12808@item M-TAB
12809@kindex M-TAB (Article)
12810@findex gnus-article-prev-button
12811Go to the previous button, if any (@code{gnus-article-prev-button}).
12812
12813@item R
12814@kindex R (Article)
12815@findex gnus-article-reply-with-original
12816Send a reply to the current article and yank the current article
95838435
MB
12817(@code{gnus-article-reply-with-original}). If the region is active,
12818only yank the text in the region.
12819
12820@item S W
12821@kindex S W (Article)
12822@findex gnus-article-wide-reply-with-original
12823Send a wide reply to the current article and yank the current article
12824(@code{gnus-article-wide-reply-with-original}). If the region is
12825active, only yank the text in the region.
4009494e
GM
12826
12827@item F
12828@kindex F (Article)
12829@findex gnus-article-followup-with-original
12830Send a followup to the current article and yank the current article
95838435
MB
12831(@code{gnus-article-followup-with-original}). If the region is active,
12832only yank the text in the region.
4009494e
GM
12833
12834
12835@end table
12836
12837
12838@node Misc Article
12839@section Misc Article
12840
12841@table @code
12842
12843@item gnus-single-article-buffer
12844@vindex gnus-single-article-buffer
12845@cindex article buffers, several
12846If non-@code{nil}, use the same article buffer for all the groups.
12847(This is the default.) If @code{nil}, each group will have its own
12848article buffer.
12849
12850@vindex gnus-article-decode-hook
12851@item gnus-article-decode-hook
12852@cindex @acronym{MIME}
12853Hook used to decode @acronym{MIME} articles. The default value is
12854@code{(article-decode-charset article-decode-encoded-words)}
12855
12856@vindex gnus-article-prepare-hook
12857@item gnus-article-prepare-hook
12858This hook is called right after the article has been inserted into the
12859article buffer. It is mainly intended for functions that do something
12860depending on the contents; it should probably not be used for changing
12861the contents of the article buffer.
12862
12863@item gnus-article-mode-hook
12864@vindex gnus-article-mode-hook
12865Hook called in article mode buffers.
12866
12867@item gnus-article-mode-syntax-table
12868@vindex gnus-article-mode-syntax-table
12869Syntax table used in article buffers. It is initialized from
12870@code{text-mode-syntax-table}.
12871
12872@vindex gnus-article-over-scroll
12873@item gnus-article-over-scroll
12874If non-@code{nil}, allow scrolling the article buffer even when there
12875no more new text to scroll in. The default is @code{nil}.
12876
12877@vindex gnus-article-mode-line-format
12878@item gnus-article-mode-line-format
12879This variable is a format string along the same lines as
12880@code{gnus-summary-mode-line-format} (@pxref{Summary Buffer Mode
12881Line}). It accepts the same format specifications as that variable,
12882with two extensions:
12883
12884@table @samp
12885
12886@item w
12887The @dfn{wash status} of the article. This is a short string with one
12888character for each possible article wash operation that may have been
12889performed. The characters and their meaning:
12890
12891@table @samp
12892
12893@item c
12894Displayed when cited text may be hidden in the article buffer.
12895
12896@item h
12897Displayed when headers are hidden in the article buffer.
12898
12899@item p
12900Displayed when article is digitally signed or encrypted, and Gnus has
12901hidden the security headers. (N.B. does not tell anything about
12902security status, i.e. good or bad signature.)
12903
12904@item s
12905Displayed when the signature has been hidden in the Article buffer.
12906
12907@item o
12908Displayed when Gnus has treated overstrike characters in the article buffer.
12909
12910@item e
6772c8e1 12911Displayed when Gnus has treated emphasized strings in the article buffer.
4009494e
GM
12912
12913@end table
12914
12915@item m
12916The number of @acronym{MIME} parts in the article.
12917
12918@end table
12919
12920@vindex gnus-break-pages
12921
12922@item gnus-break-pages
12923Controls whether @dfn{page breaking} is to take place. If this variable
12924is non-@code{nil}, the articles will be divided into pages whenever a
12925page delimiter appears in the article. If this variable is @code{nil},
12926paging will not be done.
12927
12928@item gnus-page-delimiter
12929@vindex gnus-page-delimiter
12930This is the delimiter mentioned above. By default, it is @samp{^L}
12931(formfeed).
12932
12933@cindex IDNA
12934@cindex internationalized domain names
12935@vindex gnus-use-idna
12936@item gnus-use-idna
12937This variable controls whether Gnus performs IDNA decoding of
12938internationalized domain names inside @samp{From}, @samp{To} and
01c52d31
MB
12939@samp{Cc} headers. @xref{IDNA, ,IDNA,message, The Message Manual},
12940for how to compose such messages. This requires
4009494e
GM
12941@uref{http://www.gnu.org/software/libidn/, GNU Libidn}, and this
12942variable is only enabled if you have installed it.
12943
12944@end table
12945
12946
12947@node Composing Messages
12948@chapter Composing Messages
12949@cindex composing messages
12950@cindex messages
12951@cindex mail
12952@cindex sending mail
12953@cindex reply
12954@cindex followup
12955@cindex post
12956@cindex using gpg
12957@cindex using s/mime
12958@cindex using smime
12959
12960@kindex C-c C-c (Post)
12961All commands for posting and mailing will put you in a message buffer
12962where you can edit the article all you like, before you send the
12963article by pressing @kbd{C-c C-c}. @xref{Top, , Overview, message,
12964Message Manual}. Where the message will be posted/mailed to depends
12965on your setup (@pxref{Posting Server}).
12966
12967@menu
12968* Mail:: Mailing and replying.
12969* Posting Server:: What server should you post and mail via?
12970* POP before SMTP:: You cannot send a mail unless you read a mail.
12971* Mail and Post:: Mailing and posting at the same time.
12972* Archived Messages:: Where Gnus stores the messages you've sent.
12973* Posting Styles:: An easier way to specify who you are.
12974* Drafts:: Postponing messages and rejected messages.
12975* Rejected Articles:: What happens if the server doesn't like your article?
12976* Signing and encrypting:: How to compose secure messages.
12977@end menu
12978
12979Also @pxref{Canceling and Superseding} for information on how to
12980remove articles you shouldn't have posted.
12981
12982
12983@node Mail
12984@section Mail
12985
12986Variables for customizing outgoing mail:
12987
12988@table @code
12989@item gnus-uu-digest-headers
12990@vindex gnus-uu-digest-headers
12991List of regexps to match headers included in digested messages. The
12992headers will be included in the sequence they are matched. If
12993@code{nil} include all headers.
12994
12995@item gnus-add-to-list
12996@vindex gnus-add-to-list
12997If non-@code{nil}, add a @code{to-list} group parameter to mail groups
12998that have none when you do a @kbd{a}.
12999
13000@item gnus-confirm-mail-reply-to-news
13001@vindex gnus-confirm-mail-reply-to-news
13002If non-@code{nil}, Gnus will ask you for a confirmation when you are
13003about to reply to news articles by mail. If it is @code{nil}, nothing
13004interferes in what you want to do. This can also be a function
13005receiving the group name as the only parameter which should return
13006non-@code{nil} if a confirmation is needed, or a regular expression
13007matching group names, where confirmation should be asked for.
13008
13009If you find yourself never wanting to reply to mail, but occasionally
13010press @kbd{R} anyway, this variable might be for you.
13011
13012@item gnus-confirm-treat-mail-like-news
13013@vindex gnus-confirm-treat-mail-like-news
13014If non-@code{nil}, Gnus also requests confirmation according to
13015@code{gnus-confirm-mail-reply-to-news} when replying to mail. This is
13016useful for treating mailing lists like newsgroups.
13017
13018@end table
13019
13020
13021@node Posting Server
13022@section Posting Server
13023
13024When you press those magical @kbd{C-c C-c} keys to ship off your latest
13025(extremely intelligent, of course) article, where does it go?
13026
13027Thank you for asking. I hate you.
13028
13029It can be quite complicated.
13030
13031@vindex gnus-post-method
13032When posting news, Message usually invokes @code{message-send-news}
13033(@pxref{News Variables, , News Variables, message, Message Manual}).
13034Normally, Gnus will post using the same select method as you're
13035reading from (which might be convenient if you're reading lots of
13036groups from different private servers). However. If the server
13037you're reading from doesn't allow posting, just reading, you probably
13038want to use some other server to post your (extremely intelligent and
13039fabulously interesting) articles. You can then set the
13040@code{gnus-post-method} to some other method:
13041
13042@lisp
13043(setq gnus-post-method '(nnspool ""))
13044@end lisp
13045
13046Now, if you've done this, and then this server rejects your article, or
13047this server is down, what do you do then? To override this variable you
13048can use a non-zero prefix to the @kbd{C-c C-c} command to force using
13049the ``current'' server, to get back the default behavior, for posting.
13050
13051If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command,
13052Gnus will prompt you for what method to use for posting.
13053
13054You can also set @code{gnus-post-method} to a list of select methods.
13055If that's the case, Gnus will always prompt you for what method to use
13056for posting.
13057
13058Finally, if you want to always post using the native select method,
13059you can set this variable to @code{native}.
13060
d82cf70b
MB
13061@vindex message-send-mail-function
13062When sending mail, Message invokes the function specified by the
13063variable @code{message-send-mail-function}. Gnus tries to set it to a
13064value suitable for your system.
13065@xref{Mail Variables, ,Mail Variables,message,Message manual}, for more
13066information.
4009494e
GM
13067
13068@node POP before SMTP
13069@section POP before SMTP
13070@cindex pop before smtp
13071@findex message-smtpmail-send-it
13072@findex mail-source-touch-pop
13073
13074Does your @acronym{ISP} require the @acronym{POP}-before-@acronym{SMTP}
13075authentication? It is whether you need to connect to the @acronym{POP}
13076mail server within a certain time before sending mails. If so, there is
13077a convenient way. To do that, put the following lines in your
13078@file{~/.gnus.el} file:
13079
13080@lisp
13081(setq message-send-mail-function 'message-smtpmail-send-it)
13082(add-hook 'message-send-mail-hook 'mail-source-touch-pop)
13083@end lisp
13084
13085@noindent
13086It means to let Gnus connect to the @acronym{POP} mail server in advance
13087whenever you send a mail. The @code{mail-source-touch-pop} function
13088does only a @acronym{POP} authentication according to the value of
13089@code{mail-sources} without fetching mails, just before sending a mail.
13090Note that you have to use @code{message-smtpmail-send-it} which runs
13091@code{message-send-mail-hook} rather than @code{smtpmail-send-it} and
13092set the value of @code{mail-sources} for a @acronym{POP} connection
13093correctly. @xref{Mail Sources}.
13094
13095If you have two or more @acronym{POP} mail servers set in
13096@code{mail-sources}, you may want to specify one of them to
13097@code{mail-source-primary-source} as the @acronym{POP} mail server to be
13098used for the @acronym{POP}-before-@acronym{SMTP} authentication. If it
13099is your primary @acronym{POP} mail server (i.e., you are fetching mails
13100mainly from that server), you can set it permanently as follows:
13101
13102@lisp
13103(setq mail-source-primary-source
13104 '(pop :server "pop3.mail.server"
13105 :password "secret"))
13106@end lisp
13107
13108@noindent
13109Otherwise, bind it dynamically only when performing the
13110@acronym{POP}-before-@acronym{SMTP} authentication as follows:
13111
13112@lisp
13113(add-hook 'message-send-mail-hook
13114 (lambda ()
13115 (let ((mail-source-primary-source
13116 '(pop :server "pop3.mail.server"
13117 :password "secret")))
13118 (mail-source-touch-pop))))
13119@end lisp
13120
13121@node Mail and Post
13122@section Mail and Post
13123
13124Here's a list of variables relevant to both mailing and
13125posting:
13126
13127@table @code
13128@item gnus-mailing-list-groups
13129@findex gnus-mailing-list-groups
13130@cindex mailing lists
13131
13132If your news server offers groups that are really mailing lists
13133gatewayed to the @acronym{NNTP} server, you can read those groups without
13134problems, but you can't post/followup to them without some difficulty.
13135One solution is to add a @code{to-address} to the group parameters
13136(@pxref{Group Parameters}). An easier thing to do is set the
13137@code{gnus-mailing-list-groups} to a regexp that matches the groups that
13138really are mailing lists. Then, at least, followups to the mailing
13139lists will work most of the time. Posting to these groups (@kbd{a}) is
13140still a pain, though.
13141
13142@item gnus-user-agent
13143@vindex gnus-user-agent
13144@cindex User-Agent
13145
13146This variable controls which information should be exposed in the
13147User-Agent header. It can be a list of symbols or a string. Valid
13148symbols are @code{gnus} (show Gnus version) and @code{emacs} (show Emacs
13149version). In addition to the Emacs version, you can add @code{codename}
13150(show (S)XEmacs codename) or either @code{config} (show system
13151configuration) or @code{type} (show system type). If you set it to a
13152string, be sure to use a valid format, see RFC 2616.
13153
13154@end table
13155
13156You may want to do spell-checking on messages that you send out. Or, if
13157you don't want to spell-check by hand, you could add automatic
13158spell-checking via the @code{ispell} package:
13159
13160@cindex ispell
13161@findex ispell-message
13162@lisp
13163(add-hook 'message-send-hook 'ispell-message)
13164@end lisp
13165
13166If you want to change the @code{ispell} dictionary based on what group
13167you're in, you could say something like the following:
13168
13169@lisp
13170(add-hook 'gnus-select-group-hook
13171 (lambda ()
13172 (cond
13173 ((string-match
13174 "^de\\." (gnus-group-real-name gnus-newsgroup-name))
13175 (ispell-change-dictionary "deutsch"))
13176 (t
13177 (ispell-change-dictionary "english")))))
13178@end lisp
13179
13180Modify to suit your needs.
13181
01c52d31
MB
13182@vindex gnus-message-highlight-citation
13183If @code{gnus-message-highlight-citation} is t, different levels of
13184citations are highlighted like in Gnus article buffers also in message
13185mode buffers.
4009494e
GM
13186
13187@node Archived Messages
13188@section Archived Messages
13189@cindex archived messages
13190@cindex sent messages
13191
13192Gnus provides a few different methods for storing the mail and news you
13193send. The default method is to use the @dfn{archive virtual server} to
13194store the messages. If you want to disable this completely, the
13195@code{gnus-message-archive-group} variable should be @code{nil}, which
13196is the default.
13197
13198For archiving interesting messages in a group you read, see the
13199@kbd{B c} (@code{gnus-summary-copy-article}) command (@pxref{Mail
13200Group Commands}).
13201
13202@vindex gnus-message-archive-method
13203@code{gnus-message-archive-method} says what virtual server Gnus is to
01c52d31
MB
13204use to store sent messages. The default is @code{"archive"}, and when
13205actually being used it is expanded into:
4009494e
GM
13206
13207@lisp
13208(nnfolder "archive"
13209 (nnfolder-directory "~/Mail/archive")
13210 (nnfolder-active-file "~/Mail/archive/active")
13211 (nnfolder-get-new-mail nil)
13212 (nnfolder-inhibit-expiry t))
13213@end lisp
13214
01c52d31
MB
13215@quotation
13216@vindex gnus-update-message-archive-method
13217Note: a server like this is saved in the @file{~/.newsrc.eld} file first
13218so that it may be used as a real method of the server which is named
13219@code{"archive"} (that is, for the case where
13220@code{gnus-message-archive-method} is set to @code{"archive"}) ever
13221since. If it once has been saved, it will never be updated by default
13222even if you change the value of @code{gnus-message-archive-method}
13223afterward. Therefore, the server @code{"archive"} doesn't necessarily
13224mean the @code{nnfolder} server like this at all times. If you want the
13225saved method to reflect always the value of
13226@code{gnus-message-archive-method}, set the
13227@code{gnus-update-message-archive-method} variable to a non-@code{nil}
13228value. The default value of this variable is @code{nil}.
13229@end quotation
13230
4009494e
GM
13231You can, however, use any mail select method (@code{nnml},
13232@code{nnmbox}, etc.). @code{nnfolder} is a quite likable select method
13233for doing this sort of thing, though. If you don't like the default
13234directory chosen, you could say something like:
13235
13236@lisp
13237(setq gnus-message-archive-method
13238 '(nnfolder "archive"
13239 (nnfolder-inhibit-expiry t)
13240 (nnfolder-active-file "~/News/sent-mail/active")
13241 (nnfolder-directory "~/News/sent-mail/")))
13242@end lisp
13243
13244@vindex gnus-message-archive-group
13245@cindex Gcc
13246Gnus will insert @code{Gcc} headers in all outgoing messages that point
13247to one or more group(s) on that server. Which group to use is
13248determined by the @code{gnus-message-archive-group} variable.
13249
13250This variable can be used to do the following:
13251
13252@table @asis
13253@item a string
13254Messages will be saved in that group.
13255
13256Note that you can include a select method in the group name, then the
13257message will not be stored in the select method given by
13258@code{gnus-message-archive-method}, but in the select method specified
13259by the group name, instead. Suppose @code{gnus-message-archive-method}
13260has the default value shown above. Then setting
13261@code{gnus-message-archive-group} to @code{"foo"} means that outgoing
13262messages are stored in @samp{nnfolder+archive:foo}, but if you use the
13263value @code{"nnml:foo"}, then outgoing messages will be stored in
13264@samp{nnml:foo}.
13265
13266@item a list of strings
13267Messages will be saved in all those groups.
13268
13269@item an alist of regexps, functions and forms
13270When a key ``matches'', the result is used.
13271
13272@item @code{nil}
13273No message archiving will take place. This is the default.
13274@end table
13275
13276Let's illustrate:
13277
13278Just saving to a single group called @samp{MisK}:
13279@lisp
13280(setq gnus-message-archive-group "MisK")
13281@end lisp
13282
13283Saving to two groups, @samp{MisK} and @samp{safe}:
13284@lisp
13285(setq gnus-message-archive-group '("MisK" "safe"))
13286@end lisp
13287
13288Save to different groups based on what group you are in:
13289@lisp
13290(setq gnus-message-archive-group
13291 '(("^alt" "sent-to-alt")
13292 ("mail" "sent-to-mail")
13293 (".*" "sent-to-misc")))
13294@end lisp
13295
13296More complex stuff:
13297@lisp
13298(setq gnus-message-archive-group
13299 '((if (message-news-p)
13300 "misc-news"
13301 "misc-mail")))
13302@end lisp
13303
13304How about storing all news messages in one file, but storing all mail
13305messages in one file per month:
13306
13307@lisp
13308(setq gnus-message-archive-group
13309 '((if (message-news-p)
13310 "misc-news"
13311 (concat "mail." (format-time-string "%Y-%m")))))
13312@end lisp
13313
13314@c (XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to
13315@c use a different value for @code{gnus-message-archive-group} there.)
13316
13317Now, when you send a message off, it will be stored in the appropriate
13318group. (If you want to disable storing for just one particular message,
13319you can just remove the @code{Gcc} header that has been inserted.) The
13320archive group will appear in the group buffer the next time you start
13321Gnus, or the next time you press @kbd{F} in the group buffer. You can
13322enter it and read the articles in it just like you'd read any other
13323group. If the group gets really big and annoying, you can simply rename
13324if (using @kbd{G r} in the group buffer) to something
13325nice---@samp{misc-mail-september-1995}, or whatever. New messages will
13326continue to be stored in the old (now empty) group.
13327
13328That's the default method of archiving sent messages. Gnus offers a
13329different way for the people who don't like the default method. In that
13330case you should set @code{gnus-message-archive-group} to @code{nil};
13331this will disable archiving.
13332
13333@table @code
13334@item gnus-outgoing-message-group
13335@vindex gnus-outgoing-message-group
13336All outgoing messages will be put in this group. If you want to store
13337all your outgoing mail and articles in the group @samp{nnml:archive},
13338you set this variable to that value. This variable can also be a list of
13339group names.
13340
13341If you want to have greater control over what group to put each
13342message in, you can set this variable to a function that checks the
13343current newsgroup name and then returns a suitable group name (or list
13344of names).
13345
13346This variable can be used instead of @code{gnus-message-archive-group},
13347but the latter is the preferred method.
13348
13349@item gnus-gcc-mark-as-read
13350@vindex gnus-gcc-mark-as-read
13351If non-@code{nil}, automatically mark @code{Gcc} articles as read.
13352
13353@item gnus-gcc-externalize-attachments
13354@vindex gnus-gcc-externalize-attachments
13355If @code{nil}, attach files as normal parts in Gcc copies; if a regexp
13356and matches the Gcc group name, attach files as external parts; if it is
13357@code{all}, attach local files as external parts; if it is other
13358non-@code{nil}, the behavior is the same as @code{all}, but it may be
13359changed in the future.
13360
13361@end table
13362
13363
13364@node Posting Styles
13365@section Posting Styles
13366@cindex posting styles
13367@cindex styles
13368
13369All them variables, they make my head swim.
13370
13371So what if you want a different @code{Organization} and signature based
13372on what groups you post to? And you post both from your home machine
13373and your work machine, and you want different @code{From} lines, and so
13374on?
13375
13376@vindex gnus-posting-styles
13377One way to do stuff like that is to write clever hooks that change the
13378variables you need to have changed. That's a bit boring, so somebody
13379came up with the bright idea of letting the user specify these things in
13380a handy alist. Here's an example of a @code{gnus-posting-styles}
13381variable:
13382
13383@lisp
13384((".*"
13385 (signature "Peace and happiness")
13386 (organization "What me?"))
13387 ("^comp"
13388 (signature "Death to everybody"))
13389 ("comp.emacs.i-love-it"
13390 (organization "Emacs is it")))
13391@end lisp
13392
13393As you might surmise from this example, this alist consists of several
13394@dfn{styles}. Each style will be applicable if the first element
13395``matches'', in some form or other. The entire alist will be iterated
13396over, from the beginning towards the end, and each match will be
13397applied, which means that attributes in later styles that match override
13398the same attributes in earlier matching styles. So
13399@samp{comp.programming.literate} will have the @samp{Death to everybody}
13400signature and the @samp{What me?} @code{Organization} header.
13401
13402The first element in each style is called the @code{match}. If it's a
13403string, then Gnus will try to regexp match it against the group name.
13404If it is the form @code{(header @var{match} @var{regexp})}, then Gnus
13405will look in the original article for a header whose name is
13406@var{match} and compare that @var{regexp}. @var{match} and
13407@var{regexp} are strings. (The original article is the one you are
13408replying or following up to. If you are not composing a reply or a
13409followup, then there is nothing to match against.) If the
13410@code{match} is a function symbol, that function will be called with
13411no arguments. If it's a variable symbol, then the variable will be
13412referenced. If it's a list, then that list will be @code{eval}ed. In
13413any case, if this returns a non-@code{nil} value, then the style is
13414said to @dfn{match}.
13415
13416Each style may contain an arbitrary amount of @dfn{attributes}. Each
13417attribute consists of a @code{(@var{name} @var{value})} pair. In
13418addition, you can also use the @code{(@var{name} :file @var{value})}
13419form or the @code{(@var{name} :value @var{value})} form. Where
13420@code{:file} signifies @var{value} represents a file name and its
13421contents should be used as the attribute value, @code{:value} signifies
13422@var{value} does not represent a file name explicitly. The attribute
13423name can be one of:
13424
13425@itemize @bullet
13426@item @code{signature}
13427@item @code{signature-file}
13428@item @code{x-face-file}
13429@item @code{address}, overriding @code{user-mail-address}
13430@item @code{name}, overriding @code{(user-full-name)}
13431@item @code{body}
13432@end itemize
13433
01c52d31
MB
13434Note that the @code{signature-file} attribute honors the variable
13435@code{message-signature-directory}.
13436
4009494e
GM
13437The attribute name can also be a string or a symbol. In that case,
13438this will be used as a header name, and the value will be inserted in
13439the headers of the article; if the value is @code{nil}, the header
13440name will be removed. If the attribute name is @code{eval}, the form
13441is evaluated, and the result is thrown away.
13442
13443The attribute value can be a string (used verbatim), a function with
13444zero arguments (the return value will be used), a variable (its value
13445will be used) or a list (it will be @code{eval}ed and the return value
13446will be used). The functions and sexps are called/@code{eval}ed in the
13447message buffer that is being set up. The headers of the current article
13448are available through the @code{message-reply-headers} variable, which
13449is a vector of the following headers: number subject from date id
13450references chars lines xref extra.
13451
13452@vindex message-reply-headers
13453
13454If you wish to check whether the message you are about to compose is
13455meant to be a news article or a mail message, you can check the values
13456of the @code{message-news-p} and @code{message-mail-p} functions.
13457
13458@findex message-mail-p
13459@findex message-news-p
13460
13461So here's a new example:
13462
13463@lisp
13464(setq gnus-posting-styles
13465 '((".*"
13466 (signature-file "~/.signature")
13467 (name "User Name")
13468 (x-face-file "~/.xface")
13469 (x-url (getenv "WWW_HOME"))
13470 (organization "People's Front Against MWM"))
13471 ("^rec.humor"
13472 (signature my-funny-signature-randomizer))
13473 ((equal (system-name) "gnarly") ;; @r{A form}
13474 (signature my-quote-randomizer))
13475 (message-news-p ;; @r{A function symbol}
13476 (signature my-news-signature))
13477 (window-system ;; @r{A value symbol}
13478 ("X-Window-System" (format "%s" window-system)))
13479 ;; @r{If I'm replying to Larsi, set the Organization header.}
13480 ((header "from" "larsi.*org")
13481 (Organization "Somewhere, Inc."))
13482 ((posting-from-work-p) ;; @r{A user defined function}
13483 (signature-file "~/.work-signature")
13484 (address "user@@bar.foo")
13485 (body "You are fired.\n\nSincerely, your boss.")
13486 (organization "Important Work, Inc"))
13487 ("nnml:.*"
c57008f6 13488 (From (with-current-buffer gnus-article-buffer
4009494e
GM
13489 (message-fetch-field "to"))))
13490 ("^nn.+:"
13491 (signature-file "~/.mail-signature"))))
13492@end lisp
13493
13494The @samp{nnml:.*} rule means that you use the @code{To} address as the
13495@code{From} address in all your outgoing replies, which might be handy
13496if you fill many roles.
13497You may also use @code{message-alternative-emails} instead.
13498@xref{Message Headers, ,Message Headers, message, Message Manual}.
13499
13500@node Drafts
13501@section Drafts
13502@cindex drafts
13503
13504If you are writing a message (mail or news) and suddenly remember that
13505you have a steak in the oven (or some pesto in the food processor, you
13506craaazy vegetarians), you'll probably wish there was a method to save
13507the message you are writing so that you can continue editing it some
13508other day, and send it when you feel its finished.
13509
13510Well, don't worry about it. Whenever you start composing a message of
13511some sort using the Gnus mail and post commands, the buffer you get will
13512automatically associate to an article in a special @dfn{draft} group.
13513If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the
13514article will be saved there. (Auto-save files also go to the draft
13515group.)
13516
13517@cindex nndraft
13518@vindex nndraft-directory
13519The draft group is a special group (which is implemented as an
13520@code{nndraft} group, if you absolutely have to know) called
13521@samp{nndraft:drafts}. The variable @code{nndraft-directory} says where
13522@code{nndraft} is to store its files. What makes this group special is
13523that you can't tick any articles in it or mark any articles as
13524read---all articles in the group are permanently unread.
13525
13526If the group doesn't exist, it will be created and you'll be subscribed
13527to it. The only way to make it disappear from the Group buffer is to
13528unsubscribe it. The special properties of the draft group comes from
13529a group property (@pxref{Group Parameters}), and if lost the group
13530behaves like any other group. This means the commands below will not
13531be available. To restore the special properties of the group, the
13532simplest way is to kill the group, using @kbd{C-k}, and restart
13533Gnus. The group is automatically created again with the
13534correct parameters. The content of the group is not lost.
13535
13536@c @findex gnus-dissociate-buffer-from-draft
13537@c @kindex C-c M-d (Mail)
13538@c @kindex C-c M-d (Post)
13539@c @findex gnus-associate-buffer-with-draft
13540@c @kindex C-c C-d (Mail)
13541@c @kindex C-c C-d (Post)
13542@c If you're writing some super-secret message that you later want to
13543@c encode with PGP before sending, you may wish to turn the auto-saving
13544@c (and association with the draft group) off. You never know who might be
13545@c interested in reading all your extremely valuable and terribly horrible
13546@c and interesting secrets. The @kbd{C-c M-d}
13547@c (@code{gnus-dissociate-buffer-from-draft}) command does that for you.
13548@c If you change your mind and want to turn the auto-saving back on again,
13549@c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that.
13550@c
13551@c @vindex gnus-use-draft
13552@c To leave association with the draft group off by default, set
13553@c @code{gnus-use-draft} to @code{nil}. It is @code{t} by default.
13554
13555@findex gnus-draft-edit-message
13556@kindex D e (Draft)
13557When you want to continue editing the article, you simply enter the
13558draft group and push @kbd{D e} (@code{gnus-draft-edit-message}) to do
13559that. You will be placed in a buffer where you left off.
13560
13561Rejected articles will also be put in this draft group (@pxref{Rejected
13562Articles}).
13563
13564@findex gnus-draft-send-all-messages
13565@kindex D s (Draft)
13566@findex gnus-draft-send-message
13567@kindex D S (Draft)
13568If you have lots of rejected messages you want to post (or mail) without
13569doing further editing, you can use the @kbd{D s} command
13570(@code{gnus-draft-send-message}). This command understands the
13571process/prefix convention (@pxref{Process/Prefix}). The @kbd{D S}
13572command (@code{gnus-draft-send-all-messages}) will ship off all messages
13573in the buffer.
13574
13575@findex gnus-draft-toggle-sending
13576@kindex D t (Draft)
13577If you have some messages that you wish not to send, you can use the
13578@kbd{D t} (@code{gnus-draft-toggle-sending}) command to mark the message
13579as unsendable. This is a toggling command.
13580
598451ed
KY
13581Finally, if you want to delete a draft, use the normal @kbd{B DEL}
13582command (@pxref{Mail Group Commands}).
13583
4009494e
GM
13584
13585@node Rejected Articles
13586@section Rejected Articles
13587@cindex rejected articles
13588
13589Sometimes a news server will reject an article. Perhaps the server
13590doesn't like your face. Perhaps it just feels miserable. Perhaps
13591@emph{there be demons}. Perhaps you have included too much cited text.
13592Perhaps the disk is full. Perhaps the server is down.
13593
13594These situations are, of course, totally beyond the control of Gnus.
13595(Gnus, of course, loves the way you look, always feels great, has angels
13596fluttering around inside of it, doesn't care about how much cited text
13597you include, never runs full and never goes down.) So Gnus saves these
13598articles until some later time when the server feels better.
13599
13600The rejected articles will automatically be put in a special draft group
13601(@pxref{Drafts}). When the server comes back up again, you'd then
13602typically enter that group and send all the articles off.
13603
13604@node Signing and encrypting
13605@section Signing and encrypting
13606@cindex using gpg
13607@cindex using s/mime
13608@cindex using smime
13609
13610Gnus can digitally sign and encrypt your messages, using vanilla
13611@acronym{PGP} format or @acronym{PGP/MIME} or @acronym{S/MIME}. For
13612decoding such messages, see the @code{mm-verify-option} and
13613@code{mm-decrypt-option} options (@pxref{Security}).
13614
13615@vindex gnus-message-replysign
13616@vindex gnus-message-replyencrypt
13617@vindex gnus-message-replysignencrypted
13618Often, you would like to sign replies to people who send you signed
13619messages. Even more often, you might want to encrypt messages which
13620are in reply to encrypted messages. Gnus offers
13621@code{gnus-message-replysign} to enable the former, and
13622@code{gnus-message-replyencrypt} for the latter. In addition, setting
13623@code{gnus-message-replysignencrypted} (on by default) will sign
13624automatically encrypted messages.
13625
13626Instructing @acronym{MML} to perform security operations on a
13627@acronym{MIME} part is done using the @kbd{C-c C-m s} key map for
13628signing and the @kbd{C-c C-m c} key map for encryption, as follows.
13629
13630@table @kbd
13631
13632@item C-c C-m s s
13633@kindex C-c C-m s s (Message)
13634@findex mml-secure-message-sign-smime
13635
13636Digitally sign current message using @acronym{S/MIME}.
13637
13638@item C-c C-m s o
13639@kindex C-c C-m s o (Message)
13640@findex mml-secure-message-sign-pgp
13641
13642Digitally sign current message using @acronym{PGP}.
13643
13644@item C-c C-m s p
13645@kindex C-c C-m s p (Message)
13646@findex mml-secure-message-sign-pgp
13647
13648Digitally sign current message using @acronym{PGP/MIME}.
13649
13650@item C-c C-m c s
13651@kindex C-c C-m c s (Message)
13652@findex mml-secure-message-encrypt-smime
13653
13654Digitally encrypt current message using @acronym{S/MIME}.
13655
13656@item C-c C-m c o
13657@kindex C-c C-m c o (Message)
13658@findex mml-secure-message-encrypt-pgp
13659
13660Digitally encrypt current message using @acronym{PGP}.
13661
13662@item C-c C-m c p
13663@kindex C-c C-m c p (Message)
13664@findex mml-secure-message-encrypt-pgpmime
13665
13666Digitally encrypt current message using @acronym{PGP/MIME}.
13667
13668@item C-c C-m C-n
13669@kindex C-c C-m C-n (Message)
13670@findex mml-unsecure-message
13671Remove security related @acronym{MML} tags from message.
13672
13673@end table
13674
13675@xref{Security, ,Security, message, Message Manual}, for more information.
13676
13677@node Select Methods
13678@chapter Select Methods
13679@cindex foreign groups
13680@cindex select methods
13681
13682A @dfn{foreign group} is a group not read by the usual (or
13683default) means. It could be, for instance, a group from a different
13684@acronym{NNTP} server, it could be a virtual group, or it could be your own
13685personal mail group.
13686
13687A foreign group (or any group, really) is specified by a @dfn{name} and
13688a @dfn{select method}. To take the latter first, a select method is a
13689list where the first element says what back end to use (e.g. @code{nntp},
13690@code{nnspool}, @code{nnml}) and the second element is the @dfn{server
13691name}. There may be additional elements in the select method, where the
13692value may have special meaning for the back end in question.
13693
13694One could say that a select method defines a @dfn{virtual server}---so
13695we do just that (@pxref{Server Buffer}).
13696
13697The @dfn{name} of the group is the name the back end will recognize the
13698group as.
13699
13700For instance, the group @samp{soc.motss} on the @acronym{NNTP} server
13701@samp{some.where.edu} will have the name @samp{soc.motss} and select
13702method @code{(nntp "some.where.edu")}. Gnus will call this group
13703@samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp}
13704back end just knows this group as @samp{soc.motss}.
13705
13706The different methods all have their peculiarities, of course.
13707
13708@menu
13709* Server Buffer:: Making and editing virtual servers.
13710* Getting News:: Reading USENET news with Gnus.
229b59da 13711* Using IMAP:: Reading mail from @acronym{IMAP}.
4009494e
GM
13712* Getting Mail:: Reading your personal mail with Gnus.
13713* Browsing the Web:: Getting messages from a plethora of Web sources.
c4d82de8 13714* Other Sources:: Reading directories, files.
4009494e
GM
13715* Combined Groups:: Combining groups into one group.
13716* Email Based Diary:: Using mails to manage diary events in Gnus.
13717* Gnus Unplugged:: Reading news and mail offline.
13718@end menu
13719
13720
13721@node Server Buffer
13722@section Server Buffer
13723
13724Traditionally, a @dfn{server} is a machine or a piece of software that
13725one connects to, and then requests information from. Gnus does not
13726connect directly to any real servers, but does all transactions through
13727one back end or other. But that's just putting one layer more between
13728the actual media and Gnus, so we might just as well say that each
13729back end represents a virtual server.
13730
13731For instance, the @code{nntp} back end may be used to connect to several
13732different actual @acronym{NNTP} servers, or, perhaps, to many different ports
13733on the same actual @acronym{NNTP} server. You tell Gnus which back end to
13734use, and what parameters to set by specifying a @dfn{select method}.
13735
13736These select method specifications can sometimes become quite
13737complicated---say, for instance, that you want to read from the
13738@acronym{NNTP} server @samp{news.funet.fi} on port number 13, which
13739hangs if queried for @acronym{NOV} headers and has a buggy select. Ahem.
13740Anyway, if you had to specify that for each group that used this
13741server, that would be too much work, so Gnus offers a way of naming
13742select methods, which is what you do in the server buffer.
13743
13744To enter the server buffer, use the @kbd{^}
13745(@code{gnus-group-enter-server-mode}) command in the group buffer.
13746
13747@menu
13748* Server Buffer Format:: You can customize the look of this buffer.
13749* Server Commands:: Commands to manipulate servers.
13750* Example Methods:: Examples server specifications.
13751* Creating a Virtual Server:: An example session.
13752* Server Variables:: Which variables to set.
13753* Servers and Methods:: You can use server names as select methods.
13754* Unavailable Servers:: Some servers you try to contact may be down.
13755@end menu
13756
13757@vindex gnus-server-mode-hook
13758@code{gnus-server-mode-hook} is run when creating the server buffer.
13759
13760
13761@node Server Buffer Format
13762@subsection Server Buffer Format
13763@cindex server buffer format
13764
13765@vindex gnus-server-line-format
13766You can change the look of the server buffer lines by changing the
13767@code{gnus-server-line-format} variable. This is a @code{format}-like
13768variable, with some simple extensions:
13769
13770@table @samp
13771
13772@item h
13773How the news is fetched---the back end name.
13774
13775@item n
13776The name of this server.
13777
13778@item w
13779Where the news is to be fetched from---the address.
13780
13781@item s
13782The opened/closed/denied status of the server.
13783
13784@item a
13785Whether this server is agentized.
13786@end table
13787
13788@vindex gnus-server-mode-line-format
13789The mode line can also be customized by using the
13790@code{gnus-server-mode-line-format} variable (@pxref{Mode Line
13791Formatting}). The following specs are understood:
13792
13793@table @samp
13794@item S
13795Server name.
13796
13797@item M
13798Server method.
13799@end table
13800
13801Also @pxref{Formatting Variables}.
13802
13803
13804@node Server Commands
13805@subsection Server Commands
13806@cindex server commands
13807
13808@table @kbd
13809
13810@item v
13811@kindex v (Server)
13812@cindex keys, reserved for users (Server)
13813The key @kbd{v} is reserved for users. You can bind it to some
13814command or better use it as a prefix key.
13815
13816@item a
13817@kindex a (Server)
13818@findex gnus-server-add-server
13819Add a new server (@code{gnus-server-add-server}).
13820
13821@item e
13822@kindex e (Server)
13823@findex gnus-server-edit-server
13824Edit a server (@code{gnus-server-edit-server}).
13825
13826@item SPACE
13827@kindex SPACE (Server)
13828@findex gnus-server-read-server
13829Browse the current server (@code{gnus-server-read-server}).
13830
13831@item q
13832@kindex q (Server)
13833@findex gnus-server-exit
13834Return to the group buffer (@code{gnus-server-exit}).
13835
13836@item k
13837@kindex k (Server)
13838@findex gnus-server-kill-server
13839Kill the current server (@code{gnus-server-kill-server}).
13840
13841@item y
13842@kindex y (Server)
13843@findex gnus-server-yank-server
13844Yank the previously killed server (@code{gnus-server-yank-server}).
13845
13846@item c
13847@kindex c (Server)
13848@findex gnus-server-copy-server
13849Copy the current server (@code{gnus-server-copy-server}).
13850
13851@item l
13852@kindex l (Server)
13853@findex gnus-server-list-servers
13854List all servers (@code{gnus-server-list-servers}).
13855
13856@item s
13857@kindex s (Server)
13858@findex gnus-server-scan-server
13859Request that the server scan its sources for new articles
13860(@code{gnus-server-scan-server}). This is mainly sensible with mail
13861servers.
13862
13863@item g
13864@kindex g (Server)
13865@findex gnus-server-regenerate-server
13866Request that the server regenerate all its data structures
13867(@code{gnus-server-regenerate-server}). This can be useful if you have
13868a mail back end that has gotten out of sync.
13869
01c52d31
MB
13870@item z
13871@kindex z (Server)
13872@findex gnus-server-compact-server
13873
13874Compact all groups in the server under point
13875(@code{gnus-server-compact-server}). Currently implemented only in
13876nnml (@pxref{Mail Spool}). This removes gaps between article numbers,
13877hence getting a correct total article count.
13878
4009494e
GM
13879@end table
13880
13881
13882@node Example Methods
13883@subsection Example Methods
13884
13885Most select methods are pretty simple and self-explanatory:
13886
13887@lisp
13888(nntp "news.funet.fi")
13889@end lisp
13890
13891Reading directly from the spool is even simpler:
13892
13893@lisp
13894(nnspool "")
13895@end lisp
13896
13897As you can see, the first element in a select method is the name of the
13898back end, and the second is the @dfn{address}, or @dfn{name}, if you
13899will.
13900
13901After these two elements, there may be an arbitrary number of
13902@code{(@var{variable} @var{form})} pairs.
13903
13904To go back to the first example---imagine that you want to read from
13905port 15 on that machine. This is what the select method should
13906look like then:
13907
13908@lisp
13909(nntp "news.funet.fi" (nntp-port-number 15))
13910@end lisp
13911
13912You should read the documentation to each back end to find out what
13913variables are relevant, but here's an @code{nnmh} example:
13914
13915@code{nnmh} is a mail back end that reads a spool-like structure. Say
13916you have two structures that you wish to access: One is your private
13917mail spool, and the other is a public one. Here's the possible spec for
13918your private mail:
13919
13920@lisp
13921(nnmh "private" (nnmh-directory "~/private/mail/"))
13922@end lisp
13923
13924(This server is then called @samp{private}, but you may have guessed
13925that.)
13926
13927Here's the method for a public spool:
13928
13929@lisp
13930(nnmh "public"
13931 (nnmh-directory "/usr/information/spool/")
13932 (nnmh-get-new-mail nil))
13933@end lisp
13934
13935@cindex proxy
13936@cindex firewall
13937
13938If you are behind a firewall and only have access to the @acronym{NNTP}
13939server from the firewall machine, you can instruct Gnus to @code{rlogin}
31fe2b00
SM
13940on the firewall machine and connect with
13941@uref{http://netcat.sourceforge.net/, netcat} from there to the
13942@acronym{NNTP} server.
4009494e
GM
13943Doing this can be rather fiddly, but your virtual server definition
13944should probably look something like this:
13945
13946@lisp
13947(nntp "firewall"
31fe2b00 13948 (nntp-open-connection-function nntp-open-via-rlogin-and-netcat)
4009494e 13949 (nntp-via-address "the.firewall.machine")
31fe2b00 13950 (nntp-address "the.real.nntp.host"))
4009494e
GM
13951@end lisp
13952
13953If you want to use the wonderful @code{ssh} program to provide a
13954compressed connection over the modem line, you could add the following
13955configuration to the example above:
13956
13957@lisp
13958 (nntp-via-rlogin-command "ssh")
13959@end lisp
13960
01c52d31
MB
13961See also @code{nntp-via-rlogin-command-switches}. Here's an example for
13962an indirect connection:
fbcbb58c 13963
01c52d31
MB
13964@lisp
13965(setq gnus-select-method
13966 '(nntp "indirect"
13967 (nntp-address "news.server.example")
13968 (nntp-via-user-name "intermediate_user_name")
13969 (nntp-via-address "intermediate.host.example")
13970 (nntp-via-rlogin-command "ssh")
31fe2b00
SM
13971 (nntp-via-rlogin-command-switches ("-C"))
13972 (nntp-open-connection-function nntp-open-via-rlogin-and-netcat)))
01c52d31 13973@end lisp
4009494e 13974
fbcbb58c
KY
13975This means that you have to have set up @code{ssh-agent} correctly to
13976provide automatic authorization, of course.
13977
4009494e
GM
13978If you're behind a firewall, but have direct access to the outside world
13979through a wrapper command like "runsocks", you could open a socksified
31fe2b00 13980netcat connection to the news server as follows:
4009494e
GM
13981
13982@lisp
13983(nntp "outside"
13984 (nntp-pre-command "runsocks")
990e2c2f 13985 (nntp-open-connection-function nntp-open-netcat-stream)
31fe2b00 13986 (nntp-address "the.news.server"))
4009494e
GM
13987@end lisp
13988
4009494e
GM
13989
13990@node Creating a Virtual Server
13991@subsection Creating a Virtual Server
13992
13993If you're saving lots of articles in the cache by using persistent
13994articles, you may want to create a virtual server to read the cache.
13995
13996First you need to add a new server. The @kbd{a} command does that. It
13997would probably be best to use @code{nnml} to read the cache. You
13998could also use @code{nnspool} or @code{nnmh}, though.
13999
14000Type @kbd{a nnml RET cache RET}.
14001
14002You should now have a brand new @code{nnml} virtual server called
14003@samp{cache}. You now need to edit it to have the right definitions.
14004Type @kbd{e} to edit the server. You'll be entered into a buffer that
14005will contain the following:
14006
14007@lisp
14008(nnml "cache")
14009@end lisp
14010
14011Change that to:
14012
14013@lisp
14014(nnml "cache"
14015 (nnml-directory "~/News/cache/")
14016 (nnml-active-file "~/News/cache/active"))
14017@end lisp
14018
14019Type @kbd{C-c C-c} to return to the server buffer. If you now press
14020@kbd{RET} over this virtual server, you should be entered into a browse
14021buffer, and you should be able to enter any of the groups displayed.
14022
14023
14024@node Server Variables
14025@subsection Server Variables
14026@cindex server variables
14027@cindex server parameters
14028
14029One sticky point when defining variables (both on back ends and in Emacs
14030in general) is that some variables are typically initialized from other
14031variables when the definition of the variables is being loaded. If you
14032change the ``base'' variable after the variables have been loaded, you
14033won't change the ``derived'' variables.
14034
14035This typically affects directory and file variables. For instance,
14036@code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml}
14037directory variables are initialized from that variable, so
14038@code{nnml-active-file} will be @file{~/Mail/active}. If you define a
14039new virtual @code{nnml} server, it will @emph{not} suffice to set just
14040@code{nnml-directory}---you have to explicitly set all the file
14041variables to be what you want them to be. For a complete list of
14042variables for each back end, see each back end's section later in this
14043manual, but here's an example @code{nnml} definition:
14044
14045@lisp
14046(nnml "public"
14047 (nnml-directory "~/my-mail/")
14048 (nnml-active-file "~/my-mail/active")
14049 (nnml-newsgroups-file "~/my-mail/newsgroups"))
14050@end lisp
14051
14052Server variables are often called @dfn{server parameters}.
14053
14054@node Servers and Methods
14055@subsection Servers and Methods
14056
14057Wherever you would normally use a select method
14058(e.g. @code{gnus-secondary-select-method}, in the group select method,
14059when browsing a foreign server) you can use a virtual server name
14060instead. This could potentially save lots of typing. And it's nice all
14061over.
14062
14063
14064@node Unavailable Servers
14065@subsection Unavailable Servers
14066
14067If a server seems to be unreachable, Gnus will mark that server as
14068@code{denied}. That means that any subsequent attempt to make contact
14069with that server will just be ignored. ``It can't be opened,'' Gnus
14070will tell you, without making the least effort to see whether that is
14071actually the case or not.
14072
14073That might seem quite naughty, but it does make sense most of the time.
14074Let's say you have 10 groups subscribed to on server
14075@samp{nephelococcygia.com}. This server is located somewhere quite far
14076away from you and the machine is quite slow, so it takes 1 minute just
14077to find out that it refuses connection to you today. If Gnus were to
14078attempt to do that 10 times, you'd be quite annoyed, so Gnus won't
14079attempt to do that. Once it has gotten a single ``connection refused'',
14080it will regard that server as ``down''.
14081
14082So, what happens if the machine was only feeling unwell temporarily?
14083How do you test to see whether the machine has come up again?
14084
14085You jump to the server buffer (@pxref{Server Buffer}) and poke it
14086with the following commands:
14087
14088@table @kbd
14089
14090@item O
14091@kindex O (Server)
14092@findex gnus-server-open-server
14093Try to establish connection to the server on the current line
14094(@code{gnus-server-open-server}).
14095
14096@item C
14097@kindex C (Server)
14098@findex gnus-server-close-server
14099Close the connection (if any) to the server
14100(@code{gnus-server-close-server}).
14101
14102@item D
14103@kindex D (Server)
14104@findex gnus-server-deny-server
14105Mark the current server as unreachable
14106(@code{gnus-server-deny-server}).
14107
14108@item M-o
14109@kindex M-o (Server)
14110@findex gnus-server-open-all-servers
14111Open the connections to all servers in the buffer
14112(@code{gnus-server-open-all-servers}).
14113
14114@item M-c
14115@kindex M-c (Server)
14116@findex gnus-server-close-all-servers
14117Close the connections to all servers in the buffer
14118(@code{gnus-server-close-all-servers}).
14119
14120@item R
14121@kindex R (Server)
14122@findex gnus-server-remove-denials
14123Remove all marks to whether Gnus was denied connection from any servers
14124(@code{gnus-server-remove-denials}).
14125
8ccbef23
G
14126@item c
14127@kindex c (Server)
14128@findex gnus-server-copy-server
14129Copy a server and give it a new name
14130(@code{gnus-server-copy-server}). This can be useful if you have a
14131complex method definition, and want to use the same definition towards
14132a different (physical) server.
14133
4009494e
GM
14134@item L
14135@kindex L (Server)
14136@findex gnus-server-offline-server
14137Set server status to offline (@code{gnus-server-offline-server}).
14138
14139@end table
14140
14141
14142@node Getting News
14143@section Getting News
14144@cindex reading news
14145@cindex news back ends
14146
14147A newsreader is normally used for reading news. Gnus currently provides
14148only two methods of getting news---it can read from an @acronym{NNTP} server,
14149or it can read from a local spool.
14150
14151@menu
14152* NNTP:: Reading news from an @acronym{NNTP} server.
14153* News Spool:: Reading news from the local spool.
14154@end menu
14155
14156
14157@node NNTP
14158@subsection NNTP
14159@cindex nntp
14160
14161Subscribing to a foreign group from an @acronym{NNTP} server is rather easy.
14162You just specify @code{nntp} as method and the address of the @acronym{NNTP}
14163server as the, uhm, address.
14164
14165If the @acronym{NNTP} server is located at a non-standard port, setting the
14166third element of the select method to this port number should allow you
14167to connect to the right port. You'll have to edit the group info for
14168that (@pxref{Foreign Groups}).
14169
14170The name of the foreign group can be the same as a native group. In
14171fact, you can subscribe to the same group from as many different servers
14172you feel like. There will be no name collisions.
14173
14174The following variables can be used to create a virtual @code{nntp}
14175server:
14176
14177@table @code
14178
14179@item nntp-server-opened-hook
14180@vindex nntp-server-opened-hook
14181@cindex @sc{mode reader}
14182@cindex authinfo
14183@cindex authentication
14184@cindex nntp authentication
14185@findex nntp-send-authinfo
14186@findex nntp-send-mode-reader
14187is run after a connection has been made. It can be used to send
14188commands to the @acronym{NNTP} server after it has been contacted. By
14189default it sends the command @code{MODE READER} to the server with the
14190@code{nntp-send-mode-reader} function. This function should always be
14191present in this hook.
14192
14193@item nntp-authinfo-function
14194@vindex nntp-authinfo-function
14195@findex nntp-send-authinfo
14196@vindex nntp-authinfo-file
14197This function will be used to send @samp{AUTHINFO} to the @acronym{NNTP}
14198server. The default function is @code{nntp-send-authinfo}, which looks
14199through your @file{~/.authinfo} (or whatever you've set the
14200@code{nntp-authinfo-file} variable to) for applicable entries. If none
14201are found, it will prompt you for a login name and a password. The
14202format of the @file{~/.authinfo} file is (almost) the same as the
14203@code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp}
14204manual page, but here are the salient facts:
14205
14206@enumerate
14207@item
14208The file contains one or more line, each of which define one server.
14209
14210@item
14211Each line may contain an arbitrary number of token/value pairs.
14212
14213The valid tokens include @samp{machine}, @samp{login}, @samp{password},
14214@samp{default}. In addition Gnus introduces two new tokens, not present
14215in the original @file{.netrc}/@code{ftp} syntax, namely @samp{port} and
14216@samp{force}. (This is the only way the @file{.authinfo} file format
14217deviates from the @file{.netrc} file format.) @samp{port} is used to
14218indicate what port on the server the credentials apply to and
14219@samp{force} is explained below.
14220
14221@end enumerate
14222
14223Here's an example file:
14224
14225@example
14226machine news.uio.no login larsi password geheimnis
14227machine nntp.ifi.uio.no login larsi force yes
14228@end example
14229
14230The token/value pairs may appear in any order; @samp{machine} doesn't
14231have to be first, for instance.
14232
14233In this example, both login name and password have been supplied for the
14234former server, while the latter has only the login name listed, and the
14235user will be prompted for the password. The latter also has the
14236@samp{force} tag, which means that the authinfo will be sent to the
14237@var{nntp} server upon connection; the default (i.e., when there is not
14238@samp{force} tag) is to not send authinfo to the @var{nntp} server
14239until the @var{nntp} server asks for it.
14240
14241You can also add @samp{default} lines that will apply to all servers
14242that don't have matching @samp{machine} lines.
14243
14244@example
14245default force yes
14246@end example
14247
14248This will force sending @samp{AUTHINFO} commands to all servers not
14249previously mentioned.
14250
14251Remember to not leave the @file{~/.authinfo} file world-readable.
14252
14253@item nntp-server-action-alist
14254@vindex nntp-server-action-alist
14255This is a list of regexps to match on server types and actions to be
14256taken when matches are made. For instance, if you want Gnus to beep
14257every time you connect to innd, you could say something like:
14258
14259@lisp
14260(setq nntp-server-action-alist
14261 '(("innd" (ding))))
14262@end lisp
14263
14264You probably don't want to do that, though.
14265
14266The default value is
14267
14268@lisp
14269'(("nntpd 1\\.5\\.11t"
14270 (remove-hook 'nntp-server-opened-hook
14271 'nntp-send-mode-reader)))
14272@end lisp
14273
14274This ensures that Gnus doesn't send the @code{MODE READER} command to
14275nntpd 1.5.11t, since that command chokes that server, I've been told.
14276
14277@item nntp-maximum-request
14278@vindex nntp-maximum-request
14279If the @acronym{NNTP} server doesn't support @acronym{NOV} headers, this back end
14280will collect headers by sending a series of @code{head} commands. To
14281speed things up, the back end sends lots of these commands without
14282waiting for reply, and then reads all the replies. This is controlled
14283by the @code{nntp-maximum-request} variable, and is 400 by default. If
14284your network is buggy, you should set this to 1.
14285
14286@item nntp-connection-timeout
14287@vindex nntp-connection-timeout
14288If you have lots of foreign @code{nntp} groups that you connect to
14289regularly, you're sure to have problems with @acronym{NNTP} servers not
14290responding properly, or being too loaded to reply within reasonable
14291time. This is can lead to awkward problems, which can be helped
14292somewhat by setting @code{nntp-connection-timeout}. This is an integer
14293that says how many seconds the @code{nntp} back end should wait for a
14294connection before giving up. If it is @code{nil}, which is the default,
14295no timeouts are done.
14296
14297@item nntp-nov-is-evil
14298@vindex nntp-nov-is-evil
14299If the @acronym{NNTP} server does not support @acronym{NOV}, you could set this
14300variable to @code{t}, but @code{nntp} usually checks automatically whether @acronym{NOV}
14301can be used.
14302
14303@item nntp-xover-commands
14304@vindex nntp-xover-commands
14305@cindex @acronym{NOV}
14306@cindex XOVER
14307List of strings used as commands to fetch @acronym{NOV} lines from a
14308server. The default value of this variable is @code{("XOVER"
14309"XOVERVIEW")}.
14310
14311@item nntp-nov-gap
14312@vindex nntp-nov-gap
14313@code{nntp} normally sends just one big request for @acronym{NOV} lines to
14314the server. The server responds with one huge list of lines. However,
14315if you have read articles 2-5000 in the group, and only want to read
14316article 1 and 5001, that means that @code{nntp} will fetch 4999 @acronym{NOV}
14317lines that you will not need. This variable says how
14318big a gap between two consecutive articles is allowed to be before the
14319@code{XOVER} request is split into several request. Note that if your
14320network is fast, setting this variable to a really small number means
14321that fetching will probably be slower. If this variable is @code{nil},
14322@code{nntp} will never split requests. The default is 5.
14323
14324@item nntp-xref-number-is-evil
14325@vindex nntp-xref-number-is-evil
14326When Gnus refers to an article having the @code{Message-ID} that a user
14327specifies or having the @code{Message-ID} of the parent article of the
14328current one (@pxref{Finding the Parent}), Gnus sends a @code{HEAD}
14329command to the @acronym{NNTP} server to know where it is, and the server
14330returns the data containing the pairs of a group and an article number
14331in the @code{Xref} header. Gnus normally uses the article number to
14332refer to the article if the data shows that that article is in the
14333current group, while it uses the @code{Message-ID} otherwise. However,
14334some news servers, e.g., ones running Diablo, run multiple engines
14335having the same articles but article numbers are not kept synchronized
14336between them. In that case, the article number that appears in the
14337@code{Xref} header varies by which engine is chosen, so you cannot refer
14338to the parent article that is in the current group, for instance. If
14339you connect to such a server, set this variable to a non-@code{nil}
14340value, and Gnus never uses article numbers. For example:
14341
14342@lisp
14343(setq gnus-select-method
14344 '(nntp "newszilla"
14345 (nntp-address "newszilla.example.com")
14346 (nntp-xref-number-is-evil t)
14347 @dots{}))
14348@end lisp
14349
14350The default value of this server variable is @code{nil}.
14351
14352@item nntp-prepare-server-hook
14353@vindex nntp-prepare-server-hook
14354A hook run before attempting to connect to an @acronym{NNTP} server.
14355
14356@item nntp-record-commands
14357@vindex nntp-record-commands
14358If non-@code{nil}, @code{nntp} will log all commands it sends to the
14359@acronym{NNTP} server (along with a timestamp) in the @samp{*nntp-log*}
14360buffer. This is useful if you are debugging a Gnus/@acronym{NNTP} connection
14361that doesn't seem to work.
14362
14363@item nntp-open-connection-function
14364@vindex nntp-open-connection-function
14365It is possible to customize how the connection to the nntp server will
14366be opened. If you specify an @code{nntp-open-connection-function}
14367parameter, Gnus will use that function to establish the connection.
01c52d31
MB
14368Seven pre-made functions are supplied. These functions can be grouped
14369in two categories: direct connection functions (four pre-made), and
14370indirect ones (three pre-made).
4009494e
GM
14371
14372@item nntp-never-echoes-commands
14373@vindex nntp-never-echoes-commands
14374Non-@code{nil} means the nntp server never echoes commands. It is
14375reported that some nntps server doesn't echo commands. So, you may want
14376to set this to non-@code{nil} in the method for such a server setting
14377@code{nntp-open-connection-function} to @code{nntp-open-ssl-stream} for
14378example. The default value is @code{nil}. Note that the
14379@code{nntp-open-connection-functions-never-echo-commands} variable
14380overrides the @code{nil} value of this variable.
14381
14382@item nntp-open-connection-functions-never-echo-commands
14383@vindex nntp-open-connection-functions-never-echo-commands
14384List of functions that never echo commands. Add or set a function which
14385you set to @code{nntp-open-connection-function} to this list if it does
14386not echo commands. Note that a non-@code{nil} value of the
14387@code{nntp-never-echoes-commands} variable overrides this variable. The
14388default value is @code{(nntp-open-network-stream)}.
14389
14390@item nntp-prepare-post-hook
14391@vindex nntp-prepare-post-hook
14392A hook run just before posting an article. If there is no
14393@code{Message-ID} header in the article and the news server provides the
14394recommended ID, it will be added to the article before running this
14395hook. It is useful to make @code{Cancel-Lock} headers even if you
14396inhibit Gnus to add a @code{Message-ID} header, you could say:
14397
14398@lisp
14399(add-hook 'nntp-prepare-post-hook 'canlock-insert-header)
14400@end lisp
14401
14402Note that not all servers support the recommended ID. This works for
14403INN versions 2.3.0 and later, for instance.
14404
6b958814
G
14405@item nntp-server-list-active-group
14406If @code{nil}, then always use @samp{GROUP} instead of @samp{LIST
14407ACTIVE}. This is usually slower, but on misconfigured servers that
14408don't update their active files often, this can help.
14409
14410
4009494e
GM
14411@end table
14412
14413@menu
14414* Direct Functions:: Connecting directly to the server.
14415* Indirect Functions:: Connecting indirectly to the server.
14416* Common Variables:: Understood by several connection functions.
01c52d31 14417* NNTP marks:: Storing marks for @acronym{NNTP} servers.
4009494e
GM
14418@end menu
14419
14420
14421@node Direct Functions
14422@subsubsection Direct Functions
14423@cindex direct connection functions
14424
14425These functions are called direct because they open a direct connection
14426between your machine and the @acronym{NNTP} server. The behavior of these
14427functions is also affected by commonly understood variables
14428(@pxref{Common Variables}).
14429
14430@table @code
14431@findex nntp-open-network-stream
14432@item nntp-open-network-stream
14433This is the default, and simply connects to some port or other on the
14434remote system.
14435
14436@findex nntp-open-tls-stream
14437@item nntp-open-tls-stream
14438Opens a connection to a server over a @dfn{secure} channel. To use
14439this you must have @uref{http://www.gnu.org/software/gnutls/, GNUTLS}
14440installed. You then define a server as follows:
14441
14442@lisp
14443;; @r{"nntps" is port 563 and is predefined in our @file{/etc/services}}
14444;; @r{however, @samp{gnutls-cli -p} doesn't like named ports.}
14445;;
14446(nntp "snews.bar.com"
14447 (nntp-open-connection-function nntp-open-tls-stream)
83828b06 14448 (nntp-port-number 563)
4009494e
GM
14449 (nntp-address "snews.bar.com"))
14450@end lisp
14451
14452@findex nntp-open-ssl-stream
14453@item nntp-open-ssl-stream
14454Opens a connection to a server over a @dfn{secure} channel. To use
14455this you must have @uref{http://www.openssl.org, OpenSSL} or
14456@uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL, SSLeay} installed. You
14457then define a server as follows:
14458
14459@lisp
14460;; @r{"snews" is port 563 and is predefined in our @file{/etc/services}}
14461;; @r{however, @samp{openssl s_client -port} doesn't like named ports.}
14462;;
14463(nntp "snews.bar.com"
14464 (nntp-open-connection-function nntp-open-ssl-stream)
14465 (nntp-port-number 563)
14466 (nntp-address "snews.bar.com"))
14467@end lisp
14468
990e2c2f
SM
14469@findex nntp-open-netcat-stream
14470@item nntp-open-netcat-stream
31fe2b00
SM
14471Opens a connection to an @acronym{NNTP} server using the @code{netcat}
14472program. You might wonder why this function exists, since we have
14473the default @code{nntp-open-network-stream} which would do the job. (One
4009494e
GM
14474of) the reason(s) is that if you are behind a firewall but have direct
14475connections to the outside world thanks to a command wrapper like
14476@code{runsocks}, you can use it like this:
14477
14478@lisp
14479(nntp "socksified"
14480 (nntp-pre-command "runsocks")
990e2c2f 14481 (nntp-open-connection-function nntp-open-netcat-stream)
4009494e
GM
14482 (nntp-address "the.news.server"))
14483@end lisp
14484
14485With the default method, you would need to wrap your whole Emacs
14486session, which is not a good idea.
31fe2b00
SM
14487
14488@findex nntp-open-telnet-stream
14489@item nntp-open-telnet-stream
990e2c2f 14490Like @code{nntp-open-netcat-stream}, but uses @code{telnet} rather than
31fe2b00
SM
14491@code{netcat}. @code{telnet} is a bit less robust because of things
14492like line-end-conversion, but sometimes netcat is simply
14493not available. The previous example would turn into:
14494
14495@lisp
14496(nntp "socksified"
14497 (nntp-pre-command "runsocks")
14498 (nntp-open-connection-function nntp-open-telnet-stream)
14499 (nntp-address "the.news.server")
14500 (nntp-end-of-line "\n"))
14501@end lisp
4009494e
GM
14502@end table
14503
14504
14505@node Indirect Functions
14506@subsubsection Indirect Functions
14507@cindex indirect connection functions
14508
14509These functions are called indirect because they connect to an
14510intermediate host before actually connecting to the @acronym{NNTP} server.
14511All of these functions and related variables are also said to belong to
14512the ``via'' family of connection: they're all prefixed with ``via'' to make
14513things cleaner. The behavior of these functions is also affected by
14514commonly understood variables (@pxref{Common Variables}).
14515
14516@table @code
31fe2b00
SM
14517@item nntp-open-via-rlogin-and-netcat
14518@findex nntp-open-via-rlogin-and-netcat
14519Does an @samp{rlogin} on a remote system, and then uses @code{netcat} to connect
4009494e
GM
14520to the real @acronym{NNTP} server from there. This is useful for instance if
14521you need to connect to a firewall machine first.
14522
31fe2b00 14523@code{nntp-open-via-rlogin-and-netcat}-specific variables:
4009494e
GM
14524
14525@table @code
14526@item nntp-via-rlogin-command
14527@vindex nntp-via-rlogin-command
14528Command used to log in on the intermediate host. The default is
14529@samp{rsh}, but @samp{ssh} is a popular alternative.
14530
14531@item nntp-via-rlogin-command-switches
14532@vindex nntp-via-rlogin-command-switches
14533List of strings to be used as the switches to
14534@code{nntp-via-rlogin-command}. The default is @code{nil}. If you use
14535@samp{ssh} for @code{nntp-via-rlogin-command}, you may set this to
31fe2b00 14536@samp{("-C")} in order to compress all data connections.
4009494e
GM
14537@end table
14538
31fe2b00
SM
14539@item nntp-open-via-rlogin-and-telnet
14540@findex nntp-open-via-rlogin-and-telnet
14541Does essentially the same, but uses @code{telnet} instead of @samp{netcat}
01c52d31 14542to connect to the real @acronym{NNTP} server from the intermediate host.
31fe2b00 14543@code{telnet} is a bit less robust because of things like
867d4bb3 14544line-end-conversion, but sometimes @code{netcat} is simply not available.
01c52d31 14545
31fe2b00 14546@code{nntp-open-via-rlogin-and-telnet}-specific variables:
01c52d31
MB
14547
14548@table @code
31fe2b00
SM
14549@item nntp-telnet-command
14550@vindex nntp-telnet-command
01c52d31 14551Command used to connect to the real @acronym{NNTP} server from the
fbcbb58c 14552intermediate host. The default is @samp{telnet}.
01c52d31 14553
31fe2b00
SM
14554@item nntp-telnet-switches
14555@vindex nntp-telnet-switches
01c52d31 14556List of strings to be used as the switches to the
31fe2b00 14557@code{nntp-telnet-command} command. The default is @code{("-8")}.
01c52d31
MB
14558
14559@item nntp-via-rlogin-command
14560@vindex nntp-via-rlogin-command
14561Command used to log in on the intermediate host. The default is
14562@samp{rsh}, but @samp{ssh} is a popular alternative.
14563
14564@item nntp-via-rlogin-command-switches
14565@vindex nntp-via-rlogin-command-switches
14566List of strings to be used as the switches to
31fe2b00
SM
14567@code{nntp-via-rlogin-command}. If you use @samp{ssh}, you may need to set
14568this to @samp{("-t" "-e" "none")} or @samp{("-C" "-t" "-e" "none")} if
14569the telnet command requires a pseudo-tty allocation on an intermediate
14570host. The default is @code{nil}.
01c52d31
MB
14571@end table
14572
31fe2b00
SM
14573Note that you may want to change the value for @code{nntp-end-of-line}
14574to @samp{\n} (@pxref{Common Variables}).
14575
4009494e
GM
14576@item nntp-open-via-telnet-and-telnet
14577@findex nntp-open-via-telnet-and-telnet
14578Does essentially the same, but uses @samp{telnet} instead of
14579@samp{rlogin} to connect to the intermediate host.
14580
14581@code{nntp-open-via-telnet-and-telnet}-specific variables:
14582
14583@table @code
14584@item nntp-via-telnet-command
14585@vindex nntp-via-telnet-command
14586Command used to @code{telnet} the intermediate host. The default is
14587@samp{telnet}.
14588
14589@item nntp-via-telnet-switches
14590@vindex nntp-via-telnet-switches
14591List of strings to be used as the switches to the
14592@code{nntp-via-telnet-command} command. The default is @samp{("-8")}.
14593
14594@item nntp-via-user-password
14595@vindex nntp-via-user-password
14596Password to use when logging in on the intermediate host.
14597
14598@item nntp-via-envuser
14599@vindex nntp-via-envuser
14600If non-@code{nil}, the intermediate @code{telnet} session (client and
14601server both) will support the @code{ENVIRON} option and not prompt for
14602login name. This works for Solaris @code{telnet}, for instance.
14603
14604@item nntp-via-shell-prompt
14605@vindex nntp-via-shell-prompt
14606Regexp matching the shell prompt on the intermediate host. The default
14607is @samp{bash\\|\$ *\r?$\\|> *\r?}.
14608
14609@end table
14610
01c52d31
MB
14611Note that you may want to change the value for @code{nntp-end-of-line}
14612to @samp{\n} (@pxref{Common Variables}).
4009494e
GM
14613@end table
14614
14615
14616Here are some additional variables that are understood by all the above
14617functions:
14618
14619@table @code
14620
14621@item nntp-via-user-name
14622@vindex nntp-via-user-name
14623User name to use when connecting to the intermediate host.
14624
14625@item nntp-via-address
14626@vindex nntp-via-address
14627Address of the intermediate host to connect to.
14628
14629@end table
14630
14631
14632@node Common Variables
14633@subsubsection Common Variables
14634
14635The following variables affect the behavior of all, or several of the
14636pre-made connection functions. When not specified, all functions are
14637affected (the values of the following variables will be used as the
14638default if each virtual @code{nntp} server doesn't specify those server
14639variables individually).
14640
14641@table @code
14642
14643@item nntp-pre-command
14644@vindex nntp-pre-command
14645A command wrapper to use when connecting through a non native
14646connection function (all except @code{nntp-open-network-stream},
14647@code{nntp-open-tls-stream}, and @code{nntp-open-ssl-stream}). This is
14648where you would put a @samp{SOCKS} wrapper for instance.
14649
14650@item nntp-address
14651@vindex nntp-address
14652The address of the @acronym{NNTP} server.
14653
14654@item nntp-port-number
14655@vindex nntp-port-number
14656Port number to connect to the @acronym{NNTP} server. The default is
14657@samp{nntp}. If you use @acronym{NNTP} over
14658@acronym{TLS}/@acronym{SSL}, you may want to use integer ports rather
14659than named ports (i.e, use @samp{563} instead of @samp{snews} or
14660@samp{nntps}), because external @acronym{TLS}/@acronym{SSL} tools may
14661not work with named ports.
14662
14663@item nntp-end-of-line
14664@vindex nntp-end-of-line
14665String to use as end-of-line marker when talking to the @acronym{NNTP}
14666server. This is @samp{\r\n} by default, but should be @samp{\n} when
01c52d31 14667using a non native telnet connection function.
4009494e 14668
990e2c2f
SM
14669@item nntp-netcat-command
14670@vindex nntp-netcat-command
4009494e 14671Command to use when connecting to the @acronym{NNTP} server through
31fe2b00 14672@samp{netcat}. This is @emph{not} for an intermediate host. This is
4009494e 14673just for the real @acronym{NNTP} server. The default is
31fe2b00 14674@samp{nc}.
4009494e 14675
990e2c2f
SM
14676@item nntp-netcat-switches
14677@vindex nntp-netcat-switches
14678A list of switches to pass to @code{nntp-netcat-command}. The default
31fe2b00 14679is @samp{()}.
4009494e
GM
14680
14681@end table
14682
01c52d31
MB
14683@node NNTP marks
14684@subsubsection NNTP marks
14685@cindex storing NNTP marks
14686
14687Gnus stores marks (@pxref{Marking Articles}) for @acronym{NNTP}
14688servers in marks files. A marks file records what marks you have set
14689in a group and each file is specific to the corresponding server.
14690Marks files are stored in @file{~/News/marks}
14691(@code{nntp-marks-directory}) under a classic hierarchy resembling
14692that of a news server, for example marks for the group
14693@samp{gmane.discuss} on the news.gmane.org server will be stored in
14694the file @file{~/News/marks/news.gmane.org/gmane/discuss/.marks}.
14695
14696Marks files are useful because you can copy the @file{~/News/marks}
14697directory (using rsync, scp or whatever) to another Gnus installation,
14698and it will realize what articles you have read and marked. The data
14699in @file{~/News/marks} has priority over the same data in
14700@file{~/.newsrc.eld}.
14701
14702Note that marks files are very much server-specific: Gnus remembers
14703the article numbers so if you don't use the same servers on both
14704installations things are most likely to break (most @acronym{NNTP}
14705servers do not use the same article numbers as any other server).
14706However, if you use servers A, B, C on one installation and servers A,
14707D, E on the other, you can sync the marks files for A and then you'll
14708get synchronization for that server between the two installations.
14709
14710Using @acronym{NNTP} marks can possibly incur a performance penalty so
14711if Gnus feels sluggish, try setting the @code{nntp-marks-is-evil}
14712variable to @code{t}. Marks will then be stored in @file{~/.newsrc.eld}.
14713
14714Related variables:
14715
14716@table @code
14717
14718@item nntp-marks-is-evil
14719@vindex nntp-marks-is-evil
14720If non-@code{nil}, this back end will ignore any marks files. The
14721default is @code{nil}.
14722
14723@item nntp-marks-directory
14724@vindex nntp-marks-directory
14725The directory where marks for nntp groups will be stored.
14726
14727@end table
14728
4009494e
GM
14729
14730@node News Spool
14731@subsection News Spool
14732@cindex nnspool
14733@cindex news spool
14734
14735Subscribing to a foreign group from the local spool is extremely easy,
14736and might be useful, for instance, to speed up reading groups that
14737contain very big articles---@samp{alt.binaries.pictures.furniture}, for
14738instance.
14739
14740Anyway, you just specify @code{nnspool} as the method and @code{""} (or
14741anything else) as the address.
14742
14743If you have access to a local spool, you should probably use that as the
14744native select method (@pxref{Finding the News}). It is normally faster
14745than using an @code{nntp} select method, but might not be. It depends.
14746You just have to try to find out what's best at your site.
14747
14748@table @code
14749
14750@item nnspool-inews-program
14751@vindex nnspool-inews-program
14752Program used to post an article.
14753
14754@item nnspool-inews-switches
14755@vindex nnspool-inews-switches
14756Parameters given to the inews program when posting an article.
14757
14758@item nnspool-spool-directory
14759@vindex nnspool-spool-directory
14760Where @code{nnspool} looks for the articles. This is normally
14761@file{/usr/spool/news/}.
14762
14763@item nnspool-nov-directory
14764@vindex nnspool-nov-directory
14765Where @code{nnspool} will look for @acronym{NOV} files. This is normally@*
14766@file{/usr/spool/news/over.view/}.
14767
14768@item nnspool-lib-dir
14769@vindex nnspool-lib-dir
14770Where the news lib dir is (@file{/usr/lib/news/} by default).
14771
14772@item nnspool-active-file
14773@vindex nnspool-active-file
14774The name of the active file.
14775
14776@item nnspool-newsgroups-file
14777@vindex nnspool-newsgroups-file
14778The name of the group descriptions file.
14779
14780@item nnspool-history-file
14781@vindex nnspool-history-file
14782The name of the news history file.
14783
14784@item nnspool-active-times-file
14785@vindex nnspool-active-times-file
14786The name of the active date file.
14787
14788@item nnspool-nov-is-evil
14789@vindex nnspool-nov-is-evil
14790If non-@code{nil}, @code{nnspool} won't try to use any @acronym{NOV} files
14791that it finds.
14792
14793@item nnspool-sift-nov-with-sed
14794@vindex nnspool-sift-nov-with-sed
14795@cindex sed
14796If non-@code{nil}, which is the default, use @code{sed} to get the
14797relevant portion from the overview file. If @code{nil},
14798@code{nnspool} will load the entire file into a buffer and process it
14799there.
14800
14801@end table
14802
14803
229b59da
G
14804@node Using IMAP
14805@section Using IMAP
8ccbef23
G
14806@cindex imap
14807
14808The most popular mail backend is probably @code{nnimap}, which
14809provides access to @acronym{IMAP} servers. @acronym{IMAP} servers
14810store mail remotely, so the client doesn't store anything locally.
14811This means that it's a convenient choice when you're reading your mail
14812from different locations, or with different user agents.
14813
14814@menu
229b59da
G
14815* Connecting to an IMAP Server:: Getting started with @acronym{IMAP}.
14816* Customizing the IMAP Connection:: Variables for @acronym{IMAP} connection.
14817* Client-Side IMAP Splitting:: Put mail in the correct mail box.
8ccbef23
G
14818@end menu
14819
14820
229b59da
G
14821@node Connecting to an IMAP Server
14822@subsection Connecting to an IMAP Server
8ccbef23
G
14823
14824Connecting to an @acronym{IMAP} can be very easy. Type @kbd{B} in the
14825group buffer, or (if your primary interest is reading email), say
14826something like:
14827
14828@example
14829(setq gnus-select-method
14830 '(nnimap "imap.gmail.com"))
14831@end example
14832
14833You'll be prompted for a user name and password. If you grow tired of
14834that, then add the following to your @file{~/.authinfo} file:
14835
14836@example
14837machine imap.gmail.com login <username> password <password> port imap
14838@end example
14839
14840That should basically be it for most users.
14841
14842
229b59da
G
14843@node Customizing the IMAP Connection
14844@subsection Customizing the IMAP Connection
8ccbef23
G
14845
14846Here's an example method that's more complex:
14847
14848@example
14849(nnimap "imap.gmail.com"
14850 (nnimap-inbox "INBOX")
229b59da 14851 (nnimap-split-methods default)
8ccbef23 14852 (nnimap-expunge t)
6b958814 14853 (nnimap-stream ssl)
8ccbef23
G
14854 (nnir-search-engine imap)
14855 (nnimap-expunge-inbox t))
14856@end example
14857
14858@table @code
14859@item nnimap-address
14860The address of the server, like @samp{imap.gmail.com}.
14861
14862@item nnimap-server-port
14863If the server uses a non-standard port, that can be specified here. A
14864typical port would be @samp{imap} or @samp{imaps}.
14865
14866@item nnimap-stream
14867How @code{nnimap} should connect to the server. Possible values are:
14868
14869@table @code
14870@item ssl
14871This is the default, and this uses standard
14872@acronym{TLS}/@acronym{SSL} connection.
14873
14874@item network
14875Non-encrypted and unsafe straight socket connection.
14876
14877@item starttls
14878Encrypted @acronym{STARTTLS} over the normal @acronym{IMAP} port.
14879
14880@item shell
14881If you need to tunnel via other systems to connect to the server, you
14882can use this option, and customize @code{nnimap-shell-program} to be
14883what you need.
14884
14885@end table
14886
14887@item nnimap-authenticator
14888Some @acronym{IMAP} servers allow anonymous logins. In that case,
14889this should be set to @code{anonymous}.
14890
14891@item nnimap-streaming
14892Virtually all @code{IMAP} server support fast streaming of data. If
14893you have problems connecting to the server, try setting this to @code{nil}.
14894
229b59da
G
14895@item nnimap-fetch-partial-articles
14896If non-@code{nil}, fetch partial articles from the server. If set to
14897a string, then it's interpreted as a regexp, and parts that have
14898matching types will be fetched. For instance, @samp{"text/"} will
14899fetch all textual parts, while leaving the rest on the server.
14900
8ccbef23
G
14901@end table
14902
14903
229b59da
G
14904@node Client-Side IMAP Splitting
14905@subsection Client-Side IMAP Splitting
8ccbef23
G
14906
14907Many people prefer to do the sorting/splitting of mail into their mail
14908boxes on the @acronym{IMAP} server. That way they don't have to
14909download the mail they're not all that interested in.
14910
14911If you do want to do client-side mail splitting, then the following
14912variables are relevant:
14913
14914@table @code
14915@item nnimap-inbox
14916This is the @acronym{IMAP} mail box that will be scanned for new mail.
14917
14918@item nnimap-split-methods
14919Uses the same syntax as @code{nnmail-split-methods} (@pxref{Splitting
229b59da
G
14920Mail}), except the symbol @code{default}, which means that it should
14921use the value of the @code{nnmail-split-methods} variable.
8ccbef23 14922
6b958814
G
14923@item nnimap-split-fancy
14924Uses the same syntax as @code{nnmail-split-fancy}.
14925
8ccbef23
G
14926@end table
14927
14928
4009494e
GM
14929@node Getting Mail
14930@section Getting Mail
14931@cindex reading mail
14932@cindex mail
14933
14934Reading mail with a newsreader---isn't that just plain WeIrD? But of
14935course.
14936
14937@menu
14938* Mail in a Newsreader:: Important introductory notes.
14939* Getting Started Reading Mail:: A simple cookbook example.
14940* Splitting Mail:: How to create mail groups.
14941* Mail Sources:: How to tell Gnus where to get mail from.
14942* Mail Back End Variables:: Variables for customizing mail handling.
14943* Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail.
14944* Group Mail Splitting:: Use group customize to drive mail splitting.
14945* Incorporating Old Mail:: What about the old mail you have?
14946* Expiring Mail:: Getting rid of unwanted mail.
14947* Washing Mail:: Removing cruft from the mail you get.
14948* Duplicates:: Dealing with duplicated mail.
14949* Not Reading Mail:: Using mail back ends for reading other files.
14950* Choosing a Mail Back End:: Gnus can read a variety of mail formats.
14951@end menu
14952
14953
14954@node Mail in a Newsreader
14955@subsection Mail in a Newsreader
14956
14957If you are used to traditional mail readers, but have decided to switch
14958to reading mail with Gnus, you may find yourself experiencing something
14959of a culture shock.
14960
14961Gnus does not behave like traditional mail readers. If you want to make
14962it behave that way, you can, but it's an uphill battle.
14963
14964Gnus, by default, handles all its groups using the same approach. This
14965approach is very newsreaderly---you enter a group, see the new/unread
14966messages, and when you read the messages, they get marked as read, and
14967you don't see them any more. (Unless you explicitly ask for them.)
14968
14969In particular, you do not do anything explicitly to delete messages.
14970
14971Does this mean that all the messages that have been marked as read are
14972deleted? How awful!
14973
14974But, no, it means that old messages are @dfn{expired} according to some
14975scheme or other. For news messages, the expire process is controlled by
14976the news administrator; for mail, the expire process is controlled by
14977you. The expire process for mail is covered in depth in @ref{Expiring
14978Mail}.
14979
14980What many Gnus users find, after using it a while for both news and
14981mail, is that the transport mechanism has very little to do with how
14982they want to treat a message.
14983
14984Many people subscribe to several mailing lists. These are transported
14985via @acronym{SMTP}, and are therefore mail. But we might go for weeks without
14986answering, or even reading these messages very carefully. We may not
14987need to save them because if we should need to read one again, they are
14988archived somewhere else.
14989
14990Some people have local news groups which have only a handful of readers.
14991These are transported via @acronym{NNTP}, and are therefore news. But we may need
14992to read and answer a large fraction of the messages very carefully in
14993order to do our work. And there may not be an archive, so we may need
14994to save the interesting messages the same way we would personal mail.
14995
14996The important distinction turns out to be not the transport mechanism,
14997but other factors such as how interested we are in the subject matter,
14998or how easy it is to retrieve the message if we need to read it again.
14999
15000Gnus provides many options for sorting mail into ``groups'' which behave
15001like newsgroups, and for treating each group (whether mail or news)
15002differently.
15003
15004Some users never get comfortable using the Gnus (ahem) paradigm and wish
15005that Gnus should grow up and be a male, er, mail reader. It is possible
15006to whip Gnus into a more mailreaderly being, but, as said before, it's
15007not easy. People who prefer proper mail readers should try @sc{vm}
15008instead, which is an excellent, and proper, mail reader.
15009
15010I don't mean to scare anybody off, but I want to make it clear that you
15011may be required to learn a new way of thinking about messages. After
15012you've been subjected to The Gnus Way, you will come to love it. I can
15013guarantee it. (At least the guy who sold me the Emacs Subliminal
15014Brain-Washing Functions that I've put into Gnus did guarantee it. You
15015Will Be Assimilated. You Love Gnus. You Love The Gnus Mail Way.
15016You Do.)
15017
15018
15019@node Getting Started Reading Mail
15020@subsection Getting Started Reading Mail
15021
15022It's quite easy to use Gnus to read your new mail. You just plonk the
15023mail back end of your choice into @code{gnus-secondary-select-methods},
15024and things will happen automatically.
15025
15026For instance, if you want to use @code{nnml} (which is a ``one file per
15027mail'' back end), you could put the following in your @file{~/.gnus.el} file:
15028
15029@lisp
15030(setq gnus-secondary-select-methods '((nnml "")))
15031@end lisp
15032
15033Now, the next time you start Gnus, this back end will be queried for new
15034articles, and it will move all the messages in your spool file to its
15035directory, which is @file{~/Mail/} by default. The new group that will
15036be created (@samp{mail.misc}) will be subscribed, and you can read it
15037like any other group.
15038
15039You will probably want to split the mail into several groups, though:
15040
15041@lisp
15042(setq nnmail-split-methods
15043 '(("junk" "^From:.*Lars Ingebrigtsen")
15044 ("crazy" "^Subject:.*die\\|^Organization:.*flabby")
15045 ("other" "")))
15046@end lisp
15047
15048This will result in three new @code{nnml} mail groups being created:
15049@samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}. All the
15050mail that doesn't fit into the first two groups will be placed in the
15051last group.
15052
15053This should be sufficient for reading mail with Gnus. You might want to
15054give the other sections in this part of the manual a perusal, though.
15055Especially @pxref{Choosing a Mail Back End} and @pxref{Expiring Mail}.
15056
15057
15058@node Splitting Mail
15059@subsection Splitting Mail
15060@cindex splitting mail
15061@cindex mail splitting
15062@cindex mail filtering (splitting)
15063
15064@vindex nnmail-split-methods
15065The @code{nnmail-split-methods} variable says how the incoming mail is
15066to be split into groups.
15067
15068@lisp
15069(setq nnmail-split-methods
15070 '(("mail.junk" "^From:.*Lars Ingebrigtsen")
15071 ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby")
15072 ("mail.other" "")))
15073@end lisp
15074
15075This variable is a list of lists, where the first element of each of
15076these lists is the name of the mail group (they do not have to be called
15077something beginning with @samp{mail}, by the way), and the second
15078element is a regular expression used on the header of each mail to
15079determine if it belongs in this mail group. The first string may
15080contain @samp{\\1} forms, like the ones used by @code{replace-match} to
15081insert sub-expressions from the matched text. For instance:
15082
15083@lisp
15084("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com")
15085@end lisp
15086
15087@noindent
15088In that case, @code{nnmail-split-lowercase-expanded} controls whether
15089the inserted text should be made lowercase. @xref{Fancy Mail Splitting}.
15090
15091The second element can also be a function. In that case, it will be
15092called narrowed to the headers with the first element of the rule as the
15093argument. It should return a non-@code{nil} value if it thinks that the
15094mail belongs in that group.
15095
15096@cindex @samp{bogus} group
15097The last of these groups should always be a general one, and the regular
15098expression should @emph{always} be @samp{""} so that it matches any mails
15099that haven't been matched by any of the other regexps. (These rules are
15100processed from the beginning of the alist toward the end. The first rule
15101to make a match will ``win'', unless you have crossposting enabled. In
15102that case, all matching rules will ``win''.) If no rule matched, the mail
15103will end up in the @samp{bogus} group. When new groups are created by
15104splitting mail, you may want to run @code{gnus-group-find-new-groups} to
15105see the new groups. This also applies to the @samp{bogus} group.
15106
15107If you like to tinker with this yourself, you can set this variable to a
15108function of your choice. This function will be called without any
15109arguments in a buffer narrowed to the headers of an incoming mail
15110message. The function should return a list of group names that it
15111thinks should carry this mail message.
15112
11e4e7bd 15113This variable can also be a fancy split method. For the syntax,
870409d4 15114see @ref{Fancy Mail Splitting}.
a3f57c41 15115
4009494e
GM
15116Note that the mail back ends are free to maul the poor, innocent,
15117incoming headers all they want to. They all add @code{Lines} headers;
15118some add @code{X-Gnus-Group} headers; most rename the Unix mbox
15119@code{From<SPACE>} line to something else.
15120
15121@vindex nnmail-crosspost
15122The mail back ends all support cross-posting. If several regexps match,
15123the mail will be ``cross-posted'' to all those groups.
15124@code{nnmail-crosspost} says whether to use this mechanism or not. Note
15125that no articles are crossposted to the general (@samp{""}) group.
15126
15127@vindex nnmail-crosspost-link-function
15128@cindex crosspost
15129@cindex links
15130@code{nnmh} and @code{nnml} makes crossposts by creating hard links to
15131the crossposted articles. However, not all file systems support hard
15132links. If that's the case for you, set
15133@code{nnmail-crosspost-link-function} to @code{copy-file}. (This
15134variable is @code{add-name-to-file} by default.)
15135
15136@kindex M-x nnmail-split-history
15137@findex nnmail-split-history
15138If you wish to see where the previous mail split put the messages, you
15139can use the @kbd{M-x nnmail-split-history} command. If you wish to see
15140where re-spooling messages would put the messages, you can use
15141@code{gnus-summary-respool-trace} and related commands (@pxref{Mail
15142Group Commands}).
15143
15144@vindex nnmail-split-header-length-limit
15145Header lines longer than the value of
15146@code{nnmail-split-header-length-limit} are excluded from the split
15147function.
15148
15149@vindex nnmail-mail-splitting-decodes
15150@vindex nnmail-mail-splitting-charset
15151By default, splitting does not decode headers, so you can not match on
15152non-@acronym{ASCII} strings. But it is useful if you want to match
15153articles based on the raw header data. To enable it, set the
15154@code{nnmail-mail-splitting-decodes} variable to a non-@code{nil} value.
15155In addition, the value of the @code{nnmail-mail-splitting-charset}
15156variable is used for decoding non-@acronym{MIME} encoded string when
15157@code{nnmail-mail-splitting-decodes} is non-@code{nil}. The default
15158value is @code{nil} which means not to decode non-@acronym{MIME} encoded
15159string. A suitable value for you will be @code{undecided} or be the
15160charset used normally in mails you are interested in.
15161
15162@vindex nnmail-resplit-incoming
15163By default, splitting is performed on all incoming messages. If you
15164specify a @code{directory} entry for the variable @code{mail-sources}
15165(@pxref{Mail Source Specifiers}), however, then splitting does
15166@emph{not} happen by default. You can set the variable
15167@code{nnmail-resplit-incoming} to a non-@code{nil} value to make
15168splitting happen even in this case. (This variable has no effect on
15169other kinds of entries.)
15170
15171Gnus gives you all the opportunity you could possibly want for shooting
15172yourself in the foot. Let's say you create a group that will contain
15173all the mail you get from your boss. And then you accidentally
15174unsubscribe from the group. Gnus will still put all the mail from your
15175boss in the unsubscribed group, and so, when your boss mails you ``Have
15176that report ready by Monday or you're fired!'', you'll never see it and,
15177come Tuesday, you'll still believe that you're gainfully employed while
15178you really should be out collecting empty bottles to save up for next
15179month's rent money.
15180
15181
15182@node Mail Sources
15183@subsection Mail Sources
15184
15185Mail can be gotten from many different sources---the mail spool, from
15186a @acronym{POP} mail server, from a procmail directory, or from a
15187maildir, for instance.
15188
15189@menu
15190* Mail Source Specifiers:: How to specify what a mail source is.
15191* Mail Source Customization:: Some variables that influence things.
15192* Fetching Mail:: Using the mail source specifiers.
15193@end menu
15194
15195
15196@node Mail Source Specifiers
15197@subsubsection Mail Source Specifiers
15198@cindex POP
15199@cindex mail server
15200@cindex procmail
15201@cindex mail spool
15202@cindex mail source
15203
15204You tell Gnus how to fetch mail by setting @code{mail-sources}
15205(@pxref{Fetching Mail}) to a @dfn{mail source specifier}.
15206
15207Here's an example:
15208
15209@lisp
15210(pop :server "pop3.mailserver.com" :user "myname")
15211@end lisp
15212
15213As can be observed, a mail source specifier is a list where the first
15214element is a @dfn{mail source type}, followed by an arbitrary number of
15215@dfn{keywords}. Keywords that are not explicitly specified are given
15216default values.
15217
a1da1e37
MB
15218The @code{mail-sources} is global for all mail groups. You can specify
15219an additional mail source for a particular group by including the
15220@code{group} mail specifier in @code{mail-sources}, and setting a
15221@code{mail-source} group parameter (@pxref{Group Parameters}) specifying
15222a single mail source. When this is used, @code{mail-sources} is
15223typically just @code{(group)}; the @code{mail-source} parameter for a
15224group might look like this:
15225
15226@lisp
15227(mail-source . (file :path "home/user/spools/foo.spool"))
15228@end lisp
15229
15230This means that the group's (and only this group's) messages will be
15231fetched from the spool file @samp{/user/spools/foo.spool}.
15232
4009494e
GM
15233The following mail source types are available:
15234
15235@table @code
15236@item file
15237Get mail from a single file; typically from the mail spool.
15238
15239Keywords:
15240
15241@table @code
15242@item :path
15243The file name. Defaults to the value of the @env{MAIL}
15244environment variable or the value of @code{rmail-spool-directory}
15245(usually something like @file{/usr/mail/spool/user-name}).
15246
15247@item :prescript
15248@itemx :postscript
15249Script run before/after fetching mail.
15250@end table
15251
15252An example file mail source:
15253
15254@lisp
15255(file :path "/usr/spool/mail/user-name")
15256@end lisp
15257
15258Or using the default file name:
15259
15260@lisp
15261(file)
15262@end lisp
15263
15264If the mail spool file is not located on the local machine, it's best
15265to use @acronym{POP} or @acronym{IMAP} or the like to fetch the mail.
15266You can not use ange-ftp file names here---it has no way to lock the
15267mail spool while moving the mail.
15268
15269If it's impossible to set up a proper server, you can use ssh instead.
15270
15271@lisp
15272(setq mail-sources
15273 '((file :prescript "ssh host bin/getmail >%t")))
15274@end lisp
15275
15276The @samp{getmail} script would look something like the following:
15277
15278@example
15279#!/bin/sh
15280# getmail - move mail from spool to stdout
15281# flu@@iki.fi
15282
15283MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail
15284TMP=$HOME/Mail/tmp
15285rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP
15286@end example
15287
15288Alter this script to fit the @samp{movemail} and temporary
15289file you want to use.
15290
15291
15292@item directory
15293@vindex nnmail-scan-directory-mail-source-once
15294Get mail from several files in a directory. This is typically used
15295when you have procmail split the incoming mail into several files.
15296That is, there is a one-to-one correspondence between files in that
15297directory and groups, so that mail from the file @file{foo.bar.spool}
15298will be put in the group @code{foo.bar}. (You can change the suffix
15299to be used instead of @code{.spool}.) Setting
15300@code{nnmail-scan-directory-mail-source-once} to non-@code{nil} forces
15301Gnus to scan the mail source only once. This is particularly useful
15302if you want to scan mail groups at a specified level.
15303
15304@vindex nnmail-resplit-incoming
15305There is also the variable @code{nnmail-resplit-incoming}, if you set
15306that to a non-@code{nil} value, then the normal splitting process is
15307applied to all the files from the directory, @ref{Splitting Mail}.
15308
15309Keywords:
15310
15311@table @code
15312@item :path
15313The name of the directory where the files are. There is no default
15314value.
15315
15316@item :suffix
15317Only files ending with this suffix are used. The default is
15318@samp{.spool}.
15319
15320@item :predicate
15321Only files that have this predicate return non-@code{nil} are returned.
15322The default is @code{identity}. This is used as an additional
15323filter---only files that have the right suffix @emph{and} satisfy this
15324predicate are considered.
15325
15326@item :prescript
15327@itemx :postscript
15328Script run before/after fetching mail.
15329
15330@end table
15331
15332An example directory mail source:
15333
15334@lisp
15335(directory :path "/home/user-name/procmail-dir/"
15336 :suffix ".prcml")
15337@end lisp
15338
15339@item pop
15340Get mail from a @acronym{POP} server.
15341
15342Keywords:
15343
15344@table @code
15345@item :server
15346The name of the @acronym{POP} server. The default is taken from the
15347@env{MAILHOST} environment variable.
15348
15349@item :port
15350The port number of the @acronym{POP} server. This can be a number (eg,
15351@samp{:port 1234}) or a string (eg, @samp{:port "pop3"}). If it is a
15352string, it should be a service name as listed in @file{/etc/services} on
15353Unix systems. The default is @samp{"pop3"}. On some systems you might
15354need to specify it as @samp{"pop-3"} instead.
15355
15356@item :user
15357The user name to give to the @acronym{POP} server. The default is the login
15358name.
15359
15360@item :password
15361The password to give to the @acronym{POP} server. If not specified,
15362the user is prompted.
15363
15364@item :program
15365The program to use to fetch mail from the @acronym{POP} server. This
15366should be a @code{format}-like string. Here's an example:
15367
15368@example
15369fetchmail %u@@%s -P %p %t
15370@end example
15371
15372The valid format specifier characters are:
15373
15374@table @samp
15375@item t
15376The name of the file the mail is to be moved to. This must always be
15377included in this string.
15378
15379@item s
15380The name of the server.
15381
15382@item P
15383The port number of the server.
15384
15385@item u
15386The user name to use.
15387
15388@item p
15389The password to use.
15390@end table
15391
15392The values used for these specs are taken from the values you give the
15393corresponding keywords.
15394
15395@item :prescript
15396A script to be run before fetching the mail. The syntax is the same as
15397the @code{:program} keyword. This can also be a function to be run.
15398
15399@item :postscript
15400A script to be run after fetching the mail. The syntax is the same as
15401the @code{:program} keyword. This can also be a function to be run.
15402
15403@item :function
15404The function to use to fetch mail from the @acronym{POP} server. The
15405function is called with one parameter---the name of the file where the
15406mail should be moved to.
15407
15408@item :authentication
15409This can be either the symbol @code{password} or the symbol @code{apop}
15410and says what authentication scheme to use. The default is
15411@code{password}.
15412
15413@end table
15414
15415@vindex pop3-movemail
15416@vindex pop3-leave-mail-on-server
15417If the @code{:program} and @code{:function} keywords aren't specified,
15418@code{pop3-movemail} will be used. If @code{pop3-leave-mail-on-server}
15419is non-@code{nil} the mail is to be left on the @acronym{POP} server
15420after fetching when using @code{pop3-movemail}. Note that POP servers
15421maintain no state information between sessions, so what the client
15422believes is there and what is actually there may not match up. If they
15423do not, then you may get duplicate mails or the whole thing can fall
15424apart and leave you with a corrupt mailbox.
15425
15426Here are some examples for getting mail from a @acronym{POP} server.
15427Fetch from the default @acronym{POP} server, using the default user
15428name, and default fetcher:
15429
15430@lisp
15431(pop)
15432@end lisp
15433
15434Fetch from a named server with a named user and password:
15435
15436@lisp
15437(pop :server "my.pop.server"
15438 :user "user-name" :password "secret")
15439@end lisp
15440
15441Use @samp{movemail} to move the mail:
15442
15443@lisp
15444(pop :program "movemail po:%u %t %p")
15445@end lisp
15446
15447@item maildir
15448Get mail from a maildir. This is a type of mailbox that is supported by
15449at least qmail and postfix, where each file in a special directory
15450contains exactly one mail.
15451
15452Keywords:
15453
15454@table @code
15455@item :path
15456The name of the directory where the mails are stored. The default is
15457taken from the @env{MAILDIR} environment variable or
15458@file{~/Maildir/}.
15459@item :subdirs
15460The subdirectories of the Maildir. The default is
15461@samp{("new" "cur")}.
15462
15463@c If you sometimes look at your mail through a pop3 daemon before fetching
15464@c them with Gnus, you may also have to fetch your mails from the
15465@c @code{cur} directory inside the maildir, like in the first example
15466@c below.
15467
15468You can also get mails from remote hosts (because maildirs don't suffer
15469from locking problems).
15470
15471@end table
15472
15473Two example maildir mail sources:
15474
15475@lisp
15476(maildir :path "/home/user-name/Maildir/"
15477 :subdirs ("cur" "new"))
15478@end lisp
15479
15480@lisp
15481(maildir :path "/user@@remotehost.org:~/Maildir/"
15482 :subdirs ("new"))
15483@end lisp
15484
15485@item imap
15486Get mail from a @acronym{IMAP} server. If you don't want to use
15487@acronym{IMAP} as intended, as a network mail reading protocol (ie
15488with nnimap), for some reason or other, Gnus let you treat it similar
15489to a @acronym{POP} server and fetches articles from a given
229b59da 15490@acronym{IMAP} mailbox. @xref{Using IMAP}, for more information.
4009494e
GM
15491
15492Keywords:
15493
15494@table @code
15495@item :server
15496The name of the @acronym{IMAP} server. The default is taken from the
15497@env{MAILHOST} environment variable.
15498
15499@item :port
15500The port number of the @acronym{IMAP} server. The default is @samp{143}, or
15501@samp{993} for @acronym{TLS}/@acronym{SSL} connections.
15502
15503@item :user
15504The user name to give to the @acronym{IMAP} server. The default is the login
15505name.
15506
15507@item :password
15508The password to give to the @acronym{IMAP} server. If not specified, the user is
15509prompted.
15510
15511@item :stream
15512What stream to use for connecting to the server, this is one of the
15513symbols in @code{imap-stream-alist}. Right now, this means
15514@samp{gssapi}, @samp{kerberos4}, @samp{starttls}, @samp{tls},
15515@samp{ssl}, @samp{shell} or the default @samp{network}.
15516
15517@item :authentication
15518Which authenticator to use for authenticating to the server, this is
15519one of the symbols in @code{imap-authenticator-alist}. Right now,
15520this means @samp{gssapi}, @samp{kerberos4}, @samp{digest-md5},
15521@samp{cram-md5}, @samp{anonymous} or the default @samp{login}.
15522
15523@item :program
15524When using the `shell' :stream, the contents of this variable is
15525mapped into the @code{imap-shell-program} variable. This should be a
15526@code{format}-like string (or list of strings). Here's an example:
15527
15528@example
15529ssh %s imapd
15530@end example
15531
01c52d31
MB
15532Make sure nothing is interfering with the output of the program, e.g.,
15533don't forget to redirect the error output to the void. The valid format
15534specifier characters are:
4009494e
GM
15535
15536@table @samp
15537@item s
15538The name of the server.
15539
15540@item l
15541User name from @code{imap-default-user}.
15542
15543@item p
15544The port number of the server.
15545@end table
15546
15547The values used for these specs are taken from the values you give the
15548corresponding keywords.
15549
15550@item :mailbox
15551The name of the mailbox to get mail from. The default is @samp{INBOX}
d55fe5bb 15552which normally is the mailbox which receives incoming mail.
4009494e
GM
15553
15554@item :predicate
15555The predicate used to find articles to fetch. The default, @samp{UNSEEN
15556UNDELETED}, is probably the best choice for most people, but if you
15557sometimes peek in your mailbox with a @acronym{IMAP} client and mark some
15558articles as read (or; SEEN) you might want to set this to @samp{1:*}.
15559Then all articles in the mailbox is fetched, no matter what. For a
15560complete list of predicates, see RFC 2060 section 6.4.4.
15561
15562@item :fetchflag
15563How to flag fetched articles on the server, the default @samp{\Deleted}
15564will mark them as deleted, an alternative would be @samp{\Seen} which
15565would simply mark them as read. These are the two most likely choices,
15566but more flags are defined in RFC 2060 section 2.3.2.
15567
15568@item :dontexpunge
15569If non-@code{nil}, don't remove all articles marked as deleted in the
15570mailbox after finishing the fetch.
15571
15572@end table
15573
15574An example @acronym{IMAP} mail source:
15575
15576@lisp
15577(imap :server "mail.mycorp.com"
15578 :stream kerberos4
15579 :fetchflag "\\Seen")
15580@end lisp
15581
a1da1e37
MB
15582@item group
15583Get the actual mail source from the @code{mail-source} group parameter,
15584@xref{Group Parameters}.
15585
4009494e
GM
15586@end table
15587
15588@table @dfn
15589@item Common Keywords
15590Common keywords can be used in any type of mail source.
15591
15592Keywords:
15593
15594@table @code
15595@item :plugged
15596If non-@code{nil}, fetch the mail even when Gnus is unplugged. If you
15597use directory source to get mail, you can specify it as in this
15598example:
15599
15600@lisp
15601(setq mail-sources
15602 '((directory :path "/home/pavel/.Spool/"
15603 :suffix ""
15604 :plugged t)))
15605@end lisp
15606
15607Gnus will then fetch your mail even when you are unplugged. This is
15608useful when you use local mail and news.
15609
15610@end table
15611@end table
15612
15613@subsubsection Function Interface
15614
15615Some of the above keywords specify a Lisp function to be executed.
15616For each keyword @code{:foo}, the Lisp variable @code{foo} is bound to
15617the value of the keyword while the function is executing. For example,
15618consider the following mail-source setting:
15619
15620@lisp
15621(setq mail-sources '((pop :user "jrl"
15622 :server "pophost" :function fetchfunc)))
15623@end lisp
15624
15625While the function @code{fetchfunc} is executing, the symbol @code{user}
15626is bound to @code{"jrl"}, and the symbol @code{server} is bound to
15627@code{"pophost"}. The symbols @code{port}, @code{password},
15628@code{program}, @code{prescript}, @code{postscript}, @code{function},
15629and @code{authentication} are also bound (to their default values).
15630
15631See above for a list of keywords for each type of mail source.
15632
15633
15634@node Mail Source Customization
15635@subsubsection Mail Source Customization
15636
15637The following is a list of variables that influence how the mail is
15638fetched. You would normally not need to set or change any of these
15639variables.
15640
15641@table @code
15642@item mail-source-crash-box
15643@vindex mail-source-crash-box
15644File where mail will be stored while processing it. The default is@*
15645@file{~/.emacs-mail-crash-box}.
15646
37a68866 15647@cindex Incoming*
4009494e
GM
15648@item mail-source-delete-incoming
15649@vindex mail-source-delete-incoming
15650If non-@code{nil}, delete incoming files after handling them. If
15651@code{t}, delete the files immediately, if @code{nil}, never delete any
15652files. If a positive number, delete files older than number of days
37a68866
MB
15653(the deletion will only happen when receiving new mail). You may also
15654set @code{mail-source-delete-incoming} to @code{nil} and call
4009494e 15655@code{mail-source-delete-old-incoming} from a hook or interactively.
2b968687
MB
15656@code{mail-source-delete-incoming} defaults to @code{10} in alpha Gnusae
15657and @code{2} in released Gnusae. @xref{Gnus Development}.
4009494e
GM
15658
15659@item mail-source-delete-old-incoming-confirm
15660@vindex mail-source-delete-old-incoming-confirm
15661If non-@code{nil}, ask for confirmation before deleting old incoming
15662files. This variable only applies when
15663@code{mail-source-delete-incoming} is a positive number.
15664
15665@item mail-source-ignore-errors
15666@vindex mail-source-ignore-errors
15667If non-@code{nil}, ignore errors when reading mail from a mail source.
15668
15669@item mail-source-directory
15670@vindex mail-source-directory
15671Directory where incoming mail source files (if any) will be stored. The
15672default is @file{~/Mail/}. At present, the only thing this is used for
15673is to say where the incoming files will be stored if the variable
15674@code{mail-source-delete-incoming} is @code{nil} or a number.
15675
15676@item mail-source-incoming-file-prefix
15677@vindex mail-source-incoming-file-prefix
15678Prefix for file name for storing incoming mail. The default is
15679@file{Incoming}, in which case files will end up with names like
15680@file{Incoming30630D_} or @file{Incoming298602ZD}. This is really only
15681relevant if @code{mail-source-delete-incoming} is @code{nil} or a
15682number.
15683
15684@item mail-source-default-file-modes
15685@vindex mail-source-default-file-modes
15686All new mail files will get this file mode. The default is 384.
15687
15688@item mail-source-movemail-program
15689@vindex mail-source-movemail-program
15690If non-@code{nil}, name of program for fetching new mail. If
15691@code{nil}, @code{movemail} in @var{exec-directory}.
15692
15693@end table
15694
15695
15696@node Fetching Mail
15697@subsubsection Fetching Mail
15698
15699@vindex mail-sources
4009494e
GM
15700The way to actually tell Gnus where to get new mail from is to set
15701@code{mail-sources} to a list of mail source specifiers
15702(@pxref{Mail Source Specifiers}).
15703
b890d447
MB
15704If this variable is @code{nil}, the mail back ends will never attempt to
15705fetch mail by themselves.
4009494e
GM
15706
15707If you want to fetch mail both from your local spool as well as a
15708@acronym{POP} mail server, you'd say something like:
15709
15710@lisp
15711(setq mail-sources
15712 '((file)
15713 (pop :server "pop3.mail.server"
15714 :password "secret")))
15715@end lisp
15716
15717Or, if you don't want to use any of the keyword defaults:
15718
15719@lisp
15720(setq mail-sources
15721 '((file :path "/var/spool/mail/user-name")
15722 (pop :server "pop3.mail.server"
15723 :user "user-name"
15724 :port "pop3"
15725 :password "secret")))
15726@end lisp
15727
15728
15729When you use a mail back end, Gnus will slurp all your mail from your
15730inbox and plonk it down in your home directory. Gnus doesn't move any
15731mail if you're not using a mail back end---you have to do a lot of magic
15732invocations first. At the time when you have finished drawing the
15733pentagram, lightened the candles, and sacrificed the goat, you really
15734shouldn't be too surprised when Gnus moves your mail.
15735
15736
15737
15738@node Mail Back End Variables
15739@subsection Mail Back End Variables
15740
15741These variables are (for the most part) pertinent to all the various
15742mail back ends.
15743
15744@table @code
15745@vindex nnmail-read-incoming-hook
15746@item nnmail-read-incoming-hook
15747The mail back ends all call this hook after reading new mail. You can
15748use this hook to notify any mail watch programs, if you want to.
15749
15750@vindex nnmail-split-hook
15751@item nnmail-split-hook
15752@findex gnus-article-decode-encoded-words
15753@cindex RFC 1522 decoding
15754@cindex RFC 2047 decoding
15755Hook run in the buffer where the mail headers of each message is kept
15756just before the splitting based on these headers is done. The hook is
15757free to modify the buffer contents in any way it sees fit---the buffer
15758is discarded after the splitting has been done, and no changes performed
15759in the buffer will show up in any files.
15760@code{gnus-article-decode-encoded-words} is one likely function to add
15761to this hook.
15762
15763@vindex nnmail-pre-get-new-mail-hook
15764@vindex nnmail-post-get-new-mail-hook
15765@item nnmail-pre-get-new-mail-hook
15766@itemx nnmail-post-get-new-mail-hook
15767These are two useful hooks executed when treating new incoming
15768mail---@code{nnmail-pre-get-new-mail-hook} (is called just before
15769starting to handle the new mail) and
15770@code{nnmail-post-get-new-mail-hook} (is called when the mail handling
15771is done). Here's and example of using these two hooks to change the
15772default file modes the new mail files get:
15773
15774@lisp
15775(add-hook 'nnmail-pre-get-new-mail-hook
15776 (lambda () (set-default-file-modes 511)))
15777
15778(add-hook 'nnmail-post-get-new-mail-hook
15779 (lambda () (set-default-file-modes 551)))
15780@end lisp
15781
15782@item nnmail-use-long-file-names
15783@vindex nnmail-use-long-file-names
15784If non-@code{nil}, the mail back ends will use long file and directory
15785names. Groups like @samp{mail.misc} will end up in directories
15786(assuming use of @code{nnml} back end) or files (assuming use of
15787@code{nnfolder} back end) like @file{mail.misc}. If it is @code{nil},
15788the same group will end up in @file{mail/misc}.
15789
15790@item nnmail-delete-file-function
15791@vindex nnmail-delete-file-function
15792@findex delete-file
15793Function called to delete files. It is @code{delete-file} by default.
15794
15795@item nnmail-cache-accepted-message-ids
15796@vindex nnmail-cache-accepted-message-ids
15797If non-@code{nil}, put the @code{Message-ID}s of articles imported into
15798the back end (via @code{Gcc}, for instance) into the mail duplication
15799discovery cache. The default is @code{nil}.
15800
15801@item nnmail-cache-ignore-groups
15802@vindex nnmail-cache-ignore-groups
15803This can be a regular expression or a list of regular expressions.
15804Group names that match any of the regular expressions will never be
15805recorded in the @code{Message-ID} cache.
15806
15807This can be useful, for example, when using Fancy Splitting
15808(@pxref{Fancy Mail Splitting}) together with the function
15809@code{nnmail-split-fancy-with-parent}.
15810
15811@end table
15812
15813
15814@node Fancy Mail Splitting
15815@subsection Fancy Mail Splitting
15816@cindex mail splitting
15817@cindex fancy mail splitting
15818
15819@vindex nnmail-split-fancy
15820@findex nnmail-split-fancy
15821If the rather simple, standard method for specifying how to split mail
15822doesn't allow you to do what you want, you can set
15823@code{nnmail-split-methods} to @code{nnmail-split-fancy}. Then you can
15824play with the @code{nnmail-split-fancy} variable.
15825
15826Let's look at an example value of this variable first:
15827
15828@lisp
15829;; @r{Messages from the mailer daemon are not crossposted to any of}
15830;; @r{the ordinary groups. Warnings are put in a separate group}
15831;; @r{from real errors.}
15832(| ("from" mail (| ("subject" "warn.*" "mail.warning")
15833 "mail.misc"))
15834 ;; @r{Non-error messages are crossposted to all relevant}
15835 ;; @r{groups, but we don't crosspost between the group for the}
15836 ;; @r{(ding) list and the group for other (ding) related mail.}
15837 (& (| (any "ding@@ifi\\.uio\\.no" "ding.list")
15838 ("subject" "ding" "ding.misc"))
15839 ;; @r{Other mailing lists@dots{}}
15840 (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list")
15841 (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list")
15842 ;; @r{Both lists below have the same suffix, so prevent}
15843 ;; @r{cross-posting to mkpkg.list of messages posted only to}
15844 ;; @r{the bugs- list, but allow cross-posting when the}
15845 ;; @r{message was really cross-posted.}
15846 (any "bugs-mypackage@@somewhere" "mypkg.bugs")
15847 (any "mypackage@@somewhere" - "bugs-mypackage" "mypkg.list")
15848 ;; @r{People@dots{}}
15849 (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen"))
15850 ;; @r{Unmatched mail goes to the catch all group.}
15851 "misc.misc")
15852@end lisp
15853
15854This variable has the format of a @dfn{split}. A split is a
15855(possibly) recursive structure where each split may contain other
15856splits. Here are the possible split syntaxes:
15857
15858@table @code
15859
15860@item group
15861If the split is a string, that will be taken as a group name. Normal
15862regexp match expansion will be done. See below for examples.
15863
15864@c Don't fold this line.
15865@item (@var{field} @var{value} [- @var{restrict} [@dots{}] ] @var{split} [@var{invert-partial}])
15866The split can be a list containing at least three elements. If the
15867first element @var{field} (a regexp matching a header) contains
15868@var{value} (also a regexp) then store the message as specified by
15869@var{split}.
15870
15871If @var{restrict} (yet another regexp) matches some string after
15872@var{field} and before the end of the matched @var{value}, the
15873@var{split} is ignored. If none of the @var{restrict} clauses match,
15874@var{split} is processed.
15875
15876The last element @var{invert-partial} is optional. If it is
15877non-@code{nil}, the match-partial-words behavior controlled by the
15878variable @code{nnmail-split-fancy-match-partial-words} (see below) is
15879be inverted. (New in Gnus 5.10.7)
15880
15881@item (| @var{split} @dots{})
15882If the split is a list, and the first element is @code{|} (vertical
15883bar), then process each @var{split} until one of them matches. A
15884@var{split} is said to match if it will cause the mail message to be
15885stored in one or more groups.
15886
15887@item (& @var{split} @dots{})
15888If the split is a list, and the first element is @code{&}, then
15889process all @var{split}s in the list.
15890
15891@item junk
15892If the split is the symbol @code{junk}, then don't save (i.e., delete)
15893this message. Use with extreme caution.
15894
15895@item (: @var{function} @var{arg1} @var{arg2} @dots{})
15896If the split is a list, and the first element is @samp{:}, then the
15897second element will be called as a function with @var{args} given as
15898arguments. The function should return a @var{split}.
15899
15900@cindex body split
15901For instance, the following function could be used to split based on the
15902body of the messages:
15903
15904@lisp
15905(defun split-on-body ()
15906 (save-excursion
15907 (save-restriction
15908 (widen)
15909 (goto-char (point-min))
15910 (when (re-search-forward "Some.*string" nil t)
15911 "string.group"))))
15912@end lisp
15913
b890d447
MB
15914The buffer is narrowed to the header of the message in question when
15915@var{function} is run. That's why @code{(widen)} needs to be called
15916after @code{save-excursion} and @code{save-restriction} in the example
23f87bed 15917above. Also note that with the nnimap backend, message bodies will
4009494e
GM
15918not be downloaded by default. You need to set
15919@code{nnimap-split-download-body} to @code{t} to do that
229b59da 15920(@pxref{Client-Side IMAP Splitting}).
4009494e
GM
15921
15922@item (! @var{func} @var{split})
15923If the split is a list, and the first element is @code{!}, then
15924@var{split} will be processed, and @var{func} will be called as a
15925function with the result of @var{split} as argument. @var{func}
15926should return a split.
15927
15928@item nil
15929If the split is @code{nil}, it is ignored.
15930
15931@end table
15932
15933In these splits, @var{field} must match a complete field name.
15934
15935Normally, @var{value} in these splits must match a complete @emph{word}
15936according to the fundamental mode syntax table. In other words, all
15937@var{value}'s will be implicitly surrounded by @code{\<...\>} markers,
15938which are word delimiters. Therefore, if you use the following split,
15939for example,
15940
15941@example
15942(any "joe" "joemail")
15943@end example
15944
15945@noindent
15946messages sent from @samp{joedavis@@foo.org} will normally not be filed
15947in @samp{joemail}. If you want to alter this behavior, you can use any
15948of the following three ways:
15949
15950@enumerate
15951@item
15952@vindex nnmail-split-fancy-match-partial-words
15953You can set the @code{nnmail-split-fancy-match-partial-words} variable
15954to non-@code{nil} in order to ignore word boundaries and instead the
15955match becomes more like a grep. This variable controls whether partial
15956words are matched during fancy splitting. The default value is
15957@code{nil}.
15958
15959Note that it influences all @var{value}'s in your split rules.
15960
15961@item
15962@var{value} beginning with @code{.*} ignores word boundaries in front of
15963a word. Similarly, if @var{value} ends with @code{.*}, word boundaries
15964in the rear of a word will be ignored. For example, the @var{value}
15965@code{"@@example\\.com"} does not match @samp{foo@@example.com} but
15966@code{".*@@example\\.com"} does.
15967
15968@item
15969You can set the @var{invert-partial} flag in your split rules of the
15970@samp{(@var{field} @var{value} @dots{})} types, aforementioned in this
15971section. If the flag is set, word boundaries on both sides of a word
15972are ignored even if @code{nnmail-split-fancy-match-partial-words} is
15973@code{nil}. Contrarily, if the flag is set, word boundaries are not
15974ignored even if @code{nnmail-split-fancy-match-partial-words} is
15975non-@code{nil}. (New in Gnus 5.10.7)
15976@end enumerate
15977
15978@vindex nnmail-split-abbrev-alist
15979@var{field} and @var{value} can also be Lisp symbols, in that case
15980they are expanded as specified by the variable
15981@code{nnmail-split-abbrev-alist}. This is an alist of cons cells,
15982where the @sc{car} of a cell contains the key, and the @sc{cdr}
15983contains the associated value. Predefined entries in
15984@code{nnmail-split-abbrev-alist} include:
15985
15986@table @code
15987@item from
15988Matches the @samp{From}, @samp{Sender} and @samp{Resent-From} fields.
15989@item to
15990Matches the @samp{To}, @samp{Cc}, @samp{Apparently-To},
15991@samp{Resent-To} and @samp{Resent-Cc} fields.
15992@item any
15993Is the union of the @code{from} and @code{to} entries.
15994@end table
15995
15996@vindex nnmail-split-fancy-syntax-table
15997@code{nnmail-split-fancy-syntax-table} is the syntax table in effect
15998when all this splitting is performed.
15999
16000If you want to have Gnus create groups dynamically based on some
16001information in the headers (i.e., do @code{replace-match}-like
16002substitutions in the group names), you can say things like:
16003
16004@example
16005(any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1")
16006@end example
16007
16008In this example, messages sent to @samp{debian-foo@@lists.debian.org}
16009will be filed in @samp{mail.debian.foo}.
16010
16011If the string contains the element @samp{\&}, then the previously
16012matched string will be substituted. Similarly, the elements @samp{\\1}
16013up to @samp{\\9} will be substituted with the text matched by the
16014groupings 1 through 9.
16015
16016@vindex nnmail-split-lowercase-expanded
16017Where @code{nnmail-split-lowercase-expanded} controls whether the
16018lowercase of the matched string should be used for the substitution.
16019Setting it as non-@code{nil} is useful to avoid the creation of multiple
16020groups when users send to an address using different case
16021(i.e. mailing-list@@domain vs Mailing-List@@Domain). The default value
16022is @code{t}.
16023
16024@findex nnmail-split-fancy-with-parent
16025@code{nnmail-split-fancy-with-parent} is a function which allows you to
16026split followups into the same groups their parents are in. Sometimes
16027you can't make splitting rules for all your mail. For example, your
16028boss might send you personal mail regarding different projects you are
16029working on, and as you can't tell your boss to put a distinguishing
16030string into the subject line, you have to resort to manually moving the
16031messages into the right group. With this function, you only have to do
16032it once per thread.
16033
16034To use this feature, you have to set @code{nnmail-treat-duplicates}
16035and @code{nnmail-cache-accepted-message-ids} to a non-@code{nil}
16036value. And then you can include @code{nnmail-split-fancy-with-parent}
16037using the colon feature, like so:
16038@lisp
16039(setq nnmail-treat-duplicates 'warn ; @r{or @code{delete}}
16040 nnmail-cache-accepted-message-ids t
16041 nnmail-split-fancy
16042 '(| (: nnmail-split-fancy-with-parent)
16043 ;; @r{other splits go here}
16044 ))
16045@end lisp
16046
16047This feature works as follows: when @code{nnmail-treat-duplicates} is
16048non-@code{nil}, Gnus records the message id of every message it sees
16049in the file specified by the variable
16050@code{nnmail-message-id-cache-file}, together with the group it is in
16051(the group is omitted for non-mail messages). When mail splitting is
16052invoked, the function @code{nnmail-split-fancy-with-parent} then looks
16053at the References (and In-Reply-To) header of each message to split
16054and searches the file specified by @code{nnmail-message-id-cache-file}
16055for the message ids. When it has found a parent, it returns the
16056corresponding group name unless the group name matches the regexp
16057@code{nnmail-split-fancy-with-parent-ignore-groups}. It is
16058recommended that you set @code{nnmail-message-id-cache-length} to a
16059somewhat higher number than the default so that the message ids are
16060still in the cache. (A value of 5000 appears to create a file some
16061300 kBytes in size.)
16062@vindex nnmail-cache-accepted-message-ids
16063When @code{nnmail-cache-accepted-message-ids} is non-@code{nil}, Gnus
16064also records the message ids of moved articles, so that the followup
16065messages goes into the new group.
16066
16067Also see the variable @code{nnmail-cache-ignore-groups} if you don't
16068want certain groups to be recorded in the cache. For example, if all
16069outgoing messages are written to an ``outgoing'' group, you could set
16070@code{nnmail-cache-ignore-groups} to match that group name.
16071Otherwise, answers to all your messages would end up in the
16072``outgoing'' group.
16073
16074
16075@node Group Mail Splitting
16076@subsection Group Mail Splitting
16077@cindex mail splitting
16078@cindex group mail splitting
16079
16080@findex gnus-group-split
16081If you subscribe to dozens of mailing lists but you don't want to
16082maintain mail splitting rules manually, group mail splitting is for you.
16083You just have to set @code{to-list} and/or @code{to-address} in group
16084parameters or group customization and set @code{nnmail-split-methods} to
16085@code{gnus-group-split}. This splitting function will scan all groups
16086for those parameters and split mail accordingly, i.e., messages posted
16087from or to the addresses specified in the parameters @code{to-list} or
16088@code{to-address} of a mail group will be stored in that group.
16089
16090Sometimes, mailing lists have multiple addresses, and you may want mail
16091splitting to recognize them all: just set the @code{extra-aliases} group
16092parameter to the list of additional addresses and it's done. If you'd
16093rather use a regular expression, set @code{split-regexp}.
16094
16095All these parameters in a group will be used to create an
16096@code{nnmail-split-fancy} split, in which the @var{field} is @samp{any},
16097the @var{value} is a single regular expression that matches
16098@code{to-list}, @code{to-address}, all of @code{extra-aliases} and all
16099matches of @code{split-regexp}, and the @var{split} is the name of the
16100group. @var{restrict}s are also supported: just set the
16101@code{split-exclude} parameter to a list of regular expressions.
16102
16103If you can't get the right split to be generated using all these
16104parameters, or you just need something fancier, you can set the
16105parameter @code{split-spec} to an @code{nnmail-split-fancy} split. In
16106this case, all other aforementioned parameters will be ignored by
16107@code{gnus-group-split}. In particular, @code{split-spec} may be set to
16108@code{nil}, in which case the group will be ignored by
16109@code{gnus-group-split}.
16110
16111@vindex gnus-group-split-default-catch-all-group
16112@code{gnus-group-split} will do cross-posting on all groups that match,
16113by defining a single @code{&} fancy split containing one split for each
16114group. If a message doesn't match any split, it will be stored in the
16115group named in @code{gnus-group-split-default-catch-all-group}, unless
16116some group has @code{split-spec} set to @code{catch-all}, in which case
16117that group is used as the catch-all group. Even though this variable is
16118often used just to name a group, it may also be set to an arbitrarily
16119complex fancy split (after all, a group name is a fancy split), and this
16120may be useful to split mail that doesn't go to any mailing list to
16121personal mail folders. Note that this fancy split is added as the last
16122element of a @code{|} split list that also contains a @code{&} split
16123with the rules extracted from group parameters.
16124
16125It's time for an example. Assume the following group parameters have
16126been defined:
16127
16128@example
16129nnml:mail.bar:
16130((to-address . "bar@@femail.com")
16131 (split-regexp . ".*@@femail\\.com"))
16132nnml:mail.foo:
16133((to-list . "foo@@nowhere.gov")
16134 (extra-aliases "foo@@localhost" "foo-redist@@home")
16135 (split-exclude "bugs-foo" "rambling-foo")
16136 (admin-address . "foo-request@@nowhere.gov"))
16137nnml:mail.others:
16138((split-spec . catch-all))
16139@end example
16140
16141Setting @code{nnmail-split-methods} to @code{gnus-group-split} will
16142behave as if @code{nnmail-split-fancy} had been selected and variable
16143@code{nnmail-split-fancy} had been set as follows:
16144
16145@lisp
16146(| (& (any "\\(bar@@femail\\.com\\|.*@@femail\\.com\\)" "mail.bar")
16147 (any "\\(foo@@nowhere\\.gov\\|foo@@localhost\\|foo-redist@@home\\)"
16148 - "bugs-foo" - "rambling-foo" "mail.foo"))
16149 "mail.others")
16150@end lisp
16151
16152@findex gnus-group-split-fancy
16153If you'd rather not use group splitting for all your mail groups, you
16154may use it for only some of them, by using @code{nnmail-split-fancy}
16155splits like this:
16156
16157@lisp
16158(: gnus-group-split-fancy @var{groups} @var{no-crosspost} @var{catch-all})
16159@end lisp
16160
16161@var{groups} may be a regular expression or a list of group names whose
16162parameters will be scanned to generate the output split.
16163@var{no-crosspost} can be used to disable cross-posting; in this case, a
16164single @code{|} split will be output. @var{catch-all} is the fall back
16165fancy split, used like @code{gnus-group-split-default-catch-all-group}.
16166If @var{catch-all} is @code{nil}, or if @code{split-regexp} matches the
16167empty string in any selected group, no catch-all split will be issued.
16168Otherwise, if some group has @code{split-spec} set to @code{catch-all},
16169this group will override the value of the @var{catch-all} argument.
16170
16171@findex gnus-group-split-setup
16172Unfortunately, scanning all groups and their parameters can be quite
16173slow, especially considering that it has to be done for every message.
16174But don't despair! The function @code{gnus-group-split-setup} can be
16175used to enable @code{gnus-group-split} in a much more efficient way. It
16176sets @code{nnmail-split-methods} to @code{nnmail-split-fancy} and sets
16177@code{nnmail-split-fancy} to the split produced by
16178@code{gnus-group-split-fancy}. Thus, the group parameters are only
16179scanned once, no matter how many messages are split.
16180
16181@findex gnus-group-split-update
16182However, if you change group parameters, you'd have to update
16183@code{nnmail-split-fancy} manually. You can do it by running
16184@code{gnus-group-split-update}. If you'd rather have it updated
16185automatically, just tell @code{gnus-group-split-setup} to do it for
16186you. For example, add to your @file{~/.gnus.el}:
16187
16188@lisp
16189(gnus-group-split-setup @var{auto-update} @var{catch-all})
16190@end lisp
16191
16192If @var{auto-update} is non-@code{nil}, @code{gnus-group-split-update}
16193will be added to @code{nnmail-pre-get-new-mail-hook}, so you won't ever
16194have to worry about updating @code{nnmail-split-fancy} again. If you
16195don't omit @var{catch-all} (it's optional, equivalent to @code{nil}),
16196@code{gnus-group-split-default-catch-all-group} will be set to its
16197value.
16198
16199@vindex gnus-group-split-updated-hook
16200Because you may want to change @code{nnmail-split-fancy} after it is set
16201by @code{gnus-group-split-update}, this function will run
16202@code{gnus-group-split-updated-hook} just before finishing.
16203
16204@node Incorporating Old Mail
16205@subsection Incorporating Old Mail
16206@cindex incorporating old mail
16207@cindex import old mail
16208
16209Most people have lots of old mail stored in various file formats. If
16210you have set up Gnus to read mail using one of the spiffy Gnus mail
16211back ends, you'll probably wish to have that old mail incorporated into
16212your mail groups.
16213
16214Doing so can be quite easy.
16215
16216To take an example: You're reading mail using @code{nnml}
16217(@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a
16218satisfactory value (@pxref{Splitting Mail}). You have an old Unix mbox
16219file filled with important, but old, mail. You want to move it into
16220your @code{nnml} groups.
16221
16222Here's how:
16223
16224@enumerate
16225@item
16226Go to the group buffer.
16227
16228@item
16229Type @kbd{G f} and give the file name to the mbox file when prompted to create an
16230@code{nndoc} group from the mbox file (@pxref{Foreign Groups}).
16231
16232@item
16233Type @kbd{SPACE} to enter the newly created group.
16234
16235@item
16236Type @kbd{M P b} to process-mark all articles in this group's buffer
16237(@pxref{Setting Process Marks}).
16238
16239@item
16240Type @kbd{B r} to respool all the process-marked articles, and answer
16241@samp{nnml} when prompted (@pxref{Mail Group Commands}).
16242@end enumerate
16243
16244All the mail messages in the mbox file will now also be spread out over
16245all your @code{nnml} groups. Try entering them and check whether things
16246have gone without a glitch. If things look ok, you may consider
16247deleting the mbox file, but I wouldn't do that unless I was absolutely
16248sure that all the mail has ended up where it should be.
16249
16250Respooling is also a handy thing to do if you're switching from one mail
16251back end to another. Just respool all the mail in the old mail groups
16252using the new mail back end.
16253
16254
16255@node Expiring Mail
16256@subsection Expiring Mail
16257@cindex article expiry
16258@cindex expiring mail
16259
16260Traditional mail readers have a tendency to remove mail articles when
16261you mark them as read, in some way. Gnus takes a fundamentally
16262different approach to mail reading.
16263
16264Gnus basically considers mail just to be news that has been received in
16265a rather peculiar manner. It does not think that it has the power to
16266actually change the mail, or delete any mail messages. If you enter a
16267mail group, and mark articles as ``read'', or kill them in some other
16268fashion, the mail articles will still exist on the system. I repeat:
16269Gnus will not delete your old, read mail. Unless you ask it to, of
16270course.
16271
16272To make Gnus get rid of your unwanted mail, you have to mark the
16273articles as @dfn{expirable}. (With the default key bindings, this means
16274that you have to type @kbd{E}.) This does not mean that the articles
16275will disappear right away, however. In general, a mail article will be
16276deleted from your system if, 1) it is marked as expirable, AND 2) it is
16277more than one week old. If you do not mark an article as expirable, it
16278will remain on your system until hell freezes over. This bears
16279repeating one more time, with some spurious capitalizations: IF you do
16280NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES.
16281
16282You do not have to mark articles as expirable by hand. Gnus provides
16283two features, called ``auto-expire'' and ``total-expire'', that can help you
16284with this. In a nutshell, ``auto-expire'' means that Gnus hits @kbd{E}
16285for you when you select an article. And ``total-expire'' means that Gnus
16286considers all articles as expirable that are read. So, in addition to
16287the articles marked @samp{E}, also the articles marked @samp{r},
16288@samp{R}, @samp{O}, @samp{K}, @samp{Y} and so on are considered
16289expirable.
16290
16291When should either auto-expire or total-expire be used? Most people
16292who are subscribed to mailing lists split each list into its own group
16293and then turn on auto-expire or total-expire for those groups.
16294(@xref{Splitting Mail}, for more information on splitting each list
16295into its own group.)
16296
16297Which one is better, auto-expire or total-expire? It's not easy to
16298answer. Generally speaking, auto-expire is probably faster. Another
16299advantage of auto-expire is that you get more marks to work with: for
16300the articles that are supposed to stick around, you can still choose
16301between tick and dormant and read marks. But with total-expire, you
16302only have dormant and ticked to choose from. The advantage of
16303total-expire is that it works well with adaptive scoring (@pxref{Adaptive
16304Scoring}). Auto-expire works with normal scoring but not with adaptive
16305scoring.
16306
16307@vindex gnus-auto-expirable-newsgroups
16308Groups that match the regular expression
16309@code{gnus-auto-expirable-newsgroups} will have all articles that you
16310read marked as expirable automatically. All articles marked as
16311expirable have an @samp{E} in the first column in the summary buffer.
16312
16313By default, if you have auto expiry switched on, Gnus will mark all the
16314articles you read as expirable, no matter if they were read or unread
16315before. To avoid having articles marked as read marked as expirable
16316automatically, you can put something like the following in your
16317@file{~/.gnus.el} file:
16318
16319@vindex gnus-mark-article-hook
16320@lisp
16321(remove-hook 'gnus-mark-article-hook
16322 'gnus-summary-mark-read-and-unread-as-read)
16323(add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read)
16324@end lisp
16325
16326Note that making a group auto-expirable doesn't mean that all read
16327articles are expired---only the articles marked as expirable
16328will be expired. Also note that using the @kbd{d} command won't make
16329articles expirable---only semi-automatic marking of articles as read will
16330mark the articles as expirable in auto-expirable groups.
16331
16332Let's say you subscribe to a couple of mailing lists, and you want the
16333articles you have read to disappear after a while:
16334
16335@lisp
16336(setq gnus-auto-expirable-newsgroups
16337 "mail.nonsense-list\\|mail.nice-list")
16338@end lisp
16339
16340Another way to have auto-expiry happen is to have the element
16341@code{auto-expire} in the group parameters of the group.
16342
16343If you use adaptive scoring (@pxref{Adaptive Scoring}) and
16344auto-expiring, you'll have problems. Auto-expiring and adaptive scoring
16345don't really mix very well.
16346
16347@vindex nnmail-expiry-wait
16348The @code{nnmail-expiry-wait} variable supplies the default time an
16349expirable article has to live. Gnus starts counting days from when the
16350message @emph{arrived}, not from when it was sent. The default is seven
16351days.
16352
16353Gnus also supplies a function that lets you fine-tune how long articles
16354are to live, based on what group they are in. Let's say you want to
16355have one month expiry period in the @samp{mail.private} group, a one day
16356expiry period in the @samp{mail.junk} group, and a six day expiry period
16357everywhere else:
16358
16359@vindex nnmail-expiry-wait-function
16360@lisp
16361(setq nnmail-expiry-wait-function
16362 (lambda (group)
16363 (cond ((string= group "mail.private")
16364 31)
16365 ((string= group "mail.junk")
16366 1)
16367 ((string= group "important")
16368 'never)
16369 (t
16370 6))))
16371@end lisp
16372
16373The group names this function is fed are ``unadorned'' group
16374names---no @samp{nnml:} prefixes and the like.
16375
16376The @code{nnmail-expiry-wait} variable and
16377@code{nnmail-expiry-wait-function} function can either be a number (not
16378necessarily an integer) or one of the symbols @code{immediate} or
16379@code{never}.
16380
16381You can also use the @code{expiry-wait} group parameter to selectively
16382change the expiry period (@pxref{Group Parameters}).
16383
16384@vindex nnmail-expiry-target
16385The normal action taken when expiring articles is to delete them.
16386However, in some circumstances it might make more sense to move them
16387to other groups instead of deleting them. The variable
16388@code{nnmail-expiry-target} (and the @code{expiry-target} group
16389parameter) controls this. The variable supplies a default value for
16390all groups, which can be overridden for specific groups by the group
16391parameter. default value is @code{delete}, but this can also be a
16392string (which should be the name of the group the message should be
16393moved to), or a function (which will be called in a buffer narrowed to
16394the message in question, and with the name of the group being moved
16395from as its parameter) which should return a target---either a group
16396name or @code{delete}.
16397
16398Here's an example for specifying a group name:
16399@lisp
16400(setq nnmail-expiry-target "nnml:expired")
16401@end lisp
16402
16403@findex nnmail-fancy-expiry-target
16404@vindex nnmail-fancy-expiry-targets
16405Gnus provides a function @code{nnmail-fancy-expiry-target} which will
16406expire mail to groups according to the variable
16407@code{nnmail-fancy-expiry-targets}. Here's an example:
16408
16409@lisp
16410 (setq nnmail-expiry-target 'nnmail-fancy-expiry-target
16411 nnmail-fancy-expiry-targets
16412 '((to-from "boss" "nnfolder:Work")
16413 ("subject" "IMPORTANT" "nnfolder:IMPORTANT.%Y.%b")
16414 ("from" ".*" "nnfolder:Archive-%Y")))
16415@end lisp
16416
16417With this setup, any mail that has @code{IMPORTANT} in its Subject
16418header and was sent in the year @code{YYYY} and month @code{MMM}, will
16419get expired to the group @code{nnfolder:IMPORTANT.YYYY.MMM}. If its
16420From or To header contains the string @code{boss}, it will get expired
16421to @code{nnfolder:Work}. All other mail will get expired to
16422@code{nnfolder:Archive-YYYY}.
16423
16424@vindex nnmail-keep-last-article
16425If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never
16426expire the final article in a mail newsgroup. This is to make life
16427easier for procmail users.
16428
16429@vindex gnus-total-expirable-newsgroups
16430By the way: That line up there, about Gnus never expiring non-expirable
16431articles, is a lie. If you put @code{total-expire} in the group
16432parameters, articles will not be marked as expirable, but all read
16433articles will be put through the expiry process. Use with extreme
16434caution. Even more dangerous is the
16435@code{gnus-total-expirable-newsgroups} variable. All groups that match
16436this regexp will have all read articles put through the expiry process,
16437which means that @emph{all} old mail articles in the groups in question
16438will be deleted after a while. Use with extreme caution, and don't come
16439crying to me when you discover that the regexp you used matched the
16440wrong group and all your important mail has disappeared. Be a
16441@emph{man}! Or a @emph{woman}! Whatever you feel more comfortable
16442with! So there!
16443
16444Most people make most of their mail groups total-expirable, though.
16445
16446@vindex gnus-inhibit-user-auto-expire
16447If @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user marking
16448commands will not mark an article as expirable, even if the group has
16449auto-expire turned on.
16450
b0b63450
MB
16451@vindex gnus-mark-copied-or-moved-articles-as-expirable
16452The expirable marks of articles will be removed when copying or moving
16453them to a group in which auto-expire is not turned on. This is for
16454preventing articles from being expired unintentionally. On the other
16455hand, to a group that has turned auto-expire on, the expirable marks of
16456articles that are copied or moved will not be changed by default. I.e.,
16457when copying or moving to such a group, articles that were expirable
16458will be left expirable and ones that were not expirable will not be
16459marked as expirable. So, even though in auto-expire groups, some
16460articles will never get expired (unless you read them again). If you
16461don't side with that behavior that unexpirable articles may be mixed
16462into auto-expire groups, you can set
16463@code{gnus-mark-copied-or-moved-articles-as-expirable} to a
16464non-@code{nil} value. In that case, articles that have been read will
16465be marked as expirable automatically when being copied or moved to a
16466group that has auto-expire turned on. The default value is @code{nil}.
16467
4009494e
GM
16468
16469@node Washing Mail
16470@subsection Washing Mail
16471@cindex mail washing
16472@cindex list server brain damage
16473@cindex incoming mail treatment
16474
16475Mailers and list servers are notorious for doing all sorts of really,
16476really stupid things with mail. ``Hey, RFC 822 doesn't explicitly
16477prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the
16478end of all lines passing through our server, so let's do that!!!!1!''
16479Yes, but RFC 822 wasn't designed to be read by morons. Things that were
16480considered to be self-evident were not discussed. So. Here we are.
16481
16482Case in point: The German version of Microsoft Exchange adds @samp{AW:
16483} to the subjects of replies instead of @samp{Re: }. I could pretend to
16484be shocked and dismayed by this, but I haven't got the energy. It is to
16485laugh.
16486
16487Gnus provides a plethora of functions for washing articles while
16488displaying them, but it might be nicer to do the filtering before
16489storing the mail to disk. For that purpose, we have three hooks and
16490various functions that can be put in these hooks.
16491
16492@table @code
16493@item nnmail-prepare-incoming-hook
16494@vindex nnmail-prepare-incoming-hook
16495This hook is called before doing anything with the mail and is meant for
16496grand, sweeping gestures. It is called in a buffer that contains all
16497the new, incoming mail. Functions to be used include:
16498
16499@table @code
16500@item nnheader-ms-strip-cr
16501@findex nnheader-ms-strip-cr
16502Remove trailing carriage returns from each line. This is default on
16503Emacs running on MS machines.
16504
16505@end table
16506
16507@item nnmail-prepare-incoming-header-hook
16508@vindex nnmail-prepare-incoming-header-hook
16509This hook is called narrowed to each header. It can be used when
16510cleaning up the headers. Functions that can be used include:
16511
16512@table @code
16513@item nnmail-remove-leading-whitespace
16514@findex nnmail-remove-leading-whitespace
16515Clear leading white space that ``helpful'' listservs have added to the
16516headers to make them look nice. Aaah.
16517
16518(Note that this function works on both the header on the body of all
16519messages, so it is a potentially dangerous function to use (if a body
16520of a message contains something that looks like a header line). So
16521rather than fix the bug, it is of course the right solution to make it
16522into a feature by documenting it.)
16523
16524@item nnmail-remove-list-identifiers
16525@findex nnmail-remove-list-identifiers
16526Some list servers add an identifier---for example, @samp{(idm)}---to the
16527beginning of all @code{Subject} headers. I'm sure that's nice for
16528people who use stone age mail readers. This function will remove
16529strings that match the @code{nnmail-list-identifiers} regexp, which can
16530also be a list of regexp. @code{nnmail-list-identifiers} may not contain
16531@code{\\(..\\)}.
16532
16533For instance, if you want to remove the @samp{(idm)} and the
16534@samp{nagnagnag} identifiers:
16535
16536@lisp
16537(setq nnmail-list-identifiers
16538 '("(idm)" "nagnagnag"))
16539@end lisp
16540
16541This can also be done non-destructively with
16542@code{gnus-list-identifiers}, @xref{Article Hiding}.
16543
16544@item nnmail-remove-tabs
16545@findex nnmail-remove-tabs
16546Translate all @samp{TAB} characters into @samp{SPACE} characters.
16547
01c52d31
MB
16548@item nnmail-ignore-broken-references
16549@findex nnmail-ignore-broken-references
16550@c @findex nnmail-fix-eudora-headers
4009494e 16551@cindex Eudora
01c52d31
MB
16552@cindex Pegasus
16553Some mail user agents (e.g. Eudora and Pegasus) produce broken
16554@code{References} headers, but correct @code{In-Reply-To} headers. This
16555function will get rid of the @code{References} header if the headers
16556contain a line matching the regular expression
16557@code{nnmail-broken-references-mailers}.
4009494e
GM
16558
16559@end table
16560
16561@item nnmail-prepare-incoming-message-hook
16562@vindex nnmail-prepare-incoming-message-hook
16563This hook is called narrowed to each message. Functions to be used
16564include:
16565
16566@table @code
16567@item article-de-quoted-unreadable
16568@findex article-de-quoted-unreadable
16569Decode Quoted Readable encoding.
16570
16571@end table
16572@end table
16573
16574
16575@node Duplicates
16576@subsection Duplicates
16577
16578@vindex nnmail-treat-duplicates
16579@vindex nnmail-message-id-cache-length
16580@vindex nnmail-message-id-cache-file
16581@cindex duplicate mails
16582If you are a member of a couple of mailing lists, you will sometimes
16583receive two copies of the same mail. This can be quite annoying, so
16584@code{nnmail} checks for and treats any duplicates it might find. To do
16585this, it keeps a cache of old @code{Message-ID}s---
16586@code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by
16587default. The approximate maximum number of @code{Message-ID}s stored
16588there is controlled by the @code{nnmail-message-id-cache-length}
16589variable, which is 1000 by default. (So 1000 @code{Message-ID}s will be
16590stored.) If all this sounds scary to you, you can set
16591@code{nnmail-treat-duplicates} to @code{warn} (which is what it is by
16592default), and @code{nnmail} won't delete duplicate mails. Instead it
16593will insert a warning into the head of the mail saying that it thinks
16594that this is a duplicate of a different message.
16595
16596This variable can also be a function. If that's the case, the function
16597will be called from a buffer narrowed to the message in question with
16598the @code{Message-ID} as a parameter. The function must return either
16599@code{nil}, @code{warn}, or @code{delete}.
16600
16601You can turn this feature off completely by setting the variable to
16602@code{nil}.
16603
16604If you want all the duplicate mails to be put into a special
16605@dfn{duplicates} group, you could do that using the normal mail split
16606methods:
16607
16608@lisp
16609(setq nnmail-split-fancy
16610 '(| ;; @r{Messages duplicates go to a separate group.}
16611 ("gnus-warning" "duplicat\\(e\\|ion\\) of message" "duplicate")
16612 ;; @r{Message from daemons, postmaster, and the like to another.}
16613 (any mail "mail.misc")
16614 ;; @r{Other rules.}
16615 [...] ))
16616@end lisp
16617@noindent
16618Or something like:
16619@lisp
16620(setq nnmail-split-methods
16621 '(("duplicates" "^Gnus-Warning:.*duplicate")
16622 ;; @r{Other rules.}
16623 [...]))
16624@end lisp
16625
16626Here's a neat feature: If you know that the recipient reads her mail
16627with Gnus, and that she has @code{nnmail-treat-duplicates} set to
16628@code{delete}, you can send her as many insults as you like, just by
16629using a @code{Message-ID} of a mail that you know that she's already
16630received. Think of all the fun! She'll never see any of it! Whee!
16631
16632
16633@node Not Reading Mail
16634@subsection Not Reading Mail
16635
16636If you start using any of the mail back ends, they have the annoying
16637habit of assuming that you want to read mail with them. This might not
16638be unreasonable, but it might not be what you want.
16639
16640If you set @code{mail-sources} and @code{nnmail-spool-file} to
16641@code{nil}, none of the back ends will ever attempt to read incoming
16642mail, which should help.
16643
16644@vindex nnbabyl-get-new-mail
16645@vindex nnmbox-get-new-mail
16646@vindex nnml-get-new-mail
16647@vindex nnmh-get-new-mail
16648@vindex nnfolder-get-new-mail
16649This might be too much, if, for instance, you are reading mail quite
bc79f9ab
GM
16650happily with @code{nnml} and just want to peek at some old (pre-Emacs
1665123) Rmail file you have stashed away with @code{nnbabyl}. All back ends have
4009494e
GM
16652variables called back-end-@code{get-new-mail}. If you want to disable
16653the @code{nnbabyl} mail reading, you edit the virtual server for the
16654group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}.
16655
16656All the mail back ends will call @code{nn}*@code{-prepare-save-mail-hook}
16657narrowed to the article to be saved before saving it when reading
16658incoming mail.
16659
16660
16661@node Choosing a Mail Back End
16662@subsection Choosing a Mail Back End
16663
16664Gnus will read the mail spool when you activate a mail group. The mail
16665file is first copied to your home directory. What happens after that
16666depends on what format you want to store your mail in.
16667
16668There are six different mail back ends in the standard Gnus, and more
16669back ends are available separately. The mail back end most people use
16670(because it is possibly the fastest) is @code{nnml} (@pxref{Mail
16671Spool}).
16672
16673@menu
16674* Unix Mail Box:: Using the (quite) standard Un*x mbox.
bc79f9ab 16675* Babyl:: Babyl was used by older versions of Rmail.
4009494e
GM
16676* Mail Spool:: Store your mail in a private spool?
16677* MH Spool:: An mhspool-like back end.
16678* Maildir:: Another one-file-per-message format.
16679* Mail Folders:: Having one file for each group.
16680* Comparing Mail Back Ends:: An in-depth looks at pros and cons.
16681@end menu
16682
16683
8ccbef23 16684
4009494e
GM
16685@node Unix Mail Box
16686@subsubsection Unix Mail Box
16687@cindex nnmbox
16688@cindex unix mail box
16689
16690@vindex nnmbox-active-file
16691@vindex nnmbox-mbox-file
16692The @dfn{nnmbox} back end will use the standard Un*x mbox file to store
16693mail. @code{nnmbox} will add extra headers to each mail article to say
16694which group it belongs in.
16695
16696Virtual server settings:
16697
16698@table @code
16699@item nnmbox-mbox-file
16700@vindex nnmbox-mbox-file
16701The name of the mail box in the user's home directory. Default is
16702@file{~/mbox}.
16703
16704@item nnmbox-active-file
16705@vindex nnmbox-active-file
16706The name of the active file for the mail box. Default is
16707@file{~/.mbox-active}.
16708
16709@item nnmbox-get-new-mail
16710@vindex nnmbox-get-new-mail
16711If non-@code{nil}, @code{nnmbox} will read incoming mail and split it
16712into groups. Default is @code{t}.
16713@end table
16714
16715
bc79f9ab
GM
16716@node Babyl
16717@subsubsection Babyl
4009494e 16718@cindex nnbabyl
4009494e
GM
16719
16720@vindex nnbabyl-active-file
16721@vindex nnbabyl-mbox-file
bc79f9ab
GM
16722The @dfn{nnbabyl} back end will use a Babyl mail box to store mail.
16723@code{nnbabyl} will add extra headers to each mail article to say which
16724group it belongs in.
4009494e
GM
16725
16726Virtual server settings:
16727
16728@table @code
16729@item nnbabyl-mbox-file
16730@vindex nnbabyl-mbox-file
bc79f9ab 16731The name of the Babyl file. The default is @file{~/RMAIL}
4009494e
GM
16732
16733@item nnbabyl-active-file
16734@vindex nnbabyl-active-file
bc79f9ab 16735The name of the active file for the Babyl file. The default is
4009494e
GM
16736@file{~/.rmail-active}
16737
16738@item nnbabyl-get-new-mail
16739@vindex nnbabyl-get-new-mail
16740If non-@code{nil}, @code{nnbabyl} will read incoming mail. Default is
16741@code{t}
16742@end table
16743
16744
16745@node Mail Spool
16746@subsubsection Mail Spool
16747@cindex nnml
16748@cindex mail @acronym{NOV} spool
16749
16750The @dfn{nnml} spool mail format isn't compatible with any other known
16751format. It should be used with some caution.
16752
16753@vindex nnml-directory
16754If you use this back end, Gnus will split all incoming mail into files,
16755one file for each mail, and put the articles into the corresponding
16756directories under the directory specified by the @code{nnml-directory}
16757variable. The default value is @file{~/Mail/}.
16758
16759You do not have to create any directories beforehand; Gnus will take
16760care of all that.
16761
16762If you have a strict limit as to how many files you are allowed to store
16763in your account, you should not use this back end. As each mail gets its
16764own file, you might very well occupy thousands of inodes within a few
16765weeks. If this is no problem for you, and it isn't a problem for you
16766having your friendly systems administrator walking around, madly,
16767shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should
16768know that this is probably the fastest format to use. You do not have
16769to trudge through a big mbox file just to read your new mail.
16770
16771@code{nnml} is probably the slowest back end when it comes to article
16772splitting. It has to create lots of files, and it also generates
16773@acronym{NOV} databases for the incoming mails. This makes it possibly the
16774fastest back end when it comes to reading mail.
16775
16776@cindex self contained nnml servers
16777@cindex marks
16778When the marks file is used (which it is by default), @code{nnml}
16779servers have the property that you may backup them using @code{tar} or
16780similar, and later be able to restore them into Gnus (by adding the
16781proper @code{nnml} server) and have all your marks be preserved. Marks
01c52d31 16782for a group are usually stored in the @code{.marks} file (but see
4009494e
GM
16783@code{nnml-marks-file-name}) within each @code{nnml} group's directory.
16784Individual @code{nnml} groups are also possible to backup, use @kbd{G m}
16785to restore the group (after restoring the backup into the nnml
16786directory).
16787
16788If for some reason you believe your @file{.marks} files are screwed
16789up, you can just delete them all. Gnus will then correctly regenerate
16790them next time it starts.
16791
16792Virtual server settings:
16793
16794@table @code
16795@item nnml-directory
16796@vindex nnml-directory
16797All @code{nnml} directories will be placed under this directory. The
16798default is the value of @code{message-directory} (whose default value
16799is @file{~/Mail}).
16800
16801@item nnml-active-file
16802@vindex nnml-active-file
16803The active file for the @code{nnml} server. The default is
16804@file{~/Mail/active}.
16805
16806@item nnml-newsgroups-file
16807@vindex nnml-newsgroups-file
16808The @code{nnml} group descriptions file. @xref{Newsgroups File
16809Format}. The default is @file{~/Mail/newsgroups}.
16810
16811@item nnml-get-new-mail
16812@vindex nnml-get-new-mail
16813If non-@code{nil}, @code{nnml} will read incoming mail. The default is
16814@code{t}.
16815
16816@item nnml-nov-is-evil
16817@vindex nnml-nov-is-evil
16818If non-@code{nil}, this back end will ignore any @acronym{NOV} files. The
16819default is @code{nil}.
16820
16821@item nnml-nov-file-name
16822@vindex nnml-nov-file-name
16823The name of the @acronym{NOV} files. The default is @file{.overview}.
16824
16825@item nnml-prepare-save-mail-hook
16826@vindex nnml-prepare-save-mail-hook
16827Hook run narrowed to an article before saving.
16828
16829@item nnml-marks-is-evil
16830@vindex nnml-marks-is-evil
16831If non-@code{nil}, this back end will ignore any @sc{marks} files. The
16832default is @code{nil}.
16833
16834@item nnml-marks-file-name
16835@vindex nnml-marks-file-name
16836The name of the @dfn{marks} files. The default is @file{.marks}.
16837
16838@item nnml-use-compressed-files
16839@vindex nnml-use-compressed-files
16840If non-@code{nil}, @code{nnml} will allow using compressed message
01c52d31
MB
16841files. This requires @code{auto-compression-mode} to be enabled
16842(@pxref{Compressed Files, ,Compressed Files, emacs, The Emacs Manual}).
16843If the value of @code{nnml-use-compressed-files} is a string, it is used
16844as the file extension specifying the compression program. You can set it
16845to @samp{.bz2} if your Emacs supports it. A value of @code{t} is
16846equivalent to @samp{.gz}.
16847
16848@item nnml-compressed-files-size-threshold
16849@vindex nnml-compressed-files-size-threshold
16850Default size threshold for compressed message files. Message files with
16851bodies larger than that many characters will be automatically compressed
16852if @code{nnml-use-compressed-files} is non-@code{nil}.
4009494e
GM
16853
16854@end table
16855
16856@findex nnml-generate-nov-databases
16857If your @code{nnml} groups and @acronym{NOV} files get totally out of
16858whack, you can do a complete update by typing @kbd{M-x
16859nnml-generate-nov-databases}. This command will trawl through the
16860entire @code{nnml} hierarchy, looking at each and every article, so it
16861might take a while to complete. A better interface to this
16862functionality can be found in the server buffer (@pxref{Server
16863Commands}).
16864
16865
16866@node MH Spool
16867@subsubsection MH Spool
16868@cindex nnmh
16869@cindex mh-e mail spool
16870
16871@code{nnmh} is just like @code{nnml}, except that is doesn't generate
16872@acronym{NOV} databases and it doesn't keep an active file or marks
16873file. This makes @code{nnmh} a @emph{much} slower back end than
16874@code{nnml}, but it also makes it easier to write procmail scripts
16875for.
16876
16877Virtual server settings:
16878
16879@table @code
16880@item nnmh-directory
16881@vindex nnmh-directory
16882All @code{nnmh} directories will be located under this directory. The
16883default is the value of @code{message-directory} (whose default is
16884@file{~/Mail})
16885
16886@item nnmh-get-new-mail
16887@vindex nnmh-get-new-mail
16888If non-@code{nil}, @code{nnmh} will read incoming mail. The default is
16889@code{t}.
16890
16891@item nnmh-be-safe
16892@vindex nnmh-be-safe
16893If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make
16894sure that the articles in the folder are actually what Gnus thinks
16895they are. It will check date stamps and stat everything in sight, so
16896setting this to @code{t} will mean a serious slow-down. If you never
16897use anything but Gnus to read the @code{nnmh} articles, you do not
16898have to set this variable to @code{t}. The default is @code{nil}.
16899@end table
16900
16901
16902@node Maildir
16903@subsubsection Maildir
16904@cindex nnmaildir
16905@cindex maildir
16906
16907@code{nnmaildir} stores mail in the maildir format, with each maildir
16908corresponding to a group in Gnus. This format is documented here:
16909@uref{http://cr.yp.to/proto/maildir.html} and here:
16910@uref{http://www.qmail.org/man/man5/maildir.html}. @code{nnmaildir}
16911also stores extra information in the @file{.nnmaildir/} directory
16912within a maildir.
16913
16914Maildir format was designed to allow concurrent deliveries and
16915reading, without needing locks. With other back ends, you would have
16916your mail delivered to a spool of some kind, and then you would
16917configure Gnus to split mail from that spool into your groups. You
16918can still do that with @code{nnmaildir}, but the more common
16919configuration is to have your mail delivered directly to the maildirs
16920that appear as group in Gnus.
16921
16922@code{nnmaildir} is designed to be perfectly reliable: @kbd{C-g} will
16923never corrupt its data in memory, and @code{SIGKILL} will never
16924corrupt its data in the filesystem.
16925
16926@code{nnmaildir} stores article marks and @acronym{NOV} data in each
16927maildir. So you can copy a whole maildir from one Gnus setup to
16928another, and you will keep your marks.
16929
16930Virtual server settings:
16931
16932@table @code
16933@item directory
16934For each of your @code{nnmaildir} servers (it's very unlikely that
16935you'd need more than one), you need to create a directory and populate
16936it with maildirs or symlinks to maildirs (and nothing else; do not
16937choose a directory already used for other purposes). Each maildir
16938will be represented in Gnus as a newsgroup on that server; the
16939filename of the symlink will be the name of the group. Any filenames
16940in the directory starting with @samp{.} are ignored. The directory is
16941scanned when you first start Gnus, and each time you type @kbd{g} in
16942the group buffer; if any maildirs have been removed or added,
16943@code{nnmaildir} notices at these times.
16944
16945The value of the @code{directory} parameter should be a Lisp form
16946which is processed by @code{eval} and @code{expand-file-name} to get
16947the path of the directory for this server. The form is @code{eval}ed
16948only when the server is opened; the resulting string is used until the
16949server is closed. (If you don't know about forms and @code{eval},
16950don't worry---a simple string will work.) This parameter is not
16951optional; you must specify it. I don't recommend using
16952@code{"~/Mail"} or a subdirectory of it; several other parts of Gnus
16953use that directory by default for various things, and may get confused
16954if @code{nnmaildir} uses it too. @code{"~/.nnmaildir"} is a typical
16955value.
16956
16957@item target-prefix
16958This should be a Lisp form which is processed by @code{eval} and
16959@code{expand-file-name}. The form is @code{eval}ed only when the
16960server is opened; the resulting string is used until the server is
16961closed.
16962
16963When you create a group on an @code{nnmaildir} server, the maildir is
16964created with @code{target-prefix} prepended to its name, and a symlink
16965pointing to that maildir is created, named with the plain group name.
16966So if @code{directory} is @code{"~/.nnmaildir"} and
16967@code{target-prefix} is @code{"../maildirs/"}, then when you create
16968the group @code{foo}, @code{nnmaildir} will create
16969@file{~/.nnmaildir/../maildirs/foo} as a maildir, and will create
16970@file{~/.nnmaildir/foo} as a symlink pointing to
16971@file{../maildirs/foo}.
16972
16973You can set @code{target-prefix} to a string without any slashes to
16974create both maildirs and symlinks in the same @code{directory}; in
16975this case, any maildirs found in @code{directory} whose names start
16976with @code{target-prefix} will not be listed as groups (but the
16977symlinks pointing to them will be).
16978
16979As a special case, if @code{target-prefix} is @code{""} (the default),
16980then when you create a group, the maildir will be created in
16981@code{directory} without a corresponding symlink. Beware that you
16982cannot use @code{gnus-group-delete-group} on such groups without the
16983@code{force} argument.
16984
16985@item directory-files
16986This should be a function with the same interface as
16987@code{directory-files} (such as @code{directory-files} itself). It is
16988used to scan the server's @code{directory} for maildirs. This
16989parameter is optional; the default is
16990@code{nnheader-directory-files-safe} if
16991@code{nnheader-directory-files-is-safe} is @code{nil}, and
16992@code{directory-files} otherwise.
16993(@code{nnheader-directory-files-is-safe} is checked only once when the
16994server is opened; if you want to check it each time the directory is
16995scanned, you'll have to provide your own function that does that.)
16996
16997@item get-new-mail
16998If non-@code{nil}, then after scanning for new mail in the group
16999maildirs themselves as usual, this server will also incorporate mail
17000the conventional Gnus way, from @code{mail-sources} according to
17001@code{nnmail-split-methods} or @code{nnmail-split-fancy}. The default
17002value is @code{nil}.
17003
17004Do @emph{not} use the same maildir both in @code{mail-sources} and as
17005an @code{nnmaildir} group. The results might happen to be useful, but
17006that would be by chance, not by design, and the results might be
17007different in the future. If your split rules create new groups,
17008remember to supply a @code{create-directory} server parameter.
17009@end table
17010
17011@subsubsection Group parameters
17012
17013@code{nnmaildir} uses several group parameters. It's safe to ignore
17014all this; the default behavior for @code{nnmaildir} is the same as the
17015default behavior for other mail back ends: articles are deleted after
17016one week, etc. Except for the expiry parameters, all this
17017functionality is unique to @code{nnmaildir}, so you can ignore it if
17018you're just trying to duplicate the behavior you already have with
17019another back end.
17020
17021If the value of any of these parameters is a vector, the first element
17022is evaluated as a Lisp form and the result is used, rather than the
17023original value. If the value is not a vector, the value itself is
17024evaluated as a Lisp form. (This is why these parameters use names
17025different from those of other, similar parameters supported by other
17026back ends: they have different, though similar, meanings.) (For
17027numbers, strings, @code{nil}, and @code{t}, you can ignore the
17028@code{eval} business again; for other values, remember to use an extra
17029quote and wrap the value in a vector when appropriate.)
17030
17031@table @code
17032@item expire-age
17033An integer specifying the minimum age, in seconds, of an article
17034before it will be expired, or the symbol @code{never} to specify that
17035articles should never be expired. If this parameter is not set,
17036@code{nnmaildir} falls back to the usual
17037@code{nnmail-expiry-wait}(@code{-function}) variables (the
17038@code{expiry-wait} group parameter overrides @code{nnmail-expiry-wait}
17039and makes @code{nnmail-expiry-wait-function} ineffective). If you
17040wanted a value of 3 days, you could use something like @code{[(* 3 24
1704160 60)]}; @code{nnmaildir} will evaluate the form and use the result.
17042An article's age is measured starting from the article file's
17043modification time. Normally, this is the same as the article's
17044delivery time, but editing an article makes it younger. Moving an
17045article (other than via expiry) may also make an article younger.
17046
17047@item expire-group
17048If this is set to a string such as a full Gnus group name, like
17049@example
17050"backend+server.address.string:group.name"
17051@end example
17052and if it is not the name of the same group that the parameter belongs
17053to, then articles will be moved to the specified group during expiry
17054before being deleted. @emph{If this is set to an @code{nnmaildir}
17055group, the article will be just as old in the destination group as it
17056was in the source group.} So be careful with @code{expire-age} in the
17057destination group. If this is set to the name of the same group that
17058the parameter belongs to, then the article is not expired at all. If
17059you use the vector form, the first element is evaluated once for each
17060article. So that form can refer to
17061@code{nnmaildir-article-file-name}, etc., to decide where to put the
17062article. @emph{Even if this parameter is not set, @code{nnmaildir}
17063does not fall back to the @code{expiry-target} group parameter or the
17064@code{nnmail-expiry-target} variable.}
17065
17066@item read-only
17067If this is set to @code{t}, @code{nnmaildir} will treat the articles
17068in this maildir as read-only. This means: articles are not renamed
17069from @file{new/} into @file{cur/}; articles are only found in
17070@file{new/}, not @file{cur/}; articles are never deleted; articles
17071cannot be edited. @file{new/} is expected to be a symlink to the
17072@file{new/} directory of another maildir---e.g., a system-wide mailbox
17073containing a mailing list of common interest. Everything in the
17074maildir outside @file{new/} is @emph{not} treated as read-only, so for
17075a shared mailbox, you do still need to set up your own maildir (or
17076have write permission to the shared mailbox); your maildir just won't
17077contain extra copies of the articles.
17078
17079@item directory-files
17080A function with the same interface as @code{directory-files}. It is
17081used to scan the directories in the maildir corresponding to this
17082group to find articles. The default is the function specified by the
17083server's @code{directory-files} parameter.
17084
17085@item distrust-Lines:
17086If non-@code{nil}, @code{nnmaildir} will always count the lines of an
17087article, rather than use the @code{Lines:} header field. If
17088@code{nil}, the header field will be used if present.
17089
17090@item always-marks
17091A list of mark symbols, such as @code{['(read expire)]}. Whenever
17092Gnus asks @code{nnmaildir} for article marks, @code{nnmaildir} will
17093say that all articles have these marks, regardless of whether the
17094marks stored in the filesystem say so. This is a proof-of-concept
17095feature that will probably be removed eventually; it ought to be done
17096in Gnus proper, or abandoned if it's not worthwhile.
17097
17098@item never-marks
17099A list of mark symbols, such as @code{['(tick expire)]}. Whenever
17100Gnus asks @code{nnmaildir} for article marks, @code{nnmaildir} will
17101say that no articles have these marks, regardless of whether the marks
17102stored in the filesystem say so. @code{never-marks} overrides
17103@code{always-marks}. This is a proof-of-concept feature that will
17104probably be removed eventually; it ought to be done in Gnus proper, or
17105abandoned if it's not worthwhile.
17106
17107@item nov-cache-size
17108An integer specifying the size of the @acronym{NOV} memory cache. To
17109speed things up, @code{nnmaildir} keeps @acronym{NOV} data in memory
17110for a limited number of articles in each group. (This is probably not
17111worthwhile, and will probably be removed in the future.) This
17112parameter's value is noticed only the first time a group is seen after
17113the server is opened---i.e., when you first start Gnus, typically.
17114The @acronym{NOV} cache is never resized until the server is closed
17115and reopened. The default is an estimate of the number of articles
17116that would be displayed in the summary buffer: a count of articles
17117that are either marked with @code{tick} or not marked with
17118@code{read}, plus a little extra.
17119@end table
17120
17121@subsubsection Article identification
17122Articles are stored in the @file{cur/} subdirectory of each maildir.
17123Each article file is named like @code{uniq:info}, where @code{uniq}
17124contains no colons. @code{nnmaildir} ignores, but preserves, the
17125@code{:info} part. (Other maildir readers typically use this part of
17126the filename to store marks.) The @code{uniq} part uniquely
17127identifies the article, and is used in various places in the
17128@file{.nnmaildir/} subdirectory of the maildir to store information
17129about the corresponding article. The full pathname of an article is
17130available in the variable @code{nnmaildir-article-file-name} after you
17131request the article in the summary buffer.
17132
17133@subsubsection NOV data
17134An article identified by @code{uniq} has its @acronym{NOV} data (used
17135to generate lines in the summary buffer) stored in
17136@code{.nnmaildir/nov/uniq}. There is no
17137@code{nnmaildir-generate-nov-databases} function. (There isn't much
17138need for it---an article's @acronym{NOV} data is updated automatically
17139when the article or @code{nnmail-extra-headers} has changed.) You can
17140force @code{nnmaildir} to regenerate the @acronym{NOV} data for a
17141single article simply by deleting the corresponding @acronym{NOV}
17142file, but @emph{beware}: this will also cause @code{nnmaildir} to
17143assign a new article number for this article, which may cause trouble
17144with @code{seen} marks, the Agent, and the cache.
17145
17146@subsubsection Article marks
17147An article identified by @code{uniq} is considered to have the mark
17148@code{flag} when the file @file{.nnmaildir/marks/flag/uniq} exists.
17149When Gnus asks @code{nnmaildir} for a group's marks, @code{nnmaildir}
17150looks for such files and reports the set of marks it finds. When Gnus
17151asks @code{nnmaildir} to store a new set of marks, @code{nnmaildir}
17152creates and deletes the corresponding files as needed. (Actually,
17153rather than create a new file for each mark, it just creates hard
17154links to @file{.nnmaildir/markfile}, to save inodes.)
17155
17156You can invent new marks by creating a new directory in
17157@file{.nnmaildir/marks/}. You can tar up a maildir and remove it from
17158your server, untar it later, and keep your marks. You can add and
17159remove marks yourself by creating and deleting mark files. If you do
17160this while Gnus is running and your @code{nnmaildir} server is open,
17161it's best to exit all summary buffers for @code{nnmaildir} groups and
17162type @kbd{s} in the group buffer first, and to type @kbd{g} or
17163@kbd{M-g} in the group buffer afterwards. Otherwise, Gnus might not
17164pick up the changes, and might undo them.
17165
17166
17167@node Mail Folders
17168@subsubsection Mail Folders
17169@cindex nnfolder
17170@cindex mbox folders
17171@cindex mail folders
17172
17173@code{nnfolder} is a back end for storing each mail group in a
17174separate file. Each file is in the standard Un*x mbox format.
17175@code{nnfolder} will add extra headers to keep track of article
17176numbers and arrival dates.
17177
17178@cindex self contained nnfolder servers
17179@cindex marks
17180When the marks file is used (which it is by default), @code{nnfolder}
17181servers have the property that you may backup them using @code{tar} or
17182similar, and later be able to restore them into Gnus (by adding the
17183proper @code{nnfolder} server) and have all your marks be preserved.
17184Marks for a group are usually stored in a file named as the mbox file
17185with @code{.mrk} concatenated to it (but see
17186@code{nnfolder-marks-file-suffix}) within the @code{nnfolder}
17187directory. Individual @code{nnfolder} groups are also possible to
17188backup, use @kbd{G m} to restore the group (after restoring the backup
17189into the @code{nnfolder} directory).
17190
17191Virtual server settings:
17192
17193@table @code
17194@item nnfolder-directory
17195@vindex nnfolder-directory
17196All the @code{nnfolder} mail boxes will be stored under this
17197directory. The default is the value of @code{message-directory}
17198(whose default is @file{~/Mail})
17199
17200@item nnfolder-active-file
17201@vindex nnfolder-active-file
17202The name of the active file. The default is @file{~/Mail/active}.
17203
17204@item nnfolder-newsgroups-file
17205@vindex nnfolder-newsgroups-file
17206The name of the group descriptions file. @xref{Newsgroups File
17207Format}. The default is @file{~/Mail/newsgroups}
17208
17209@item nnfolder-get-new-mail
17210@vindex nnfolder-get-new-mail
17211If non-@code{nil}, @code{nnfolder} will read incoming mail. The
17212default is @code{t}
17213
17214@item nnfolder-save-buffer-hook
17215@vindex nnfolder-save-buffer-hook
17216@cindex backup files
17217Hook run before saving the folders. Note that Emacs does the normal
17218backup renaming of files even with the @code{nnfolder} buffers. If
17219you wish to switch this off, you could say something like the
17220following in your @file{.emacs} file:
17221
17222@lisp
17223(defun turn-off-backup ()
17224 (set (make-local-variable 'backup-inhibited) t))
17225
17226(add-hook 'nnfolder-save-buffer-hook 'turn-off-backup)
17227@end lisp
17228
17229@item nnfolder-delete-mail-hook
17230@vindex nnfolder-delete-mail-hook
17231Hook run in a buffer narrowed to the message that is to be deleted.
17232This function can be used to copy the message to somewhere else, or to
17233extract some information from it before removing it.
17234
17235@item nnfolder-nov-is-evil
17236@vindex nnfolder-nov-is-evil
17237If non-@code{nil}, this back end will ignore any @acronym{NOV} files. The
17238default is @code{nil}.
17239
17240@item nnfolder-nov-file-suffix
17241@vindex nnfolder-nov-file-suffix
17242The extension for @acronym{NOV} files. The default is @file{.nov}.
17243
17244@item nnfolder-nov-directory
17245@vindex nnfolder-nov-directory
17246The directory where the @acronym{NOV} files should be stored. If
17247@code{nil}, @code{nnfolder-directory} is used.
17248
17249@item nnfolder-marks-is-evil
17250@vindex nnfolder-marks-is-evil
17251If non-@code{nil}, this back end will ignore any @sc{marks} files. The
17252default is @code{nil}.
17253
17254@item nnfolder-marks-file-suffix
17255@vindex nnfolder-marks-file-suffix
17256The extension for @sc{marks} files. The default is @file{.mrk}.
17257
17258@item nnfolder-marks-directory
17259@vindex nnfolder-marks-directory
17260The directory where the @sc{marks} files should be stored. If
17261@code{nil}, @code{nnfolder-directory} is used.
17262
17263@end table
17264
17265
17266@findex nnfolder-generate-active-file
17267@kindex M-x nnfolder-generate-active-file
17268If you have lots of @code{nnfolder}-like files you'd like to read with
17269@code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file}
17270command to make @code{nnfolder} aware of all likely files in
17271@code{nnfolder-directory}. This only works if you use long file names,
17272though.
17273
17274@node Comparing Mail Back Ends
17275@subsubsection Comparing Mail Back Ends
17276
17277First, just for terminology, the @dfn{back end} is the common word for a
17278low-level access method---a transport, if you will, by which something
17279is acquired. The sense is that one's mail has to come from somewhere,
17280and so selection of a suitable back end is required in order to get that
17281mail within spitting distance of Gnus.
17282
17283The same concept exists for Usenet itself: Though access to articles is
17284typically done by @acronym{NNTP} these days, once upon a midnight dreary, everyone
17285in the world got at Usenet by running a reader on the machine where the
17286articles lay (the machine which today we call an @acronym{NNTP} server), and
17287access was by the reader stepping into the articles' directory spool
17288area directly. One can still select between either the @code{nntp} or
17289@code{nnspool} back ends, to select between these methods, if one happens
17290actually to live on the server (or can see its spool directly, anyway,
17291via NFS).
17292
17293The goal in selecting a mail back end is to pick one which
17294simultaneously represents a suitable way of dealing with the original
17295format plus leaving mail in a form that is convenient to use in the
17296future. Here are some high and low points on each:
17297
17298@table @code
17299@item nnmbox
17300
17301UNIX systems have historically had a single, very common, and well-
17302defined format. All messages arrive in a single @dfn{spool file}, and
17303they are delineated by a line whose regular expression matches
17304@samp{^From_}. (My notational use of @samp{_} is to indicate a space,
17305to make it clear in this instance that this is not the RFC-specified
17306@samp{From:} header.) Because Emacs and therefore Gnus emanate
17307historically from the Unix environment, it is simplest if one does not
17308mess a great deal with the original mailbox format, so if one chooses
17309this back end, Gnus' primary activity in getting mail from the real spool
17310area to Gnus' preferred directory is simply to copy it, with no
17311(appreciable) format change in the process. It is the ``dumbest'' way
17312to move mail into availability in the Gnus environment. This makes it
17313fast to move into place, but slow to parse, when Gnus has to look at
17314what's where.
17315
17316@item nnbabyl
17317
17318Once upon a time, there was the DEC-10 and DEC-20, running operating
17319systems called TOPS and related things, and the usual (only?) mail
17320reading environment was a thing called Babyl. I don't know what format
17321was used for mail landing on the system, but Babyl had its own internal
17322format to which mail was converted, primarily involving creating a
17323spool-file-like entity with a scheme for inserting Babyl-specific
17324headers and status bits above the top of each message in the file.
17325Rmail was Emacs' first mail reader, it was written by Richard Stallman,
17326and Stallman came out of that TOPS/Babyl environment, so he wrote Rmail
17327to understand the mail files folks already had in existence. Gnus (and
17328VM, for that matter) continue to support this format because it's
17329perceived as having some good qualities in those mailer-specific
17330headers/status bits stuff. Rmail itself still exists as well, of
bc79f9ab
GM
17331course, and is still maintained within Emacs. Since Emacs 23, it
17332uses standard mbox format rather than Babyl.
4009494e
GM
17333
17334Both of the above forms leave your mail in a single file on your
17335file system, and they must parse that entire file each time you take a
17336look at your mail.
17337
17338@item nnml
17339
17340@code{nnml} is the back end which smells the most as though you were
17341actually operating with an @code{nnspool}-accessed Usenet system. (In
17342fact, I believe @code{nnml} actually derived from @code{nnspool} code,
17343lo these years ago.) One's mail is taken from the original spool file,
17344and is then cut up into individual message files, 1:1. It maintains a
17345Usenet-style active file (analogous to what one finds in an INN- or
17346CNews-based news system in (for instance) @file{/var/lib/news/active},
17347or what is returned via the @samp{NNTP LIST} verb) and also creates
17348@dfn{overview} files for efficient group entry, as has been defined for
17349@acronym{NNTP} servers for some years now. It is slower in mail-splitting,
17350due to the creation of lots of files, updates to the @code{nnml} active
17351file, and additions to overview files on a per-message basis, but it is
17352extremely fast on access because of what amounts to the indexing support
17353provided by the active file and overviews.
17354
17355@code{nnml} costs @dfn{inodes} in a big way; that is, it soaks up the
17356resource which defines available places in the file system to put new
17357files. Sysadmins take a dim view of heavy inode occupation within
17358tight, shared file systems. But if you live on a personal machine where
17359the file system is your own and space is not at a premium, @code{nnml}
17360wins big.
17361
17362It is also problematic using this back end if you are living in a
17363FAT16-based Windows world, since much space will be wasted on all these
17364tiny files.
17365
17366@item nnmh
17367
17368The Rand MH mail-reading system has been around UNIX systems for a very
17369long time; it operates by splitting one's spool file of messages into
17370individual files, but with little or no indexing support---@code{nnmh}
17371is considered to be semantically equivalent to ``@code{nnml} without
17372active file or overviews''. This is arguably the worst choice, because
17373one gets the slowness of individual file creation married to the
17374slowness of access parsing when learning what's new in one's groups.
17375
17376@item nnfolder
17377
17378Basically the effect of @code{nnfolder} is @code{nnmbox} (the first
17379method described above) on a per-group basis. That is, @code{nnmbox}
17380itself puts @emph{all} one's mail in one file; @code{nnfolder} provides a
17381little bit of optimization to this so that each of one's mail groups has
17382a Unix mail box file. It's faster than @code{nnmbox} because each group
17383can be parsed separately, and still provides the simple Unix mail box
17384format requiring minimal effort in moving the mail around. In addition,
17385it maintains an ``active'' file making it much faster for Gnus to figure
17386out how many messages there are in each separate group.
17387
17388If you have groups that are expected to have a massive amount of
17389messages, @code{nnfolder} is not the best choice, but if you receive
17390only a moderate amount of mail, @code{nnfolder} is probably the most
17391friendly mail back end all over.
17392
17393@item nnmaildir
17394
17395For configuring expiry and other things, @code{nnmaildir} uses
17396incompatible group parameters, slightly different from those of other
17397mail back ends.
17398
17399@code{nnmaildir} is largely similar to @code{nnml}, with some notable
17400differences. Each message is stored in a separate file, but the
17401filename is unrelated to the article number in Gnus. @code{nnmaildir}
17402also stores the equivalent of @code{nnml}'s overview files in one file
17403per article, so it uses about twice as many inodes as @code{nnml}. (Use
17404@code{df -i} to see how plentiful your inode supply is.) If this slows
17405you down or takes up very much space, consider switching to
17406@uref{http://www.namesys.com/, ReiserFS} or another non-block-structured
17407file system.
17408
17409Since maildirs don't require locking for delivery, the maildirs you use
17410as groups can also be the maildirs your mail is directly delivered to.
17411This means you can skip Gnus' mail splitting if your mail is already
17412organized into different mailboxes during delivery. A @code{directory}
17413entry in @code{mail-sources} would have a similar effect, but would
17414require one set of mailboxes for spooling deliveries (in mbox format,
17415thus damaging message bodies), and another set to be used as groups (in
17416whatever format you like). A maildir has a built-in spool, in the
17417@code{new/} subdirectory. Beware that currently, mail moved from
17418@code{new/} to @code{cur/} instead of via mail splitting will not
17419undergo treatment such as duplicate checking.
17420
17421@code{nnmaildir} stores article marks for a given group in the
17422corresponding maildir, in a way designed so that it's easy to manipulate
17423them from outside Gnus. You can tar up a maildir, unpack it somewhere
17424else, and still have your marks. @code{nnml} also stores marks, but
17425it's not as easy to work with them from outside Gnus as with
17426@code{nnmaildir}.
17427
17428@code{nnmaildir} uses a significant amount of memory to speed things up.
17429(It keeps in memory some of the things that @code{nnml} stores in files
17430and that @code{nnmh} repeatedly parses out of message files.) If this
17431is a problem for you, you can set the @code{nov-cache-size} group
17432parameter to something small (0 would probably not work, but 1 probably
17433would) to make it use less memory. This caching will probably be
17434removed in the future.
17435
17436Startup is likely to be slower with @code{nnmaildir} than with other
17437back ends. Everything else is likely to be faster, depending in part
17438on your file system.
17439
17440@code{nnmaildir} does not use @code{nnoo}, so you cannot use @code{nnoo}
17441to write an @code{nnmaildir}-derived back end.
17442
17443@end table
17444
17445
17446@node Browsing the Web
17447@section Browsing the Web
17448@cindex web
17449@cindex browsing the web
17450@cindex www
17451@cindex http
17452
17453Web-based discussion forums are getting more and more popular. On many
17454subjects, the web-based forums have become the most important forums,
17455eclipsing the importance of mailing lists and news groups. The reason
17456is easy to understand---they are friendly to new users; you just point
17457and click, and there's the discussion. With mailing lists, you have to
17458go through a cumbersome subscription procedure, and most people don't
17459even know what a news group is.
17460
17461The problem with this scenario is that web browsers are not very good at
17462being newsreaders. They do not keep track of what articles you've read;
17463they do not allow you to score on subjects you're interested in; they do
17464not allow off-line browsing; they require you to click around and drive
17465you mad in the end.
17466
17467So---if web browsers suck at reading discussion forums, why not use Gnus
17468to do it instead?
17469
17470Gnus has been getting a bit of a collection of back ends for providing
17471interfaces to these sources.
17472
17473@menu
17474* Archiving Mail::
17475* Web Searches:: Creating groups from articles that match a string.
4009494e
GM
17476* RSS:: Reading RDF site summary.
17477* Customizing W3:: Doing stuff to Emacs/W3 from Gnus.
17478@end menu
17479
17480All the web sources require Emacs/W3 and the url library or those
17481alternatives to work.
17482
17483The main caveat with all these web sources is that they probably won't
17484work for a very long time. Gleaning information from the @acronym{HTML} data
17485is guesswork at best, and when the layout is altered, the Gnus back end
17486will fail. If you have reasonably new versions of these back ends,
17487though, you should be ok.
17488
17489One thing all these Web methods have in common is that the Web sources
17490are often down, unavailable or just plain too slow to be fun. In those
17491cases, it makes a lot of sense to let the Gnus Agent (@pxref{Gnus
17492Unplugged}) handle downloading articles, and then you can read them at
17493leisure from your local disk. No more World Wide Wait for you.
17494
17495@node Archiving Mail
17496@subsection Archiving Mail
17497@cindex archiving mail
17498@cindex backup of mail
17499
17500Some of the back ends, notably @code{nnml}, @code{nnfolder}, and
17501@code{nnmaildir}, now actually store the article marks with each group.
17502For these servers, archiving and restoring a group while preserving
17503marks is fairly simple.
17504
17505(Preserving the group level and group parameters as well still
17506requires ritual dancing and sacrifices to the @file{.newsrc.eld} deity
17507though.)
17508
17509To archive an entire @code{nnml}, @code{nnfolder}, or @code{nnmaildir}
17510server, take a recursive copy of the server directory. There is no need
17511to shut down Gnus, so archiving may be invoked by @code{cron} or
17512similar. You restore the data by restoring the directory tree, and
17513adding a server definition pointing to that directory in Gnus. The
17514@ref{Article Backlog}, @ref{Asynchronous Fetching} and other things
17515might interfere with overwriting data, so you may want to shut down Gnus
17516before you restore the data.
17517
17518It is also possible to archive individual @code{nnml},
17519@code{nnfolder}, or @code{nnmaildir} groups, while preserving marks.
17520For @code{nnml} or @code{nnmaildir}, you copy all files in the group's
17521directory. For @code{nnfolder} you need to copy both the base folder
17522file itself (@file{FOO}, say), and the marks file (@file{FOO.mrk} in
17523this example). Restoring the group is done with @kbd{G m} from the Group
17524buffer. The last step makes Gnus notice the new directory.
17525@code{nnmaildir} notices the new directory automatically, so @kbd{G m}
17526is unnecessary in that case.
17527
17528@node Web Searches
17529@subsection Web Searches
17530@cindex nnweb
17531@cindex Google
17532@cindex dejanews
17533@cindex gmane
17534@cindex Usenet searches
17535@cindex searching the Usenet
17536
17537It's, like, too neat to search the Usenet for articles that match a
17538string, but it, like, totally @emph{sucks}, like, totally, to use one of
17539those, like, Web browsers, and you, like, have to, rilly, like, look at
17540the commercials, so, like, with Gnus you can do @emph{rad}, rilly,
17541searches without having to use a browser.
17542
17543The @code{nnweb} back end allows an easy interface to the mighty search
17544engine. You create an @code{nnweb} group, enter a search pattern, and
17545then enter the group and read the articles like you would any normal
17546group. The @kbd{G w} command in the group buffer (@pxref{Foreign
17547Groups}) will do this in an easy-to-use fashion.
17548
17549@code{nnweb} groups don't really lend themselves to being solid
17550groups---they have a very fleeting idea of article numbers. In fact,
17551each time you enter an @code{nnweb} group (not even changing the search
17552pattern), you are likely to get the articles ordered in a different
17553manner. Not even using duplicate suppression (@pxref{Duplicate
17554Suppression}) will help, since @code{nnweb} doesn't even know the
17555@code{Message-ID} of the articles before reading them using some search
17556engines (Google, for instance). The only possible way to keep track
17557of which articles you've read is by scoring on the @code{Date}
17558header---mark all articles posted before the last date you read the
17559group as read.
17560
17561If the search engine changes its output substantially, @code{nnweb}
17562won't be able to parse it and will fail. One could hardly fault the Web
01c52d31 17563providers if they were to do this---their @emph{raison d'@^etre} is to
4009494e
GM
17564make money off of advertisements, not to provide services to the
17565community. Since @code{nnweb} washes the ads off all the articles, one
17566might think that the providers might be somewhat miffed. We'll see.
17567
17568You must have the @code{url} and @code{W3} package or those alternatives
17569(try @code{customize-group} on the @samp{mm-url} variable group)
17570installed to be able to use @code{nnweb}.
17571
17572Virtual server variables:
17573
17574@table @code
17575@item nnweb-type
17576@vindex nnweb-type
17577What search engine type is being used. The currently supported types
17578are @code{google}, @code{dejanews}, and @code{gmane}. Note that
17579@code{dejanews} is an alias to @code{google}.
17580
17581@item nnweb-search
17582@vindex nnweb-search
17583The search string to feed to the search engine.
17584
17585@item nnweb-max-hits
17586@vindex nnweb-max-hits
17587Advisory maximum number of hits per search to display. The default is
17588999.
17589
17590@item nnweb-type-definition
17591@vindex nnweb-type-definition
17592Type-to-definition alist. This alist says what @code{nnweb} should do
17593with the various search engine types. The following elements must be
17594present:
17595
17596@table @code
17597@item article
17598Function to decode the article and provide something that Gnus
17599understands.
17600
17601@item map
17602Function to create an article number to message header and URL alist.
17603
17604@item search
17605Function to send the search string to the search engine.
17606
17607@item address
17608The address the aforementioned function should send the search string
17609to.
17610
17611@item id
17612Format string URL to fetch an article by @code{Message-ID}.
17613@end table
17614
17615@end table
17616
17617
4009494e
GM
17618@node RSS
17619@subsection RSS
17620@cindex nnrss
17621@cindex RSS
17622
17623Some web sites have an RDF Site Summary (@acronym{RSS}).
17624@acronym{RSS} is a format for summarizing headlines from news related
17625sites (such as BBC or CNN). But basically anything list-like can be
17626presented as an @acronym{RSS} feed: weblogs, changelogs or recent
17627changes to a wiki (e.g. @url{http://cliki.net/recent-changes.rdf}).
17628
17629@acronym{RSS} has a quite regular and nice interface, and it's
17630possible to get the information Gnus needs to keep groups updated.
17631
17632Note: you had better use Emacs which supports the @code{utf-8} coding
17633system because @acronym{RSS} uses UTF-8 for encoding non-@acronym{ASCII}
17634text by default. It is also used by default for non-@acronym{ASCII}
17635group names.
17636
17637@kindex G R (Group)
17638Use @kbd{G R} from the group buffer to subscribe to a feed---you will be
17639prompted for the location, the title and the description of the feed.
17640The title, which allows any characters, will be used for the group name
17641and the name of the group data file. The description can be omitted.
17642
17643An easy way to get started with @code{nnrss} is to say something like
17644the following in the group buffer: @kbd{B nnrss RET RET y}, then
17645subscribe to groups.
17646
17647The @code{nnrss} back end saves the group data file in
17648@code{nnrss-directory} (see below) for each @code{nnrss} group. File
17649names containing non-@acronym{ASCII} characters will be encoded by the
17650coding system specified with the @code{nnmail-pathname-coding-system}
26b9f88d
MB
17651variable or other. Also @xref{Non-ASCII Group Names}, for more
17652information.
4009494e
GM
17653
17654The @code{nnrss} back end generates @samp{multipart/alternative}
17655@acronym{MIME} articles in which each contains a @samp{text/plain} part
17656and a @samp{text/html} part.
17657
17658@cindex OPML
17659You can also use the following commands to import and export your
17660subscriptions from a file in @acronym{OPML} format (Outline Processor
17661Markup Language).
17662
17663@defun nnrss-opml-import file
17664Prompt for an @acronym{OPML} file, and subscribe to each feed in the
17665file.
17666@end defun
17667
17668@defun nnrss-opml-export
17669Write your current @acronym{RSS} subscriptions to a buffer in
17670@acronym{OPML} format.
17671@end defun
17672
17673The following @code{nnrss} variables can be altered:
17674
17675@table @code
17676@item nnrss-directory
17677@vindex nnrss-directory
17678The directory where @code{nnrss} stores its files. The default is
17679@file{~/News/rss/}.
17680
17681@item nnrss-file-coding-system
17682@vindex nnrss-file-coding-system
17683The coding system used when reading and writing the @code{nnrss} groups
17684data files. The default is the value of
17685@code{mm-universal-coding-system} (which defaults to @code{emacs-mule}
17686in Emacs or @code{escape-quoted} in XEmacs).
17687
01c52d31
MB
17688@item nnrss-ignore-article-fields
17689@vindex nnrss-ignore-article-fields
17690Some feeds update constantly article fields during their publications,
17691e.g. to indicate the number of comments. However, if there is
17692a difference between the local article and the distant one, the latter
17693is considered to be new. To avoid this and discard some fields, set this
17694variable to the list of fields to be ignored. The default is
17695@code{'(slash:comments)}.
17696
4009494e
GM
17697@item nnrss-use-local
17698@vindex nnrss-use-local
17699@findex nnrss-generate-download-script
17700If you set @code{nnrss-use-local} to @code{t}, @code{nnrss} will read
17701the feeds from local files in @code{nnrss-directory}. You can use
17702the command @code{nnrss-generate-download-script} to generate a
17703download script using @command{wget}.
17704
17705@item nnrss-wash-html-in-text-plain-parts
17706Non-@code{nil} means that @code{nnrss} renders text in @samp{text/plain}
17707parts as @acronym{HTML}. The function specified by the
17708@code{mm-text-html-renderer} variable (@pxref{Display Customization,
17709,Display Customization, emacs-mime, The Emacs MIME Manual}) will be used
17710to render text. If it is @code{nil}, which is the default, text will
17711simply be folded. Leave it @code{nil} if you prefer to see
17712@samp{text/html} parts.
17713@end table
17714
17715The following code may be helpful, if you want to show the description in
17716the summary buffer.
17717
17718@lisp
17719(add-to-list 'nnmail-extra-headers nnrss-description-field)
17720(setq gnus-summary-line-format "%U%R%z%I%(%[%4L: %-15,15f%]%) %s%uX\n")
17721
17722(defun gnus-user-format-function-X (header)
17723 (let ((descr
17724 (assq nnrss-description-field (mail-header-extra header))))
17725 (if descr (concat "\n\t" (cdr descr)) "")))
17726@end lisp
17727
17728The following code may be useful to open an nnrss url directly from the
17729summary buffer.
17730
17731@lisp
17732(require 'browse-url)
17733
01c52d31 17734(defun browse-nnrss-url (arg)
4009494e
GM
17735 (interactive "p")
17736 (let ((url (assq nnrss-url-field
17737 (mail-header-extra
17738 (gnus-data-header
17739 (assq (gnus-summary-article-number)
17740 gnus-newsgroup-data))))))
17741 (if url
17742 (progn
17743 (browse-url (cdr url))
17744 (gnus-summary-mark-as-read-forward 1))
17745 (gnus-summary-scroll-up arg))))
17746
17747(eval-after-load "gnus"
17748 #'(define-key gnus-summary-mode-map
17749 (kbd "<RET>") 'browse-nnrss-url))
17750(add-to-list 'nnmail-extra-headers nnrss-url-field)
17751@end lisp
17752
9b3ebcb6 17753Even if you have added @samp{text/html} to the
4009494e
GM
17754@code{mm-discouraged-alternatives} variable (@pxref{Display
17755Customization, ,Display Customization, emacs-mime, The Emacs MIME
17756Manual}) since you don't want to see @acronym{HTML} parts, it might be
17757more useful especially in @code{nnrss} groups to display
17758@samp{text/html} parts. Here's an example of setting
17759@code{mm-discouraged-alternatives} as a group parameter (@pxref{Group
17760Parameters}) in order to display @samp{text/html} parts only in
17761@code{nnrss} groups:
17762
17763@lisp
17764;; @r{Set the default value of @code{mm-discouraged-alternatives}.}
17765(eval-after-load "gnus-sum"
17766 '(add-to-list
17767 'gnus-newsgroup-variables
17768 '(mm-discouraged-alternatives
17769 . '("text/html" "image/.*"))))
17770
17771;; @r{Display @samp{text/html} parts in @code{nnrss} groups.}
17772(add-to-list
17773 'gnus-parameters
17774 '("\\`nnrss:" (mm-discouraged-alternatives nil)))
17775@end lisp
17776
17777
17778@node Customizing W3
17779@subsection Customizing W3
17780@cindex W3
17781@cindex html
17782@cindex url
17783@cindex Netscape
17784
17785Gnus uses the url library to fetch web pages and Emacs/W3 (or those
17786alternatives) to display web pages. Emacs/W3 is documented in its own
17787manual, but there are some things that may be more relevant for Gnus
17788users.
17789
17790For instance, a common question is how to make Emacs/W3 follow links
17791using the @code{browse-url} functions (which will call some external web
17792browser like Netscape). Here's one way:
17793
17794@lisp
17795(eval-after-load "w3"
17796 '(progn
17797 (fset 'w3-fetch-orig (symbol-function 'w3-fetch))
17798 (defun w3-fetch (&optional url target)
17799 (interactive (list (w3-read-url-with-default)))
17800 (if (eq major-mode 'gnus-article-mode)
17801 (browse-url url)
17802 (w3-fetch-orig url target)))))
17803@end lisp
17804
17805Put that in your @file{.emacs} file, and hitting links in W3-rendered
17806@acronym{HTML} in the Gnus article buffers will use @code{browse-url} to
17807follow the link.
17808
17809
4009494e
GM
17810@node Other Sources
17811@section Other Sources
17812
17813Gnus can do more than just read news or mail. The methods described
17814below allow Gnus to view directories and files as if they were
17815newsgroups.
17816
17817@menu
17818* Directory Groups:: You can read a directory as if it was a newsgroup.
17819* Anything Groups:: Dired? Who needs dired?
17820* Document Groups:: Single files can be the basis of a group.
4009494e
GM
17821* Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
17822@end menu
17823
17824
17825@node Directory Groups
17826@subsection Directory Groups
17827@cindex nndir
17828@cindex directory groups
17829
17830If you have a directory that has lots of articles in separate files in
17831it, you might treat it as a newsgroup. The files have to have numerical
17832names, of course.
17833
17834This might be an opportune moment to mention @code{ange-ftp} (and its
17835successor @code{efs}), that most wonderful of all wonderful Emacs
17836packages. When I wrote @code{nndir}, I didn't think much about it---a
17837back end to read directories. Big deal.
17838
17839@code{ange-ftp} changes that picture dramatically. For instance, if you
17840enter the @code{ange-ftp} file name
17841@file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the directory name,
17842@code{ange-ftp} or @code{efs} will actually allow you to read this
17843directory over at @samp{sina} as a newsgroup. Distributed news ahoy!
17844
17845@code{nndir} will use @acronym{NOV} files if they are present.
17846
17847@code{nndir} is a ``read-only'' back end---you can't delete or expire
17848articles with this method. You can use @code{nnmh} or @code{nnml} for
17849whatever you use @code{nndir} for, so you could switch to any of those
17850methods if you feel the need to have a non-read-only @code{nndir}.
17851
17852
17853@node Anything Groups
17854@subsection Anything Groups
17855@cindex nneething
17856
17857From the @code{nndir} back end (which reads a single spool-like
17858directory), it's just a hop and a skip to @code{nneething}, which
17859pretends that any arbitrary directory is a newsgroup. Strange, but
17860true.
17861
17862When @code{nneething} is presented with a directory, it will scan this
17863directory and assign article numbers to each file. When you enter such
17864a group, @code{nneething} must create ``headers'' that Gnus can use.
17865After all, Gnus is a newsreader, in case you're forgetting.
17866@code{nneething} does this in a two-step process. First, it snoops each
17867file in question. If the file looks like an article (i.e., the first
17868few lines look like headers), it will use this as the head. If this is
17869just some arbitrary file without a head (e.g. a C source file),
17870@code{nneething} will cobble up a header out of thin air. It will use
17871file ownership, name and date and do whatever it can with these
17872elements.
17873
17874All this should happen automatically for you, and you will be presented
17875with something that looks very much like a newsgroup. Totally like a
17876newsgroup, to be precise. If you select an article, it will be displayed
17877in the article buffer, just as usual.
17878
17879If you select a line that represents a directory, Gnus will pop you into
17880a new summary buffer for this @code{nneething} group. And so on. You can
17881traverse the entire disk this way, if you feel like, but remember that
17882Gnus is not dired, really, and does not intend to be, either.
17883
17884There are two overall modes to this action---ephemeral or solid. When
17885doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus
17886will not store information on what files you have read, and what files
17887are new, and so on. If you create a solid @code{nneething} group the
17888normal way with @kbd{G m}, Gnus will store a mapping table between
17889article numbers and file names, and you can treat this group like any
17890other groups. When you activate a solid @code{nneething} group, you will
17891be told how many unread articles it contains, etc., etc.
17892
17893Some variables:
17894
17895@table @code
17896@item nneething-map-file-directory
17897@vindex nneething-map-file-directory
17898All the mapping files for solid @code{nneething} groups will be stored
17899in this directory, which defaults to @file{~/.nneething/}.
17900
17901@item nneething-exclude-files
17902@vindex nneething-exclude-files
17903All files that match this regexp will be ignored. Nice to use to exclude
17904auto-save files and the like, which is what it does by default.
17905
17906@item nneething-include-files
17907@vindex nneething-include-files
17908Regexp saying what files to include in the group. If this variable is
17909non-@code{nil}, only files matching this regexp will be included.
17910
17911@item nneething-map-file
17912@vindex nneething-map-file
17913Name of the map files.
17914@end table
17915
17916
17917@node Document Groups
17918@subsection Document Groups
17919@cindex nndoc
17920@cindex documentation group
17921@cindex help group
17922
17923@code{nndoc} is a cute little thing that will let you read a single file
17924as a newsgroup. Several files types are supported:
17925
17926@table @code
17927@cindex Babyl
4009494e 17928@item babyl
bc79f9ab 17929The Babyl format.
4009494e
GM
17930
17931@cindex mbox
17932@cindex Unix mbox
17933@item mbox
17934The standard Unix mbox file.
17935
17936@cindex MMDF mail box
17937@item mmdf
17938The MMDF mail box format.
17939
17940@item news
17941Several news articles appended into a file.
17942
17943@cindex rnews batch files
17944@item rnews
17945The rnews batch transport format.
17946
17947@item nsmail
17948Netscape mail boxes.
17949
17950@item mime-parts
17951@acronym{MIME} multipart messages.
17952
17953@item standard-digest
17954The standard (RFC 1153) digest format.
17955
17956@item mime-digest
17957A @acronym{MIME} digest of messages.
17958
17959@item lanl-gov-announce
17960Announcement messages from LANL Gov Announce.
17961
17962@cindex forwarded messages
17963@item rfc822-forward
17964A message forwarded according to RFC822.
17965
17966@item outlook
17967The Outlook mail box.
17968
17969@item oe-dbx
17970The Outlook Express dbx mail box.
17971
17972@item exim-bounce
17973A bounce message from the Exim MTA.
17974
17975@item forward
17976A message forwarded according to informal rules.
17977
17978@item rfc934
17979An RFC934-forwarded message.
17980
17981@item mailman
17982A mailman digest.
17983
17984@item clari-briefs
17985A digest of Clarinet brief news items.
17986
17987@item slack-digest
17988Non-standard digest format---matches most things, but does it badly.
17989
17990@item mail-in-mail
17991The last resort.
17992@end table
17993
17994You can also use the special ``file type'' @code{guess}, which means
17995that @code{nndoc} will try to guess what file type it is looking at.
17996@code{digest} means that @code{nndoc} should guess what digest type the
17997file is.
17998
17999@code{nndoc} will not try to change the file or insert any extra headers into
18000it---it will simply, like, let you use the file as the basis for a
18001group. And that's it.
18002
18003If you have some old archived articles that you want to insert into your
18004new & spiffy Gnus mail back end, @code{nndoc} can probably help you with
18005that. Say you have an old @file{RMAIL} file with mail that you now want
18006to split into your new @code{nnml} groups. You look at that file using
18007@code{nndoc} (using the @kbd{G f} command in the group buffer
18008(@pxref{Foreign Groups})), set the process mark on all the articles in
18009the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r})
18010using @code{nnml}. If all goes well, all the mail in the @file{RMAIL}
18011file is now also stored in lots of @code{nnml} directories, and you can
18012delete that pesky @file{RMAIL} file. If you have the guts!
18013
18014Virtual server variables:
18015
18016@table @code
18017@item nndoc-article-type
18018@vindex nndoc-article-type
18019This should be one of @code{mbox}, @code{babyl}, @code{digest},
18020@code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
18021@code{rfc822-forward}, @code{mime-parts}, @code{standard-digest},
18022@code{slack-digest}, @code{clari-briefs}, @code{nsmail}, @code{outlook},
18023@code{oe-dbx}, @code{mailman}, and @code{mail-in-mail} or @code{guess}.
18024
18025@item nndoc-post-type
18026@vindex nndoc-post-type
18027This variable says whether Gnus is to consider the group a news group or
18028a mail group. There are two valid values: @code{mail} (the default)
18029and @code{news}.
18030@end table
18031
18032@menu
18033* Document Server Internals:: How to add your own document types.
18034@end menu
18035
18036
18037@node Document Server Internals
18038@subsubsection Document Server Internals
18039
18040Adding new document types to be recognized by @code{nndoc} isn't
18041difficult. You just have to whip up a definition of what the document
18042looks like, write a predicate function to recognize that document type,
18043and then hook into @code{nndoc}.
18044
18045First, here's an example document type definition:
18046
18047@example
18048(mmdf
18049 (article-begin . "^\^A\^A\^A\^A\n")
18050 (body-end . "^\^A\^A\^A\^A\n"))
18051@end example
18052
18053The definition is simply a unique @dfn{name} followed by a series of
18054regexp pseudo-variable settings. Below are the possible
18055variables---don't be daunted by the number of variables; most document
18056types can be defined with very few settings:
18057
18058@table @code
18059@item first-article
18060If present, @code{nndoc} will skip past all text until it finds
18061something that match this regexp. All text before this will be
18062totally ignored.
18063
18064@item article-begin
18065This setting has to be present in all document type definitions. It
18066says what the beginning of each article looks like. To do more
18067complicated things that cannot be dealt with a simple regexp, you can
18068use @code{article-begin-function} instead of this.
18069
18070@item article-begin-function
18071If present, this should be a function that moves point to the beginning
18072of each article. This setting overrides @code{article-begin}.
18073
18074@item head-begin
18075If present, this should be a regexp that matches the head of the
18076article. To do more complicated things that cannot be dealt with a
18077simple regexp, you can use @code{head-begin-function} instead of this.
18078
18079@item head-begin-function
18080If present, this should be a function that moves point to the head of
18081the article. This setting overrides @code{head-begin}.
18082
18083@item head-end
18084This should match the end of the head of the article. It defaults to
18085@samp{^$}---the empty line.
18086
18087@item body-begin
18088This should match the beginning of the body of the article. It defaults
18089to @samp{^\n}. To do more complicated things that cannot be dealt with
18090a simple regexp, you can use @code{body-begin-function} instead of this.
18091
18092@item body-begin-function
18093If present, this function should move point to the beginning of the body
18094of the article. This setting overrides @code{body-begin}.
18095
18096@item body-end
18097If present, this should match the end of the body of the article. To do
18098more complicated things that cannot be dealt with a simple regexp, you
18099can use @code{body-end-function} instead of this.
18100
18101@item body-end-function
18102If present, this function should move point to the end of the body of
18103the article. This setting overrides @code{body-end}.
18104
18105@item file-begin
18106If present, this should match the beginning of the file. All text
18107before this regexp will be totally ignored.
18108
18109@item file-end
18110If present, this should match the end of the file. All text after this
18111regexp will be totally ignored.
18112
18113@end table
18114
18115So, using these variables @code{nndoc} is able to dissect a document
18116file into a series of articles, each with a head and a body. However, a
18117few more variables are needed since not all document types are all that
18118news-like---variables needed to transform the head or the body into
18119something that's palatable for Gnus:
18120
18121@table @code
18122@item prepare-body-function
18123If present, this function will be called when requesting an article. It
18124will be called with point at the start of the body, and is useful if the
18125document has encoded some parts of its contents.
18126
18127@item article-transform-function
18128If present, this function is called when requesting an article. It's
18129meant to be used for more wide-ranging transformation of both head and
18130body of the article.
18131
18132@item generate-head-function
18133If present, this function is called to generate a head that Gnus can
18134understand. It is called with the article number as a parameter, and is
18135expected to generate a nice head for the article in question. It is
18136called when requesting the headers of all articles.
18137
18138@item generate-article-function
18139If present, this function is called to generate an entire article that
18140Gnus can understand. It is called with the article number as a
18141parameter when requesting all articles.
18142
18143@item dissection-function
18144If present, this function is called to dissect a document by itself,
18145overriding @code{first-article}, @code{article-begin},
18146@code{article-begin-function}, @code{head-begin},
18147@code{head-begin-function}, @code{head-end}, @code{body-begin},
18148@code{body-begin-function}, @code{body-end}, @code{body-end-function},
18149@code{file-begin}, and @code{file-end}.
18150
18151@end table
18152
18153Let's look at the most complicated example I can come up with---standard
18154digests:
18155
18156@example
18157(standard-digest
18158 (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+"))
18159 (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+"))
18160 (prepare-body-function . nndoc-unquote-dashes)
18161 (body-end-function . nndoc-digest-body-end)
18162 (head-end . "^ ?$")
18163 (body-begin . "^ ?\n")
18164 (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
18165 (subtype digest guess))
18166@end example
18167
18168We see that all text before a 70-width line of dashes is ignored; all
18169text after a line that starts with that @samp{^End of} is also ignored;
18170each article begins with a 30-width line of dashes; the line separating
18171the head from the body may contain a single space; and that the body is
18172run through @code{nndoc-unquote-dashes} before being delivered.
18173
18174To hook your own document definition into @code{nndoc}, use the
18175@code{nndoc-add-type} function. It takes two parameters---the first
18176is the definition itself and the second (optional) parameter says
18177where in the document type definition alist to put this definition.
18178The alist is traversed sequentially, and
18179@code{nndoc-@var{type}-type-p} is called for a given type @var{type}.
18180So @code{nndoc-mmdf-type-p} is called to see whether a document is of
18181@code{mmdf} type, and so on. These type predicates should return
18182@code{nil} if the document is not of the correct type; @code{t} if it
18183is of the correct type; and a number if the document might be of the
18184correct type. A high number means high probability; a low number
18185means low probability with @samp{0} being the lowest valid number.
18186
18187
4009494e
GM
18188@node Mail-To-News Gateways
18189@subsection Mail-To-News Gateways
18190@cindex mail-to-news gateways
18191@cindex gateways
18192
18193If your local @code{nntp} server doesn't allow posting, for some reason
18194or other, you can post using one of the numerous mail-to-news gateways.
18195The @code{nngateway} back end provides the interface.
18196
18197Note that you can't read anything from this back end---it can only be
18198used to post with.
18199
18200Server variables:
18201
18202@table @code
18203@item nngateway-address
18204@vindex nngateway-address
18205This is the address of the mail-to-news gateway.
18206
18207@item nngateway-header-transformation
18208@vindex nngateway-header-transformation
18209News headers often have to be transformed in some odd way or other
18210for the mail-to-news gateway to accept it. This variable says what
18211transformation should be called, and defaults to
18212@code{nngateway-simple-header-transformation}. The function is called
18213narrowed to the headers to be transformed and with one parameter---the
18214gateway address.
18215
18216This default function just inserts a new @code{To} header based on the
18217@code{Newsgroups} header and the gateway address.
18218For instance, an article with this @code{Newsgroups} header:
18219
18220@example
18221Newsgroups: alt.religion.emacs
18222@end example
18223
18224will get this @code{To} header inserted:
18225
18226@example
18227To: alt-religion-emacs@@GATEWAY
18228@end example
18229
18230The following pre-defined functions exist:
18231
18232@findex nngateway-simple-header-transformation
18233@table @code
18234
18235@item nngateway-simple-header-transformation
18236Creates a @code{To} header that looks like
18237@var{newsgroup}@@@code{nngateway-address}.
18238
18239@findex nngateway-mail2news-header-transformation
18240
18241@item nngateway-mail2news-header-transformation
18242Creates a @code{To} header that looks like
18243@code{nngateway-address}.
18244@end table
18245
18246@end table
18247
18248Here's an example:
18249
18250@lisp
18251(setq gnus-post-method
18252 '(nngateway
18253 "mail2news@@replay.com"
18254 (nngateway-header-transformation
18255 nngateway-mail2news-header-transformation)))
18256@end lisp
18257
18258So, to use this, simply say something like:
18259
18260@lisp
18261(setq gnus-post-method '(nngateway "GATEWAY.ADDRESS"))
18262@end lisp
18263
18264
18265
18266@node Combined Groups
18267@section Combined Groups
18268
18269Gnus allows combining a mixture of all the other group types into bigger
18270groups.
18271
18272@menu
18273* Virtual Groups:: Combining articles from many groups.
4009494e
GM
18274@end menu
18275
18276
18277@node Virtual Groups
18278@subsection Virtual Groups
18279@cindex nnvirtual
18280@cindex virtual groups
18281@cindex merging groups
18282
18283An @dfn{nnvirtual group} is really nothing more than a collection of
18284other groups.
18285
18286For instance, if you are tired of reading many small groups, you can
18287put them all in one big group, and then grow tired of reading one
18288big, unwieldy group. The joys of computing!
18289
18290You specify @code{nnvirtual} as the method. The address should be a
18291regexp to match component groups.
18292
18293All marks in the virtual group will stick to the articles in the
18294component groups. So if you tick an article in a virtual group, the
18295article will also be ticked in the component group from whence it
18296came. (And vice versa---marks from the component groups will also be
18297shown in the virtual group.). To create an empty virtual group, run
18298@kbd{G V} (@code{gnus-group-make-empty-virtual}) in the group buffer
18299and edit the method regexp with @kbd{M-e}
18300(@code{gnus-group-edit-group-method})
18301
18302Here's an example @code{nnvirtual} method that collects all Andrea Dworkin
18303newsgroups into one, big, happy newsgroup:
18304
18305@lisp
18306(nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*")
18307@end lisp
18308
18309The component groups can be native or foreign; everything should work
18310smoothly, but if your computer explodes, it was probably my fault.
18311
18312Collecting the same group from several servers might actually be a good
18313idea if users have set the Distribution header to limit distribution.
18314If you would like to read @samp{soc.motss} both from a server in Japan
18315and a server in Norway, you could use the following as the group regexp:
18316
18317@example
18318"^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$"
18319@end example
18320
18321(Remember, though, that if you're creating the group with @kbd{G m}, you
18322shouldn't double the backslashes, and you should leave off the quote
18323characters at the beginning and the end of the string.)
18324
18325This should work kinda smoothly---all articles from both groups should
18326end up in this one, and there should be no duplicates. Threading (and
18327the rest) will still work as usual, but there might be problems with the
18328sequence of articles. Sorting on date might be an option here
18329(@pxref{Selecting a Group}).
18330
18331One limitation, however---all groups included in a virtual
18332group have to be alive (i.e., subscribed or unsubscribed). Killed or
18333zombie groups can't be component groups for @code{nnvirtual} groups.
18334
18335@vindex nnvirtual-always-rescan
18336If the @code{nnvirtual-always-rescan} variable is non-@code{nil} (which
18337is the default), @code{nnvirtual} will always scan groups for unread
18338articles when entering a virtual group. If this variable is @code{nil}
18339and you read articles in a component group after the virtual group has
18340been activated, the read articles from the component group will show up
18341when you enter the virtual group. You'll also see this effect if you
18342have two virtual groups that have a component group in common. If
18343that's the case, you should set this variable to @code{t}. Or you can
18344just tap @code{M-g} on the virtual group every time before you enter
18345it---it'll have much the same effect.
18346
18347@code{nnvirtual} can have both mail and news groups as component groups.
18348When responding to articles in @code{nnvirtual} groups, @code{nnvirtual}
18349has to ask the back end of the component group the article comes from
18350whether it is a news or mail back end. However, when you do a @kbd{^},
18351there is typically no sure way for the component back end to know this,
18352and in that case @code{nnvirtual} tells Gnus that the article came from a
18353not-news back end. (Just to be on the safe side.)
18354
18355@kbd{C-c C-n} in the message buffer will insert the @code{Newsgroups}
18356line from the article you respond to in these cases.
18357
18358@code{nnvirtual} groups do not inherit anything but articles and marks
18359from component groups---group parameters, for instance, are not
18360inherited.
18361
18362
4009494e
GM
18363@node Email Based Diary
18364@section Email Based Diary
18365@cindex diary
18366@cindex email based diary
18367@cindex calendar
18368
18369This section describes a special mail back end called @code{nndiary},
18370and its companion library @code{gnus-diary}. It is ``special'' in the
18371sense that it is not meant to be one of the standard alternatives for
18372reading mail with Gnus. See @ref{Choosing a Mail Back End} for that.
18373Instead, it is used to treat @emph{some} of your mails in a special way,
18374namely, as event reminders.
18375
18376Here is a typical scenario:
18377
18378@itemize @bullet
18379@item
18380You've got a date with Andy Mc Dowell or Bruce Willis (select according
18381to your sexual preference) in one month. You don't want to forget it.
18382@item
18383So you send a ``reminder'' message (actually, a diary one) to yourself.
18384@item
18385You forget all about it and keep on getting and reading new mail, as usual.
18386@item
18387From time to time, as you type `g' in the group buffer and as the date
18388is getting closer, the message will pop up again to remind you of your
18389appointment, just as if it were new and unread.
18390@item
18391Read your ``new'' messages, this one included, and start dreaming again
18392of the night you're gonna have.
18393@item
18394Once the date is over (you actually fell asleep just after dinner), the
18395message will be automatically deleted if it is marked as expirable.
18396@end itemize
18397
18398The Gnus Diary back end has the ability to handle regular appointments
18399(that wouldn't ever be deleted) as well as punctual ones, operates as a
18400real mail back end and is configurable in many ways. All of this is
18401explained in the sections below.
18402
18403@menu
18404* The NNDiary Back End:: Basic setup and usage.
18405* The Gnus Diary Library:: Utility toolkit on top of nndiary.
18406* Sending or Not Sending:: A final note on sending diary messages.
18407@end menu
18408
18409
18410@node The NNDiary Back End
18411@subsection The NNDiary Back End
18412@cindex nndiary
18413@cindex the nndiary back end
18414
18415@code{nndiary} is a back end very similar to @code{nnml} (@pxref{Mail
18416Spool}). Actually, it could appear as a mix of @code{nnml} and
18417@code{nndraft}. If you know @code{nnml}, you're already familiar with
18418the message storing scheme of @code{nndiary}: one file per message, one
18419directory per group.
18420
18421 Before anything, there is one requirement to be able to run
18422@code{nndiary} properly: you @emph{must} use the group timestamp feature
18423of Gnus. This adds a timestamp to each group's parameters. @ref{Group
18424Timestamp} to see how it's done.
18425
18426@menu
18427* Diary Messages:: What makes a message valid for nndiary.
18428* Running NNDiary:: NNDiary has two modes of operation.
18429* Customizing NNDiary:: Bells and whistles.
18430@end menu
18431
18432@node Diary Messages
18433@subsubsection Diary Messages
18434@cindex nndiary messages
18435@cindex nndiary mails
18436
18437@code{nndiary} messages are just normal ones, except for the mandatory
18438presence of 7 special headers. These headers are of the form
18439@code{X-Diary-<something>}, @code{<something>} being one of
18440@code{Minute}, @code{Hour}, @code{Dom}, @code{Month}, @code{Year},
18441@code{Time-Zone} and @code{Dow}. @code{Dom} means ``Day of Month'', and
18442@code{dow} means ``Day of Week''. These headers actually behave like
18443crontab specifications and define the event date(s):
18444
18445@itemize @bullet
18446@item
18447For all headers except the @code{Time-Zone} one, a header value is
18448either a star (meaning all possible values), or a list of fields
18449(separated by a comma).
18450@item
18451A field is either an integer, or a range.
18452@item
18453A range is two integers separated by a dash.
18454@item
18455Possible integer values are 0--59 for @code{Minute}, 0--23 for
18456@code{Hour}, 1--31 for @code{Dom}, 1--12 for @code{Month}, above 1971
18457for @code{Year} and 0--6 for @code{Dow} (0 meaning Sunday).
18458@item
18459As a special case, a star in either @code{Dom} or @code{Dow} doesn't
18460mean ``all possible values'', but ``use only the other field''. Note
18461that if both are star'ed, the use of either one gives the same result.
18462@item
18463The @code{Time-Zone} header is special in that it can only have one
18464value (@code{GMT}, for instance). A star doesn't mean ``all possible
18465values'' (because it makes no sense), but ``the current local time
18466zone''. Most of the time, you'll be using a star here. However, for a
18467list of available time zone values, see the variable
18468@code{nndiary-headers}.
18469@end itemize
18470
18471As a concrete example, here are the diary headers to add to your message
18472for specifying ``Each Monday and each 1st of month, at 12:00, 20:00,
1847321:00, 22:00, 23:00 and 24:00, from 1999 to 2010'' (I'll let you find
18474what to do then):
18475
18476@example
18477X-Diary-Minute: 0
18478X-Diary-Hour: 12, 20-24
18479X-Diary-Dom: 1
18480X-Diary-Month: *
18481X-Diary-Year: 1999-2010
18482X-Diary-Dow: 1
18483X-Diary-Time-Zone: *
18484@end example
18485
18486@node Running NNDiary
18487@subsubsection Running NNDiary
18488@cindex running nndiary
18489@cindex nndiary operation modes
18490
18491@code{nndiary} has two modes of operation: ``traditional'' (the default)
18492and ``autonomous''. In traditional mode, @code{nndiary} does not get new
18493mail by itself. You have to move (@kbd{B m}) or copy (@kbd{B c}) mails
18494from your primary mail back end to nndiary groups in order to handle them
18495as diary messages. In autonomous mode, @code{nndiary} retrieves its own
18496mail and handles it independently from your primary mail back end.
18497
18498One should note that Gnus is not inherently designed to allow several
18499``master'' mail back ends at the same time. However, this does make
18500sense with @code{nndiary}: you really want to send and receive diary
18501messages to your diary groups directly. So, @code{nndiary} supports
18502being sort of a ``second primary mail back end'' (to my knowledge, it is
18503the only back end offering this feature). However, there is a limitation
18504(which I hope to fix some day): respooling doesn't work in autonomous
18505mode.
18506
18507In order to use @code{nndiary} in autonomous mode, you have several
18508things to do:
18509
18510@itemize @bullet
18511@item
18512Allow @code{nndiary} to retrieve new mail by itself. Put the following
18513line in your @file{~/.gnus.el} file:
18514
18515@lisp
18516(setq nndiary-get-new-mail t)
18517@end lisp
18518@item
18519You must arrange for diary messages (those containing @code{X-Diary-*}
18520headers) to be split in a private folder @emph{before} Gnus treat them.
18521Again, this is needed because Gnus cannot (yet ?) properly handle
18522multiple primary mail back ends. Getting those messages from a separate
18523source will compensate this misfeature to some extent.
18524
18525As an example, here's my procmailrc entry to store diary files in
18526@file{~/.nndiary} (the default @code{nndiary} mail source file):
18527
18528@example
18529:0 HD :
18530* ^X-Diary
18531.nndiary
18532@end example
18533@end itemize
18534
18535Once this is done, you might want to customize the following two options
18536that affect the diary mail retrieval and splitting processes:
18537
18538@defvar nndiary-mail-sources
18539This is the diary-specific replacement for the standard
18540@code{mail-sources} variable. It obeys the same syntax, and defaults to
18541@code{(file :path "~/.nndiary")}.
18542@end defvar
18543
18544@defvar nndiary-split-methods
18545This is the diary-specific replacement for the standard
18546@code{nnmail-split-methods} variable. It obeys the same syntax.
18547@end defvar
18548
18549 Finally, you may add a permanent @code{nndiary} virtual server
18550(something like @code{(nndiary "diary")} should do) to your
18551@code{gnus-secondary-select-methods}.
18552
18553 Hopefully, almost everything (see the TODO section in
18554@file{nndiary.el}) will work as expected when you restart Gnus: in
18555autonomous mode, typing @kbd{g} and @kbd{M-g} in the group buffer, will
18556also get your new diary mails and split them according to your
18557diary-specific rules, @kbd{F} will find your new diary groups etc.
18558
18559@node Customizing NNDiary
18560@subsubsection Customizing NNDiary
18561@cindex customizing nndiary
18562@cindex nndiary customization
18563
18564Now that @code{nndiary} is up and running, it's time to customize it.
18565The custom group is called @code{nndiary} (no, really ?!). You should
18566browse it to figure out which options you'd like to tweak. The following
18567two variables are probably the only ones you will want to change:
18568
18569@defvar nndiary-reminders
18570This is the list of times when you want to be reminded of your
18571appointments (e.g. 3 weeks before, then 2 days before, then 1 hour
18572before and that's it). Remember that ``being reminded'' means that the
18573diary message will pop up as brand new and unread again when you get new
18574mail.
18575@end defvar
18576
18577@defvar nndiary-week-starts-on-monday
18578Rather self-explanatory. Otherwise, Sunday is assumed (this is the
18579default).
18580@end defvar
18581
18582
18583@node The Gnus Diary Library
18584@subsection The Gnus Diary Library
18585@cindex gnus-diary
18586@cindex the gnus diary library
18587
18588Using @code{nndiary} manually (I mean, writing the headers by hand and
18589so on) would be rather boring. Fortunately, there is a library called
18590@code{gnus-diary} written on top of @code{nndiary}, that does many
18591useful things for you.
18592
18593 In order to use it, add the following line to your @file{~/.gnus.el} file:
18594
18595@lisp
18596(require 'gnus-diary)
18597@end lisp
18598
18599 Also, you shouldn't use any @code{gnus-user-format-function-[d|D]}
18600(@pxref{Summary Buffer Lines}). @code{gnus-diary} provides both of these
18601(sorry if you used them before).
18602
18603
18604@menu
18605* Diary Summary Line Format:: A nicer summary buffer line format.
18606* Diary Articles Sorting:: A nicer way to sort messages.
18607* Diary Headers Generation:: Not doing it manually.
18608* Diary Group Parameters:: Not handling them manually.
18609@end menu
18610
18611@node Diary Summary Line Format
18612@subsubsection Diary Summary Line Format
18613@cindex diary summary buffer line
18614@cindex diary summary line format
18615
18616Displaying diary messages in standard summary line format (usually
18617something like @samp{From Joe: Subject}) is pretty useless. Most of
18618the time, you're the one who wrote the message, and you mostly want to
18619see the event's date.
18620
18621 @code{gnus-diary} provides two supplemental user formats to be used in
18622summary line formats. @code{D} corresponds to a formatted time string
18623for the next occurrence of the event (e.g. ``Sat, Sep 22 01, 12:00''),
18624while @code{d} corresponds to an approximative remaining time until the
18625next occurrence of the event (e.g. ``in 6 months, 1 week'').
18626
18627 For example, here's how Joe's birthday is displayed in my
18628@code{nndiary+diary:birthdays} summary buffer (note that the message is
18629expirable, but will never be deleted, as it specifies a periodic event):
18630
18631@example
18632 E Sat, Sep 22 01, 12:00: Joe's birthday (in 6 months, 1 week)
18633@end example
18634
18635In order to get something like the above, you would normally add the
18636following line to your diary groups'parameters:
18637
18638@lisp
18639(gnus-summary-line-format "%U%R%z %uD: %(%s%) (%ud)\n")
18640@end lisp
18641
18642However, @code{gnus-diary} does it automatically (@pxref{Diary Group
18643Parameters}). You can however customize the provided summary line format
18644with the following user options:
18645
18646@defvar gnus-diary-summary-line-format
18647Defines the summary line format used for diary groups (@pxref{Summary
18648Buffer Lines}). @code{gnus-diary} uses it to automatically update the
18649diary groups'parameters.
18650@end defvar
18651
18652@defvar gnus-diary-time-format
18653Defines the format to display dates in diary summary buffers. This is
18654used by the @code{D} user format. See the docstring for details.
18655@end defvar
18656
18657@defvar gnus-diary-delay-format-function
18658Defines the format function to use for displaying delays (remaining
18659times) in diary summary buffers. This is used by the @code{d} user
18660format. There are currently built-in functions for English and French;
18661you can also define your own. See the docstring for details.
18662@end defvar
18663
18664@node Diary Articles Sorting
18665@subsubsection Diary Articles Sorting
18666@cindex diary articles sorting
18667@cindex diary summary lines sorting
18668@findex gnus-summary-sort-by-schedule
18669@findex gnus-thread-sort-by-schedule
18670@findex gnus-article-sort-by-schedule
18671
18672@code{gnus-diary} provides new sorting functions (@pxref{Sorting the
18673Summary Buffer} ) called @code{gnus-summary-sort-by-schedule},
18674@code{gnus-thread-sort-by-schedule} and
18675@code{gnus-article-sort-by-schedule}. These functions let you organize
18676your diary summary buffers from the closest event to the farthest one.
18677
18678@code{gnus-diary} automatically installs
18679@code{gnus-summary-sort-by-schedule} as a menu item in the summary
18680buffer's ``sort'' menu, and the two others as the primary (hence
18681default) sorting functions in the group parameters (@pxref{Diary Group
18682Parameters}).
18683
18684@node Diary Headers Generation
18685@subsubsection Diary Headers Generation
18686@cindex diary headers generation
18687@findex gnus-diary-check-message
18688
18689@code{gnus-diary} provides a function called
18690@code{gnus-diary-check-message} to help you handle the @code{X-Diary-*}
18691headers. This function ensures that the current message contains all the
18692required diary headers, and prompts you for values or corrections if
18693needed.
18694
18695 This function is hooked into the @code{nndiary} back end, so that
18696moving or copying an article to a diary group will trigger it
d55fe5bb
MB
18697automatically. It is also bound to @kbd{C-c C-f d} in
18698@code{message-mode} and @code{article-edit-mode} in order to ease the
18699process of converting a usual mail to a diary one.
4009494e
GM
18700
18701 This function takes a prefix argument which will force prompting of
18702all diary headers, regardless of their presence or validity. That way,
18703you can very easily reschedule an already valid diary message, for
18704instance.
18705
18706@node Diary Group Parameters
18707@subsubsection Diary Group Parameters
18708@cindex diary group parameters
18709
18710When you create a new diary group, or visit one, @code{gnus-diary}
18711automatically checks your group parameters and if needed, sets the
18712summary line format to the diary-specific value, installs the
18713diary-specific sorting functions, and also adds the different
18714@code{X-Diary-*} headers to the group's posting-style. It is then easier
18715to send a diary message, because if you use @kbd{C-u a} or @kbd{C-u m}
18716on a diary group to prepare a message, these headers will be inserted
18717automatically (although not filled with proper values yet).
18718
18719@node Sending or Not Sending
18720@subsection Sending or Not Sending
18721
18722Well, assuming you've read all of the above, here are two final notes on
18723mail sending with @code{nndiary}:
18724
18725@itemize @bullet
18726@item
18727@code{nndiary} is a @emph{real} mail back end. You really send real diary
18728messsages for real. This means for instance that you can give
18729appointments to anybody (provided they use Gnus and @code{nndiary}) by
18730sending the diary message to them as well.
18731@item
18732However, since @code{nndiary} also has a @code{request-post} method, you
18733can also use @kbd{C-u a} instead of @kbd{C-u m} on a diary group and the
18734message won't actually be sent; just stored locally in the group. This
18735comes in very handy for private appointments.
18736@end itemize
18737
18738@node Gnus Unplugged
18739@section Gnus Unplugged
18740@cindex offline
18741@cindex unplugged
18742@cindex agent
18743@cindex Gnus agent
18744@cindex Gnus unplugged
18745
18746In olden times (ca. February '88), people used to run their newsreaders
18747on big machines with permanent connections to the net. News transport
18748was dealt with by news servers, and all the newsreaders had to do was to
18749read news. Believe it or not.
18750
18751Nowadays most people read news and mail at home, and use some sort of
18752modem to connect to the net. To avoid running up huge phone bills, it
18753would be nice to have a way to slurp down all the news and mail, hang up
18754the phone, read for several hours, and then upload any responses you
18755have to make. And then you repeat the procedure.
18756
18757Of course, you can use news servers for doing this as well. I've used
18758@code{inn} together with @code{slurp}, @code{pop} and @code{sendmail}
18759for some years, but doing that's a bore. Moving the news server
18760functionality up to the newsreader makes sense if you're the only person
18761reading news on a machine.
18762
18763Setting up Gnus as an ``offline'' newsreader is quite simple. In
01c52d31
MB
18764fact, you don't have to configure anything as the agent is now enabled
18765by default (@pxref{Agent Variables, gnus-agent}).
4009494e
GM
18766
18767Of course, to use it as such, you have to learn a few new commands.
18768
18769@menu
18770* Agent Basics:: How it all is supposed to work.
18771* Agent Categories:: How to tell the Gnus Agent what to download.
18772* Agent Commands:: New commands for all the buffers.
18773* Agent Visuals:: Ways that the agent may effect your summary buffer.
18774* Agent as Cache:: The Agent is a big cache too.
18775* Agent Expiry:: How to make old articles go away.
18776* Agent Regeneration:: How to recover from lost connections and other accidents.
01c52d31 18777* Agent and flags:: How the Agent maintains flags.
4009494e
GM
18778* Agent and IMAP:: How to use the Agent with @acronym{IMAP}.
18779* Outgoing Messages:: What happens when you post/mail something?
18780* Agent Variables:: Customizing is fun.
18781* Example Setup:: An example @file{~/.gnus.el} file for offline people.
18782* Batching Agents:: How to fetch news from a @code{cron} job.
18783* Agent Caveats:: What you think it'll do and what it does.
18784@end menu
18785
18786
18787@node Agent Basics
18788@subsection Agent Basics
18789
18790First, let's get some terminology out of the way.
18791
18792The Gnus Agent is said to be @dfn{unplugged} when you have severed the
18793connection to the net (and notified the Agent that this is the case).
18794When the connection to the net is up again (and Gnus knows this), the
18795Agent is @dfn{plugged}.
18796
18797The @dfn{local} machine is the one you're running on, and which isn't
18798connected to the net continuously.
18799
18800@dfn{Downloading} means fetching things from the net to your local
18801machine. @dfn{Uploading} is doing the opposite.
18802
18803You know that Gnus gives you all the opportunity you'd ever want for
18804shooting yourself in the foot. Some people call it flexibility. Gnus
18805is also customizable to a great extent, which means that the user has a
18806say on how Gnus behaves. Other newsreaders might unconditionally shoot
18807you in your foot, but with Gnus, you have a choice!
18808
18809Gnus is never really in plugged or unplugged state. Rather, it applies
18810that state to each server individually. This means that some servers
18811can be plugged while others can be unplugged. Additionally, some
18812servers can be ignored by the Agent altogether (which means that
18813they're kinda like plugged always).
18814
18815So when you unplug the Agent and then wonder why is Gnus opening a
18816connection to the Net, the next step to do is to look whether all
18817servers are agentized. If there is an unagentized server, you found
18818the culprit.
18819
18820Another thing is the @dfn{offline} state. Sometimes, servers aren't
18821reachable. When Gnus notices this, it asks you whether you want the
18822server to be switched to offline state. If you say yes, then the
18823server will behave somewhat as if it was unplugged, except that Gnus
18824will ask you whether you want to switch it back online again.
18825
18826Let's take a typical Gnus session using the Agent.
18827
18828@itemize @bullet
18829
18830@item
18831@findex gnus-unplugged
18832You start Gnus with @code{gnus-unplugged}. This brings up the Gnus
18833Agent in a disconnected state. You can read all the news that you have
18834already fetched while in this mode.
18835
18836@item
18837You then decide to see whether any new news has arrived. You connect
18838your machine to the net (using PPP or whatever), and then hit @kbd{J j}
18839to make Gnus become @dfn{plugged} and use @kbd{g} to check for new mail
18840as usual. To check for new mail in unplugged mode (@pxref{Mail
18841Source Specifiers}).
18842
18843@item
18844You can then read the new news immediately, or you can download the
18845news onto your local machine. If you want to do the latter, you press
18846@kbd{g} to check if there are any new news and then @kbd{J s} to fetch
18847all the eligible articles in all the groups. (To let Gnus know which
18848articles you want to download, @pxref{Agent Categories}).
18849
18850@item
18851After fetching the articles, you press @kbd{J j} to make Gnus become
18852unplugged again, and you shut down the PPP thing (or whatever). And
18853then you read the news offline.
18854
18855@item
18856And then you go to step 2.
18857@end itemize
18858
18859Here are some things you should do the first time (or so) that you use
18860the Agent.
18861
18862@itemize @bullet
18863
18864@item
18865Decide which servers should be covered by the Agent. If you have a mail
18866back end, it would probably be nonsensical to have it covered by the
18867Agent. Go to the server buffer (@kbd{^} in the group buffer) and press
18868@kbd{J a} on the server (or servers) that you wish to have covered by the
18869Agent (@pxref{Server Agent Commands}), or @kbd{J r} on automatically
18870added servers you do not wish to have covered by the Agent. By default,
18871all @code{nntp} and @code{nnimap} servers in @code{gnus-select-method} and
18872@code{gnus-secondary-select-methods} are agentized.
18873
18874@item
18875Decide on download policy. It's fairly simple once you decide whether
18876you are going to use agent categories, topic parameters, and/or group
18877parameters to implement your policy. If you're new to gnus, it
18878is probably best to start with a category, @xref{Agent Categories}.
18879
18880Both topic parameters (@pxref{Topic Parameters}) and agent categories
18881(@pxref{Agent Categories}) provide for setting a policy that applies
18882to multiple groups. Which you use is entirely up to you. Topic
18883parameters do override categories so, if you mix the two, you'll have
18884to take that into account. If you have a few groups that deviate from
18885your policy, you can use group parameters (@pxref{Group Parameters}) to
18886configure them.
18887
18888@item
18889Uhm@dots{} that's it.
18890@end itemize
18891
18892
18893@node Agent Categories
18894@subsection Agent Categories
18895
18896One of the main reasons to integrate the news transport layer into the
18897newsreader is to allow greater control over what articles to download.
18898There's not much point in downloading huge amounts of articles, just to
18899find out that you're not interested in reading any of them. It's better
18900to be somewhat more conservative in choosing what to download, and then
18901mark the articles for downloading manually if it should turn out that
18902you're interested in the articles anyway.
18903
18904One of the more effective methods for controlling what is to be
18905downloaded is to create a @dfn{category} and then assign some (or all)
18906groups to this category. Groups that do not belong in any other
18907category belong to the @code{default} category. Gnus has its own
18908buffer for creating and managing categories.
18909
18910If you prefer, you can also use group parameters (@pxref{Group
18911Parameters}) and topic parameters (@pxref{Topic Parameters}) for an
18912alternative approach to controlling the agent. The only real
18913difference is that categories are specific to the agent (so there is
18914less to learn) while group and topic parameters include the kitchen
18915sink.
18916
18917Since you can set agent parameters in several different places we have
18918a rule to decide which source to believe. This rule specifies that
18919the parameter sources are checked in the following order: group
18920parameters, topic parameters, agent category, and finally customizable
18921variables. So you can mix all of these sources to produce a wide range
18922of behavior, just don't blame me if you don't remember where you put
18923your settings.
18924
18925@menu
18926* Category Syntax:: What a category looks like.
18927* Category Buffer:: A buffer for maintaining categories.
18928* Category Variables:: Customize'r'Us.
18929@end menu
18930
18931
18932@node Category Syntax
18933@subsubsection Category Syntax
18934
18935A category consists of a name, the list of groups belonging to the
18936category, and a number of optional parameters that override the
18937customizable variables. The complete list of agent parameters are
18938listed below.
18939
18940@cindex Agent Parameters
18941@table @code
01c52d31 18942@item agent-groups
4009494e
GM
18943The list of groups that are in this category.
18944
01c52d31 18945@item agent-predicate
4009494e
GM
18946A predicate which (generally) gives a rough outline of which articles
18947are eligible for downloading; and
18948
01c52d31 18949@item agent-score
4009494e
GM
18950a score rule which (generally) gives you a finer granularity when
18951deciding what articles to download. (Note that this @dfn{download
18952score} is not necessarily related to normal scores.)
18953
01c52d31 18954@item agent-enable-expiration
4009494e
GM
18955a boolean indicating whether the agent should expire old articles in
18956this group. Most groups should be expired to conserve disk space. In
18957fact, its probably safe to say that the gnus.* hierarchy contains the
18958only groups that should not be expired.
18959
01c52d31 18960@item agent-days-until-old
4009494e
GM
18961an integer indicating the number of days that the agent should wait
18962before deciding that a read article is safe to expire.
18963
01c52d31 18964@item agent-low-score
4009494e
GM
18965an integer that overrides the value of @code{gnus-agent-low-score}.
18966
01c52d31 18967@item agent-high-score
4009494e
GM
18968an integer that overrides the value of @code{gnus-agent-high-score}.
18969
01c52d31 18970@item agent-short-article
4009494e
GM
18971an integer that overrides the value of
18972@code{gnus-agent-short-article}.
18973
01c52d31 18974@item agent-long-article
4009494e
GM
18975an integer that overrides the value of @code{gnus-agent-long-article}.
18976
01c52d31 18977@item agent-enable-undownloaded-faces
4009494e 18978a symbol indicating whether the summary buffer should display
01c52d31
MB
18979undownloaded articles using the @code{gnus-summary-*-undownloaded-face}
18980faces. Any symbol other than @code{nil} will enable the use of
18981undownloaded faces.
4009494e
GM
18982@end table
18983
18984The name of a category can not be changed once the category has been
18985created.
18986
18987Each category maintains a list of groups that are exclusive members of
18988that category. The exclusivity rule is automatically enforced, add a
18989group to a new category and it is automatically removed from its old
18990category.
18991
18992A predicate in its simplest form can be a single predicate such as
18993@code{true} or @code{false}. These two will download every available
18994article or nothing respectively. In the case of these two special
18995predicates an additional score rule is superfluous.
18996
18997Predicates of @code{high} or @code{low} download articles in respect of
18998their scores in relationship to @code{gnus-agent-high-score} and
18999@code{gnus-agent-low-score} as described below.
19000
19001To gain even finer control of what is to be regarded eligible for
19002download a predicate can consist of a number of predicates with logical
19003operators sprinkled in between.
19004
19005Perhaps some examples are in order.
19006
19007Here's a simple predicate. (It's the default predicate, in fact, used
19008for all groups that don't belong to any other category.)
19009
19010@lisp
19011short
19012@end lisp
19013
19014Quite simple, eh? This predicate is true if and only if the article is
19015short (for some value of ``short'').
19016
19017Here's a more complex predicate:
19018
19019@lisp
19020(or high
19021 (and
19022 (not low)
19023 (not long)))
19024@end lisp
19025
19026This means that an article should be downloaded if it has a high score,
19027or if the score is not low and the article is not long. You get the
19028drift.
19029
19030The available logical operators are @code{or}, @code{and} and
19031@code{not}. (If you prefer, you can use the more ``C''-ish operators
19032@samp{|}, @code{&} and @code{!} instead.)
19033
19034The following predicates are pre-defined, but if none of these fit what
19035you want to do, you can write your own.
19036
19037When evaluating each of these predicates, the named constant will be
19038bound to the value determined by calling
19039@code{gnus-agent-find-parameter} on the appropriate parameter. For
19040example, gnus-agent-short-article will be bound to
19041@code{(gnus-agent-find-parameter group 'agent-short-article)}. This
19042means that you can specify a predicate in your category then tune that
19043predicate to individual groups.
19044
19045@table @code
19046@item short
19047True if the article is shorter than @code{gnus-agent-short-article}
19048lines; default 100.
19049
19050@item long
19051True if the article is longer than @code{gnus-agent-long-article}
19052lines; default 200.
19053
19054@item low
19055True if the article has a download score less than
19056@code{gnus-agent-low-score}; default 0.
19057
19058@item high
19059True if the article has a download score greater than
19060@code{gnus-agent-high-score}; default 0.
19061
19062@item spam
19063True if the Gnus Agent guesses that the article is spam. The
19064heuristics may change over time, but at present it just computes a
19065checksum and sees whether articles match.
19066
19067@item true
19068Always true.
19069
19070@item false
19071Always false.
19072@end table
19073
19074If you want to create your own predicate function, here's what you have
19075to know: The functions are called with no parameters, but the
19076@code{gnus-headers} and @code{gnus-score} dynamic variables are bound to
19077useful values.
19078
19079For example, you could decide that you don't want to download articles
19080that were posted more than a certain number of days ago (e.g. posted
19081more than @code{gnus-agent-expire-days} ago) you might write a function
19082something along the lines of the following:
19083
19084@lisp
19085(defun my-article-old-p ()
19086 "Say whether an article is old."
19087 (< (time-to-days (date-to-time (mail-header-date gnus-headers)))
19088 (- (time-to-days (current-time)) gnus-agent-expire-days)))
19089@end lisp
19090
19091with the predicate then defined as:
19092
19093@lisp
19094(not my-article-old-p)
19095@end lisp
19096
19097or you could append your predicate to the predefined
19098@code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or
19099wherever.
19100
19101@lisp
19102(require 'gnus-agent)
19103(setq gnus-category-predicate-alist
19104 (append gnus-category-predicate-alist
19105 '((old . my-article-old-p))))
19106@end lisp
19107
19108and simply specify your predicate as:
19109
19110@lisp
19111(not old)
19112@end lisp
19113
19114If/when using something like the above, be aware that there are many
19115misconfigured systems/mailers out there and so an article's date is not
19116always a reliable indication of when it was posted. Hell, some people
19117just don't give a damn.
19118
19119The above predicates apply to @emph{all} the groups which belong to the
19120category. However, if you wish to have a specific predicate for an
19121individual group within a category, or you're just too lazy to set up a
19122new category, you can enter a group's individual predicate in its group
19123parameters like so:
19124
19125@lisp
19126(agent-predicate . short)
19127@end lisp
19128
19129This is the group/topic parameter equivalent of the agent category default.
19130Note that when specifying a single word predicate like this, the
19131@code{agent-predicate} specification must be in dotted pair notation.
19132
19133The equivalent of the longer example from above would be:
19134
19135@lisp
19136(agent-predicate or high (and (not low) (not long)))
19137@end lisp
19138
19139The outer parenthesis required in the category specification are not
19140entered here as, not being in dotted pair notation, the value of the
19141predicate is assumed to be a list.
19142
19143
19144Now, the syntax of the download score is the same as the syntax of
19145normal score files, except that all elements that require actually
19146seeing the article itself are verboten. This means that only the
19147following headers can be scored on: @code{Subject}, @code{From},
19148@code{Date}, @code{Message-ID}, @code{References}, @code{Chars},
19149@code{Lines}, and @code{Xref}.
19150
19151As with predicates, the specification of the @code{download score rule}
19152to use in respect of a group can be in either the category definition if
19153it's to be applicable to all groups in therein, or a group's parameters
19154if it's to be specific to that group.
19155
19156In both of these places the @code{download score rule} can take one of
19157three forms:
19158
19159@enumerate
19160@item
19161Score rule
19162
19163This has the same syntax as a normal Gnus score file except only a
19164subset of scoring keywords are available as mentioned above.
19165
19166example:
19167
19168@itemize @bullet
19169@item
19170Category specification
19171
19172@lisp
19173(("from"
19174 ("Lars Ingebrigtsen" 1000000 nil s))
19175("lines"
19176 (500 -100 nil <)))
19177@end lisp
19178
19179@item
19180Group/Topic Parameter specification
19181
19182@lisp
19183(agent-score ("from"
19184 ("Lars Ingebrigtsen" 1000000 nil s))
19185 ("lines"
19186 (500 -100 nil <)))
19187@end lisp
19188
19189Again, note the omission of the outermost parenthesis here.
19190@end itemize
19191
19192@item
19193Agent score file
19194
19195These score files must @emph{only} contain the permitted scoring
19196keywords stated above.
19197
19198example:
19199
19200@itemize @bullet
19201@item
19202Category specification
19203
19204@lisp
19205("~/News/agent.SCORE")
19206@end lisp
19207
19208or perhaps
19209
19210@lisp
19211("~/News/agent.SCORE" "~/News/agent.group.SCORE")
19212@end lisp
19213
19214@item
19215Group Parameter specification
19216
19217@lisp
19218(agent-score "~/News/agent.SCORE")
19219@end lisp
19220
19221Additional score files can be specified as above. Need I say anything
19222about parenthesis?
19223@end itemize
19224
19225@item
19226Use @code{normal} score files
19227
19228If you don't want to maintain two sets of scoring rules for a group, and
19229your desired @code{downloading} criteria for a group are the same as your
19230@code{reading} criteria then you can tell the agent to refer to your
19231@code{normal} score files when deciding what to download.
19232
19233These directives in either the category definition or a group's
19234parameters will cause the agent to read in all the applicable score
19235files for a group, @emph{filtering out} those sections that do not
19236relate to one of the permitted subset of scoring keywords.
19237
19238@itemize @bullet
19239@item
19240Category Specification
19241
19242@lisp
19243file
19244@end lisp
19245
19246@item
19247Group Parameter specification
19248
19249@lisp
19250(agent-score . file)
19251@end lisp
19252@end itemize
19253@end enumerate
19254
19255@node Category Buffer
19256@subsubsection Category Buffer
19257
19258You'd normally do all category maintenance from the category buffer.
19259When you enter it for the first time (with the @kbd{J c} command from
19260the group buffer), you'll only see the @code{default} category.
19261
19262The following commands are available in this buffer:
19263
19264@table @kbd
19265@item q
19266@kindex q (Category)
19267@findex gnus-category-exit
19268Return to the group buffer (@code{gnus-category-exit}).
19269
19270@item e
19271@kindex e (Category)
19272@findex gnus-category-customize-category
19273Use a customization buffer to set all of the selected category's
19274parameters at one time (@code{gnus-category-customize-category}).
19275
19276@item k
19277@kindex k (Category)
19278@findex gnus-category-kill
19279Kill the current category (@code{gnus-category-kill}).
19280
19281@item c
19282@kindex c (Category)
19283@findex gnus-category-copy
19284Copy the current category (@code{gnus-category-copy}).
19285
19286@item a
19287@kindex a (Category)
19288@findex gnus-category-add
19289Add a new category (@code{gnus-category-add}).
19290
19291@item p
19292@kindex p (Category)
19293@findex gnus-category-edit-predicate
19294Edit the predicate of the current category
19295(@code{gnus-category-edit-predicate}).
19296
19297@item g
19298@kindex g (Category)
19299@findex gnus-category-edit-groups
19300Edit the list of groups belonging to the current category
19301(@code{gnus-category-edit-groups}).
19302
19303@item s
19304@kindex s (Category)
19305@findex gnus-category-edit-score
19306Edit the download score rule of the current category
19307(@code{gnus-category-edit-score}).
19308
19309@item l
19310@kindex l (Category)
19311@findex gnus-category-list
19312List all the categories (@code{gnus-category-list}).
19313@end table
19314
19315
19316@node Category Variables
19317@subsubsection Category Variables
19318
19319@table @code
19320@item gnus-category-mode-hook
19321@vindex gnus-category-mode-hook
19322Hook run in category buffers.
19323
19324@item gnus-category-line-format
19325@vindex gnus-category-line-format
19326Format of the lines in the category buffer (@pxref{Formatting
19327Variables}). Valid elements are:
19328
19329@table @samp
19330@item c
19331The name of the category.
19332
19333@item g
19334The number of groups in the category.
19335@end table
19336
19337@item gnus-category-mode-line-format
19338@vindex gnus-category-mode-line-format
19339Format of the category mode line (@pxref{Mode Line Formatting}).
19340
19341@item gnus-agent-short-article
19342@vindex gnus-agent-short-article
19343Articles that have fewer lines than this are short. Default 100.
19344
19345@item gnus-agent-long-article
19346@vindex gnus-agent-long-article
19347Articles that have more lines than this are long. Default 200.
19348
19349@item gnus-agent-low-score
19350@vindex gnus-agent-low-score
19351Articles that have a score lower than this have a low score. Default
193520.
19353
19354@item gnus-agent-high-score
19355@vindex gnus-agent-high-score
19356Articles that have a score higher than this have a high score. Default
193570.
19358
19359@item gnus-agent-expire-days
19360@vindex gnus-agent-expire-days
19361The number of days that a @samp{read} article must stay in the agent's
19362local disk before becoming eligible for expiration (While the name is
19363the same, this doesn't mean expiring the article on the server. It
19364just means deleting the local copy of the article). What is also
19365important to understand is that the counter starts with the time the
19366article was written to the local disk and not the time the article was
19367read.
19368Default 7.
19369
19370@item gnus-agent-enable-expiration
19371@vindex gnus-agent-enable-expiration
19372Determines whether articles in a group are, by default, expired or
19373retained indefinitely. The default is @code{ENABLE} which means that
19374you'll have to disable expiration when desired. On the other hand,
19375you could set this to @code{DISABLE}. In that case, you would then
19376have to enable expiration in selected groups.
19377
19378@end table
19379
19380
19381@node Agent Commands
19382@subsection Agent Commands
19383@findex gnus-agent-toggle-plugged
19384@kindex J j (Agent)
19385
19386All the Gnus Agent commands are on the @kbd{J} submap. The @kbd{J j}
19387(@code{gnus-agent-toggle-plugged}) command works in all modes, and
19388toggles the plugged/unplugged state of the Gnus Agent.
19389
19390
19391@menu
19392* Group Agent Commands:: Configure groups and fetch their contents.
19393* Summary Agent Commands:: Manually select then fetch specific articles.
19394* Server Agent Commands:: Select the servers that are supported by the agent.
19395@end menu
19396
19397
19398
19399
19400@node Group Agent Commands
19401@subsubsection Group Agent Commands
19402
19403@table @kbd
19404@item J u
19405@kindex J u (Agent Group)
19406@findex gnus-agent-fetch-groups
19407Fetch all eligible articles in the current group
19408(@code{gnus-agent-fetch-groups}).
19409
19410@item J c
19411@kindex J c (Agent Group)
19412@findex gnus-enter-category-buffer
19413Enter the Agent category buffer (@code{gnus-enter-category-buffer}).
19414
19415@item J s
19416@kindex J s (Agent Group)
19417@findex gnus-agent-fetch-session
19418Fetch all eligible articles in all groups
19419(@code{gnus-agent-fetch-session}).
19420
19421@item J S
19422@kindex J S (Agent Group)
19423@findex gnus-group-send-queue
19424Send all sendable messages in the queue group
19425(@code{gnus-group-send-queue}). @xref{Drafts}.
19426
19427@item J a
19428@kindex J a (Agent Group)
19429@findex gnus-agent-add-group
19430Add the current group to an Agent category
19431(@code{gnus-agent-add-group}). This command understands the
19432process/prefix convention (@pxref{Process/Prefix}).
19433
19434@item J r
19435@kindex J r (Agent Group)
19436@findex gnus-agent-remove-group
19437Remove the current group from its category, if any
19438(@code{gnus-agent-remove-group}). This command understands the
19439process/prefix convention (@pxref{Process/Prefix}).
19440
19441@item J Y
19442@kindex J Y (Agent Group)
19443@findex gnus-agent-synchronize-flags
19444Synchronize flags changed while unplugged with remote server, if any.
19445
19446
19447@end table
19448
19449
19450@node Summary Agent Commands
19451@subsubsection Summary Agent Commands
19452
19453@table @kbd
19454@item J #
19455@kindex J # (Agent Summary)
19456@findex gnus-agent-mark-article
19457Mark the article for downloading (@code{gnus-agent-mark-article}).
19458
19459@item J M-#
19460@kindex J M-# (Agent Summary)
19461@findex gnus-agent-unmark-article
19462Remove the downloading mark from the article
19463(@code{gnus-agent-unmark-article}).
19464
19465@cindex %
19466@item @@
19467@kindex @@ (Agent Summary)
19468@findex gnus-agent-toggle-mark
19469Toggle whether to download the article
19470(@code{gnus-agent-toggle-mark}). The download mark is @samp{%} by
19471default.
19472
19473@item J c
19474@kindex J c (Agent Summary)
19475@findex gnus-agent-catchup
19476Mark all articles as read (@code{gnus-agent-catchup}) that are neither cached, downloaded, nor downloadable.
19477
19478@item J S
19479@kindex J S (Agent Summary)
19480@findex gnus-agent-fetch-group
19481Download all eligible (@pxref{Agent Categories}) articles in this group.
19482(@code{gnus-agent-fetch-group}).
19483
19484@item J s
19485@kindex J s (Agent Summary)
01c52d31 19486@findex gnus-agent-summary-fetch-series
4009494e 19487Download all processable articles in this group.
01c52d31 19488(@code{gnus-agent-summary-fetch-series}).
4009494e
GM
19489
19490@item J u
19491@kindex J u (Agent Summary)
19492@findex gnus-agent-summary-fetch-group
19493Download all downloadable articles in the current group
19494(@code{gnus-agent-summary-fetch-group}).
19495
19496@end table
19497
19498
19499@node Server Agent Commands
19500@subsubsection Server Agent Commands
19501
19502@table @kbd
19503@item J a
19504@kindex J a (Agent Server)
19505@findex gnus-agent-add-server
19506Add the current server to the list of servers covered by the Gnus Agent
19507(@code{gnus-agent-add-server}).
19508
19509@item J r
19510@kindex J r (Agent Server)
19511@findex gnus-agent-remove-server
19512Remove the current server from the list of servers covered by the Gnus
19513Agent (@code{gnus-agent-remove-server}).
19514
19515@end table
19516
19517
19518@node Agent Visuals
19519@subsection Agent Visuals
19520
19521If you open a summary while unplugged and, Gnus knows from the group's
19522active range that there are more articles than the headers currently
19523stored in the Agent, you may see some articles whose subject looks
19524something like @samp{[Undownloaded article #####]}. These are
19525placeholders for the missing headers. Aside from setting a mark,
19526there is not much that can be done with one of these placeholders.
19527When Gnus finally gets a chance to fetch the group's headers, the
19528placeholders will automatically be replaced by the actual headers.
19529You can configure the summary buffer's maneuvering to skip over the
19530placeholders if you care (See @code{gnus-auto-goto-ignores}).
19531
19532While it may be obvious to all, the only headers and articles
19533available while unplugged are those headers and articles that were
19534fetched into the Agent while previously plugged. To put it another
19535way, ``If you forget to fetch something while plugged, you might have a
19536less than satisfying unplugged session''. For this reason, the Agent
19537adds two visual effects to your summary buffer. These effects display
19538the download status of each article so that you always know which
19539articles will be available when unplugged.
19540
19541The first visual effect is the @samp{%O} spec. If you customize
19542@code{gnus-summary-line-format} to include this specifier, you will add
19543a single character field that indicates an article's download status.
19544Articles that have been fetched into either the Agent or the Cache,
19545will display @code{gnus-downloaded-mark} (defaults to @samp{+}). All
19546other articles will display @code{gnus-undownloaded-mark} (defaults to
19547@samp{-}). If you open a group that has not been agentized, a space
19548(@samp{ }) will be displayed.
19549
19550The second visual effect are the undownloaded faces. The faces, there
19551are three indicating the article's score (low, normal, high), seem to
19552result in a love/hate response from many Gnus users. The problem is
19553that the face selection is controlled by a list of condition tests and
19554face names (See @code{gnus-summary-highlight}). Each condition is
19555tested in the order in which it appears in the list so early
19556conditions have precedence over later conditions. All of this means
19557that, if you tick an undownloaded article, the article will continue
19558to be displayed in the undownloaded face rather than the ticked face.
19559
19560If you use the Agent as a cache (to avoid downloading the same article
19561each time you visit it or to minimize your connection time), the
19562undownloaded face will probably seem like a good idea. The reason
19563being that you do all of our work (marking, reading, deleting) with
01c52d31
MB
19564downloaded articles so the normal faces always appear. For those
19565users using the agent to improve online performance by caching the NOV
19566database (most users since 5.10.2), the undownloaded faces may appear
19567to be an absolutely horrible idea. The issue being that, since none
19568of their articles have been fetched into the Agent, all of the
19569normal faces will be obscured by the undownloaded faces.
19570
19571If you would like to use the undownloaded faces, you must enable the
19572undownloaded faces by setting the @code{agent-enable-undownloaded-faces}
19573group parameter to @code{t}. This parameter, like all other agent
19574parameters, may be set on an Agent Category (@pxref{Agent Categories}),
19575a Group Topic (@pxref{Topic Parameters}), or an individual group
19576(@pxref{Group Parameters}).
19577
19578The one problem common to all users using the agent is how quickly it
19579can consume disk space. If you using the agent on many groups, it is
19580even more difficult to effectively recover disk space. One solution
19581is the @samp{%F} format available in @code{gnus-group-line-format}.
19582This format will display the actual disk space used by articles
19583fetched into both the agent and cache. By knowing which groups use
19584the most space, users know where to focus their efforts when ``agent
19585expiring'' articles.
4009494e
GM
19586
19587@node Agent as Cache
19588@subsection Agent as Cache
19589
19590When Gnus is plugged, it is not efficient to download headers or
19591articles from the server again, if they are already stored in the
19592Agent. So, Gnus normally only downloads headers once, and stores them
19593in the Agent. These headers are later used when generating the summary
19594buffer, regardless of whether you are plugged or unplugged. Articles
19595are not cached in the Agent by default though (that would potentially
19596consume lots of disk space), but if you have already downloaded an
19597article into the Agent, Gnus will not download the article from the
19598server again but use the locally stored copy instead.
19599
19600If you so desire, you can configure the agent (see @code{gnus-agent-cache}
19601@pxref{Agent Variables}) to always download headers and articles while
19602plugged. Gnus will almost certainly be slower, but it will be kept
19603synchronized with the server. That last point probably won't make any
19604sense if you are using a nntp or nnimap back end.
19605
19606@node Agent Expiry
19607@subsection Agent Expiry
19608
19609@vindex gnus-agent-expire-days
19610@findex gnus-agent-expire
19611@kindex M-x gnus-agent-expire
19612@kindex M-x gnus-agent-expire-group
19613@findex gnus-agent-expire-group
19614@cindex agent expiry
19615@cindex Gnus agent expiry
19616@cindex expiry, in Gnus agent
19617
19618The Agent back end, @code{nnagent}, doesn't handle expiry. Well, at
19619least it doesn't handle it like other back ends. Instead, there are
19620special @code{gnus-agent-expire} and @code{gnus-agent-expire-group}
19621commands that will expire all read articles that are older than
19622@code{gnus-agent-expire-days} days. They can be run whenever you feel
19623that you're running out of space. Neither are particularly fast or
19624efficient, and it's not a particularly good idea to interrupt them (with
19625@kbd{C-g} or anything else) once you've started one of them.
19626
19627Note that other functions, e.g. @code{gnus-request-expire-articles},
19628might run @code{gnus-agent-expire} for you to keep the agent
19629synchronized with the group.
19630
19631The agent parameter @code{agent-enable-expiration} may be used to
19632prevent expiration in selected groups.
19633
19634@vindex gnus-agent-expire-all
19635If @code{gnus-agent-expire-all} is non-@code{nil}, the agent
19636expiration commands will expire all articles---unread, read, ticked
19637and dormant. If @code{nil} (which is the default), only read articles
19638are eligible for expiry, and unread, ticked and dormant articles will
19639be kept indefinitely.
19640
19641If you find that some articles eligible for expiry are never expired,
19642perhaps some Gnus Agent files are corrupted. There's are special
19643commands, @code{gnus-agent-regenerate} and
19644@code{gnus-agent-regenerate-group}, to fix possible problems.
19645
19646@node Agent Regeneration
19647@subsection Agent Regeneration
19648
19649@cindex agent regeneration
19650@cindex Gnus agent regeneration
19651@cindex regeneration
19652
19653The local data structures used by @code{nnagent} may become corrupted
19654due to certain exceptional conditions. When this happens,
19655@code{nnagent} functionality may degrade or even fail. The solution
19656to this problem is to repair the local data structures by removing all
19657internal inconsistencies.
19658
19659For example, if your connection to your server is lost while
19660downloaded articles into the agent, the local data structures will not
19661know about articles successfully downloaded prior to the connection
19662failure. Running @code{gnus-agent-regenerate} or
19663@code{gnus-agent-regenerate-group} will update the data structures
19664such that you don't need to download these articles a second time.
19665
19666@findex gnus-agent-regenerate
19667@kindex M-x gnus-agent-regenerate
19668The command @code{gnus-agent-regenerate} will perform
19669@code{gnus-agent-regenerate-group} on every agentized group. While
19670you can run @code{gnus-agent-regenerate} in any buffer, it is strongly
19671recommended that you first close all summary buffers.
19672
19673@findex gnus-agent-regenerate-group
19674@kindex M-x gnus-agent-regenerate-group
19675The command @code{gnus-agent-regenerate-group} uses the local copies
19676of individual articles to repair the local @acronym{NOV}(header) database. It
19677then updates the internal data structures that document which articles
19678are stored locally. An optional argument will mark articles in the
19679agent as unread.
19680
01c52d31
MB
19681@node Agent and flags
19682@subsection Agent and flags
4009494e 19683
01c52d31
MB
19684The Agent works with any Gnus back end including those, such as
19685nnimap, that store flags (read, ticked, etc) on the server. Sadly,
19686the Agent does not actually know which backends keep their flags in
19687the backend server rather than in @file{.newsrc}. This means that the
19688Agent, while unplugged or disconnected, will always record all changes
19689to the flags in its own files.
4009494e 19690
01c52d31
MB
19691When you plug back in, Gnus will then check to see if you have any
19692changed any flags and ask if you wish to synchronize these with the
19693server. This behavior is customizable by @code{gnus-agent-synchronize-flags}.
4009494e
GM
19694
19695@vindex gnus-agent-synchronize-flags
19696If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
19697never automatically synchronize flags. If it is @code{ask}, which is
19698the default, the Agent will check if you made any changes and if so
19699ask if you wish to synchronize these when you re-connect. If it has
19700any other value, all flags will be synchronized automatically.
19701
19702If you do not wish to synchronize flags automatically when you
19703re-connect, you can do it manually with the
19704@code{gnus-agent-synchronize-flags} command that is bound to @kbd{J Y}
19705in the group buffer.
19706
01c52d31
MB
19707Technical note: the synchronization algorithm does not work by ``pushing''
19708all local flags to the server, but rather by incrementally updated the
19709server view of flags by changing only those flags that were changed by
19710the user. Thus, if you set one flag on an article, quit the group then
19711re-select the group and remove the flag; the flag will be set and
19712removed from the server when you ``synchronize''. The queued flag
19713operations can be found in the per-server @code{flags} file in the Agent
19714directory. It's emptied when you synchronize flags.
19715
19716@node Agent and IMAP
19717@subsection Agent and IMAP
19718
19719The Agent works with any Gnus back end, including nnimap. However,
19720since there are some conceptual differences between @acronym{NNTP} and
19721@acronym{IMAP}, this section (should) provide you with some information to
19722make Gnus Agent work smoother as a @acronym{IMAP} Disconnected Mode client.
19723
4009494e
GM
19724Some things are currently not implemented in the Agent that you'd might
19725expect from a disconnected @acronym{IMAP} client, including:
19726
19727@itemize @bullet
19728
19729@item
19730Copying/moving articles into nnimap groups when unplugged.
19731
19732@item
19733Creating/deleting nnimap groups when unplugged.
19734
19735@end itemize
19736
4009494e
GM
19737@node Outgoing Messages
19738@subsection Outgoing Messages
19739
01c52d31
MB
19740By default, when Gnus is unplugged, all outgoing messages (both mail
19741and news) are stored in the draft group ``queue'' (@pxref{Drafts}).
19742You can view them there after posting, and edit them at will.
4009494e 19743
01c52d31
MB
19744You can control the circumstances under which outgoing mail is queued
19745(see @code{gnus-agent-queue-mail}, @pxref{Agent Variables}). Outgoing
19746news is always queued when Gnus is unplugged, and never otherwise.
4009494e 19747
01c52d31
MB
19748You can send the messages either from the draft group with the special
19749commands available there, or you can use the @kbd{J S} command in the
19750group buffer to send all the sendable messages in the draft group.
19751Posting news will only work when Gnus is plugged, but you can send
19752mail at any time.
4009494e 19753
01c52d31
MB
19754If sending mail while unplugged does not work for you and you worry
19755about hitting @kbd{J S} by accident when unplugged, you can have Gnus
19756ask you to confirm your action (see
19757@code{gnus-agent-prompt-send-queue}, @pxref{Agent Variables}).
4009494e
GM
19758
19759@node Agent Variables
19760@subsection Agent Variables
19761
19762@table @code
01c52d31
MB
19763@item gnus-agent
19764@vindex gnus-agent
19765Is the agent enabled? The default is @code{t}. When first enabled,
19766the agent will use @code{gnus-agent-auto-agentize-methods} to
19767automatically mark some back ends as agentized. You may change which
19768back ends are agentized using the agent commands in the server buffer.
19769
19770To enter the server buffer, use the @kbd{^}
19771(@code{gnus-group-enter-server-mode}) command in the group buffer.
19772
19773
4009494e
GM
19774@item gnus-agent-directory
19775@vindex gnus-agent-directory
19776Where the Gnus Agent will store its files. The default is
19777@file{~/News/agent/}.
19778
19779@item gnus-agent-handle-level
19780@vindex gnus-agent-handle-level
19781Groups on levels (@pxref{Group Levels}) higher than this variable will
19782be ignored by the Agent. The default is @code{gnus-level-subscribed},
19783which means that only subscribed group will be considered by the Agent
19784by default.
19785
19786@item gnus-agent-plugged-hook
19787@vindex gnus-agent-plugged-hook
19788Hook run when connecting to the network.
19789
19790@item gnus-agent-unplugged-hook
19791@vindex gnus-agent-unplugged-hook
19792Hook run when disconnecting from the network.
19793
19794@item gnus-agent-fetched-hook
19795@vindex gnus-agent-fetched-hook
19796Hook run when finished fetching articles.
19797
19798@item gnus-agent-cache
19799@vindex gnus-agent-cache
19800Variable to control whether use the locally stored @acronym{NOV} and
19801articles when plugged, e.g. essentially using the Agent as a cache.
19802The default is non-@code{nil}, which means to use the Agent as a cache.
19803
19804@item gnus-agent-go-online
19805@vindex gnus-agent-go-online
19806If @code{gnus-agent-go-online} is @code{nil}, the Agent will never
19807automatically switch offline servers into online status. If it is
19808@code{ask}, the default, the Agent will ask if you wish to switch
19809offline servers into online status when you re-connect. If it has any
19810other value, all offline servers will be automatically switched into
19811online status.
19812
19813@item gnus-agent-mark-unread-after-downloaded
19814@vindex gnus-agent-mark-unread-after-downloaded
19815If @code{gnus-agent-mark-unread-after-downloaded} is non-@code{nil},
19816mark articles as unread after downloading. This is usually a safe
19817thing to do as the newly downloaded article has obviously not been
19818read. The default is @code{t}.
19819
01c52d31
MB
19820@item gnus-agent-synchronize-flags
19821@vindex gnus-agent-synchronize-flags
19822If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
19823never automatically synchronize flags. If it is @code{ask}, which is
19824the default, the Agent will check if you made any changes and if so
19825ask if you wish to synchronize these when you re-connect. If it has
19826any other value, all flags will be synchronized automatically.
19827
4009494e
GM
19828@item gnus-agent-consider-all-articles
19829@vindex gnus-agent-consider-all-articles
19830If @code{gnus-agent-consider-all-articles} is non-@code{nil}, the
19831agent will let the agent predicate decide whether articles need to be
19832downloaded or not, for all articles. When @code{nil}, the default,
19833the agent will only let the predicate decide whether unread articles
19834are downloaded or not. If you enable this, you may also want to look
19835into the agent expiry settings (@pxref{Category Variables}), so that
19836the agent doesn't download articles which the agent will later expire,
19837over and over again.
19838
19839@item gnus-agent-max-fetch-size
19840@vindex gnus-agent-max-fetch-size
19841The agent fetches articles into a temporary buffer prior to parsing
19842them into individual files. To avoid exceeding the max. buffer size,
19843the agent alternates between fetching and parsing until all articles
19844have been fetched. @code{gnus-agent-max-fetch-size} provides a size
19845limit to control how often the cycling occurs. A large value improves
19846performance. A small value minimizes the time lost should the
19847connection be lost while fetching (You may need to run
19848@code{gnus-agent-regenerate-group} to update the group's state.
19849However, all articles parsed prior to loosing the connection will be
19850available while unplugged). The default is 10M so it is unusual to
19851see any cycling.
19852
19853@item gnus-server-unopen-status
19854@vindex gnus-server-unopen-status
19855Perhaps not an Agent variable, but closely related to the Agent, this
19856variable says what will happen if Gnus cannot open a server. If the
19857Agent is enabled, the default, @code{nil}, makes Gnus ask the user
19858whether to deny the server or whether to unplug the agent. If the
19859Agent is disabled, Gnus always simply deny the server. Other choices
19860for this variable include @code{denied} and @code{offline} the latter
19861is only valid if the Agent is used.
19862
19863@item gnus-auto-goto-ignores
19864@vindex gnus-auto-goto-ignores
19865Another variable that isn't an Agent variable, yet so closely related
19866that most will look for it here, this variable tells the summary
19867buffer how to maneuver around undownloaded (only headers stored in the
19868agent) and unfetched (neither article nor headers stored) articles.
19869
19870The valid values are @code{nil} (maneuver to any article),
19871@code{undownloaded} (maneuvering while unplugged ignores articles that
19872have not been fetched), @code{always-undownloaded} (maneuvering always
19873ignores articles that have not been fetched), @code{unfetched}
19874(maneuvering ignores articles whose headers have not been fetched).
19875
01c52d31
MB
19876@item gnus-agent-queue-mail
19877@vindex gnus-agent-queue-mail
19878When @code{gnus-agent-queue-mail} is @code{always}, Gnus will always
19879queue mail rather than sending it straight away. When @code{t}, Gnus
19880will queue mail when unplugged only. When @code{nil}, never queue
19881mail. The default is @code{t}.
19882
19883@item gnus-agent-prompt-send-queue
19884@vindex gnus-agent-prompt-send-queue
19885When @code{gnus-agent-prompt-send-queue} is non-@code{nil} Gnus will
19886prompt you to confirm that you really wish to proceed if you hit
19887@kbd{J S} while unplugged. The default is @code{nil}.
19888
4009494e
GM
19889@item gnus-agent-auto-agentize-methods
19890@vindex gnus-agent-auto-agentize-methods
19891If you have never used the Agent before (or more technically, if
19892@file{~/News/agent/lib/servers} does not exist), Gnus will
19893automatically agentize a few servers for you. This variable control
01c52d31
MB
19894which back ends should be auto-agentized. It is typically only useful
19895to agentize remote back ends. The auto-agentizing has the same effect
4009494e
GM
19896as running @kbd{J a} on the servers (@pxref{Server Agent Commands}).
19897If the file exist, you must manage the servers manually by adding or
19898removing them, this variable is only applicable the first time you
19899start Gnus. The default is @samp{(nntp nnimap)}.
19900
19901@end table
19902
19903
19904@node Example Setup
19905@subsection Example Setup
19906
19907If you don't want to read this manual, and you have a fairly standard
19908setup, you may be able to use something like the following as your
19909@file{~/.gnus.el} file to get started.
19910
19911@lisp
19912;; @r{Define how Gnus is to fetch news. We do this over @acronym{NNTP}}
19913;; @r{from your ISP's server.}
19914(setq gnus-select-method '(nntp "news.your-isp.com"))
19915
19916;; @r{Define how Gnus is to read your mail. We read mail from}
19917;; @r{your ISP's @acronym{POP} server.}
19918(setq mail-sources '((pop :server "pop.your-isp.com")))
19919
19920;; @r{Say how Gnus is to store the mail. We use nnml groups.}
19921(setq gnus-secondary-select-methods '((nnml "")))
19922
19923;; @r{Make Gnus into an offline newsreader.}
19924;; (gnus-agentize) ; @r{The obsolete setting.}
19925;; (setq gnus-agent t) ; @r{Now the default.}
19926@end lisp
19927
19928That should be it, basically. Put that in your @file{~/.gnus.el} file,
19929edit to suit your needs, start up PPP (or whatever), and type @kbd{M-x
19930gnus}.
19931
19932If this is the first time you've run Gnus, you will be subscribed
19933automatically to a few default newsgroups. You'll probably want to
19934subscribe to more groups, and to do that, you have to query the
19935@acronym{NNTP} server for a complete list of groups with the @kbd{A A}
19936command. This usually takes quite a while, but you only have to do it
19937once.
19938
19939After reading and parsing a while, you'll be presented with a list of
19940groups. Subscribe to the ones you want to read with the @kbd{u}
19941command. @kbd{l} to make all the killed groups disappear after you've
19942subscribe to all the groups you want to read. (@kbd{A k} will bring
19943back all the killed groups.)
19944
19945You can now read the groups at once, or you can download the articles
19946with the @kbd{J s} command. And then read the rest of this manual to
19947find out which of the other gazillion things you want to customize.
19948
19949
19950@node Batching Agents
19951@subsection Batching Agents
19952@findex gnus-agent-batch
19953
19954Having the Gnus Agent fetch articles (and post whatever messages you've
19955written) is quite easy once you've gotten things set up properly. The
19956following shell script will do everything that is necessary:
19957
19958You can run a complete batch command from the command line with the
19959following incantation:
19960
19961@example
19962#!/bin/sh
19963emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-agent-batch >/dev/null 2>&1
19964@end example
19965
19966
19967@node Agent Caveats
19968@subsection Agent Caveats
19969
19970The Gnus Agent doesn't seem to work like most other offline
19971newsreaders. Here are some common questions that some imaginary people
19972may ask:
19973
19974@table @dfn
19975@item If I read an article while plugged, do they get entered into the Agent?
19976
19977@strong{No}. If you want this behavior, add
19978@code{gnus-agent-fetch-selected-article} to
19979@code{gnus-select-article-hook}.
19980
19981@item If I read an article while plugged, and the article already exists in
19982the Agent, will it get downloaded once more?
19983
19984@strong{No}, unless @code{gnus-agent-cache} is @code{nil}.
19985
19986@end table
19987
19988In short, when Gnus is unplugged, it only looks into the locally stored
19989articles; when it's plugged, it talks to your ISP and may also use the
19990locally stored articles.
19991
19992
19993@node Scoring
19994@chapter Scoring
19995@cindex scoring
19996
19997Other people use @dfn{kill files}, but we here at Gnus Towers like
19998scoring better than killing, so we'd rather switch than fight. They do
19999something completely different as well, so sit up straight and pay
20000attention!
20001
20002@vindex gnus-summary-mark-below
20003All articles have a default score (@code{gnus-summary-default-score}),
20004which is 0 by default. This score may be raised or lowered either
20005interactively or by score files. Articles that have a score lower than
20006@code{gnus-summary-mark-below} are marked as read.
20007
20008Gnus will read any @dfn{score files} that apply to the current group
20009before generating the summary buffer.
20010
20011There are several commands in the summary buffer that insert score
20012entries based on the current article. You can, for instance, ask Gnus to
20013lower or increase the score of all articles with a certain subject.
20014
20015There are two sorts of scoring entries: Permanent and temporary.
20016Temporary score entries are self-expiring entries. Any entries that are
20017temporary and have not been used for, say, a week, will be removed
20018silently to help keep the sizes of the score files down.
20019
20020@menu
20021* Summary Score Commands:: Adding score entries for the current group.
20022* Group Score Commands:: General score commands.
20023* Score Variables:: Customize your scoring. (My, what terminology).
20024* Score File Format:: What a score file may contain.
20025* Score File Editing:: You can edit score files by hand as well.
20026* Adaptive Scoring:: Big Sister Gnus knows what you read.
20027* Home Score File:: How to say where new score entries are to go.
20028* Followups To Yourself:: Having Gnus notice when people answer you.
20029* Scoring On Other Headers:: Scoring on non-standard headers.
20030* Scoring Tips:: How to score effectively.
20031* Reverse Scoring:: That problem child of old is not problem.
20032* Global Score Files:: Earth-spanning, ear-splitting score files.
20033* Kill Files:: They are still here, but they can be ignored.
20034* Converting Kill Files:: Translating kill files to score files.
4009494e
GM
20035* Advanced Scoring:: Using logical expressions to build score rules.
20036* Score Decays:: It can be useful to let scores wither away.
20037@end menu
20038
20039
20040@node Summary Score Commands
20041@section Summary Score Commands
20042@cindex score commands
20043
20044The score commands that alter score entries do not actually modify real
20045score files. That would be too inefficient. Gnus maintains a cache of
20046previously loaded score files, one of which is considered the
20047@dfn{current score file alist}. The score commands simply insert
20048entries into this list, and upon group exit, this list is saved.
20049
20050The current score file is by default the group's local score file, even
20051if no such score file actually exists. To insert score commands into
20052some other score file (e.g. @file{all.SCORE}), you must first make this
20053score file the current one.
20054
20055General score commands that don't actually change the score file:
20056
20057@table @kbd
20058
20059@item V s
20060@kindex V s (Summary)
20061@findex gnus-summary-set-score
20062Set the score of the current article (@code{gnus-summary-set-score}).
20063
20064@item V S
20065@kindex V S (Summary)
20066@findex gnus-summary-current-score
20067Display the score of the current article
20068(@code{gnus-summary-current-score}).
20069
20070@item V t
20071@kindex V t (Summary)
20072@findex gnus-score-find-trace
20073Display all score rules that have been used on the current article
20074(@code{gnus-score-find-trace}). In the @code{*Score Trace*} buffer, you
20075may type @kbd{e} to edit score file corresponding to the score rule on
20076current line and @kbd{f} to format (@code{gnus-score-pretty-print}) the
20077score file and edit it.
20078
20079@item V w
20080@kindex V w (Summary)
20081@findex gnus-score-find-favourite-words
20082List words used in scoring (@code{gnus-score-find-favourite-words}).
20083
20084@item V R
20085@kindex V R (Summary)
20086@findex gnus-summary-rescore
20087Run the current summary through the scoring process
20088(@code{gnus-summary-rescore}). This might be useful if you're playing
20089around with your score files behind Gnus' back and want to see the
20090effect you're having.
20091
20092@item V c
20093@kindex V c (Summary)
20094@findex gnus-score-change-score-file
20095Make a different score file the current
20096(@code{gnus-score-change-score-file}).
20097
20098@item V e
20099@kindex V e (Summary)
20100@findex gnus-score-edit-current-scores
20101Edit the current score file (@code{gnus-score-edit-current-scores}).
20102You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score
20103File Editing}).
20104
20105@item V f
20106@kindex V f (Summary)
20107@findex gnus-score-edit-file
20108Edit a score file and make this score file the current one
20109(@code{gnus-score-edit-file}).
20110
20111@item V F
20112@kindex V F (Summary)
20113@findex gnus-score-flush-cache
20114Flush the score cache (@code{gnus-score-flush-cache}). This is useful
20115after editing score files.
20116
20117@item V C
20118@kindex V C (Summary)
20119@findex gnus-score-customize
20120Customize a score file in a visually pleasing manner
20121(@code{gnus-score-customize}).
20122
20123@end table
20124
20125The rest of these commands modify the local score file.
20126
20127@table @kbd
20128
20129@item V m
20130@kindex V m (Summary)
20131@findex gnus-score-set-mark-below
20132Prompt for a score, and mark all articles with a score below this as
20133read (@code{gnus-score-set-mark-below}).
20134
20135@item V x
20136@kindex V x (Summary)
20137@findex gnus-score-set-expunge-below
20138Prompt for a score, and add a score rule to the current score file to
20139expunge all articles below this score
20140(@code{gnus-score-set-expunge-below}).
20141@end table
20142
20143The keystrokes for actually making score entries follow a very regular
20144pattern, so there's no need to list all the commands. (Hundreds of
20145them.)
20146
20147@findex gnus-summary-increase-score
20148@findex gnus-summary-lower-score
20149
20150@enumerate
20151@item
20152The first key is either @kbd{I} (upper case i) for increasing the score
20153or @kbd{L} for lowering the score.
20154@item
20155The second key says what header you want to score on. The following
20156keys are available:
20157@table @kbd
20158
20159@item a
20160Score on the author name.
20161
20162@item s
20163Score on the subject line.
20164
20165@item x
20166Score on the @code{Xref} line---i.e., the cross-posting line.
20167
20168@item r
20169Score on the @code{References} line.
20170
20171@item d
20172Score on the date.
20173
20174@item l
20175Score on the number of lines.
20176
20177@item i
20178Score on the @code{Message-ID} header.
20179
20180@item e
20181Score on an ``extra'' header, that is, one of those in gnus-extra-headers,
20182if your @acronym{NNTP} server tracks additional header data in overviews.
20183
20184@item f
20185Score on followups---this matches the author name, and adds scores to
20186the followups to this author. (Using this key leads to the creation of
20187@file{ADAPT} files.)
20188
20189@item b
20190Score on the body.
20191
20192@item h
20193Score on the head.
20194
20195@item t
20196Score on thread. (Using this key leads to the creation of @file{ADAPT}
20197files.)
20198
20199@end table
20200
20201@item
20202The third key is the match type. Which match types are valid depends on
20203what headers you are scoring on.
20204
20205@table @code
20206
20207@item strings
20208
20209@table @kbd
20210
20211@item e
20212Exact matching.
20213
20214@item s
20215Substring matching.
20216
20217@item f
20218Fuzzy matching (@pxref{Fuzzy Matching}).
20219
20220@item r
20221Regexp matching
20222@end table
20223
20224@item date
20225@table @kbd
20226
20227@item b
20228Before date.
20229
20230@item a
20231After date.
20232
20233@item n
20234This date.
20235@end table
20236
20237@item number
20238@table @kbd
20239
20240@item <
20241Less than number.
20242
20243@item =
20244Equal to number.
20245
20246@item >
20247Greater than number.
20248@end table
20249@end table
20250
20251@item
20252The fourth and usually final key says whether this is a temporary (i.e.,
20253expiring) score entry, or a permanent (i.e., non-expiring) score entry,
20254or whether it is to be done immediately, without adding to the score
20255file.
20256@table @kbd
20257
20258@item t
20259Temporary score entry.
20260
20261@item p
20262Permanent score entry.
20263
20264@item i
20265Immediately scoring.
20266@end table
20267
20268@item
20269If you are scoring on `e' (extra) headers, you will then be prompted for
20270the header name on which you wish to score. This must be a header named
20271in gnus-extra-headers, and @samp{TAB} completion is available.
20272
20273@end enumerate
20274
20275So, let's say you want to increase the score on the current author with
20276exact matching permanently: @kbd{I a e p}. If you want to lower the
20277score based on the subject line, using substring matching, and make a
20278temporary score entry: @kbd{L s s t}. Pretty easy.
20279
20280To make things a bit more complicated, there are shortcuts. If you use
20281a capital letter on either the second or third keys, Gnus will use
20282defaults for the remaining one or two keystrokes. The defaults are
20283``substring'' and ``temporary''. So @kbd{I A} is the same as @kbd{I a s
20284t}, and @kbd{I a R} is the same as @kbd{I a r t}.
20285
20286These functions take both the numerical prefix and the symbolic prefix
20287(@pxref{Symbolic Prefixes}). A numerical prefix says how much to lower
20288(or increase) the score of the article. A symbolic prefix of @code{a}
20289says to use the @file{all.SCORE} file for the command instead of the
20290current score file.
20291
20292@vindex gnus-score-mimic-keymap
20293The @code{gnus-score-mimic-keymap} says whether these commands will
20294pretend they are keymaps or not.
20295
20296
20297@node Group Score Commands
20298@section Group Score Commands
20299@cindex group score commands
20300
20301There aren't many of these as yet, I'm afraid.
20302
20303@table @kbd
20304
01c52d31
MB
20305@item W e
20306@kindex W e (Group)
20307@findex gnus-score-edit-all-score
20308Edit the apply-to-all-groups all.SCORE file. You will be popped into
20309a @code{gnus-score-mode} buffer (@pxref{Score File Editing}).
20310
4009494e
GM
20311@item W f
20312@kindex W f (Group)
20313@findex gnus-score-flush-cache
20314Gnus maintains a cache of score alists to avoid having to reload them
20315all the time. This command will flush the cache
20316(@code{gnus-score-flush-cache}).
20317
20318@end table
20319
20320You can do scoring from the command line by saying something like:
20321
20322@findex gnus-batch-score
20323@cindex batch scoring
20324@example
20325$ emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score
20326@end example
20327
20328
20329@node Score Variables
20330@section Score Variables
20331@cindex score variables
20332
20333@table @code
20334
20335@item gnus-use-scoring
20336@vindex gnus-use-scoring
20337If @code{nil}, Gnus will not check for score files, and will not, in
20338general, do any score-related work. This is @code{t} by default.
20339
20340@item gnus-kill-killed
20341@vindex gnus-kill-killed
20342If this variable is @code{nil}, Gnus will never apply score files to
20343articles that have already been through the kill process. While this
20344may save you lots of time, it also means that if you apply a kill file
20345to a group, and then change the kill file and want to run it over you
20346group again to kill more articles, it won't work. You have to set this
20347variable to @code{t} to do that. (It is @code{t} by default.)
20348
20349@item gnus-kill-files-directory
20350@vindex gnus-kill-files-directory
20351All kill and score files will be stored in this directory, which is
20352initialized from the @env{SAVEDIR} environment variable by default.
20353This is @file{~/News/} by default.
20354
20355@item gnus-score-file-suffix
20356@vindex gnus-score-file-suffix
20357Suffix to add to the group name to arrive at the score file name
20358(@file{SCORE} by default.)
20359
20360@item gnus-score-uncacheable-files
20361@vindex gnus-score-uncacheable-files
20362@cindex score cache
20363All score files are normally cached to avoid excessive re-loading of
bbbe940b 20364score files. However, this might make your Emacs grow big and
4009494e
GM
20365bloated, so this regexp can be used to weed out score files unlikely
20366to be needed again. It would be a bad idea to deny caching of
20367@file{all.SCORE}, while it might be a good idea to not cache
20368@file{comp.infosystems.www.authoring.misc.ADAPT}. In fact, this
20369variable is @samp{ADAPT$} by default, so no adaptive score files will
20370be cached.
20371
20372@item gnus-save-score
20373@vindex gnus-save-score
20374If you have really complicated score files, and do lots of batch
20375scoring, then you might set this variable to @code{t}. This will make
20376Gnus save the scores into the @file{.newsrc.eld} file.
20377
20378If you do not set this to @code{t}, then manual scores (like those set
20379with @kbd{V s} (@code{gnus-summary-set-score})) will not be preserved
20380across group visits.
20381
20382@item gnus-score-interactive-default-score
20383@vindex gnus-score-interactive-default-score
20384Score used by all the interactive raise/lower commands to raise/lower
20385score with. Default is 1000, which may seem excessive, but this is to
20386ensure that the adaptive scoring scheme gets enough room to play with.
20387We don't want the small changes from the adaptive scoring to overwrite
20388manually entered data.
20389
20390@item gnus-summary-default-score
20391@vindex gnus-summary-default-score
20392Default score of an article, which is 0 by default.
20393
20394@item gnus-summary-expunge-below
20395@vindex gnus-summary-expunge-below
20396Don't display the summary lines of articles that have scores lower than
20397this variable. This is @code{nil} by default, which means that no
20398articles will be hidden. This variable is local to the summary buffers,
20399and has to be set from @code{gnus-summary-mode-hook}.
20400
20401@item gnus-score-over-mark
20402@vindex gnus-score-over-mark
20403Mark (in the third column) used for articles with a score over the
20404default. Default is @samp{+}.
20405
20406@item gnus-score-below-mark
20407@vindex gnus-score-below-mark
20408Mark (in the third column) used for articles with a score below the
20409default. Default is @samp{-}.
20410
20411@item gnus-score-find-score-files-function
20412@vindex gnus-score-find-score-files-function
20413Function used to find score files for the current group. This function
20414is called with the name of the group as the argument.
20415
20416Predefined functions available are:
20417@table @code
20418
20419@item gnus-score-find-single
20420@findex gnus-score-find-single
20421Only apply the group's own score file.
20422
20423@item gnus-score-find-bnews
20424@findex gnus-score-find-bnews
20425Apply all score files that match, using bnews syntax. This is the
20426default. If the current group is @samp{gnu.emacs.gnus}, for instance,
20427@file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and
20428@file{gnu.all.SCORE} would all apply. In short, the instances of
20429@samp{all} in the score file names are translated into @samp{.*}, and
20430then a regexp match is done.
20431
20432This means that if you have some score entries that you want to apply to
20433all groups, then you put those entries in the @file{all.SCORE} file.
20434
20435The score files are applied in a semi-random order, although Gnus will
20436try to apply the more general score files before the more specific score
20437files. It does this by looking at the number of elements in the score
20438file names---discarding the @samp{all} elements.
20439
20440@item gnus-score-find-hierarchical
20441@findex gnus-score-find-hierarchical
20442Apply all score files from all the parent groups. This means that you
20443can't have score files like @file{all.SCORE}, but you can have
20444@file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE} for each
20445server.
20446
20447@end table
20448This variable can also be a list of functions. In that case, all
20449these functions will be called with the group name as argument, and
20450all the returned lists of score files will be applied. These
20451functions can also return lists of lists of score alists directly. In
20452that case, the functions that return these non-file score alists
20453should probably be placed before the ``real'' score file functions, to
20454ensure that the last score file returned is the local score file.
20455Phu.
20456
20457For example, to do hierarchical scoring but use a non-server-specific
20458overall score file, you could use the value
20459@example
20460(list (lambda (group) ("all.SCORE"))
20461 'gnus-score-find-hierarchical)
20462@end example
20463
20464@item gnus-score-expiry-days
20465@vindex gnus-score-expiry-days
20466This variable says how many days should pass before an unused score file
20467entry is expired. If this variable is @code{nil}, no score file entries
20468are expired. It's 7 by default.
20469
20470@item gnus-update-score-entry-dates
20471@vindex gnus-update-score-entry-dates
20472If this variable is non-@code{nil}, temporary score entries that have
20473been triggered (matched) will have their dates updated. (This is how Gnus
20474controls expiry---all non-matched-entries will become too old while
20475matched entries will stay fresh and young.) However, if you set this
20476variable to @code{nil}, even matched entries will grow old and will
20477have to face that oh-so grim reaper.
20478
20479@item gnus-score-after-write-file-function
20480@vindex gnus-score-after-write-file-function
20481Function called with the name of the score file just written.
20482
20483@item gnus-score-thread-simplify
20484@vindex gnus-score-thread-simplify
20485If this variable is non-@code{nil}, article subjects will be
20486simplified for subject scoring purposes in the same manner as with
20487threading---according to the current value of
20488@code{gnus-simplify-subject-functions}. If the scoring entry uses
20489@code{substring} or @code{exact} matching, the match will also be
20490simplified in this manner.
20491
20492@end table
20493
20494
20495@node Score File Format
20496@section Score File Format
20497@cindex score file format
20498
20499A score file is an @code{emacs-lisp} file that normally contains just a
20500single form. Casual users are not expected to edit these files;
20501everything can be changed from the summary buffer.
20502
20503Anyway, if you'd like to dig into it yourself, here's an example:
20504
20505@lisp
20506(("from"
20507 ("Lars Ingebrigtsen" -10000)
20508 ("Per Abrahamsen")
20509 ("larsi\\|lmi" -50000 nil R))
20510 ("subject"
20511 ("Ding is Badd" nil 728373))
20512 ("xref"
20513 ("alt.politics" -1000 728372 s))
20514 ("lines"
20515 (2 -100 nil <))
20516 (mark 0)
20517 (expunge -1000)
20518 (mark-and-expunge -10)
20519 (read-only nil)
20520 (orphan -10)
20521 (adapt t)
20522 (files "/hom/larsi/News/gnu.SCORE")
20523 (exclude-files "all.SCORE")
20524 (local (gnus-newsgroup-auto-expire t)
20525 (gnus-summary-make-false-root empty))
20526 (eval (ding)))
20527@end lisp
20528
20529This example demonstrates most score file elements. @xref{Advanced
20530Scoring}, for a different approach.
20531
20532Even though this looks much like Lisp code, nothing here is actually
20533@code{eval}ed. The Lisp reader is used to read this form, though, so it
20534has to be valid syntactically, if not semantically.
20535
20536Six keys are supported by this alist:
20537
20538@table @code
20539
20540@item STRING
20541If the key is a string, it is the name of the header to perform the
20542match on. Scoring can only be performed on these eight headers:
20543@code{From}, @code{Subject}, @code{References}, @code{Message-ID},
20544@code{Xref}, @code{Lines}, @code{Chars} and @code{Date}. In addition to
20545these headers, there are three strings to tell Gnus to fetch the entire
20546article and do the match on larger parts of the article: @code{Body}
20547will perform the match on the body of the article, @code{Head} will
20548perform the match on the head of the article, and @code{All} will
20549perform the match on the entire article. Note that using any of these
20550last three keys will slow down group entry @emph{considerably}. The
20551final ``header'' you can score on is @code{Followup}. These score
20552entries will result in new score entries being added for all follow-ups
20553to articles that matches these score entries.
20554
20555Following this key is an arbitrary number of score entries, where each
20556score entry has one to four elements.
20557@enumerate
20558
20559@item
20560The first element is the @dfn{match element}. On most headers this will
20561be a string, but on the Lines and Chars headers, this must be an
20562integer.
20563
20564@item
20565If the second element is present, it should be a number---the @dfn{score
20566element}. This number should be an integer in the neginf to posinf
20567interval. This number is added to the score of the article if the match
20568is successful. If this element is not present, the
20569@code{gnus-score-interactive-default-score} number will be used
20570instead. This is 1000 by default.
20571
20572@item
20573If the third element is present, it should be a number---the @dfn{date
20574element}. This date says when the last time this score entry matched,
20575which provides a mechanism for expiring the score entries. It this
20576element is not present, the score entry is permanent. The date is
20577represented by the number of days since December 31, 1 BCE.
20578
20579@item
20580If the fourth element is present, it should be a symbol---the @dfn{type
20581element}. This element specifies what function should be used to see
20582whether this score entry matches the article. What match types that can
20583be used depends on what header you wish to perform the match on.
20584@table @dfn
20585
20586@item From, Subject, References, Xref, Message-ID
20587For most header types, there are the @code{r} and @code{R} (regexp), as
20588well as @code{s} and @code{S} (substring) types, and @code{e} and
20589@code{E} (exact match), and @code{w} (word match) types. If this
20590element is not present, Gnus will assume that substring matching should
20591be used. @code{R}, @code{S}, and @code{E} differ from the others in
20592that the matches will be done in a case-sensitive manner. All these
20593one-letter types are really just abbreviations for the @code{regexp},
20594@code{string}, @code{exact}, and @code{word} types, which you can use
20595instead, if you feel like.
20596
20597@item Extra
20598Just as for the standard string overview headers, if you are using
20599gnus-extra-headers, you can score on these headers' values. In this
20600case, there is a 5th element in the score entry, being the name of the
20601header to be scored. The following entry is useful in your
20602@file{all.SCORE} file in case of spam attacks from a single origin
20603host, if your @acronym{NNTP} server tracks @samp{NNTP-Posting-Host} in
20604overviews:
20605
20606@lisp
20607("111.222.333.444" -1000 nil s
20608 "NNTP-Posting-Host")
20609@end lisp
20610
20611@item Lines, Chars
20612These two headers use different match types: @code{<}, @code{>},
20613@code{=}, @code{>=} and @code{<=}.
20614
20615These predicates are true if
20616
20617@example
20618(PREDICATE HEADER MATCH)
20619@end example
20620
20621evaluates to non-@code{nil}. For instance, the advanced match
20622@code{("lines" 4 <)} (@pxref{Advanced Scoring}) will result in the
20623following form:
20624
20625@lisp
20626(< header-value 4)
20627@end lisp
20628
20629Or to put it another way: When using @code{<} on @code{Lines} with 4 as
20630the match, we get the score added if the article has less than 4 lines.
20631(It's easy to get confused and think it's the other way around. But
20632it's not. I think.)
20633
20634When matching on @code{Lines}, be careful because some back ends (like
20635@code{nndir}) do not generate @code{Lines} header, so every article ends
20636up being marked as having 0 lines. This can lead to strange results if
20637you happen to lower score of the articles with few lines.
20638
20639@item Date
20640For the Date header we have three kinda silly match types:
20641@code{before}, @code{at} and @code{after}. I can't really imagine this
20642ever being useful, but, like, it would feel kinda silly not to provide
20643this function. Just in case. You never know. Better safe than sorry.
20644Once burnt, twice shy. Don't judge a book by its cover. Never not have
20645sex on a first date. (I have been told that at least one person, and I
20646quote, ``found this function indispensable'', however.)
20647
20648@cindex ISO8601
20649@cindex date
20650A more useful match type is @code{regexp}. With it, you can match the
20651date string using a regular expression. The date is normalized to
20652ISO8601 compact format first---@var{YYYYMMDD}@code{T}@var{HHMMSS}. If
20653you want to match all articles that have been posted on April 1st in
20654every year, you could use @samp{....0401.........} as a match string,
20655for instance. (Note that the date is kept in its original time zone, so
20656this will match articles that were posted when it was April 1st where
20657the article was posted from. Time zones are such wholesome fun for the
20658whole family, eh?)
20659
20660@item Head, Body, All
20661These three match keys use the same match types as the @code{From} (etc)
20662header uses.
20663
20664@item Followup
20665This match key is somewhat special, in that it will match the
20666@code{From} header, and affect the score of not only the matching
20667articles, but also all followups to the matching articles. This allows
20668you e.g. increase the score of followups to your own articles, or
20669decrease the score of followups to the articles of some known
20670trouble-maker. Uses the same match types as the @code{From} header
20671uses. (Using this match key will lead to creation of @file{ADAPT}
20672files.)
20673
20674@item Thread
20675This match key works along the same lines as the @code{Followup} match
20676key. If you say that you want to score on a (sub-)thread started by an
20677article with a @code{Message-ID} @var{x}, then you add a @samp{thread}
20678match. This will add a new @samp{thread} match for each article that
20679has @var{x} in its @code{References} header. (These new @samp{thread}
20680matches will use the @code{Message-ID}s of these matching articles.)
20681This will ensure that you can raise/lower the score of an entire thread,
20682even though some articles in the thread may not have complete
20683@code{References} headers. Note that using this may lead to
20684undeterministic scores of the articles in the thread. (Using this match
20685key will lead to creation of @file{ADAPT} files.)
20686@end table
20687@end enumerate
20688
20689@cindex score file atoms
20690@item mark
20691The value of this entry should be a number. Any articles with a score
20692lower than this number will be marked as read.
20693
20694@item expunge
20695The value of this entry should be a number. Any articles with a score
20696lower than this number will be removed from the summary buffer.
20697
20698@item mark-and-expunge
20699The value of this entry should be a number. Any articles with a score
20700lower than this number will be marked as read and removed from the
20701summary buffer.
20702
20703@item thread-mark-and-expunge
20704The value of this entry should be a number. All articles that belong to
20705a thread that has a total score below this number will be marked as read
20706and removed from the summary buffer. @code{gnus-thread-score-function}
20707says how to compute the total score for a thread.
20708
20709@item files
20710The value of this entry should be any number of file names. These files
20711are assumed to be score files as well, and will be loaded the same way
20712this one was.
20713
20714@item exclude-files
20715The clue of this entry should be any number of files. These files will
20716not be loaded, even though they would normally be so, for some reason or
20717other.
20718
20719@item eval
994ff697 20720The value of this entry will be @code{eval}ed. This element will be
4009494e
GM
20721ignored when handling global score files.
20722
20723@item read-only
20724Read-only score files will not be updated or saved. Global score files
20725should feature this atom (@pxref{Global Score Files}). (Note:
20726@dfn{Global} here really means @dfn{global}; not your personal
20727apply-to-all-groups score files.)
20728
20729@item orphan
20730The value of this entry should be a number. Articles that do not have
20731parents will get this number added to their scores. Imagine you follow
20732some high-volume newsgroup, like @samp{comp.lang.c}. Most likely you
20733will only follow a few of the threads, also want to see any new threads.
20734
20735You can do this with the following two score file entries:
20736
20737@example
20738 (orphan -500)
20739 (mark-and-expunge -100)
20740@end example
20741
20742When you enter the group the first time, you will only see the new
20743threads. You then raise the score of the threads that you find
b1519d85 20744interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{c y}) the
4009494e
GM
20745rest. Next time you enter the group, you will see new articles in the
20746interesting threads, plus any new threads.
20747
20748I.e.---the orphan score atom is for high-volume groups where a few
20749interesting threads which can't be found automatically by ordinary
20750scoring rules exist.
20751
20752@item adapt
20753This entry controls the adaptive scoring. If it is @code{t}, the
20754default adaptive scoring rules will be used. If it is @code{ignore}, no
20755adaptive scoring will be performed on this group. If it is a list, this
20756list will be used as the adaptive scoring rules. If it isn't present,
20757or is something other than @code{t} or @code{ignore}, the default
20758adaptive scoring rules will be used. If you want to use adaptive
20759scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to
20760@code{t}, and insert an @code{(adapt ignore)} in the groups where you do
20761not want adaptive scoring. If you only want adaptive scoring in a few
20762groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and
20763insert @code{(adapt t)} in the score files of the groups where you want
20764it.
20765
20766@item adapt-file
20767All adaptive score entries will go to the file named by this entry. It
20768will also be applied when entering the group. This atom might be handy
20769if you want to adapt on several groups at once, using the same adaptive
20770file for a number of groups.
20771
20772@item local
20773@cindex local variables
20774The value of this entry should be a list of @code{(@var{var}
20775@var{value})} pairs. Each @var{var} will be made buffer-local to the
20776current summary buffer, and set to the value specified. This is a
20777convenient, if somewhat strange, way of setting variables in some
20778groups if you don't like hooks much. Note that the @var{value} won't
20779be evaluated.
20780@end table
20781
20782
20783@node Score File Editing
20784@section Score File Editing
20785
20786You normally enter all scoring commands from the summary buffer, but you
20787might feel the urge to edit them by hand as well, so we've supplied you
20788with a mode for that.
20789
20790It's simply a slightly customized @code{emacs-lisp} mode, with these
20791additional commands:
20792
20793@table @kbd
20794
20795@item C-c C-c
20796@kindex C-c C-c (Score)
87035689 20797@findex gnus-score-edit-exit
4009494e 20798Save the changes you have made and return to the summary buffer
87035689 20799(@code{gnus-score-edit-exit}).
4009494e
GM
20800
20801@item C-c C-d
20802@kindex C-c C-d (Score)
20803@findex gnus-score-edit-insert-date
20804Insert the current date in numerical format
20805(@code{gnus-score-edit-insert-date}). This is really the day number, if
20806you were wondering.
20807
20808@item C-c C-p
20809@kindex C-c C-p (Score)
20810@findex gnus-score-pretty-print
20811The adaptive score files are saved in an unformatted fashion. If you
20812intend to read one of these files, you want to @dfn{pretty print} it
20813first. This command (@code{gnus-score-pretty-print}) does that for
20814you.
20815
20816@end table
20817
20818Type @kbd{M-x gnus-score-mode} to use this mode.
20819
20820@vindex gnus-score-mode-hook
20821@code{gnus-score-menu-hook} is run in score mode buffers.
20822
20823In the summary buffer you can use commands like @kbd{V f}, @kbd{V e} and
20824@kbd{V t} to begin editing score files.
20825
20826
20827@node Adaptive Scoring
20828@section Adaptive Scoring
20829@cindex adaptive scoring
20830
20831If all this scoring is getting you down, Gnus has a way of making it all
20832happen automatically---as if by magic. Or rather, as if by artificial
20833stupidity, to be precise.
20834
20835@vindex gnus-use-adaptive-scoring
20836When you read an article, or mark an article as read, or kill an
20837article, you leave marks behind. On exit from the group, Gnus can sniff
20838these marks and add score elements depending on what marks it finds.
20839You turn on this ability by setting @code{gnus-use-adaptive-scoring} to
20840@code{t} or @code{(line)}. If you want score adaptively on separate
20841words appearing in the subjects, you should set this variable to
20842@code{(word)}. If you want to use both adaptive methods, set this
20843variable to @code{(word line)}.
20844
20845@vindex gnus-default-adaptive-score-alist
20846To give you complete control over the scoring process, you can customize
20847the @code{gnus-default-adaptive-score-alist} variable. For instance, it
20848might look something like this:
20849
20850@lisp
20851(setq gnus-default-adaptive-score-alist
20852 '((gnus-unread-mark)
20853 (gnus-ticked-mark (from 4))
20854 (gnus-dormant-mark (from 5))
20855 (gnus-del-mark (from -4) (subject -1))
20856 (gnus-read-mark (from 4) (subject 2))
20857 (gnus-expirable-mark (from -1) (subject -1))
20858 (gnus-killed-mark (from -1) (subject -3))
20859 (gnus-kill-file-mark)
20860 (gnus-ancient-mark)
20861 (gnus-low-score-mark)
20862 (gnus-catchup-mark (from -1) (subject -1))))
20863@end lisp
20864
20865As you see, each element in this alist has a mark as a key (either a
20866variable name or a ``real'' mark---a character). Following this key is
20867a arbitrary number of header/score pairs. If there are no header/score
20868pairs following the key, no adaptive scoring will be done on articles
20869that have that key as the article mark. For instance, articles with
20870@code{gnus-unread-mark} in the example above will not get adaptive score
20871entries.
20872
20873Each article can have only one mark, so just a single of these rules
20874will be applied to each article.
20875
20876To take @code{gnus-del-mark} as an example---this alist says that all
20877articles that have that mark (i.e., are marked with @samp{e}) will have a
20878score entry added to lower based on the @code{From} header by -4, and
20879lowered by @code{Subject} by -1. Change this to fit your prejudices.
20880
20881If you have marked 10 articles with the same subject with
20882@code{gnus-del-mark}, the rule for that mark will be applied ten times.
20883That means that that subject will get a score of ten times -1, which
20884should be, unless I'm much mistaken, -10.
20885
20886If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), all
20887the read articles will be marked with the @samp{E} mark. This'll
20888probably make adaptive scoring slightly impossible, so auto-expiring and
20889adaptive scoring doesn't really mix very well.
20890
20891The headers you can score on are @code{from}, @code{subject},
20892@code{message-id}, @code{references}, @code{xref}, @code{lines},
20893@code{chars} and @code{date}. In addition, you can score on
20894@code{followup}, which will create an adaptive score entry that matches
20895on the @code{References} header using the @code{Message-ID} of the
20896current article, thereby matching the following thread.
20897
20898If you use this scheme, you should set the score file atom @code{mark}
20899to something small---like -300, perhaps, to avoid having small random
20900changes result in articles getting marked as read.
20901
20902After using adaptive scoring for a week or so, Gnus should start to
20903become properly trained and enhance the authors you like best, and kill
20904the authors you like least, without you having to say so explicitly.
20905
20906You can control what groups the adaptive scoring is to be performed on
20907by using the score files (@pxref{Score File Format}). This will also
20908let you use different rules in different groups.
20909
20910@vindex gnus-adaptive-file-suffix
20911The adaptive score entries will be put into a file where the name is the
20912group name with @code{gnus-adaptive-file-suffix} appended. The default
20913is @file{ADAPT}.
20914
01c52d31
MB
20915@vindex gnus-adaptive-pretty-print
20916Adaptive score files can get huge and are not meant to be edited by
20917human hands. If @code{gnus-adaptive-pretty-print} is @code{nil} (the
86441999 20918default) those files will not be written in a human readable way.
01c52d31 20919
4009494e
GM
20920@vindex gnus-score-exact-adapt-limit
20921When doing adaptive scoring, substring or fuzzy matching would probably
20922give you the best results in most cases. However, if the header one
20923matches is short, the possibility for false positives is great, so if
20924the length of the match is less than
20925@code{gnus-score-exact-adapt-limit}, exact matching will be used. If
20926this variable is @code{nil}, exact matching will always be used to avoid
20927this problem.
20928
20929@vindex gnus-default-adaptive-word-score-alist
20930As mentioned above, you can adapt either on individual words or entire
20931headers. If you adapt on words, the
20932@code{gnus-default-adaptive-word-score-alist} variable says what score
20933each instance of a word should add given a mark.
20934
20935@lisp
20936(setq gnus-default-adaptive-word-score-alist
20937 `((,gnus-read-mark . 30)
20938 (,gnus-catchup-mark . -10)
20939 (,gnus-killed-mark . -20)
20940 (,gnus-del-mark . -15)))
20941@end lisp
20942
20943This is the default value. If you have adaption on words enabled, every
20944word that appears in subjects of articles marked with
20945@code{gnus-read-mark} will result in a score rule that increase the
20946score with 30 points.
20947
20948@vindex gnus-default-ignored-adaptive-words
20949@vindex gnus-ignored-adaptive-words
20950Words that appear in the @code{gnus-default-ignored-adaptive-words} list
20951will be ignored. If you wish to add more words to be ignored, use the
20952@code{gnus-ignored-adaptive-words} list instead.
20953
20954@vindex gnus-adaptive-word-length-limit
20955Some may feel that short words shouldn't count when doing adaptive
20956scoring. If so, you may set @code{gnus-adaptive-word-length-limit} to
20957an integer. Words shorter than this number will be ignored. This
20958variable defaults to @code{nil}.
20959
20960@vindex gnus-adaptive-word-syntax-table
20961When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the
20962syntax table in effect. It is similar to the standard syntax table, but
20963it considers numbers to be non-word-constituent characters.
20964
20965@vindex gnus-adaptive-word-minimum
20966If @code{gnus-adaptive-word-minimum} is set to a number, the adaptive
20967word scoring process will never bring down the score of an article to
20968below this number. The default is @code{nil}.
20969
20970@vindex gnus-adaptive-word-no-group-words
20971If @code{gnus-adaptive-word-no-group-words} is set to @code{t}, gnus
20972won't adaptively word score any of the words in the group name. Useful
20973for groups like @samp{comp.editors.emacs}, where most of the subject
20974lines contain the word @samp{emacs}.
20975
20976After using this scheme for a while, it might be nice to write a
20977@code{gnus-psychoanalyze-user} command to go through the rules and see
20978what words you like and what words you don't like. Or perhaps not.
20979
20980Note that the adaptive word scoring thing is highly experimental and is
20981likely to change in the future. Initial impressions seem to indicate
20982that it's totally useless as it stands. Some more work (involving more
20983rigorous statistical methods) will have to be done to make this useful.
20984
20985
20986@node Home Score File
20987@section Home Score File
20988
20989The score file where new score file entries will go is called the
20990@dfn{home score file}. This is normally (and by default) the score file
20991for the group itself. For instance, the home score file for
20992@samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}.
20993
20994However, this may not be what you want. It is often convenient to share
20995a common home score file among many groups---all @samp{emacs} groups
20996could perhaps use the same home score file.
20997
20998@vindex gnus-home-score-file
20999The variable that controls this is @code{gnus-home-score-file}. It can
21000be:
21001
21002@enumerate
21003@item
21004A string. Then this file will be used as the home score file for all
21005groups.
21006
21007@item
21008A function. The result of this function will be used as the home score
21009file. The function will be called with the name of the group as the
21010parameter.
21011
21012@item
21013A list. The elements in this list can be:
21014
21015@enumerate
21016@item
21017@code{(@var{regexp} @var{file-name})}. If the @var{regexp} matches the
21018group name, the @var{file-name} will be used as the home score file.
21019
21020@item
21021A function. If the function returns non-@code{nil}, the result will
21022be used as the home score file. The function will be called with the
21023name of the group as the parameter.
21024
21025@item
21026A string. Use the string as the home score file.
21027@end enumerate
21028
21029The list will be traversed from the beginning towards the end looking
21030for matches.
21031
21032@end enumerate
21033
21034So, if you want to use just a single score file, you could say:
21035
21036@lisp
21037(setq gnus-home-score-file
21038 "my-total-score-file.SCORE")
21039@end lisp
21040
21041If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and
21042@file{rec.SCORE} for all @samp{rec} groups (and so on), you can say:
21043
21044@findex gnus-hierarchial-home-score-file
21045@lisp
21046(setq gnus-home-score-file
21047 'gnus-hierarchial-home-score-file)
21048@end lisp
21049
21050This is a ready-made function provided for your convenience.
21051Other functions include
21052
21053@table @code
21054@item gnus-current-home-score-file
21055@findex gnus-current-home-score-file
21056Return the ``current'' regular score file. This will make scoring
21057commands add entry to the ``innermost'' matching score file.
21058
21059@end table
21060
21061If you want to have one score file for the @samp{emacs} groups and
21062another for the @samp{comp} groups, while letting all other groups use
21063their own home score files:
21064
21065@lisp
21066(setq gnus-home-score-file
21067 ;; @r{All groups that match the regexp @code{"\\.emacs"}}
21068 '(("\\.emacs" "emacs.SCORE")
21069 ;; @r{All the comp groups in one score file}
21070 ("^comp" "comp.SCORE")))
21071@end lisp
21072
21073@vindex gnus-home-adapt-file
21074@code{gnus-home-adapt-file} works exactly the same way as
21075@code{gnus-home-score-file}, but says what the home adaptive score file
21076is instead. All new adaptive file entries will go into the file
21077specified by this variable, and the same syntax is allowed.
21078
21079In addition to using @code{gnus-home-score-file} and
21080@code{gnus-home-adapt-file}, you can also use group parameters
21081(@pxref{Group Parameters}) and topic parameters (@pxref{Topic
21082Parameters}) to achieve much the same. Group and topic parameters take
21083precedence over this variable.
21084
21085
21086@node Followups To Yourself
21087@section Followups To Yourself
21088
21089Gnus offers two commands for picking out the @code{Message-ID} header in
21090the current buffer. Gnus will then add a score rule that scores using
21091this @code{Message-ID} on the @code{References} header of other
21092articles. This will, in effect, increase the score of all articles that
21093respond to the article in the current buffer. Quite useful if you want
21094to easily note when people answer what you've said.
21095
21096@table @code
21097
21098@item gnus-score-followup-article
21099@findex gnus-score-followup-article
21100This will add a score to articles that directly follow up your own
21101article.
21102
21103@item gnus-score-followup-thread
21104@findex gnus-score-followup-thread
21105This will add a score to all articles that appear in a thread ``below''
21106your own article.
21107@end table
21108
21109@vindex message-sent-hook
21110These two functions are both primarily meant to be used in hooks like
21111@code{message-sent-hook}, like this:
21112@lisp
21113(add-hook 'message-sent-hook 'gnus-score-followup-thread)
21114@end lisp
21115
21116
21117If you look closely at your own @code{Message-ID}, you'll notice that
21118the first two or three characters are always the same. Here's two of
21119mine:
21120
21121@example
21122<x6u3u47icf.fsf@@eyesore.no>
21123<x6sp9o7ibw.fsf@@eyesore.no>
21124@end example
21125
21126So ``my'' ident on this machine is @samp{x6}. This can be
21127exploited---the following rule will raise the score on all followups to
21128myself:
21129
21130@lisp
21131("references"
21132 ("<x6[0-9a-z]+\\.fsf\\(_-_\\)?@@.*eyesore\\.no>"
21133 1000 nil r))
21134@end lisp
21135
21136Whether it's the first two or first three characters that are ``yours''
21137is system-dependent.
21138
21139
21140@node Scoring On Other Headers
21141@section Scoring On Other Headers
21142@cindex scoring on other headers
21143
21144Gnus is quite fast when scoring the ``traditional''
21145headers---@samp{From}, @samp{Subject} and so on. However, scoring
21146other headers requires writing a @code{head} scoring rule, which means
21147that Gnus has to request every single article from the back end to find
21148matches. This takes a long time in big groups.
21149
58333467
MB
21150@vindex gnus-inhibit-slow-scoring
21151You can inhibit this slow scoring on headers or body by setting the
21152variable @code{gnus-inhibit-slow-scoring}. If
21153@code{gnus-inhibit-slow-scoring} is regexp, slow scoring is inhibited if
21154the group matches the regexp. If it is t, slow scoring on it is
21155inhibited for all groups.
21156
21157Now, there's not much you can do about the slowness for news groups, but for
4009494e
GM
21158mail groups, you have greater control. In @ref{To From Newsgroups},
21159it's explained in greater detail what this mechanism does, but here's
21160a cookbook example for @code{nnml} on how to allow scoring on the
21161@samp{To} and @samp{Cc} headers.
21162
21163Put the following in your @file{~/.gnus.el} file.
21164
21165@lisp
21166(setq gnus-extra-headers '(To Cc Newsgroups Keywords)
21167 nnmail-extra-headers gnus-extra-headers)
21168@end lisp
21169
21170Restart Gnus and rebuild your @code{nnml} overview files with the
21171@kbd{M-x nnml-generate-nov-databases} command. This will take a long
21172time if you have much mail.
21173
21174Now you can score on @samp{To} and @samp{Cc} as ``extra headers'' like
21175so: @kbd{I e s p To RET <your name> RET}.
21176
21177See? Simple.
21178
21179
21180@node Scoring Tips
21181@section Scoring Tips
21182@cindex scoring tips
21183
21184@table @dfn
21185
21186@item Crossposts
21187@cindex crossposts
21188@cindex scoring crossposts
21189If you want to lower the score of crossposts, the line to match on is
21190the @code{Xref} header.
21191@lisp
21192("xref" (" talk.politics.misc:" -1000))
21193@end lisp
21194
21195@item Multiple crossposts
21196If you want to lower the score of articles that have been crossposted to
21197more than, say, 3 groups:
21198@lisp
21199("xref"
21200 ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+"
21201 -1000 nil r))
21202@end lisp
21203
21204@item Matching on the body
21205This is generally not a very good idea---it takes a very long time.
21206Gnus actually has to fetch each individual article from the server. But
21207you might want to anyway, I guess. Even though there are three match
21208keys (@code{Head}, @code{Body} and @code{All}), you should choose one
21209and stick with it in each score file. If you use any two, each article
21210will be fetched @emph{twice}. If you want to match a bit on the
21211@code{Head} and a bit on the @code{Body}, just use @code{All} for all
21212the matches.
21213
21214@item Marking as read
21215You will probably want to mark articles that have scores below a certain
21216number as read. This is most easily achieved by putting the following
21217in your @file{all.SCORE} file:
21218@lisp
21219((mark -100))
21220@end lisp
21221You may also consider doing something similar with @code{expunge}.
21222
21223@item Negated character classes
21224If you say stuff like @code{[^abcd]*}, you may get unexpected results.
21225That will match newlines, which might lead to, well, The Unknown. Say
21226@code{[^abcd\n]*} instead.
21227@end table
21228
21229
21230@node Reverse Scoring
21231@section Reverse Scoring
21232@cindex reverse scoring
21233
21234If you want to keep just articles that have @samp{Sex with Emacs} in the
21235subject header, and expunge all other articles, you could put something
21236like this in your score file:
21237
21238@lisp
21239(("subject"
21240 ("Sex with Emacs" 2))
21241 (mark 1)
21242 (expunge 1))
21243@end lisp
21244
21245So, you raise all articles that match @samp{Sex with Emacs} and mark the
21246rest as read, and expunge them to boot.
21247
21248
21249@node Global Score Files
21250@section Global Score Files
21251@cindex global score files
21252
21253Sure, other newsreaders have ``global kill files''. These are usually
21254nothing more than a single kill file that applies to all groups, stored
21255in the user's home directory. Bah! Puny, weak newsreaders!
21256
21257What I'm talking about here are Global Score Files. Score files from
21258all over the world, from users everywhere, uniting all nations in one
21259big, happy score file union! Ange-score! New and untested!
21260
21261@vindex gnus-global-score-files
21262All you have to do to use other people's score files is to set the
21263@code{gnus-global-score-files} variable. One entry for each score file,
21264or each score file directory. Gnus will decide by itself what score
21265files are applicable to which group.
21266
21267To use the score file
21268@file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} and
21269all score files in the @file{/ftp@@ftp.some-where:/pub/score} directory,
21270say this:
21271
21272@lisp
21273(setq gnus-global-score-files
21274 '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE"
21275 "/ftp@@ftp.some-where:/pub/score/"))
21276@end lisp
21277
21278@findex gnus-score-search-global-directories
21279@noindent
21280Simple, eh? Directory names must end with a @samp{/}. These
21281directories are typically scanned only once during each Gnus session.
21282If you feel the need to manually re-scan the remote directories, you can
21283use the @code{gnus-score-search-global-directories} command.
21284
21285Note that, at present, using this option will slow down group entry
21286somewhat. (That is---a lot.)
21287
21288If you want to start maintaining score files for other people to use,
21289just put your score file up for anonymous ftp and announce it to the
21290world. Become a retro-moderator! Participate in the retro-moderator
21291wars sure to ensue, where retro-moderators battle it out for the
21292sympathy of the people, luring them to use their score files on false
21293premises! Yay! The net is saved!
21294
21295Here are some tips for the would-be retro-moderator, off the top of my
21296head:
21297
21298@itemize @bullet
21299
21300@item
21301Articles heavily crossposted are probably junk.
21302@item
21303To lower a single inappropriate article, lower by @code{Message-ID}.
21304@item
21305Particularly brilliant authors can be raised on a permanent basis.
21306@item
21307Authors that repeatedly post off-charter for the group can safely be
21308lowered out of existence.
21309@item
21310Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest
21311articles completely.
21312
21313@item
21314Use expiring score entries to keep the size of the file down. You
21315should probably have a long expiry period, though, as some sites keep
21316old articles for a long time.
21317@end itemize
21318
21319@dots{} I wonder whether other newsreaders will support global score files
21320in the future. @emph{Snicker}. Yup, any day now, newsreaders like Blue
21321Wave, xrn and 1stReader are bound to implement scoring. Should we start
21322holding our breath yet?
21323
21324
21325@node Kill Files
21326@section Kill Files
21327@cindex kill files
21328
21329Gnus still supports those pesky old kill files. In fact, the kill file
21330entries can now be expiring, which is something I wrote before Daniel
21331Quinlan thought of doing score files, so I've left the code in there.
21332
21333In short, kill processing is a lot slower (and I do mean @emph{a lot})
21334than score processing, so it might be a good idea to rewrite your kill
21335files into score files.
21336
21337Anyway, a kill file is a normal @code{emacs-lisp} file. You can put any
21338forms into this file, which means that you can use kill files as some
21339sort of primitive hook function to be run on group entry, even though
21340that isn't a very good idea.
21341
21342Normal kill files look like this:
21343
21344@lisp
21345(gnus-kill "From" "Lars Ingebrigtsen")
21346(gnus-kill "Subject" "ding")
21347(gnus-expunge "X")
21348@end lisp
21349
21350This will mark every article written by me as read, and remove the
21351marked articles from the summary buffer. Very useful, you'll agree.
21352
21353Other programs use a totally different kill file syntax. If Gnus
21354encounters what looks like a @code{rn} kill file, it will take a stab at
21355interpreting it.
21356
21357Two summary functions for editing a @sc{gnus} kill file:
21358
21359@table @kbd
21360
21361@item M-k
21362@kindex M-k (Summary)
21363@findex gnus-summary-edit-local-kill
21364Edit this group's kill file (@code{gnus-summary-edit-local-kill}).
21365
21366@item M-K
21367@kindex M-K (Summary)
21368@findex gnus-summary-edit-global-kill
21369Edit the general kill file (@code{gnus-summary-edit-global-kill}).
21370@end table
21371
21372Two group mode functions for editing the kill files:
21373
21374@table @kbd
21375
21376@item M-k
21377@kindex M-k (Group)
21378@findex gnus-group-edit-local-kill
21379Edit this group's kill file (@code{gnus-group-edit-local-kill}).
21380
21381@item M-K
21382@kindex M-K (Group)
21383@findex gnus-group-edit-global-kill
21384Edit the general kill file (@code{gnus-group-edit-global-kill}).
21385@end table
21386
21387Kill file variables:
21388
21389@table @code
21390@item gnus-kill-file-name
21391@vindex gnus-kill-file-name
21392A kill file for the group @samp{soc.motss} is normally called
21393@file{soc.motss.KILL}. The suffix appended to the group name to get
21394this file name is detailed by the @code{gnus-kill-file-name} variable.
21395The ``global'' kill file (not in the score file sense of ``global'', of
21396course) is just called @file{KILL}.
21397
21398@vindex gnus-kill-save-kill-file
21399@item gnus-kill-save-kill-file
21400If this variable is non-@code{nil}, Gnus will save the
21401kill file after processing, which is necessary if you use expiring
21402kills.
21403
21404@item gnus-apply-kill-hook
21405@vindex gnus-apply-kill-hook
21406@findex gnus-apply-kill-file-unless-scored
21407@findex gnus-apply-kill-file
21408A hook called to apply kill files to a group. It is
21409@code{(gnus-apply-kill-file)} by default. If you want to ignore the
21410kill file if you have a score file for the same group, you can set this
21411hook to @code{(gnus-apply-kill-file-unless-scored)}. If you don't want
21412kill files to be processed, you should set this variable to @code{nil}.
21413
21414@item gnus-kill-file-mode-hook
21415@vindex gnus-kill-file-mode-hook
21416A hook called in kill-file mode buffers.
21417
21418@end table
21419
21420
21421@node Converting Kill Files
21422@section Converting Kill Files
21423@cindex kill files
21424@cindex converting kill files
21425
21426If you have loads of old kill files, you may want to convert them into
21427score files. If they are ``regular'', you can use
21428the @file{gnus-kill-to-score.el} package; if not, you'll have to do it
21429by hand.
21430
e3e955fe
MB
21431The kill to score conversion package isn't included in Emacs by default.
21432You can fetch it from the contrib directory of the Gnus distribution or
21433from
21434@uref{http://heim.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el}.
4009494e
GM
21435
21436If your old kill files are very complex---if they contain more
21437non-@code{gnus-kill} forms than not, you'll have to convert them by
21438hand. Or just let them be as they are. Gnus will still use them as
21439before.
21440
21441
4009494e
GM
21442@node Advanced Scoring
21443@section Advanced Scoring
21444
21445Scoring on Subjects and From headers is nice enough, but what if you're
21446really interested in what a person has to say only when she's talking
21447about a particular subject? Or what if you really don't want to
21448read what person A has to say when she's following up to person B, but
21449want to read what she says when she's following up to person C?
21450
21451By using advanced scoring rules you may create arbitrarily complex
21452scoring patterns.
21453
21454@menu
21455* Advanced Scoring Syntax:: A definition.
21456* Advanced Scoring Examples:: What they look like.
21457* Advanced Scoring Tips:: Getting the most out of it.
21458@end menu
21459
21460
21461@node Advanced Scoring Syntax
21462@subsection Advanced Scoring Syntax
21463
21464Ordinary scoring rules have a string as the first element in the rule.
21465Advanced scoring rules have a list as the first element. The second
21466element is the score to be applied if the first element evaluated to a
21467non-@code{nil} value.
21468
21469These lists may consist of three logical operators, one redirection
21470operator, and various match operators.
21471
21472Logical operators:
21473
21474@table @code
21475@item &
21476@itemx and
21477This logical operator will evaluate each of its arguments until it finds
21478one that evaluates to @code{false}, and then it'll stop. If all arguments
21479evaluate to @code{true} values, then this operator will return
21480@code{true}.
21481
21482@item |
21483@itemx or
21484This logical operator will evaluate each of its arguments until it finds
21485one that evaluates to @code{true}. If no arguments are @code{true},
21486then this operator will return @code{false}.
21487
21488@item !
21489@itemx not
21490