Synch to Oort Gnus.
[elisp/gnus.git-] / texi / gnus.texi
1 \input texinfo
2
3 @setfilename gnus
4 @settitle T-gnus 6.15 Manual
5 @synindex fn cp
6 @synindex vr cp
7 @synindex pg cp
8 @dircategory Emacs
9 @direntry
10 * Gnus: (gnus).         The newsreader Gnus.
11 @end direntry
12 @iftex
13 @finalout
14 @end iftex
15 @setchapternewpage odd
16
17 @iftex
18 @iflatex
19 \documentclass[twoside,a4paper,openright,11pt]{book}
20 \usepackage[latin1]{inputenc}
21 \usepackage{pagestyle}
22 \usepackage{epsfig}
23 \usepackage{pixidx}
24 \input{gnusconfig.tex}
25
26 \ifx\pdfoutput\undefined
27 \else
28 \usepackage[pdftex,bookmarks,colorlinks=true]{hyperref}
29 \usepackage{thumbpdf}
30 \pdfcompresslevel=9
31 \fi
32
33 \makeindex
34 \begin{document}
35
36 \newcommand{\gnusversionname}{T-gnus v6.15}
37 \newcommand{\gnuschaptername}{}
38 \newcommand{\gnussectionname}{}
39
40 \newcommand{\gnusbackslash}{/}
41
42 \newcommand{\gnusref}[1]{``#1'' on page \pageref{#1}}
43 \ifx\pdfoutput\undefined
44 \newcommand{\gnusuref}[1]{\gnustt{#1}}
45 \else
46 \newcommand{\gnusuref}[1]{\href{#1}{\gnustt{#1}}}
47 \fi
48 \newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}}
49 \newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}}
50
51 \newcommand{\gnuskindex}[1]{\index{#1}}
52 \newcommand{\gnusindex}[1]{\index{#1}}
53
54 \newcommand{\gnustt}[1]{{\gnusselectttfont{}#1}}
55 \newcommand{\gnuscode}[1]{\gnustt{#1}}
56 \newcommand{\gnussamp}[1]{``{\fontencoding{OT1}\gnusselectttfont{}#1}''}
57 \newcommand{\gnuslisp}[1]{\gnustt{#1}}
58 \newcommand{\gnuskbd}[1]{`\gnustt{#1}'}
59 \newcommand{\gnuskey}[1]{`\gnustt{#1}'}
60 \newcommand{\gnusfile}[1]{`\gnustt{#1}'}
61 \newcommand{\gnusdfn}[1]{\textit{#1}}
62 \newcommand{\gnusi}[1]{\textit{#1}}
63 \newcommand{\gnusstrong}[1]{\textbf{#1}}
64 \newcommand{\gnusemph}[1]{\textit{#1}}
65 \newcommand{\gnusvar}[1]{{\fontsize{10pt}{10}\selectfont\textsl{\textsf{#1}}}}
66 \newcommand{\gnussc}[1]{\textsc{#1}}
67 \newcommand{\gnustitle}[1]{{\huge\textbf{#1}}}
68 \newcommand{\gnusversion}[1]{{\small\textit{#1}}}
69 \newcommand{\gnusauthor}[1]{{\large\textbf{#1}}}
70 \newcommand{\gnusresult}[1]{\gnustt{=> #1}}
71 \newcommand{\gnusacronym}[1]{\textit{#1}}
72 \newcommand{\gnusemail}[1]{\textit{#1}}
73
74 \newcommand{\gnusbullet}{{${\bullet}$}}
75 \newcommand{\gnusdollar}{\$}
76 \newcommand{\gnusampersand}{\&}
77 \newcommand{\gnuspercent}{\%}
78 \newcommand{\gnushash}{\#}
79 \newcommand{\gnushat}{\symbol{"5E}}
80 \newcommand{\gnusunderline}{\symbol{"5F}}
81 \newcommand{\gnusnot}{$\neg$}
82 \newcommand{\gnustilde}{\symbol{"7E}}
83 \newcommand{\gnusless}{{$<$}}
84 \newcommand{\gnusgreater}{{$>$}}
85 \newcommand{\gnusbraceleft}{{$>$}}
86 \newcommand{\gnusbraceright}{{$>$}}
87
88 \newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head,height=1cm}}}
89 \newcommand{\gnusinteresting}{
90 \marginpar[\mbox{}\hfill\gnushead]{\gnushead}
91 }
92
93 \newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
94
95 \newcommand{\gnuspagechapter}[1]{
96 {\mbox{}}
97 }
98
99 \newdimen{\gnusdimen}
100 \gnusdimen 0pt
101
102 \newcommand{\gnuschapter}[2]{
103 \gnuscleardoublepage
104 \ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi
105 \chapter{#2}
106 \renewcommand{\gnussectionname}{}
107 \renewcommand{\gnuschaptername}{#2}
108 \thispagestyle{empty}
109 \hspace*{-2cm}
110 \begin{picture}(500,500)(0,0)
111 \put(480,350){\makebox(0,0)[tr]{#1}}
112 \put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}}
113 \end{picture}
114 \clearpage
115 }
116
117 \newcommand{\gnusfigure}[3]{
118 \begin{figure}
119 \mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2)
120 #3
121 \end{picture}
122 \caption{#1}
123 \end{figure}
124 }
125
126 \newcommand{\gnusicon}[1]{
127 \marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=ps/#1-up,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=ps/#1-up,height=1cm}}}
128 }
129
130 \newcommand{\gnuspicon}[1]{
131 \margindex{\epsfig{figure=#1,width=2cm}}
132 }
133
134 \newcommand{\gnusxface}[2]{
135 \margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}}
136 }
137
138 \newcommand{\gnussmiley}[2]{
139 \margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}}
140 }
141
142 \newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1}
143
144 \newcommand{\gnussection}[1]{
145 \renewcommand{\gnussectionname}{#1}
146 \section{#1}
147 }
148
149 \newenvironment{codelist}%
150 {\begin{list}{}{
151 }
152 }{\end{list}}
153
154 \newenvironment{kbdlist}%
155 {\begin{list}{}{
156 \labelwidth=0cm
157 }
158 }{\end{list}}
159
160 \newenvironment{dfnlist}%
161 {\begin{list}{}{
162 }
163 }{\end{list}}
164
165 \newenvironment{stronglist}%
166 {\begin{list}{}{
167 }
168 }{\end{list}}
169
170 \newenvironment{samplist}%
171 {\begin{list}{}{
172 }
173 }{\end{list}}
174
175 \newenvironment{varlist}%
176 {\begin{list}{}{
177 }
178 }{\end{list}}
179
180 \newenvironment{emphlist}%
181 {\begin{list}{}{
182 }
183 }{\end{list}}
184
185 \newlength\gnusheadtextwidth
186 \setlength{\gnusheadtextwidth}{\headtextwidth}
187 \addtolength{\gnusheadtextwidth}{1cm}
188
189 \newpagestyle{gnuspreamble}%
190 {
191 {
192 \ifodd\count0
193 {
194 \hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}}
195 }
196 \else
197 {
198 \hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}}
199 }
200 }
201 \fi
202 }
203 }
204 {
205 \ifodd\count0
206 \mbox{} \hfill
207 \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
208 \else
209 \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
210 \hfill \mbox{}
211 \fi
212 }
213
214 \newpagestyle{gnusindex}%
215 {
216 {
217 \ifodd\count0
218 {
219 \hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}}
220 }
221 \else
222 {
223 \hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}
224 }
225 \fi
226 }
227 }
228 {
229 \ifodd\count0
230 \mbox{} \hfill
231 \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
232 \else
233 \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
234 \hfill \mbox{}
235 \fi
236 }
237
238 \newpagestyle{gnus}%
239 {
240 {
241 \ifodd\count0
242 {
243 \makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}}
244 }
245 \else
246 {
247 \makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}}
248 }
249 \fi
250 }
251 }
252 {
253 \ifodd\count0
254 \mbox{} \hfill
255 \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
256 \else
257 \raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
258 \hfill \mbox{}
259 \fi
260 }
261
262 \pagenumbering{roman}
263 \pagestyle{gnuspreamble}
264
265 @end iflatex
266 @end iftex
267
268 @iftex
269 @iflatex
270 \begin{titlepage}
271 {
272
273 %\addtolength{\oddsidemargin}{-5cm}
274 %\addtolength{\evensidemargin}{-5cm}
275 \parindent=0cm
276 \addtolength{\textheight}{2cm}
277
278 \gnustitle{\gnustitlename}\hfill\gnusversion{\gnusversionname}\\
279 \rule{15cm}{1mm}\\
280 \vfill
281 \hspace*{0cm}\epsfig{figure=ps/gnus-big-logo,height=15cm}
282 \vfill
283 \rule{15cm}{1mm}\\
284 \gnusauthor{by Lars Magne Ingebrigtsen}
285 \newpage
286 }
287
288 \mbox{}
289 \vfill
290
291 \thispagestyle{empty}
292
293 Copyright \copyright{} 1995, 1996, 1997, 1998, 1999, 2000, 2001,
294 2002, 2003
295 Free Software Foundation, Inc.
296
297
298 Permission is granted to copy, distribute and/or modify this document
299 under the terms of the GNU Free Documentation License, Version 1.1 or
300 any later version published by the Free Software Foundation; with no
301 Invariant Sections, with the Front-Cover texts being ``A GNU
302 Manual'', and with the Back-Cover Texts as in (a) below.  A copy of the
303 license is included in the section entitled ``GNU Free Documentation
304 License'' in the Emacs manual.
305
306 (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
307 this GNU Manual, like GNU software.  Copies published by the Free
308 Software Foundation raise funds for GNU development.''
309
310 This document is part of a collection distributed under the GNU Free
311 Documentation License.  If you want to distribute this document
312 separately from the collection, you can do so by adding a copy of the
313 license to the document, as described in section 6 of the license.
314 \newpage
315 \end{titlepage}
316 @end iflatex
317 @end iftex
318
319 @ifnottex
320
321 This file documents gnus, the GNU Emacs newsreader.
322
323 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
324         Free Software Foundation, Inc.
325
326 Permission is granted to copy, distribute and/or modify this document
327 under the terms of the GNU Free Documentation License, Version 1.1 or
328 any later version published by the Free Software Foundation; with the
329 Invariant Sections being none, with the Front-Cover texts being ``A GNU
330 Manual'', and with the Back-Cover Texts as in (a) below.  A copy of the
331 license is included in the section entitled ``GNU Free Documentation
332 License'' in the Emacs manual.
333
334 (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
335 this GNU Manual, like GNU software.  Copies published by the Free
336 Software Foundation raise funds for GNU development.''
337
338 This document is part of a collection distributed under the GNU Free
339 Documentation License.  If you want to distribute this document
340 separately from the collection, you can do so by adding a copy of the
341 license to the document, as described in section 6 of the license.
342 @end ifnottex
343
344 @tex
345
346 @titlepage
347 @title T-gnus 6.15 Manual
348
349 @author by Lars Magne Ingebrigtsen
350 @page
351
352 @vskip 0pt plus 1filll
353 Copyright @copyright{} 1995, 1996, 1997, 1998, 1999, 2000, 2001,
354 2002, 2003
355         Free Software Foundation, Inc.
356
357 Permission is granted to copy, distribute and/or modify this document
358 under the terms of the GNU Free Documentation License, Version 1.1 or
359 any later version published by the Free Software Foundation; with no
360 Invariant Sections, with the Front-Cover texts being ``A GNU
361 Manual'', and with the Back-Cover Texts as in (a) below.  A copy of the
362 license is included in the section entitled ``GNU Free Documentation
363 License'' in the Emacs manual.
364
365 (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
366 this GNU Manual, like GNU software.  Copies published by the Free
367 Software Foundation raise funds for GNU development.''
368
369 This document is part of a collection distributed under the GNU Free
370 Documentation License.  If you want to distribute this document
371 separately from the collection, you can do so by adding a copy of the
372 license to the document, as described in section 6 of the license.
373
374 @end titlepage
375 @page
376
377 @end tex
378
379
380 @node Top
381 @top The gnus Newsreader
382
383 @ifinfo
384
385 You can read news (and mail) from within Emacs by using gnus.  The news
386 can be gotten by any nefarious means you can think of---@sc{nntp}, local
387 spool or your mbox file.  All at the same time, if you want to push your
388 luck.
389
390 T-gnus provides @sc{mime} features based on @sc{semi} API.  So T-gnus
391 supports your right to read strange messages including big images or
392 other various kinds of formats.  T-gnus also supports
393 internationalization/localization and multiscript features based on MULE
394 API.  So T-gnus does not discriminate various language communities.
395 Oh, if you are a Klingon, please wait Unicode Next Generation.
396
397 This manual corresponds to T-gnus 6.15.
398
399 @end ifinfo
400
401 @iftex
402
403 @iflatex
404 \tableofcontents
405 \gnuscleardoublepage
406 @end iflatex
407
408 Gnus is the advanced, self-documenting, customizable, extensible
409 unreal-time newsreader for GNU Emacs.
410
411 Oops.  That sounds oddly familiar, so let's start over again to avoid
412 being accused of plagiarism:
413
414 Gnus is a message-reading laboratory.  It will let you look at just
415 about anything as if it were a newsgroup.  You can read mail with it,
416 you can browse directories with it, you can @code{ftp} with it---you
417 can even read news with it!
418
419 Gnus tries to empower people who read news the same way Emacs empowers
420 people who edit text.  Gnus sets no limits to what the user should be
421 allowed to do.  Users are encouraged to extend gnus to make it behave
422 like they want it to behave.  A program should not control people;
423 people should be empowered to do what they want by using (or abusing)
424 the program.
425
426 @end iftex
427
428 @menu
429 * Starting Up::                 Finding news can be a pain.
430 * Group Buffer::                Selecting, subscribing and killing groups.
431 * Summary Buffer::              Reading, saving and posting articles.
432 * Article Buffer::              Displaying and handling articles.
433 * Composing Messages::          Information on sending mail and news.
434 * Select Methods::              Gnus reads all messages from various select methods.
435 * Scoring::                     Assigning values to articles.
436 * Various::                     General purpose settings.
437 * The End::                     Farewell and goodbye.
438 * Appendices::                  Terminology, Emacs intro, FAQ, History, Internals.
439 * Index::                       Variable, function and concept index.
440 * Key Index::                   Key Index.
441
442 Other related manuals
443
444 * Message:(message).            Composing messages.
445 * Emacs-MIME:(emacs-mime).      Composing messages; MIME-specific parts.
446 * Sieve:(sieve).                Managing Sieve scripts in Emacs.
447 * PGG:(pgg).                    PGP/MIME with Gnus.
448
449 @detailmenu
450  --- The Detailed Node Listing ---
451
452 Starting Gnus
453
454 * Finding the News::            Choosing a method for getting news.
455 * The First Time::              What does Gnus do the first time you start it?
456 * The Server is Down::          How can I read my mail then?
457 * Slave Gnusae::                You can have more than one Gnus active at a time.
458 * Fetching a Group::            Starting Gnus just to read a group.
459 * New Groups::                  What is Gnus supposed to do with new groups?
460 * Changing Servers::            You may want to move from one server to another.
461 * Startup Files::               Those pesky startup files---@file{.newsrc}.
462 * Auto Save::                   Recovering from a crash.
463 * The Active File::             Reading the active file over a slow line Takes Time.
464 * Startup Variables::           Other variables you might change.
465
466 New Groups
467
468 * Checking New Groups::         Determining what groups are new.
469 * Subscription Methods::        What Gnus should do with new groups.
470 * Filtering New Groups::        Making Gnus ignore certain new groups.
471
472 Group Buffer
473
474 * Group Buffer Format::         Information listed and how you can change it.
475 * Group Maneuvering::           Commands for moving in the group buffer.
476 * Selecting a Group::           Actually reading news.
477 * Subscription Commands::       Unsubscribing, killing, subscribing.
478 * Group Data::                  Changing the info for a group.
479 * Group Levels::                Levels? What are those, then?
480 * Group Score::                 A mechanism for finding out what groups you like.
481 * Marking Groups::              You can mark groups for later processing.
482 * Foreign Groups::              Creating and editing groups.
483 * Group Parameters::            Each group may have different parameters set.
484 * Listing Groups::              Gnus can list various subsets of the groups.
485 * Sorting Groups::              Re-arrange the group order.
486 * Group Maintenance::           Maintaining a tidy @file{.newsrc} file.
487 * Browse Foreign Server::       You can browse a server.  See what it has to offer.
488 * Exiting Gnus::                Stop reading news and get some work done.
489 * Group Topics::                A folding group mode divided into topics.
490 * Misc Group Stuff::            Other stuff that you can to do.
491
492 Group Buffer Format
493
494 * Group Line Specification::    Deciding how the group buffer is to look.
495 * Group Modeline Specification::  The group buffer modeline.
496 * Group Highlighting::          Having nice colors in the group buffer.
497
498 Group Topics
499
500 * Topic Commands::              Interactive E-Z commands.
501 * Topic Variables::             How to customize the topics the Lisp Way.
502 * Topic Sorting::               Sorting each topic individually.
503 * Topic Topology::              A map of the world.
504 * Topic Parameters::            Parameters that apply to all groups in a topic.
505
506 Misc Group Stuff
507
508 * Scanning New Messages::       Asking Gnus to see whether new messages have arrived.
509 * Group Information::           Information and help on groups and Gnus.
510 * Group Timestamp::             Making Gnus keep track of when you last read a group.
511 * File Commands::               Reading and writing the Gnus files.
512 * Sieve Commands::              Managing Sieve scripts.
513
514 Summary Buffer
515
516 * Summary Buffer Format::       Deciding how the summary buffer is to look.
517 * Summary Maneuvering::         Moving around the summary buffer.
518 * Choosing Articles::           Reading articles.
519 * Paging the Article::          Scrolling the current article.
520 * Reply Followup and Post::     Posting articles.
521 * Delayed Articles::            Send articles at a later time.
522 * Marking Articles::            Marking articles as read, expirable, etc.
523 * Limiting::                    You can limit the summary buffer.
524 * Threading::                   How threads are made.
525 * Sorting the Summary Buffer::  How articles and threads are sorted.
526 * Asynchronous Fetching::       Gnus might be able to pre-fetch articles.
527 * Article Caching::             You may store articles in a cache.
528 * Persistent Articles::         Making articles expiry-resistant.
529 * Article Backlog::             Having already read articles hang around.
530 * Saving Articles::             Ways of customizing article saving.
531 * Decoding Articles::           Gnus can treat series of (uu)encoded articles.
532 * Article Treatment::           The article buffer can be mangled at will.
533 * MIME Commands::               Doing MIMEy things with the articles.
534 * Charsets::                    Character set issues.
535 * Article Commands::            Doing various things with the article buffer.
536 * Summary Sorting::             Sorting the summary buffer in various ways.
537 * Finding the Parent::          No child support? Get the parent.
538 * Alternative Approaches::      Reading using non-default summaries.
539 * Tree Display::                A more visual display of threads.
540 * Mail Group Commands::         Some commands can only be used in mail groups.
541 * Various Summary Stuff::       What didn't fit anywhere else.
542 * Exiting the Summary Buffer::  Returning to the Group buffer,
543                                 or reselecting the current group.
544 * Crosspost Handling::          How crossposted articles are dealt with.
545 * Duplicate Suppression::       An alternative when crosspost handling fails.
546 * Security::                    Decrypt and Verify.
547 * Mailing List::                Mailing list minor mode.
548
549 Summary Buffer Format
550
551 * Summary Buffer Lines::        You can specify how summary lines should look.
552 * To From Newsgroups::          How to not display your own name.
553 * Summary Buffer Mode Line::    You can say how the mode line should look.
554 * Summary Highlighting::        Making the summary buffer all pretty and nice.
555
556 Choosing Articles
557
558 * Choosing Commands::           Commands for choosing articles.
559 * Choosing Variables::          Variables that influence these commands.
560
561 Reply, Followup and Post
562
563 * Summary Mail Commands::       Sending mail.
564 * Summary Post Commands::       Sending news.
565 * Summary Message Commands::    Other Message-related commands.
566 * Canceling and Superseding::   
567
568 Marking Articles
569
570 * Unread Articles::             Marks for unread articles.
571 * Read Articles::               Marks for read articles.
572 * Other Marks::                 Marks that do not affect readedness.
573 * Setting Marks::               
574 * Generic Marking Commands::    
575 * Setting Process Marks::       
576
577 Marking Articles
578
579 * Setting Marks::             How to set and remove marks.
580 * Generic Marking Commands::  How to customize the marking.
581 * Setting Process Marks::     How to mark articles for later processing.
582
583 Threading
584
585 * Customizing Threading::       Variables you can change to affect the threading.
586 * Thread Commands::             Thread based commands in the summary buffer.
587
588 Customizing Threading
589
590 * Loose Threads::               How Gnus gathers loose threads into bigger threads.
591 * Filling In Threads::          Making the threads displayed look fuller.
592 * More Threading::              Even more variables for fiddling with threads.
593 * Low-Level Threading::         You thought it was over... but you were wrong!
594
595 Decoding Articles
596
597 * Uuencoded Articles::          Uudecode articles.
598 * Shell Archives::              Unshar articles.
599 * PostScript Files::            Split PostScript.
600 * Other Files::                 Plain save and binhex.
601 * Decoding Variables::          Variables for a happy decoding.
602 * Viewing Files::               You want to look at the result of the decoding?
603
604 Decoding Variables
605
606 * Rule Variables::              Variables that say how a file is to be viewed.
607 * Other Decode Variables::      Other decode variables.
608 * Uuencoding and Posting::      Variables for customizing uuencoding.
609
610 Article Treatment
611
612 * Article Highlighting::        You want to make the article look like fruit salad.
613 * Article Fontisizing::         Making emphasized text look nice.
614 * Article Hiding::              You also want to make certain info go away.
615 * Article Washing::             Lots of way-neat functions to make life better.
616 * Article Header::              Doing various header transformations.
617 * Article Buttons::             Click on URLs, Message-IDs, addresses and the like.
618 * Article Date::                Grumble, UT!
619 * Article Display::             Display various stuff---X-Face, Picons, Smileys
620 * Article Signature::           What is a signature?
621 * Article Miscellania::         Various other stuff.
622
623 Alternative Approaches
624
625 * Pick and Read::               First mark articles and then read them.
626 * Binary Groups::               Auto-decode all articles.
627
628 Various Summary Stuff
629
630 * Summary Group Information::   Information oriented commands.
631 * Searching for Articles::      Multiple article commands.
632 * Summary Generation Commands::  
633 * Really Various Summary Commands::  Those pesky non-conformant commands.
634
635 Article Buffer
636
637 * Hiding Headers::              Deciding what headers should be displayed.
638 * Using MIME::                  Pushing articles through @sc{mime} before reading them.
639 * Customizing Articles::        Tailoring the look of the articles.
640 * Article Keymap::              Keystrokes available in the article buffer.
641 * Misc Article::                Other stuff.
642
643 Composing Messages
644
645 * Mail::                        Mailing and replying.
646 * Posting Server::              What server should you post and mail via?
647 * Mail and Post::               Mailing and posting at the same time.
648 * Archived Messages::           Where Gnus stores the messages you've sent.
649 * Posting Styles::              An easier way to specify who you are.
650 * Drafts::                      Postponing messages and rejected messages.
651 * Rejected Articles::           What happens if the server doesn't like your article?
652 * Signing and encrypting::      How to compose secure messages.
653
654 Select Methods
655
656 * Server Buffer::               Making and editing virtual servers.
657 * Getting News::                Reading USENET news with Gnus.
658 * Getting Mail::                Reading your personal mail with Gnus.
659 * Browsing the Web::            Getting messages from a plethora of Web sources.
660 * IMAP::                        Using Gnus as a @sc{imap} client.
661 * Other Sources::               Reading directories, files, SOUP packets.
662 * Combined Groups::             Combining groups into one group.
663 * Gnus Unplugged::              Reading news and mail offline.
664
665 Server Buffer
666
667 * Server Buffer Format::        You can customize the look of this buffer.
668 * Server Commands::             Commands to manipulate servers.
669 * Example Methods::             Examples server specifications.
670 * Creating a Virtual Server::   An example session.
671 * Server Variables::            Which variables to set.
672 * Servers and Methods::         You can use server names as select methods.
673 * Unavailable Servers::         Some servers you try to contact may be down.
674
675 Getting News
676
677 * NNTP::                        Reading news from an @sc{nntp} server.
678 * News Spool::                  Reading news from the local spool.
679
680 @sc{nntp}
681
682 * Direct Functions::            Connecting directly to the server.
683 * Indirect Functions::          Connecting indirectly to the server.
684 * Common Variables::            Understood by several connection functions.
685
686 Getting Mail
687
688 * Mail in a Newsreader::        Important introductory notes.
689 * Getting Started Reading Mail::  A simple cookbook example.
690 * Splitting Mail::              How to create mail groups.
691 * Mail Sources::                How to tell Gnus where to get mail from.
692 * Mail Back End Variables::     Variables for customizing mail handling.
693 * Fancy Mail Splitting::        Gnus can do hairy splitting of incoming mail.
694 * Group Mail Splitting::        Use group customize to drive mail splitting.
695 * Incorporating Old Mail::      What about the old mail you have?
696 * Expiring Mail::               Getting rid of unwanted mail.
697 * Washing Mail::                Removing gruft from the mail you get.
698 * Duplicates::                  Dealing with duplicated mail.
699 * Not Reading Mail::            Using mail back ends for reading other files.
700 * Choosing a Mail Back End::    Gnus can read a variety of mail formats.
701
702 Mail Sources
703
704 * Mail Source Specifiers::      How to specify what a mail source is.
705 * Mail Source Customization::   Some variables that influence things.
706 * Fetching Mail::               Using the mail source specifiers.
707
708 Choosing a Mail Back End
709
710 * Unix Mail Box::               Using the (quite) standard Un*x mbox.
711 * Rmail Babyl::                 Emacs programs use the rmail babyl format.
712 * Mail Spool::                  Store your mail in a private spool?
713 * MH Spool::                    An mhspool-like back end.
714 * Mail Folders::                Having one file for each group.
715 * Comparing Mail Back Ends::    An in-depth looks at pros and cons.
716
717 Browsing the Web
718
719 * Archiving Mail::              
720 * Web Searches::                Creating groups from articles that match a string.
721 * Slashdot::                    Reading the Slashdot comments.
722 * Ultimate::                    The Ultimate Bulletin Board systems.
723 * Web Archive::                 Reading mailing list archived on web.
724 * RSS::                         Reading RDF site summary.
725 * Customizing w3::              Doing stuff to Emacs/w3 from Gnus.
726
727 @sc{imap}
728
729 * Splitting in IMAP::           Splitting mail with nnimap.
730 * Expiring in IMAP::            Expiring mail with nnimap.
731 * Editing IMAP ACLs::           Limiting/enabling other users access to a mailbox.
732 * Expunging mailboxes::         Equivalent of a "compress mailbox" button.
733 * A note on namespaces::        How to (not) use IMAP namespace in Gnus.
734
735 Other Sources
736
737 * Directory Groups::            You can read a directory as if it was a newsgroup.
738 * Anything Groups::             Dired?  Who needs dired?
739 * Document Groups::             Single files can be the basis of a group.
740 * SOUP::                        Reading @sc{soup} packets ``offline''.
741 * Mail-To-News Gateways::       Posting articles via mail-to-news gateways.
742
743 Document Groups
744
745 * Document Server Internals::   How to add your own document types.
746
747 SOUP
748
749 * SOUP Commands::               Commands for creating and sending @sc{soup} packets
750 * SOUP Groups::                 A back end for reading @sc{soup} packets.
751 * SOUP Replies::                How to enable @code{nnsoup} to take over mail and news.
752
753 Combined Groups
754
755 * Virtual Groups::              Combining articles from many groups.
756 * Kibozed Groups::              Looking through parts of the newsfeed for articles.
757
758 Gnus Unplugged
759
760 * Agent Basics::                How it all is supposed to work.
761 * Agent Categories::            How to tell the Gnus Agent what to download.
762 * Agent Commands::              New commands for all the buffers.
763 * Agent as Cache::              The Agent is a big cache too.
764 * Agent Expiry::                How to make old articles go away.
765 * Agent Regeneration::          How to recover from lost connections and other accidents.
766 * Agent and IMAP::              How to use the Agent with IMAP.
767 * Outgoing Messages::           What happens when you post/mail something?
768 * Agent Variables::             Customizing is fun.
769 * Example Setup::               An example @file{.gnus.el} file for offline people.
770 * Batching Agents::             How to fetch news from a @code{cron} job.
771 * Agent Caveats::               What you think it'll do and what it does.
772
773 Agent Categories
774
775 * Category Syntax::             What a category looks like.
776 * Category Buffer::             A buffer for maintaining categories.
777 * Category Variables::          Customize'r'Us.
778
779 Agent Commands
780
781 * Group Agent Commands::        Configure groups and fetch their contents.
782 * Summary Agent Commands::      Manually select then fetch specific articles.
783 * Server Agent Commands::       Select the servers that are supported by the agent.
784
785 Scoring
786
787 * Summary Score Commands::      Adding score entries for the current group.
788 * Group Score Commands::        General score commands.
789 * Score Variables::             Customize your scoring.  (My, what terminology).
790 * Score File Format::           What a score file may contain.
791 * Score File Editing::          You can edit score files by hand as well.
792 * Adaptive Scoring::            Big Sister Gnus knows what you read.
793 * Home Score File::             How to say where new score entries are to go.
794 * Followups To Yourself::       Having Gnus notice when people answer you.
795 * Scoring On Other Headers::    Scoring on non-standard headers.
796 * Scoring Tips::                How to score effectively.
797 * Reverse Scoring::             That problem child of old is not problem.
798 * Global Score Files::          Earth-spanning, ear-splitting score files.
799 * Kill Files::                  They are still here, but they can be ignored.
800 * Converting Kill Files::       Translating kill files to score files.
801 * GroupLens::                   Getting predictions on what you like to read.
802 * Advanced Scoring::            Using logical expressions to build score rules.
803 * Score Decays::                It can be useful to let scores wither away.
804
805 GroupLens
806
807 * Using GroupLens::             How to make Gnus use GroupLens.
808 * Rating Articles::             Letting GroupLens know how you rate articles.
809 * Displaying Predictions::      Displaying predictions given by GroupLens.
810 * GroupLens Variables::         Customizing GroupLens.
811
812 Advanced Scoring
813
814 * Advanced Scoring Syntax::     A definition.
815 * Advanced Scoring Examples::   What they look like.
816 * Advanced Scoring Tips::       Getting the most out of it.
817
818 Various
819
820 * Process/Prefix::              A convention used by many treatment commands.
821 * Interactive::                 Making Gnus ask you many questions.
822 * Symbolic Prefixes::           How to supply some Gnus functions with options.
823 * Formatting Variables::        You can specify what buffers should look like.
824 * Window Layout::               Configuring the Gnus buffer windows.
825 * Faces and Fonts::             How to change how faces look.
826 * Compilation::                 How to speed Gnus up.
827 * Mode Lines::                  Displaying information in the mode lines.
828 * Highlighting and Menus::      Making buffers look all nice and cozy.
829 * Buttons::                     Get tendinitis in ten easy steps!
830 * Daemons::                     Gnus can do things behind your back.
831 * NoCeM::                       How to avoid spam and other fatty foods.
832 * Undo::                        Some actions can be undone.
833 * Predicate Specifiers::        Specifying predicates.
834 * Moderation::                  What to do if you're a moderator.
835 * Image Enhancements::          Modern versions of Emacs/XEmacs can display images.
836 * Fuzzy Matching::              What's the big fuzz?
837 * Thwarting Email Spam::        A how-to on avoiding unsolicited commercial email.
838 * Various Various::             Things that are really various.
839
840 Formatting Variables
841
842 * Formatting Basics::           A formatting variable is basically a format string.
843 * Mode Line Formatting::        Some rules about mode line formatting variables.
844 * Advanced Formatting::         Modifying output in various ways.
845 * User-Defined Specs::          Having Gnus call your own functions.
846 * Formatting Fonts::            Making the formatting look colorful and nice.
847 * Positioning Point::           Moving point to a position after an operation.
848 * Tabulation::                  Tabulating your output.
849 * Wide Characters::             Dealing with wide characters.
850
851 Image Enhancements
852
853 * Picons::                      How to display pictures of what you're reading.
854 * Smileys::                     Show all those happy faces the way they were meant to be shown.
855 * X-Face::                      Display a funky, teensy black-and-white image.
856 * XVarious::                    Other XEmacsy Gnusey variables.
857
858 Thwarting Email Spam
859
860 * The problem of spam::         Some background, and some solutions
861 * Anti-Spam Basics::            Simple steps to reduce the amount of spam.
862 * SpamAssassin::                How to use external anti-spam tools.
863 * Hashcash::                    Reduce spam by burning CPU time.
864 * Filtering Spam Using The Spam ELisp Package::  
865 * Filtering Spam Using Statistics with spam-stat::  
866
867 Appendices
868
869 * XEmacs::                      Requirements for installing under XEmacs.
870 * History::                     How Gnus got where it is today.
871 * On Writing Manuals::          Why this is not a beginner's guide.
872 * Terminology::                 We use really difficult, like, words here.
873 * Customization::               Tailoring Gnus to your needs.
874 * Troubleshooting::             What you might try if things do not work.
875 * Gnus Reference Guide::        Rilly, rilly technical stuff.
876 * Emacs for Heathens::          A short introduction to Emacsian terms.
877 * Frequently Asked Questions::
878
879 History
880
881 * Gnus Versions::               What Gnus versions have been released.
882 * Other Gnus Versions::         Other Gnus versions that also have been released.
883 * Why?::                        What's the point of Gnus?
884 * Compatibility::               Just how compatible is Gnus with @sc{gnus}?
885 * Conformity::                  Gnus tries to conform to all standards.
886 * Emacsen::                     Gnus can be run on a few modern Emacsen.
887 * Gnus Development::            How Gnus is developed.
888 * Contributors::                Oodles of people.
889 * New Features::                Pointers to some of the new stuff in Gnus.
890
891 New Features
892
893 * ding Gnus::                   New things in Gnus 5.0/5.1, the first new Gnus.
894 * September Gnus::              The Thing Formally Known As Gnus 5.2/5.3.
895 * Red Gnus::                    Third time best---Gnus 5.4/5.5.
896 * Quassia Gnus::                Two times two is four, or Gnus 5.6/5.7.
897 * Pterodactyl Gnus::            Pentad also starts with P, AKA Gnus 5.8/5.9.
898
899 Customization
900
901 * Slow/Expensive Connection::   You run a local Emacs and get the news elsewhere.
902 * Slow Terminal Connection::    You run a remote Emacs.
903 * Little Disk Space::           You feel that having large setup files is icky.
904 * Slow Machine::                You feel like buying a faster machine.
905
906 Gnus Reference Guide
907
908 * Gnus Utility Functions::      Common functions and variable to use.
909 * Back End Interface::          How Gnus communicates with the servers.
910 * Score File Syntax::           A BNF definition of the score file standard.
911 * Headers::                     How Gnus stores headers internally.
912 * Ranges::                      A handy format for storing mucho numbers.
913 * Group Info::                  The group info format.
914 * Extended Interactive::        Symbolic prefixes and stuff.
915 * Emacs/XEmacs Code::           Gnus can be run under all modern Emacsen.
916 * Various File Formats::        Formats of files that Gnus use.
917
918 Back End Interface
919
920 * Required Back End Functions::  Functions that must be implemented.
921 * Optional Back End Functions::  Functions that need not be implemented.
922 * Error Messaging::             How to get messages and report errors.
923 * Writing New Back Ends::       Extending old back ends.
924 * Hooking New Back Ends Into Gnus::  What has to be done on the Gnus end.
925 * Mail-like Back Ends::         Some tips on mail back ends.
926
927 Various File Formats
928
929 * Active File Format::          Information on articles and groups available.
930 * Newsgroups File Format::      Group descriptions.
931
932 Emacs for Heathens
933
934 * Keystrokes::                  Entering text and executing commands.
935 * Emacs Lisp::                  The built-in Emacs programming language.
936
937 @end detailmenu
938 @end menu
939
940 @node Starting Up
941 @chapter Starting gnus
942 @cindex starting up
943
944 @kindex M-x gnus
945 @findex gnus
946 If your system administrator has set things up properly, starting gnus
947 and reading news is extremely easy---you just type @kbd{M-x gnus} in
948 your Emacs.
949
950 @findex gnus-other-frame
951 @kindex M-x gnus-other-frame
952 If you want to start gnus in a different frame, you can use the command
953 @kbd{M-x gnus-other-frame} instead.
954
955 If things do not go smoothly at startup, you have to twiddle some
956 variables in your @file{~/.gnus} file.  This file is similar to
957 @file{~/.emacs}, but is read when gnus starts.
958
959 If you puzzle at any terms used in this manual, please refer to the
960 terminology section (@pxref{Terminology}).
961
962 @menu
963 * Finding the News::            Choosing a method for getting news.
964 * The First Time::              What does Gnus do the first time you start it?
965 * The Server is Down::          How can I read my mail then?
966 * Slave Gnusae::                You can have more than one Gnus active at a time.
967 * Fetching a Group::            Starting Gnus just to read a group.
968 * New Groups::                  What is Gnus supposed to do with new groups?
969 * Changing Servers::            You may want to move from one server to another.
970 * Startup Files::               Those pesky startup files---@file{.newsrc}.
971 * Auto Save::                   Recovering from a crash.
972 * The Active File::             Reading the active file over a slow line Takes Time.
973 * Startup Variables::           Other variables you might change.
974 @end menu
975
976
977 @node Finding the News
978 @section Finding the News
979 @cindex finding news
980
981 @vindex gnus-select-method
982 @c @head
983 The @code{gnus-select-method} variable says where gnus should look for
984 news.  This variable should be a list where the first element says
985 @dfn{how} and the second element says @dfn{where}.  This method is your
986 native method.  All groups not fetched with this method are
987 foreign groups.
988
989 For instance, if the @samp{news.somewhere.edu} @sc{nntp} server is where
990 you want to get your daily dosage of news from, you'd say:
991
992 @lisp
993 (setq gnus-select-method '(nntp "news.somewhere.edu"))
994 @end lisp
995
996 If you want to read directly from the local spool, say:
997
998 @lisp
999 (setq gnus-select-method '(nnspool ""))
1000 @end lisp
1001
1002 If you can use a local spool, you probably should, as it will almost
1003 certainly be much faster.  But do not use the local spool if your
1004 server is running Leafnode; in this case, use @code{(nntp "localhost")}.
1005
1006 @vindex gnus-nntpserver-file
1007 @cindex NNTPSERVER
1008 @cindex @sc{nntp} server
1009 If this variable is not set, gnus will take a look at the
1010 @code{NNTPSERVER} environment variable.  If that variable isn't set,
1011 gnus will see whether @code{gnus-nntpserver-file}
1012 (@file{/etc/nntpserver} by default) has any opinions on the matter.  If
1013 that fails as well, gnus will try to use the machine running Emacs as an @sc{nntp} server.  That's a long shot, though.
1014
1015 @vindex gnus-nntp-server
1016 If @code{gnus-nntp-server} is set, this variable will override
1017 @code{gnus-select-method}.  You should therefore set
1018 @code{gnus-nntp-server} to @code{nil}, which is what it is by default.
1019
1020 @vindex gnus-secondary-servers
1021 @vindex gnus-nntp-server
1022 You can also make gnus prompt you interactively for the name of an
1023 @sc{nntp} server.  If you give a non-numerical prefix to @code{gnus}
1024 (i.e., @kbd{C-u M-x gnus}), gnus will let you choose between the servers
1025 in the @code{gnus-secondary-servers} list (if any).  You can also just
1026 type in the name of any server you feel like visiting.  (Note that this
1027 will set @code{gnus-nntp-server}, which means that if you then @kbd{M-x
1028 gnus} later in the same Emacs session, Gnus will contact the same
1029 server.)
1030
1031 @findex gnus-group-browse-foreign-server
1032 @kindex B (Group)
1033 However, if you use one @sc{nntp} server regularly and are just
1034 interested in a couple of groups from a different server, you would be
1035 better served by using the @kbd{B} command in the group buffer.  It will
1036 let you have a look at what groups are available, and you can subscribe
1037 to any of the groups you want to.  This also makes @file{.newsrc}
1038 maintenance much tidier.  @xref{Foreign Groups}.
1039
1040 @vindex gnus-secondary-select-methods
1041 @c @head
1042 A slightly different approach to foreign groups is to set the
1043 @code{gnus-secondary-select-methods} variable.  The select methods
1044 listed in this variable are in many ways just as native as the
1045 @code{gnus-select-method} server.  They will also be queried for active
1046 files during startup (if that's required), and new newsgroups that
1047 appear on these servers will be subscribed (or not) just as native
1048 groups are.
1049
1050 For instance, if you use the @code{nnmbox} back end to read your mail,
1051 you would typically set this variable to
1052
1053 @lisp
1054 (setq gnus-secondary-select-methods '((nnmbox "")))
1055 @end lisp
1056
1057
1058 @node The First Time
1059 @section The First Time
1060 @cindex first time usage
1061
1062 If no startup files exist, gnus will try to determine what groups should
1063 be subscribed by default.
1064
1065 @vindex gnus-default-subscribed-newsgroups
1066 If the variable @code{gnus-default-subscribed-newsgroups} is set, gnus
1067 will subscribe you to just those groups in that list, leaving the rest
1068 killed.  Your system administrator should have set this variable to
1069 something useful.
1070
1071 Since she hasn't, gnus will just subscribe you to a few arbitrarily
1072 picked groups (i.e., @samp{*.newusers}).  (@dfn{Arbitrary} is defined
1073 here as @dfn{whatever Lars thinks you should read}.)
1074
1075 You'll also be subscribed to the gnus documentation group, which should
1076 help you with most common problems.
1077
1078 If @code{gnus-default-subscribed-newsgroups} is @code{t}, gnus will just
1079 use the normal functions for handling new groups, and not do anything
1080 special.
1081
1082
1083 @node The Server is Down
1084 @section The Server is Down
1085 @cindex server errors
1086
1087 If the default server is down, gnus will understandably have some
1088 problems starting.  However, if you have some mail groups in addition to
1089 the news groups, you may want to start gnus anyway.
1090
1091 Gnus, being the trusting sort of program, will ask whether to proceed
1092 without a native select method if that server can't be contacted.  This
1093 will happen whether the server doesn't actually exist (i.e., you have
1094 given the wrong address) or the server has just momentarily taken ill
1095 for some reason or other.  If you decide to continue and have no foreign
1096 groups, you'll find it difficult to actually do anything in the group
1097 buffer.  But, hey, that's your problem.  Blllrph!
1098
1099 @findex gnus-no-server
1100 @kindex M-x gnus-no-server
1101 @c @head
1102 If you know that the server is definitely down, or you just want to read
1103 your mail without bothering with the server at all, you can use the
1104 @code{gnus-no-server} command to start gnus.  That might come in handy
1105 if you're in a hurry as well.  This command will not attempt to contact
1106 your primary server---instead, it will just activate all groups on level
1107 1 and 2.  (You should preferably keep no native groups on those two
1108 levels.) Also @pxref{Group Levels}.
1109
1110
1111 @node Slave Gnusae
1112 @section Slave Gnusae
1113 @cindex slave
1114
1115 You might want to run more than one Emacs with more than one gnus at the
1116 same time.  If you are using different @file{.newsrc} files (e.g., if you
1117 are using the two different gnusae to read from two different servers),
1118 that is no problem whatsoever.  You just do it.
1119
1120 The problem appears when you want to run two Gnusae that use the same
1121 @file{.newsrc} file.
1122
1123 To work around that problem some, we here at the Think-Tank at the gnus
1124 Towers have come up with a new concept: @dfn{Masters} and
1125 @dfn{slaves}.  (We have applied for a patent on this concept, and have
1126 taken out a copyright on those words.  If you wish to use those words in
1127 conjunction with each other, you have to send $1 per usage instance to
1128 me.  Usage of the patent (@dfn{Master/Slave Relationships In Computer
1129 Applications}) will be much more expensive, of course.)
1130
1131 @findex gnus-slave
1132 Anyway, you start one gnus up the normal way with @kbd{M-x gnus} (or
1133 however you do it).  Each subsequent slave gnusae should be started with
1134 @kbd{M-x gnus-slave}.  These slaves won't save normal @file{.newsrc}
1135 files, but instead save @dfn{slave files} that contain information only
1136 on what groups have been read in the slave session.  When a master gnus
1137 starts, it will read (and delete) these slave files, incorporating all
1138 information from them.  (The slave files will be read in the sequence
1139 they were created, so the latest changes will have precedence.)
1140
1141 Information from the slave files has, of course, precedence over the
1142 information in the normal (i.e., master) @file{.newsrc} file.
1143
1144 If the @file{.newsrc*} files have not been saved in the master when the
1145 slave starts, you may be prompted as to whether to read an auto-save
1146 file.  If you answer "yes", the unsaved changes to the master will be
1147 incorporated into the slave.  If you answer "no", the slave may see some
1148 messages as unread that have been read in the master.
1149
1150 @node Fetching a Group
1151 @section Fetching a Group
1152 @cindex fetching a group
1153
1154 @findex gnus-fetch-group
1155 It is sometimes convenient to be able to just say ``I want to read this
1156 group and I don't care whether gnus has been started or not''.  This is
1157 perhaps more useful for people who write code than for users, but the
1158 command @code{gnus-fetch-group} provides this functionality in any case.
1159 It takes the group name as a parameter.
1160
1161
1162 @node New Groups
1163 @section New Groups
1164 @cindex new groups
1165 @cindex subscription
1166
1167 @vindex gnus-check-new-newsgroups
1168 If you are satisfied that you really never want to see any new groups,
1169 you can set @code{gnus-check-new-newsgroups} to @code{nil}.  This will
1170 also save you some time at startup.  Even if this variable is
1171 @code{nil}, you can always subscribe to the new groups just by pressing
1172 @kbd{U} in the group buffer (@pxref{Group Maintenance}).  This variable
1173 is @code{ask-server} by default.  If you set this variable to
1174 @code{always}, then Gnus will query the back ends for new groups even
1175 when you do the @kbd{g} command (@pxref{Scanning New Messages}).
1176
1177 @menu
1178 * Checking New Groups::         Determining what groups are new.
1179 * Subscription Methods::        What Gnus should do with new groups.
1180 * Filtering New Groups::        Making Gnus ignore certain new groups.
1181 @end menu
1182
1183
1184 @node Checking New Groups
1185 @subsection Checking New Groups
1186
1187 Gnus normally determines whether a group is new or not by comparing the
1188 list of groups from the active file(s) with the lists of subscribed and
1189 dead groups.  This isn't a particularly fast method.  If
1190 @code{gnus-check-new-newsgroups} is @code{ask-server}, gnus will ask the
1191 server for new groups since the last time.  This is both faster and
1192 cheaper.  This also means that you can get rid of the list of killed
1193 groups altogether, so you may set @code{gnus-save-killed-list} to
1194 @code{nil}, which will save time both at startup, at exit, and all over.
1195 Saves disk space, too.  Why isn't this the default, then?
1196 Unfortunately, not all servers support this command.
1197
1198 I bet I know what you're thinking now: How do I find out whether my
1199 server supports @code{ask-server}?  No?  Good, because I don't have a
1200 fail-safe answer.  I would suggest just setting this variable to
1201 @code{ask-server} and see whether any new groups appear within the next
1202 few days.  If any do, then it works.  If none do, then it doesn't
1203 work.  I could write a function to make gnus guess whether the server
1204 supports @code{ask-server}, but it would just be a guess.  So I won't.
1205 You could @code{telnet} to the server and say @code{HELP} and see
1206 whether it lists @samp{NEWGROUPS} among the commands it understands.  If
1207 it does, then it might work.  (But there are servers that lists
1208 @samp{NEWGROUPS} without supporting the function properly.)
1209
1210 This variable can also be a list of select methods.  If so, gnus will
1211 issue an @code{ask-server} command to each of the select methods, and
1212 subscribe them (or not) using the normal methods.  This might be handy
1213 if you are monitoring a few servers for new groups.  A side effect is
1214 that startup will take much longer, so you can meditate while waiting.
1215 Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss.
1216
1217
1218 @node Subscription Methods
1219 @subsection Subscription Methods
1220
1221 @vindex gnus-subscribe-newsgroup-method
1222 What gnus does when it encounters a new group is determined by the
1223 @code{gnus-subscribe-newsgroup-method} variable.
1224
1225 This variable should contain a function.  This function will be called
1226 with the name of the new group as the only parameter.
1227
1228 Some handy pre-fab functions are:
1229
1230 @table @code
1231
1232 @item gnus-subscribe-zombies
1233 @vindex gnus-subscribe-zombies
1234 Make all new groups zombies.  This is the default.  You can browse the
1235 zombies later (with @kbd{A z}) and either kill them all off properly
1236 (with @kbd{S z}), or subscribe to them (with @kbd{u}).
1237
1238 @item gnus-subscribe-randomly
1239 @vindex gnus-subscribe-randomly
1240 Subscribe all new groups in arbitrary order.  This really means that all
1241 new groups will be added at ``the top'' of the group buffer.
1242
1243 @item gnus-subscribe-alphabetically
1244 @vindex gnus-subscribe-alphabetically
1245 Subscribe all new groups in alphabetical order.
1246
1247 @item gnus-subscribe-hierarchically
1248 @vindex gnus-subscribe-hierarchically
1249 Subscribe all new groups hierarchically.  The difference between this
1250 function and @code{gnus-subscribe-alphabetically} is slight.
1251 @code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly
1252 alphabetical fashion, while this function will enter groups into its
1253 hierarchy.  So if you want to have the @samp{rec} hierarchy before the
1254 @samp{comp} hierarchy, this function will not mess that configuration
1255 up.  Or something like that.
1256
1257 @item gnus-subscribe-interactively
1258 @vindex gnus-subscribe-interactively
1259 Subscribe new groups interactively.  This means that gnus will ask
1260 you about @strong{all} new groups.  The groups you choose to subscribe
1261 to will be subscribed hierarchically.
1262
1263 @item gnus-subscribe-killed
1264 @vindex gnus-subscribe-killed
1265 Kill all new groups.
1266
1267 @item gnus-subscribe-topics
1268 @vindex gnus-subscribe-topics
1269 Put the groups into the topic that has a matching @code{subscribe} topic
1270 parameter (@pxref{Topic Parameters}).  For instance, a @code{subscribe}
1271 topic parameter that looks like
1272
1273 @example
1274 "nnslashdot"
1275 @end example
1276
1277 will mean that all groups that match that regex will be subscribed under
1278 that topic.
1279
1280 If no topics match the groups, the groups will be subscribed in the
1281 top-level topic.
1282
1283 @end table
1284
1285 @vindex gnus-subscribe-hierarchical-interactive
1286 A closely related variable is
1287 @code{gnus-subscribe-hierarchical-interactive}.  (That's quite a
1288 mouthful.)  If this variable is non-@code{nil}, gnus will ask you in a
1289 hierarchical fashion whether to subscribe to new groups or not.  Gnus
1290 will ask you for each sub-hierarchy whether you want to descend the
1291 hierarchy or not.
1292
1293 One common mistake is to set the variable a few paragraphs above
1294 (@code{gnus-subscribe-newsgroup-method}) to
1295 @code{gnus-subscribe-hierarchical-interactive}.  This is an error.  This
1296 will not work.  This is ga-ga.  So don't do it.
1297
1298
1299 @node Filtering New Groups
1300 @subsection Filtering New Groups
1301
1302 A nice and portable way to control which new newsgroups should be
1303 subscribed (or ignored) is to put an @dfn{options} line at the start of
1304 the @file{.newsrc} file.  Here's an example:
1305
1306 @example
1307 options -n !alt.all !rec.all sci.all
1308 @end example
1309
1310 @vindex gnus-subscribe-options-newsgroup-method
1311 This line obviously belongs to a serious-minded intellectual scientific
1312 person (or she may just be plain old boring), because it says that all
1313 groups that have names beginning with @samp{alt} and @samp{rec} should
1314 be ignored, and all groups with names beginning with @samp{sci} should
1315 be subscribed.  Gnus will not use the normal subscription method for
1316 subscribing these groups.
1317 @code{gnus-subscribe-options-newsgroup-method} is used instead.  This
1318 variable defaults to @code{gnus-subscribe-alphabetically}.
1319
1320 @vindex gnus-options-not-subscribe
1321 @vindex gnus-options-subscribe
1322 If you don't want to mess with your @file{.newsrc} file, you can just
1323 set the two variables @code{gnus-options-subscribe} and
1324 @code{gnus-options-not-subscribe}.  These two variables do exactly the
1325 same as the @file{.newsrc} @samp{options -n} trick.  Both are regexps,
1326 and if the new group matches the former, it will be unconditionally
1327 subscribed, and if it matches the latter, it will be ignored.
1328
1329 @vindex gnus-auto-subscribed-groups
1330 Yet another variable that meddles here is
1331 @code{gnus-auto-subscribed-groups}.  It works exactly like
1332 @code{gnus-options-subscribe}, and is therefore really superfluous, but I
1333 thought it would be nice to have two of these.  This variable is more
1334 meant for setting some ground rules, while the other variable is used
1335 more for user fiddling.  By default this variable makes all new groups
1336 that come from mail back ends (@code{nnml}, @code{nnbabyl},
1337 @code{nnfolder}, @code{nnmbox}, @code{nnmh}, and @code{nnmaildir})
1338 subscribed.  If you don't like that, just set this variable to
1339 @code{nil}.
1340
1341 New groups that match this regexp are subscribed using
1342 @code{gnus-subscribe-options-newsgroup-method}.
1343
1344
1345 @node Changing Servers
1346 @section Changing Servers
1347 @cindex changing servers
1348
1349 Sometimes it is necessary to move from one @sc{nntp} server to another.
1350 This happens very rarely, but perhaps you change jobs, or one server is
1351 very flaky and you want to use another.
1352
1353 Changing the server is pretty easy, right?  You just change
1354 @code{gnus-select-method} to point to the new server?
1355
1356 @emph{Wrong!}
1357
1358 Article numbers are not (in any way) kept synchronized between different
1359 @sc{nntp} servers, and the only way Gnus keeps track of what articles
1360 you have read is by keeping track of article numbers.  So when you
1361 change @code{gnus-select-method}, your @file{.newsrc} file becomes
1362 worthless.
1363
1364 Gnus provides a few functions to attempt to translate a @file{.newsrc}
1365 file from one server to another.  They all have one thing in
1366 common---they take a looong time to run.  You don't want to use these
1367 functions more than absolutely necessary.
1368
1369 @kindex M-x gnus-change-server
1370 @findex gnus-change-server
1371 If you have access to both servers, Gnus can request the headers for all
1372 the articles you have read and compare @code{Message-ID}s and map the
1373 article numbers of the read articles and article marks.  The @kbd{M-x
1374 gnus-change-server} command will do this for all your native groups.  It
1375 will prompt for the method you want to move to.
1376
1377 @kindex M-x gnus-group-move-group-to-server
1378 @findex gnus-group-move-group-to-server
1379 You can also move individual groups with the @kbd{M-x
1380 gnus-group-move-group-to-server} command.  This is useful if you want to
1381 move a (foreign) group from one server to another.
1382
1383 @kindex M-x gnus-group-clear-data-on-native-groups
1384 @findex gnus-group-clear-data-on-native-groups
1385 If you don't have access to both the old and new server, all your marks
1386 and read ranges have become worthless.  You can use the @kbd{M-x
1387 gnus-group-clear-data-on-native-groups} command to clear out all data
1388 that you have on your native groups.  Use with caution.
1389
1390 @kindex M-x gnus-group-clear-data
1391 @findex gnus-group-clear-data
1392 Clear the data from the current group only---nix out marks and the
1393 list of read articles (@code{gnus-group-clear-data}).
1394
1395 After changing servers, you @strong{must} move the cache hierarchy away,
1396 since the cached articles will have wrong article numbers, which will
1397 affect which articles Gnus thinks are read.
1398 @code{gnus-group-clear-data-on-native-groups} will ask you if you want
1399 to have it done automatically; for @code{gnus-group-clear-data}, you
1400 can use @kbd{M-x gnus-cache-move-cache} (but beware, it will move the
1401 cache for all groups).
1402
1403
1404 @node Startup Files
1405 @section Startup Files
1406 @cindex startup files
1407 @cindex .newsrc
1408 @cindex .newsrc.el
1409 @cindex .newsrc.eld
1410
1411 Now, you all know about the @file{.newsrc} file.  All subscription
1412 information is traditionally stored in this file.
1413
1414 Things got a bit more complicated with @sc{gnus}.  In addition to
1415 keeping the @file{.newsrc} file updated, it also used a file called
1416 @file{.newsrc.el} for storing all the information that didn't fit into
1417 the @file{.newsrc} file.  (Actually, it also duplicated everything in
1418 the @file{.newsrc} file.)  @sc{gnus} would read whichever one of these
1419 files was the most recently saved, which enabled people to swap between
1420 @sc{gnus} and other newsreaders.
1421
1422 That was kinda silly, so Gnus went one better: In addition to the
1423 @file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called
1424 @file{.newsrc.eld}.  It will read whichever of these files that are most
1425 recent, but it will never write a @file{.newsrc.el} file.  You should
1426 never delete the @file{.newsrc.eld} file---it contains much information
1427 not stored in the @file{.newsrc} file.
1428
1429 @vindex gnus-save-newsrc-file
1430 @vindex gnus-read-newsrc-file
1431 You can turn off writing the @file{.newsrc} file by setting
1432 @code{gnus-save-newsrc-file} to @code{nil}, which means you can delete
1433 the file and save some space, as well as exiting from gnus faster.
1434 However, this will make it impossible to use other newsreaders than
1435 gnus.  But hey, who would want to, right?  Similarly, setting
1436 @code{gnus-read-newsrc-file} to @code{nil} makes gnus ignore the
1437 @file{.newsrc} file and any @file{.newsrc-SERVER} files, which is
1438 convenient if you have a tendency to use Netscape once in a while.
1439
1440 @vindex gnus-save-killed-list
1441 If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus
1442 will not save the list of killed groups to the startup file.  This will
1443 save both time (when starting and quitting) and space (on disk).  It
1444 will also mean that Gnus has no record of what groups are new or old,
1445 so the automatic new groups subscription methods become meaningless.
1446 You should always set @code{gnus-check-new-newsgroups} to @code{nil} or
1447 @code{ask-server} if you set this variable to @code{nil} (@pxref{New
1448 Groups}).  This variable can also be a regular expression.  If that's
1449 the case, remove all groups that do not match this regexp before
1450 saving.  This can be useful in certain obscure situations that involve
1451 several servers where not all servers support @code{ask-server}.
1452
1453 @vindex gnus-startup-file
1454 The @code{gnus-startup-file} variable says where the startup files are.
1455 The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup
1456 file being whatever that one is, with a @samp{.eld} appended.
1457
1458 @vindex gnus-save-newsrc-hook
1459 @vindex gnus-save-quick-newsrc-hook
1460 @vindex gnus-save-standard-newsrc-hook
1461 @code{gnus-save-newsrc-hook} is called before saving any of the newsrc
1462 files, while @code{gnus-save-quick-newsrc-hook} is called just before
1463 saving the @file{.newsrc.eld} file, and
1464 @code{gnus-save-standard-newsrc-hook} is called just before saving the
1465 @file{.newsrc} file.  The latter two are commonly used to turn version
1466 control on or off.  Version control is on by default when saving the
1467 startup files.  If you want to turn backup creation off, say something like:
1468
1469 @lisp
1470 (defun turn-off-backup ()
1471   (set (make-local-variable 'backup-inhibited) t))
1472
1473 (add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup)
1474 (add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup)
1475 @end lisp
1476
1477 @vindex gnus-init-file
1478 @vindex gnus-site-init-file
1479 When gnus starts, it will read the @code{gnus-site-init-file}
1480 (@file{.../site-lisp/gnus} by default) and @code{gnus-init-file}
1481 (@file{~/.gnus} by default) files.  These are normal Emacs Lisp files
1482 and can be used to avoid cluttering your @file{~/.emacs} and
1483 @file{site-init} files with gnus stuff.  Gnus will also check for files
1484 with the same names as these, but with @file{.elc} and @file{.el}
1485 suffixes.  In other words, if you have set @code{gnus-init-file} to
1486 @file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el},
1487 and finally @file{~/.gnus} (in this order).
1488
1489
1490
1491 @node Auto Save
1492 @section Auto Save
1493 @cindex dribble file
1494 @cindex auto-save
1495
1496 Whenever you do something that changes the gnus data (reading articles,
1497 catching up, killing/subscribing groups), the change is added to a
1498 special @dfn{dribble buffer}.  This buffer is auto-saved the normal
1499 Emacs way.  If your Emacs should crash before you have saved the
1500 @file{.newsrc} files, all changes you have made can be recovered from
1501 this file.
1502
1503 If gnus detects this file at startup, it will ask the user whether to
1504 read it.  The auto save file is deleted whenever the real startup file is
1505 saved.
1506
1507 @vindex gnus-use-dribble-file
1508 If @code{gnus-use-dribble-file} is @code{nil}, gnus won't create and
1509 maintain a dribble buffer.  The default is @code{t}.
1510
1511 @vindex gnus-dribble-directory
1512 Gnus will put the dribble file(s) in @code{gnus-dribble-directory}.  If
1513 this variable is @code{nil}, which it is by default, gnus will dribble
1514 into the directory where the @file{.newsrc} file is located.  (This is
1515 normally the user's home directory.)  The dribble file will get the same
1516 file permissions as the @file{.newsrc} file.
1517
1518 @vindex gnus-always-read-dribble-file
1519 If @code{gnus-always-read-dribble-file} is non-@code{nil}, Gnus will
1520 read the dribble file on startup without querying the user.
1521
1522
1523 @node The Active File
1524 @section The Active File
1525 @cindex active file
1526 @cindex ignored groups
1527
1528 When gnus starts, or indeed whenever it tries to determine whether new
1529 articles have arrived, it reads the active file.  This is a very large
1530 file that lists all the active groups and articles on the server.
1531
1532 @vindex gnus-ignored-newsgroups
1533 Before examining the active file, gnus deletes all lines that match the
1534 regexp @code{gnus-ignored-newsgroups}.  This is done primarily to reject
1535 any groups with bogus names, but you can use this variable to make gnus
1536 ignore hierarchies you aren't ever interested in.  However, this is not
1537 recommended.  In fact, it's highly discouraged.  Instead, @pxref{New
1538 Groups} for an overview of other variables that can be used instead.
1539
1540 @c This variable is
1541 @c @code{nil} by default, and will slow down active file handling somewhat
1542 @c if you set it to anything else.
1543
1544 @vindex gnus-read-active-file
1545 @c @head
1546 The active file can be rather Huge, so if you have a slow network, you
1547 can set @code{gnus-read-active-file} to @code{nil} to prevent gnus from
1548 reading the active file.  This variable is @code{some} by default.
1549
1550 Gnus will try to make do by getting information just on the groups that
1551 you actually subscribe to.
1552
1553 Note that if you subscribe to lots and lots of groups, setting this
1554 variable to @code{nil} will probably make gnus slower, not faster.  At
1555 present, having this variable @code{nil} will slow gnus down
1556 considerably, unless you read news over a 2400 baud modem.
1557
1558 This variable can also have the value @code{some}.  Gnus will then
1559 attempt to read active info only on the subscribed groups.  On some
1560 servers this is quite fast (on sparkling, brand new INN servers that
1561 support the @code{LIST ACTIVE group} command), on others this isn't fast
1562 at all.  In any case, @code{some} should be faster than @code{nil}, and
1563 is certainly faster than @code{t} over slow lines.
1564
1565 Some news servers (old versions of Leafnode and old versions of INN, for
1566 instance) do not support the @code{LIST ACTIVE group}.  For these
1567 servers, @code{nil} is probably the most efficient value for this
1568 variable.
1569
1570 If this variable is @code{nil}, gnus will ask for group info in total
1571 lock-step, which isn't very fast.  If it is @code{some} and you use an
1572 @sc{nntp} server, gnus will pump out commands as fast as it can, and
1573 read all the replies in one swoop.  This will normally result in better
1574 performance, but if the server does not support the aforementioned
1575 @code{LIST ACTIVE group} command, this isn't very nice to the server.
1576
1577 If you think that starting up Gnus takes too long, try all the three
1578 different values for this variable and see what works best for you.
1579
1580 In any case, if you use @code{some} or @code{nil}, you should definitely
1581 kill all groups that you aren't interested in to speed things up.
1582
1583 Note that this variable also affects active file retrieval from
1584 secondary select methods.
1585
1586
1587 @node Startup Variables
1588 @section Startup Variables
1589
1590 @table @code
1591
1592 @item gnus-load-hook
1593 @vindex gnus-load-hook
1594 A hook run while gnus is being loaded.  Note that this hook will
1595 normally be run just once in each Emacs session, no matter how many
1596 times you start gnus.
1597
1598 @item gnus-before-startup-hook
1599 @vindex gnus-before-startup-hook
1600 A hook run after starting up gnus successfully.
1601
1602 @item gnus-startup-hook
1603 @vindex gnus-startup-hook
1604 A hook run as the very last thing after starting up gnus
1605
1606 @item gnus-started-hook
1607 @vindex gnus-started-hook
1608 A hook that is run as the very last thing after starting up gnus
1609 successfully.
1610
1611 @item gnus-setup-news-hook
1612 @vindex gnus-setup-news-hook
1613 A hook that is run after reading the @file{.newsrc} file(s), but before
1614 generating the group buffer.
1615
1616 @item gnus-check-bogus-newsgroups
1617 @vindex gnus-check-bogus-newsgroups
1618 If non-@code{nil}, gnus will check for and delete all bogus groups at
1619 startup.  A @dfn{bogus group} is a group that you have in your
1620 @file{.newsrc} file, but doesn't exist on the news server.  Checking for
1621 bogus groups can take quite a while, so to save time and resources it's
1622 best to leave this option off, and do the checking for bogus groups once
1623 in a while from the group buffer instead (@pxref{Group Maintenance}).
1624
1625 @item gnus-inhibit-startup-message
1626 @vindex gnus-inhibit-startup-message
1627 If non-@code{nil}, the startup message won't be displayed.  That way,
1628 your boss might not notice as easily that you are reading news instead
1629 of doing your job.  Note that this variable is used before
1630 @file{.gnus.el} is loaded, so it should be set in @file{.emacs} instead.
1631
1632 @item gnus-no-groups-message
1633 @vindex gnus-no-groups-message
1634 Message displayed by gnus when no groups are available.
1635
1636 @item gnus-play-startup-jingle
1637 @vindex gnus-play-startup-jingle
1638 If non-@code{nil}, play the gnus jingle at startup.
1639
1640 @item gnus-startup-jingle
1641 @vindex gnus-startup-jingle
1642 Jingle to be played if the above variable is non-@code{nil}.  The
1643 default is @samp{Tuxedomoon.Jingle4.au}.
1644
1645 @end table
1646
1647
1648 @node Group Buffer
1649 @chapter Group Buffer
1650 @cindex group buffer
1651
1652 @c Alex Schroeder suggests to rearrange this as follows:
1653 @c
1654 @c <kensanata> ok, just save it for reference.  I'll go to bed in a minute.
1655 @c   1. Selecting a Group, 2. (new) Finding a Group, 3. Group Levels,
1656 @c   4. Subscription Commands, 5. Group Maneuvering, 6. Group Data,
1657 @c   7. Group Score, 8. Group Buffer Format
1658 @c <kensanata> Group Levels should have more information on levels 5 to 9.  I
1659 @c   suggest to split the 4th paragraph ("Gnus considers groups...") as follows:
1660 @c <kensanata> First, "Gnus considers groups... (default 9)."
1661 @c <kensanata> New, a table summarizing what levels 1 to 9 mean.
1662 @c <kensanata> Third, "Gnus treats subscribed ... reasons of efficiency"
1663 @c <kensanata> Then expand the next paragraph or add some more to it.
1664 @c    This short one sentence explains levels 1 and 2, therefore I understand
1665 @c    that I should keep important news at 3 and boring news at 4.
1666 @c    Say so!  Then go on to explain why I should bother with levels 6 to 9.
1667 @c    Maybe keep those that you don't want to read temporarily at 6,
1668 @c    those that you never want to read at 8, those that offend your
1669 @c    human rights at 9...
1670
1671
1672 The @dfn{group buffer} lists all (or parts) of the available groups.  It
1673 is the first buffer shown when gnus starts, and will never be killed as
1674 long as gnus is active.
1675
1676 @iftex
1677 @iflatex
1678 \gnusfigure{The Group Buffer}{320}{
1679 \put(75,50){\epsfig{figure=ps/group,height=9cm}}
1680 \put(120,37){\makebox(0,0)[t]{Buffer name}}
1681 \put(120,38){\vector(1,2){10}}
1682 \put(40,60){\makebox(0,0)[r]{Mode line}}
1683 \put(40,58){\vector(1,0){30}}
1684 \put(200,28){\makebox(0,0)[t]{Native select method}}
1685 \put(200,26){\vector(-1,2){15}}
1686 }
1687 @end iflatex
1688 @end iftex
1689
1690 @menu
1691 * Group Buffer Format::         Information listed and how you can change it.
1692 * Group Maneuvering::           Commands for moving in the group buffer.
1693 * Selecting a Group::           Actually reading news.
1694 * Subscription Commands::       Unsubscribing, killing, subscribing.
1695 * Group Data::                  Changing the info for a group.
1696 * Group Levels::                Levels? What are those, then?
1697 * Group Score::                 A mechanism for finding out what groups you like.
1698 * Marking Groups::              You can mark groups for later processing.
1699 * Foreign Groups::              Creating and editing groups.
1700 * Group Parameters::            Each group may have different parameters set.
1701 * Listing Groups::              Gnus can list various subsets of the groups.
1702 * Sorting Groups::              Re-arrange the group order.
1703 * Group Maintenance::           Maintaining a tidy @file{.newsrc} file.
1704 * Browse Foreign Server::       You can browse a server.  See what it has to offer.
1705 * Exiting Gnus::                Stop reading news and get some work done.
1706 * Group Topics::                A folding group mode divided into topics.
1707 * Misc Group Stuff::            Other stuff that you can to do.
1708 @end menu
1709
1710
1711 @node Group Buffer Format
1712 @section Group Buffer Format
1713
1714 @menu
1715 * Group Line Specification::    Deciding how the group buffer is to look.
1716 * Group Modeline Specification::  The group buffer modeline.
1717 * Group Highlighting::          Having nice colors in the group buffer.
1718 @end menu
1719
1720
1721 @node Group Line Specification
1722 @subsection Group Line Specification
1723 @cindex group buffer format
1724
1725 The default format of the group buffer is nice and dull, but you can
1726 make it as exciting and ugly as you feel like.
1727
1728 Here's a couple of example group lines:
1729
1730 @example
1731      25: news.announce.newusers
1732  *    0: alt.fan.andrea-dworkin
1733 @end example
1734
1735 Quite simple, huh?
1736
1737 You can see that there are 25 unread articles in
1738 @samp{news.announce.newusers}.  There are no unread articles, but some
1739 ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little
1740 asterisk at the beginning of the line?).
1741
1742 @vindex gnus-group-line-format
1743 You can change that format to whatever you want by fiddling with the
1744 @code{gnus-group-line-format} variable.  This variable works along the
1745 lines of a @code{format} specification, which is pretty much the same as
1746 a @code{printf} specifications, for those of you who use (feh!) C.
1747 @xref{Formatting Variables}.
1748
1749 @samp{%M%S%5y:%B%(%g%)\n} is the value that produced those lines above.
1750
1751 There should always be a colon on the line; the cursor always moves to
1752 the colon after performing an operation.  @xref{Positioning
1753 Point}. Nothing else is required---not even the group name.  All
1754 displayed text is just window dressing, and is never examined by Gnus.
1755 Gnus stores all real information it needs using text properties.
1756
1757 (Note that if you make a really strange, wonderful, spreadsheet-like
1758 layout, everybody will believe you are hard at work with the accounting
1759 instead of wasting time reading news.)
1760
1761 Here's a list of all available format characters:
1762
1763 @table @samp
1764
1765 @item M
1766 An asterisk if the group only has marked articles.
1767
1768 @item S
1769 Whether the group is subscribed.
1770
1771 @item L
1772 Level of subscribedness.
1773
1774 @item N
1775 Number of unread articles.
1776
1777 @item I
1778 Number of dormant articles.
1779
1780 @item T
1781 Number of ticked articles.
1782
1783 @item R
1784 Number of read articles.
1785
1786 @item U
1787 Number of unseen articles.
1788
1789 @item t
1790 Estimated total number of articles.  (This is really @var{max-number}
1791 minus @var{min-number} plus 1.)
1792
1793 Gnus uses this estimation because the @sc{nntp} protocol provides
1794 efficient access to @var{max-number} and @var{min-number} but getting
1795 the true unread message count is not possible efficiently.  For
1796 hysterical raisins, even the mail back ends, where the true number of
1797 unread messages might be available efficiently, use the same limited
1798 interface.  To remove this restriction from Gnus means that the back
1799 end interface has to be changed, which is not an easy job.  If you
1800 want to work on this, please contact the Gnus mailing list.
1801
1802 @item y
1803 Number of unread, unticked, non-dormant articles.
1804
1805 @item i
1806 Number of ticked and dormant articles.
1807
1808 @item g
1809 Full group name.
1810
1811 @item G
1812 Group name.
1813
1814 @item C
1815 Group comment (@pxref{Group Parameters}) or group name if there is no
1816 comment element in the group parameters.
1817
1818 @item D
1819 Newsgroup description.
1820
1821 @item o
1822 @samp{m} if moderated.
1823
1824 @item O
1825 @samp{(m)} if moderated.
1826
1827 @item s
1828 Select method.
1829
1830 @item B
1831 If the summary buffer for the group is open or not.
1832
1833 @item n
1834 Select from where.
1835
1836 @item z
1837 A string that looks like @samp{<%s:%n>} if a foreign select method is
1838 used.
1839
1840 @item P
1841 Indentation based on the level of the topic (@pxref{Group Topics}).
1842
1843 @item c
1844 @vindex gnus-group-uncollapsed-levels
1845 Short (collapsed) group name.  The @code{gnus-group-uncollapsed-levels}
1846 variable says how many levels to leave at the end of the group name.
1847 The default is 1---this will mean that group names like
1848 @samp{gnu.emacs.gnus} will be shortened to @samp{g.e.gnus}.
1849
1850 @item m
1851 @vindex gnus-new-mail-mark
1852 @cindex %
1853 @samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail to
1854 the group lately.
1855
1856 @item p
1857 @samp{#} (@code{gnus-process-mark}) if the group is process marked.
1858
1859 @item d
1860 A string that says when you last read the group (@pxref{Group
1861 Timestamp}).
1862
1863 @item u
1864 User defined specifier.  The next character in the format string should
1865 be a letter.  Gnus will call the function
1866 @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
1867 following @samp{%u}.  The function will be passed a single dummy
1868 parameter as argument.  The function should return a string, which will
1869 be inserted into the buffer just like information from any other
1870 specifier.
1871 @end table
1872
1873 @cindex *
1874 All the ``number-of'' specs will be filled with an asterisk (@samp{*})
1875 if no info is available---for instance, if it is a non-activated foreign
1876 group, or a bogus native group.
1877
1878
1879 @node Group Modeline Specification
1880 @subsection Group Modeline Specification
1881 @cindex group modeline
1882
1883 @vindex gnus-group-mode-line-format
1884 The mode line can be changed by setting
1885 @code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}).  It
1886 doesn't understand that many format specifiers:
1887
1888 @table @samp
1889 @item S
1890 The native news server.
1891 @item M
1892 The native select method.
1893 @end table
1894
1895
1896 @node Group Highlighting
1897 @subsection Group Highlighting
1898 @cindex highlighting
1899 @cindex group highlighting
1900
1901 @vindex gnus-group-highlight
1902 Highlighting in the group buffer is controlled by the
1903 @code{gnus-group-highlight} variable.  This is an alist with elements
1904 that look like @code{(@var{form} . @var{face})}.  If @var{form} evaluates to
1905 something non-@code{nil}, the @var{face} will be used on the line.
1906
1907 Here's an example value for this variable that might look nice if the
1908 background is dark:
1909
1910 @lisp
1911 (cond (window-system
1912        (setq custom-background-mode 'light)
1913        (defface my-group-face-1
1914          '((t (:foreground "Red" :bold t))) "First group face")
1915        (defface my-group-face-2
1916          '((t (:foreground "DarkSeaGreen4" :bold t))) "Second group face")
1917        (defface my-group-face-3
1918          '((t (:foreground "Green4" :bold t))) "Third group face")
1919        (defface my-group-face-4
1920          '((t (:foreground "SteelBlue" :bold t))) "Fourth group face")
1921        (defface my-group-face-5
1922          '((t (:foreground "Blue" :bold t))) "Fifth group face")))
1923
1924 (setq gnus-group-highlight
1925       '(((> unread 200) . my-group-face-1)
1926         ((and (< level 3) (zerop unread)) . my-group-face-2)
1927         ((< level 3) . my-group-face-3)
1928         ((zerop unread) . my-group-face-4)
1929         (t . my-group-face-5)))
1930 @end lisp
1931
1932 Also @pxref{Faces and Fonts}.
1933
1934 Variables that are dynamically bound when the forms are evaluated
1935 include:
1936
1937 @table @code
1938 @item group
1939 The group name.
1940 @item unread
1941 The number of unread articles in the group.
1942 @item method
1943 The select method.
1944 @item mailp
1945 Whether the group is a mail group.
1946 @item level
1947 The level of the group.
1948 @item score
1949 The score of the group.
1950 @item ticked
1951 The number of ticked articles in the group.
1952 @item total
1953 The total number of articles in the group.  Or rather, MAX-NUMBER minus
1954 MIN-NUMBER plus one.
1955 @item topic
1956 When using the topic minor mode, this variable is bound to the current
1957 topic being inserted.
1958 @end table
1959
1960 When the forms are @code{eval}ed, point is at the beginning of the line
1961 of the group in question, so you can use many of the normal gnus
1962 functions for snarfing info on the group.
1963
1964 @vindex gnus-group-update-hook
1965 @findex gnus-group-highlight-line
1966 @code{gnus-group-update-hook} is called when a group line is changed.
1967 It will not be called when @code{gnus-visual} is @code{nil}.  This hook
1968 calls @code{gnus-group-highlight-line} by default.
1969
1970
1971 @node Group Maneuvering
1972 @section Group Maneuvering
1973 @cindex group movement
1974
1975 All movement commands understand the numeric prefix and will behave as
1976 expected, hopefully.
1977
1978 @table @kbd
1979
1980 @item n
1981 @kindex n (Group)
1982 @findex gnus-group-next-unread-group
1983 Go to the next group that has unread articles
1984 (@code{gnus-group-next-unread-group}).
1985
1986 @item p
1987 @itemx DEL
1988 @kindex DEL (Group)
1989 @kindex p (Group)
1990 @findex gnus-group-prev-unread-group
1991 Go to the previous group that has unread articles
1992 (@code{gnus-group-prev-unread-group}).
1993
1994 @item N
1995 @kindex N (Group)
1996 @findex gnus-group-next-group
1997 Go to the next group (@code{gnus-group-next-group}).
1998
1999 @item P
2000 @kindex P (Group)
2001 @findex gnus-group-prev-group
2002 Go to the previous group (@code{gnus-group-prev-group}).
2003
2004 @item M-n
2005 @kindex M-n (Group)
2006 @findex gnus-group-next-unread-group-same-level
2007 Go to the next unread group on the same (or lower) level
2008 (@code{gnus-group-next-unread-group-same-level}).
2009
2010 @item M-p
2011 @kindex M-p (Group)
2012 @findex gnus-group-prev-unread-group-same-level
2013 Go to the previous unread group on the same (or lower) level
2014 (@code{gnus-group-prev-unread-group-same-level}).
2015 @end table
2016
2017 Three commands for jumping to groups:
2018
2019 @table @kbd
2020
2021 @item j
2022 @kindex j (Group)
2023 @findex gnus-group-jump-to-group
2024 Jump to a group (and make it visible if it isn't already)
2025 (@code{gnus-group-jump-to-group}).  Killed groups can be jumped to, just
2026 like living groups.
2027
2028 @item ,
2029 @kindex , (Group)
2030 @findex gnus-group-best-unread-group
2031 Jump to the unread group with the lowest level
2032 (@code{gnus-group-best-unread-group}).
2033
2034 @item .
2035 @kindex . (Group)
2036 @findex gnus-group-first-unread-group
2037 Jump to the first group with unread articles
2038 (@code{gnus-group-first-unread-group}).
2039 @end table
2040
2041 @vindex gnus-group-goto-unread
2042 If @code{gnus-group-goto-unread} is @code{nil}, all the movement
2043 commands will move to the next group, not the next unread group.  Even
2044 the commands that say they move to the next unread group.  The default
2045 is @code{t}.
2046
2047
2048 @node Selecting a Group
2049 @section Selecting a Group
2050 @cindex group selection
2051
2052 @table @kbd
2053
2054 @item SPACE
2055 @kindex SPACE (Group)
2056 @findex gnus-group-read-group
2057 Select the current group, switch to the summary buffer and display the
2058 first unread article (@code{gnus-group-read-group}).  If there are no
2059 unread articles in the group, or if you give a non-numerical prefix to
2060 this command, gnus will offer to fetch all the old articles in this
2061 group from the server.  If you give a numerical prefix @var{N}, @var{N}
2062 determines the number of articles gnus will fetch.  If @var{N} is
2063 positive, gnus fetches the @var{N} newest articles, if @var{N} is
2064 negative, Gnus fetches the @code{abs(@var{N})} oldest articles.
2065
2066 Thus, @kbd{SPC} enters the group normally, @kbd{C-u SPC} offers old
2067 articles, @kbd{C-u 4 2 SPC} fetches the 42 newest articles, and @kbd{C-u
2068 - 4 2 SPC} fetches the 42 oldest ones.
2069
2070 When you are in the group (in the Summary buffer), you can type
2071 @kbd{M-g} to fetch new articles, or @kbd{C-u M-g} to also show the old
2072 ones.
2073
2074 @item RET
2075 @kindex RET (Group)
2076 @findex gnus-group-select-group
2077 Select the current group and switch to the summary buffer
2078 (@code{gnus-group-select-group}).  Takes the same arguments as
2079 @code{gnus-group-read-group}---the only difference is that this command
2080 does not display the first unread article automatically upon group
2081 entry.
2082
2083 @item M-RET
2084 @kindex M-RET (Group)
2085 @findex gnus-group-quick-select-group
2086 This does the same as the command above, but tries to do it with the
2087 minimum amount of fuzz (@code{gnus-group-quick-select-group}).  No
2088 scoring/killing will be performed, there will be no highlights and no
2089 expunging.  This might be useful if you're in a real hurry and have to
2090 enter some humongous group.  If you give a 0 prefix to this command
2091 (i.e., @kbd{0 M-RET}), gnus won't even generate the summary buffer,
2092 which is useful if you want to toggle threading before generating the
2093 summary buffer (@pxref{Summary Generation Commands}).
2094
2095 @item M-SPACE
2096 @kindex M-SPACE (Group)
2097 @findex gnus-group-visible-select-group
2098 This is yet one more command that does the same as the @kbd{RET}
2099 command, but this one does it without expunging and hiding dormants
2100 (@code{gnus-group-visible-select-group}).
2101
2102 @item C-M-RET
2103 @kindex C-M-RET (Group)
2104 @findex gnus-group-select-group-ephemerally
2105 Finally, this command selects the current group ephemerally without
2106 doing any processing of its contents
2107 (@code{gnus-group-select-group-ephemerally}).  Even threading has been
2108 turned off.  Everything you do in the group after selecting it in this
2109 manner will have no permanent effects.
2110
2111 @end table
2112
2113 @vindex gnus-large-newsgroup
2114 The @code{gnus-large-newsgroup} variable says what gnus should consider
2115 to be a big group.  This is 200 by default.  If the group has more
2116 (unread and/or ticked) articles than this, gnus will query the user
2117 before entering the group.  The user can then specify how many articles
2118 should be fetched from the server.  If the user specifies a negative
2119 number (@code{-n}), the @code{n} oldest articles will be fetched.  If it
2120 is positive, the @code{n} articles that have arrived most recently will
2121 be fetched.
2122
2123 @vindex gnus-select-group-hook
2124 @vindex gnus-auto-select-first
2125 @vindex gnus-auto-select-subject
2126 If @code{gnus-auto-select-first} is non-@code{nil}, select an article
2127 automatically when entering a group with the @kbd{SPACE} command.
2128 Which article this is is controlled by the
2129 @code{gnus-auto-select-subject} variable.  Valid values for this
2130 variable is:
2131
2132 @table @code
2133
2134 @item unread
2135 Place point on the subject line of the first unread article.
2136
2137 @item first
2138 Place point on the subject line of the first article.
2139
2140 @item unseen
2141 Place point on the subject line of the first unseen article.
2142
2143 @item unseen-or-unread
2144 Place point on the subject line of the first unseen article, and if
2145 there is no such article, place point on the subject line of the first
2146 unread article.
2147
2148 @item best
2149 Place point on the subject line of the highest-scored unread article.
2150
2151 @end table
2152
2153 This variable can also be a function.  In that case, that function
2154 will be called to place point on a subject line.
2155
2156 If you want to prevent automatic selection in some group (say, in a
2157 binary group with Huge articles) you can set the
2158 @code{gnus-auto-select-first} variable to @code{nil} in
2159 @code{gnus-select-group-hook}, which is called when a group is
2160 selected.
2161
2162
2163 @node Subscription Commands
2164 @section Subscription Commands
2165 @cindex subscription
2166
2167 @table @kbd
2168
2169 @item S t
2170 @itemx u
2171 @kindex S t (Group)
2172 @kindex u (Group)
2173 @findex gnus-group-unsubscribe-current-group
2174 @c @icon{gnus-group-unsubscribe}
2175 Toggle subscription to the current group
2176 (@code{gnus-group-unsubscribe-current-group}).
2177
2178 @item S s
2179 @itemx U
2180 @kindex S s (Group)
2181 @kindex U (Group)
2182 @findex gnus-group-unsubscribe-group
2183 Prompt for a group to subscribe, and then subscribe it.  If it was
2184 subscribed already, unsubscribe it instead
2185 (@code{gnus-group-unsubscribe-group}).
2186
2187 @item S k
2188 @itemx C-k
2189 @kindex S k (Group)
2190 @kindex C-k (Group)
2191 @findex gnus-group-kill-group
2192 @c @icon{gnus-group-kill-group}
2193 Kill the current group (@code{gnus-group-kill-group}).
2194
2195 @item S y
2196 @itemx C-y
2197 @kindex S y (Group)
2198 @kindex C-y (Group)
2199 @findex gnus-group-yank-group
2200 Yank the last killed group (@code{gnus-group-yank-group}).
2201
2202 @item C-x C-t
2203 @kindex C-x C-t (Group)
2204 @findex gnus-group-transpose-groups
2205 Transpose two groups (@code{gnus-group-transpose-groups}).  This isn't
2206 really a subscription command, but you can use it instead of a
2207 kill-and-yank sequence sometimes.
2208
2209 @item S w
2210 @itemx C-w
2211 @kindex S w (Group)
2212 @kindex C-w (Group)
2213 @findex gnus-group-kill-region
2214 Kill all groups in the region (@code{gnus-group-kill-region}).
2215
2216 @item S z
2217 @kindex S z (Group)
2218 @findex gnus-group-kill-all-zombies
2219 Kill all zombie groups (@code{gnus-group-kill-all-zombies}).
2220
2221 @item S C-k
2222 @kindex S C-k (Group)
2223 @findex gnus-group-kill-level
2224 Kill all groups on a certain level (@code{gnus-group-kill-level}).
2225 These groups can't be yanked back after killing, so this command should
2226 be used with some caution.  The only time where this command comes in
2227 really handy is when you have a @file{.newsrc} with lots of unsubscribed
2228 groups that you want to get rid off.  @kbd{S C-k} on level 7 will
2229 kill off all unsubscribed groups that do not have message numbers in the
2230 @file{.newsrc} file.
2231
2232 @end table
2233
2234 Also @pxref{Group Levels}.
2235
2236
2237 @node Group Data
2238 @section Group Data
2239
2240 @table @kbd
2241
2242 @item c
2243 @kindex c (Group)
2244 @findex gnus-group-catchup-current
2245 @vindex gnus-group-catchup-group-hook
2246 @c @icon{gnus-group-catchup-current}
2247 Mark all unticked articles in this group as read
2248 (@code{gnus-group-catchup-current}).
2249 @code{gnus-group-catchup-group-hook} is called when catching up a group from
2250 the group buffer.
2251
2252 @item C
2253 @kindex C (Group)
2254 @findex gnus-group-catchup-current-all
2255 Mark all articles in this group, even the ticked ones, as read
2256 (@code{gnus-group-catchup-current-all}).
2257
2258 @item M-c
2259 @kindex M-c (Group)
2260 @findex gnus-group-clear-data
2261 Clear the data from the current group---nix out marks and the list of
2262 read articles (@code{gnus-group-clear-data}).
2263
2264 @item M-x gnus-group-clear-data-on-native-groups
2265 @kindex M-x gnus-group-clear-data-on-native-groups
2266 @findex gnus-group-clear-data-on-native-groups
2267 If you have switched from one @sc{nntp} server to another, all your marks
2268 and read ranges have become worthless.  You can use this command to
2269 clear out all data that you have on your native groups.  Use with
2270 caution.
2271
2272 @end table
2273
2274
2275 @node Group Levels
2276 @section Group Levels
2277 @cindex group level
2278 @cindex level
2279
2280 All groups have a level of @dfn{subscribedness}.  For instance, if a
2281 group is on level 2, it is more subscribed than a group on level 5.  You
2282 can ask gnus to just list groups on a given level or lower
2283 (@pxref{Listing Groups}), or to just check for new articles in groups on
2284 a given level or lower (@pxref{Scanning New Messages}).
2285
2286 Remember:  The higher the level of the group, the less important it is.
2287
2288 @table @kbd
2289
2290 @item S l
2291 @kindex S l (Group)
2292 @findex gnus-group-set-current-level
2293 Set the level of the current group.  If a numeric prefix is given, the
2294 next @var{n} groups will have their levels set.  The user will be
2295 prompted for a level.
2296 @end table
2297
2298 @vindex gnus-level-killed
2299 @vindex gnus-level-zombie
2300 @vindex gnus-level-unsubscribed
2301 @vindex gnus-level-subscribed
2302 Gnus considers groups from levels 1 to
2303 @code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed,
2304 @code{gnus-level-subscribed} (exclusive) and
2305 @code{gnus-level-unsubscribed} (inclusive) (default 7) to be
2306 unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead)
2307 (default 8) and @code{gnus-level-killed} to be killed (completely dead)
2308 (default 9).  Gnus treats subscribed and unsubscribed groups exactly the
2309 same, but zombie and killed groups have no information on what articles
2310 you have read, etc, stored.  This distinction between dead and living
2311 groups isn't done because it is nice or clever, it is done purely for
2312 reasons of efficiency.
2313
2314 It is recommended that you keep all your mail groups (if any) on quite
2315 low levels (e.g. 1 or 2).
2316
2317 Maybe the following description of the default behavior of Gnus helps to
2318 understand what these levels are all about.  By default, Gnus shows you
2319 subscribed nonempty groups, but by hitting @kbd{L} you can have it show
2320 empty subscribed groups and unsubscribed groups, too.  Type @kbd{l} to
2321 go back to showing nonempty subscribed groups again.  Thus, unsubscribed
2322 groups are hidden, in a way.
2323
2324 Zombie and killed groups are similar to unsubscribed groups in that they
2325 are hidden by default.  But they are different from subscribed and
2326 unsubscribed groups in that Gnus doesn't ask the news server for
2327 information (number of messages, number of unread messages) on zombie
2328 and killed groups.  Normally, you use @kbd{C-k} to kill the groups you
2329 aren't interested in.  If most groups are killed, Gnus is faster.
2330
2331 Why does Gnus distinguish between zombie and killed groups?  Well, when
2332 a new group arrives on the server, Gnus by default makes it a zombie
2333 group.  This means that you are normally not bothered with new groups,
2334 but you can type @kbd{A z} to get a list of all new groups.  Subscribe
2335 the ones you like and kill the ones you don't want.  (@kbd{A k} shows a
2336 list of killed groups.)
2337
2338 If you want to play with the level variables, you should show some care.
2339 Set them once, and don't touch them ever again.  Better yet, don't touch
2340 them at all unless you know exactly what you're doing.
2341
2342 @vindex gnus-level-default-unsubscribed
2343 @vindex gnus-level-default-subscribed
2344 Two closely related variables are @code{gnus-level-default-subscribed}
2345 (default 3) and @code{gnus-level-default-unsubscribed} (default 6),
2346 which are the levels that new groups will be put on if they are
2347 (un)subscribed.  These two variables should, of course, be inside the
2348 relevant valid ranges.
2349
2350 @vindex gnus-keep-same-level
2351 If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands
2352 will only move to groups of the same level (or lower).  In
2353 particular, going from the last article in one group to the next group
2354 will go to the next group of the same level (or lower).  This might be
2355 handy if you want to read the most important groups before you read the
2356 rest.
2357
2358 If this variable is @code{best}, Gnus will make the next newsgroup the
2359 one with the best level.
2360
2361 @vindex gnus-group-default-list-level
2362 All groups with a level less than or equal to
2363 @code{gnus-group-default-list-level} will be listed in the group buffer
2364 by default.
2365
2366 @vindex gnus-group-list-inactive-groups
2367 If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active
2368 groups will be listed along with the unread groups.  This variable is
2369 @code{t} by default.  If it is @code{nil}, inactive groups won't be
2370 listed.
2371
2372 @vindex gnus-group-use-permanent-levels
2373 If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you
2374 give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
2375 use this level as the ``work'' level.
2376
2377 @vindex gnus-activate-level
2378 Gnus will normally just activate (i. e., query the server about) groups
2379 on level @code{gnus-activate-level} or less.  If you don't want to
2380 activate unsubscribed groups, for instance, you might set this variable
2381 to 5.  The default is 6.
2382
2383
2384 @node Group Score
2385 @section Group Score
2386 @cindex group score
2387 @cindex group rank
2388 @cindex rank
2389
2390 You would normally keep important groups on high levels, but that scheme
2391 is somewhat restrictive.  Don't you wish you could have Gnus sort the
2392 group buffer according to how often you read groups, perhaps?  Within
2393 reason?
2394
2395 This is what @dfn{group score} is for.  You can have Gnus assign a score
2396 to each group through the mechanism described below.  You can then sort
2397 the group buffer based on this score.  Alternatively, you can sort on
2398 score and then level.  (Taken together, the level and the score is
2399 called the @dfn{rank} of the group.  A group that is on level 4 and has
2400 a score of 1 has a higher rank than a group on level 5 that has a score
2401 of 300.  (The level is the most significant part and the score is the
2402 least significant part.))
2403
2404 @findex gnus-summary-bubble-group
2405 If you want groups you read often to get higher scores than groups you
2406 read seldom you can add the @code{gnus-summary-bubble-group} function to
2407 the @code{gnus-summary-exit-hook} hook.  This will result (after
2408 sorting) in a bubbling sort of action.  If you want to see that in
2409 action after each summary exit, you can add
2410 @code{gnus-group-sort-groups-by-rank} or
2411 @code{gnus-group-sort-groups-by-score} to the same hook, but that will
2412 slow things down somewhat.
2413
2414
2415 @node Marking Groups
2416 @section Marking Groups
2417 @cindex marking groups
2418
2419 If you want to perform some command on several groups, and they appear
2420 subsequently in the group buffer, you would normally just give a
2421 numerical prefix to the command.  Most group commands will then do your
2422 bidding on those groups.
2423
2424 However, if the groups are not in sequential order, you can still
2425 perform a command on several groups.  You simply mark the groups first
2426 with the process mark and then execute the command.
2427
2428 @table @kbd
2429
2430 @item #
2431 @kindex # (Group)
2432 @itemx M m
2433 @kindex M m (Group)
2434 @findex gnus-group-mark-group
2435 Set the mark on the current group (@code{gnus-group-mark-group}).
2436
2437 @item M-#
2438 @kindex M-# (Group)
2439 @itemx M u
2440 @kindex M u (Group)
2441 @findex gnus-group-unmark-group
2442 Remove the mark from the current group
2443 (@code{gnus-group-unmark-group}).
2444
2445 @item M U
2446 @kindex M U (Group)
2447 @findex gnus-group-unmark-all-groups
2448 Remove the mark from all groups (@code{gnus-group-unmark-all-groups}).
2449
2450 @item M w
2451 @kindex M w (Group)
2452 @findex gnus-group-mark-region
2453 Mark all groups between point and mark (@code{gnus-group-mark-region}).
2454
2455 @item M b
2456 @kindex M b (Group)
2457 @findex gnus-group-mark-buffer
2458 Mark all groups in the buffer (@code{gnus-group-mark-buffer}).
2459
2460 @item M r
2461 @kindex M r (Group)
2462 @findex gnus-group-mark-regexp
2463 Mark all groups that match some regular expression
2464 (@code{gnus-group-mark-regexp}).
2465 @end table
2466
2467 Also @pxref{Process/Prefix}.
2468
2469 @findex gnus-group-universal-argument
2470 If you want to execute some command on all groups that have been marked
2471 with the process mark, you can use the @kbd{M-&}
2472 (@code{gnus-group-universal-argument}) command.  It will prompt you for
2473 the command to be executed.
2474
2475
2476 @node Foreign Groups
2477 @section Foreign Groups
2478 @cindex foreign groups
2479
2480 Below are some group mode commands for making and editing general foreign
2481 groups, as well as commands to ease the creation of a few
2482 special-purpose groups.  All these commands insert the newly created
2483 groups under point---@code{gnus-subscribe-newsgroup-method} is not
2484 consulted.
2485
2486 @table @kbd
2487
2488 @item G m
2489 @kindex G m (Group)
2490 @findex gnus-group-make-group
2491 @cindex making groups
2492 Make a new group (@code{gnus-group-make-group}).  Gnus will prompt you
2493 for a name, a method and possibly an @dfn{address}.  For an easier way
2494 to subscribe to @sc{nntp} groups, @pxref{Browse Foreign Server}.
2495
2496 @item G r
2497 @kindex G r (Group)
2498 @findex gnus-group-rename-group
2499 @cindex renaming groups
2500 Rename the current group to something else
2501 (@code{gnus-group-rename-group}).  This is valid only on some
2502 groups---mail groups mostly.  This command might very well be quite slow
2503 on some back ends.
2504
2505 @item G c
2506 @kindex G c (Group)
2507 @cindex customizing
2508 @findex gnus-group-customize
2509 Customize the group parameters (@code{gnus-group-customize}).
2510
2511 @item G e
2512 @kindex G e (Group)
2513 @findex gnus-group-edit-group-method
2514 @cindex renaming groups
2515 Enter a buffer where you can edit the select method of the current
2516 group (@code{gnus-group-edit-group-method}).
2517
2518 @item G p
2519 @kindex G p (Group)
2520 @findex gnus-group-edit-group-parameters
2521 Enter a buffer where you can edit the group parameters
2522 (@code{gnus-group-edit-group-parameters}).
2523
2524 @item G E
2525 @kindex G E (Group)
2526 @findex gnus-group-edit-group
2527 Enter a buffer where you can edit the group info
2528 (@code{gnus-group-edit-group}).
2529
2530 @item G d
2531 @kindex G d (Group)
2532 @findex gnus-group-make-directory-group
2533 @cindex nndir
2534 Make a directory group (@pxref{Directory Groups}).  You will be prompted
2535 for a directory name (@code{gnus-group-make-directory-group}).
2536
2537 @item G h
2538 @kindex G h (Group)
2539 @cindex help group
2540 @findex gnus-group-make-help-group
2541 Make the gnus help group (@code{gnus-group-make-help-group}).
2542
2543 @item G a
2544 @kindex G a (Group)
2545 @cindex (ding) archive
2546 @cindex archive group
2547 @findex gnus-group-make-archive-group
2548 @vindex gnus-group-archive-directory
2549 @vindex gnus-group-recent-archive-directory
2550 Make a gnus archive group (@code{gnus-group-make-archive-group}).  By
2551 default a group pointing to the most recent articles will be created
2552 (@code{gnus-group-recent-archive-directory}), but given a prefix, a full
2553 group will be created from @code{gnus-group-archive-directory}.
2554
2555 @item G k
2556 @kindex G k (Group)
2557 @findex gnus-group-make-kiboze-group
2558 @cindex nnkiboze
2559 Make a kiboze group.  You will be prompted for a name, for a regexp to
2560 match groups to be ``included'' in the kiboze group, and a series of
2561 strings to match on headers (@code{gnus-group-make-kiboze-group}).
2562 @xref{Kibozed Groups}.
2563
2564 @item G D
2565 @kindex G D (Group)
2566 @findex gnus-group-enter-directory
2567 @cindex nneething
2568 Read an arbitrary directory as if it were a newsgroup with the
2569 @code{nneething} back end (@code{gnus-group-enter-directory}).
2570 @xref{Anything Groups}.
2571
2572 @item G f
2573 @kindex G f (Group)
2574 @findex gnus-group-make-doc-group
2575 @cindex ClariNet Briefs
2576 @cindex nndoc
2577 Make a group based on some file or other
2578 (@code{gnus-group-make-doc-group}).  If you give a prefix to this
2579 command, you will be prompted for a file name and a file type.
2580 Currently supported types are @code{mbox}, @code{babyl},
2581 @code{digest}, @code{news}, @code{rnews}, @code{mmdf}, @code{forward},
2582 @code{rfc934}, @code{rfc822-forward}, @code{mime-parts},
2583 @code{standard-digest}, @code{slack-digest}, @code{clari-briefs},
2584 @code{nsmail}, @code{outlook}, @code{oe-dbx}, and @code{mailman}.  If
2585 you run this command without a prefix, Gnus will guess at the file
2586 type.  @xref{Document Groups}.
2587
2588 @item G u
2589 @kindex G u (Group)
2590 @vindex gnus-useful-groups
2591 @findex gnus-group-make-useful-group
2592 Create one of the groups mentioned in @code{gnus-useful-groups}
2593 (@code{gnus-group-make-useful-group}).
2594
2595 @item G w
2596 @kindex G w (Group)
2597 @findex gnus-group-make-web-group
2598 @cindex Google
2599 @cindex nnweb
2600 @cindex gmane
2601 Make an ephemeral group based on a web search
2602 (@code{gnus-group-make-web-group}).  If you give a prefix to this
2603 command, make a solid group instead.  You will be prompted for the
2604 search engine type and the search string.  Valid search engine types
2605 include @code{google}, @code{dejanews}, and @code{gmane}.
2606 @xref{Web Searches}.
2607
2608 If you use the @code{google} search engine, you can limit the search
2609 to a particular group by using a match string like
2610 @samp{shaving group:alt.sysadmin.recovery}.
2611
2612 @item G DEL
2613 @kindex G DEL (Group)
2614 @findex gnus-group-delete-group
2615 This function will delete the current group
2616 (@code{gnus-group-delete-group}).  If given a prefix, this function will
2617 actually delete all the articles in the group, and forcibly remove the
2618 group itself from the face of the Earth.  Use a prefix only if you are
2619 absolutely sure of what you are doing.  This command can't be used on
2620 read-only groups (like @code{nntp} group), though.
2621
2622 @item G V
2623 @kindex G V (Group)
2624 @findex gnus-group-make-empty-virtual
2625 Make a new, fresh, empty @code{nnvirtual} group
2626 (@code{gnus-group-make-empty-virtual}).  @xref{Virtual Groups}.
2627
2628 @item G v
2629 @kindex G v (Group)
2630 @findex gnus-group-add-to-virtual
2631 Add the current group to an @code{nnvirtual} group
2632 (@code{gnus-group-add-to-virtual}).  Uses the process/prefix convention.
2633 @end table
2634
2635 @xref{Select Methods}, for more information on the various select
2636 methods.
2637
2638 @vindex gnus-activate-foreign-newsgroups
2639 If @code{gnus-activate-foreign-newsgroups} is a positive number,
2640 gnus will check all foreign groups with this level or lower at startup.
2641 This might take quite a while, especially if you subscribe to lots of
2642 groups from different @sc{nntp} servers.  Also @pxref{Group Levels};
2643 @code{gnus-activate-level} also affects activation of foreign
2644 newsgroups.
2645
2646
2647 @node Group Parameters
2648 @section Group Parameters
2649 @cindex group parameters
2650
2651 The group parameters store information local to a particular group.
2652 Here's an example group parameter list:
2653
2654 @example
2655 ((to-address . "ding@@gnus.org")
2656  (auto-expire . t))
2657 @end example
2658
2659 We see that each element consists of a "dotted pair"---the thing before
2660 the dot is the key, while the thing after the dot is the value.  All the
2661 parameters have this form @emph{except} local variable specs, which are
2662 not dotted pairs, but proper lists.
2663
2664 Some parameters have correspondant customizable variables, each of which
2665 is an alist of regexps and values.
2666
2667 The following group parameters can be used:
2668
2669 @table @code
2670 @item to-address
2671 @cindex to-address
2672 Address used by when doing followups and new posts.
2673
2674 @example
2675 (to-address . "some@@where.com")
2676 @end example
2677
2678 This is primarily useful in mail groups that represent closed mailing
2679 lists---mailing lists where it's expected that everybody that writes to
2680 the mailing list is subscribed to it.  Since using this parameter
2681 ensures that the mail only goes to the mailing list itself, it means
2682 that members won't receive two copies of your followups.
2683
2684 Using @code{to-address} will actually work whether the group is foreign
2685 or not.  Let's say there's a group on the server that is called
2686 @samp{fa.4ad-l}.  This is a real newsgroup, but the server has gotten
2687 the articles from a mail-to-news gateway.  Posting directly to this
2688 group is therefore impossible---you have to send mail to the mailing
2689 list address instead.
2690
2691 See also @code{gnus-parameter-to-address-alist}.
2692
2693 @item to-list
2694 @cindex to-list
2695 Address used when doing @kbd{a} in that group.
2696
2697 @example
2698 (to-list . "some@@where.com")
2699 @end example
2700
2701 It is totally ignored
2702 when doing a followup---except that if it is present in a news group,
2703 you'll get mail group semantics when doing @kbd{f}.
2704
2705 If you do an @kbd{a} command in a mail group and you have neither a
2706 @code{to-list} group parameter nor a @code{to-address} group parameter,
2707 then a @code{to-list} group parameter will be added automatically upon
2708 sending the message if @code{gnus-add-to-list} is set to @code{t}.
2709 @vindex gnus-add-to-list
2710
2711 If you do an @kbd{a} command in a mail group and you don't have a
2712 @code{to-list} group parameter, one will be added automatically upon
2713 sending the message.
2714
2715 @findex gnus-mailing-list-mode
2716 @cindex Mail List Groups
2717 If this variable is set, @code{gnus-mailing-list-mode} is turned on when
2718 entering summary buffer.
2719
2720 See also @code{gnus-parameter-to-list-alist}.
2721
2722 @anchor{subscribed}
2723 @item subscribed
2724 @cindex subscribed
2725 If this parameter is set to @code{t}, Gnus will consider the
2726 to-address and to-list parameters for this group as addresses of
2727 mailing lists you are subscribed to.  Giving Gnus this information is
2728 (only) a first step in getting it to generate correct Mail-Followup-To
2729 headers for your posts to these lists.  Look here @pxref{(message)Mailing
2730 Lists} for a complete treatment of available MFT support.
2731
2732 See also @code{gnus-find-subscribed-addresses}, the function that
2733 directly uses this group parameter.
2734
2735 @item visible
2736 @cindex visible
2737 If the group parameter list has the element @code{(visible . t)},
2738 that group will always be visible in the Group buffer, regardless
2739 of whether it has any unread articles.
2740
2741 @item broken-reply-to
2742 @cindex broken-reply-to
2743 Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
2744 headers in this group are to be ignored.  This can be useful if you're
2745 reading a mailing list group where the listserv has inserted
2746 @code{Reply-To} headers that point back to the listserv itself.  This is
2747 broken behavior.  So there!
2748
2749 @item to-group
2750 @cindex to-group
2751 Elements like @code{(to-group . "some.group.name")} means that all
2752 posts in that group will be sent to @code{some.group.name}.
2753
2754 @item newsgroup
2755 @cindex newsgroup
2756 If you have @code{(newsgroup . t)} in the group parameter list, gnus
2757 will treat all responses as if they were responses to news articles.
2758 This can be useful if you have a mail group that's really a mirror of a
2759 news group.
2760
2761 @item gcc-self
2762 @cindex gcc-self
2763 If @code{(gcc-self . t)} is present in the group parameter list, newly
2764 composed messages will be @code{Gcc}'d to the current group.  If
2765 @code{(gcc-self . none)} is present, no @code{Gcc:} header will be
2766 generated, if @code{(gcc-self . "string")} is present, this string will
2767 be inserted literally as a @code{gcc} header.  This parameter takes
2768 precedence over any default @code{Gcc} rules as described later
2769 (@pxref{Archived Messages}).  CAVEAT:: It yields an error putting
2770 @code{(gcc-self . t)} in groups of a @code{nntp} server or so, because
2771 a @code{nntp} server doesn't accept articles.
2772
2773 @item auto-expire
2774 @cindex auto-expire
2775 If the group parameter has an element that looks like @code{(auto-expire
2776 . t)}, all articles read will be marked as expirable.  For an
2777 alternative approach, @pxref{Expiring Mail}.
2778
2779 See also @code{gnus-auto-expirable-newsgroups}.
2780
2781 @item total-expire
2782 @cindex total-expire
2783 If the group parameter has an element that looks like
2784 @code{(total-expire . t)}, all read articles will be put through the
2785 expiry process, even if they are not marked as expirable.  Use with
2786 caution.  Unread, ticked and dormant articles are not eligible for
2787 expiry.
2788
2789 See also @code{gnus-total-expirable-newsgroups}.
2790
2791 @item expiry-wait
2792 @cindex expiry-wait
2793 @vindex nnmail-expiry-wait-function
2794 If the group parameter has an element that looks like
2795 @code{(expiry-wait . 10)}, this value will override any
2796 @code{nnmail-expiry-wait} and @code{nnmail-expiry-wait-function}
2797 (@pxref{Expiring Mail}) when expiring expirable messages.  The value
2798 can either be a number of days (not necessarily an integer) or the
2799 symbols @code{never} or @code{immediate}.
2800
2801 @item score-file
2802 @cindex score file group parameter
2803 Elements that look like @code{(score-file . "file")} will make
2804 @file{file} into the current score file for the group in question.  All
2805 interactive score entries will be put into this file.
2806
2807 @item adapt-file
2808 @cindex adapt file group parameter
2809 Elements that look like @code{(adapt-file . "file")} will make
2810 @file{file} into the current adaptive file for the group in question.
2811 All adaptive score entries will be put into this file.
2812
2813 @item admin-address
2814 @cindex admin-address
2815 When unsubscribing from a mailing list you should never send the
2816 unsubscription notice to the mailing list itself.  Instead, you'd send
2817 messages to the administrative address.  This parameter allows you to
2818 put the admin address somewhere convenient.
2819
2820 @item display
2821 @cindex display
2822 Elements that look like @code{(display . MODE)} say which articles to
2823 display on entering the group.  Valid values are:
2824
2825 @table @code
2826 @item all
2827 Display all articles, both read and unread.
2828
2829 @item an integer
2830 Display the last INTEGER articles in the group.  This is the same as
2831 entering the group with C-u INTEGER.
2832
2833 @item default
2834 Display the default visible articles, which normally includes unread and
2835 ticked articles.
2836
2837 @item an array
2838 Display articles that satisfy a predicate.
2839
2840 Here are some examples:
2841
2842 @table @code
2843 @item [unread]
2844 Display only unread articles.
2845
2846 @item [not expire]
2847 Display everything except expirable articles.
2848
2849 @item [and (not reply) (not expire)]
2850 Display everything except expirable and articles you've already
2851 responded to.
2852 @end table
2853
2854 The available operators are @code{not}, @code{and} and @code{or}.
2855 Predicates include @code{tick}, @code{unsend}, @code{undownload},
2856 @code{unread}, @code{dormant}, @code{expire}, @code{reply},
2857 @code{killed}, @code{bookmark}, @code{score}, @code{save},
2858 @code{cache}, @code{forward}, @code{unseen} and @code{recent}.
2859
2860 @end table
2861
2862 The @code{display} parameter works by limiting the summary buffer to
2863 the subset specified.  You can pop the limit by using the @kbd{/ w}
2864 command (@pxref{Limiting}).
2865
2866 @item comment
2867 @cindex comment
2868 Elements that look like @code{(comment . "This is a comment")} are
2869 arbitrary comments on the group.  You can display comments in the
2870 group line (@pxref{Group Line Specification}).
2871
2872 @item charset
2873 @cindex charset
2874 Elements that look like @code{(charset . iso-8859-1)} will make
2875 @code{iso-8859-1} the default charset; that is, the charset that will be
2876 used for all articles that do not specify a charset.
2877
2878 See also @code{gnus-group-charset-alist}.
2879
2880 @item ignored-charsets
2881 @cindex ignored-charset
2882 Elements that look like @code{(ignored-charsets x-unknown iso-8859-1)}
2883 will make @code{iso-8859-1} and @code{x-unknown} ignored; that is, the
2884 default charset will be used for decoding articles.
2885
2886 See also @code{gnus-group-ignored-charsets-alist}.
2887
2888 @item posting-style
2889 @cindex posting-style
2890 You can store additional posting style information for this group
2891 here (@pxref{Posting Styles}).  The format is that of an entry in the
2892 @code{gnus-posting-styles} alist, except that there's no regexp matching
2893 the group name (of course).  Style elements in this group parameter will
2894 take precedence over the ones found in @code{gnus-posting-styles}.
2895
2896 For instance, if you want a funky name and signature in this group only,
2897 instead of hacking @code{gnus-posting-styles}, you could put something
2898 like this in the group parameters:
2899
2900 @example
2901 (posting-style
2902   (name "Funky Name")
2903   ("X-My-Header" "Funky Value")
2904   (signature "Funky Signature"))
2905 @end example
2906
2907 @item post-method
2908 @cindex post-method
2909 If it is set, the value is used as the method for posting message
2910 instead of @code{gnus-post-method}.
2911
2912 @item banner
2913 @cindex banner
2914 An item like @code{(banner . "regex")} causes any part of an article
2915 that matches the regular expression "regex" to be stripped. Instead of
2916 "regex", you can also use the symbol @code{signature} which strips the
2917 last signature or any of the elements of the alist
2918 @code{gnus-article-banner-alist}.
2919
2920 @item sieve
2921 @cindex sieve
2922 This parameter contains a Sieve test that should match incoming mail
2923 that should be placed in this group.  From this group parameter, a
2924 Sieve @samp{IF} control structure is generated, having the test as the
2925 condition and @samp{fileinto "group.name";} as the body.
2926
2927 For example, if the INBOX.list.sieve group has the @code{(sieve
2928 address "sender" "sieve-admin@@extundo.com")} group parameter, when
2929 translating the group parameter into a Sieve script (@pxref{Sieve
2930 Commands}) the following Sieve code is generated:
2931
2932 @example
2933 if address \"sender\" \"sieve-admin@@extundo.com\" @{
2934         fileinto \"INBOX.list.sieve\";
2935 @}
2936 @end example
2937
2938 The Sieve language is described in RFC 3028.  @xref{Top, , Top, sieve,
2939 Emacs Sieve}.
2940
2941 @item (@var{variable} @var{form})
2942 You can use the group parameters to set variables local to the group you
2943 are entering.  If you want to turn threading off in @samp{news.answers},
2944 you could put @code{(gnus-show-threads nil)} in the group parameters of
2945 that group.  @code{gnus-show-threads} will be made into a local variable
2946 in the summary buffer you enter, and the form @code{nil} will be
2947 @code{eval}ed there.
2948
2949 @vindex gnus-list-identifiers
2950 A use for this feature, is to remove a mailing list identifier tag in
2951 the subject fields of articles.   E.g. if the news group
2952 @samp{nntp+news.gnus.org:gmane.text.docbook.apps} has the tag
2953 @samp{DOC-BOOK-APPS:} in the subject of all articles, this tag can be
2954 removed from the article subjects in the summary buffer for the group by
2955 putting @code{(gnus-list-identifiers "DOCBOOK-APPS:")} into the group
2956 parameters for the group.
2957
2958
2959 This can also be used as a group-specific hook function, if you'd like.
2960 If you want to hear a beep when you enter a group, you could put
2961 something like @code{(dummy-variable (ding))} in the parameters of that
2962 group.  @code{dummy-variable} will be set to the result of the
2963 @code{(ding)} form, but who cares?
2964
2965 @end table
2966
2967 Use the @kbd{G p} or the @kbd{G c} command to edit group parameters of a
2968 group.  (@kbd{G p} presents you with a Lisp-based interface, @kbd{G c}
2969 presents you with a Customize-like interface.  The latter helps avoid
2970 silly Lisp errors.)  You might also be interested in reading about topic
2971 parameters (@pxref{Topic Parameters}).
2972
2973 @vindex gnus-parameters
2974 Group parameters can be set via the @code{gnus-parameters} variable too.
2975 But some variables, such as @code{visible}, have no effect.  For
2976 example:
2977
2978 @example
2979 (setq gnus-parameters
2980       '(("mail\\..*"
2981          (gnus-show-threads nil)
2982          (gnus-use-scoring nil)
2983          (gnus-summary-line-format
2984           "%U%R%z%I%(%[%d:%ub%-23,23f%]%) %s\n")
2985          (gcc-self . t)
2986          (display . all))
2987
2988         ("^nnimap:\\(foo.bar\\)$"
2989          (to-group . "\\1"))
2990
2991         ("mail\\.me"
2992          (gnus-use-scoring  t))
2993
2994         ("list\\..*"
2995          (total-expire . t)
2996          (broken-reply-to . t))))
2997 @end example
2998
2999 String value of parameters will be subjected to regexp substitution, as
3000 the @code{to-group} example shows.
3001
3002
3003 @node Listing Groups
3004 @section Listing Groups
3005 @cindex group listing
3006
3007 These commands all list various slices of the groups available.
3008
3009 @table @kbd
3010
3011 @item l
3012 @itemx A s
3013 @kindex A s (Group)
3014 @kindex l (Group)
3015 @findex gnus-group-list-groups
3016 List all groups that have unread articles
3017 (@code{gnus-group-list-groups}).  If the numeric prefix is used, this
3018 command will list only groups of level ARG and lower.  By default, it
3019 only lists groups of level five (i. e.,
3020 @code{gnus-group-default-list-level}) or lower (i.e., just subscribed
3021 groups).
3022
3023 @item L
3024 @itemx A u
3025 @kindex A u (Group)
3026 @kindex L (Group)
3027 @findex gnus-group-list-all-groups
3028 List all groups, whether they have unread articles or not
3029 (@code{gnus-group-list-all-groups}).  If the numeric prefix is used,
3030 this command will list only groups of level ARG and lower.  By default,
3031 it lists groups of level seven or lower (i.e., just subscribed and
3032 unsubscribed groups).
3033
3034 @item A l
3035 @kindex A l (Group)
3036 @findex gnus-group-list-level
3037 List all unread groups on a specific level
3038 (@code{gnus-group-list-level}).  If given a prefix, also list the groups
3039 with no unread articles.
3040
3041 @item A k
3042 @kindex A k (Group)
3043 @findex gnus-group-list-killed
3044 List all killed groups (@code{gnus-group-list-killed}).  If given a
3045 prefix argument, really list all groups that are available, but aren't
3046 currently (un)subscribed.  This could entail reading the active file
3047 from the server.
3048
3049 @item A z
3050 @kindex A z (Group)
3051 @findex gnus-group-list-zombies
3052 List all zombie groups (@code{gnus-group-list-zombies}).
3053
3054 @item A m
3055 @kindex A m (Group)
3056 @findex gnus-group-list-matching
3057 List all unread, subscribed groups with names that match a regexp
3058 (@code{gnus-group-list-matching}).
3059
3060 @item A M
3061 @kindex A M (Group)
3062 @findex gnus-group-list-all-matching
3063 List groups that match a regexp (@code{gnus-group-list-all-matching}).
3064
3065 @item A A
3066 @kindex A A (Group)
3067 @findex gnus-group-list-active
3068 List absolutely all groups in the active file(s) of the
3069 server(s) you are connected to (@code{gnus-group-list-active}).  This
3070 might very well take quite a while.  It might actually be a better idea
3071 to do a @kbd{A M} to list all matching, and just give @samp{.} as the
3072 thing to match on.  Also note that this command may list groups that
3073 don't exist (yet)---these will be listed as if they were killed groups.
3074 Take the output with some grains of salt.
3075
3076 @item A a
3077 @kindex A a (Group)
3078 @findex gnus-group-apropos
3079 List all groups that have names that match a regexp
3080 (@code{gnus-group-apropos}).
3081
3082 @item A d
3083 @kindex A d (Group)
3084 @findex gnus-group-description-apropos
3085 List all groups that have names or descriptions that match a regexp
3086 (@code{gnus-group-description-apropos}).
3087
3088 @item A c
3089 @kindex A c (Group)
3090 @findex gnus-group-list-cached
3091 List all groups with cached articles (@code{gnus-group-list-cached}).
3092
3093 @item A ?
3094 @kindex A ? (Group)
3095 @findex gnus-group-list-dormant
3096 List all groups with dormant articles (@code{gnus-group-list-dormant}).
3097
3098 @item A /
3099 @kindex A / (Group)
3100 @findex gnus-group-list-limit
3101 List groups limited within the current selection
3102 (@code{gnus-group-list-limit}).
3103
3104 @item A f
3105 @kindex A f (Group)
3106 @findex gnus-group-list-flush
3107 Flush groups from the current selection (@code{gnus-group-list-flush}).
3108
3109 @item A p
3110 @kindex A p (Group)
3111 @findex gnus-group-list-plus
3112 List groups plus the current selection (@code{gnus-group-list-plus}).
3113
3114 @end table
3115
3116 @vindex gnus-permanently-visible-groups
3117 @cindex visible group parameter
3118 Groups that match the @code{gnus-permanently-visible-groups} regexp will
3119 always be shown, whether they have unread articles or not.  You can also
3120 add the @code{visible} element to the group parameters in question to
3121 get the same effect.
3122
3123 @vindex gnus-list-groups-with-ticked-articles
3124 Groups that have just ticked articles in it are normally listed in the
3125 group buffer.  If @code{gnus-list-groups-with-ticked-articles} is
3126 @code{nil}, these groups will be treated just like totally empty
3127 groups.  It is @code{t} by default.
3128
3129
3130 @node Sorting Groups
3131 @section Sorting Groups
3132 @cindex sorting groups
3133
3134 @kindex C-c C-s (Group)
3135 @findex gnus-group-sort-groups
3136 @vindex gnus-group-sort-function
3137 The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the
3138 group buffer according to the function(s) given by the
3139 @code{gnus-group-sort-function} variable.  Available sorting functions
3140 include:
3141
3142 @table @code
3143
3144 @item gnus-group-sort-by-alphabet
3145 @findex gnus-group-sort-by-alphabet
3146 Sort the group names alphabetically.  This is the default.
3147
3148 @item gnus-group-sort-by-real-name
3149 @findex gnus-group-sort-by-real-name
3150 Sort the group alphabetically on the real (unprefixed) group names.
3151
3152 @item gnus-group-sort-by-level
3153 @findex gnus-group-sort-by-level
3154 Sort by group level.
3155
3156 @item gnus-group-sort-by-score
3157 @findex gnus-group-sort-by-score
3158 Sort by group score.  @xref{Group Score}.
3159
3160 @item gnus-group-sort-by-rank
3161 @findex gnus-group-sort-by-rank
3162 Sort by group score and then the group level.  The level and the score
3163 are, when taken together, the group's @dfn{rank}.  @xref{Group Score}.
3164
3165 @item gnus-group-sort-by-unread
3166 @findex gnus-group-sort-by-unread
3167 Sort by number of unread articles.
3168
3169 @item gnus-group-sort-by-method
3170 @findex gnus-group-sort-by-method
3171 Sort alphabetically on the select method.
3172
3173 @item gnus-group-sort-by-server
3174 @findex gnus-group-sort-by-server
3175 Sort alphabetically on the Gnus server name.
3176
3177
3178 @end table
3179
3180 @code{gnus-group-sort-function} can also be a list of sorting
3181 functions.  In that case, the most significant sort key function must be
3182 the last one.
3183
3184
3185 There are also a number of commands for sorting directly according to
3186 some sorting criteria:
3187
3188 @table @kbd
3189 @item G S a
3190 @kindex G S a (Group)
3191 @findex gnus-group-sort-groups-by-alphabet
3192 Sort the group buffer alphabetically by group name
3193 (@code{gnus-group-sort-groups-by-alphabet}).
3194
3195 @item G S u
3196 @kindex G S u (Group)
3197 @findex gnus-group-sort-groups-by-unread
3198 Sort the group buffer by the number of unread articles
3199 (@code{gnus-group-sort-groups-by-unread}).
3200
3201 @item G S l
3202 @kindex G S l (Group)
3203 @findex gnus-group-sort-groups-by-level
3204 Sort the group buffer by group level
3205 (@code{gnus-group-sort-groups-by-level}).
3206
3207 @item G S v
3208 @kindex G S v (Group)
3209 @findex gnus-group-sort-groups-by-score
3210 Sort the group buffer by group score
3211 (@code{gnus-group-sort-groups-by-score}).  @xref{Group Score}.
3212
3213 @item G S r
3214 @kindex G S r (Group)
3215 @findex gnus-group-sort-groups-by-rank
3216 Sort the group buffer by group rank
3217 (@code{gnus-group-sort-groups-by-rank}).  @xref{Group Score}.
3218
3219 @item G S m
3220 @kindex G S m (Group)
3221 @findex gnus-group-sort-groups-by-method
3222 Sort the group buffer alphabetically by back end name
3223 (@code{gnus-group-sort-groups-by-method}).
3224
3225 @item G S n
3226 @kindex G S n (Group)
3227 @findex gnus-group-sort-groups-by-real-name
3228 Sort the group buffer alphabetically by real (unprefixed) group name
3229 (@code{gnus-group-sort-groups-by-real-name}).
3230
3231 @end table
3232
3233 All the commands below obey the process/prefix convention
3234 (@pxref{Process/Prefix}).
3235
3236 When given a symbolic prefix (@pxref{Symbolic Prefixes}), all these
3237 commands will sort in reverse order.
3238
3239 You can also sort a subset of the groups:
3240
3241 @table @kbd
3242 @item G P a
3243 @kindex G P a (Group)
3244 @findex gnus-group-sort-selected-groups-by-alphabet
3245 Sort the groups alphabetically by group name
3246 (@code{gnus-group-sort-selected-groups-by-alphabet}).
3247
3248 @item G P u
3249 @kindex G P u (Group)
3250 @findex gnus-group-sort-selected-groups-by-unread
3251 Sort the groups by the number of unread articles
3252 (@code{gnus-group-sort-selected-groups-by-unread}).
3253
3254 @item G P l
3255 @kindex G P l (Group)
3256 @findex gnus-group-sort-selected-groups-by-level
3257 Sort the groups by group level
3258 (@code{gnus-group-sort-selected-groups-by-level}).
3259
3260 @item G P v
3261 @kindex G P v (Group)
3262 @findex gnus-group-sort-selected-groups-by-score
3263 Sort the groups by group score
3264 (@code{gnus-group-sort-selected-groups-by-score}).  @xref{Group Score}.
3265
3266 @item G P r
3267 @kindex G P r (Group)
3268 @findex gnus-group-sort-selected-groups-by-rank
3269 Sort the groups by group rank
3270 (@code{gnus-group-sort-selected-groups-by-rank}).  @xref{Group Score}.
3271
3272 @item G P m
3273 @kindex G P m (Group)
3274 @findex gnus-group-sort-selected-groups-by-method
3275 Sort the groups alphabetically by back end name
3276 (@code{gnus-group-sort-selected-groups-by-method}).
3277
3278 @item G P n
3279 @kindex G P n (Group)
3280 @findex gnus-group-sort-selected-groups-by-real-name
3281 Sort the groups alphabetically by real (unprefixed) group name
3282 (@code{gnus-group-sort-selected-groups-by-real-name}).
3283
3284 @item G P s
3285 @kindex G P s (Group)
3286 @findex gnus-group-sort-selected-groups
3287 Sort the groups according to @code{gnus-group-sort-function}.
3288
3289 @end table
3290
3291 And finally, note that you can use @kbd{C-k} and @kbd{C-y} to manually
3292 move groups around.
3293
3294
3295 @node Group Maintenance
3296 @section Group Maintenance
3297 @cindex bogus groups
3298
3299 @table @kbd
3300 @item b
3301 @kindex b (Group)
3302 @findex gnus-group-check-bogus-groups
3303 Find bogus groups and delete them
3304 (@code{gnus-group-check-bogus-groups}).
3305
3306 @item F
3307 @kindex F (Group)
3308 @findex gnus-group-find-new-groups
3309 Find new groups and process them (@code{gnus-group-find-new-groups}).
3310 With 1 @kbd{C-u}, use the @code{ask-server} method to query the server
3311 for new groups.  With 2 @kbd{C-u}'s, use most complete method possible
3312 to query the server for new groups, and subscribe the new groups as
3313 zombies.
3314
3315 @item C-c C-x
3316 @kindex C-c C-x (Group)
3317 @findex gnus-group-expire-articles
3318 Run all expirable articles in the current group through the expiry
3319 process (if any) (@code{gnus-group-expire-articles}).  That is, delete
3320 all expirable articles in the group that have been around for a while.
3321 (@pxref{Expiring Mail}).
3322
3323 @item C-c C-M-x
3324 @kindex C-c C-M-x (Group)
3325 @findex gnus-group-expire-all-groups
3326 Run all expirable articles in all groups through the expiry process
3327 (@code{gnus-group-expire-all-groups}).
3328
3329 @end table
3330
3331
3332 @node Browse Foreign Server
3333 @section Browse Foreign Server
3334 @cindex foreign servers
3335 @cindex browsing servers
3336
3337 @table @kbd
3338 @item B
3339 @kindex B (Group)
3340 @findex gnus-group-browse-foreign-server
3341 You will be queried for a select method and a server name.  Gnus will
3342 then attempt to contact this server and let you browse the groups there
3343 (@code{gnus-group-browse-foreign-server}).
3344 @end table
3345
3346 @findex gnus-browse-mode
3347 A new buffer with a list of available groups will appear.  This buffer
3348 will use the @code{gnus-browse-mode}.  This buffer looks a bit (well,
3349 a lot) like a normal group buffer.
3350
3351 Here's a list of keystrokes available in the browse mode:
3352
3353 @table @kbd
3354 @item n
3355 @kindex n (Browse)
3356 @findex gnus-group-next-group
3357 Go to the next group (@code{gnus-group-next-group}).
3358
3359 @item p
3360 @kindex p (Browse)
3361 @findex gnus-group-prev-group
3362 Go to the previous group (@code{gnus-group-prev-group}).
3363
3364 @item SPACE
3365 @kindex SPACE (Browse)
3366 @findex gnus-browse-read-group
3367 Enter the current group and display the first article
3368 (@code{gnus-browse-read-group}).
3369
3370 @item RET
3371 @kindex RET (Browse)
3372 @findex gnus-browse-select-group
3373 Enter the current group (@code{gnus-browse-select-group}).
3374
3375 @item u
3376 @kindex u (Browse)
3377 @findex gnus-browse-unsubscribe-current-group
3378 Unsubscribe to the current group, or, as will be the case here,
3379 subscribe to it (@code{gnus-browse-unsubscribe-current-group}).
3380
3381 @item l
3382 @itemx q
3383 @kindex q (Browse)
3384 @kindex l (Browse)
3385 @findex gnus-browse-exit
3386 Exit browse mode (@code{gnus-browse-exit}).
3387
3388 @item d
3389 @kindex d (Browse)
3390 @findex gnus-browse-describe-group
3391 Describe the current group (@code{gnus-browse-describe-group}).
3392
3393 @item ?
3394 @kindex ? (Browse)
3395 @findex gnus-browse-describe-briefly
3396 Describe browse mode briefly (well, there's not much to describe, is
3397 there) (@code{gnus-browse-describe-briefly}).
3398 @end table
3399
3400
3401 @node Exiting Gnus
3402 @section Exiting gnus
3403 @cindex exiting gnus
3404
3405 Yes, gnus is ex(c)iting.
3406
3407 @table @kbd
3408 @item z
3409 @kindex z (Group)
3410 @findex gnus-group-suspend
3411 Suspend gnus (@code{gnus-group-suspend}).  This doesn't really exit gnus,
3412 but it kills all buffers except the Group buffer.  I'm not sure why this
3413 is a gain, but then who am I to judge?
3414
3415 @item q
3416 @kindex q (Group)
3417 @findex gnus-group-exit
3418 @c @icon{gnus-group-exit}
3419 Quit gnus (@code{gnus-group-exit}).
3420
3421 @item Q
3422 @kindex Q (Group)
3423 @findex gnus-group-quit
3424 Quit gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}).
3425 The dribble file will be saved, though (@pxref{Auto Save}).
3426 @end table
3427
3428 @vindex gnus-exit-gnus-hook
3429 @vindex gnus-suspend-gnus-hook
3430 @vindex gnus-after-exiting-gnus-hook
3431 @code{gnus-suspend-gnus-hook} is called when you suspend gnus and
3432 @code{gnus-exit-gnus-hook} is called when you quit gnus, while
3433 @code{gnus-after-exiting-gnus-hook} is called as the final item when
3434 exiting gnus.
3435
3436 @findex gnus-unload
3437 @cindex unloading
3438 If you wish to completely unload gnus and all its adherents, you can use
3439 the @code{gnus-unload} command.  This command is also very handy when
3440 trying to customize meta-variables.
3441
3442 Note:
3443
3444 @quotation
3445 Miss Lisa Cannifax, while sitting in English class, felt her feet go
3446 numbly heavy and herself fall into a hazy trance as the boy sitting
3447 behind her drew repeated lines with his pencil across the back of her
3448 plastic chair.
3449 @end quotation
3450
3451
3452 @node Group Topics
3453 @section Group Topics
3454 @cindex topics
3455
3456 If you read lots and lots of groups, it might be convenient to group
3457 them hierarchically according to topics.  You put your Emacs groups over
3458 here, your sex groups over there, and the rest (what, two groups or so?)
3459 you put in some misc section that you never bother with anyway.  You can
3460 even group the Emacs sex groups as a sub-topic to either the Emacs
3461 groups or the sex groups---or both!  Go wild!
3462
3463 @iftex
3464 @iflatex
3465 \gnusfigure{Group Topics}{400}{
3466 \put(75,50){\epsfig{figure=ps/group-topic,height=9cm}}
3467 }
3468 @end iflatex
3469 @end iftex
3470
3471 Here's an example:
3472
3473 @example
3474 Gnus
3475   Emacs -- I wuw it!
3476      3: comp.emacs
3477      2: alt.religion.emacs
3478     Naughty Emacs
3479      452: alt.sex.emacs
3480        0: comp.talk.emacs.recovery
3481   Misc
3482      8: comp.binaries.fractals
3483     13: comp.sources.unix
3484 @end example
3485
3486 @findex gnus-topic-mode
3487 @kindex t (Group)
3488 To get this @emph{fab} functionality you simply turn on (ooh!) the
3489 @code{gnus-topic} minor mode---type @kbd{t} in the group buffer.  (This
3490 is a toggling command.)
3491
3492 Go ahead, just try it.  I'll still be here when you get back.  La de
3493 dum...  Nice tune, that...  la la la...  What, you're back?  Yes, and
3494 now press @kbd{l}.  There.  All your groups are now listed under
3495 @samp{misc}.  Doesn't that make you feel all warm and fuzzy?  Hot and
3496 bothered?
3497
3498 If you want this permanently enabled, you should add that minor mode to
3499 the hook for the group mode.  Put the following line in your
3500 @file{~/.gnus} file:
3501
3502 @lisp
3503 (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
3504 @end lisp
3505
3506 @menu
3507 * Topic Commands::              Interactive E-Z commands.
3508 * Topic Variables::             How to customize the topics the Lisp Way.
3509 * Topic Sorting::               Sorting each topic individually.
3510 * Topic Topology::              A map of the world.
3511 * Topic Parameters::            Parameters that apply to all groups in a topic.
3512 @end menu
3513
3514
3515 @node Topic Commands
3516 @subsection Topic Commands
3517 @cindex topic commands
3518
3519 When the topic minor mode is turned on, a new @kbd{T} submap will be
3520 available.  In addition, a few of the standard keys change their
3521 definitions slightly.
3522
3523 In general, the following kinds of operations are possible on topics.
3524 First of all, you want to create topics.  Secondly, you want to put
3525 groups in topics and to move them around until you have an order you
3526 like.  The third kind of operation is to show/hide parts of the whole
3527 shebang.  You might want to hide a topic including its subtopics and
3528 groups, to get a better overview of the other groups.
3529
3530 Here is a list of the basic keys that you might need to set up topics
3531 the way you like.
3532
3533 @table @kbd
3534
3535 @item T n
3536 @kindex T n (Topic)
3537 @findex gnus-topic-create-topic
3538 Prompt for a new topic name and create it
3539 (@code{gnus-topic-create-topic}).
3540
3541 @item T TAB
3542 @itemx TAB
3543 @kindex T TAB (Topic)
3544 @kindex TAB (Topic)
3545 @findex gnus-topic-indent
3546 ``Indent'' the current topic so that it becomes a sub-topic of the
3547 previous topic (@code{gnus-topic-indent}).  If given a prefix,
3548 ``un-indent'' the topic instead.
3549
3550 @item M-TAB
3551 @kindex M-TAB (Topic)
3552 @findex gnus-topic-unindent
3553 ``Un-indent'' the current topic so that it becomes a sub-topic of the
3554 parent of its current parent (@code{gnus-topic-unindent}).
3555
3556 @end table
3557
3558 The following two keys can be used to move groups and topics around.
3559 They work like the well-known cut and paste.  @kbd{C-k} is like cut and
3560 @kbd{C-y} is like paste.  Of course, this being Emacs, we use the terms
3561 kill and yank rather than cut and paste.
3562
3563 @table @kbd
3564
3565 @item C-k
3566 @kindex C-k (Topic)
3567 @findex gnus-topic-kill-group
3568 Kill a group or topic (@code{gnus-topic-kill-group}).  All groups in the
3569 topic will be removed along with the topic.
3570
3571 @item C-y
3572 @kindex C-y (Topic)
3573 @findex gnus-topic-yank-group
3574 Yank the previously killed group or topic
3575 (@code{gnus-topic-yank-group}).  Note that all topics will be yanked
3576 before all groups.
3577
3578 So, to move a topic to the beginning of the list of topics, just hit
3579 @kbd{C-k} on it.  This is like the `cut' part of cut and paste.  Then,
3580 move the cursor to the beginning of the buffer (just below the `Gnus'
3581 topic) and hit @kbd{C-y}.  This is like the `paste' part of cut and
3582 paste.  Like I said -- E-Z.
3583
3584 You can use @kbd{C-k} and @kbd{C-y} on groups as well as on topics.  So
3585 you can move topics around as well as groups.
3586
3587 @end table
3588
3589 After setting up the topics the way you like them, you might wish to
3590 hide a topic, or to show it again.  That's why we have the following
3591 key.
3592
3593 @table @kbd
3594
3595 @item RET
3596 @kindex RET (Topic)
3597 @findex gnus-topic-select-group
3598 @itemx SPACE
3599 Either select a group or fold a topic (@code{gnus-topic-select-group}).
3600 When you perform this command on a group, you'll enter the group, as
3601 usual.  When done on a topic line, the topic will be folded (if it was
3602 visible) or unfolded (if it was folded already).  So it's basically a
3603 toggling command on topics.  In addition, if you give a numerical
3604 prefix, group on that level (and lower) will be displayed.
3605
3606 @end table
3607
3608 Now for a list of other commands, in no particular order.
3609
3610 @table @kbd
3611
3612 @item T m
3613 @kindex T m (Topic)
3614 @findex gnus-topic-move-group
3615 Move the current group to some other topic
3616 (@code{gnus-topic-move-group}).  This command uses the process/prefix
3617 convention (@pxref{Process/Prefix}).
3618
3619 @item T j
3620 @kindex T j (Topic)
3621 @findex gnus-topic-jump-to-topic
3622 Go to a topic (@code{gnus-topic-jump-to-topic}).
3623
3624 @item T c
3625 @kindex T c (Topic)
3626 @findex gnus-topic-copy-group
3627 Copy the current group to some other topic
3628 (@code{gnus-topic-copy-group}).  This command uses the process/prefix
3629 convention (@pxref{Process/Prefix}).
3630
3631 @item T h
3632 @kindex T h (Topic)
3633 @findex gnus-topic-hide-topic
3634 Hide the current topic (@code{gnus-topic-hide-topic}).  If given
3635 a prefix, hide the topic permanently.
3636
3637 @item T s
3638 @kindex T s (Topic)
3639 @findex gnus-topic-show-topic
3640 Show the current topic (@code{gnus-topic-show-topic}).  If given
3641 a prefix, show the topic permanently.
3642
3643 @item T D
3644 @kindex T D (Topic)
3645 @findex gnus-topic-remove-group
3646 Remove a group from the current topic (@code{gnus-topic-remove-group}).
3647 This command is mainly useful if you have the same group in several
3648 topics and wish to remove it from one of the topics.  You may also
3649 remove a group from all topics, but in that case, Gnus will add it to
3650 the root topic the next time you start Gnus.  In fact, all new groups
3651 (which, naturally, don't belong to any topic) will show up in the root
3652 topic.
3653
3654 This command uses the process/prefix convention
3655 (@pxref{Process/Prefix}).
3656
3657 @item T M
3658 @kindex T M (Topic)
3659 @findex gnus-topic-move-matching
3660 Move all groups that match some regular expression to a topic
3661 (@code{gnus-topic-move-matching}).
3662
3663 @item T C
3664 @kindex T C (Topic)
3665 @findex gnus-topic-copy-matching
3666 Copy all groups that match some regular expression to a topic
3667 (@code{gnus-topic-copy-matching}).
3668
3669 @item T H
3670 @kindex T H (Topic)
3671 @findex gnus-topic-toggle-display-empty-topics
3672 Toggle hiding empty topics
3673 (@code{gnus-topic-toggle-display-empty-topics}).
3674
3675 @item T #
3676 @kindex T # (Topic)
3677 @findex gnus-topic-mark-topic
3678 Mark all groups in the current topic with the process mark
3679 (@code{gnus-topic-mark-topic}).  This command works recursively on
3680 sub-topics unless given a prefix.
3681
3682 @item T M-#
3683 @kindex T M-# (Topic)
3684 @findex gnus-topic-unmark-topic
3685 Remove the process mark from all groups in the current topic
3686 (@code{gnus-topic-unmark-topic}).  This command works recursively on
3687 sub-topics unless given a prefix.
3688
3689 @item C-c C-x
3690 @kindex C-c C-x (Topic)
3691 @findex gnus-topic-expire-articles
3692 Run all expirable articles in the current group or topic through the
3693 expiry process (if any)
3694 (@code{gnus-topic-expire-articles}). (@pxref{Expiring Mail}).
3695
3696 @item T r
3697 @kindex T r (Topic)
3698 @findex gnus-topic-rename
3699 Rename a topic (@code{gnus-topic-rename}).
3700
3701 @item T DEL
3702 @kindex T DEL (Topic)
3703 @findex gnus-topic-delete
3704 Delete an empty topic (@code{gnus-topic-delete}).
3705
3706 @item A T
3707 @kindex A T (Topic)
3708 @findex gnus-topic-list-active
3709 List all groups that gnus knows about in a topics-ified way
3710 (@code{gnus-topic-list-active}).
3711
3712 @item T M-n
3713 @kindex T M-n (Topic)
3714 @findex gnus-topic-goto-next-topic
3715 Go to the next topic (@code{gnus-topic-goto-next-topic}).
3716
3717 @item T M-p
3718 @kindex T M-p (Topic)
3719 @findex gnus-topic-goto-previous-topic
3720 Go to the next topic (@code{gnus-topic-goto-previous-topic}).
3721
3722 @item G p
3723 @kindex G p (Topic)
3724 @findex gnus-topic-edit-parameters
3725 @cindex group parameters
3726 @cindex topic parameters
3727 @cindex parameters
3728 Edit the topic parameters (@code{gnus-topic-edit-parameters}).
3729 @xref{Topic Parameters}.
3730
3731 @end table
3732
3733
3734 @node Topic Variables
3735 @subsection Topic Variables
3736 @cindex topic variables
3737
3738 The previous section told you how to tell Gnus which topics to display.
3739 This section explains how to tell Gnus what to display about each topic.
3740
3741 @vindex gnus-topic-line-format
3742 The topic lines themselves are created according to the
3743 @code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
3744 Valid elements are:
3745
3746 @table @samp
3747 @item i
3748 Indentation.
3749 @item n
3750 Topic name.
3751 @item v
3752 Visibility.
3753 @item l
3754 Level.
3755 @item g
3756 Number of groups in the topic.
3757 @item a
3758 Number of unread articles in the topic.
3759 @item A
3760 Number of unread articles in the topic and all its subtopics.
3761 @end table
3762
3763 @vindex gnus-topic-indent-level
3764 Each sub-topic (and the groups in the sub-topics) will be indented with
3765 @code{gnus-topic-indent-level} times the topic level number of spaces.
3766 The default is 2.
3767
3768 @vindex gnus-topic-mode-hook
3769 @code{gnus-topic-mode-hook} is called in topic minor mode buffers.
3770
3771 @vindex gnus-topic-display-empty-topics
3772 The @code{gnus-topic-display-empty-topics} says whether to display even
3773 topics that have no unread articles in them.  The default is @code{t}.
3774
3775
3776 @node Topic Sorting
3777 @subsection Topic Sorting
3778 @cindex topic sorting
3779
3780 You can sort the groups in each topic individually with the following
3781 commands:
3782
3783
3784 @table @kbd
3785 @item T S a
3786 @kindex T S a (Topic)
3787 @findex gnus-topic-sort-groups-by-alphabet
3788 Sort the current topic alphabetically by group name
3789 (@code{gnus-topic-sort-groups-by-alphabet}).
3790
3791 @item T S u
3792 @kindex T S u (Topic)
3793 @findex gnus-topic-sort-groups-by-unread
3794 Sort the current topic by the number of unread articles
3795 (@code{gnus-topic-sort-groups-by-unread}).
3796
3797 @item T S l
3798 @kindex T S l (Topic)
3799 @findex gnus-topic-sort-groups-by-level
3800 Sort the current topic by group level
3801 (@code{gnus-topic-sort-groups-by-level}).
3802
3803 @item T S v
3804 @kindex T S v (Topic)
3805 @findex gnus-topic-sort-groups-by-score
3806 Sort the current topic by group score
3807 (@code{gnus-topic-sort-groups-by-score}).  @xref{Group Score}.
3808
3809 @item T S r
3810 @kindex T S r (Topic)
3811 @findex gnus-topic-sort-groups-by-rank
3812 Sort the current topic by group rank
3813 (@code{gnus-topic-sort-groups-by-rank}).  @xref{Group Score}.
3814
3815 @item T S m
3816 @kindex T S m (Topic)
3817 @findex gnus-topic-sort-groups-by-method
3818 Sort the current topic alphabetically by back end name
3819 (@code{gnus-topic-sort-groups-by-method}).
3820
3821 @item T S e
3822 @kindex T S e (Topic)
3823 @findex gnus-topic-sort-groups-by-server
3824 Sort the current topic alphabetically by server name
3825 (@code{gnus-topic-sort-groups-by-server}).
3826
3827 @item T S s
3828 @kindex T S s
3829 @findex gnus-topic-sort-groups
3830 Sort the current topic according to the function(s) given by the
3831 @code{gnus-group-sort-function} variable
3832 (@code{gnus-topic-sort-groups}).
3833
3834 @end table
3835
3836 When given a prefix argument, all these commands will sort in reverse
3837 order.  @xref{Sorting Groups}, for more information about group
3838 sorting.
3839
3840
3841 @node Topic Topology
3842 @subsection Topic Topology
3843 @cindex topic topology
3844 @cindex topology
3845
3846 So, let's have a look at an example group buffer:
3847
3848 @example
3849 Gnus
3850   Emacs -- I wuw it!
3851      3: comp.emacs
3852      2: alt.religion.emacs
3853     Naughty Emacs
3854      452: alt.sex.emacs
3855        0: comp.talk.emacs.recovery
3856   Misc
3857      8: comp.binaries.fractals
3858     13: comp.sources.unix
3859 @end example
3860
3861 So, here we have one top-level topic (@samp{Gnus}), two topics under
3862 that, and one sub-topic under one of the sub-topics.  (There is always
3863 just one (1) top-level topic).  This topology can be expressed as
3864 follows:
3865
3866 @lisp
3867 (("Gnus" visible)
3868  (("Emacs -- I wuw it!" visible)
3869   (("Naughty Emacs" visible)))
3870  (("Misc" visible)))
3871 @end lisp
3872
3873 @vindex gnus-topic-topology
3874 This is in fact how the variable @code{gnus-topic-topology} would look
3875 for the display above.  That variable is saved in the @file{.newsrc.eld}
3876 file, and shouldn't be messed with manually---unless you really want
3877 to.  Since this variable is read from the @file{.newsrc.eld} file,
3878 setting it in any other startup files will have no effect.
3879
3880 This topology shows what topics are sub-topics of what topics (right),
3881 and which topics are visible.  Two settings are currently
3882 allowed---@code{visible} and @code{invisible}.
3883
3884
3885 @node Topic Parameters
3886 @subsection Topic Parameters
3887 @cindex topic parameters
3888
3889 All groups in a topic will inherit group parameters from the parent (and
3890 ancestor) topic parameters.  All valid group parameters are valid topic
3891 parameters (@pxref{Group Parameters}).
3892
3893 In addition, the following parameters are only valid as topic
3894 parameters:
3895
3896 @table @code
3897 @item subscribe
3898 When subscribing new groups by topic (@pxref{Subscription Methods}), the
3899 @code{subscribe} topic parameter says what groups go in what topic.  Its
3900 value should be a regexp to match the groups that should go in that
3901 topic.
3902
3903 @item subscribe-level
3904 When subscribing new groups by topic (see the @code{subscribe} parameter),
3905 the group will be subscribed with the level specified in the
3906 @code{subscribe-level} instead of @code{gnus-level-default-subscribed}.
3907
3908 @end table
3909
3910 Group parameters (of course) override topic parameters, and topic
3911 parameters in sub-topics override topic parameters in super-topics.  You
3912 know.  Normal inheritance rules.  (@dfn{Rules} is here a noun, not a
3913 verb, although you may feel free to disagree with me here.)
3914
3915 @example
3916 Gnus
3917   Emacs
3918      3: comp.emacs
3919      2: alt.religion.emacs
3920    452: alt.sex.emacs
3921     Relief
3922      452: alt.sex.emacs
3923        0: comp.talk.emacs.recovery
3924   Misc
3925      8: comp.binaries.fractals
3926     13: comp.sources.unix
3927    452: alt.sex.emacs
3928 @end example
3929
3930 The @samp{Emacs} topic has the topic parameter @code{(score-file
3931 . "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter
3932 @code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has the
3933 topic parameter @code{(score-file . "emacs.SCORE")}.  In addition,
3934 @* @samp{alt.religion.emacs} has the group parameter @code{(score-file
3935 . "religion.SCORE")}.
3936
3937 Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you
3938 will get the @file{relief.SCORE} home score file.  If you enter the same
3939 group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home
3940 score file.  If you enter the group @samp{alt.religion.emacs}, you'll
3941 get the @file{religion.SCORE} home score file.
3942
3943 This seems rather simple and self-evident, doesn't it?  Well, yes.  But
3944 there are some problems, especially with the @code{total-expiry}
3945 parameter.  Say you have a mail group in two topics; one with
3946 @code{total-expiry} and one without.  What happens when you do @kbd{M-x
3947 gnus-expire-all-expirable-groups}?  Gnus has no way of telling which one
3948 of these topics you mean to expire articles from, so anything may
3949 happen.  In fact, I hereby declare that it is @dfn{undefined} what
3950 happens.  You just have to be careful if you do stuff like that.
3951
3952
3953 @node Misc Group Stuff
3954 @section Misc Group Stuff
3955
3956 @menu
3957 * Scanning New Messages::       Asking Gnus to see whether new messages have arrived.
3958 * Group Information::           Information and help on groups and Gnus.
3959 * Group Timestamp::             Making Gnus keep track of when you last read a group.
3960 * File Commands::               Reading and writing the Gnus files.
3961 * Sieve Commands::              Managing Sieve scripts.
3962 @end menu
3963
3964 @table @kbd
3965
3966 @item ^
3967 @kindex ^ (Group)
3968 @findex gnus-group-enter-server-mode
3969 Enter the server buffer (@code{gnus-group-enter-server-mode}).
3970 @xref{Server Buffer}.
3971
3972 @item a
3973 @kindex a (Group)
3974 @findex gnus-group-post-news
3975 Start composing a message (a news by default)
3976 (@code{gnus-group-post-news}).  If given a prefix, post to the group
3977 under the point.  If the prefix is 1, prompt for a group to post to.
3978 Contrary to what the name of this function suggests, the prepared
3979 article might be a mail instead of a news, if a mail group is specified
3980 with the prefix argument.  @xref{Composing Messages}.
3981
3982 @item m
3983 @kindex m (Group)
3984 @findex gnus-group-mail
3985 Mail a message somewhere (@code{gnus-group-mail}).  If given a prefix,
3986 use the posting style of the group under the point.  If the prefix is 1,
3987 prompt for a group name to find the posting style.
3988 @xref{Composing Messages}.
3989
3990 @item i
3991 @kindex i (Group)
3992 @findex gnus-group-news
3993 Start composing a news (@code{gnus-group-news}).  If given a prefix,
3994 post to the group under the point.  If the prefix is 1, prompt
3995 for group to post to.  @xref{Composing Messages}.
3996
3997 This function actually prepares a news even when using mail groups.
3998 This is useful for "posting" messages to mail groups without actually
3999 sending them over the network: they're just saved directly to the group
4000 in question.  The corresponding back end must have a request-post method
4001 for this to work though.
4002
4003 @end table
4004
4005 Variables for the group buffer:
4006
4007 @table @code
4008
4009 @item gnus-group-mode-hook
4010 @vindex gnus-group-mode-hook
4011 is called after the group buffer has been
4012 created.
4013
4014 @item gnus-group-prepare-hook
4015 @vindex gnus-group-prepare-hook
4016 is called after the group buffer is
4017 generated.  It may be used to modify the buffer in some strange,
4018 unnatural way.
4019
4020 @item gnus-group-prepared-hook
4021 @vindex gnus-group-prepare-hook
4022 is called as the very last thing after the group buffer has been
4023 generated.  It may be used to move point around, for instance.
4024
4025 @item gnus-permanently-visible-groups
4026 @vindex gnus-permanently-visible-groups
4027 Groups matching this regexp will always be listed in the group buffer,
4028 whether they are empty or not.
4029
4030 @item gnus-group-name-charset-method-alist
4031 @vindex gnus-group-name-charset-method-alist
4032 An alist of method and the charset for group names. It is used to show
4033 non-ASCII group names.
4034
4035 For example:
4036 @lisp
4037 (setq gnus-group-name-charset-method-alist
4038     '(((nntp "news.com.cn") . cn-gb-2312)))
4039 @end lisp
4040
4041 @item gnus-group-name-charset-group-alist
4042 @cindex UTF-8 group names
4043 @vindex gnus-group-name-charset-group-alist
4044 An alist of regexp of group name and the charset for group names.  It
4045 is used to show non-ASCII group names.  @code{((".*" utf-8))} is the
4046 default value if UTF-8 is supported, otherwise the default is
4047 @code{nil}.
4048
4049 For example:
4050 @lisp
4051 (setq gnus-group-name-charset-group-alist
4052     '(("\\.com\\.cn:" . cn-gb-2312)))
4053 @end lisp
4054
4055 @end table
4056
4057 @node Scanning New Messages
4058 @subsection Scanning New Messages
4059 @cindex new messages
4060 @cindex scanning new news
4061
4062 @table @kbd
4063
4064 @item g
4065 @kindex g (Group)
4066 @findex gnus-group-get-new-news
4067 @c @icon{gnus-group-get-new-news}
4068 Check the server(s) for new articles.  If the numerical prefix is used,
4069 this command will check only groups of level @var{arg} and lower
4070 (@code{gnus-group-get-new-news}).  If given a non-numerical prefix, this
4071 command will force a total re-reading of the active file(s) from the
4072 back end(s).
4073
4074 @item M-g
4075 @kindex M-g (Group)
4076 @findex gnus-group-get-new-news-this-group
4077 @vindex gnus-goto-next-group-when-activating
4078 @c @icon{gnus-group-get-new-news-this-group}
4079 Check whether new articles have arrived in the current group
4080 (@code{gnus-group-get-new-news-this-group}).
4081 @code{gnus-goto-next-group-when-activating} says whether this command is
4082 to move point to the next group or not.  It is @code{t} by default.
4083
4084 @findex gnus-activate-all-groups
4085 @cindex activating groups
4086 @item C-c M-g
4087 @kindex C-c M-g (Group)
4088 Activate absolutely all groups (@code{gnus-activate-all-groups}).
4089
4090 @item R
4091 @kindex R (Group)
4092 @cindex restarting
4093 @findex gnus-group-restart
4094 Restart gnus (@code{gnus-group-restart}).  This saves the @file{.newsrc}
4095 file(s), closes the connection to all servers, clears up all run-time
4096 gnus variables, and then starts gnus all over again.
4097
4098 @end table
4099
4100 @vindex gnus-get-new-news-hook
4101 @code{gnus-get-new-news-hook} is run just before checking for new news.
4102
4103 @vindex gnus-after-getting-new-news-hook
4104 @code{gnus-after-getting-new-news-hook} is run after checking for new
4105 news.
4106
4107
4108 @node Group Information
4109 @subsection Group Information
4110 @cindex group information
4111 @cindex information on groups
4112
4113 @table @kbd
4114
4115
4116 @item H f
4117 @kindex H f (Group)
4118 @findex gnus-group-fetch-faq
4119 @vindex gnus-group-faq-directory
4120 @cindex FAQ
4121 @cindex ange-ftp
4122 Try to fetch the FAQ for the current group
4123 (@code{gnus-group-fetch-faq}).  Gnus will try to get the FAQ from
4124 @code{gnus-group-faq-directory}, which is usually a directory on a
4125 remote machine.  This variable can also be a list of directories.  In
4126 that case, giving a prefix to this command will allow you to choose
4127 between the various sites.  @code{ange-ftp} (or @code{efs}) will be used
4128 for fetching the file.
4129
4130 If fetching from the first site is unsuccessful, gnus will attempt to go
4131 through @code{gnus-group-faq-directory} and try to open them one by one.
4132
4133 @item H c
4134 @kindex H c (Group)
4135 @findex gnus-group-fetch-charter
4136 @vindex gnus-group-charter-alist
4137 @cindex charter
4138 Try to open the charter for the current group in a web browser
4139 (@code{gnus-group-fetch-charter}).  Query for a group if given a
4140 prefix argument.
4141
4142 Gnus will use @code{gnus-group-charter-alist} to find the location of
4143 the charter.  If no location is known, Gnus will fetch the control
4144 messages for the group, which in some cases includes the charter.
4145
4146 @item H C
4147 @kindex H C (Group)
4148 @findex gnus-group-fetch-control
4149 @vindex gnus-group-fetch-control-use-browse-url
4150 @cindex control message
4151 Fetch the control messages for the group from the archive at
4152 @code{ftp.isc.org} (@code{gnus-group-fetch-control}). Query for a
4153 group if given a prefix argument.
4154
4155 If @code{gnus-group-fetch-control-use-browse-url} is non-@code{nil},
4156 Gnus will open the control messages in a browser using
4157 @code{browse-url}.  Otherwise they are fetched using @code{ange-ftp}
4158 and displayed in an ephemeral group.
4159
4160 Note that the control messages are compressed.  To use this command
4161 you need to turn on @code{auto-compression-mode}
4162 (@pxref{(emacs)Compressed Files}).
4163
4164 @item H d
4165 @itemx C-c C-d
4166 @c @icon{gnus-group-describe-group}
4167 @kindex H d (Group)
4168 @kindex C-c C-d (Group)
4169 @cindex describing groups
4170 @cindex group description
4171 @findex gnus-group-describe-group
4172 Describe the current group (@code{gnus-group-describe-group}).  If given
4173 a prefix, force Gnus to re-read the description from the server.
4174
4175 @item M-d
4176 @kindex M-d (Group)
4177 @findex gnus-group-describe-all-groups
4178 Describe all groups (@code{gnus-group-describe-all-groups}).  If given a
4179 prefix, force gnus to re-read the description file from the server.
4180
4181 @item H v
4182 @itemx V
4183 @kindex V (Group)
4184 @kindex H v (Group)
4185 @cindex version
4186 @findex gnus-version
4187 Display current gnus version numbers (@code{gnus-version}).
4188
4189 @item ?
4190 @kindex ? (Group)
4191 @findex gnus-group-describe-briefly
4192 Give a very short help message (@code{gnus-group-describe-briefly}).
4193
4194 @item C-c C-i
4195 @kindex C-c C-i (Group)
4196 @cindex info
4197 @cindex manual
4198 @findex gnus-info-find-node
4199 Go to the gnus info node (@code{gnus-info-find-node}).
4200 @end table
4201
4202
4203 @node Group Timestamp
4204 @subsection Group Timestamp
4205 @cindex timestamps
4206 @cindex group timestamps
4207
4208 It can be convenient to let gnus keep track of when you last read a
4209 group.  To set the ball rolling, you should add
4210 @code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}:
4211
4212 @lisp
4213 (add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
4214 @end lisp
4215
4216 After doing this, each time you enter a group, it'll be recorded.
4217
4218 This information can be displayed in various ways---the easiest is to
4219 use the @samp{%d} spec in the group line format:
4220
4221 @lisp
4222 (setq gnus-group-line-format
4223       "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n")
4224 @end lisp
4225
4226 This will result in lines looking like:
4227
4228 @example
4229 *        0: mail.ding                                19961002T012943
4230          0: custom                                   19961002T012713
4231 @end example
4232
4233 As you can see, the date is displayed in compact ISO 8601 format.  This
4234 may be a bit too much, so to just display the date, you could say
4235 something like:
4236
4237 @lisp
4238 (setq gnus-group-line-format
4239       "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n")
4240 @end lisp
4241
4242 If you would like greater control of the time format, you can use a
4243 user-defined format spec.  Something like the following should do the
4244 trick:
4245
4246 @lisp
4247 (setq gnus-group-line-format
4248       "%M\%S\%p\%P\%5y: %(%-40,40g%) %ud\n")
4249 (defun gnus-user-format-function-d (headers)
4250   (let ((time (gnus-group-timestamp gnus-tmp-group)))
4251     (if time
4252         (format-time-string "%b %d  %H:%M" time)
4253       "")))
4254 @end lisp
4255
4256
4257 @node File Commands
4258 @subsection File Commands
4259 @cindex file commands
4260
4261 @table @kbd
4262
4263 @item r
4264 @kindex r (Group)
4265 @findex gnus-group-read-init-file
4266 @vindex gnus-init-file
4267 @cindex reading init file
4268 Re-read the init file (@code{gnus-init-file}, which defaults to
4269 @file{~/.gnus}) (@code{gnus-group-read-init-file}).
4270
4271 @item s
4272 @kindex s (Group)
4273 @findex gnus-group-save-newsrc
4274 @cindex saving .newsrc
4275 Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted)
4276 (@code{gnus-group-save-newsrc}).  If given a prefix, force saving the
4277 file(s) whether Gnus thinks it is necessary or not.
4278
4279 @c @item Z
4280 @c @kindex Z (Group)
4281 @c @findex gnus-group-clear-dribble
4282 @c Clear the dribble buffer (@code{gnus-group-clear-dribble}).
4283
4284 @end table
4285
4286
4287 @node Sieve Commands
4288 @subsection Sieve Commands
4289 @cindex group sieve commands
4290
4291 Sieve is a server-side mail filtering language.  In Gnus you can use
4292 the @code{sieve} group parameter (@pxref{Group Parameters}) to specify
4293 sieve rules that should apply to each group.  Gnus provides two
4294 commands to translate all these group parameters into a proper Sieve
4295 script that can be transfered to the server somehow.
4296
4297 @vindex gnus-sieve-file
4298 @vindex gnus-sieve-region-start
4299 @vindex gnus-sieve-region-end
4300 The generated Sieve script is placed in @code{gnus-sieve-file} (by
4301 default @file{~/.sieve}).  The Sieve code that Gnus generate is placed
4302 between two delimiters, @code{gnus-sieve-region-start} and
4303 @code{gnus-sieve-region-end}, so you may write additional Sieve code
4304 outside these delimiters that will not be removed the next time you
4305 regenerate the Sieve script.
4306
4307 @vindex gnus-sieve-crosspost
4308 The variable @code{gnus-sieve-crosspost} controls how the Sieve script
4309 is generated.  If it is non-@code{nil} (the default) articles is
4310 placed in all groups that have matching rules, otherwise the article
4311 is only placed in the group with the first matching rule.  For
4312 example, the group parameter @samp{(sieve address "sender"
4313 "owner-ding@@hpc.uh.edu")} will generate the following piece of Sieve
4314 code if @code{gnus-sieve-crosspost} is @code{nil}. (When
4315 @code{gnus-sieve-crosspost} is non-@code{nil}, it looks the same
4316 except that the line containing the call to @code{stop} is removed.)
4317
4318 @example
4319 if address "sender" "owner-ding@@hpc.uh.edu" @{
4320         fileinto "INBOX.ding";
4321         stop;
4322 @}
4323 @end example
4324
4325 @xref{Top, ,Top, sieve, Emacs Sieve}.
4326
4327 @table @kbd
4328
4329 @item D g
4330 @kindex D g (Group)
4331 @findex gnus-sieve-generate
4332 @vindex gnus-sieve-file
4333 @cindex generating sieve script
4334 Regenerate a Sieve script from the @code{sieve} group parameters and
4335 put you into the @code{gnus-sieve-file} without saving it.
4336
4337 @item D u
4338 @kindex D u (Group)
4339 @findex gnus-sieve-update
4340 @vindex gnus-sieve-file
4341 @cindex updating sieve script
4342 Regenerates the Gnus managed part of @code{gnus-sieve-file} using the
4343 @code{sieve} group parameters, save the file and upload it to the
4344 server using the @code{sieveshell} program.
4345
4346 @end table
4347
4348
4349 @node Summary Buffer
4350 @chapter Summary Buffer
4351 @cindex summary buffer
4352
4353 A line for each article is displayed in the summary buffer.  You can
4354 move around, read articles, post articles and reply to articles.
4355
4356 The most common way to a summary buffer is to select a group from the
4357 group buffer (@pxref{Selecting a Group}).
4358
4359 You can have as many summary buffers open as you wish.
4360
4361 @menu
4362 * Summary Buffer Format::       Deciding how the summary buffer is to look.
4363 * Summary Maneuvering::         Moving around the summary buffer.
4364 * Choosing Articles::           Reading articles.
4365 * Paging the Article::          Scrolling the current article.
4366 * Reply Followup and Post::     Posting articles.
4367 * Delayed Articles::            Send articles at a later time.
4368 * Marking Articles::            Marking articles as read, expirable, etc.
4369 * Limiting::                    You can limit the summary buffer.
4370 * Threading::                   How threads are made.
4371 * Sorting the Summary Buffer::  How articles and threads are sorted.
4372 * Asynchronous Fetching::       Gnus might be able to pre-fetch articles.
4373 * Article Caching::             You may store articles in a cache.
4374 * Persistent Articles::         Making articles expiry-resistant.
4375 * Article Backlog::             Having already read articles hang around.
4376 * Saving Articles::             Ways of customizing article saving.
4377 * Decoding Articles::           Gnus can treat series of (uu)encoded articles.
4378 * Article Treatment::           The article buffer can be mangled at will.
4379 * MIME Commands::               Doing MIMEy things with the articles.
4380 * Charsets::                    Character set issues.
4381 * Article Commands::            Doing various things with the article buffer.
4382 * Summary Sorting::             Sorting the summary buffer in various ways.
4383 * Finding the Parent::          No child support? Get the parent.
4384 * Alternative Approaches::      Reading using non-default summaries.
4385 * Tree Display::                A more visual display of threads.
4386 * Mail Group Commands::         Some commands can only be used in mail groups.
4387 * Various Summary Stuff::       What didn't fit anywhere else.
4388 * Exiting the Summary Buffer::  Returning to the Group buffer,
4389                                 or reselecting the current group.
4390 * Crosspost Handling::          How crossposted articles are dealt with.
4391 * Duplicate Suppression::       An alternative when crosspost handling fails.
4392 * Security::                    Decrypt and Verify.
4393 * Mailing List::                Mailing list minor mode.
4394 @end menu
4395
4396
4397 @node Summary Buffer Format
4398 @section Summary Buffer Format
4399 @cindex summary buffer format
4400
4401 @iftex
4402 @iflatex
4403 \gnusfigure{The Summary Buffer}{180}{
4404 \put(0,0){\epsfig{figure=ps/summary,width=7.5cm}}
4405 \put(445,0){\makebox(0,0)[br]{\epsfig{figure=ps/summary-article,width=7.5cm}}}
4406 }
4407 @end iflatex
4408 @end iftex
4409
4410 @menu
4411 * Summary Buffer Lines::        You can specify how summary lines should look.
4412 * To From Newsgroups::          How to not display your own name.
4413 * Summary Buffer Mode Line::    You can say how the mode line should look.
4414 * Summary Highlighting::        Making the summary buffer all pretty and nice.
4415 @end menu
4416
4417 @findex mail-extract-address-components
4418 @findex gnus-extract-address-components
4419 @vindex gnus-extract-address-components
4420 Gnus will use the value of the @code{gnus-extract-address-components}
4421 variable as a function for getting the name and address parts of a
4422 @code{From} header.  Three pre-defined functions exist:
4423 @code{gnus-extract-address-components}, which is the default, quite
4424 fast, and too simplistic solution;
4425 @code{mail-extract-address-components}, which works nicely, but is
4426 slower; and @code{std11-extract-address-components}, which works very
4427 nicely, but is slower.  The default function will return the wrong
4428 answer in 5% of the cases.  If this is unacceptable to you, use the
4429 other function instead:
4430
4431 @lisp
4432 (setq gnus-extract-address-components
4433       'mail-extract-address-components)
4434 @end lisp
4435
4436 @vindex gnus-summary-same-subject
4437 @code{gnus-summary-same-subject} is a string indicating that the current
4438 article has the same subject as the previous.  This string will be used
4439 with those specs that require it.  The default is @code{""}.
4440
4441
4442 @node Summary Buffer Lines
4443 @subsection Summary Buffer Lines
4444
4445 @vindex gnus-summary-line-format
4446 You can change the format of the lines in the summary buffer by changing
4447 the @code{gnus-summary-line-format} variable.  It works along the same
4448 lines as a normal @code{format} string, with some extensions
4449 (@pxref{Formatting Variables}).
4450
4451 There should always be a colon or a point position marker on the line;
4452 the cursor always moves to the point position marker or the colon after
4453 performing an operation.  (Of course, Gnus wouldn't be Gnus if it wasn't
4454 possible to change this.  Just write a new function
4455 @code{gnus-goto-colon} which does whatever you like with the cursor.)
4456 @xref{Positioning Point}.
4457
4458 The default string is @samp{%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n}.
4459
4460 The following format specification characters and extended format
4461 specification(s) are understood:
4462
4463 @table @samp
4464 @item N
4465 Article number.
4466 @item S
4467 Subject string.  List identifiers stripped,
4468 @code{gnus-list-identifies}.  @xref{Article Hiding}.
4469 @item s
4470 Subject if the article is the root of the thread or the previous article
4471 had a different subject, @code{gnus-summary-same-subject} otherwise.
4472 (@code{gnus-summary-same-subject} defaults to @code{""}.)
4473 @item F
4474 Full @code{From} header.
4475 @item n
4476 The name (from the @code{From} header).
4477 @item f
4478 The name, @code{To} header or the @code{Newsgroups} header (@pxref{To
4479 From Newsgroups}).
4480 @item a
4481 The name (from the @code{From} header).  This differs from the @code{n}
4482 spec in that it uses the function designated by the
4483 @code{gnus-extract-address-components} variable, which is slower, but
4484 may be more thorough.
4485 @item A
4486 The address (from the @code{From} header).  This works the same way as
4487 the @code{a} spec.
4488 @item L
4489 Number of lines in the article.
4490 @item c
4491 Number of characters in the article. This specifier is not supported
4492 in some methods (like nnfolder).
4493 @item k
4494 Pretty-printed version of the number of characters in the article;
4495 for example, @samp{1.2k} or @samp{0.4M}.
4496 @item I
4497 Indentation based on thread level (@pxref{Customizing Threading}).
4498 @item B
4499 A complex trn-style thread tree, showing response-connecting trace
4500 lines.  A thread could be drawn like this:
4501
4502 @example
4503 >
4504 +->
4505 | +->
4506 | | \->
4507 | |   \->
4508 | \->
4509 +->
4510 \->
4511 @end example
4512
4513 You can customize the appearance with the following options.  Note
4514 that it is possible to make the thread display look really neat by
4515 replacing the default ASCII characters with graphic line-drawing
4516 glyphs.
4517 @table @code
4518 @item gnus-sum-thread-tree-root
4519 @vindex gnus-sum-thread-tree-root
4520 Used for the root of a thread.  If @code{nil}, use subject
4521 instead. The default is @samp{> }.
4522
4523 @item gnus-sum-thread-tree-single-indent
4524 @vindex gnus-sum-thread-tree-single-indent
4525 Used for a thread with just one message.  If @code{nil}, use subject
4526 instead.  The default is @samp{}.
4527
4528 @item gnus-sum-thread-tree-vertical
4529 @vindex gnus-sum-thread-tree-vertical
4530 Used for drawing a vertical line.  The default is @samp{| }.
4531
4532 @item gnus-sum-thread-tree-indent
4533 @vindex gnus-sum-thread-tree-indent
4534 Used for indenting.  The default is @samp{  }. 
4535
4536 @item gnus-sum-thread-tree-leaf-with-other
4537 @vindex gnus-sum-thread-tree-leaf-with-other
4538 Used for a leaf with brothers.  The default is @samp{+-> }.
4539
4540 @item gnus-sum-thread-tree-single-leaf
4541 @vindex gnus-sum-thread-tree-single-leaf
4542 Used for a leaf without brothers.  The default is @samp{\-> }
4543
4544 @end table
4545
4546 @item T
4547 Nothing if the article is a root and lots of spaces if it isn't (it
4548 pushes everything after it off the screen).
4549 @item [
4550 Opening bracket, which is normally @samp{[}, but can also be @samp{<}
4551 for adopted articles (@pxref{Customizing Threading}).
4552 @item ]
4553 Closing bracket, which is normally @samp{]}, but can also be @samp{>}
4554 for adopted articles.
4555 @item >
4556 One space for each thread level.
4557 @item <
4558 Twenty minus thread level spaces.
4559 @item U
4560 Unread. @xref{Read Articles}.
4561
4562 @item R
4563 This misleadingly named specifier is the @dfn{secondary mark}.  This
4564 mark will say whether the article has been replied to, has been cached,
4565 or has been saved.  @xref{Other Marks}.
4566
4567 @item i
4568 Score as a number (@pxref{Scoring}).
4569 @item z
4570 @vindex gnus-summary-zcore-fuzz
4571 Zcore, @samp{+} if above the default level and @samp{-} if below the
4572 default level.  If the difference between
4573 @code{gnus-summary-default-score} and the score is less than
4574 @code{gnus-summary-zcore-fuzz}, this spec will not be used.
4575 @item V
4576 Total thread score.
4577 @item x
4578 @code{Xref}.
4579 @item D
4580 @code{Date}.
4581 @item d
4582 The @code{Date} in @code{DD-MMM} format.
4583 @item o
4584 The @code{Date} in @var{YYYYMMDD}@code{T}@var{HHMMSS} format.
4585 @item M
4586 @code{Message-ID}.
4587 @item r
4588 @code{References}.
4589 @item t
4590 Number of articles in the current sub-thread.  Using this spec will slow
4591 down summary buffer generation somewhat.
4592 @item e
4593 An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the
4594 article has any children.
4595 @item P
4596 The line number.
4597 @item O
4598 Download mark.
4599 @item &user-date;
4600 Age sensitive date format.  Various date format is defined in
4601 @code{gnus-user-date-format-alist}.
4602 @item u
4603 User defined specifier.  The next character in the format string should
4604 be a letter.  Gnus will call the function
4605 @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
4606 following @samp{%u}.  The function will be passed the current header as
4607 argument.  The function should return a string, which will be inserted
4608 into the summary just like information from any other summary specifier.
4609 @end table
4610
4611 Text between @samp{%(} and @samp{%)} will be highlighted with
4612 @code{gnus-mouse-face} when the mouse point is placed inside the area.
4613 There can only be one such area.
4614
4615 The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs
4616 have to be handled with care.  For reasons of efficiency, gnus will
4617 compute what column these characters will end up in, and ``hard-code''
4618 that.  This means that it is invalid to have these specs after a
4619 variable-length spec.  Well, you might not be arrested, but your summary
4620 buffer will look strange, which is bad enough.
4621
4622 The smart choice is to have these specs as far to the left as possible.
4623 (Isn't that the case with everything, though?  But I digress.)
4624
4625 This restriction may disappear in later versions of gnus.
4626
4627
4628 @node To From Newsgroups
4629 @subsection To From Newsgroups
4630 @cindex To
4631 @cindex Newsgroups
4632
4633 In some groups (particularly in archive groups), the @code{From} header
4634 isn't very interesting, since all the articles there are written by
4635 you.  To display the information in the @code{To} or @code{Newsgroups}
4636 headers instead, you need to decide three things: What information to
4637 gather; where to display it; and when to display it.
4638
4639 @enumerate
4640 @item
4641 @vindex gnus-extra-headers
4642 The reading of extra header information is controlled by the
4643 @code{gnus-extra-headers}.  This is a list of header symbols.  For
4644 instance:
4645
4646 @lisp
4647 (setq gnus-extra-headers
4648       '(To Newsgroups X-Newsreader))
4649 @end lisp
4650
4651 This will result in Gnus trying to obtain these three headers, and
4652 storing it in header structures for later easy retrieval.
4653
4654 @item
4655 @findex gnus-extra-header
4656 The value of these extra headers can be accessed via the
4657 @code{gnus-extra-header} function.  Here's a format line spec that will
4658 access the @code{X-Newsreader} header:
4659
4660 @example
4661 "%~(form (gnus-extra-header 'X-Newsreader))@@"
4662 @end example
4663
4664 @item
4665 @vindex gnus-ignored-from-addresses
4666 The @code{gnus-ignored-from-addresses} variable says when the @samp{%f}
4667 summary line spec returns the @code{To}, @code{Newsreader} or
4668 @code{From} header.  If this regexp matches the contents of the
4669 @code{From} header, the value of the @code{To} or @code{Newsreader}
4670 headers are used instead.
4671
4672 @end enumerate
4673
4674 @vindex nnmail-extra-headers
4675 A related variable is @code{nnmail-extra-headers}, which controls when
4676 to include extra headers when generating overview (@sc{nov}) files.  If
4677 you have old overview files, you should regenerate them after changing
4678 this variable, by entering the server buffer using `^', and then `g' on
4679 the appropriate mail server (e.g. nnml) to cause regeneration.
4680
4681 @vindex gnus-summary-line-format
4682 You also have to instruct Gnus to display the data by changing the
4683 @code{%n} spec to the @code{%f} spec in the
4684 @code{gnus-summary-line-format} variable.
4685
4686 In summary, you'd typically put something like the following in
4687 @file{~/.gnus}:
4688
4689 @lisp
4690 (setq gnus-extra-headers
4691       '(To Newsgroups))
4692 (setq nnmail-extra-headers gnus-extra-headers)
4693 (setq gnus-summary-line-format
4694       "%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n")
4695 (setq gnus-ignored-from-addresses
4696       "Your Name Here")
4697 @end lisp
4698
4699 (The values listed above are the default values in Gnus.  Alter them
4700 to fit your needs.)
4701
4702 A note for news server administrators, or for users who wish to try to
4703 convince their news server administrator to provide some additional
4704 support:
4705
4706 The above is mostly useful for mail groups, where you have control over
4707 the @sc{nov} files that are created.  However, if you can persuade your
4708 nntp admin to add (in the usual implementation, notably INN):
4709
4710 @example
4711 Newsgroups:full
4712 @end example
4713
4714 to the end of her @file{overview.fmt} file, then you can use that just
4715 as you would the extra headers from the mail groups.
4716
4717
4718 @node Summary Buffer Mode Line
4719 @subsection Summary Buffer Mode Line
4720
4721 @vindex gnus-summary-mode-line-format
4722 You can also change the format of the summary mode bar (@pxref{Mode Line
4723 Formatting}).  Set @code{gnus-summary-mode-line-format} to whatever you
4724 like.  The default is @samp{Gnus: %%b [%A] %Z}.
4725
4726 Here are the elements you can play with:
4727
4728 @table @samp
4729 @item G
4730 Group name.
4731 @item p
4732 Unprefixed group name.
4733 @item A
4734 Current article number.
4735 @item z
4736 Current article score.
4737 @item V
4738 Gnus version.
4739 @item U
4740 Number of unread articles in this group.
4741 @item e
4742 Number of unread articles in this group that aren't displayed in the
4743 summary buffer.
4744 @item Z
4745 A string with the number of unread and unselected articles represented
4746 either as @samp{<%U(+%e) more>} if there are both unread and unselected
4747 articles, and just as @samp{<%U more>} if there are just unread articles
4748 and no unselected ones.
4749 @item g
4750 Shortish group name.  For instance, @samp{rec.arts.anime} will be
4751 shortened to @samp{r.a.anime}.
4752 @item S
4753 Subject of the current article.
4754 @item u
4755 User-defined spec (@pxref{User-Defined Specs}).
4756 @item s
4757 Name of the current score file (@pxref{Scoring}).
4758 @item d
4759 Number of dormant articles (@pxref{Unread Articles}).
4760 @item t
4761 Number of ticked articles (@pxref{Unread Articles}).
4762 @item r
4763 Number of articles that have been marked as read in this session.
4764 @item E
4765 Number of articles expunged by the score files.
4766 @end table
4767
4768
4769 @node Summary Highlighting
4770 @subsection Summary Highlighting
4771
4772 @table @code
4773
4774 @item gnus-visual-mark-article-hook
4775 @vindex gnus-visual-mark-article-hook
4776 This hook is run after selecting an article.  It is meant to be used for
4777 highlighting the article in some way.  It is not run if
4778 @code{gnus-visual} is @code{nil}.
4779
4780 @item gnus-summary-update-hook
4781 @vindex gnus-summary-update-hook
4782 This hook is called when a summary line is changed.  It is not run if
4783 @code{gnus-visual} is @code{nil}.
4784
4785 @item gnus-summary-selected-face
4786 @vindex gnus-summary-selected-face
4787 This is the face (or @dfn{font} as some people call it) used to
4788 highlight the current article in the summary buffer.
4789
4790 @item gnus-summary-highlight
4791 @vindex gnus-summary-highlight
4792 Summary lines are highlighted according to this variable, which is a
4793 list where the elements are of the format @code{(@var{form}
4794 . @var{face})}.  If you would, for instance, like ticked articles to be
4795 italic and high-scored articles to be bold, you could set this variable
4796 to something like
4797 @lisp
4798 (((eq mark gnus-ticked-mark) . italic)
4799  ((> score default) . bold))
4800 @end lisp
4801 As you may have guessed, if @var{form} returns a non-@code{nil} value,
4802 @var{face} will be applied to the line.
4803 @end table
4804
4805
4806 @node Summary Maneuvering
4807 @section Summary Maneuvering
4808 @cindex summary movement
4809
4810 All the straight movement commands understand the numeric prefix and
4811 behave pretty much as you'd expect.
4812
4813 None of these commands select articles.
4814
4815 @table @kbd
4816 @item G M-n
4817 @itemx M-n
4818 @kindex M-n (Summary)
4819 @kindex G M-n (Summary)
4820 @findex gnus-summary-next-unread-subject
4821 Go to the next summary line of an unread article
4822 (@code{gnus-summary-next-unread-subject}).
4823
4824 @item G M-p
4825 @itemx M-p
4826 @kindex M-p (Summary)
4827 @kindex G M-p (Summary)
4828 @findex gnus-summary-prev-unread-subject
4829 Go to the previous summary line of an unread article
4830 (@code{gnus-summary-prev-unread-subject}).
4831
4832 @item G g
4833 @kindex G g (Summary)
4834 @findex gnus-summary-goto-subject
4835 Ask for an article number and then go to the summary line of that article
4836 without displaying the article (@code{gnus-summary-goto-subject}).
4837 @end table
4838
4839 If gnus asks you to press a key to confirm going to the next group, you
4840 can use the @kbd{C-n} and @kbd{C-p} keys to move around the group
4841 buffer, searching for the next group to read without actually returning
4842 to the group buffer.
4843
4844 Variables related to summary movement:
4845
4846 @table @code
4847
4848 @vindex gnus-auto-select-next
4849 @item gnus-auto-select-next
4850 If you issue one of the movement commands (like @kbd{n}) and there are
4851 no more unread articles after the current one, gnus will offer to go to
4852 the next group.  If this variable is @code{t} and the next group is
4853 empty, gnus will exit summary mode and return to the group buffer.  If
4854 this variable is neither @code{t} nor @code{nil}, gnus will select the
4855 next group with unread articles.  As a special case, if this variable
4856 is @code{quietly}, Gnus will select the next group without asking for
4857 confirmation.  If this variable is @code{almost-quietly}, the same
4858 will happen only if you are located on the last article in the group.
4859 Finally, if this variable is @code{slightly-quietly}, the @kbd{Z n}
4860 command will go to the next group without confirmation.  Also
4861 @pxref{Group Levels}.
4862
4863 @item gnus-auto-select-same
4864 @vindex gnus-auto-select-same
4865 If non-@code{nil}, all the movement commands will try to go to the next
4866 article with the same subject as the current.  (@dfn{Same} here might
4867 mean @dfn{roughly equal}.  See @code{gnus-summary-gather-subject-limit}
4868 for details (@pxref{Customizing Threading}).)  If there are no more
4869 articles with the same subject, go to the first unread article.
4870
4871 This variable is not particularly useful if you use a threaded display.
4872
4873 @item gnus-summary-check-current
4874 @vindex gnus-summary-check-current
4875 If non-@code{nil}, all the ``unread'' movement commands will not proceed
4876 to the next (or previous) article if the current article is unread.
4877 Instead, they will choose the current article.
4878
4879 @item gnus-auto-center-summary
4880 @vindex gnus-auto-center-summary
4881 If non-@code{nil}, gnus will keep the point in the summary buffer
4882 centered at all times.  This makes things quite tidy, but if you have a
4883 slow network connection, or simply do not like this un-Emacsism, you can
4884 set this variable to @code{nil} to get the normal Emacs scrolling
4885 action.  This will also inhibit horizontal re-centering of the summary
4886 buffer, which might make it more inconvenient to read extremely long
4887 threads.
4888
4889 This variable can also be a number.  In that case, center the window at
4890 the given number of lines from the top.
4891
4892 @end table
4893
4894
4895 @node Choosing Articles
4896 @section Choosing Articles
4897 @cindex selecting articles
4898
4899 @menu
4900 * Choosing Commands::           Commands for choosing articles.
4901 * Choosing Variables::          Variables that influence these commands.
4902 @end menu
4903
4904
4905 @node Choosing Commands
4906 @subsection Choosing Commands
4907
4908 None of the following movement commands understand the numeric prefix,
4909 and they all select and display an article.
4910
4911 If you want to fetch new articles or redisplay the group, see
4912 @ref{Exiting the Summary Buffer}.
4913
4914 @table @kbd
4915 @item SPACE
4916 @kindex SPACE (Summary)
4917 @findex gnus-summary-next-page
4918 Select the current article, or, if that one's read already, the next
4919 unread article (@code{gnus-summary-next-page}).
4920
4921 If you have an article window open already and you press @kbd{SPACE}
4922 again, the article will be scrolled.  This lets you conveniently
4923 @kbd{SPACE} through an entire newsgroup.  @pxref{Paging the Article}.
4924
4925 @item G n
4926 @itemx n
4927 @kindex n (Summary)
4928 @kindex G n (Summary)
4929 @findex gnus-summary-next-unread-article
4930 @c @icon{gnus-summary-next-unread}
4931 Go to next unread article (@code{gnus-summary-next-unread-article}).
4932
4933 @item G p
4934 @itemx p
4935 @kindex p (Summary)
4936 @findex gnus-summary-prev-unread-article
4937 @c @icon{gnus-summary-prev-unread}
4938 Go to previous unread article (@code{gnus-summary-prev-unread-article}).
4939
4940 @item G N
4941 @itemx N
4942 @kindex N (Summary)
4943 @kindex G N (Summary)
4944 @findex gnus-summary-next-article
4945 Go to the next article (@code{gnus-summary-next-article}).
4946
4947 @item G P
4948 @itemx P
4949 @kindex P (Summary)
4950 @kindex G P (Summary)
4951 @findex gnus-summary-prev-article
4952 Go to the previous article (@code{gnus-summary-prev-article}).
4953
4954 @item G C-n
4955 @kindex G C-n (Summary)
4956 @findex gnus-summary-next-same-subject
4957 Go to the next article with the same subject
4958 (@code{gnus-summary-next-same-subject}).
4959
4960 @item G C-p
4961 @kindex G C-p (Summary)
4962 @findex gnus-summary-prev-same-subject
4963 Go to the previous article with the same subject
4964 (@code{gnus-summary-prev-same-subject}).
4965
4966 @item G f
4967 @itemx .
4968 @kindex G f  (Summary)
4969 @kindex .  (Summary)
4970 @findex gnus-summary-first-unread-article
4971 Go to the first unread article
4972 (@code{gnus-summary-first-unread-article}).
4973
4974 @item G b
4975 @itemx ,
4976 @kindex G b (Summary)
4977 @kindex , (Summary)
4978 @findex gnus-summary-best-unread-article
4979 Go to the unread article with the highest score
4980 (@code{gnus-summary-best-unread-article}).  If given a prefix argument,
4981 go to the first unread article that has a score over the default score.
4982
4983 @item G l
4984 @itemx l
4985 @kindex l (Summary)
4986 @kindex G l (Summary)
4987 @findex gnus-summary-goto-last-article
4988 Go to the previous article read (@code{gnus-summary-goto-last-article}).
4989
4990 @item G o
4991 @kindex G o (Summary)
4992 @findex gnus-summary-pop-article
4993 @cindex history
4994 @cindex article history
4995 Pop an article off the summary history and go to this article
4996 (@code{gnus-summary-pop-article}).  This command differs from the
4997 command above in that you can pop as many previous articles off the
4998 history as you like, while @kbd{l} toggles the two last read articles.
4999 For a somewhat related issue (if you use these commands a lot),
5000 @pxref{Article Backlog}.
5001
5002 @item G j
5003 @itemx j
5004 @kindex j (Summary)
5005 @kindex G j (Summary)
5006 @findex gnus-summary-goto-article
5007 Ask for an article number or @code{Message-ID}, and then go to that
5008 article (@code{gnus-summary-goto-article}).
5009
5010 @end table
5011
5012
5013 @node Choosing Variables
5014 @subsection Choosing Variables
5015
5016 Some variables relevant for moving and selecting articles:
5017
5018 @table @code
5019 @item gnus-auto-extend-newsgroup
5020 @vindex gnus-auto-extend-newsgroup
5021 All the movement commands will try to go to the previous (or next)
5022 article, even if that article isn't displayed in the Summary buffer if
5023 this variable is non-@code{nil}.  Gnus will then fetch the article from
5024 the server and display it in the article buffer.
5025
5026 @item gnus-select-article-hook
5027 @vindex gnus-select-article-hook
5028 This hook is called whenever an article is selected.  By default it
5029 exposes any threads hidden under the selected article.  If you would 
5030 like each article to be saved in the Agent as you read it, putting
5031 @code{gnus-agent-fetch-selected-article} on this hook will do so.
5032
5033 @item gnus-mark-article-hook
5034 @vindex gnus-mark-article-hook
5035 @findex gnus-summary-mark-unread-as-read
5036 @findex gnus-summary-mark-read-and-unread-as-read
5037 @findex gnus-unread-mark
5038 This hook is called whenever an article is selected.  It is intended to
5039 be used for marking articles as read.  The default value is
5040 @code{gnus-summary-mark-read-and-unread-as-read}, and will change the
5041 mark of almost any article you read to @code{gnus-unread-mark}.  The
5042 only articles not affected by this function are ticked, dormant, and
5043 expirable articles.  If you'd instead like to just have unread articles
5044 marked as read, you can use @code{gnus-summary-mark-unread-as-read}
5045 instead.  It will leave marks like @code{gnus-low-score-mark},
5046 @code{gnus-del-mark} (and so on) alone.
5047
5048 @end table
5049
5050
5051 @node Paging the Article
5052 @section Scrolling the Article
5053 @cindex article scrolling
5054
5055 @table @kbd
5056
5057 @item SPACE
5058 @kindex SPACE (Summary)
5059 @findex gnus-summary-next-page
5060 Pressing @kbd{SPACE} will scroll the current article forward one page,
5061 or, if you have come to the end of the current article, will choose the
5062 next article (@code{gnus-summary-next-page}).
5063
5064 @vindex gnus-article-boring-faces
5065 If the rest of the article consists only of citations and signature,
5066 then it will be skipped; the next article will be shown instead.  You
5067 can customize what is considered uninteresting with
5068 @code{gnus-article-boring-faces}, or set it to @code{nil} to disable
5069 this feature.  You can manually view the article's pages, no matter how
5070 boring, using @kbd{C-v} in the article buffer.
5071
5072 @item DEL
5073 @kindex DEL (Summary)
5074 @findex gnus-summary-prev-page
5075 Scroll the current article back one page (@code{gnus-summary-prev-page}).
5076
5077 @item RET
5078 @kindex RET (Summary)
5079 @findex gnus-summary-scroll-up
5080 Scroll the current article one line forward
5081 (@code{gnus-summary-scroll-up}).
5082
5083 @item M-RET
5084 @kindex M-RET (Summary)
5085 @findex gnus-summary-scroll-down
5086 Scroll the current article one line backward
5087 (@code{gnus-summary-scroll-down}).
5088
5089 @item A g
5090 @itemx g
5091 @kindex A g (Summary)
5092 @kindex g (Summary)
5093 @findex gnus-summary-show-article
5094 @vindex gnus-summary-show-article-charset-alist
5095 (Re)fetch the current article (@code{gnus-summary-show-article}).  If
5096 given a prefix, fetch the current article, but don't run any of the
5097 article treatment functions.  This will give you a ``raw'' article, just
5098 the way it came from the server.
5099
5100 If given a numerical prefix, you can do semi-manual charset stuff.
5101 @kbd{C-u 0 g cn-gb-2312 RET} will decode the message as if it were
5102 encoded in the @code{cn-gb-2312} charset.  If you have
5103
5104 @lisp
5105 (setq gnus-summary-show-article-charset-alist
5106       '((1 . cn-gb-2312)
5107         (2 . big5)))
5108 @end lisp
5109
5110 then you can say @kbd{C-u 1 g} to get the same effect.
5111
5112 @item A <
5113 @itemx <
5114 @kindex < (Summary)
5115 @kindex A < (Summary)
5116 @findex gnus-summary-beginning-of-article
5117 Scroll to the beginning of the article
5118 (@code{gnus-summary-beginning-of-article}).
5119
5120 @item A >
5121 @itemx >
5122 @kindex > (Summary)
5123 @kindex A > (Summary)
5124 @findex gnus-summary-end-of-article
5125 Scroll to the end of the article (@code{gnus-summary-end-of-article}).
5126
5127 @item A s
5128 @itemx s
5129 @kindex A s (Summary)
5130 @kindex s (Summary)
5131 @findex gnus-summary-isearch-article
5132 Perform an isearch in the article buffer
5133 (@code{gnus-summary-isearch-article}).
5134
5135 @item h
5136 @kindex h (Summary)
5137 @findex gnus-summary-select-article-buffer
5138 Select the article buffer (@code{gnus-summary-select-article-buffer}).
5139
5140 @end table
5141
5142
5143 @node Reply Followup and Post
5144 @section Reply, Followup and Post
5145
5146 @menu
5147 * Summary Mail Commands::       Sending mail.
5148 * Summary Post Commands::       Sending news.
5149 * Summary Message Commands::    Other Message-related commands.
5150 * Canceling and Superseding::   
5151 @end menu
5152
5153
5154 @node Summary Mail Commands
5155 @subsection Summary Mail Commands
5156 @cindex mail
5157 @cindex composing mail
5158
5159 Commands for composing a mail message:
5160
5161 @table @kbd
5162
5163 @item S r
5164 @itemx r
5165 @kindex S r (Summary)
5166 @kindex r (Summary)
5167 @findex gnus-summary-reply
5168 @c @icon{gnus-summary-mail-reply}
5169 @c @icon{gnus-summary-reply}
5170 Mail a reply to the author of the current article
5171 (@code{gnus-summary-reply}).
5172
5173 @item S R
5174 @itemx R
5175 @kindex R (Summary)
5176 @kindex S R (Summary)
5177 @findex gnus-summary-reply-with-original
5178 @c @icon{gnus-summary-reply-with-original}
5179 Mail a reply to the author of the current article and include the
5180 original message (@code{gnus-summary-reply-with-original}).  This
5181 command uses the process/prefix convention.
5182
5183 @item S w
5184 @kindex S w (Summary)
5185 @findex gnus-summary-wide-reply
5186 Mail a wide reply to the author of the current article
5187 (@code{gnus-summary-wide-reply}).  A @dfn{wide reply} is a reply that
5188 goes out to all people listed in the @code{To}, @code{From} (or
5189 @code{Reply-to}) and @code{Cc} headers.
5190
5191 @item S W
5192 @kindex S W (Summary)
5193 @findex gnus-summary-wide-reply-with-original
5194 Mail a wide reply to the current article and include the original
5195 message (@code{gnus-summary-wide-reply-with-original}).  This command uses
5196 the process/prefix convention.
5197
5198 @item S v
5199 @kindex S v (Summary)
5200 @findex gnus-summary-very-wide-reply
5201 Mail a very wide reply to the author of the current article
5202 (@code{gnus-summary-wide-reply}).  A @dfn{very wide reply} is a reply
5203 that goes out to all people listed in the @code{To}, @code{From} (or
5204 @code{Reply-to}) and @code{Cc} headers in all the process/prefixed
5205 articles.  This command uses the process/prefix convention.
5206
5207 @item S V
5208 @kindex S V (Summary)
5209 @findex gnus-summary-very-wide-reply-with-original
5210 Mail a very wide reply to the author of the current article and include the
5211 original message (@code{gnus-summary-very-wide-reply-with-original}).  This
5212 command uses the process/prefix convention.
5213
5214 @item S B r
5215 @kindex S B r (Summary)
5216 @findex gnus-summary-reply-broken-reply-to
5217 Mail a reply to the author of the current article but ignore the
5218 @code{Reply-To} field (@code{gnus-summary-reply-broken-reply-to}).
5219
5220 @item S B R
5221 @kindex S B R (Summary)
5222 @findex gnus-summary-reply-broken-reply-to-with-original
5223 Mail a reply to the author of the current article and include the
5224 original message but ignore the @code{Reply-To} field
5225 (@code{gnus-summary-reply-broken-reply-to-with-original}).
5226
5227 @item S o m
5228 @itemx C-c C-f
5229 @kindex S o m (Summary)
5230 @kindex C-c C-f (Summary)
5231 @findex gnus-summary-mail-forward
5232 @c @icon{gnus-summary-mail-forward}
5233 Forward the current article to some other person
5234 (@code{gnus-summary-mail-forward}).  If given a prefix, include the full
5235 headers of the forwarded article.
5236
5237 @item S m
5238 @itemx m
5239 @kindex m (Summary)
5240 @kindex S m (Summary)
5241 @findex gnus-summary-mail-other-window
5242 @c @icon{gnus-summary-mail-originate}
5243 Prepare a mail (@code{gnus-summary-mail-other-window}).  By default, use
5244 the posting style of the current group.  If given a prefix, disable that.
5245 If the prefix is 1, prompt for a group name to find the posting style.
5246
5247 @item S i
5248 @itemx i
5249 @kindex i (Summary)
5250 @kindex S i (Summary)
5251 @findex gnus-summary-news-other-window
5252 Prepare a news (@code{gnus-summary-news-other-window}).  By default,
5253 post to the current group.  If given a prefix, disable that.  If the
5254 prefix is 1, prompt for a group to post to.
5255
5256 This function actually prepares a news even when using mail groups.
5257 This is useful for "posting" messages to mail groups without actually
5258 sending them over the network: they're just saved directly to the group
5259 in question.  The corresponding back end must have a request-post method
5260 for this to work though.
5261
5262 @item S D b
5263 @kindex S D b (Summary)
5264 @findex gnus-summary-resend-bounced-mail
5265 @cindex bouncing mail
5266 If you have sent a mail, but the mail was bounced back to you for some
5267 reason (wrong address, transient failure), you can use this command to
5268 resend that bounced mail (@code{gnus-summary-resend-bounced-mail}).  You
5269 will be popped into a mail buffer where you can edit the headers before
5270 sending the mail off again.  If you give a prefix to this command, and
5271 the bounced mail is a reply to some other mail, gnus will try to fetch
5272 that mail and display it for easy perusal of its headers.  This might
5273 very well fail, though.
5274
5275 @item S D r
5276 @kindex S D r (Summary)
5277 @findex gnus-summary-resend-message
5278 Not to be confused with the previous command,
5279 @code{gnus-summary-resend-message} will prompt you for an address to
5280 send the current message off to, and then send it to that place.  The
5281 headers of the message won't be altered---but lots of headers that say
5282 @code{Resent-To}, @code{Resent-From} and so on will be added.  This
5283 means that you actually send a mail to someone that has a @code{To}
5284 header that (probably) points to yourself.  This will confuse people.
5285 So, natcherly you'll only do that if you're really eVIl.
5286
5287 This command is mainly used if you have several accounts and want to
5288 ship a mail to a different account of yours.  (If you're both
5289 @code{root} and @code{postmaster} and get a mail for @code{postmaster}
5290 to the @code{root} account, you may want to resend it to
5291 @code{postmaster}.  Ordnung muss sein!
5292
5293 This command understands the process/prefix convention
5294 (@pxref{Process/Prefix}).
5295
5296 @item S O m
5297 @kindex S O m (Summary)
5298 @findex gnus-summary-digest-mail-forward
5299 Digest the current series (@pxref{Decoding Articles}) and forward the
5300 result using mail (@code{gnus-summary-digest-mail-forward}).  This
5301 command uses the process/prefix convention (@pxref{Process/Prefix}).
5302
5303 @item S M-c
5304 @kindex S M-c (Summary)
5305 @findex gnus-summary-mail-crosspost-complaint
5306 @cindex crossposting
5307 @cindex excessive crossposting
5308 Send a complaint about excessive crossposting to the author of the
5309 current article (@code{gnus-summary-mail-crosspost-complaint}).
5310
5311 @findex gnus-crosspost-complaint
5312 This command is provided as a way to fight back against the current
5313 crossposting pandemic that's sweeping Usenet.  It will compose a reply
5314 using the @code{gnus-crosspost-complaint} variable as a preamble.  This
5315 command understands the process/prefix convention
5316 (@pxref{Process/Prefix}) and will prompt you before sending each mail.
5317
5318 @end table
5319
5320 Also @xref{Header Commands, ,Header Commands, message, The Message
5321 Manual}, for more information.
5322
5323
5324 @node Summary Post Commands
5325 @subsection Summary Post Commands
5326 @cindex post
5327 @cindex composing news
5328
5329 Commands for posting a news article:
5330
5331 @table @kbd
5332 @item S p
5333 @itemx a
5334 @kindex a (Summary)
5335 @kindex S p (Summary)
5336 @findex gnus-summary-post-news
5337 @c @icon{gnus-summary-post-news}
5338 Prepare for posting an article (@code{gnus-summary-post-news}).  By
5339 default, post to the current group.  If given a prefix, disable that.
5340 If the prefix is 1, prompt for another group instead.
5341
5342 @item S f
5343 @itemx f
5344 @kindex f (Summary)
5345 @kindex S f (Summary)
5346 @findex gnus-summary-followup
5347 @c @icon{gnus-summary-followup}
5348 Post a followup to the current article (@code{gnus-summary-followup}).
5349
5350 @item S F
5351 @itemx F
5352 @kindex S F (Summary)
5353 @kindex F (Summary)
5354 @c @icon{gnus-summary-followup-with-original}
5355 @findex gnus-summary-followup-with-original
5356 Post a followup to the current article and include the original message
5357 (@code{gnus-summary-followup-with-original}).   This command uses the
5358 process/prefix convention.
5359
5360 @item S n
5361 @kindex S n (Summary)
5362 @findex gnus-summary-followup-to-mail
5363 Post a followup to the current article via news, even if you got the
5364 message through mail (@code{gnus-summary-followup-to-mail}).
5365
5366 @item S N
5367 @kindex S N (Summary)
5368 @findex gnus-summary-followup-to-mail-with-original
5369 Post a followup to the current article via news, even if you got the
5370 message through mail and include the original message
5371 (@code{gnus-summary-followup-to-mail-with-original}).  This command uses
5372 the process/prefix convention.
5373
5374 @item S o p
5375 @kindex S o p (Summary)
5376 @findex gnus-summary-post-forward
5377 Forward the current article to a newsgroup
5378 (@code{gnus-summary-post-forward}).  If given a prefix, include the full
5379 headers of the forwarded article.
5380
5381 @item S O p
5382 @kindex S O p (Summary)
5383 @findex gnus-summary-digest-post-forward
5384 @cindex digests
5385 @cindex making digests
5386 Digest the current series and forward the result to a newsgroup
5387 (@code{gnus-summary-digest-post-forward}).  This command uses the
5388 process/prefix convention.
5389
5390 @item S u
5391 @kindex S u (Summary)
5392 @findex gnus-uu-post-news
5393 @c @icon{gnus-uu-post-news}
5394 Uuencode a file, split it into parts, and post it as a series
5395 (@code{gnus-uu-post-news}).  (@pxref{Uuencoding and Posting}).
5396 @end table
5397
5398 Also @xref{Header Commands, ,Header Commands, message, The Message
5399 Manual}, for more information.
5400
5401
5402 @node Summary Message Commands
5403 @subsection Summary Message Commands
5404
5405 @table @kbd
5406 @item S y
5407 @kindex S y (Summary)
5408 @findex gnus-summary-yank-message
5409 Yank the current article into an already existing Message composition
5410 buffer (@code{gnus-summary-yank-message}).  This command prompts for
5411 what message buffer you want to yank into, and understands the
5412 process/prefix convention (@pxref{Process/Prefix}).
5413
5414 @end table
5415
5416
5417 @node Canceling and Superseding
5418 @subsection Canceling Articles
5419 @cindex canceling articles
5420 @cindex superseding articles
5421
5422 Have you ever written something, and then decided that you really,
5423 really, really wish you hadn't posted that?
5424
5425 Well, you can't cancel mail, but you can cancel posts.
5426
5427 @findex gnus-summary-cancel-article
5428 @kindex C (Summary)
5429 @c @icon{gnus-summary-cancel-article}
5430 Find the article you wish to cancel (you can only cancel your own
5431 articles, so don't try any funny stuff).  Then press @kbd{C} or @kbd{S
5432 c} (@code{gnus-summary-cancel-article}).  Your article will be
5433 canceled---machines all over the world will be deleting your article.
5434 This command uses the process/prefix convention (@pxref{Process/Prefix}).
5435
5436 Be aware, however, that not all sites honor cancels, so your article may
5437 live on here and there, while most sites will delete the article in
5438 question.
5439
5440 Gnus will use the ``current'' select method when canceling.  If you
5441 want to use the standard posting method, use the @samp{a} symbolic
5442 prefix (@pxref{Symbolic Prefixes}).
5443
5444 If you discover that you have made some mistakes and want to do some
5445 corrections, you can post a @dfn{superseding} article that will replace
5446 your original article.
5447
5448 @findex gnus-summary-supersede-article
5449 @kindex S (Summary)
5450 Go to the original article and press @kbd{S s}
5451 (@code{gnus-summary-supersede-article}).  You will be put in a buffer
5452 where you can edit the article all you want before sending it off the
5453 usual way.
5454
5455 The same goes for superseding as for canceling, only more so: Some
5456 sites do not honor superseding.  On those sites, it will appear that you
5457 have posted almost the same article twice.
5458
5459 If you have just posted the article, and change your mind right away,
5460 there is a trick you can use to cancel/supersede the article without
5461 waiting for the article to appear on your site first.  You simply return
5462 to the post buffer (which is called @code{*sent ...*}).  There you will
5463 find the article you just posted, with all the headers intact.  Change
5464 the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes}
5465 header by substituting one of those words for the word
5466 @code{Message-ID}.  Then just press @kbd{C-c C-c} to send the article as
5467 you would do normally.  The previous article will be
5468 canceled/superseded.
5469
5470 Just remember, kids: There is no 'c' in 'supersede'.
5471
5472 @node Delayed Articles
5473 @section Delayed Articles
5474 @cindex delayed sending
5475 @cindex send delayed
5476
5477 Sometimes, you might wish to delay the sending of a message.  For
5478 example, you might wish to arrange for a message to turn up just in time
5479 to remind your about the birthday of your Significant Other.  For this,
5480 there is the @code{gnus-delay} package.  Setup is simple:
5481
5482 @lisp
5483 (gnus-delay-initialize)
5484 @end lisp
5485
5486 @findex gnus-delay-article
5487 Normally, to send a message you use the @kbd{C-c C-c} command from
5488 Message mode.  To delay a message, use @kbd{C-c C-j}
5489 (@code{gnus-delay-article}) instead.  This will ask you for how long the
5490 message should be delayed.  Possible answers are:
5491
5492 @itemize @bullet
5493 @item
5494 A time span.  Consists of an integer and a letter.  For example,
5495 @code{42d} means to delay for 42 days.  Available letters are @code{m}
5496 (minutes), @code{h} (hours), @code{d} (days), @code{w} (weeks), @code{M}
5497 (months) and @code{Y} (years).
5498
5499 @item
5500 A specific date.  Looks like @code{YYYYY-MM-DD}.  The message will be
5501 delayed until that day, at a specific time (eight o'clock by default).
5502 See also @code{gnus-delay-default-hour}.
5503
5504 @item
5505 A specific time of day.  Given in @code{hh:mm} format, 24h, no am/pm
5506 stuff.  The deadline will be at that time today, except if that time has
5507 already passed, then it's at the given time tomorrow.  So if it's ten
5508 o'clock in the morning and you specify @code{11:15}, then the deadline
5509 is one hour and fifteen minutes hence.  But if you specify @code{9:20},
5510 that means a time tomorrow.
5511 @end itemize
5512
5513 The action of the @code{gnus-delay-article} command is influenced by a
5514 couple of variables:
5515
5516 @table @code
5517 @item gnus-delay-default-hour
5518 @vindex gnus-delay-default-hour
5519 When you specify a specific date, the message will be due on that hour
5520 on the given date.  Possible values are integers 0 through 23.
5521
5522 @item gnus-delay-default-delay
5523 @vindex gnus-delay-default-delay
5524 This is a string and gives the default delay.  It can be of any of the
5525 formats described above.
5526
5527 @item gnus-delay-group
5528 @vindex gnus-delay-group
5529 Delayed articles will be kept in this group on the drafts server until
5530 they are due.  You probably don't need to change this.  The default
5531 value is @code{"delayed"}.
5532
5533 @item gnus-delay-header
5534 @vindex gnus-delay-header
5535 The deadline for each article will be stored in a header.  This variable
5536 is a string and gives the header name.  You probably don't need to
5537 change this.  The default value is @code{"X-Gnus-Delayed"}.
5538 @end table
5539
5540 The way delaying works is like this: when you use the
5541 @code{gnus-delay-article} command, you give a certain delay.  Gnus
5542 calculates the deadline of the message and stores it in the
5543 @code{X-Gnus-Delayed} header and puts the message in the
5544 @code{nndraft:delayed} group.
5545
5546 @findex gnus-delay-send-queue
5547 And whenever you get new news, Gnus looks through the group for articles
5548 which are due and sends them.  It uses the @code{gnus-delay-send-queue}
5549 function for this.  By default, this function is added to the hook
5550 @code{gnus-get-new-news-hook}.  But of course, you can change this.
5551 Maybe you want to use the demon to send drafts?  Just tell the demon to
5552 execute the @code{gnus-delay-send-queue} function.
5553
5554 @table @code
5555 @item gnus-delay-initialize
5556 @findex gnus-delay-initialize
5557
5558 By default, this function installs @code{gnus-delay-send-queue} in
5559 @code{gnus-get-new-news-hook}.  But it accepts the optional second
5560 argument @code{no-check}.  If it is non-@code{nil},
5561 @code{gnus-get-new-news-hook} is not changed.  The optional first
5562 argument is ignored.
5563
5564 For example, @code{(gnus-delay-initialize nil t)} means to do nothing.
5565 Presumably, you want to use the demon for sending due delayed articles.
5566 Just don't forget to set that up :-)
5567 @end table
5568
5569
5570 @node Marking Articles
5571 @section Marking Articles
5572 @cindex article marking
5573 @cindex article ticking
5574 @cindex marks
5575
5576 There are several marks you can set on an article.
5577
5578 You have marks that decide the @dfn{readedness} (whoo, neato-keano
5579 neologism ohoy!) of the article.  Alphabetic marks generally mean
5580 @dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.
5581
5582 In addition, you also have marks that do not affect readedness.
5583
5584 @menu
5585 * Unread Articles::             Marks for unread articles.
5586 * Read Articles::               Marks for read articles.
5587 * Other Marks::                 Marks that do not affect readedness.
5588 @end menu
5589
5590 @ifinfo
5591 There's a plethora of commands for manipulating these marks:
5592 @end ifinfo
5593
5594 @menu
5595 * Setting Marks::             How to set and remove marks.
5596 * Generic Marking Commands::  How to customize the marking.
5597 * Setting Process Marks::     How to mark articles for later processing.
5598 @end menu
5599
5600
5601 @node Unread Articles
5602 @subsection Unread Articles
5603
5604 The following marks mark articles as (kinda) unread, in one form or
5605 other.
5606
5607 @table @samp
5608 @item !
5609 @vindex gnus-ticked-mark
5610 Marked as ticked (@code{gnus-ticked-mark}).
5611
5612 @dfn{Ticked articles} are articles that will remain visible always.  If
5613 you see an article that you find interesting, or you want to put off
5614 reading it, or replying to it, until sometime later, you'd typically
5615 tick it.  However, articles can be expired (from news servers by the
5616 news server software, Gnus itself never expires ticked messages), so if
5617 you want to keep an article forever, you'll have to make it persistent
5618 (@pxref{Persistent Articles}).
5619
5620 @item ?
5621 @vindex gnus-dormant-mark
5622 Marked as dormant (@code{gnus-dormant-mark}).
5623
5624 @dfn{Dormant articles} will only appear in the summary buffer if there
5625 are followups to it.  If you want to see them even if they don't have
5626 followups, you can use the @kbd{/ D} command (@pxref{Limiting}).
5627 Otherwise (except for the visibility issue), they are just like ticked
5628 messages.
5629
5630 @item SPACE
5631 @vindex gnus-unread-mark
5632 Marked as unread (@code{gnus-unread-mark}).
5633
5634 @dfn{Unread articles} are articles that haven't been read at all yet.
5635 @end table
5636
5637
5638 @node Read Articles
5639 @subsection Read Articles
5640 @cindex expirable mark
5641
5642 All the following marks mark articles as read.
5643
5644 @table @samp
5645
5646 @item r
5647 @vindex gnus-del-mark
5648 These are articles that the user has marked as read with the @kbd{d}
5649 command manually, more or less (@code{gnus-del-mark}).
5650
5651 @item R
5652 @vindex gnus-read-mark
5653 Articles that have actually been read (@code{gnus-read-mark}).
5654
5655 @item O
5656 @vindex gnus-ancient-mark
5657 Articles that were marked as read in previous sessions and are now
5658 @dfn{old} (@code{gnus-ancient-mark}).
5659
5660 @item K
5661 @vindex gnus-killed-mark
5662 Marked as killed (@code{gnus-killed-mark}).
5663
5664 @item X
5665 @vindex gnus-kill-file-mark
5666 Marked as killed by kill files (@code{gnus-kill-file-mark}).
5667
5668 @item Y
5669 @vindex gnus-low-score-mark
5670 Marked as read by having too low a score (@code{gnus-low-score-mark}).
5671
5672 @item C
5673 @vindex gnus-catchup-mark
5674 Marked as read by a catchup (@code{gnus-catchup-mark}).
5675
5676 @item G
5677 @vindex gnus-canceled-mark
5678 Canceled article (@code{gnus-canceled-mark})
5679
5680 @item F
5681 @vindex gnus-souped-mark
5682 @sc{soup}ed article (@code{gnus-souped-mark}).  @xref{SOUP}.
5683
5684 @item Q
5685 @vindex gnus-sparse-mark
5686 Sparsely reffed article (@code{gnus-sparse-mark}).  @xref{Customizing
5687 Threading}.
5688
5689 @item M
5690 @vindex gnus-duplicate-mark
5691 Article marked as read by duplicate suppression
5692 (@code{gnus-duplicate-mark}).  @xref{Duplicate Suppression}.
5693
5694 @end table
5695
5696 All these marks just mean that the article is marked as read, really.
5697 They are interpreted differently when doing adaptive scoring, though.
5698
5699 One more special mark, though:
5700
5701 @table @samp
5702 @item E
5703 @vindex gnus-expirable-mark
5704 Marked as expirable (@code{gnus-expirable-mark}).
5705
5706 Marking articles as @dfn{expirable} (or have them marked as such
5707 automatically) doesn't make much sense in normal groups---a user doesn't
5708 control expiring of news articles, but in mail groups, for instance,
5709 articles marked as @dfn{expirable} can be deleted by gnus at
5710 any time.
5711 @end table
5712
5713
5714 @node Other Marks
5715 @subsection Other Marks
5716 @cindex process mark
5717 @cindex bookmarks
5718
5719 There are some marks that have nothing to do with whether the article is
5720 read or not.
5721
5722 @itemize @bullet
5723
5724 @item
5725 You can set a bookmark in the current article.  Say you are reading a
5726 long thesis on cats' urinary tracts, and have to go home for dinner
5727 before you've finished reading the thesis.  You can then set a bookmark
5728 in the article, and gnus will jump to this bookmark the next time it
5729 encounters the article.  @xref{Setting Marks}.
5730
5731 @item
5732 @vindex gnus-replied-mark
5733 All articles that you have replied to or made a followup to (i.e., have
5734 answered) will be marked with an @samp{A} in the second column
5735 (@code{gnus-replied-mark}).
5736
5737 @item
5738 @vindex gnus-forwarded-mark
5739 All articles that you have forwarded will be marked with an @samp{F} in
5740 the second column (@code{gnus-forwarded-mark}).
5741
5742 @item
5743 @vindex gnus-cached-mark
5744 Articles stored in the article cache will be marked with an @samp{*} in
5745 the second column (@code{gnus-cached-mark}).  @xref{Article Caching}.
5746
5747 @item
5748 @vindex gnus-saved-mark
5749 Articles ``saved'' (in some manner or other; not necessarily
5750 religiously) are marked with an @samp{S} in the second column
5751 (@code{gnus-saved-mark}).
5752
5753 @item
5754 @vindex gnus-recent-mark
5755 Articles that according to the server haven't been shown to the user
5756 before are marked with a @samp{N} in the second column
5757 (@code{gnus-recent-mark}).  Note that not all servers support this
5758 mark, in which case it simply never appears. Compare with
5759 @code{gnus-unseen-mark}.
5760
5761 @item
5762 @vindex gnus-unseen-mark
5763 Articles that haven't been seen before in Gnus by the user are marked
5764 with a @samp{.} in the second column (@code{gnus-unseen-mark}).
5765 Compare with @code{gnus-recent-mark}.
5766
5767 @item
5768 @vindex gnus-downloaded-mark
5769 When using the Gnus agent @pxref{Agent Basics}, articles may be
5770 downloaded for unplugged (offline) viewing.  If you are using the
5771 @samp{%O} spec, these articles get the @samp{+} mark in that spec.
5772 (The variable @code{gnus-downloaded-mark} controls which character to
5773 use.)
5774
5775 @item
5776 @vindex gnus-undownloaded-mark
5777 When using the Gnus agent @pxref{Agent Basics}, some articles might
5778 not have been downloaded.  Such articles cannot be viewed while you
5779 are unplugged (offline).  If you are using the @samp{%O} spec, these
5780 articles get the @samp{-} mark in that spec.  (The variable
5781 @code{gnus-undownloaded-mark} controls which character to use.)
5782
5783 @item
5784 @vindex gnus-downloadable-mark
5785 The Gnus agent @pxref{Agent Basics} downloads some articles
5786 automatically, but it is also possible to explicitly mark articles for
5787 download, even if they would not be downloaded automatically.  Such
5788 explicitly-marked articles get the @samp{%} mark in the first column.
5789 (The variable @code{gnus-downloadable-mark} controls which character to
5790 use.)
5791
5792 @item
5793 @vindex gnus-not-empty-thread-mark
5794 @vindex gnus-empty-thread-mark
5795 If the @samp{%e} spec is used, the presence of threads or not will be
5796 marked with @code{gnus-not-empty-thread-mark} and
5797 @code{gnus-empty-thread-mark} in the third column, respectively.
5798
5799 @item
5800 @vindex gnus-process-mark
5801 Finally we have the @dfn{process mark} (@code{gnus-process-mark}).  A
5802 variety of commands react to the presence of the process mark.  For
5803 instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view
5804 all articles that have been marked with the process mark.  Articles
5805 marked with the process mark have a @samp{#} in the second column.
5806
5807 @end itemize
5808
5809 You might have noticed that most of these ``non-readedness'' marks
5810 appear in the second column by default.  So if you have a cached, saved,
5811 replied article that you have process-marked, what will that look like?
5812
5813 Nothing much.  The precedence rules go as follows: process -> cache ->
5814 replied -> saved.  So if the article is in the cache and is replied,
5815 you'll only see the cache mark and not the replied mark.
5816
5817
5818 @node Setting Marks
5819 @subsection Setting Marks
5820 @cindex setting marks
5821
5822 All the marking commands understand the numeric prefix.
5823
5824 @table @kbd
5825 @item M c
5826 @itemx M-u
5827 @kindex M c (Summary)
5828 @kindex M-u (Summary)
5829 @findex gnus-summary-clear-mark-forward
5830 @cindex mark as unread
5831 Clear all readedness-marks from the current article
5832 (@code{gnus-summary-clear-mark-forward}).  In other words, mark the
5833 article as unread.
5834
5835 @item M t
5836 @itemx !
5837 @kindex ! (Summary)
5838 @kindex M t (Summary)
5839 @findex gnus-summary-tick-article-forward
5840 Tick the current article (@code{gnus-summary-tick-article-forward}).
5841 @xref{Article Caching}.
5842
5843 @item M ?
5844 @itemx ?
5845 @kindex ? (Summary)
5846 @kindex M ? (Summary)
5847 @findex gnus-summary-mark-as-dormant
5848 Mark the current article as dormant
5849 (@code{gnus-summary-mark-as-dormant}).  @xref{Article Caching}.
5850
5851 @item M d
5852 @itemx d
5853 @kindex M d (Summary)
5854 @kindex d (Summary)
5855 @findex gnus-summary-mark-as-read-forward
5856 Mark the current article as read
5857 (@code{gnus-summary-mark-as-read-forward}).
5858
5859 @item D
5860 @kindex D (Summary)
5861 @findex gnus-summary-mark-as-read-backward
5862 Mark the current article as read and move point to the previous line
5863 (@code{gnus-summary-mark-as-read-backward}).
5864
5865 @item M k
5866 @itemx k
5867 @kindex k (Summary)
5868 @kindex M k (Summary)
5869 @findex gnus-summary-kill-same-subject-and-select
5870 Mark all articles that have the same subject as the current one as read,
5871 and then select the next unread article
5872 (@code{gnus-summary-kill-same-subject-and-select}).
5873
5874 @item M K
5875 @itemx C-k
5876 @kindex M K (Summary)
5877 @kindex C-k (Summary)
5878 @findex gnus-summary-kill-same-subject
5879 Mark all articles that have the same subject as the current one as read
5880 (@code{gnus-summary-kill-same-subject}).
5881
5882 @item M C
5883 @kindex M C (Summary)
5884 @findex gnus-summary-catchup
5885 @c @icon{gnus-summary-catchup}
5886 Mark all unread articles as read (@code{gnus-summary-catchup}).
5887
5888 @item M C-c
5889 @kindex M C-c (Summary)
5890 @findex gnus-summary-catchup-all
5891 Mark all articles in the group as read---even the ticked and dormant
5892 articles (@code{gnus-summary-catchup-all}).
5893
5894 @item M H
5895 @kindex M H (Summary)
5896 @findex gnus-summary-catchup-to-here
5897 Catchup the current group to point (before the point)
5898 (@code{gnus-summary-catchup-to-here}).
5899
5900 @item M h
5901 @kindex M h (Summary)
5902 @findex gnus-summary-catchup-from-here
5903 Catchup the current group from point (after the point)
5904 (@code{gnus-summary-catchup-from-here}).
5905
5906 @item C-w
5907 @kindex C-w (Summary)
5908 @findex gnus-summary-mark-region-as-read
5909 Mark all articles between point and mark as read
5910 (@code{gnus-summary-mark-region-as-read}).
5911
5912 @item M V k
5913 @kindex M V k (Summary)
5914 @findex gnus-summary-kill-below
5915 Kill all articles with scores below the default score (or below the
5916 numeric prefix) (@code{gnus-summary-kill-below}).
5917
5918 @item M e
5919 @itemx E
5920 @kindex M e (Summary)
5921 @kindex E (Summary)
5922 @findex gnus-summary-mark-as-expirable
5923 Mark the current article as expirable
5924 (@code{gnus-summary-mark-as-expirable}).
5925
5926 @item M b
5927 @kindex M b (Summary)
5928 @findex gnus-summary-set-bookmark
5929 Set a bookmark in the current article
5930 (@code{gnus-summary-set-bookmark}).
5931
5932 @item M B
5933 @kindex M B (Summary)
5934 @findex gnus-summary-remove-bookmark
5935 Remove the bookmark from the current article
5936 (@code{gnus-summary-remove-bookmark}).
5937
5938 @item M V c
5939 @kindex M V c (Summary)
5940 @findex gnus-summary-clear-above
5941 Clear all marks from articles with scores over the default score (or
5942 over the numeric prefix) (@code{gnus-summary-clear-above}).
5943
5944 @item M V u
5945 @kindex M V u (Summary)
5946 @findex gnus-summary-tick-above
5947 Tick all articles with scores over the default score (or over the
5948 numeric prefix) (@code{gnus-summary-tick-above}).
5949
5950 @item M V m
5951 @kindex M V m (Summary)
5952 @findex gnus-summary-mark-above
5953 Prompt for a mark, and mark all articles with scores over the default
5954 score (or over the numeric prefix) with this mark
5955 (@code{gnus-summary-clear-above}).
5956 @end table
5957
5958 @vindex gnus-summary-goto-unread
5959 The @code{gnus-summary-goto-unread} variable controls what action should
5960 be taken after setting a mark.  If non-@code{nil}, point will move to
5961 the next/previous unread article.  If @code{nil}, point will just move
5962 one line up or down.  As a special case, if this variable is
5963 @code{never}, all the marking commands as well as other commands (like
5964 @kbd{SPACE}) will move to the next article, whether it is unread or not.
5965 The default is @code{t}.
5966
5967
5968 @node Generic Marking Commands
5969 @subsection Generic Marking Commands
5970
5971 Some people would like the command that ticks an article (@kbd{!}) go to
5972 the next article.  Others would like it to go to the next unread
5973 article.  Yet others would like it to stay on the current article.  And
5974 even though I haven't heard of anybody wanting it to go to the
5975 previous (unread) article, I'm sure there are people that want that as
5976 well.
5977
5978 Multiply these five behaviors with five different marking commands, and
5979 you get a potentially complex set of variable to control what each
5980 command should do.
5981
5982 To sidestep that mess, Gnus provides commands that do all these
5983 different things.  They can be found on the @kbd{M M} map in the summary
5984 buffer.  Type @kbd{M M C-h} to see them all---there are too many of them
5985 to list in this manual.
5986
5987 While you can use these commands directly, most users would prefer
5988 altering the summary mode keymap.  For instance, if you would like the
5989 @kbd{!} command to go to the next article instead of the next unread
5990 article, you could say something like:
5991
5992 @lisp
5993 (add-hook 'gnus-summary-mode-hook 'my-alter-summary-map)
5994 (defun my-alter-summary-map ()
5995   (local-set-key "!" 'gnus-summary-put-mark-as-ticked-next))
5996 @end lisp
5997
5998 or
5999
6000 @lisp
6001 (defun my-alter-summary-map ()
6002   (local-set-key "!" "MM!n"))
6003 @end lisp
6004
6005
6006 @node Setting Process Marks
6007 @subsection Setting Process Marks
6008 @cindex setting process marks
6009
6010 Process marks are displayed as @code{#} in the summary buffer, and are
6011 used for marking articles in such a way that other commands will
6012 process these articles.  For instance, if you process mark four
6013 articles and then use the @kbd{*} command, Gnus will enter these four
6014 commands into the cache.  For more information,
6015 @pxref{Process/Prefix}.
6016
6017 @table @kbd
6018
6019 @item M P p
6020 @itemx #
6021 @kindex # (Summary)
6022 @kindex M P p (Summary)
6023 @findex gnus-summary-mark-as-processable
6024 Mark the current article with the process mark
6025 (@code{gnus-summary-mark-as-processable}).
6026 @findex gnus-summary-unmark-as-processable
6027
6028 @item M P u
6029 @itemx M-#
6030 @kindex M P u (Summary)
6031 @kindex M-# (Summary)
6032 Remove the process mark, if any, from the current article
6033 (@code{gnus-summary-unmark-as-processable}).
6034
6035 @item M P U
6036 @kindex M P U (Summary)
6037 @findex gnus-summary-unmark-all-processable
6038 Remove the process mark from all articles
6039 (@code{gnus-summary-unmark-all-processable}).
6040
6041 @item M P i
6042 @kindex M P i (Summary)
6043 @findex gnus-uu-invert-processable
6044 Invert the list of process marked articles
6045 (@code{gnus-uu-invert-processable}).
6046
6047 @item M P R
6048 @kindex M P R (Summary)
6049 @findex gnus-uu-mark-by-regexp
6050 Mark articles that have a @code{Subject} header that matches a regular
6051 expression (@code{gnus-uu-mark-by-regexp}).
6052
6053 @item M P G
6054 @kindex M P G (Summary)
6055 @findex gnus-uu-unmark-by-regexp
6056 Unmark articles that have a @code{Subject} header that matches a regular
6057 expression (@code{gnus-uu-unmark-by-regexp}).
6058
6059 @item M P r
6060 @kindex M P r (Summary)
6061 @findex gnus-uu-mark-region
6062 Mark articles in region (@code{gnus-uu-mark-region}).
6063
6064 @item M P g
6065 @kindex M P g
6066 @findex gnus-uu-unmark-region
6067 Unmark articles in region (@code{gnus-uu-unmark-region}).
6068
6069 @item M P t
6070 @kindex M P t (Summary)
6071 @findex gnus-uu-mark-thread
6072 Mark all articles in the current (sub)thread
6073 (@code{gnus-uu-mark-thread}).
6074
6075 @item M P T
6076 @kindex M P T (Summary)
6077 @findex gnus-uu-unmark-thread
6078 Unmark all articles in the current (sub)thread
6079 (@code{gnus-uu-unmark-thread}).
6080
6081 @item M P v
6082 @kindex M P v (Summary)
6083 @findex gnus-uu-mark-over
6084 Mark all articles that have a score above the prefix argument
6085 (@code{gnus-uu-mark-over}).
6086
6087 @item M P s
6088 @kindex M P s (Summary)
6089 @findex gnus-uu-mark-series
6090 Mark all articles in the current series (@code{gnus-uu-mark-series}).
6091
6092 @item M P S
6093 @kindex M P S (Summary)
6094 @findex gnus-uu-mark-sparse
6095 Mark all series that have already had some articles marked
6096 (@code{gnus-uu-mark-sparse}).
6097
6098 @item M P a
6099 @kindex M P a (Summary)
6100 @findex gnus-uu-mark-all
6101 Mark all articles in series order (@code{gnus-uu-mark-series}).
6102
6103 @item M P b
6104 @kindex M P b (Summary)
6105 @findex gnus-uu-mark-buffer
6106 Mark all articles in the buffer in the order they appear
6107 (@code{gnus-uu-mark-buffer}).
6108
6109 @item M P k
6110 @kindex M P k (Summary)
6111 @findex gnus-summary-kill-process-mark
6112 Push the current process mark set onto the stack and unmark all articles
6113 (@code{gnus-summary-kill-process-mark}).
6114
6115 @item M P y
6116 @kindex M P y (Summary)
6117 @findex gnus-summary-yank-process-mark
6118 Pop the previous process mark set from the stack and restore it
6119 (@code{gnus-summary-yank-process-mark}).
6120
6121 @item M P w
6122 @kindex M P w (Summary)
6123 @findex gnus-summary-save-process-mark
6124 Push the current process mark set onto the stack
6125 (@code{gnus-summary-save-process-mark}).
6126
6127 @end table
6128
6129 Also see the @kbd{&} command in @pxref{Searching for Articles} for how to
6130 set process marks based on article body contents.
6131
6132
6133 @node Limiting
6134 @section Limiting
6135 @cindex limiting
6136
6137 It can be convenient to limit the summary buffer to just show some
6138 subset of the articles currently in the group.  The effect most limit
6139 commands have is to remove a few (or many) articles from the summary
6140 buffer.
6141
6142 All limiting commands work on subsets of the articles already fetched
6143 from the servers.  None of these commands query the server for
6144 additional articles.
6145
6146 @table @kbd
6147
6148 @item / /
6149 @itemx / s
6150 @kindex / / (Summary)
6151 @findex gnus-summary-limit-to-subject
6152 Limit the summary buffer to articles that match some subject
6153 (@code{gnus-summary-limit-to-subject}). If given a prefix, exclude
6154 matching articles.
6155
6156 @item / a
6157 @kindex / a (Summary)
6158 @findex gnus-summary-limit-to-author
6159 Limit the summary buffer to articles that match some author
6160 (@code{gnus-summary-limit-to-author}). If given a prefix, exclude
6161 matching articles.
6162
6163 @item / x
6164 @kindex / x (Summary)
6165 @findex gnus-summary-limit-to-extra
6166 Limit the summary buffer to articles that match one of the ``extra''
6167 headers (@pxref{To From Newsgroups})
6168 (@code{gnus-summary-limit-to-extra}). If given a prefix, exclude
6169 matching articles.
6170
6171 @item / u
6172 @itemx x
6173 @kindex / u (Summary)
6174 @kindex x (Summary)
6175 @findex gnus-summary-limit-to-unread
6176 Limit the summary buffer to articles not marked as read
6177 (@code{gnus-summary-limit-to-unread}).  If given a prefix, limit the
6178 buffer to articles strictly unread.  This means that ticked and
6179 dormant articles will also be excluded.
6180
6181 @item / m
6182 @kindex / m (Summary)
6183 @findex gnus-summary-limit-to-marks
6184 Ask for a mark and then limit to all articles that have been marked
6185 with that mark (@code{gnus-summary-limit-to-marks}).
6186
6187 @item / t
6188 @kindex / t (Summary)
6189 @findex gnus-summary-limit-to-age
6190 Ask for a number and then limit the summary buffer to articles older than (or equal to) that number of days
6191 (@code{gnus-summary-limit-to-age}).  If given a prefix, limit to
6192 articles younger than that number of days.
6193
6194 @item / n
6195 @kindex / n (Summary)
6196 @findex gnus-summary-limit-to-articles
6197 Limit the summary buffer to the current article
6198 (@code{gnus-summary-limit-to-articles}).  Uses the process/prefix
6199 convention (@pxref{Process/Prefix}).
6200
6201 @item / w
6202 @kindex / w (Summary)
6203 @findex gnus-summary-pop-limit
6204 Pop the previous limit off the stack and restore it
6205 (@code{gnus-summary-pop-limit}).  If given a prefix, pop all limits off
6206 the stack.
6207
6208 @item / .
6209 @kindex / . (Summary)
6210 @findex gnus-summary-limit-to-unseen
6211 Limit the summary buffer to the unseen articles
6212 (@code{gnus-summary-limit-to-unseen}).
6213
6214 @item / v
6215 @kindex / v (Summary)
6216 @findex gnus-summary-limit-to-score
6217 Limit the summary buffer to articles that have a score at or above some
6218 score (@code{gnus-summary-limit-to-score}).
6219
6220 @item / p
6221 @kindex / p (Summary)
6222 @findex gnus-summary-limit-to-display-predicate
6223 Limit the summary buffer to articles that satisfy the @code{display}
6224 group parameter predicate
6225 (@code{gnus-summary-limit-to-display-predicate}).  See @pxref{Group
6226 Parameters} for more on this predicate.
6227
6228 @item / E
6229 @itemx M S
6230 @kindex M S (Summary)
6231 @kindex / E (Summary)
6232 @findex gnus-summary-limit-include-expunged
6233 Include all expunged articles in the limit
6234 (@code{gnus-summary-limit-include-expunged}).
6235
6236 @item / D
6237 @kindex / D (Summary)
6238 @findex gnus-summary-limit-include-dormant
6239 Include all dormant articles in the limit
6240 (@code{gnus-summary-limit-include-dormant}).
6241
6242 @item / *
6243 @kindex / * (Summary)
6244 @findex gnus-summary-limit-include-cached
6245 Include all cached articles in the limit
6246 (@code{gnus-summary-limit-include-cached}).
6247
6248 @item / d
6249 @kindex / d (Summary)
6250 @findex gnus-summary-limit-exclude-dormant
6251 Exclude all dormant articles from the limit
6252 (@code{gnus-summary-limit-exclude-dormant}).
6253
6254 @item / M
6255 @kindex / M (Summary)
6256 @findex gnus-summary-limit-exclude-marks
6257 Exclude all marked articles (@code{gnus-summary-limit-exclude-marks}).
6258
6259 @item / T
6260 @kindex / T (Summary)
6261 @findex gnus-summary-limit-include-thread
6262 Include all the articles in the current thread in the limit.
6263
6264 @item / c
6265 @kindex / c (Summary)
6266 @findex gnus-summary-limit-exclude-childless-dormant
6267 Exclude all dormant articles that have no children from the limit
6268 (@code{gnus-summary-limit-exclude-childless-dormant}).
6269
6270 @item / C
6271 @kindex / C (Summary)
6272 @findex gnus-summary-limit-mark-excluded-as-read
6273 Mark all excluded unread articles as read
6274 (@code{gnus-summary-limit-mark-excluded-as-read}).   If given a prefix,
6275 also mark excluded ticked and dormant articles as read.
6276
6277 @item / N
6278 @kindex / N (Summary)
6279 @findex gnus-summary-insert-new-articles
6280 Insert all new articles in the summary buffer. It scans for new emails
6281 if @var{back-end}@code{-get-new-mail} is non-@code{nil}.
6282
6283 @item / o
6284 @kindex / o (Summary)
6285 @findex gnus-summary-insert-old-articles
6286 Insert all old articles in the summary buffer. If given a numbered
6287 prefix, fetch this number of articles.
6288
6289 @end table
6290
6291
6292 @node Threading
6293 @section Threading
6294 @cindex threading
6295 @cindex article threading
6296
6297 Gnus threads articles by default.  @dfn{To thread} is to put responses
6298 to articles directly after the articles they respond to---in a
6299 hierarchical fashion.
6300
6301 Threading is done by looking at the @code{References} headers of the
6302 articles.  In a perfect world, this would be enough to build pretty
6303 trees, but unfortunately, the @code{References} header is often broken
6304 or simply missing.  Weird news propagation exacerbates the problem,
6305 so one has to employ other heuristics to get pleasing results.  A
6306 plethora of approaches exists, as detailed in horrible detail in
6307 @pxref{Customizing Threading}.
6308
6309 First, a quick overview of the concepts:
6310
6311 @table @dfn
6312 @item root
6313 The top-most article in a thread; the first article in the thread.
6314
6315 @item thread
6316 A tree-like article structure.
6317
6318 @item sub-thread
6319 A small(er) section of this tree-like structure.
6320
6321 @item loose threads
6322 Threads often lose their roots due to article expiry, or due to the root
6323 already having been read in a previous session, and not displayed in the
6324 summary buffer.  We then typically have many sub-threads that really
6325 belong to one thread, but are without connecting roots.  These are
6326 called loose threads.
6327
6328 @item thread gathering
6329 An attempt to gather loose threads into bigger threads.
6330
6331 @item sparse threads
6332 A thread where the missing articles have been ``guessed'' at, and are
6333 displayed as empty lines in the summary buffer.
6334
6335 @end table
6336
6337
6338 @menu
6339 * Customizing Threading::       Variables you can change to affect the threading.
6340 * Thread Commands::             Thread based commands in the summary buffer.
6341 @end menu
6342
6343
6344 @node Customizing Threading
6345 @subsection Customizing Threading
6346 @cindex customizing threading
6347
6348 @menu
6349 * Loose Threads::               How Gnus gathers loose threads into bigger threads.
6350 * Filling In Threads::          Making the threads displayed look fuller.
6351 * More Threading::              Even more variables for fiddling with threads.
6352 * Low-Level Threading::         You thought it was over... but you were wrong!
6353 @end menu
6354
6355
6356 @node Loose Threads
6357 @subsubsection Loose Threads
6358 @cindex <
6359 @cindex >
6360 @cindex loose threads
6361
6362 @table @code
6363 @item gnus-summary-make-false-root
6364 @vindex gnus-summary-make-false-root
6365 If non-@code{nil}, gnus will gather all loose subtrees into one big tree
6366 and create a dummy root at the top.  (Wait a minute.  Root at the top?
6367 Yup.)  Loose subtrees occur when the real root has expired, or you've
6368 read or killed the root in a previous session.
6369
6370 When there is no real root of a thread, gnus will have to fudge
6371 something.  This variable says what fudging method gnus should use.
6372 There are four possible values:
6373
6374 @iftex
6375 @iflatex
6376 \gnusfigure{The Summary Buffer}{390}{
6377 \put(0,0){\epsfig{figure=ps/summary-adopt,width=7.5cm}}
6378 \put(445,0){\makebox(0,0)[br]{\epsfig{figure=ps/summary-empty,width=7.5cm}}}
6379 \put(0,400){\makebox(0,0)[tl]{\epsfig{figure=ps/summary-none,width=7.5cm}}}
6380 \put(445,400){\makebox(0,0)[tr]{\epsfig{figure=ps/summary-dummy,width=7.5cm}}}
6381 }
6382 @end iflatex
6383 @end iftex
6384
6385 @cindex adopting articles
6386
6387 @table @code
6388
6389 @item adopt
6390 Gnus will make the first of the orphaned articles the parent.  This
6391 parent will adopt all the other articles.  The adopted articles will be
6392 marked as such by pointy brackets (@samp{<>}) instead of the standard
6393 square brackets (@samp{[]}).  This is the default method.
6394
6395 @item dummy
6396 @vindex gnus-summary-dummy-line-format
6397 @vindex gnus-summary-make-false-root-always
6398 Gnus will create a dummy summary line that will pretend to be the
6399 parent.  This dummy line does not correspond to any real article, so
6400 selecting it will just select the first real article after the dummy
6401 article.  @code{gnus-summary-dummy-line-format} is used to specify the
6402 format of the dummy roots.  It accepts only one format spec:  @samp{S},
6403 which is the subject of the article.  @xref{Formatting Variables}.
6404 If you want all threads to have a dummy root, even the non-gathered
6405 ones, set @code{gnus-summary-make-false-root-always} to @code{t}.
6406
6407 @item empty
6408 Gnus won't actually make any article the parent, but simply leave the
6409 subject field of all orphans except the first empty.  (Actually, it will
6410 use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
6411 Buffer Format}).)
6412
6413 @item none
6414 Don't make any article parent at all.  Just gather the threads and
6415 display them after one another.
6416
6417 @item nil
6418 Don't gather loose threads.
6419 @end table
6420
6421 @item gnus-summary-gather-subject-limit
6422 @vindex gnus-summary-gather-subject-limit
6423 Loose threads are gathered by comparing subjects of articles.  If this
6424 variable is @code{nil}, gnus requires an exact match between the
6425 subjects of the loose threads before gathering them into one big
6426 super-thread.  This might be too strict a requirement, what with the
6427 presence of stupid newsreaders that chop off long subject lines.  If
6428 you think so, set this variable to, say, 20 to require that only the
6429 first 20 characters of the subjects have to match.  If you set this
6430 variable to a really low number, you'll find that gnus will gather
6431 everything in sight into one thread, which isn't very helpful.
6432
6433 @cindex fuzzy article gathering
6434 If you set this variable to the special value @code{fuzzy}, gnus will
6435 use a fuzzy string comparison algorithm on the subjects (@pxref{Fuzzy
6436 Matching}).
6437
6438 @item gnus-simplify-subject-fuzzy-regexp
6439 @vindex gnus-simplify-subject-fuzzy-regexp
6440 This can either be a regular expression or list of regular expressions
6441 that match strings that will be removed from subjects if fuzzy subject
6442 simplification is used.
6443
6444 @item gnus-simplify-ignored-prefixes
6445 @vindex gnus-simplify-ignored-prefixes
6446 If you set @code{gnus-summary-gather-subject-limit} to something as low
6447 as 10, you might consider setting this variable to something sensible:
6448
6449 @c Written by Michael Ernst <mernst@cs.rice.edu>
6450 @lisp
6451 (setq gnus-simplify-ignored-prefixes
6452       (concat
6453        "\\`\\[?\\("
6454        (mapconcat
6455         'identity
6456         '("looking"
6457           "wanted" "followup" "summary\\( of\\)?"
6458           "help" "query" "problem" "question"
6459           "answer" "reference" "announce"
6460           "How can I" "How to" "Comparison of"
6461           ;; ...
6462           )
6463         "\\|")
6464        "\\)\\s *\\("
6465        (mapconcat 'identity
6466                   '("for" "for reference" "with" "about")
6467                   "\\|")
6468        "\\)?\\]?:?[ \t]*"))
6469 @end lisp
6470
6471 All words that match this regexp will be removed before comparing two
6472 subjects.
6473
6474 @item gnus-simplify-subject-functions
6475 @vindex gnus-simplify-subject-functions
6476 If non-@code{nil}, this variable overrides
6477 @code{gnus-summary-gather-subject-limit}.  This variable should be a
6478 list of functions to apply to the @code{Subject} string iteratively to
6479 arrive at the simplified version of the string.
6480
6481 Useful functions to put in this list include:
6482
6483 @table @code
6484 @item gnus-simplify-subject-re
6485 @findex gnus-simplify-subject-re
6486 Strip the leading @samp{Re:}.
6487
6488 @item gnus-simplify-subject-fuzzy
6489 @findex gnus-simplify-subject-fuzzy
6490 Simplify fuzzily.
6491
6492 @item gnus-simplify-whitespace
6493 @findex gnus-simplify-whitespace
6494 Remove excessive whitespace.
6495
6496 @item gnus-simplify-all-whitespace
6497 @findex gnus-simplify-all-whitespace
6498 Remove all whitespace.
6499 @end table
6500
6501 You may also write your own functions, of course.
6502
6503
6504 @item gnus-summary-gather-exclude-subject
6505 @vindex gnus-summary-gather-exclude-subject
6506 Since loose thread gathering is done on subjects only, that might lead
6507 to many false hits, especially with certain common subjects like
6508 @samp{} and @samp{(none)}.  To make the situation slightly better,
6509 you can use the regexp @code{gnus-summary-gather-exclude-subject} to say
6510 what subjects should be excluded from the gathering process.@*
6511 The default is @samp{^ *$\\|^(none)$}.
6512
6513 @item gnus-summary-thread-gathering-function
6514 @vindex gnus-summary-thread-gathering-function
6515 Gnus gathers threads by looking at @code{Subject} headers.  This means
6516 that totally unrelated articles may end up in the same ``thread'', which
6517 is confusing.  An alternate approach is to look at all the
6518 @code{Message-ID}s in all the @code{References} headers to find matches.
6519 This will ensure that no gathered threads ever include unrelated
6520 articles, but it also means that people who have posted with broken
6521 newsreaders won't be gathered properly.  The choice is yours---plague or
6522 cholera:
6523
6524 @table @code
6525 @item gnus-gather-threads-by-subject
6526 @findex gnus-gather-threads-by-subject
6527 This function is the default gathering function and looks at
6528 @code{Subject}s exclusively.
6529
6530 @item gnus-gather-threads-by-references
6531 @findex gnus-gather-threads-by-references
6532 This function looks at @code{References} headers exclusively.
6533 @end table
6534
6535 If you want to test gathering by @code{References}, you could say
6536 something like:
6537
6538 @lisp
6539 (setq gnus-summary-thread-gathering-function
6540       'gnus-gather-threads-by-references)
6541 @end lisp
6542
6543 @end table
6544
6545
6546 @node Filling In Threads
6547 @subsubsection Filling In Threads
6548
6549 @table @code
6550 @item gnus-fetch-old-headers
6551 @vindex gnus-fetch-old-headers
6552 If non-@code{nil}, gnus will attempt to build old threads by fetching
6553 more old headers---headers to articles marked as read.  If you
6554 would like to display as few summary lines as possible, but still
6555 connect as many loose threads as possible, you should set this variable
6556 to @code{some} or a number.  If you set it to a number, no more than
6557 that number of extra old headers will be fetched.  In either case,
6558 fetching old headers only works if the back end you are using carries
6559 overview files---this would normally be @code{nntp}, @code{nnspool},
6560 @code{nnml}, and @code{nnmaildir}.  Also remember that if the root of
6561 the thread has been expired by the server, there's not much Gnus can do
6562 about that.
6563
6564 This variable can also be set to @code{invisible}.  This won't have any
6565 visible effects, but is useful if you use the @kbd{A T} command a lot
6566 (@pxref{Finding the Parent}).
6567
6568 @item gnus-build-sparse-threads
6569 @vindex gnus-build-sparse-threads
6570 Fetching old headers can be slow.  A low-rent similar effect can be
6571 gotten by setting this variable to @code{some}.  Gnus will then look at
6572 the complete @code{References} headers of all articles and try to string
6573 together articles that belong in the same thread.  This will leave
6574 @dfn{gaps} in the threading display where gnus guesses that an article
6575 is missing from the thread.  (These gaps appear like normal summary
6576 lines.  If you select a gap, gnus will try to fetch the article in
6577 question.)  If this variable is @code{t}, gnus will display all these
6578 ``gaps'' without regard for whether they are useful for completing the
6579 thread or not.  Finally, if this variable is @code{more}, gnus won't cut
6580 off sparse leaf nodes that don't lead anywhere.  This variable is
6581 @code{nil} by default.
6582
6583 @item gnus-read-all-available-headers
6584 @vindex gnus-read-all-available-headers
6585 This is a rather obscure variable that few will find useful.  It's
6586 intended for those non-news newsgroups where the back end has to fetch
6587 quite a lot to present the summary buffer, and where it's impossible to
6588 go back to parents of articles.  This is mostly the case in the
6589 web-based groups, like the @code{nnultimate} groups.
6590
6591 If you don't use those, then it's safe to leave this as the default
6592 @code{nil}.  If you want to use this variable, it should be a regexp
6593 that matches the group name, or @code{t} for all groups.
6594
6595 @end table
6596
6597
6598 @node More Threading
6599 @subsubsection More Threading
6600
6601 @table @code
6602 @item gnus-show-threads
6603 @vindex gnus-show-threads
6604 If this variable is @code{nil}, no threading will be done, and all of
6605 the rest of the variables here will have no effect.  Turning threading
6606 off will speed group selection up a bit, but it is sure to make reading
6607 slower and more awkward.
6608
6609 @item gnus-thread-hide-subtree
6610 @vindex gnus-thread-hide-subtree
6611 If non-@code{nil}, all threads will be hidden when the summary buffer is
6612 generated.
6613
6614 This can also be a predicate specifier (@pxref{Predicate Specifiers}).
6615 Available predicates are @code{gnus-article-unread-p} and
6616 @code{gnus-article-unseen-p}).
6617
6618 Here's an example:
6619
6620 @lisp
6621 (setq gnus-thread-hide-subtree
6622       '(or gnus-article-unread-p
6623            gnus-article-unseen-p))
6624 @end lisp
6625
6626 (It's a pretty nonsensical example, since all unseen articles are also
6627 unread, but you get my drift.)
6628
6629
6630 @item gnus-thread-expunge-below
6631 @vindex gnus-thread-expunge-below
6632 All threads that have a total score (as defined by
6633 @code{gnus-thread-score-function}) less than this number will be
6634 expunged.  This variable is @code{nil} by default, which means that no
6635 threads are expunged.
6636
6637 @item gnus-thread-hide-killed
6638 @vindex gnus-thread-hide-killed
6639 if you kill a thread and this variable is non-@code{nil}, the subtree
6640 will be hidden.
6641
6642 @item gnus-thread-ignore-subject
6643 @vindex gnus-thread-ignore-subject
6644 Sometimes somebody changes the subject in the middle of a thread.  If
6645 this variable is non-@code{nil}, which is the default, the subject
6646 change is ignored.  If it is @code{nil}, a change in the subject will
6647 result in a new thread.
6648
6649 @item gnus-thread-indent-level
6650 @vindex gnus-thread-indent-level
6651 This is a number that says how much each sub-thread should be indented.
6652 The default is 4.
6653
6654 @item gnus-sort-gathered-threads-function
6655 @vindex gnus-sort-gathered-threads-function
6656 Sometimes, particularly with mailing lists, the order in which mails
6657 arrive locally is not necessarily the same as the order in which they
6658 arrived on the mailing list.  Consequently, when sorting sub-threads
6659 using the default @code{gnus-thread-sort-by-number}, responses can end
6660 up appearing before the article to which they are responding to.
6661 Setting this variable to an alternate value
6662 (e.g. @code{gnus-thread-sort-by-date}), in a group's parameters or in an
6663 appropriate hook (e.g. @code{gnus-summary-generate-hook}) can produce a
6664 more logical sub-thread ordering in such instances.
6665
6666 @end table
6667
6668
6669 @node Low-Level Threading
6670 @subsubsection Low-Level Threading
6671
6672 @table @code
6673
6674 @item gnus-parse-headers-hook
6675 @vindex gnus-parse-headers-hook
6676 Hook run before parsing any headers.  The default value is
6677 @code{(gnus-set-summary-default-charset)}, which sets up local value of
6678 @code{default-mime-charset} in summary buffer based on variable
6679 @code{gnus-newsgroup-default-charset-alist}.
6680
6681 @item gnus-alter-header-function
6682 @vindex gnus-alter-header-function
6683 If non-@code{nil}, this function will be called to allow alteration of
6684 article header structures.  The function is called with one parameter,
6685 the article header vector, which it may alter in any way.  For instance,
6686 if you have a mail-to-news gateway which alters the @code{Message-ID}s
6687 in systematic ways (by adding prefixes and such), you can use this
6688 variable to un-scramble the @code{Message-ID}s so that they are more
6689 meaningful.  Here's one example:
6690
6691 @lisp
6692 (setq gnus-alter-header-function 'my-alter-message-id)
6693
6694 (defun my-alter-message-id (header)
6695   (let ((id (mail-header-id header)))
6696     (when (string-match
6697            "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id)
6698       (mail-header-set-id
6699        (concat (match-string 1 id) "@@" (match-string 2 id))
6700        header))))
6701 @end lisp
6702
6703 @end table
6704
6705
6706 @node Thread Commands
6707 @subsection Thread Commands
6708 @cindex thread commands
6709
6710 @table @kbd
6711
6712 @item T k
6713 @itemx C-M-k
6714 @kindex T k (Summary)
6715 @kindex C-M-k (Summary)
6716 @findex gnus-summary-kill-thread
6717 Mark all articles in the current (sub-)thread as read
6718 (@code{gnus-summary-kill-thread}).  If the prefix argument is positive,
6719 remove all marks instead.  If the prefix argument is negative, tick
6720 articles instead.
6721
6722 @item T l
6723 @itemx C-M-l
6724 @kindex T l (Summary)
6725 @kindex C-M-l (Summary)
6726 @findex gnus-summary-lower-thread
6727 Lower the score of the current (sub-)thread
6728 (@code{gnus-summary-lower-thread}).
6729
6730 @item T i
6731 @kindex T i (Summary)
6732 @findex gnus-summary-raise-thread
6733 Increase the score of the current (sub-)thread
6734 (@code{gnus-summary-raise-thread}).
6735
6736 @item T #
6737 @kindex T # (Summary)
6738 @findex gnus-uu-mark-thread
6739 Set the process mark on the current (sub-)thread
6740 (@code{gnus-uu-mark-thread}).
6741
6742 @item T M-#
6743 @kindex T M-# (Summary)
6744 @findex gnus-uu-unmark-thread
6745 Remove the process mark from the current (sub-)thread
6746 (@code{gnus-uu-unmark-thread}).
6747
6748 @item T T
6749 @kindex T T (Summary)
6750 @findex gnus-summary-toggle-threads
6751 Toggle threading (@code{gnus-summary-toggle-threads}).
6752
6753 @item T s
6754 @kindex T s (Summary)
6755 @findex gnus-summary-show-thread
6756 Expose the (sub-)thread hidden under the current article, if any
6757 (@code{gnus-summary-show-thread}).
6758
6759 @item T h
6760 @kindex T h (Summary)
6761 @findex gnus-summary-hide-thread
6762 Hide the current (sub-)thread (@code{gnus-summary-hide-thread}).
6763
6764 @item T S
6765 @kindex T S (Summary)
6766 @findex gnus-summary-show-all-threads
6767 Expose all hidden threads (@code{gnus-summary-show-all-threads}).
6768
6769 @item T H
6770 @kindex T H (Summary)
6771 @findex gnus-summary-hide-all-threads
6772 Hide all threads (@code{gnus-summary-hide-all-threads}).
6773
6774 @item T t
6775 @kindex T t (Summary)
6776 @findex gnus-summary-rethread-current
6777 Re-thread the current article's thread
6778 (@code{gnus-summary-rethread-current}).  This works even when the
6779 summary buffer is otherwise unthreaded.
6780
6781 @item T ^
6782 @kindex T ^ (Summary)
6783 @findex gnus-summary-reparent-thread
6784 Make the current article the child of the marked (or previous) article
6785 (@code{gnus-summary-reparent-thread}).
6786
6787 @end table
6788
6789 The following commands are thread movement commands.  They all
6790 understand the numeric prefix.
6791
6792 @table @kbd
6793
6794 @item T n
6795 @kindex T n (Summary)
6796 @itemx C-M-f
6797 @kindex C-M-n (Summary)
6798 @itemx M-down
6799 @kindex M-down (Summary)
6800 @findex gnus-summary-next-thread
6801 Go to the next thread (@code{gnus-summary-next-thread}).
6802
6803 @item T p
6804 @kindex T p (Summary)
6805 @itemx C-M-b
6806 @kindex C-M-p (Summary)
6807 @itemx M-up
6808 @kindex M-up (Summary)
6809 @findex gnus-summary-prev-thread
6810 Go to the previous thread (@code{gnus-summary-prev-thread}).
6811
6812 @item T d
6813 @kindex T d (Summary)
6814 @findex gnus-summary-down-thread
6815 Descend the thread (@code{gnus-summary-down-thread}).
6816
6817 @item T u
6818 @kindex T u (Summary)
6819 @findex gnus-summary-up-thread
6820 Ascend the thread (@code{gnus-summary-up-thread}).
6821
6822 @item T o
6823 @kindex T o (Summary)
6824 @findex gnus-summary-top-thread
6825 Go to the top of the thread (@code{gnus-summary-top-thread}).
6826 @end table
6827
6828 @vindex gnus-thread-operation-ignore-subject
6829 If you ignore subject while threading, you'll naturally end up with
6830 threads that have several different subjects in them.  If you then issue
6831 a command like `T k' (@code{gnus-summary-kill-thread}) you might not
6832 wish to kill the entire thread, but just those parts of the thread that
6833 have the same subject as the current article.  If you like this idea,
6834 you can fiddle with @code{gnus-thread-operation-ignore-subject}.  If it
6835 is non-@code{nil} (which it is by default), subjects will be ignored
6836 when doing thread commands.  If this variable is @code{nil}, articles in
6837 the same thread with different subjects will not be included in the
6838 operation in question.  If this variable is @code{fuzzy}, only articles
6839 that have subjects fuzzily equal will be included (@pxref{Fuzzy
6840 Matching}).
6841
6842
6843 @node Sorting the Summary Buffer
6844 @section Sorting the Summary Buffer
6845
6846 @findex gnus-thread-sort-by-total-score
6847 @findex gnus-thread-sort-by-date
6848 @findex gnus-thread-sort-by-score
6849 @findex gnus-thread-sort-by-subject
6850 @findex gnus-thread-sort-by-author
6851 @findex gnus-thread-sort-by-number
6852 @findex gnus-thread-sort-by-random
6853 @vindex gnus-thread-sort-functions
6854 @findex gnus-thread-sort-by-most-recent-thread
6855 If you are using a threaded summary display, you can sort the threads by
6856 setting @code{gnus-thread-sort-functions}, which can be either a single
6857 function, a list of functions, or a list containing functions and
6858 @code{(not some-function)} elements.
6859
6860 By default, sorting is done on article numbers.  Ready-made sorting
6861 predicate functions include @code{gnus-thread-sort-by-number},
6862 @code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject},
6863 @code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score},
6864 @code{gnus-thread-sort-by-most-recent-number},
6865 @code{gnus-thread-sort-by-most-recent-date},
6866 @code{gnus-thread-sort-by-random} and
6867 @code{gnus-thread-sort-by-total-score}.
6868
6869 Each function takes two threads and returns non-@code{nil} if the first
6870 thread should be sorted before the other.  Note that sorting really is
6871 normally done by looking only at the roots of each thread.
6872
6873 If you use more than one function, the primary sort key should be the
6874 last function in the list.  You should probably always include
6875 @code{gnus-thread-sort-by-number} in the list of sorting
6876 functions---preferably first.  This will ensure that threads that are
6877 equal with respect to the other sort criteria will be displayed in
6878 ascending article order.
6879
6880 If you would like to sort by reverse score, then by subject, and finally
6881 by number, you could do something like:
6882
6883 @lisp
6884 (setq gnus-thread-sort-functions
6885       '(gnus-thread-sort-by-number
6886         gnus-thread-sort-by-subject
6887         (not gnus-thread-sort-by-total-score)))
6888 @end lisp
6889
6890 The threads that have highest score will be displayed first in the
6891 summary buffer.  When threads have the same score, they will be sorted
6892 alphabetically.  The threads that have the same score and the same
6893 subject will be sorted by number, which is (normally) the sequence in
6894 which the articles arrived.
6895
6896 If you want to sort by score and then reverse arrival order, you could
6897 say something like:
6898
6899 @lisp
6900 (setq gnus-thread-sort-functions
6901       '((lambda (t1 t2)
6902           (not (gnus-thread-sort-by-number t1 t2)))
6903         gnus-thread-sort-by-score))
6904 @end lisp
6905
6906 @vindex gnus-thread-score-function
6907 The function in the @code{gnus-thread-score-function} variable (default
6908 @code{+}) is used for calculating the total score of a thread.  Useful
6909 functions might be @code{max}, @code{min}, or squared means, or whatever
6910 tickles your fancy.
6911
6912 @findex gnus-article-sort-functions
6913 @findex gnus-article-sort-by-date
6914 @findex gnus-article-sort-by-score
6915 @findex gnus-article-sort-by-subject
6916 @findex gnus-article-sort-by-author
6917 @findex gnus-article-sort-by-random
6918 @findex gnus-article-sort-by-number
6919 If you are using an unthreaded display for some strange reason or
6920 other, you have to fiddle with the @code{gnus-article-sort-functions}
6921 variable.  It is very similar to the
6922 @code{gnus-thread-sort-functions}, except that it uses slightly
6923 different functions for article comparison.  Available sorting
6924 predicate functions are @code{gnus-article-sort-by-number},
6925 @code{gnus-article-sort-by-author},
6926 @code{gnus-article-sort-by-subject}, @code{gnus-article-sort-by-date},
6927 @code{gnus-article-sort-by-random}, and
6928 @code{gnus-article-sort-by-score}.
6929
6930 If you want to sort an unthreaded summary display by subject, you could
6931 say something like:
6932
6933 @lisp
6934 (setq gnus-article-sort-functions
6935       '(gnus-article-sort-by-number
6936         gnus-article-sort-by-subject))
6937 @end lisp
6938
6939
6940
6941 @node Asynchronous Fetching
6942 @section Asynchronous Article Fetching
6943 @cindex asynchronous article fetching
6944 @cindex article pre-fetch
6945 @cindex pre-fetch
6946
6947 If you read your news from an @sc{nntp} server that's far away, the
6948 network latencies may make reading articles a chore.  You have to wait
6949 for a while after pressing @kbd{n} to go to the next article before the
6950 article appears.  Why can't gnus just go ahead and fetch the article
6951 while you are reading the previous one?  Why not, indeed.
6952
6953 First, some caveats.  There are some pitfalls to using asynchronous
6954 article fetching, especially the way gnus does it.
6955
6956 Let's say you are reading article 1, which is short, and article 2 is
6957 quite long, and you are not interested in reading that.  Gnus does not
6958 know this, so it goes ahead and fetches article 2.  You decide to read
6959 article 3, but since gnus is in the process of fetching article 2, the
6960 connection is blocked.
6961
6962 To avoid these situations, gnus will open two (count 'em two)
6963 connections to the server.  Some people may think this isn't a very nice
6964 thing to do, but I don't see any real alternatives.  Setting up that
6965 extra connection takes some time, so gnus startup will be slower.
6966
6967 Gnus will fetch more articles than you will read.  This will mean that
6968 the link between your machine and the @sc{nntp} server will become more
6969 loaded than if you didn't use article pre-fetch.  The server itself will
6970 also become more loaded---both with the extra article requests, and the
6971 extra connection.
6972
6973 Ok, so now you know that you shouldn't really use this thing...  unless
6974 you really want to.
6975
6976 @vindex gnus-asynchronous
6977 Here's how:  Set @code{gnus-asynchronous} to @code{t}.  The rest should
6978 happen automatically.
6979
6980 @vindex gnus-use-article-prefetch
6981 You can control how many articles are to be pre-fetched by setting
6982 @code{gnus-use-article-prefetch}.  This is 30 by default, which means
6983 that when you read an article in the group, the back end will pre-fetch
6984 the next 30 articles.  If this variable is @code{t}, the back end will
6985 pre-fetch all the articles it can without bound.  If it is
6986 @code{nil}, no pre-fetching will be done.
6987
6988 @vindex gnus-async-prefetch-article-p
6989 @findex gnus-async-read-p
6990 There are probably some articles that you don't want to pre-fetch---read
6991 articles, for instance.  The @code{gnus-async-prefetch-article-p} variable controls whether an article is to be pre-fetched.  This function should
6992 return non-@code{nil} when the article in question is to be
6993 pre-fetched.  The default is @code{gnus-async-read-p}, which returns
6994 @code{nil} on read articles.  The function is called with an article
6995 data structure as the only parameter.
6996
6997 If, for instance, you wish to pre-fetch only unread articles shorter than 100 lines, you could say something like:
6998
6999 @lisp
7000 (defun my-async-short-unread-p (data)
7001   "Return non-nil for short, unread articles."
7002   (and (gnus-data-unread-p data)
7003        (< (mail-header-lines (gnus-data-header data))
7004           100)))
7005
7006 (setq gnus-async-prefetch-article-p 'my-async-short-unread-p)
7007 @end lisp
7008
7009 These functions will be called many, many times, so they should
7010 preferably be short and sweet to avoid slowing down gnus too much.
7011 It's probably a good idea to byte-compile things like this.
7012
7013 @vindex gnus-prefetched-article-deletion-strategy
7014 Articles have to be removed from the asynch buffer sooner or later.  The
7015 @code{gnus-prefetched-article-deletion-strategy} says when to remove
7016 articles.  This is a list that may contain the following elements:
7017
7018 @table @code
7019 @item read
7020 Remove articles when they are read.
7021
7022 @item exit
7023 Remove articles when exiting the group.
7024 @end table
7025
7026 The default value is @code{(read exit)}.
7027
7028 @c @vindex gnus-use-header-prefetch
7029 @c If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles
7030 @c from the next group.
7031
7032
7033 @node Article Caching
7034 @section Article Caching
7035 @cindex article caching
7036 @cindex caching
7037
7038 If you have an @emph{extremely} slow @sc{nntp} connection, you may
7039 consider turning article caching on.  Each article will then be stored
7040 locally under your home directory.  As you may surmise, this could
7041 potentially use @emph{huge} amounts of disk space, as well as eat up all
7042 your inodes so fast it will make your head swim.  In vodka.
7043
7044 Used carefully, though, it could be just an easier way to save articles.
7045
7046 @vindex gnus-use-long-file-name
7047 @vindex gnus-cache-directory
7048 @vindex gnus-use-cache
7049 To turn caching on, set @code{gnus-use-cache} to @code{t}.  By default,
7050 all articles ticked or marked as dormant will then be copied
7051 over to your local cache (@code{gnus-cache-directory}).  Whether this
7052 cache is flat or hierarchical is controlled by the
7053 @code{gnus-use-long-file-name} variable, as usual.
7054
7055 When re-selecting a ticked or dormant article, it will be fetched from the
7056 cache instead of from the server.  As articles in your cache will never
7057 expire, this might serve as a method of saving articles while still
7058 keeping them where they belong.  Just mark all articles you want to save
7059 as dormant, and don't worry.
7060
7061 When an article is marked as read, is it removed from the cache.
7062
7063 @vindex gnus-cache-remove-articles
7064 @vindex gnus-cache-enter-articles
7065 The entering/removal of articles from the cache is controlled by the
7066 @code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}
7067 variables.  Both are lists of symbols.  The first is @code{(ticked
7068 dormant)} by default, meaning that ticked and dormant articles will be
7069 put in the cache.  The latter is @code{(read)} by default, meaning that
7070 articles marked as read are removed from the cache.  Possibly
7071 symbols in these two lists are @code{ticked}, @code{dormant},
7072 @code{unread} and @code{read}.
7073
7074 @findex gnus-jog-cache
7075 So where does the massive article-fetching and storing come into the
7076 picture?  The @code{gnus-jog-cache} command will go through all
7077 subscribed newsgroups, request all unread articles, score them, and
7078 store them in the cache.  You should only ever, ever ever ever, use this
7079 command if 1) your connection to the @sc{nntp} server is really, really,
7080 really slow and 2) you have a really, really, really huge disk.
7081 Seriously.  One way to cut down on the number of articles downloaded is
7082 to score unwanted articles down and have them marked as read.  They will
7083 not then be downloaded by this command.
7084
7085 @vindex gnus-uncacheable-groups
7086 @vindex gnus-cacheable-groups
7087 It is likely that you do not want caching on all groups.  For instance,
7088 if your @code{nnml} mail is located under your home directory, it makes no
7089 sense to cache it somewhere else under your home directory.  Unless you
7090 feel that it's neat to use twice as much space.
7091
7092 To limit the caching, you could set @code{gnus-cacheable-groups} to a
7093 regexp of groups to cache, @samp{^nntp} for instance, or set the
7094 @code{gnus-uncacheable-groups} regexp to @samp{^nnml}, for instance.
7095 Both variables are @code{nil} by default.  If a group matches both
7096 variables, the group is not cached.
7097
7098 @findex gnus-cache-generate-nov-databases
7099 @findex gnus-cache-generate-active
7100 @vindex gnus-cache-active-file
7101 The cache stores information on what articles it contains in its active
7102 file (@code{gnus-cache-active-file}).  If this file (or any other parts
7103 of the cache) becomes all messed up for some reason or other, gnus
7104 offers two functions that will try to set things right.  @kbd{M-x
7105 gnus-cache-generate-nov-databases} will (re)build all the @sc{nov}
7106 files, and @kbd{gnus-cache-generate-active} will (re)generate the active
7107 file.
7108
7109 @findex gnus-cache-move-cache
7110 @code{gnus-cache-move-cache} will move your whole
7111 @code{gnus-cache-directory} to some other location. You get asked to
7112 where, isn't that cool?
7113
7114 @node Persistent Articles
7115 @section Persistent Articles
7116 @cindex persistent articles
7117
7118 Closely related to article caching, we have @dfn{persistent articles}.
7119 In fact, it's just a different way of looking at caching, and much more
7120 useful in my opinion.
7121
7122 Say you're reading a newsgroup, and you happen on to some valuable gem
7123 that you want to keep and treasure forever.  You'd normally just save it
7124 (using one of the many saving commands) in some file.  The problem with
7125 that is that it's just, well, yucky.  Ideally you'd prefer just having
7126 the article remain in the group where you found it forever; untouched by
7127 the expiry going on at the news server.
7128
7129 This is what a @dfn{persistent article} is---an article that just won't
7130 be deleted.  It's implemented using the normal cache functions, but
7131 you use two explicit commands for managing persistent articles:
7132
7133 @table @kbd
7134
7135 @item *
7136 @kindex * (Summary)
7137 @findex gnus-cache-enter-article
7138 Make the current article persistent (@code{gnus-cache-enter-article}).
7139
7140 @item M-*
7141 @kindex M-* (Summary)
7142 @findex gnus-cache-remove-article
7143 Remove the current article from the persistent articles
7144 (@code{gnus-cache-remove-article}).  This will normally delete the
7145 article.
7146 @end table
7147
7148 Both these commands understand the process/prefix convention.
7149
7150 To avoid having all ticked articles (and stuff) entered into the cache,
7151 you should set @code{gnus-use-cache} to @code{passive} if you're just
7152 interested in persistent articles:
7153
7154 @lisp
7155 (setq gnus-use-cache 'passive)
7156 @end lisp
7157
7158
7159 @node Article Backlog
7160 @section Article Backlog
7161 @cindex backlog
7162 @cindex article backlog
7163
7164 If you have a slow connection, but the idea of using caching seems
7165 unappealing to you (and it is, really), you can help the situation some
7166 by switching on the @dfn{backlog}.  This is where gnus will buffer
7167 already read articles so that it doesn't have to re-fetch articles
7168 you've already read.  This only helps if you are in the habit of
7169 re-selecting articles you've recently read, of course.  If you never do
7170 that, turning the backlog on will slow gnus down a little bit, and
7171 increase memory usage some.
7172
7173 @vindex gnus-keep-backlog
7174 If you set @code{gnus-keep-backlog} to a number @var{n}, gnus will store
7175 at most @var{n} old articles in a buffer for later re-fetching.  If this
7176 variable is non-@code{nil} and is not a number, gnus will store
7177 @emph{all} read articles, which means that your Emacs will grow without
7178 bound before exploding and taking your machine down with you.  I put
7179 that in there just to keep y'all on your toes.
7180
7181 The default value is 20.
7182
7183
7184 @node Saving Articles
7185 @section Saving Articles
7186 @cindex saving articles
7187
7188 Gnus can save articles in a number of ways.  Below is the documentation
7189 for saving articles in a fairly straight-forward fashion (i.e., little
7190 processing of the article is done before it is saved).  For a different
7191 approach (uudecoding, unsharing) you should use @code{gnus-uu}
7192 (@pxref{Decoding Articles}).
7193
7194 For the commands listed here, the target is a file.  If you want to
7195 save to a group, see the @kbd{B c} (@code{gnus-summary-copy-article})
7196 command (@pxref{Mail Group Commands}).
7197
7198 @vindex gnus-save-all-headers
7199 If @code{gnus-save-all-headers} is non-@code{nil}, gnus will not delete
7200 unwanted headers before saving the article.
7201
7202 @vindex gnus-saved-headers
7203 If the preceding variable is @code{nil}, all headers that match the
7204 @code{gnus-saved-headers} regexp will be kept, while the rest will be
7205 deleted before saving.
7206
7207 @table @kbd
7208
7209 @item O o
7210 @itemx o
7211 @kindex O o (Summary)
7212 @kindex o (Summary)
7213 @findex gnus-summary-save-article
7214 @c @icon{gnus-summary-save-article}
7215 Save the current article using the default article saver
7216 (@code{gnus-summary-save-article}).
7217
7218 @item O m
7219 @kindex O m (Summary)
7220 @findex gnus-summary-save-article-mail
7221 Save the current article in mail format
7222 (@code{gnus-summary-save-article-mail}).
7223
7224 @item O r
7225 @kindex O r (Summary)
7226 @findex gnus-summary-save-article-rmail
7227 Save the current article in rmail format
7228 (@code{gnus-summary-save-article-rmail}).
7229
7230 @item O f
7231 @kindex O f (Summary)
7232 @findex gnus-summary-save-article-file
7233 @c @icon{gnus-summary-save-article-file}
7234 Save the current article in plain file format
7235 (@code{gnus-summary-save-article-file}).
7236
7237 @item O F
7238 @kindex O F (Summary)
7239 @findex gnus-summary-write-article-file
7240 Write the current article in plain file format, overwriting any previous
7241 file contents (@code{gnus-summary-write-article-file}).
7242
7243 @item O b
7244 @kindex O b (Summary)
7245 @findex gnus-summary-save-article-body-file
7246 Save the current article body in plain file format
7247 (@code{gnus-summary-save-article-body-file}).
7248
7249 @item O h
7250 @kindex O h (Summary)
7251 @findex gnus-summary-save-article-folder
7252 Save the current article in mh folder format
7253 (@code{gnus-summary-save-article-folder}).
7254
7255 @item O v
7256 @kindex O v (Summary)
7257 @findex gnus-summary-save-article-vm
7258 Save the current article in a VM folder
7259 (@code{gnus-summary-save-article-vm}).
7260
7261 @item O p
7262 @itemx |
7263 @kindex O p (Summary)
7264 @kindex | (Summary)
7265 @findex gnus-summary-pipe-output
7266 Save the current article in a pipe.  Uhm, like, what I mean is---Pipe
7267 the current article to a process (@code{gnus-summary-pipe-output}).
7268 If given a symbolic prefix (@pxref{Symbolic Prefixes}), include the
7269 complete headers in the piped output.
7270
7271 @item O P
7272 @kindex O P (Summary)
7273 @findex gnus-summary-muttprint
7274 @vindex gnus-summary-muttprint-program
7275 Save the current article into muttprint. That is, print it using the
7276 external program Muttprint (see
7277 @uref{http://muttprint.sourceforge.net/}). The program name and
7278 options to use is controlled by the variable
7279 @code{gnus-summary-muttprint-program}. (@code{gnus-summary-muttprint}).
7280
7281 @end table
7282
7283 @vindex gnus-prompt-before-saving
7284 All these commands use the process/prefix convention
7285 (@pxref{Process/Prefix}).  If you save bunches of articles using these
7286 functions, you might get tired of being prompted for files to save each
7287 and every article in.  The prompting action is controlled by
7288 the @code{gnus-prompt-before-saving} variable, which is @code{always} by
7289 default, giving you that excessive prompting action you know and
7290 loathe.  If you set this variable to @code{t} instead, you'll be prompted
7291 just once for each series of articles you save.  If you like to really
7292 have Gnus do all your thinking for you, you can even set this variable
7293 to @code{nil}, which means that you will never be prompted for files to
7294 save articles in.  Gnus will simply save all the articles in the default
7295 files.
7296
7297
7298 @vindex gnus-default-article-saver
7299 You can customize the @code{gnus-default-article-saver} variable to make
7300 gnus do what you want it to.  You can use any of the six ready-made
7301 functions below, or you can create your own.
7302
7303 @table @code
7304
7305 @item gnus-summary-save-in-rmail
7306 @findex gnus-summary-save-in-rmail
7307 @vindex gnus-rmail-save-name
7308 @findex gnus-plain-save-name
7309 This is the default format, @dfn{babyl}.  Uses the function in the
7310 @code{gnus-rmail-save-name} variable to get a file name to save the
7311 article in.  The default is @code{gnus-plain-save-name}.
7312
7313 @item gnus-summary-save-in-mail
7314 @findex gnus-summary-save-in-mail
7315 @vindex gnus-mail-save-name
7316 Save in a Unix mail (mbox) file.  Uses the function in the
7317 @code{gnus-mail-save-name} variable to get a file name to save the
7318 article in.  The default is @code{gnus-plain-save-name}.
7319
7320 @item gnus-summary-save-in-file
7321 @findex gnus-summary-save-in-file
7322 @vindex gnus-file-save-name
7323 @findex gnus-numeric-save-name
7324 Append the article straight to an ordinary file.  Uses the function in
7325 the @code{gnus-file-save-name} variable to get a file name to save the
7326 article in.  The default is @code{gnus-numeric-save-name}.
7327
7328 @item gnus-summary-write-to-file
7329 @findex gnus-summary-write-to-file
7330 Write the article straight to an ordinary file.  The file is
7331 overwritten if it exists.  Uses the function in the
7332 @code{gnus-file-save-name} variable to get a file name to save the
7333 article in.  The default is @code{gnus-numeric-save-name}.
7334
7335 @item gnus-summary-save-body-in-file
7336 @findex gnus-summary-save-body-in-file
7337 Append the article body to an ordinary file.  Uses the function in the
7338 @code{gnus-file-save-name} variable to get a file name to save the
7339 article in.  The default is @code{gnus-numeric-save-name}.
7340
7341 @item gnus-summary-save-in-folder
7342 @findex gnus-summary-save-in-folder
7343 @findex gnus-folder-save-name
7344 @findex gnus-Folder-save-name
7345 @vindex gnus-folder-save-name
7346 @cindex rcvstore
7347 @cindex MH folders
7348 Save the article to an MH folder using @code{rcvstore} from the MH
7349 library.  Uses the function in the @code{gnus-folder-save-name} variable
7350 to get a file name to save the article in.  The default is
7351 @code{gnus-folder-save-name}, but you can also use
7352 @code{gnus-Folder-save-name}, which creates capitalized names.
7353
7354 @item gnus-summary-save-in-vm
7355 @findex gnus-summary-save-in-vm
7356 Save the article in a VM folder.  You have to have the VM mail
7357 reader to use this setting.
7358 @end table
7359
7360 @vindex gnus-article-save-directory
7361 All of these functions, except for the last one, will save the article
7362 in the @code{gnus-article-save-directory}, which is initialized from the
7363 @code{SAVEDIR} environment variable.  This is @file{~/News/} by
7364 default.
7365
7366 As you can see above, the functions use different functions to find a
7367 suitable name of a file to save the article in.  Below is a list of
7368 available functions that generate names:
7369
7370 @table @code
7371
7372 @item gnus-Numeric-save-name
7373 @findex gnus-Numeric-save-name
7374 File names like @file{~/News/Alt.andrea-dworkin/45}.
7375
7376 @item gnus-numeric-save-name
7377 @findex gnus-numeric-save-name
7378 File names like @file{~/News/alt.andrea-dworkin/45}.
7379
7380 @item gnus-Plain-save-name
7381 @findex gnus-Plain-save-name
7382 File names like @file{~/News/Alt.andrea-dworkin}.
7383
7384 @item gnus-plain-save-name
7385 @findex gnus-plain-save-name
7386 File names like @file{~/News/alt.andrea-dworkin}.
7387
7388 @item gnus-sender-save-name
7389 @findex gnus-sender-save-name
7390 File names like @file{~/News/larsi}.
7391 @end table
7392
7393 @vindex gnus-split-methods
7394 You can have gnus suggest where to save articles by plonking a regexp into
7395 the @code{gnus-split-methods} alist.  For instance, if you would like to
7396 save articles related to gnus in the file @file{gnus-stuff}, and articles
7397 related to VM in @code{vm-stuff}, you could set this variable to something
7398 like:
7399
7400 @lisp
7401 (("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff")
7402  ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff")
7403  (my-choosing-function "../other-dir/my-stuff")
7404  ((equal gnus-newsgroup-name "mail.misc") "mail-stuff"))
7405 @end lisp
7406
7407 We see that this is a list where each element is a list that has two
7408 elements---the @dfn{match} and the @dfn{file}.  The match can either be
7409 a string (in which case it is used as a regexp to match on the article
7410 head); it can be a symbol (which will be called as a function with the
7411 group name as a parameter); or it can be a list (which will be
7412 @code{eval}ed).  If any of these actions have a non-@code{nil} result,
7413 the @dfn{file} will be used as a default prompt.  In addition, the
7414 result of the operation itself will be used if the function or form
7415 called returns a string or a list of strings.
7416
7417 You basically end up with a list of file names that might be used when
7418 saving the current article.  (All ``matches'' will be used.)  You will
7419 then be prompted for what you really want to use as a name, with file
7420 name completion over the results from applying this variable.
7421
7422 This variable is @code{((gnus-article-archive-name))} by default, which
7423 means that gnus will look at the articles it saves for an
7424 @code{Archive-name} line and use that as a suggestion for the file
7425 name.
7426
7427 Here's an example function to clean up file names somewhat.  If you have
7428 lots of mail groups called things like
7429 @samp{nnml:mail.whatever}, you may want to chop off the beginning of
7430 these group names before creating the file name to save to.  The
7431 following will do just that:
7432
7433 @lisp
7434 (defun my-save-name (group)
7435   (when (string-match "^nnml:mail." group)
7436     (substring group (match-end 0))))
7437
7438 (setq gnus-split-methods
7439       '((gnus-article-archive-name)
7440         (my-save-name)))
7441 @end lisp
7442
7443
7444 @vindex gnus-use-long-file-name
7445 Finally, you have the @code{gnus-use-long-file-name} variable.  If it is
7446 @code{nil}, all the preceding functions will replace all periods
7447 (@samp{.}) in the group names with slashes (@samp{/})---which means that
7448 the functions will generate hierarchies of directories instead of having
7449 all the files in the top level directory
7450 (@file{~/News/alt/andrea-dworkin} instead of
7451 @file{~/News/alt.andrea-dworkin}.)  This variable is @code{t} by default
7452 on most systems.  However, for historical reasons, this is @code{nil} on
7453 Xenix and usg-unix-v machines by default.
7454
7455 This function also affects kill and score file names.  If this variable
7456 is a list, and the list contains the element @code{not-score}, long file
7457 names will not be used for score files, if it contains the element
7458 @code{not-save}, long file names will not be used for saving, and if it
7459 contains the element @code{not-kill}, long file names will not be used
7460 for kill files.
7461
7462 If you'd like to save articles in a hierarchy that looks something like
7463 a spool, you could
7464
7465 @lisp
7466 (setq gnus-use-long-file-name '(not-save)) ; to get a hierarchy
7467 (setq gnus-default-article-saver
7468       'gnus-summary-save-in-file) ; no encoding
7469 @end lisp
7470
7471 Then just save with @kbd{o}.  You'd then read this hierarchy with
7472 ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and
7473 the top level directory as the argument (@file{~/News/}).  Then just walk
7474 around to the groups/directories with @code{nneething}.
7475
7476
7477 @node Decoding Articles
7478 @section Decoding Articles
7479 @cindex decoding articles
7480
7481 Sometime users post articles (or series of articles) that have been
7482 encoded in some way or other.  Gnus can decode them for you.
7483
7484 @menu
7485 * Uuencoded Articles::          Uudecode articles.
7486 * Shell Archives::              Unshar articles.
7487 * PostScript Files::            Split PostScript.
7488 * Other Files::                 Plain save and binhex.
7489 * Decoding Variables::          Variables for a happy decoding.
7490 * Viewing Files::               You want to look at the result of the decoding?
7491 @end menu
7492
7493 @cindex series
7494 @cindex article series
7495 All these functions use the process/prefix convention
7496 (@pxref{Process/Prefix}) for finding out what articles to work on, with
7497 the extension that a ``single article'' means ``a single series''.  Gnus
7498 can find out by itself what articles belong to a series, decode all the
7499 articles and unpack/view/save the resulting file(s).
7500
7501 Gnus guesses what articles are in the series according to the following
7502 simplish rule: The subjects must be (nearly) identical, except for the
7503 last two numbers of the line.  (Spaces are largely ignored, however.)
7504
7505 For example: If you choose a subject called @samp{cat.gif (2/3)}, gnus
7506 will find all the articles that match the regexp @samp{^cat.gif
7507 ([0-9]+/[0-9]+).*$}.
7508
7509 Subjects that are non-standard, like @samp{cat.gif (2/3) Part 6 of a
7510 series}, will not be properly recognized by any of the automatic viewing
7511 commands, and you have to mark the articles manually with @kbd{#}.
7512
7513
7514 @node Uuencoded Articles
7515 @subsection Uuencoded Articles
7516 @cindex uudecode
7517 @cindex uuencoded articles
7518
7519 @table @kbd
7520
7521 @item X u
7522 @kindex X u (Summary)
7523 @findex gnus-uu-decode-uu
7524 @c @icon{gnus-uu-decode-uu}
7525 Uudecodes the current series (@code{gnus-uu-decode-uu}).
7526
7527 @item X U
7528 @kindex X U (Summary)
7529 @findex gnus-uu-decode-uu-and-save
7530 Uudecodes and saves the current series
7531 (@code{gnus-uu-decode-uu-and-save}).
7532
7533 @item X v u
7534 @kindex X v u (Summary)
7535 @findex gnus-uu-decode-uu-view
7536 Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}).
7537
7538 @item X v U
7539 @kindex X v U (Summary)
7540 @findex gnus-uu-decode-uu-and-save-view
7541 Uudecodes, views and saves the current series
7542 (@code{gnus-uu-decode-uu-and-save-view}).
7543
7544 @end table
7545
7546 Remember that these all react to the presence of articles marked with
7547 the process mark.  If, for instance, you'd like to decode and save an
7548 entire newsgroup, you'd typically do @kbd{M P a}
7549 (@code{gnus-uu-mark-all}) and then @kbd{X U}
7550 (@code{gnus-uu-decode-uu-and-save}).
7551
7552 All this is very much different from how @code{gnus-uu} worked with
7553 @sc{gnus 4.1}, where you had explicit keystrokes for everything under
7554 the sun.  This version of @code{gnus-uu} generally assumes that you mark
7555 articles in some way (@pxref{Setting Process Marks}) and then press
7556 @kbd{X u}.
7557
7558 @vindex gnus-uu-notify-files
7559 Note: When trying to decode articles that have names matching
7560 @code{gnus-uu-notify-files}, which is hard-coded to
7561 @samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will
7562 automatically post an article on @samp{comp.unix.wizards} saying that
7563 you have just viewed the file in question.  This feature can't be turned
7564 off.
7565
7566
7567 @node Shell Archives
7568 @subsection Shell Archives
7569 @cindex unshar
7570 @cindex shell archives
7571 @cindex shared articles
7572
7573 Shell archives (``shar files'') used to be a popular way to distribute
7574 sources, but it isn't used all that much today.  In any case, we have
7575 some commands to deal with these:
7576
7577 @table @kbd
7578
7579 @item X s
7580 @kindex X s (Summary)
7581 @findex gnus-uu-decode-unshar
7582 Unshars the current series (@code{gnus-uu-decode-unshar}).
7583
7584 @item X S
7585 @kindex X S (Summary)
7586 @findex gnus-uu-decode-unshar-and-save
7587 Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}).
7588
7589 @item X v s
7590 @kindex X v s (Summary)
7591 @findex gnus-uu-decode-unshar-view
7592 Unshars and views the current series (@code{gnus-uu-decode-unshar-view}).
7593
7594 @item X v S
7595 @kindex X v S (Summary)
7596 @findex gnus-uu-decode-unshar-and-save-view
7597 Unshars, views and saves the current series
7598 (@code{gnus-uu-decode-unshar-and-save-view}).
7599 @end table
7600
7601
7602 @node PostScript Files
7603 @subsection PostScript Files
7604 @cindex PostScript
7605
7606 @table @kbd
7607
7608 @item X p
7609 @kindex X p (Summary)
7610 @findex gnus-uu-decode-postscript
7611 Unpack the current PostScript series (@code{gnus-uu-decode-postscript}).
7612
7613 @item X P
7614 @kindex X P (Summary)
7615 @findex gnus-uu-decode-postscript-and-save
7616 Unpack and save the current PostScript series
7617 (@code{gnus-uu-decode-postscript-and-save}).
7618
7619 @item X v p
7620 @kindex X v p (Summary)
7621 @findex gnus-uu-decode-postscript-view
7622 View the current PostScript series
7623 (@code{gnus-uu-decode-postscript-view}).
7624
7625 @item X v P
7626 @kindex X v P (Summary)
7627 @findex gnus-uu-decode-postscript-and-save-view
7628 View and save the current PostScript series
7629 (@code{gnus-uu-decode-postscript-and-save-view}).
7630 @end table
7631
7632
7633 @node Other Files
7634 @subsection Other Files
7635
7636 @table @kbd
7637 @item X o
7638 @kindex X o (Summary)
7639 @findex gnus-uu-decode-save
7640 Save the current series
7641 (@code{gnus-uu-decode-save}).
7642
7643 @item X b
7644 @kindex X b (Summary)
7645 @findex gnus-uu-decode-binhex
7646 Unbinhex the current series (@code{gnus-uu-decode-binhex}).  This
7647 doesn't really work yet.
7648 @end table
7649
7650
7651 @node Decoding Variables
7652 @subsection Decoding Variables
7653
7654 Adjective, not verb.
7655
7656 @menu
7657 * Rule Variables::              Variables that say how a file is to be viewed.
7658 * Other Decode Variables::      Other decode variables.
7659 * Uuencoding and Posting::      Variables for customizing uuencoding.
7660 @end menu
7661
7662
7663 @node Rule Variables
7664 @subsubsection Rule Variables
7665 @cindex rule variables
7666
7667 Gnus uses @dfn{rule variables} to decide how to view a file.  All these
7668 variables are of the form
7669
7670 @lisp
7671       (list '(regexp1 command2)
7672             '(regexp2 command2)
7673             ...)
7674 @end lisp
7675
7676 @table @code
7677
7678 @item gnus-uu-user-view-rules
7679 @vindex gnus-uu-user-view-rules
7680 @cindex sox
7681 This variable is consulted first when viewing files.  If you wish to use,
7682 for instance, @code{sox} to convert an @samp{.au} sound file, you could
7683 say something like:
7684 @lisp
7685 (setq gnus-uu-user-view-rules
7686       (list '("\\\\.au$" "sox %s -t .aiff > /dev/audio")))
7687 @end lisp
7688
7689 @item gnus-uu-user-view-rules-end
7690 @vindex gnus-uu-user-view-rules-end
7691 This variable is consulted if gnus couldn't make any matches from the
7692 user and default view rules.
7693
7694 @item gnus-uu-user-archive-rules
7695 @vindex gnus-uu-user-archive-rules
7696 This variable can be used to say what commands should be used to unpack
7697 archives.
7698 @end table
7699
7700
7701 @node Other Decode Variables
7702 @subsubsection Other Decode Variables
7703
7704 @table @code
7705 @vindex gnus-uu-grabbed-file-functions
7706
7707 @item gnus-uu-grabbed-file-functions
7708 All functions in this list will be called right after each file has been
7709 successfully decoded---so that you can move or view files right away,
7710 and don't have to wait for all files to be decoded before you can do
7711 anything.  Ready-made functions you can put in this list are:
7712
7713 @table @code
7714
7715 @item gnus-uu-grab-view
7716 @findex gnus-uu-grab-view
7717 View the file.
7718
7719 @item gnus-uu-grab-move
7720 @findex gnus-uu-grab-move
7721 Move the file (if you're using a saving function.)
7722 @end table
7723
7724 @item gnus-uu-be-dangerous
7725 @vindex gnus-uu-be-dangerous
7726 Specifies what to do if unusual situations arise during decoding.  If
7727 @code{nil}, be as conservative as possible.  If @code{t}, ignore things
7728 that didn't work, and overwrite existing files.  Otherwise, ask each
7729 time.
7730
7731 @item gnus-uu-ignore-files-by-name
7732 @vindex gnus-uu-ignore-files-by-name
7733 Files with name matching this regular expression won't be viewed.
7734
7735 @item gnus-uu-ignore-files-by-type
7736 @vindex gnus-uu-ignore-files-by-type
7737 Files with a @sc{mime} type matching this variable won't be viewed.
7738 Note that Gnus tries to guess what type the file is based on the name.
7739 @code{gnus-uu} is not a @sc{mime} package (yet), so this is slightly
7740 kludgey.
7741
7742 @item gnus-uu-tmp-dir
7743 @vindex gnus-uu-tmp-dir
7744 Where @code{gnus-uu} does its work.
7745
7746 @item gnus-uu-do-not-unpack-archives
7747 @vindex gnus-uu-do-not-unpack-archives
7748 Non-@code{nil} means that @code{gnus-uu} won't peek inside archives
7749 looking for files to display.
7750
7751 @item gnus-uu-view-and-save
7752 @vindex gnus-uu-view-and-save
7753 Non-@code{nil} means that the user will always be asked to save a file
7754 after viewing it.
7755
7756 @item gnus-uu-ignore-default-view-rules
7757 @vindex gnus-uu-ignore-default-view-rules
7758 Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing
7759 rules.
7760
7761 @item gnus-uu-ignore-default-archive-rules
7762 @vindex gnus-uu-ignore-default-archive-rules
7763 Non-@code{nil} means that @code{gnus-uu} will ignore the default archive
7764 unpacking commands.
7765
7766 @item gnus-uu-kill-carriage-return
7767 @vindex gnus-uu-kill-carriage-return
7768 Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns
7769 from articles.
7770
7771 @item gnus-uu-unmark-articles-not-decoded
7772 @vindex gnus-uu-unmark-articles-not-decoded
7773 Non-@code{nil} means that @code{gnus-uu} will mark unsuccessfully
7774 decoded articles as unread.
7775
7776 @item gnus-uu-correct-stripped-uucode
7777 @vindex gnus-uu-correct-stripped-uucode
7778 Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix
7779 uuencoded files that have had trailing spaces deleted.
7780
7781 @item gnus-uu-pre-uudecode-hook
7782 @vindex gnus-uu-pre-uudecode-hook
7783 Hook run before sending a message to @code{uudecode}.
7784
7785 @item gnus-uu-view-with-metamail
7786 @vindex gnus-uu-view-with-metamail
7787 @cindex metamail
7788 Non-@code{nil} means that @code{gnus-uu} will ignore the viewing
7789 commands defined by the rule variables and just fudge a @sc{mime}
7790 content type based on the file name.  The result will be fed to
7791 @code{metamail} for viewing.
7792
7793 @item gnus-uu-save-in-digest
7794 @vindex gnus-uu-save-in-digest
7795 Non-@code{nil} means that @code{gnus-uu}, when asked to save without
7796 decoding, will save in digests.  If this variable is @code{nil},
7797 @code{gnus-uu} will just save everything in a file without any
7798 embellishments.  The digesting almost conforms to RFC 1153---no easy way
7799 to specify any meaningful volume and issue numbers were found, so I
7800 simply dropped them.
7801
7802 @end table
7803
7804
7805 @node Uuencoding and Posting
7806 @subsubsection Uuencoding and Posting
7807
7808 @table @code
7809
7810 @item gnus-uu-post-include-before-composing
7811 @vindex gnus-uu-post-include-before-composing
7812 Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode
7813 before you compose the article.  If this variable is @code{t}, you can
7814 either include an encoded file with @kbd{C-c C-i} or have one included
7815 for you when you post the article.
7816
7817 @item gnus-uu-post-length
7818 @vindex gnus-uu-post-length
7819 Maximum length of an article.  The encoded file will be split into how
7820 many articles it takes to post the entire file.
7821
7822 @item gnus-uu-post-threaded
7823 @vindex gnus-uu-post-threaded
7824 Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a
7825 thread.  This may not be smart, as no other decoder I have seen is able
7826 to follow threads when collecting uuencoded articles.  (Well, I have
7827 seen one package that does that---@code{gnus-uu}, but somehow, I don't
7828 think that counts...) Default is @code{nil}.
7829
7830 @item gnus-uu-post-separate-description
7831 @vindex gnus-uu-post-separate-description
7832 Non-@code{nil} means that the description will be posted in a separate
7833 article.  The first article will typically be numbered (0/x).  If this
7834 variable is @code{nil}, the description the user enters will be included
7835 at the beginning of the first article, which will be numbered (1/x).
7836 Default is @code{t}.
7837
7838 @end table
7839
7840
7841 @node Viewing Files
7842 @subsection Viewing Files
7843 @cindex viewing files
7844 @cindex pseudo-articles
7845
7846 After decoding, if the file is some sort of archive, gnus will attempt
7847 to unpack the archive and see if any of the files in the archive can be
7848 viewed.  For instance, if you have a gzipped tar file @file{pics.tar.gz}
7849 containing the files @file{pic1.jpg} and @file{pic2.gif}, gnus will
7850 uncompress and de-tar the main file, and then view the two pictures.
7851 This unpacking process is recursive, so if the archive contains archives
7852 of archives, it'll all be unpacked.
7853
7854 Finally, gnus will normally insert a @dfn{pseudo-article} for each
7855 extracted file into the summary buffer.  If you go to these
7856 ``articles'', you will be prompted for a command to run (usually Gnus
7857 will make a suggestion), and then the command will be run.
7858
7859 @vindex gnus-view-pseudo-asynchronously
7860 If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait
7861 until the viewing is done before proceeding.
7862
7863 @vindex gnus-view-pseudos
7864 If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert
7865 the pseudo-articles into the summary buffer, but view them
7866 immediately.  If this variable is @code{not-confirm}, the user won't even
7867 be asked for a confirmation before viewing is done.
7868
7869 @vindex gnus-view-pseudos-separately
7870 If @code{gnus-view-pseudos-separately} is non-@code{nil}, one
7871 pseudo-article will be created for each file to be viewed.  If
7872 @code{nil}, all files that use the same viewing command will be given as
7873 a list of parameters to that command.
7874
7875 @vindex gnus-insert-pseudo-articles
7876 If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert
7877 pseudo-articles when decoding.  It is @code{t} by default.
7878
7879 So; there you are, reading your @emph{pseudo-articles} in your
7880 @emph{virtual newsgroup} from the @emph{virtual server}; and you think:
7881 Why isn't anything real anymore? How did we get here?
7882
7883
7884 @node Article Treatment
7885 @section Article Treatment
7886
7887 Reading through this huge manual, you may have quite forgotten that the
7888 object of newsreaders is to actually, like, read what people have
7889 written.  Reading articles.  Unfortunately, people are quite bad at
7890 writing, so there are tons of functions and variables to make reading
7891 these articles easier.
7892
7893 @menu
7894 * Article Highlighting::        You want to make the article look like fruit salad.
7895 * Article Fontisizing::         Making emphasized text look nice.
7896 * Article Hiding::              You also want to make certain info go away.
7897 * Article Washing::             Lots of way-neat functions to make life better.
7898 * Article Header::              Doing various header transformations.
7899 * Article Buttons::             Click on URLs, Message-IDs, addresses and the like.
7900 * Article Date::                Grumble, UT!
7901 * Article Display::             Display various stuff---X-Face, Picons, Smileys
7902 * Article Signature::           What is a signature?
7903 * Article Miscellania::         Various other stuff.
7904 @end menu
7905
7906
7907 @node Article Highlighting
7908 @subsection Article Highlighting
7909 @cindex highlighting
7910
7911 Not only do you want your article buffer to look like fruit salad, but
7912 you want it to look like technicolor fruit salad.
7913
7914 @table @kbd
7915
7916 @item W H a
7917 @kindex W H a (Summary)
7918 @findex gnus-article-highlight
7919 @findex gnus-article-maybe-highlight
7920 Do much highlighting of the current article
7921 (@code{gnus-article-highlight}).  This function highlights header, cited
7922 text, the signature, and adds buttons to the body and the head.
7923
7924 @item W H h
7925 @kindex W H h (Summary)
7926 @findex gnus-article-highlight-headers
7927 @vindex gnus-header-face-alist
7928 Highlight the headers (@code{gnus-article-highlight-headers}).  The
7929 highlighting will be done according to the @code{gnus-header-face-alist}
7930 variable, which is a list where each element has the form
7931 @code{(@var{regexp} @var{name} @var{content})}.
7932 @var{regexp} is a regular expression for matching the
7933 header, @var{name} is the face used for highlighting the header name
7934 (@pxref{Faces and Fonts}) and @var{content} is the face for highlighting
7935 the header value.  The first match made will be used.  Note that
7936 @var{regexp} shouldn't have @samp{^} prepended---Gnus will add one.
7937
7938 @item W H c
7939 @kindex W H c (Summary)
7940 @findex gnus-article-highlight-citation
7941 Highlight cited text (@code{gnus-article-highlight-citation}).
7942
7943 Some variables to customize the citation highlights:
7944
7945 @table @code
7946 @vindex gnus-cite-parse-max-size
7947
7948 @item gnus-cite-parse-max-size
7949 If the article size if bigger than this variable (which is 25000 by
7950 default), no citation highlighting will be performed.
7951
7952 @item gnus-cite-max-prefix
7953 @vindex gnus-cite-max-prefix
7954 Maximum possible length for a citation prefix (default 20).
7955
7956 @item gnus-cite-face-list
7957 @vindex gnus-cite-face-list
7958 List of faces used for highlighting citations (@pxref{Faces and Fonts}).
7959 When there are citations from multiple articles in the same message,
7960 gnus will try to give each citation from each article its own face.
7961 This should make it easier to see who wrote what.
7962
7963 @item gnus-supercite-regexp
7964 @vindex gnus-supercite-regexp
7965 Regexp matching normal Supercite attribution lines.
7966
7967 @item gnus-supercite-secondary-regexp
7968 @vindex gnus-supercite-secondary-regexp
7969 Regexp matching mangled Supercite attribution lines.
7970
7971 @item gnus-cite-minimum-match-count
7972 @vindex gnus-cite-minimum-match-count
7973 Minimum number of identical prefixes we have to see before we believe
7974 that it's a citation.
7975
7976 @item gnus-cite-attribution-prefix
7977 @vindex gnus-cite-attribution-prefix
7978 Regexp matching the beginning of an attribution line.
7979
7980 @item gnus-cite-attribution-suffix
7981 @vindex gnus-cite-attribution-suffix
7982 Regexp matching the end of an attribution line.
7983
7984 @item gnus-cite-attribution-face
7985 @vindex gnus-cite-attribution-face
7986 Face used for attribution lines.  It is merged with the face for the
7987 cited text belonging to the attribution.
7988
7989 @end table
7990
7991
7992 @item W H s
7993 @kindex W H s (Summary)
7994 @vindex gnus-signature-separator
7995 @vindex gnus-signature-face
7996 @findex gnus-article-highlight-signature
7997 Highlight the signature (@code{gnus-article-highlight-signature}).
7998 Everything after @code{gnus-signature-separator} (@pxref{Article
7999 Signature}) in an article will be considered a signature and will be
8000 highlighted with @code{gnus-signature-face}, which is @code{italic} by
8001 default.
8002
8003 @end table
8004
8005 @xref{Customizing Articles}, for how to highlight articles automatically.
8006
8007
8008 @node Article Fontisizing
8009 @subsection Article Fontisizing
8010 @cindex emphasis
8011 @cindex article emphasis
8012
8013 @findex gnus-article-emphasize
8014 @kindex W e (Summary)
8015 People commonly add emphasis to words in news articles by writing things
8016 like @samp{_this_} or @samp{*this*} or @samp{/this/}.  Gnus can make
8017 this look nicer by running the article through the @kbd{W e}
8018 (@code{gnus-article-emphasize}) command.
8019
8020 @vindex gnus-emphasis-alist
8021 How the emphasis is computed is controlled by the
8022 @code{gnus-emphasis-alist} variable.  This is an alist where the first
8023 element is a regular expression to be matched.  The second is a number
8024 that says what regular expression grouping is used to find the entire
8025 emphasized word.  The third is a number that says what regexp grouping
8026 should be displayed and highlighted.  (The text between these two
8027 groupings will be hidden.)  The fourth is the face used for
8028 highlighting.
8029
8030 @lisp
8031 (setq gnus-emphasis-alist
8032       '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline)
8033         ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold)))
8034 @end lisp
8035
8036 @cindex slash
8037 @cindex asterisk
8038 @cindex underline
8039 @cindex /
8040 @cindex *
8041
8042 @vindex gnus-emphasis-underline
8043 @vindex gnus-emphasis-bold
8044 @vindex gnus-emphasis-italic
8045 @vindex gnus-emphasis-underline-bold
8046 @vindex gnus-emphasis-underline-italic
8047 @vindex gnus-emphasis-bold-italic
8048 @vindex gnus-emphasis-underline-bold-italic
8049 By default, there are seven rules, and they use the following faces:
8050 @code{gnus-emphasis-bold}, @code{gnus-emphasis-italic},
8051 @code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic},
8052 @code{gnus-emphasis-underline-italic},
8053 @code{gnus-emphasis-underline-bold}, and
8054 @code{gnus-emphasis-underline-bold-italic}.
8055
8056 If you want to change these faces, you can either use @kbd{M-x
8057 customize}, or you can use @code{copy-face}.  For instance, if you want
8058 to make @code{gnus-emphasis-italic} use a red face instead, you could
8059 say something like:
8060
8061 @lisp
8062 (copy-face 'red 'gnus-emphasis-italic)
8063 @end lisp
8064
8065 @vindex gnus-group-highlight-words-alist
8066
8067 If you want to highlight arbitrary words, you can use the
8068 @code{gnus-group-highlight-words-alist} variable, which uses the same
8069 syntax as @code{gnus-emphasis-alist}.  The @code{highlight-words} group
8070 parameter (@pxref{Group Parameters}) can also be used.
8071
8072 @xref{Customizing Articles}, for how to fontize articles automatically.
8073
8074
8075 @node Article Hiding
8076 @subsection Article Hiding
8077 @cindex article hiding
8078
8079 Or rather, hiding certain things in each article.  There usually is much
8080 too much cruft in most articles.
8081
8082 @table @kbd
8083
8084 @item W W a
8085 @kindex W W a (Summary)
8086 @findex gnus-article-hide
8087 Do quite a lot of hiding on the article buffer
8088 (@kbd{gnus-article-hide}).  In particular, this function will hide
8089 headers, PGP, cited text and the signature.
8090
8091 @item W W h
8092 @kindex W W h (Summary)
8093 @findex gnus-article-hide-headers
8094 Hide headers (@code{gnus-article-hide-headers}).  @xref{Hiding
8095 Headers}.
8096
8097 @item W W b
8098 @kindex W W b (Summary)
8099 @findex gnus-article-hide-boring-headers
8100 Hide headers that aren't particularly interesting
8101 (@code{gnus-article-hide-boring-headers}).  @xref{Hiding Headers}.
8102
8103 @item W W s
8104 @kindex W W s (Summary)
8105 @findex gnus-article-hide-signature
8106 Hide signature (@code{gnus-article-hide-signature}).  @xref{Article
8107 Signature}.
8108
8109 @item W W l
8110 @kindex W W l (Summary)
8111 @findex gnus-article-hide-list-identifiers
8112 @vindex gnus-list-identifiers
8113 Strip list identifiers specified in @code{gnus-list-identifiers}.  These
8114 are strings some mailing list servers add to the beginning of all
8115 @code{Subject} headers---for example, @samp{[zebra 4711]}.  Any leading
8116 @samp{Re: } is skipped before stripping. @code{gnus-list-identifiers}
8117 may not contain @code{\\(..\\)}.
8118
8119 @table @code
8120
8121 @item gnus-list-identifiers
8122 @vindex gnus-list-identifiers
8123 A regular expression that matches list identifiers to be removed from
8124 subject.  This can also be a list of regular expressions.
8125
8126 @end table
8127
8128 @item W W P
8129 @kindex W W P (Summary)
8130 @findex gnus-article-hide-pem
8131 Hide @sc{pem} (privacy enhanced messages) cruft
8132 (@code{gnus-article-hide-pem}).
8133
8134 @item W W B
8135 @kindex W W B (Summary)
8136 @findex gnus-article-strip-banner
8137 @vindex gnus-article-banner-alist
8138 @vindex gnus-article-address-banner-alist
8139 @cindex banner
8140 @cindex OneList
8141 @cindex stripping advertisements
8142 @cindex advertisements
8143 Strip the banner specified by the @code{banner} group parameter
8144 (@code{gnus-article-strip-banner}).  This is mainly used to hide those
8145 annoying banners and/or signatures that some mailing lists and moderated
8146 groups adds to all the messages.  The way to use this function is to add
8147 the @code{banner} group parameter (@pxref{Group Parameters}) to the
8148 group you want banners stripped from.  The parameter either be a string,
8149 which will be interpreted as a regular expression matching text to be
8150 removed, or the symbol @code{signature}, meaning that the (last)
8151 signature should be removed, or other symbol, meaning that the
8152 corresponding regular expression in @code{gnus-article-banner-alist} is
8153 used.
8154
8155 Regardless of a group, you can hide things like advertisements only when
8156 the sender of an article has a certain mail address specified in
8157 @code{gnus-article-address-banner-alist}.
8158
8159 @table @code
8160
8161 @item gnus-article-address-banner-alist
8162 @vindex gnus-article-address-banner-alist
8163 Alist of mail addresses and banners.  Each element has the form
8164 @code{(ADDRESS . BANNER)}, where ADDRESS is a regexp matching a mail
8165 address in the From header, BANNER is one of a symbol @code{signature},
8166 an item in @code{gnus-article-banner-alist}, a regexp and @code{nil}.
8167 If ADDRESS matches author's mail address, it will remove things like
8168 advertisements.  For example, if a sender has the mail address
8169 @samp{hail@@yoo-hoo.co.jp} and there is a banner something like
8170 @samp{Do You Yoo-hoo!?} in all articles he sends, you can use the
8171 following element to remove them:
8172
8173 @lisp
8174 ("@@yoo-hoo\\.co\\.jp\\'" . "\n_+\nDo You Yoo-hoo!\\?\n.*\n.*\n")
8175 @end lisp
8176
8177 @end table
8178
8179 @item W W c
8180 @kindex W W c (Summary)
8181 @findex gnus-article-hide-citation
8182 Hide citation (@code{gnus-article-hide-citation}).  Some variables for
8183 customizing the hiding:
8184
8185 @table @code
8186
8187 @item gnus-cited-opened-text-button-line-format
8188 @itemx gnus-cited-closed-text-button-line-format
8189 @vindex gnus-cited-closed-text-button-line-format
8190 @vindex gnus-cited-opened-text-button-line-format
8191 Gnus adds buttons to show where the cited text has been hidden, and to
8192 allow toggle hiding the text.  The format of the variable is specified
8193 by these format-like variable (@pxref{Formatting Variables}).  These
8194 specs are valid:
8195
8196 @table @samp
8197 @item b
8198 Starting point of the hidden text.
8199 @item e
8200 Ending point of the hidden text.
8201 @item l
8202 Number of characters in the hidden region.
8203 @item n
8204 Number of lines of hidden text.
8205 @end table
8206
8207 @item gnus-cited-lines-visible
8208 @vindex gnus-cited-lines-visible
8209 The number of lines at the beginning of the cited text to leave
8210 shown. This can also be a cons cell with the number of lines at the top
8211 and bottom of the text, respectively, to remain visible.
8212
8213 @end table
8214
8215 @item W W C-c
8216 @kindex W W C-c (Summary)
8217 @findex gnus-article-hide-citation-maybe
8218
8219 Hide citation (@code{gnus-article-hide-citation-maybe}) depending on the
8220 following two variables:
8221
8222 @table @code
8223 @item gnus-cite-hide-percentage
8224 @vindex gnus-cite-hide-percentage
8225 If the cited text is of a bigger percentage than this variable (default
8226 50), hide the cited text.
8227
8228 @item gnus-cite-hide-absolute
8229 @vindex gnus-cite-hide-absolute
8230 The cited text must have at least this length (default 10) before it
8231 is hidden.
8232 @end table
8233
8234 @item W W C
8235 @kindex W W C (Summary)
8236 @findex gnus-article-hide-citation-in-followups
8237 Hide cited text in articles that aren't roots
8238 (@code{gnus-article-hide-citation-in-followups}).  This isn't very
8239 useful as an interactive command, but might be a handy function to stick
8240 have happen automatically (@pxref{Customizing Articles}).
8241
8242 @end table
8243
8244 All these ``hiding'' commands are toggles, but if you give a negative
8245 prefix to these commands, they will show what they have previously
8246 hidden.  If you give a positive prefix, they will always hide.
8247
8248 Also @pxref{Article Highlighting} for further variables for
8249 citation customization.
8250
8251 @xref{Customizing Articles}, for how to hide article elements
8252 automatically.
8253
8254
8255 @node Article Washing
8256 @subsection Article Washing
8257 @cindex washing
8258 @cindex article washing
8259
8260 We call this ``article washing'' for a really good reason.  Namely, the
8261 @kbd{A} key was taken, so we had to use the @kbd{W} key instead.
8262
8263 @dfn{Washing} is defined by us as ``changing something from something to
8264 something else'', but normally results in something looking better.
8265 Cleaner, perhaps.
8266
8267 @xref{Customizing Articles}, if you want to change how Gnus displays
8268 articles by default.
8269
8270 @table @kbd
8271
8272 @item C-u g
8273 This is not really washing, it's sort of the opposite of washing.  If
8274 you type this, you see the article exactly as it exists on disk or on
8275 the server.
8276
8277 @item W l
8278 @kindex W l (Summary)
8279 @findex gnus-summary-stop-page-breaking
8280 Remove page breaks from the current article
8281 (@code{gnus-summary-stop-page-breaking}).  @xref{Misc Article}, for page
8282 delimiters.
8283
8284 @item W r
8285 @kindex W r (Summary)
8286 @findex gnus-summary-caesar-message
8287 @c @icon{gnus-summary-caesar-message}
8288 Do a Caesar rotate (rot13) on the article buffer
8289 (@code{gnus-summary-caesar-message}).
8290 Unreadable articles that tell you to read them with Caesar rotate or rot13.
8291 (Typically offensive jokes and such.)
8292
8293 It's commonly called ``rot13'' because each letter is rotated 13
8294 positions in the alphabet, e. g. @samp{B} (letter #2) -> @samp{O} (letter
8295 #15).  It is sometimes referred to as ``Caesar rotate'' because Caesar
8296 is rumored to have employed this form of, uh, somewhat weak encryption.
8297
8298 @item W m
8299 @kindex W m (Summary)
8300 @findex gnus-summary-morse-message
8301 Morse decode the article buffer (@code{gnus-summary-morse-message}).
8302
8303 @item W t
8304 @item t
8305 @kindex W t (Summary)
8306 @kindex t (Summary)
8307 @findex gnus-summary-toggle-header
8308 Toggle whether to display all headers in the article buffer
8309 (@code{gnus-summary-toggle-header}).
8310
8311 @item W v
8312 @kindex W v (Summary)
8313 @findex gnus-summary-verbose-headers
8314 Toggle whether to display all headers in the article buffer permanently
8315 (@code{gnus-summary-verbose-headers}).
8316
8317 @item W m
8318 @kindex W m (Summary)
8319 @findex gnus-summary-toggle-mime
8320 Toggle whether to run the article through @sc{mime} before displaying
8321 (@code{gnus-summary-toggle-mime}).
8322
8323 @item W o
8324 @kindex W o (Summary)
8325 @findex gnus-article-treat-overstrike
8326 Treat overstrike (@code{gnus-article-treat-overstrike}).
8327
8328 @item W d
8329 @kindex W d (Summary)
8330 @findex gnus-article-treat-dumbquotes
8331 @vindex gnus-article-dumbquotes-map
8332 @cindex Smartquotes
8333 @cindex M****s*** sm*rtq**t*s
8334 @cindex Latin 1
8335 Treat M****s*** sm*rtq**t*s according to
8336 @code{gnus-article-dumbquotes-map}
8337 (@code{gnus-article-treat-dumbquotes}).  Note that this function guesses
8338 whether a character is a sm*rtq**t* or not, so it should only be used
8339 interactively.
8340
8341 Sm*rtq**t*s are M****s***'s unilateral extension to the character map in
8342 an attempt to provide more quoting characters.  If you see something
8343 like @code{\222} or @code{\264} where you're expecting some kind of
8344 apostrophe or quotation mark, then try this wash.
8345
8346 @item W Y f
8347 @kindex W Y f (Summary)
8348 @findex gnus-article-outlook-deuglify-article
8349 @cindex Outlook Express
8350 Full deuglify of broken Outlook (Express) articles: Treat dumbquotes,
8351 unwrap lines, repair attribution and rearrange citation.
8352 (@code{gnus-article-outlook-deuglify-article}).
8353
8354 @item W Y u
8355 @kindex W Y u (Summary)
8356 @findex gnus-article-outlook-unwrap-lines
8357 @vindex gnus-outlook-deuglify-unwrap-min
8358 @vindex gnus-outlook-deuglify-unwrap-max
8359 Unwrap lines that appear to be wrapped citation lines.  You can control
8360 what lines will be unwrapped by frobbing
8361 @code{gnus-outlook-deuglify-unwrap-min} and
8362 @code{gnus-outlook-deuglify-unwrap-max}, indicating the miminum and
8363 maximum length of an unwrapped citation line.
8364 (@code{gnus-article-outlook-unwrap-lines}).
8365
8366 @item W Y a
8367 @kindex W Y a (Summary)
8368 @findex gnus-article-outlook-repair-attribution
8369 Repair a broken attribution line.
8370 (@code{gnus-article-outlook-repair-attribution}).
8371
8372 @item W Y c
8373 @kindex W Y c (Summary)
8374 @findex gnus-article-outlook-rearrange-citation
8375 Repair broken citations by rearranging the text.
8376 (@code{gnus-article-outlook-rearrange-citation}).
8377
8378 @item W w
8379 @kindex W w (Summary)
8380 @findex gnus-article-fill-cited-article
8381 Do word wrap (@code{gnus-article-fill-cited-article}).
8382
8383 You can give the command a numerical prefix to specify the width to use
8384 when filling.
8385
8386 @item W Q
8387 @kindex W Q (Summary)
8388 @findex gnus-article-fill-long-lines
8389 Fill long lines (@code{gnus-article-fill-long-lines}).
8390
8391 @item W C
8392 @kindex W C (Summary)
8393 @findex gnus-article-capitalize-sentences
8394 Capitalize the first word in each sentence
8395 (@code{gnus-article-capitalize-sentences}).
8396
8397 @item W c
8398 @kindex W c (Summary)
8399 @findex gnus-article-remove-cr
8400 Translate CRLF pairs (i. e., @samp{^M}s on the end of the lines) into LF
8401 (this takes care of DOS line endings), and then translate any remaining
8402 CRs into LF (this takes care of Mac line endings)
8403 (@code{gnus-article-remove-cr}).
8404
8405 @item W 6
8406 @kindex W 6 (Summary)
8407 @findex gnus-article-de-base64-unreadable
8408 Treat base64 (@code{gnus-article-de-base64-unreadable}).
8409 Base64 is one common @sc{mime} encoding employed when sending non-ASCII
8410 (i. e., 8-bit) articles.  Note that this is usually done
8411 automatically by Gnus if the message in question has a
8412 @code{Content-Transfer-Encoding} header that says that this encoding has
8413 been done.
8414 If a prefix is given, a charset will be asked for.
8415
8416 @item W Z
8417 @kindex W Z (Summary)
8418 @findex gnus-article-decode-HZ
8419 Treat HZ or HZP (@code{gnus-article-decode-HZ}).  HZ (or HZP) is one
8420 common encoding employed when sending Chinese articles.  It typically
8421 makes strings look like @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}}.
8422
8423 @item W u
8424 @kindex W u (Summary)
8425 @findex gnus-article-unsplit-urls
8426 Remove newlines from within URLs.  Some mailers insert newlines into
8427 outgoing email messages to keep lines short.  This reformatting can
8428 split long URLs onto multiple lines.  Repair those URLs by removing
8429 the newlines (@code{gnus-article-unsplit-urls}).
8430
8431 @item W h
8432 @kindex W h (Summary)
8433 @findex gnus-article-wash-html
8434 Treat @sc{html} (@code{gnus-article-wash-html}).  Note that this is
8435 usually done automatically by Gnus if the message in question has a
8436 @code{Content-Type} header that says that the message is @sc{html}.
8437
8438 If a prefix is given, a charset will be asked for.
8439
8440 @vindex gnus-article-wash-function
8441 The default is to use the function specified by
8442 @code{mm-text-html-renderer} (@pxref{(emacs-mime)Display
8443 Customization}) to convert the @sc{html}, but this is controlled by
8444 the @code{gnus-article-wash-function} variable.  Pre-defined functions
8445 you can use include:
8446
8447 @table @code
8448 @item w3
8449 Use Emacs/w3.
8450
8451 @item w3m
8452 Use emacs-w3m (see @uref{http://emacs-w3m.namazu.org/} for more
8453 information).
8454
8455 @item links
8456 Use Links (see @uref{http://artax.karlin.mff.cuni.cz/~mikulas/links/}).
8457
8458 @item lynx
8459 Use Lynx (see @uref{http://lynx.browser.org/}).
8460
8461 @item html2text
8462 Use html2text -- a simple @sc{html} converter included with Gnus.
8463
8464 @end table
8465
8466 @item W b
8467 @kindex W b (Summary)
8468 @findex gnus-article-add-buttons
8469 Add clickable buttons to the article (@code{gnus-article-add-buttons}).
8470 @xref{Article Buttons}.
8471
8472 @item W B
8473 @kindex W B (Summary)
8474 @findex gnus-article-add-buttons-to-head
8475 Add clickable buttons to the article headers
8476 (@code{gnus-article-add-buttons-to-head}).
8477
8478 @item W p
8479 @kindex W p (Summary)
8480 @findex gnus-article-verify-x-pgp-sig
8481 Verify a signed control message (@code{gnus-article-verify-x-pgp-sig}).
8482 Control messages such as @code{newgroup} and @code{checkgroups} are
8483 usually signed by the hierarchy maintainer.  You need to add the PGP
8484 public key of the maintainer to your keyring to verify the
8485 message.@footnote{PGP keys for many hierarchies are available at
8486 @uref{ftp://ftp.isc.org/pub/pgpcontrol/README.html}}
8487
8488 @item W s
8489 @kindex W s (Summary)
8490 @findex gnus-summary-force-verify-and-decrypt
8491 Verify a signed (PGP, @sc{pgp/mime} or @sc{s/mime}) message
8492 (@code{gnus-summary-force-verify-and-decrypt}). @xref{Security}.
8493
8494 @item W a
8495 @kindex W a (Summary)
8496 @findex gnus-article-strip-headers-in-body
8497 Strip headers like the @code{X-No-Archive} header from the beginning of
8498 article bodies (@code{gnus-article-strip-headers-in-body}).
8499
8500 @item W E l
8501 @kindex W E l (Summary)
8502 @findex gnus-article-strip-leading-blank-lines
8503 Remove all blank lines from the beginning of the article
8504 (@code{gnus-article-strip-leading-blank-lines}).
8505
8506 @item W E m
8507 @kindex W E m (Summary)
8508 @findex gnus-article-strip-multiple-blank-lines
8509 Replace all blank lines with empty lines and then all multiple empty
8510 lines with a single empty line.
8511 (@code{gnus-article-strip-multiple-blank-lines}).
8512
8513 @item W E t
8514 @kindex W E t (Summary)
8515 @findex gnus-article-remove-trailing-blank-lines
8516 Remove all blank lines at the end of the article
8517 (@code{gnus-article-remove-trailing-blank-lines}).
8518
8519 @item W E a
8520 @kindex W E a (Summary)
8521 @findex gnus-article-strip-blank-lines
8522 Do all the three commands above
8523 (@code{gnus-article-strip-blank-lines}).
8524
8525 @item W E A
8526 @kindex W E A (Summary)
8527 @findex gnus-article-strip-all-blank-lines
8528 Remove all blank lines
8529 (@code{gnus-article-strip-all-blank-lines}).
8530
8531 @item W E s
8532 @kindex W E s (Summary)
8533 @findex gnus-article-strip-leading-space
8534 Remove all white space from the beginning of all lines of the article
8535 body (@code{gnus-article-strip-leading-space}).
8536
8537 @item W E e
8538 @kindex W E e (Summary)
8539 @findex gnus-article-strip-trailing-space
8540 Remove all white space from the end of all lines of the article
8541 body (@code{gnus-article-strip-trailing-space}).
8542
8543 @end table
8544
8545 @xref{Customizing Articles}, for how to wash articles automatically.
8546
8547
8548 @node Article Header
8549 @subsection Article Header
8550
8551 These commands perform various transformations of article header.
8552
8553 @table @kbd
8554
8555 @item W G u
8556 @kindex W G u (Summary)
8557 @findex gnus-article-treat-unfold-headers
8558 Unfold folded header lines (@code{gnus-article-treat-unfold-headers}).
8559
8560 @item W G n
8561 @kindex W G n (Summary)
8562 @findex gnus-article-treat-fold-newsgroups
8563 Fold the @code{Newsgroups} and @code{Followup-To} headers
8564 (@code{gnus-article-treat-fold-newsgroups}).
8565
8566 @item W G f
8567 @kindex W G f (Summary)
8568 @findex gnus-article-treat-fold-headers
8569 Fold all the message headers
8570 (@code{gnus-article-treat-fold-headers}).
8571
8572 @item W E w
8573 @kindex W E w
8574 @findex gnus-article-remove-leading-whitespace
8575 Remove excessive whitespace from all headers
8576 (@code{gnus-article-remove-leading-whitespace}).
8577
8578 @end table
8579
8580
8581 @node Article Buttons
8582 @subsection Article Buttons
8583 @cindex buttons
8584
8585 People often include references to other stuff in articles, and it would
8586 be nice if Gnus could just fetch whatever it is that people talk about
8587 with the minimum of fuzz when you hit @kbd{RET} or use the middle mouse
8588 button on these references.
8589
8590 @vindex gnus-button-man-handler
8591 Gnus adds @dfn{buttons} to certain standard references by default:
8592 Well-formed URLs, mail addresses, Message-IDs, Info links and man pages.
8593 This is controlled by two variables, one that handles article bodies and
8594 one that handles article heads:
8595
8596 @table @code
8597
8598 @item gnus-button-alist
8599 @vindex gnus-button-alist
8600 This is an alist where each entry has this form:
8601
8602 @lisp
8603 (REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
8604 @end lisp
8605
8606 @table @var
8607
8608 @item regexp
8609 All text that match this regular expression (case insensitive) will be
8610 considered an external reference.  Here's a typical regexp that matches
8611 embedded URLs: @samp{<URL:\\([^\n\r>]*\\)>}.  This can also be a
8612 variable containing a regexp, useful variables to use include
8613 @code{gnus-button-url-regexp}.
8614
8615 @item button-par
8616 Gnus has to know which parts of the matches is to be highlighted.  This
8617 is a number that says what sub-expression of the regexp is to be
8618 highlighted.  If you want it all highlighted, you use 0 here.
8619
8620 @item use-p
8621 This form will be @code{eval}ed, and if the result is non-@code{nil},
8622 this is considered a match.  This is useful if you want extra sifting to
8623 avoid false matches.
8624
8625 @item function
8626 This function will be called when you click on this button.
8627
8628 @item data-par
8629 As with @var{button-par}, this is a sub-expression number, but this one
8630 says which part of the match is to be sent as data to @var{function}.
8631
8632 @end table
8633
8634 So the full entry for buttonizing URLs is then
8635
8636 @lisp
8637 ("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)
8638 @end lisp
8639
8640 @item gnus-header-button-alist
8641 @vindex gnus-header-button-alist
8642 This is just like the other alist, except that it is applied to the
8643 article head only, and that each entry has an additional element that is
8644 used to say what headers to apply the buttonize coding to:
8645
8646 @lisp
8647 (HEADER REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
8648 @end lisp
8649
8650 @var{header} is a regular expression.
8651
8652 @item gnus-button-url-regexp
8653 @vindex gnus-button-url-regexp
8654 A regular expression that matches embedded URLs.  It is used in the
8655 default values of the variables above.
8656
8657 @item gnus-article-button-face
8658 @vindex gnus-article-button-face
8659 Face used on buttons.
8660
8661 @item gnus-article-mouse-face
8662 @vindex gnus-article-mouse-face
8663 Face used when the mouse cursor is over a button.
8664
8665 @end table
8666
8667 @xref{Customizing Articles}, for how to buttonize articles automatically.
8668
8669
8670 @node Article Date
8671 @subsection Article Date
8672
8673 The date is most likely generated in some obscure timezone you've never
8674 heard of, so it's quite nice to be able to find out what the time was
8675 when the article was sent.
8676
8677 @table @kbd
8678
8679 @item W T u
8680 @kindex W T u (Summary)
8681 @findex gnus-article-date-ut
8682 Display the date in UT (aka. GMT, aka ZULU)
8683 (@code{gnus-article-date-ut}).
8684
8685 @item W T i
8686 @kindex W T i (Summary)
8687 @findex gnus-article-date-iso8601
8688 @cindex ISO 8601
8689 Display the date in international format, aka. ISO 8601
8690 (@code{gnus-article-date-iso8601}).
8691
8692 @item W T l
8693 @kindex W T l (Summary)
8694 @findex gnus-article-date-local
8695 Display the date in the local timezone (@code{gnus-article-date-local}).
8696
8697 @item W T p
8698 @kindex W T p (Summary)
8699 @findex gnus-article-date-english
8700 Display the date in a format that's easily pronounceable in English
8701 (@code{gnus-article-date-english}).
8702
8703 @item W T s
8704 @kindex W T s (Summary)
8705 @vindex gnus-article-time-format
8706 @findex gnus-article-date-user
8707 @findex format-time-string
8708 Display the date using a user-defined format
8709 (@code{gnus-article-date-user}).  The format is specified by the
8710 @code{gnus-article-time-format} variable, and is a string that's passed
8711 to @code{format-time-string}.  See the documentation of that variable
8712 for a list of possible format specs.
8713
8714 @item W T e
8715 @kindex W T e (Summary)
8716 @findex gnus-article-date-lapsed
8717 @findex gnus-start-date-timer
8718 @findex gnus-stop-date-timer
8719 Say how much time has elapsed between the article was posted and now
8720 (@code{gnus-article-date-lapsed}).  It looks something like:
8721
8722 @example
8723 X-Sent: 6 weeks, 4 days, 1 hour, 3 minutes, 8 seconds ago
8724 @end example
8725
8726 @vindex gnus-article-date-lapsed-new-header
8727 The value of @code{gnus-article-date-lapsed-new-header} determines
8728 whether this header will just be added below the old Date one, or will
8729 replace it.
8730
8731 An advantage of using Gnus to read mail is that it converts simple bugs
8732 into wonderful absurdities.
8733
8734 If you want to have this line updated continually, you can put
8735
8736 @lisp
8737 (gnus-start-date-timer)
8738 @end lisp
8739
8740 in your @file{.gnus.el} file, or you can run it off of some hook.  If
8741 you want to stop the timer, you can use the @code{gnus-stop-date-timer}
8742 command.
8743
8744 @item W T o
8745 @kindex W T o (Summary)
8746 @findex gnus-article-date-original
8747 Display the original date (@code{gnus-article-date-original}).  This can
8748 be useful if you normally use some other conversion function and are
8749 worried that it might be doing something totally wrong.  Say, claiming
8750 that the article was posted in 1854.  Although something like that is
8751 @emph{totally} impossible.  Don't you trust me? *titter*
8752
8753 @end table
8754
8755 @xref{Customizing Articles}, for how to display the date in your
8756 preferred format automatically.
8757
8758
8759 @node Article Display
8760 @subsection Article Display
8761 @cindex picons
8762 @cindex x-face
8763 @cindex smileys
8764
8765 These commands add various frivolous display gimmicks to the article
8766 buffer in Emacs versions that support them.
8767
8768 @code{X-Face} headers are small black-and-white images supplied by the
8769 message headers (@pxref{X-Face}).
8770
8771 Picons, on the other hand, reside on your own system, and Gnus will
8772 try to match the headers to what you have (@pxref{Picons}).
8773
8774 Smileys are those little @samp{:-)} symbols that people like to litter
8775 their messages with (@pxref{Smileys}).
8776
8777 All these functions are toggles--if the elements already exist,
8778 they'll be removed.
8779
8780 @table @kbd
8781 @item W D x
8782 @kindex W D x (Summary)
8783 @findex gnus-article-display-x-face
8784 Display an @code{X-Face} in the @code{From} header.
8785 (@code{gnus-article-display-x-face}).
8786
8787 @item W D d
8788 @kindex W D d (Summary)
8789 @findex gnus-article-display-face
8790 Display a @code{Face} in the @code{From} header.
8791 (@code{gnus-article-display-face}).
8792
8793 @item W D s
8794 @kindex W D s (Summary)
8795 @findex gnus-treat-smiley
8796 Display smileys (@code{gnus-treat-smiley}).
8797
8798 @item W D f
8799 @kindex W D f (Summary)
8800 @findex gnus-treat-from-picon
8801 Piconify the @code{From} header (@code{gnus-treat-from-picon}).
8802
8803 @item W D m
8804 @kindex W D m (Summary)
8805 @findex gnus-treat-mail-picon
8806 Piconify all mail headers (i. e., @code{Cc}, @code{To})
8807 (@code{gnus-treat-mail-picon}).
8808
8809 @item W D n
8810 @kindex W D n (Summary)
8811 @findex gnus-treat-newsgroups-picon
8812 Piconify all news headers (i. e., @code{Newsgroups} and
8813 @code{Followup-To}) (@code{gnus-treat-newsgroups-picon}).
8814
8815 @item W D D
8816 @kindex W D D (Summary)
8817 @findex gnus-article-remove-images
8818 Remove all images from the article buffer
8819 (@code{gnus-article-remove-images}).
8820
8821 @end table
8822
8823
8824
8825 @node Article Signature
8826 @subsection Article Signature
8827 @cindex signatures
8828 @cindex article signature
8829
8830 @vindex gnus-signature-separator
8831 Each article is divided into two parts---the head and the body.  The
8832 body can be divided into a signature part and a text part.  The variable
8833 that says what is to be considered a signature is
8834 @code{gnus-signature-separator}.  This is normally the standard
8835 @samp{^-- $} as mandated by son-of-RFC 1036.  However, many people use
8836 non-standard signature separators, so this variable can also be a list
8837 of regular expressions to be tested, one by one.  (Searches are done
8838 from the end of the body towards the beginning.)  One likely value is:
8839
8840 @lisp
8841 (setq gnus-signature-separator
8842       '("^-- $"         ; The standard
8843         "^-- *$"        ; A common mangling
8844         "^-------*$"    ; Many people just use a looong
8845                         ; line of dashes.  Shame!
8846         "^ *--------*$" ; Double-shame!
8847         "^________*$"   ; Underscores are also popular
8848         "^========*$")) ; Pervert!
8849 @end lisp
8850
8851 The more permissive you are, the more likely it is that you'll get false
8852 positives.
8853
8854 @vindex gnus-signature-limit
8855 @code{gnus-signature-limit} provides a limit to what is considered a
8856 signature when displaying articles.
8857
8858 @enumerate
8859 @item
8860 If it is an integer, no signature may be longer (in characters) than
8861 that integer.
8862 @item
8863 If it is a floating point number, no signature may be longer (in lines)
8864 than that number.
8865 @item
8866 If it is a function, the function will be called without any parameters,
8867 and if it returns @code{nil}, there is no signature in the buffer.
8868 @item
8869 If it is a string, it will be used as a regexp.  If it matches, the text
8870 in question is not a signature.
8871 @end enumerate
8872
8873 This variable can also be a list where the elements may be of the types
8874 listed above.  Here's an example:
8875
8876 @lisp
8877 (setq gnus-signature-limit
8878       '(200.0 "^---*Forwarded article"))
8879 @end lisp
8880
8881 This means that if there are more than 200 lines after the signature
8882 separator, or the text after the signature separator is matched by
8883 the regular expression @samp{^---*Forwarded article}, then it isn't a
8884 signature after all.
8885
8886
8887 @node Article Miscellania
8888 @subsection Article Miscellania
8889
8890 @table @kbd
8891 @item A t
8892 @kindex A t (Summary)
8893 @findex gnus-article-babel
8894 Translate the article from one language to another
8895 (@code{gnus-article-babel}).
8896
8897 @end table
8898
8899
8900 @node MIME Commands
8901 @section MIME Commands
8902 @cindex MIME decoding
8903 @cindex attachments
8904 @cindex viewing attachments
8905
8906 The following commands all understand the numerical prefix.  For
8907 instance, @kbd{3 b} means ``view the third @sc{mime} part''.
8908
8909 @table @kbd
8910 @item b
8911 @itemx K v
8912 @kindex b (Summary)
8913 @kindex K v (Summary)
8914 View the @sc{mime} part.
8915
8916 @item K o
8917 @kindex K o (Summary)
8918 Save the @sc{mime} part.
8919
8920 @item K c
8921 @kindex K c (Summary)
8922 Copy the @sc{mime} part.
8923
8924 @item K e
8925 @kindex K e (Summary)
8926 View the @sc{mime} part externally.
8927
8928 @item K i
8929 @kindex K i (Summary)
8930 View the @sc{mime} part internally.
8931
8932 @item K |
8933 @kindex K | (Summary)
8934 Pipe the @sc{mime} part to an external command.
8935 @end table
8936
8937 The rest of these @sc{mime} commands do not use the numerical prefix in
8938 the same manner:
8939
8940 @table @kbd
8941 @item K b
8942 @kindex K b (Summary)
8943 Make all the @sc{mime} parts have buttons in front of them.  This is
8944 mostly useful if you wish to save (or perform other actions) on inlined
8945 parts.
8946
8947 @item K m
8948 @kindex K m (Summary)
8949 @findex gnus-summary-repair-multipart
8950 Some multipart messages are transmitted with missing or faulty headers.
8951 This command will attempt to ``repair'' these messages so that they can
8952 be viewed in a more pleasant manner
8953 (@code{gnus-summary-repair-multipart}).
8954
8955 @item X m
8956 @kindex X m (Summary)
8957 @findex gnus-summary-save-parts
8958 Save all parts matching a @sc{mime} type to a directory
8959 (@code{gnus-summary-save-parts}).  Understands the process/prefix
8960 convention (@pxref{Process/Prefix}).
8961
8962 @item M-t
8963 @kindex M-t (Summary)
8964 @findex gnus-summary-toggle-display-buttonized
8965 Toggle the buttonized display of the article buffer
8966 (@code{gnus-summary-toggle-display-buttonized}).
8967
8968 @item W M w
8969 @kindex W M w (Summary)
8970 @findex gnus-article-decode-mime-words
8971 Decode RFC 2047-encoded words in the article headers
8972 (@code{gnus-article-decode-mime-words}).
8973
8974 @item W M c
8975 @kindex W M c (Summary)
8976 @findex gnus-article-decode-charset
8977 Decode encoded article bodies as well as charsets
8978 (@code{gnus-article-decode-charset}).
8979
8980 This command looks in the @code{Content-Type} header to determine the
8981 charset.  If there is no such header in the article, you can give it a
8982 prefix, which will prompt for the charset to decode as.  In regional
8983 groups where people post using some common encoding (but do not
8984 include @sc{mime} headers), you can set the @code{charset} group/topic
8985 parameter to the required charset (@pxref{Group Parameters}).
8986
8987 @item W M v
8988 @kindex W M v (Summary)
8989 @findex gnus-mime-view-all-parts
8990 View all the @sc{mime} parts in the current article
8991 (@code{gnus-mime-view-all-parts}).
8992
8993 @end table
8994
8995 Relevant variables:
8996
8997 @table @code
8998 @item gnus-ignored-mime-types
8999 @vindex gnus-ignored-mime-types
9000 This is a list of regexps.  @sc{mime} types that match a regexp from
9001 this list will be completely ignored by Gnus.  The default value is
9002 @code{nil}.
9003
9004 To have all Vcards be ignored, you'd say something like this:
9005
9006 @lisp
9007 (setq gnus-ignored-mime-types
9008       '("text/x-vcard"))
9009 @end lisp
9010
9011 @item gnus-article-loose-mime
9012 @vindex gnus-article-loose-mime
9013 If non-@code{nil}, Gnus won't required the @samp{MIME-Version} header
9014 before interpreting the message as a @sc{mime} message.  This helps
9015 when reading messages from certain broken mail user agents.  The
9016 default is @code{nil}.
9017
9018 @item gnus-article-emulate-mime
9019 @vindex gnus-article-emulate-mime
9020 There are other, non-@sc{mime} encoding methods used.  The most common
9021 is @samp{uuencode}, but yEncode is also getting to be popular.  If
9022 This variable is non-@code{nil}, Gnus will look in message bodies to
9023 see if it finds these encodings, and if so, it'll run them through the
9024 Gnus @sc{mime} machinery.  The default is @code{t}.
9025
9026 @item gnus-unbuttonized-mime-types
9027 @vindex gnus-unbuttonized-mime-types
9028 This is a list of regexps.  @sc{mime} types that match a regexp from
9029 this list won't have @sc{mime} buttons inserted unless they aren't
9030 displayed or this variable is overridden by
9031 @code{gnus-buttonized-mime-types}.  The default value is
9032 @code{(".*/.*")}.  This variable is only used when
9033 @code{gnus-inhibit-mime-unbuttonizing} is nil.
9034
9035 @item gnus-buttonized-mime-types
9036 @vindex gnus-buttonized-mime-types
9037 This is a list of regexps.  @sc{mime} types that match a regexp from
9038 this list will have @sc{mime} buttons inserted unless they aren't
9039 displayed.  This variable overrides
9040 @code{gnus-unbuttonized-mime-types}.  The default value is @code{nil}.
9041 This variable is only used when @code{gnus-inhibit-mime-unbuttonizing}
9042 is nil.
9043
9044 To see e.g. security buttons but no other buttons, you could set this
9045 variable to @code{("multipart/signed")} and leave
9046 @code{gnus-unbuttonized-mime-types} at the default value.
9047
9048 @item gnus-inhibit-mime-unbuttonizing
9049 @vindex gnus-inhibit-mime-unbuttonizing
9050 If this is non-nil, then all @sc{mime} parts get buttons.  The default
9051 value is @code{nil}.
9052
9053 @item gnus-article-mime-part-function
9054 @vindex gnus-article-mime-part-function
9055 For each @sc{mime} part, this function will be called with the @sc{mime}
9056 handle as the parameter.  The function is meant to be used to allow
9057 users to gather information from the article (e. g., add Vcard info to
9058 the bbdb database) or to do actions based on parts (e. g., automatically
9059 save all jpegs into some directory).
9060
9061 Here's an example function the does the latter:
9062
9063 @lisp
9064 (defun my-save-all-jpeg-parts (handle)
9065   (when (equal (car (mm-handle-type handle)) "image/jpeg")
9066     (with-temp-buffer
9067       (insert (mm-get-part handle))
9068       (write-region (point-min) (point-max)
9069                     (read-file-name "Save jpeg to: ")))))
9070 (setq gnus-article-mime-part-function
9071       'my-save-all-jpeg-parts)
9072 @end lisp
9073
9074 @vindex gnus-mime-multipart-functions
9075 @item gnus-mime-multipart-functions
9076 Alist of @sc{mime} multipart types and functions to handle them.
9077
9078 @vindex mm-file-name-rewrite-functions
9079 @item mm-file-name-rewrite-functions
9080 List of functions used for rewriting file names of @sc{mime} parts.
9081 Each function takes a file name as input and returns a file name.
9082
9083 Ready-made functions include@*
9084 @code{mm-file-name-delete-whitespace},
9085 @code{mm-file-name-trim-whitespace},
9086 @code{mm-file-name-collapse-whitespace}, and
9087 @code{mm-file-name-replace-whitespace}.  The later uses the value of
9088 the variable @code{mm-file-name-replace-whitespace} to replace each
9089 whitespace character in a file name with that string; default value
9090 is @code{"_"} (a single underscore).
9091 @findex mm-file-name-delete-whitespace
9092 @findex mm-file-name-trim-whitespace
9093 @findex mm-file-name-collapse-whitespace
9094 @findex mm-file-name-replace-whitespace
9095 @vindex mm-file-name-replace-whitespace
9096
9097 The standard functions @code{capitalize}, @code{downcase},
9098 @code{upcase}, and @code{upcase-initials} may be useful, too.
9099
9100 Everybody knows that whitespace characters in file names are evil,
9101 except those who don't know.  If you receive lots of attachments from
9102 such unenlightened users, you can make live easier by adding
9103
9104 @lisp
9105 (setq mm-file-name-rewrite-functions
9106       '(mm-file-name-trim-whitespace
9107         mm-file-name-collapse-whitespace
9108         mm-file-name-replace-whitespace))
9109 @end lisp
9110
9111 @noindent
9112 to your @file{.gnus.el} file.
9113
9114 @end table
9115
9116
9117 @node Charsets
9118 @section Charsets
9119 @cindex charsets
9120
9121 People use different charsets, and we have @sc{mime} to let us know what
9122 charsets they use.  Or rather, we wish we had.  Many people use
9123 newsreaders and mailers that do not understand or use @sc{mime}, and
9124 just send out messages without saying what character sets they use.  To
9125 help a bit with this, some local news hierarchies have policies that say
9126 what character set is the default.  For instance, the @samp{fj}
9127 hierarchy uses @code{iso-2022-jp-2}.
9128
9129 @vindex gnus-group-charset-alist
9130 This knowledge is encoded in the @code{gnus-group-charset-alist}
9131 variable, which is an alist of regexps (use the first item to match full
9132 group names) and default charsets to be used when reading these groups.
9133
9134 @vindex gnus-newsgroup-ignored-charsets
9135 In addition, some people do use soi-disant @sc{mime}-aware agents that
9136 aren't.  These blithely mark messages as being in @code{iso-8859-1}
9137 even if they really are in @code{koi-8}.  To help here, the
9138 @code{gnus-newsgroup-ignored-charsets} variable can be used.  The
9139 charsets that are listed here will be ignored.  The variable can be
9140 set on a group-by-group basis using the group parameters (@pxref{Group
9141 Parameters}).  The default value is @code{(unknown-8bit x-unknown)},
9142 which includes values some agents insist on having in there.
9143
9144 @vindex gnus-group-posting-charset-alist
9145 When posting, @code{gnus-group-posting-charset-alist} is used to
9146 determine which charsets should not be encoded using the @sc{mime}
9147 encodings.  For instance, some hierarchies discourage using
9148 quoted-printable header encoding.
9149
9150 This variable is an alist of regexps and permitted unencoded charsets
9151 for posting.  Each element of the alist has the form @code{(}@var{test
9152 header body-list}@code{)}, where:
9153
9154 @table @var
9155 @item test
9156 is either a regular expression matching the newsgroup header or a
9157 variable to query,
9158 @item header
9159 is the charset which may be left unencoded in the header (@code{nil}
9160 means encode all charsets),
9161 @item body-list
9162 is a list of charsets which may be encoded using 8bit content-transfer
9163 encoding in the body, or one of the special values @code{nil} (always
9164 encode using quoted-printable) or @code{t} (always use 8bit).
9165 @end table
9166
9167 @cindex Russian
9168 @cindex koi8-r
9169 @cindex koi8-u
9170 @cindex iso-8859-5
9171 @cindex coding system aliases
9172 @cindex preferred charset
9173
9174 Other charset tricks that may be useful, although not Gnus-specific:
9175
9176 If there are several @sc{mime} charsets that encode the same Emacs
9177 charset, you can choose what charset to use by saying the following:
9178
9179 @lisp
9180 (put-charset-property 'cyrillic-iso8859-5
9181                       'preferred-coding-system 'koi8-r)
9182 @end lisp
9183
9184 This means that Russian will be encoded using @code{koi8-r} instead of
9185 the default @code{iso-8859-5} @sc{mime} charset.
9186
9187 If you want to read messages in @code{koi8-u}, you can cheat and say
9188
9189 @lisp
9190 (define-coding-system-alias 'koi8-u 'koi8-r)
9191 @end lisp
9192
9193 This will almost do the right thing.
9194
9195 And finally, to read charsets like @code{windows-1251}, you can say
9196 something like
9197
9198 @lisp
9199 (codepage-setup 1251)
9200 (define-coding-system-alias 'windows-1251 'cp1251)
9201 @end lisp
9202
9203
9204 @node Article Commands
9205 @section Article Commands
9206
9207 @table @kbd
9208
9209 @item A P
9210 @cindex PostScript
9211 @cindex printing
9212 @kindex A P (Summary)
9213 @vindex gnus-ps-print-hook
9214 @findex gnus-summary-print-article
9215 Generate and print a PostScript image of the article buffer
9216 (@code{gnus-summary-print-article}).  @code{gnus-ps-print-hook} will
9217 be run just before printing the buffer.  An alternative way to print
9218 article is to use Muttprint (@pxref{Saving Articles}).
9219
9220 @end table
9221
9222
9223 @node Summary Sorting
9224 @section Summary Sorting
9225 @cindex summary sorting
9226
9227 You can have the summary buffer sorted in various ways, even though I
9228 can't really see why you'd want that.
9229
9230 @table @kbd
9231
9232 @item C-c C-s C-n
9233 @kindex C-c C-s C-n (Summary)
9234 @findex gnus-summary-sort-by-number
9235 Sort by article number (@code{gnus-summary-sort-by-number}).
9236
9237 @item C-c C-s C-a
9238 @kindex C-c C-s C-a (Summary)
9239 @findex gnus-summary-sort-by-author
9240 Sort by author (@code{gnus-summary-sort-by-author}).
9241
9242 @item C-c C-s C-s
9243 @kindex C-c C-s C-s (Summary)
9244 @findex gnus-summary-sort-by-subject
9245 Sort by subject (@code{gnus-summary-sort-by-subject}).
9246
9247 @item C-c C-s C-d
9248 @kindex C-c C-s C-d (Summary)
9249 @findex gnus-summary-sort-by-date
9250 Sort by date (@code{gnus-summary-sort-by-date}).
9251
9252 @item C-c C-s C-l
9253 @kindex C-c C-s C-l (Summary)
9254 @findex gnus-summary-sort-by-lines
9255 Sort by lines (@code{gnus-summary-sort-by-lines}).
9256
9257 @item C-c C-s C-c
9258 @kindex C-c C-s C-c (Summary)
9259 @findex gnus-summary-sort-by-chars
9260 Sort by article length (@code{gnus-summary-sort-by-chars}).
9261
9262 @item C-c C-s C-i
9263 @kindex C-c C-s C-i (Summary)
9264 @findex gnus-summary-sort-by-score
9265 Sort by score (@code{gnus-summary-sort-by-score}).
9266
9267 @item C-c C-s C-r
9268 @kindex C-c C-s C-r (Summary)
9269 @findex gnus-summary-sort-by-random
9270 Randomize (@code{gnus-summary-sort-by-random}).
9271
9272 @item C-c C-s C-o
9273 @kindex C-c C-s C-o (Summary)
9274 @findex gnus-summary-sort-by-original
9275 Sort using the default sorting method
9276 (@code{gnus-summary-sort-by-original}).
9277 @end table
9278
9279 These functions will work both when you use threading and when you don't
9280 use threading.  In the latter case, all summary lines will be sorted,
9281 line by line.  In the former case, sorting will be done on a
9282 root-by-root basis, which might not be what you were looking for.  To
9283 toggle whether to use threading, type @kbd{T T} (@pxref{Thread
9284 Commands}).
9285
9286
9287 @node Finding the Parent
9288 @section Finding the Parent
9289 @cindex parent articles
9290 @cindex referring articles
9291
9292 @table @kbd
9293 @item ^
9294 @kindex ^ (Summary)
9295 @findex gnus-summary-refer-parent-article
9296 If you'd like to read the parent of the current article, and it is not
9297 displayed in the summary buffer, you might still be able to.  That is,
9298 if the current group is fetched by @sc{nntp}, the parent hasn't expired
9299 and the @code{References} in the current article are not mangled, you
9300 can just press @kbd{^} or @kbd{A r}
9301 (@code{gnus-summary-refer-parent-article}).  If everything goes well,
9302 you'll get the parent.  If the parent is already displayed in the
9303 summary buffer, point will just move to this article.
9304
9305 If given a positive numerical prefix, fetch that many articles back into
9306 the ancestry.  If given a negative numerical prefix, fetch just that
9307 ancestor.  So if you say @kbd{3 ^}, gnus will fetch the parent, the
9308 grandparent and the grandgrandparent of the current article.  If you say
9309 @kbd{-3 ^}, gnus will only fetch the grandgrandparent of the current
9310 article.
9311
9312 @item A R (Summary)
9313 @findex gnus-summary-refer-references
9314 @kindex A R (Summary)
9315 Fetch all articles mentioned in the @code{References} header of the
9316 article (@code{gnus-summary-refer-references}).
9317
9318 @item A T (Summary)
9319 @findex gnus-summary-refer-thread
9320 @kindex A T (Summary)
9321 Display the full thread where the current article appears
9322 (@code{gnus-summary-refer-thread}).  This command has to fetch all the
9323 headers in the current group to work, so it usually takes a while.  If
9324 you do it often, you may consider setting @code{gnus-fetch-old-headers}
9325 to @code{invisible} (@pxref{Filling In Threads}).  This won't have any
9326 visible effects normally, but it'll make this command work a whole lot
9327 faster.  Of course, it'll make group entry somewhat slow.
9328
9329 @vindex gnus-refer-thread-limit
9330 The @code{gnus-refer-thread-limit} variable says how many old (i. e.,
9331 articles before the first displayed in the current group) headers to
9332 fetch when doing this command.  The default is 200.  If @code{t}, all
9333 the available headers will be fetched.  This variable can be overridden
9334 by giving the @kbd{A T} command a numerical prefix.
9335
9336 @item M-^ (Summary)
9337 @findex gnus-summary-refer-article
9338 @kindex M-^ (Summary)
9339 @cindex Message-ID
9340 @cindex fetching by Message-ID
9341 You can also ask the @sc{nntp} server for an arbitrary article, no
9342 matter what group it belongs to.  @kbd{M-^}
9343 (@code{gnus-summary-refer-article}) will ask you for a
9344 @code{Message-ID}, which is one of those long, hard-to-read thingies
9345 that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}.  You
9346 have to get it all exactly right.  No fuzzy searches, I'm afraid.
9347 @end table
9348
9349 The current select method will be used when fetching by
9350 @code{Message-ID} from non-news select method, but you can override this
9351 by giving this command a prefix.
9352
9353 @vindex gnus-refer-article-method
9354 If the group you are reading is located on a back end that does not
9355 support fetching by @code{Message-ID} very well (like @code{nnspool}),
9356 you can set @code{gnus-refer-article-method} to an @sc{nntp} method.  It
9357 would, perhaps, be best if the @sc{nntp} server you consult is the one
9358 updating the spool you are reading from, but that's not really
9359 necessary.
9360
9361 It can also be a list of select methods, as well as the special symbol
9362 @code{current}, which means to use the current select method.  If it
9363 is a list, Gnus will try all the methods in the list until it finds a
9364 match.
9365
9366 Here's an example setting that will first try the current method, and
9367 then ask Google if that fails:
9368
9369 @lisp
9370 (setq gnus-refer-article-method
9371       '(current
9372         (nnweb "google" (nnweb-type google))))
9373 @end lisp
9374
9375 Most of the mail back ends support fetching by @code{Message-ID}, but
9376 do not do a particularly excellent job at it.  That is, @code{nnmbox},
9377 @code{nnbabyl}, and @code{nnmaildir} are able to locate articles from
9378 any groups, while @code{nnml}, @code{nnfolder}, and @code{nnimap} are
9379 only able to locate articles that have been posted to the current group.
9380 (Anything else would be too time consuming.)  @code{nnmh} does not
9381 support this at all.
9382
9383
9384 @node Alternative Approaches
9385 @section Alternative Approaches
9386
9387 Different people like to read news using different methods.  This being
9388 gnus, we offer a small selection of minor modes for the summary buffers.
9389
9390 @menu
9391 * Pick and Read::               First mark articles and then read them.
9392 * Binary Groups::               Auto-decode all articles.
9393 @end menu
9394
9395
9396 @node Pick and Read
9397 @subsection Pick and Read
9398 @cindex pick and read
9399
9400 Some newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) use
9401 a two-phased reading interface.  The user first marks in a summary
9402 buffer the articles she wants to read.  Then she starts reading the
9403 articles with just an article buffer displayed.
9404
9405 @findex gnus-pick-mode
9406 @kindex M-x gnus-pick-mode
9407 Gnus provides a summary buffer minor mode that allows
9408 this---@code{gnus-pick-mode}.  This basically means that a few process
9409 mark commands become one-keystroke commands to allow easy marking, and
9410 it provides one additional command for switching to the summary buffer.
9411
9412 Here are the available keystrokes when using pick mode:
9413
9414 @table @kbd
9415 @item .
9416 @kindex . (Pick)
9417 @findex gnus-pick-article-or-thread
9418 Pick the article or thread on the current line
9419 (@code{gnus-pick-article-or-thread}).  If the variable
9420 @code{gnus-thread-hide-subtree} is true, then this key selects the
9421 entire thread when used at the first article of the thread.  Otherwise,
9422 it selects just the article.  If given a numerical prefix, go to that
9423 thread or article and pick it.  (The line number is normally displayed
9424 at the beginning of the summary pick lines.)
9425
9426 @item SPACE
9427 @kindex SPACE (Pick)
9428 @findex gnus-pick-next-page
9429 Scroll the summary buffer up one page (@code{gnus-pick-next-page}).  If
9430 at the end of the buffer, start reading the picked articles.
9431
9432 @item u
9433 @kindex u (Pick)
9434 @findex gnus-pick-unmark-article-or-thread.
9435 Unpick the thread or article
9436 (@code{gnus-pick-unmark-article-or-thread}).  If the variable
9437 @code{gnus-thread-hide-subtree} is true, then this key unpicks the
9438 thread if used at the first article of the thread.  Otherwise it unpicks
9439 just the article.  You can give this key a numerical prefix to unpick
9440 the thread or article at that line.
9441
9442 @item RET
9443 @kindex RET (Pick)
9444 @findex gnus-pick-start-reading
9445 @vindex gnus-pick-display-summary
9446 Start reading the picked articles (@code{gnus-pick-start-reading}).  If
9447 given a prefix, mark all unpicked articles as read first.  If
9448 @code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer
9449 will still be visible when you are reading.
9450
9451 @end table
9452
9453 All the normal summary mode commands are still available in the
9454 pick-mode, with the exception of @kbd{u}.  However @kbd{!} is available
9455 which is mapped to the same function
9456 @code{gnus-summary-tick-article-forward}.
9457
9458 If this sounds like a good idea to you, you could say:
9459
9460 @lisp
9461 (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
9462 @end lisp
9463
9464 @vindex gnus-pick-mode-hook
9465 @code{gnus-pick-mode-hook} is run in pick minor mode buffers.
9466
9467 @vindex gnus-mark-unpicked-articles-as-read
9468 If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark
9469 all unpicked articles as read.  The default is @code{nil}.
9470
9471 @vindex gnus-summary-pick-line-format
9472 The summary line format in pick mode is slightly different from the
9473 standard format.  At the beginning of each line the line number is
9474 displayed.  The pick mode line format is controlled by the
9475 @code{gnus-summary-pick-line-format} variable (@pxref{Formatting
9476 Variables}).  It accepts the same format specs that
9477 @code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}).
9478
9479
9480 @node Binary Groups
9481 @subsection Binary Groups
9482 @cindex binary groups
9483
9484 @findex gnus-binary-mode
9485 @kindex M-x gnus-binary-mode
9486 If you spend much time in binary groups, you may grow tired of hitting
9487 @kbd{X u}, @kbd{n}, @kbd{RET} all the time.  @kbd{M-x gnus-binary-mode}
9488 is a minor mode for summary buffers that makes all ordinary Gnus article
9489 selection functions uudecode series of articles and display the result
9490 instead of just displaying the articles the normal way.
9491
9492 @kindex g (Binary)
9493 @findex gnus-binary-show-article
9494 The only way, in fact, to see the actual articles is the @kbd{g}
9495 command, when you have turned on this mode
9496 (@code{gnus-binary-show-article}).
9497
9498 @vindex gnus-binary-mode-hook
9499 @code{gnus-binary-mode-hook} is called in binary minor mode buffers.
9500
9501
9502 @node Tree Display
9503 @section Tree Display
9504 @cindex trees
9505
9506 @vindex gnus-use-trees
9507 If you don't like the normal gnus summary display, you might try setting
9508 @code{gnus-use-trees} to @code{t}.  This will create (by default) an
9509 additional @dfn{tree buffer}.  You can execute all summary mode commands
9510 in the tree buffer.
9511
9512 There are a few variables to customize the tree display, of course:
9513
9514 @table @code
9515 @item gnus-tree-mode-hook
9516 @vindex gnus-tree-mode-hook
9517 A hook called in all tree mode buffers.
9518
9519 @item gnus-tree-mode-line-format
9520 @vindex gnus-tree-mode-line-format
9521 A format string for the mode bar in the tree mode buffers (@pxref{Mode
9522 Line Formatting}).  The default is @samp{Gnus: %%b %S %Z}.  For a list
9523 of valid specs, @pxref{Summary Buffer Mode Line}.
9524
9525 @item gnus-selected-tree-face
9526 @vindex gnus-selected-tree-face
9527 Face used for highlighting the selected article in the tree buffer.  The
9528 default is @code{modeline}.
9529
9530 @item gnus-tree-line-format
9531 @vindex gnus-tree-line-format
9532 A format string for the tree nodes.  The name is a bit of a misnomer,
9533 though---it doesn't define a line, but just the node.  The default value
9534 is @samp{%(%[%3,3n%]%)}, which displays the first three characters of
9535 the name of the poster.  It is vital that all nodes are of the same
9536 length, so you @emph{must} use @samp{%4,4n}-like specifiers.
9537
9538 Valid specs are:
9539
9540 @table @samp
9541 @item n
9542 The name of the poster.
9543 @item f
9544 The @code{From} header.
9545 @item N
9546 The number of the article.
9547 @item [
9548 The opening bracket.
9549 @item ]
9550 The closing bracket.
9551 @item s
9552 The subject.
9553 @end table
9554
9555 @xref{Formatting Variables}.
9556
9557 Variables related to the display are:
9558
9559 @table @code
9560 @item gnus-tree-brackets
9561 @vindex gnus-tree-brackets
9562 This is used for differentiating between ``real'' articles and
9563 ``sparse'' articles.  The format is @code{((@var{real-open} . @var{real-close})
9564 (@var{sparse-open} . @var{sparse-close}) (@var{dummy-open} . @var{dummy-close}))}, and the
9565 default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))}.
9566
9567 @item gnus-tree-parent-child-edges
9568 @vindex gnus-tree-parent-child-edges
9569 This is a list that contains the characters used for connecting parent
9570 nodes to their children.  The default is @code{(?- ?\\ ?|)}.
9571
9572 @end table
9573
9574 @item gnus-tree-minimize-window
9575 @vindex gnus-tree-minimize-window
9576 If this variable is non-@code{nil}, gnus will try to keep the tree
9577 buffer as small as possible to allow more room for the other gnus
9578 windows.  If this variable is a number, the tree buffer will never be
9579 higher than that number.  The default is @code{t}.  Note that if you
9580 have several windows displayed side-by-side in a frame and the tree
9581 buffer is one of these, minimizing the tree window will also resize all
9582 other windows displayed next to it.
9583
9584 You may also wish to add the following hook to keep the window minimized
9585 at all times:
9586
9587 @lisp
9588 (add-hook 'gnus-configure-windows-hook
9589           'gnus-tree-perhaps-minimize)
9590 @end lisp
9591
9592 @item gnus-generate-tree-function
9593 @vindex gnus-generate-tree-function
9594 @findex gnus-generate-horizontal-tree
9595 @findex gnus-generate-vertical-tree
9596 The function that actually generates the thread tree.  Two predefined
9597 functions are available: @code{gnus-generate-horizontal-tree} and
9598 @code{gnus-generate-vertical-tree} (which is the default).
9599
9600 @end table
9601
9602 Here's an example from a horizontal tree buffer:
9603
9604 @example
9605 @{***@}-(***)-[odd]-[Gun]
9606      |      \[Jan]
9607      |      \[odd]-[Eri]
9608      |      \(***)-[Eri]
9609      |            \[odd]-[Paa]
9610      \[Bjo]
9611      \[Gun]
9612      \[Gun]-[Jor]
9613 @end example
9614
9615 Here's the same thread displayed in a vertical tree buffer:
9616
9617 @example
9618 @{***@}
9619   |--------------------------\-----\-----\
9620 (***)                         [Bjo] [Gun] [Gun]
9621   |--\-----\-----\                          |
9622 [odd] [Jan] [odd] (***)                   [Jor]
9623   |           |     |--\
9624 [Gun]       [Eri] [Eri] [odd]
9625                           |
9626                         [Paa]
9627 @end example
9628
9629 If you're using horizontal trees, it might be nice to display the trees
9630 side-by-side with the summary buffer.  You could add something like the
9631 following to your @file{.gnus.el} file:
9632
9633 @lisp
9634 (setq gnus-use-trees t
9635       gnus-generate-tree-function 'gnus-generate-horizontal-tree
9636       gnus-tree-minimize-window nil)
9637 (gnus-add-configuration
9638  '(article
9639    (vertical 1.0
9640              (horizontal 0.25
9641                          (summary 0.75 point)
9642                          (tree 1.0))
9643              (article 1.0))))
9644 @end lisp
9645
9646 @xref{Window Layout}.
9647
9648
9649 @node Mail Group Commands
9650 @section Mail Group Commands
9651 @cindex mail group commands
9652
9653 Some commands only make sense in mail groups.  If these commands are
9654 invalid in the current group, they will raise a hell and let you know.
9655
9656 All these commands (except the expiry and edit commands) use the
9657 process/prefix convention (@pxref{Process/Prefix}).
9658
9659 @table @kbd
9660
9661 @item B e
9662 @kindex B e (Summary)
9663 @findex gnus-summary-expire-articles
9664 Run all expirable articles in the current group through the expiry
9665 process (@code{gnus-summary-expire-articles}).  That is, delete all
9666 expirable articles in the group that have been around for a while.
9667 (@pxref{Expiring Mail}).
9668
9669 @item B C-M-e
9670 @kindex B C-M-e (Summary)
9671 @findex gnus-summary-expire-articles-now
9672 Delete all the expirable articles in the group
9673 (@code{gnus-summary-expire-articles-now}).  This means that @strong{all}
9674 articles eligible for expiry in the current group will
9675 disappear forever into that big @file{/dev/null} in the sky.
9676
9677 @item B DEL
9678 @kindex B DEL (Summary)
9679 @findex gnus-summary-delete-article
9680 @c @icon{gnus-summary-mail-delete}
9681 Delete the mail article.  This is ``delete'' as in ``delete it from your
9682 disk forever and ever, never to return again.'' Use with caution.
9683 (@code{gnus-summary-delete-article}).
9684
9685 @item B m
9686 @kindex B m (Summary)
9687 @cindex move mail
9688 @findex gnus-summary-move-article
9689 @vindex gnus-preserve-marks
9690 Move the article from one mail group to another
9691 (@code{gnus-summary-move-article}).  Marks will be preserved if
9692 @code{gnus-preserve-marks} is non-@code{nil} (which is the default).
9693
9694 @item B c
9695 @kindex B c (Summary)
9696 @cindex copy mail
9697 @findex gnus-summary-copy-article
9698 @c @icon{gnus-summary-mail-copy}
9699 Copy the article from one group (mail group or not) to a mail group
9700 (@code{gnus-summary-copy-article}).  Marks will be preserved if
9701 @code{gnus-preserve-marks} is non-@code{nil} (which is the default).
9702
9703 @item B B
9704 @kindex B B (Summary)
9705 @cindex crosspost mail
9706 @findex gnus-summary-crosspost-article
9707 Crosspost the current article to some other group
9708 (@code{gnus-summary-crosspost-article}).  This will create a new copy of
9709 the article in the other group, and the Xref headers of the article will
9710 be properly updated.
9711
9712 @item B i
9713 @kindex B i (Summary)
9714 @findex gnus-summary-import-article
9715 Import an arbitrary file into the current mail newsgroup
9716 (@code{gnus-summary-import-article}).  You will be prompted for a file
9717 name, a @code{From} header and a @code{Subject} header.
9718
9719 @item B I
9720 @kindex B I (Summary)
9721 @findex gnus-summary-create-article
9722 Create an empty article in the current mail newsgroups
9723 (@code{gnus-summary-create-article}).  You will be prompted for a
9724 @code{From} header and a @code{Subject} header.
9725
9726 @item B r
9727 @kindex B r (Summary)
9728 @findex gnus-summary-respool-article
9729 @vindex gnus-summary-respool-default-method
9730 Respool the mail article (@code{gnus-summary-respool-article}).
9731 @code{gnus-summary-respool-default-method} will be used as the default
9732 select method when respooling.  This variable is @code{nil} by default,
9733 which means that the current group select method will be used instead.
9734 Marks will be preserved if @code{gnus-preserve-marks} is non-@code{nil}
9735 (which is the default).
9736
9737 @item B w
9738 @itemx e
9739 @kindex B w (Summary)
9740 @kindex e (Summary)
9741 @findex gnus-summary-edit-article
9742 @kindex C-c C-c (Article)
9743 @findex gnus-summary-edit-article-done
9744 Edit the current article (@code{gnus-summary-edit-article}).  To finish
9745 editing and make the changes permanent, type @kbd{C-c C-c}
9746 (@code{gnus-summary-edit-article-done}).  If you give a prefix to the
9747 @kbd{C-c C-c} command, gnus won't re-highlight the article.
9748
9749 @item B q
9750 @kindex B q (Summary)
9751 @findex gnus-summary-respool-query
9752 If you want to re-spool an article, you might be curious as to what group
9753 the article will end up in before you do the re-spooling.  This command
9754 will tell you (@code{gnus-summary-respool-query}).
9755
9756 @item B t
9757 @kindex B t (Summary)
9758 @findex gnus-summary-respool-trace
9759 Similarly, this command will display all fancy splitting patterns used
9760 when respooling, if any (@code{gnus-summary-respool-trace}).
9761
9762 @item B p
9763 @kindex B p (Summary)
9764 @findex gnus-summary-article-posted-p
9765 Some people have a tendency to send you "courtesy" copies when they
9766 follow up to articles you have posted.  These usually have a
9767 @code{Newsgroups} header in them, but not always.  This command
9768 (@code{gnus-summary-article-posted-p}) will try to fetch the current
9769 article from your news server (or rather, from
9770 @code{gnus-refer-article-method} or @code{gnus-select-method}) and will
9771 report back whether it found the article or not.  Even if it says that
9772 it didn't find the article, it may have been posted anyway---mail
9773 propagation is much faster than news propagation, and the news copy may
9774 just not have arrived yet.
9775
9776 @item K E
9777 @kindex K E (Summary)
9778 @findex gnus-article-encrypt-body
9779 @vindex gnus-article-encrypt-protocol
9780 Encrypt the body of an article (@code{gnus-article-encrypt-body}).
9781 The body is encrypted with the encryption protocol specified by the
9782 variable @code{gnus-article-encrypt-protocol}.
9783
9784 @end table
9785
9786 @vindex gnus-move-split-methods
9787 @cindex moving articles
9788 If you move (or copy) articles regularly, you might wish to have gnus
9789 suggest where to put the articles.  @code{gnus-move-split-methods} is a
9790 variable that uses the same syntax as @code{gnus-split-methods}
9791 (@pxref{Saving Articles}).  You may customize that variable to create
9792 suggestions you find reasonable.  (Note that
9793 @code{gnus-move-split-methods} uses group names where
9794 @code{gnus-split-methods} uses file names.)
9795
9796 @lisp
9797 (setq gnus-move-split-methods
9798       '(("^From:.*Lars Magne" "nnml:junk")
9799         ("^Subject:.*gnus" "nnfolder:important")
9800         (".*" "nnml:misc")))
9801 @end lisp
9802
9803
9804 @node Various Summary Stuff
9805 @section Various Summary Stuff
9806
9807 @menu
9808 * Summary Group Information::   Information oriented commands.
9809 * Searching for Articles::      Multiple article commands.
9810 * Summary Generation Commands::  
9811 * Really Various Summary Commands::  Those pesky non-conformant commands.
9812 @end menu
9813
9814 @table @code
9815 @vindex gnus-summary-display-while-building
9816 @item gnus-summary-display-while-building
9817 If non-@code{nil}, show and update the summary buffer as it's being
9818 built.  If @code{t}, update the buffer after every line is inserted.
9819 If the value is an integer, @var{n}, update the display every @var{n}
9820 lines.  The default is @code{nil}.
9821
9822 @vindex gnus-summary-mode-hook
9823 @item gnus-summary-mode-hook
9824 This hook is called when creating a summary mode buffer.
9825
9826 @vindex gnus-summary-generate-hook
9827 @item gnus-summary-generate-hook
9828 This is called as the last thing before doing the threading and the
9829 generation of the summary buffer.  It's quite convenient for customizing
9830 the threading variables based on what data the newsgroup has.  This hook
9831 is called from the summary buffer after most summary buffer variables
9832 have been set.
9833
9834 @vindex gnus-summary-prepare-hook
9835 @item gnus-summary-prepare-hook
9836 It is called after the summary buffer has been generated.  You might use
9837 it to, for instance, highlight lines or modify the look of the buffer in
9838 some other ungodly manner.  I don't care.
9839
9840 @vindex gnus-summary-prepared-hook
9841 @item gnus-summary-prepared-hook
9842 A hook called as the very last thing after the summary buffer has been
9843 generated.
9844
9845 @vindex gnus-summary-ignore-duplicates
9846 @item gnus-summary-ignore-duplicates
9847 When gnus discovers two articles that have the same @code{Message-ID},
9848 it has to do something drastic.  No articles are allowed to have the
9849 same @code{Message-ID}, but this may happen when reading mail from some
9850 sources.  Gnus allows you to customize what happens with this variable.
9851 If it is @code{nil} (which is the default), gnus will rename the
9852 @code{Message-ID} (for display purposes only) and display the article as
9853 any other article.  If this variable is @code{t}, it won't display the
9854 article---it'll be as if it never existed.
9855
9856 @vindex gnus-alter-articles-to-read-function
9857 @item gnus-alter-articles-to-read-function
9858 This function, which takes two parameters (the group name and the list
9859 of articles to be selected), is called to allow the user to alter the
9860 list of articles to be selected.
9861
9862 For instance, the following function adds the list of cached articles to
9863 the list in one particular group:
9864
9865 @lisp
9866 (defun my-add-cached-articles (group articles)
9867   (if (string= group "some.group")
9868       (append gnus-newsgroup-cached articles)
9869     articles))
9870 @end lisp
9871
9872 @vindex gnus-newsgroup-variables
9873 @item gnus-newsgroup-variables
9874 A list of newsgroup (summary buffer) local variables, or cons of
9875 variables and their default values (when the default values are not
9876 nil), that should be made global while the summary buffer is active.
9877 These variables can be used to set variables in the group parameters
9878 while still allowing them to affect operations done in other
9879 buffers. For example:
9880
9881 @lisp
9882 (setq gnus-newsgroup-variables
9883      '(message-use-followup-to
9884        (gnus-visible-headers .
9885          "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^To:")))
9886 @end lisp
9887
9888 @end table
9889
9890
9891 @node Summary Group Information
9892 @subsection Summary Group Information
9893
9894 @table @kbd
9895
9896 @item H f
9897 @kindex H f (Summary)
9898 @findex gnus-summary-fetch-faq
9899 @vindex gnus-group-faq-directory
9900 Try to fetch the FAQ (list of frequently asked questions) for the
9901 current group (@code{gnus-summary-fetch-faq}).  Gnus will try to get the
9902 FAQ from @code{gnus-group-faq-directory}, which is usually a directory
9903 on a remote machine.  This variable can also be a list of directories.
9904 In that case, giving a prefix to this command will allow you to choose
9905 between the various sites.  @code{ange-ftp} or @code{efs} will probably
9906 be used for fetching the file.
9907
9908 @item H d
9909 @kindex H d (Summary)
9910 @findex gnus-summary-describe-group
9911 Give a brief description of the current group
9912 (@code{gnus-summary-describe-group}).  If given a prefix, force
9913 rereading the description from the server.
9914
9915 @item H h
9916 @kindex H h (Summary)
9917 @findex gnus-summary-describe-briefly
9918 Give an extremely brief description of the most important summary
9919 keystrokes (@code{gnus-summary-describe-briefly}).
9920
9921 @item H i
9922 @kindex H i (Summary)
9923 @findex gnus-info-find-node
9924 Go to the gnus info node (@code{gnus-info-find-node}).
9925 @end table
9926
9927
9928 @node Searching for Articles
9929 @subsection Searching for Articles
9930
9931 @table @kbd
9932
9933 @item M-s
9934 @kindex M-s (Summary)
9935 @findex gnus-summary-search-article-forward
9936 Search through all subsequent (raw) articles for a regexp
9937 (@code{gnus-summary-search-article-forward}).
9938
9939 @item M-r
9940 @kindex M-r (Summary)
9941 @findex gnus-summary-search-article-backward
9942 Search through all previous (raw) articles for a regexp
9943 (@code{gnus-summary-search-article-backward}).
9944
9945 @item &
9946 @kindex & (Summary)
9947 @findex gnus-summary-execute-command
9948 This command will prompt you for a header, a regular expression to match
9949 on this field, and a command to be executed if the match is made
9950 (@code{gnus-summary-execute-command}).  If the header is an empty
9951 string, the match is done on the entire article.  If given a prefix,
9952 search backward instead.
9953
9954 For instance, @kbd{& RET some.*string #} will put the process mark on
9955 all articles that have heads or bodies that match @samp{some.*string}.
9956
9957 @item M-&
9958 @kindex M-& (Summary)
9959 @findex gnus-summary-universal-argument
9960 Perform any operation on all articles that have been marked with
9961 the process mark (@code{gnus-summary-universal-argument}).
9962 @end table
9963
9964 @node Summary Generation Commands
9965 @subsection Summary Generation Commands
9966
9967 @table @kbd
9968
9969 @item Y g
9970 @kindex Y g (Summary)
9971 @findex gnus-summary-prepare
9972 Regenerate the current summary buffer (@code{gnus-summary-prepare}).
9973
9974 @item Y c
9975 @kindex Y c (Summary)
9976 @findex gnus-summary-insert-cached-articles
9977 Pull all cached articles (for the current group) into the summary buffer
9978 (@code{gnus-summary-insert-cached-articles}).
9979
9980 @item Y d
9981 @kindex Y d (Summary)
9982 @findex gnus-summary-insert-dormant-articles
9983 Pull all dormant articles (for the current group) into the summary buffer
9984 (@code{gnus-summary-insert-dormant-articles}).
9985
9986 @end table
9987
9988
9989 @node Really Various Summary Commands
9990 @subsection Really Various Summary Commands
9991
9992 @table @kbd
9993
9994 @item A D
9995 @itemx C-d
9996 @kindex C-d (Summary)
9997 @kindex A D (Summary)
9998 @findex gnus-summary-enter-digest-group
9999 If the current article is a collection of other articles (for instance,
10000 a digest), you might use this command to enter a group based on the that
10001 article (@code{gnus-summary-enter-digest-group}).  Gnus will try to
10002 guess what article type is currently displayed unless you give a prefix
10003 to this command, which forces a ``digest'' interpretation.  Basically,
10004 whenever you see a message that is a collection of other messages of
10005 some format, you @kbd{C-d} and read these messages in a more convenient
10006 fashion.
10007
10008 @item C-M-d
10009 @kindex C-M-d (Summary)
10010 @findex gnus-summary-read-document
10011 This command is very similar to the one above, but lets you gather
10012 several documents into one biiig group
10013 (@code{gnus-summary-read-document}).  It does this by opening several
10014 @code{nndoc} groups for each document, and then opening an
10015 @code{nnvirtual} group on top of these @code{nndoc} groups.  This
10016 command understands the process/prefix convention
10017 (@pxref{Process/Prefix}).
10018
10019 @item C-t
10020 @kindex C-t (Summary)
10021 @findex gnus-summary-toggle-truncation
10022 Toggle truncation of summary lines
10023 (@code{gnus-summary-toggle-truncation}).  This will probably confuse the
10024 line centering function in the summary buffer, so it's not a good idea
10025 to have truncation switched off while reading articles.
10026
10027 @item =
10028 @kindex = (Summary)
10029 @findex gnus-summary-expand-window
10030 Expand the summary buffer window (@code{gnus-summary-expand-window}).
10031 If given a prefix, force an @code{article} window configuration.
10032
10033 @item C-M-e
10034 @kindex C-M-e (Summary)
10035 @findex gnus-summary-edit-parameters
10036 Edit the group parameters (@pxref{Group Parameters}) of the current
10037 group (@code{gnus-summary-edit-parameters}).
10038
10039 @item C-M-a
10040 @kindex C-M-a (Summary)
10041 @findex gnus-summary-customize-parameters
10042 Customize the group parameters (@pxref{Group Parameters}) of the current
10043 group (@code{gnus-summary-customize-parameters}).
10044
10045 @end table
10046
10047
10048 @node Exiting the Summary Buffer
10049 @section Exiting the Summary Buffer
10050 @cindex summary exit
10051 @cindex exiting groups
10052
10053 Exiting from the summary buffer will normally update all info on the
10054 group and return you to the group buffer.
10055
10056 @table @kbd
10057
10058 @item Z Z
10059 @itemx q
10060 @kindex Z Z (Summary)
10061 @kindex q (Summary)
10062 @findex gnus-summary-exit
10063 @vindex gnus-summary-exit-hook
10064 @vindex gnus-summary-prepare-exit-hook
10065 @vindex gnus-group-no-more-groups-hook
10066 @c @icon{gnus-summary-exit}
10067 Exit the current group and update all information on the group
10068 (@code{gnus-summary-exit}).  @code{gnus-summary-prepare-exit-hook} is
10069 called before doing much of the exiting, which calls
10070 @code{gnus-summary-expire-articles} by default.
10071 @code{gnus-summary-exit-hook} is called after finishing the exit
10072 process.  @code{gnus-group-no-more-groups-hook} is run when returning to
10073 group mode having no more (unread) groups.
10074
10075 @item Z E
10076 @itemx Q
10077 @kindex Z E (Summary)
10078 @kindex Q (Summary)
10079 @findex gnus-summary-exit-no-update
10080 Exit the current group without updating any information on the group
10081 (@code{gnus-summary-exit-no-update}).
10082
10083 @item Z c
10084 @itemx c
10085 @kindex Z c (Summary)
10086 @kindex c (Summary)
10087 @findex gnus-summary-catchup-and-exit
10088 @c @icon{gnus-summary-catchup-and-exit}
10089 Mark all unticked articles in the group as read and then exit
10090 (@code{gnus-summary-catchup-and-exit}).
10091
10092 @item Z C
10093 @kindex Z C (Summary)
10094 @findex gnus-summary-catchup-all-and-exit
10095 Mark all articles, even the ticked ones, as read and then exit
10096 (@code{gnus-summary-catchup-all-and-exit}).
10097
10098 @item Z n
10099 @kindex Z n (Summary)
10100 @findex gnus-summary-catchup-and-goto-next-group
10101 Mark all articles as read and go to the next group
10102 (@code{gnus-summary-catchup-and-goto-next-group}).
10103
10104 @item Z R
10105 @kindex Z R (Summary)
10106 @findex gnus-summary-reselect-current-group
10107 Exit this group, and then enter it again
10108 (@code{gnus-summary-reselect-current-group}).  If given a prefix, select
10109 all articles, both read and unread.
10110
10111 @item Z G
10112 @itemx M-g
10113 @kindex Z G (Summary)
10114 @kindex M-g (Summary)
10115 @findex gnus-summary-rescan-group
10116 @c @icon{gnus-summary-mail-get}
10117 Exit the group, check for new articles in the group, and select the
10118 group (@code{gnus-summary-rescan-group}).  If given a prefix, select all
10119 articles, both read and unread.
10120
10121 @item Z N
10122 @kindex Z N (Summary)
10123 @findex gnus-summary-next-group
10124 Exit the group and go to the next group
10125 (@code{gnus-summary-next-group}).
10126
10127 @item Z P
10128 @kindex Z P (Summary)
10129 @findex gnus-summary-prev-group
10130 Exit the group and go to the previous group
10131 (@code{gnus-summary-prev-group}).
10132
10133 @item Z s
10134 @kindex Z s (Summary)
10135 @findex gnus-summary-save-newsrc
10136 Save the current number of read/marked articles in the dribble buffer
10137 and then save the dribble buffer (@code{gnus-summary-save-newsrc}).  If
10138 given a prefix, also save the @file{.newsrc} file(s).  Using this
10139 command will make exit without updating (the @kbd{Q} command) worthless.
10140 @end table
10141
10142 @vindex gnus-exit-group-hook
10143 @code{gnus-exit-group-hook} is called when you exit the current group
10144 with an ``updating'' exit.  For instance @kbd{Q}
10145 (@code{gnus-summary-exit-no-update}) does not call this hook.
10146
10147 @findex gnus-summary-wake-up-the-dead
10148 @findex gnus-dead-summary-mode
10149 @vindex gnus-kill-summary-on-exit
10150 If you're in the habit of exiting groups, and then changing your mind
10151 about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}.
10152 If you do that, gnus won't kill the summary buffer when you exit it.
10153 (Quelle surprise!)  Instead it will change the name of the buffer to
10154 something like @samp{*Dead Summary ... *} and install a minor mode
10155 called @code{gnus-dead-summary-mode}.  Now, if you switch back to this
10156 buffer, you'll find that all keys are mapped to a function called
10157 @code{gnus-summary-wake-up-the-dead}.  So tapping any keys in a dead
10158 summary buffer will result in a live, normal summary buffer.
10159
10160 There will never be more than one dead summary buffer at any one time.
10161
10162 @vindex gnus-use-cross-reference
10163 The data on the current group will be updated (which articles you have
10164 read, which articles you have replied to, etc.) when you exit the
10165 summary buffer.  If the @code{gnus-use-cross-reference} variable is
10166 @code{t} (which is the default), articles that are cross-referenced to
10167 this group and are marked as read, will also be marked as read in the
10168 other subscribed groups they were cross-posted to.  If this variable is
10169 neither @code{nil} nor @code{t}, the article will be marked as read in
10170 both subscribed and unsubscribed groups (@pxref{Crosspost Handling}).
10171
10172
10173 @node Crosspost Handling
10174 @section Crosspost Handling
10175
10176 @cindex velveeta
10177 @cindex spamming
10178 Marking cross-posted articles as read ensures that you'll never have to
10179 read the same article more than once.  Unless, of course, somebody has
10180 posted it to several groups separately.  Posting the same article to
10181 several groups (not cross-posting) is called @dfn{spamming}, and you are
10182 by law required to send nasty-grams to anyone who perpetrates such a
10183 heinous crime.  You may want to try NoCeM handling to filter out spam
10184 (@pxref{NoCeM}).
10185
10186 Remember: Cross-posting is kinda ok, but posting the same article
10187 separately to several groups is not.  Massive cross-posting (aka.
10188 @dfn{velveeta}) is to be avoided at all costs, and you can even use the
10189 @code{gnus-summary-mail-crosspost-complaint} command to complain about
10190 excessive crossposting (@pxref{Summary Mail Commands}).
10191
10192 @cindex cross-posting
10193 @cindex Xref
10194 @cindex @sc{nov}
10195 One thing that may cause Gnus to not do the cross-posting thing
10196 correctly is if you use an @sc{nntp} server that supports @sc{xover}
10197 (which is very nice, because it speeds things up considerably) which
10198 does not include the @code{Xref} header in its @sc{nov} lines.  This is
10199 Evil, but all too common, alas, alack.  Gnus tries to Do The Right Thing
10200 even with @sc{xover} by registering the @code{Xref} lines of all
10201 articles you actually read, but if you kill the articles, or just mark
10202 them as read without reading them, Gnus will not get a chance to snoop
10203 the @code{Xref} lines out of these articles, and will be unable to use
10204 the cross reference mechanism.
10205
10206 @cindex LIST overview.fmt
10207 @cindex overview.fmt
10208 To check whether your @sc{nntp} server includes the @code{Xref} header
10209 in its overview files, try @samp{telnet your.nntp.server nntp},
10210 @samp{MODE READER} on @code{inn} servers, and then say @samp{LIST
10211 overview.fmt}.  This may not work, but if it does, and the last line you
10212 get does not read @samp{Xref:full}, then you should shout and whine at
10213 your news admin until she includes the @code{Xref} header in the
10214 overview files.
10215
10216 @vindex gnus-nov-is-evil
10217 If you want Gnus to get the @code{Xref}s right all the time, you have to
10218 set @code{gnus-nov-is-evil} to @code{t}, which slows things down
10219 considerably.
10220
10221 C'est la vie.
10222
10223 For an alternative approach, @pxref{Duplicate Suppression}.
10224
10225
10226 @node Duplicate Suppression
10227 @section Duplicate Suppression
10228
10229 By default, gnus tries to make sure that you don't have to read the same
10230 article more than once by utilizing the crossposting mechanism
10231 (@pxref{Crosspost Handling}).  However, that simple and efficient
10232 approach may not work satisfactory for some users for various
10233 reasons.
10234
10235 @enumerate
10236 @item
10237 The @sc{nntp} server may fail to generate the @code{Xref} header.  This
10238 is evil and not very common.
10239
10240 @item
10241 The @sc{nntp} server may fail to include the @code{Xref} header in the
10242 @file{.overview} data bases.  This is evil and all too common, alas.
10243
10244 @item
10245 You may be reading the same group (or several related groups) from
10246 different @sc{nntp} servers.
10247
10248 @item
10249 You may be getting mail that duplicates articles posted to groups.
10250 @end enumerate
10251
10252 I'm sure there are other situations where @code{Xref} handling fails as
10253 well, but these four are the most common situations.
10254
10255 If, and only if, @code{Xref} handling fails for you, then you may
10256 consider switching on @dfn{duplicate suppression}.  If you do so, Gnus
10257 will remember the @code{Message-ID}s of all articles you have read or
10258 otherwise marked as read, and then, as if by magic, mark them as read
10259 all subsequent times you see them---in @emph{all} groups.  Using this
10260 mechanism is quite likely to be somewhat inefficient, but not overly
10261 so.  It's certainly preferable to reading the same articles more than
10262 once.
10263
10264 Duplicate suppression is not a very subtle instrument.  It's more like a
10265 sledge hammer than anything else.  It works in a very simple
10266 fashion---if you have marked an article as read, it adds this Message-ID
10267 to a cache.  The next time it sees this Message-ID, it will mark the
10268 article as read with the @samp{M} mark.  It doesn't care what group it
10269 saw the article in.
10270
10271 @table @code
10272 @item gnus-suppress-duplicates
10273 @vindex gnus-suppress-duplicates
10274 If non-@code{nil}, suppress duplicates.
10275
10276 @item gnus-save-duplicate-list
10277 @vindex gnus-save-duplicate-list
10278 If non-@code{nil}, save the list of duplicates to a file.  This will
10279 make startup and shutdown take longer, so the default is @code{nil}.
10280 However, this means that only duplicate articles read in a single gnus
10281 session are suppressed.
10282
10283 @item gnus-duplicate-list-length
10284 @vindex gnus-duplicate-list-length
10285 This variable says how many @code{Message-ID}s to keep in the duplicate
10286 suppression list.  The default is 10000.
10287
10288 @item gnus-duplicate-file
10289 @vindex gnus-duplicate-file
10290 The name of the file to store the duplicate suppression list in.  The
10291 default is @file{~/News/suppression}.
10292 @end table
10293
10294 If you have a tendency to stop and start gnus often, setting
10295 @code{gnus-save-duplicate-list} to @code{t} is probably a good idea.  If
10296 you leave gnus running for weeks on end, you may have it @code{nil}.  On
10297 the other hand, saving the list makes startup and shutdown much slower,
10298 so that means that if you stop and start gnus often, you should set
10299 @code{gnus-save-duplicate-list} to @code{nil}.  Uhm.  I'll leave this up
10300 to you to figure out, I think.
10301
10302 @node Security
10303 @section Security
10304
10305 Gnus is able to verify signed messages or decrypt encrypted messages.
10306 The formats that are supported are PGP, @sc{pgp/mime} and @sc{s/mime},
10307 however you need some external programs to get things to work:
10308
10309 @enumerate
10310 @item
10311 To handle PGP and PGP/MIME messages, you have to install an OpenPGP
10312 implementation such as GnuPG.  The lisp interface to GnuPG included
10313 with Gnus is called PGG (@pxref{Top, ,PGG, pgg, PGG Manual}), but
10314 Mailcrypt and gpg.el are also supported.
10315
10316 @item
10317 To handle @sc{s/mime} message, you need to install OpenSSL.  OpenSSL 0.9.6
10318 or newer is recommended.
10319
10320 @end enumerate
10321
10322 More information on how to set things up can be found in the message
10323 manual (@pxref{Security, ,Security, message, Message Manual}).
10324
10325 @table @code
10326 @item mm-verify-option
10327 @vindex mm-verify-option
10328 Option of verifying signed parts.  @code{never}, not verify;
10329 @code{always}, always verify; @code{known}, only verify known
10330 protocols. Otherwise, ask user.
10331
10332 @item mm-decrypt-option
10333 @vindex mm-decrypt-option
10334 Option of decrypting encrypted parts.  @code{never}, no decryption;
10335 @code{always}, always decrypt; @code{known}, only decrypt known
10336 protocols. Otherwise, ask user.
10337
10338 @item mml1991-use
10339 @vindex mml1991-use
10340 Symbol indicating elisp interface to OpenPGP implementation for PGP
10341 messages.  The default is @code{pgg}, but @code{mailcrypt} and
10342 @code{gpg} are also supported although deprecated.
10343
10344 @item mml2015-use
10345 @vindex mml2015-use
10346 Symbol indicating elisp interface to OpenPGP implementation for
10347 PGP/MIME messages.  The default is @code{pgg}, but @code{mailcrypt}
10348 and @code{gpg} are also supported although deprecated.
10349
10350 @end table
10351
10352 @node Mailing List
10353 @section Mailing List
10354
10355 @kindex A M (summary)
10356 @findex gnus-mailing-list-insinuate
10357 Gnus understands some mailing list fields of RFC 2369.  To enable it,
10358 either add a `to-list' group parameter (@pxref{Group Parameters}),
10359 possibly using @kbd{A M} (@code{gnus-mailing-list-insinuate}) in the
10360 summary buffer, or say:
10361
10362 @lisp
10363 (add-hook 'gnus-summary-mode-hook 'turn-on-gnus-mailing-list-mode)
10364 @end lisp
10365
10366 That enables the following commands to the summary buffer:
10367
10368 @table @kbd
10369
10370 @item C-c C-n h
10371 @kindex C-c C-n h (Summary)
10372 @findex gnus-mailing-list-help
10373 Send a message to fetch mailing list help, if List-Help field exists.
10374
10375 @item C-c C-n s
10376 @kindex C-c C-n s (Summary)
10377 @findex gnus-mailing-list-subscribe
10378 Send a message to subscribe the mailing list, if List-Subscribe field exists.
10379
10380 @item C-c C-n u
10381 @kindex C-c C-n u (Summary)
10382 @findex gnus-mailing-list-unsubscribe
10383 Send a message to unsubscribe the mailing list, if List-Unsubscribe
10384 field exists.
10385
10386 @item C-c C-n p
10387 @kindex C-c C-n p (Summary)
10388 @findex gnus-mailing-list-post
10389 Post to the mailing list, if List-Post field exists.
10390
10391 @item C-c C-n o
10392 @kindex C-c C-n o (Summary)
10393 @findex gnus-mailing-list-owner
10394 Send a message to the mailing list owner, if List-Owner field exists.
10395
10396 @item C-c C-n a
10397 @kindex C-c C-n a (Summary)
10398 @findex gnus-mailing-list-owner
10399 Browse the mailing list archive, if List-Archive field exists.
10400
10401 @end table
10402
10403 @node Article Buffer
10404 @chapter Article Buffer
10405 @cindex article buffer
10406
10407 The articles are displayed in the article buffer, of which there is only
10408 one.  All the summary buffers share the same article buffer unless you
10409 tell gnus otherwise.
10410
10411 @menu
10412 * Hiding Headers::              Deciding what headers should be displayed.
10413 * Using MIME::                  Pushing articles through @sc{mime} before reading them.
10414 * Customizing Articles::        Tailoring the look of the articles.
10415 * Article Keymap::              Keystrokes available in the article buffer.
10416 * Misc Article::                Other stuff.
10417 @end menu
10418
10419
10420 @node Hiding Headers
10421 @section Hiding Headers
10422 @cindex hiding headers
10423 @cindex deleting headers
10424
10425 The top section of each article is the @dfn{head}.  (The rest is the
10426 @dfn{body}, but you may have guessed that already.)
10427
10428 @vindex gnus-show-all-headers
10429 There is a lot of useful information in the head: the name of the person
10430 who wrote the article, the date it was written and the subject of the
10431 article.  That's well and nice, but there's also lots of information
10432 most people do not want to see---what systems the article has passed
10433 through before reaching you, the @code{Message-ID}, the
10434 @code{References}, etc. ad nauseum---and you'll probably want to get rid
10435 of some of those lines.  If you want to keep all those lines in the
10436 article buffer, you can set @code{gnus-show-all-headers} to @code{t}.
10437
10438 Gnus provides you with two variables for sifting headers:
10439
10440 @table @code
10441
10442 @item gnus-visible-headers
10443 @vindex gnus-visible-headers
10444 If this variable is non-@code{nil}, it should be a regular expression
10445 that says what headers you wish to keep in the article buffer.  All
10446 headers that do not match this variable will be hidden.
10447
10448 For instance, if you only want to see the name of the person who wrote
10449 the article and the subject, you'd say:
10450
10451 @lisp
10452 (setq gnus-visible-headers "^From:\\|^Subject:")
10453 @end lisp
10454
10455 This variable can also be a list of regexps to match headers to
10456 remain visible.
10457
10458 @item gnus-ignored-headers
10459 @vindex gnus-ignored-headers
10460 This variable is the reverse of @code{gnus-visible-headers}.  If this
10461 variable is set (and @code{gnus-visible-headers} is @code{nil}), it
10462 should be a regular expression that matches all lines that you want to
10463 hide.  All lines that do not match this variable will remain visible.
10464
10465 For instance, if you just want to get rid of the @code{References} field
10466 and the @code{Xref} field, you might say:
10467
10468 @lisp
10469 (setq gnus-ignored-headers "^References:\\|^Xref:")
10470 @end lisp
10471
10472 This variable can also be a list of regexps to match headers to
10473 be removed.
10474
10475 Note that if @code{gnus-visible-headers} is non-@code{nil}, this
10476 variable will have no effect.
10477
10478 @end table
10479
10480 @vindex gnus-sorted-header-list
10481 Gnus can also sort the headers for you.  (It does this by default.)  You
10482 can control the sorting by setting the @code{gnus-sorted-header-list}
10483 variable.  It is a list of regular expressions that says in what order
10484 the headers are to be displayed.
10485
10486 For instance, if you want the name of the author of the article first,
10487 and then the subject, you might say something like:
10488
10489 @lisp
10490 (setq gnus-sorted-header-list '("^From:" "^Subject:"))
10491 @end lisp
10492
10493 Any headers that are to remain visible, but are not listed in this
10494 variable, will be displayed in random order after all the headers listed in this variable.
10495
10496 @findex gnus-article-hide-boring-headers
10497 @vindex gnus-boring-article-headers
10498 You can hide further boring headers by setting
10499 @code{gnus-treat-hide-boring-headers} to @code{head}.  What this function
10500 does depends on the @code{gnus-boring-article-headers} variable.  It's a
10501 list, but this list doesn't actually contain header names.  Instead is
10502 lists various @dfn{boring conditions} that Gnus can check and remove
10503 from sight.
10504
10505 These conditions are:
10506 @table @code
10507 @item empty
10508 Remove all empty headers.
10509 @item followup-to
10510 Remove the @code{Followup-To} header if it is identical to the
10511 @code{Newsgroups} header.
10512 @item reply-to
10513 Remove the @code{Reply-To} header if it lists the same address as the
10514 @code{From} header.
10515 @item newsgroups
10516 Remove the @code{Newsgroups} header if it only contains the current group
10517 name.
10518 @item to-address
10519 Remove the @code{To} header if it only contains the address identical to
10520 the current groups's @code{to-address} parameter.
10521 @item date
10522 Remove the @code{Date} header if the article is less than three days
10523 old.
10524 @item long-to
10525 Remove the @code{To} header if it is very long.
10526 @item many-to
10527 Remove all @code{To} headers if there are more than one.
10528 @end table
10529
10530 To include these three elements, you could say something like:
10531
10532 @lisp
10533 (setq gnus-boring-article-headers
10534       '(empty followup-to reply-to))
10535 @end lisp
10536
10537 This is also the default value for this variable.
10538
10539
10540 @node Using MIME
10541 @section Using MIME
10542 @cindex @sc{mime}
10543
10544 Mime is a standard for waving your hands through the air, aimlessly,
10545 while people stand around yawning.
10546
10547 @sc{mime}, however, is a standard for encoding your articles, aimlessly,
10548 while all newsreaders die of fear.
10549
10550 @sc{mime} may specify what character set the article uses, the encoding
10551 of the characters, and it also makes it possible to embed pictures and
10552 other naughty stuff in innocent-looking articles.
10553
10554 @vindex gnus-show-mime
10555 @vindex gnus-article-display-method-for-mime
10556 @findex gnus-article-display-mime-message
10557 Gnus handles @sc{mime} by pushing the articles through
10558 @code{gnus-article-display-method-for-mime}, which is
10559 @code{gnus-article-display-mime-message} by default.  This function
10560 calls the @sc{semi} MIME-View program to actually do the work.  For more
10561 information on @sc{semi} MIME-View, see its manual page (however it is
10562 not existed yet, sorry).
10563
10564 Set @code{gnus-show-mime} to @code{t} if you want to use
10565 @sc{mime} all the time.  If you have @code{gnus-show-mime} set, then
10566 you'll see some unfortunate display glitches in the article buffer.
10567 These can't be avoided.
10568
10569 In GNUS or Gnus, it might be best to just use the toggling functions
10570 from the summary buffer to avoid getting nasty surprises. (For instance,
10571 you enter the group @samp{alt.sing-a-long} and, before you know it,
10572 @sc{mime} has decoded the sound file in the article and some horrible
10573 sing-a-long song comes screaming out your speakers, and you can't find
10574 the volume button, because there isn't one, and people are starting to
10575 look at you, and you try to stop the program, but you can't, and you
10576 can't find the program to control the volume, and everybody else in the
10577 room suddenly decides to look at you disdainfully, and you'll feel
10578 rather stupid.)
10579
10580 Any similarity to real events and people is purely coincidental.  Ahem.
10581
10582 To avoid such kind of situation, gnus stops to use
10583 @code{metamail-buffer}.  So now, you can set @code{gnus-show-mime} to
10584 non-@code{nil} every-time, then you can push button in the article
10585 buffer when there are nobody else.
10586
10587 Also see @pxref{MIME Commands}.
10588
10589
10590 @node Customizing Articles
10591 @section Customizing Articles
10592 @cindex article customization
10593
10594 A slew of functions for customizing how the articles are to look like
10595 exist.  You can call these functions interactively, or you can have them
10596 called automatically when you select the articles.
10597
10598 To have them called automatically, you should set the corresponding
10599 ``treatment'' variable.  For instance, to have headers hidden, you'd set
10600 @code{gnus-treat-hide-headers}.  Below is a list of variables that can
10601 be set, but first we discuss the values these variables can have.
10602
10603 Note: Some values, while valid, make little sense.  Check the list below
10604 for sensible values.
10605
10606 @enumerate
10607 @item
10608 @code{nil}: Don't do this treatment.
10609
10610 @item
10611 @code{t}: Do this treatment on all body parts.
10612
10613 @item
10614 @code{head}: Do the treatment on the headers.
10615
10616 @item
10617 @code{last}: Do this treatment on the last part.
10618
10619 @item
10620 An integer: Do this treatment on all body parts that have a length less
10621 than this number.
10622
10623 @item
10624 A list of strings: Do this treatment on all body parts that are in
10625 articles that are read in groups that have names that match one of the
10626 regexps in the list.
10627
10628 @item
10629 A list where the first element is not a string:
10630
10631 The list is evaluated recursively.  The first element of the list is a
10632 predicate.  The following predicates are recognized: @code{or},
10633 @code{and}, @code{not} and @code{typep}.  Here's an example:
10634
10635 @lisp
10636 (or last
10637     (typep "text/x-vcard"))
10638 @end lisp
10639
10640 @item
10641 @code{mime}: Do this treatment if the value of @code{gnus-show-mime}' is
10642 non-nil.
10643
10644 @end enumerate
10645
10646 You may have noticed that the word @dfn{part} is used here.  This refers
10647 to the fact that some messages are @sc{mime} multipart articles that may
10648 be divided into several parts.  Articles that are not multiparts are
10649 considered to contain just a single part.
10650
10651 @vindex gnus-article-treat-types
10652 Are the treatments applied to all sorts of multipart parts?  Yes, if you
10653 want to, but by default, only @samp{text/plain} parts are given the
10654 treatment.  This is controlled by the @code{gnus-article-treat-types}
10655 variable, which is a list of regular expressions that are matched to the
10656 type of the part.  This variable is ignored if the value of the
10657 controlling variable is a predicate list, as described above.
10658
10659 The following treatment options are available.  The easiest way to
10660 customize this is to examine the @code{gnus-article-treat} customization
10661 group.  Values in parenthesis are suggested sensible values.  Others are
10662 possible but those listed are probably sufficient for most people.
10663
10664 @table @code
10665 @item gnus-treat-buttonize (t, integer)
10666 @item gnus-treat-buttonize-head (head)
10667
10668 @xref{Article Buttons}.
10669
10670 @item gnus-treat-capitalize-sentences (t, integer)
10671 @item gnus-treat-overstrike (t, integer)
10672 @item gnus-treat-strip-cr (t, integer)
10673 @item gnus-treat-strip-headers-in-body (t, integer)
10674 @item gnus-treat-strip-leading-blank-lines (t, integer)
10675 @item gnus-treat-strip-multiple-blank-lines (t, integer)
10676 @item gnus-treat-strip-pem (t, last, integer)
10677 @item gnus-treat-strip-trailing-blank-lines (t, last, integer)
10678 @item gnus-treat-unsplit-urls (t, integer)
10679 @item gnus-treat-wash-html (t, integer)
10680 @item gnus-treat-decode-article-as-default-mime-charset (t, integer)
10681
10682 @xref{Article Washing}.
10683
10684 @item gnus-treat-date-english (head)
10685 @item gnus-treat-date-iso8601 (head)
10686 @item gnus-treat-date-lapsed (head)
10687 @item gnus-treat-date-local (head)
10688 @item gnus-treat-date-original (head)
10689 @item gnus-treat-date-user-defined (head)
10690 @item gnus-treat-date-ut (head)
10691
10692 @xref{Article Date}.
10693
10694 @item gnus-treat-from-picon (head)
10695 @item gnus-treat-mail-picon (head)
10696 @item gnus-treat-newsgroups-picon (head)
10697
10698 @xref{Picons}.
10699
10700 @item gnus-treat-display-smileys (t, integer)
10701
10702 @item gnus-treat-body-boundary (head)
10703
10704 @vindex gnus-body-boundary-delimiter
10705 Adds a delimiter between header and body, the string used as delimiter
10706 is controlled by @code{gnus-body-boundary-delimiter}.
10707
10708 @xref{Smileys}.
10709
10710 @item gnus-treat-display-xface (head)
10711
10712 @xref{X-Face}.
10713
10714 @item gnus-treat-emphasize (t, head, integer)
10715 @item gnus-treat-fill-article (t, integer)
10716 @item gnus-treat-fill-long-lines (t, integer)
10717 @item gnus-treat-hide-boring-headers (head)
10718 @item gnus-treat-hide-citation (t, integer)
10719 @item gnus-treat-hide-citation-maybe (t, integer)
10720 @item gnus-treat-hide-headers (head)
10721 @item gnus-treat-hide-signature (t, last)
10722
10723 @xref{Article Hiding}.
10724
10725 @item gnus-treat-highlight-citation (t, integer)
10726 @item gnus-treat-highlight-headers (head)
10727 @item gnus-treat-highlight-signature (t, last, integer)
10728
10729 @xref{Article Highlighting}.
10730
10731 @item gnus-treat-play-sounds
10732 @item gnus-treat-translate
10733 @item gnus-treat-x-pgp-sig (head)
10734
10735 @item gnus-treat-unfold-headers (head)
10736 @item gnus-treat-fold-headers (head)
10737 @item gnus-treat-fold-newsgroups (head)
10738 @item gnus-treat-leading-whitespace (head)
10739
10740 @xref{Article Header}.
10741
10742
10743 @end table
10744
10745 @vindex gnus-part-display-hook
10746 You can, of course, write your own functions to be called from
10747 @code{gnus-part-display-hook}.  The functions are called narrowed to the
10748 part, and you can do anything you like, pretty much.  There is no
10749 information that you have to keep in the buffer---you can change
10750 everything.
10751
10752
10753 @node Article Keymap
10754 @section Article Keymap
10755
10756 Most of the keystrokes in the summary buffer can also be used in the
10757 article buffer.  They should behave as if you typed them in the summary
10758 buffer, which means that you don't actually have to have a summary
10759 buffer displayed while reading.  You can do it all from the article
10760 buffer.
10761
10762 A few additional keystrokes are available:
10763
10764 @table @kbd
10765
10766 @item SPACE
10767 @kindex SPACE (Article)
10768 @findex gnus-article-next-page
10769 Scroll forwards one page (@code{gnus-article-next-page}).
10770 This is exactly the same as @kbd{h SPACE h}.
10771
10772 @item DEL
10773 @kindex DEL (Article)
10774 @findex gnus-article-prev-page
10775 Scroll backwards one page (@code{gnus-article-prev-page}).
10776 This is exactly the same as @kbd{h DEL h}.
10777
10778 @item C-c ^
10779 @kindex C-c ^ (Article)
10780 @findex gnus-article-refer-article
10781 If point is in the neighborhood of a @code{Message-ID} and you press
10782 @kbd{C-c ^}, Gnus will try to get that article from the server
10783 (@code{gnus-article-refer-article}).
10784
10785 @item C-c C-m
10786 @kindex C-c C-m (Article)
10787 @findex gnus-article-mail
10788 Send a reply to the address near point (@code{gnus-article-mail}).  If
10789 given a prefix, include the mail.
10790
10791 @item s
10792 @kindex s (Article)
10793 @findex gnus-article-show-summary
10794 Reconfigure the buffers so that the summary buffer becomes visible
10795 (@code{gnus-article-show-summary}).
10796
10797 @item ?
10798 @kindex ? (Article)
10799 @findex gnus-article-describe-briefly
10800 Give a very brief description of the available keystrokes
10801 (@code{gnus-article-describe-briefly}).
10802
10803 @item TAB
10804 @kindex TAB (Article)
10805 @findex gnus-article-next-button
10806 Go to the next button, if any (@code{gnus-article-next-button}).  This
10807 only makes sense if you have buttonizing turned on.
10808
10809 @item M-TAB
10810 @kindex M-TAB (Article)
10811 @findex gnus-article-prev-button
10812 Go to the previous button, if any (@code{gnus-article-prev-button}).
10813
10814 @item R
10815 @kindex R (Article)
10816 @findex gnus-article-reply-with-original
10817 Send a reply to the current article and yank the current article
10818 (@code{gnus-article-reply-with-original}).  If given a prefix, make a
10819 wide reply.  If the region is active, only yank the text in the
10820 region.
10821
10822 @item F
10823 @kindex F (Article)
10824 @findex gnus-article-followup-with-original
10825 Send a followup to the current article and yank the current article
10826 (@code{gnus-article-followup-with-original}).  If given a prefix, make
10827 a wide reply.  If the region is active, only yank the text in the
10828 region.
10829
10830
10831 @end table
10832
10833
10834 @node Misc Article
10835 @section Misc Article
10836
10837 @table @code
10838
10839 @item gnus-single-article-buffer
10840 @vindex gnus-single-article-buffer
10841 If non-@code{nil}, use the same article buffer for all the groups.
10842 (This is the default.)  If @code{nil}, each group will have its own
10843 article buffer.
10844
10845 @vindex gnus-article-decode-hook
10846 @item gnus-article-decode-hook
10847 @cindex MIME
10848 Hook used to decode @sc{mime} articles.  The default value is
10849 @code{(article-decode-charset article-decode-encoded-words)}
10850
10851 @vindex gnus-article-prepare-hook
10852 @item gnus-article-prepare-hook
10853 This hook is called right after the article has been inserted into the
10854 article buffer.  It is mainly intended for functions that do something
10855 depending on the contents; it should probably not be used for changing
10856 the contents of the article buffer.
10857
10858 @item gnus-article-mode-hook
10859 @vindex gnus-article-mode-hook
10860 Hook called in article mode buffers.
10861
10862 @item gnus-article-mode-syntax-table
10863 @vindex gnus-article-mode-syntax-table
10864 Syntax table used in article buffers.  It is initialized from
10865 @code{text-mode-syntax-table}.
10866
10867 @vindex gnus-article-mode-line-format
10868 @item gnus-article-mode-line-format
10869 This variable is a format string along the same lines as
10870 @code{gnus-summary-mode-line-format} (@pxref{Mode Line Formatting}).  It
10871 accepts the same format specifications as that variable, with two
10872 extensions:
10873
10874 @table @samp
10875
10876 @item w
10877 The @dfn{wash status} of the article.  This is a short string with one
10878 character for each possible article wash operation that may have been
10879 performed.  The characters and their meaning:
10880
10881 @table @samp
10882
10883 @item c
10884 Displayed when cited text may be hidden in the article buffer.
10885
10886 @item h
10887 Displayed when headers are hidden in the article buffer.
10888
10889 @item p
10890 Displayed when article is digitally signed or encrypted, and Gnus has
10891 hidden the security headers.  (N.B. does not tell anything about
10892 security status, i.e. good or bad signature.)
10893
10894 @item s
10895 Displayed when the signature has been hidden in the Article buffer.
10896
10897 @item o
10898 Displayed when Gnus has treated overstrike characters in the article buffer.
10899
10900 @item e
10901 Displayed when Gnus has treated emphasised strings in the article buffer.
10902
10903 @end table
10904
10905 @item m
10906 The number of @sc{mime} parts in the article.
10907
10908 @end table
10909
10910 @vindex gnus-break-pages
10911
10912 @item gnus-break-pages
10913 Controls whether @dfn{page breaking} is to take place.  If this variable
10914 is non-@code{nil}, the articles will be divided into pages whenever a
10915 page delimiter appears in the article.  If this variable is @code{nil},
10916 paging will not be done.
10917
10918 @item gnus-page-delimiter
10919 @vindex gnus-page-delimiter
10920 This is the delimiter mentioned above.  By default, it is @samp{^L}
10921 (formfeed).
10922 @end table
10923
10924
10925 @node Composing Messages
10926 @chapter Composing Messages
10927 @cindex composing messages
10928 @cindex messages
10929 @cindex mail
10930 @cindex sending mail
10931 @cindex reply
10932 @cindex followup
10933 @cindex post
10934 @cindex using gpg
10935 @cindex using s/mime
10936 @cindex using smime
10937
10938 @kindex C-c C-c (Post)
10939 All commands for posting and mailing will put you in a message buffer
10940 where you can edit the article all you like, before you send the
10941 article by pressing @kbd{C-c C-c}.  @xref{Top, , Overview, message,
10942 Message Manual}.  Where the message will be posted/mailed to depends
10943 on your setup (@pxref{Posting Server}).
10944
10945 @menu
10946 * Mail::                        Mailing and replying.
10947 * Posting Server::              What server should you post and mail via?
10948 * Mail and Post::               Mailing and posting at the same time.
10949 * Archived Messages::           Where Gnus stores the messages you've sent.
10950 * Posting Styles::              An easier way to specify who you are.
10951 * Drafts::                      Postponing messages and rejected messages.
10952 * Rejected Articles::           What happens if the server doesn't like your article?
10953 * Signing and encrypting::      How to compose secure messages.
10954 @end menu
10955
10956 Also see @pxref{Canceling and Superseding} for information on how to
10957 remove articles you shouldn't have posted.
10958
10959
10960 @node Mail
10961 @section Mail
10962
10963 Variables for customizing outgoing mail:
10964
10965 @table @code
10966 @item gnus-uu-digest-headers
10967 @vindex gnus-uu-digest-headers
10968 List of regexps to match headers included in digested messages.  The
10969 headers will be included in the sequence they are matched.  If
10970 @code{nil} include all headers.
10971
10972 @item gnus-add-to-list
10973 @vindex gnus-add-to-list
10974 If non-@code{nil}, add a @code{to-list} group parameter to mail groups
10975 that have none when you do a @kbd{a}.
10976
10977 @item gnus-confirm-mail-reply-to-news
10978 @vindex gnus-confirm-mail-reply-to-news
10979 This can also be a function receiving the group name as the only
10980 parameter which should return non-@code{nil} if a confirmation is
10981 needed, or a regular expression matching group names, where
10982 confirmation is should be asked for.
10983
10984 If you find yourself never wanting to reply to mail, but occasionally
10985 press R anyway, this variable might be for you.
10986
10987 @item gnus-confirm-treat-mail-like-news
10988 @vindex gnus-confirm-treat-mail-like-news
10989 If non-@code{nil}, Gnus also requests confirmation according to
10990 @code{gnus-confirm-mail-reply-to-news} when replying to mail.  This is
10991 useful for treating mailing lists like newsgroups.
10992  
10993 @end table
10994
10995
10996 @node Posting Server
10997 @section Posting Server
10998
10999 When you press those magical @kbd{C-c C-c} keys to ship off your latest
11000 (extremely intelligent, of course) article, where does it go?
11001
11002 Thank you for asking.  I hate you.
11003
11004 It can be quite complicated.
11005
11006 @vindex gnus-post-method
11007 When posting news, Message usually invokes @code{message-send-news}
11008 (@pxref{News Variables, , News Variables, message, Message Manual}).
11009 Normally, Gnus will post using the same select method as you're
11010 reading from (which might be convenient if you're reading lots of
11011 groups from different private servers).  However.  If the server
11012 you're reading from doesn't allow posting, just reading, you probably
11013 want to use some other server to post your (extremely intelligent and
11014 fabulously interesting) articles.  You can then set the
11015 @code{gnus-post-method} to some other method:
11016
11017 @lisp
11018 (setq gnus-post-method '(nnspool ""))
11019 @end lisp
11020
11021 Now, if you've done this, and then this server rejects your article, or
11022 this server is down, what do you do then?  To override this variable you
11023 can use a non-zero prefix to the @kbd{C-c C-c} command to force using
11024 the ``current'' server, to get back the default behavior, for posting.
11025
11026 If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command,
11027 gnus will prompt you for what method to use for posting.
11028
11029 You can also set @code{gnus-post-method} to a list of select methods.
11030 If that's the case, gnus will always prompt you for what method to use
11031 for posting.
11032
11033 Finally, if you want to always post using the native select method,
11034 you can set this variable to @code{native}.
11035
11036 When sending mail, Message invokes @code{message-send-mail-function}.
11037 The default function, @code{message-send-mail-with-sendmail}, pipes
11038 your article to the @code{sendmail} binary for further queuing and
11039 sending.  When your local system is not configured for sending mail
11040 using @code{sendmail}, and you have access to a remote @sc{smtp}
11041 server, you can set @code{message-send-mail-function} to
11042 @code{smtpmail-send-it} and make sure to setup the @code{smtpmail}
11043 package correctly.  An example:
11044
11045 @lisp
11046 (setq message-send-mail-function 'smtpmail-send-it
11047       smtpmail-default-smtp-server "YOUR SMTP HOST")
11048 ;; The following variable needs to be set because of the FLIM version of
11049 ;; smtpmail.el.  Which smtpmail.el is used depends on the `load-path'.
11050 (setq smtp-default-smtp-server "YOUR SMTP HOST")
11051 @end lisp
11052
11053 To the thing similar to this, there is @code{message-smtpmail-send-it}.
11054 It is useful if your ISP requires the POP-before-SMTP authentication.
11055 See the documentation for the function @code{mail-source-touch-pop}.
11056
11057 Other possible choices for @code{message-send-mail-function} includes
11058 @code{message-send-mail-with-mh}, @code{message-send-mail-with-qmail},
11059 and @code{feedmail-send-it}.
11060
11061 @node Mail and Post
11062 @section Mail and Post
11063
11064 Here's a list of variables relevant to both mailing and
11065 posting:
11066
11067 @table @code
11068 @item gnus-mailing-list-groups
11069 @findex gnus-mailing-list-groups
11070 @cindex mailing lists
11071
11072 If your news server offers groups that are really mailing lists
11073 gatewayed to the @sc{nntp} server, you can read those groups without
11074 problems, but you can't post/followup to them without some difficulty.
11075 One solution is to add a @code{to-address} to the group parameters
11076 (@pxref{Group Parameters}).  An easier thing to do is set the
11077 @code{gnus-mailing-list-groups} to a regexp that matches the groups that
11078 really are mailing lists.  Then, at least, followups to the mailing
11079 lists will work most of the time.  Posting to these groups (@kbd{a}) is
11080 still a pain, though.
11081
11082 @item gnus-version-expose-system
11083 @vindex gnus-version-expose-system
11084
11085 Your system type (@code{system-configuration} variable, such as
11086 @samp{i686-pc-linux}) is exposed in the auto-generated by default
11087 User-Agent header. Sometimes, it may be desireable (mostly because of
11088 aesthetic reasons) to turn it off. In this case, set it to @code{nil}.
11089
11090 @end table
11091
11092 You may want to do spell-checking on messages that you send out.  Or, if
11093 you don't want to spell-check by hand, you could add automatic
11094 spell-checking via the @code{ispell} package:
11095
11096 @cindex ispell
11097 @findex ispell-message
11098 @lisp
11099 (add-hook 'message-send-hook 'ispell-message)
11100 @end lisp
11101
11102 If you want to change the @code{ispell} dictionary based on what group
11103 you're in, you could say something like the following:
11104
11105 @lisp
11106 (add-hook 'gnus-select-group-hook
11107           (lambda ()
11108             (cond
11109              ((string-match
11110                "^de\\." (gnus-group-real-name gnus-newsgroup-name))
11111               (ispell-change-dictionary "deutsch"))
11112              (t
11113               (ispell-change-dictionary "english")))))
11114 @end lisp
11115
11116 Modify to suit your needs.
11117
11118
11119 @node Archived Messages
11120 @section Archived Messages
11121 @cindex archived messages
11122 @cindex sent messages
11123
11124 Gnus provides a few different methods for storing the mail and news you
11125 send.  The default method is to use the @dfn{archive virtual server} to
11126 store the messages.  If you want to disable this completely, the
11127 @code{gnus-message-archive-group} variable should be @code{nil}, which
11128 is the default.
11129
11130 For archiving interesting messages in a group you read, see the
11131 @kbd{B c} (@code{gnus-summary-copy-article}) command (@pxref{Mail
11132 Group Commands}).
11133
11134 @vindex gnus-message-archive-method
11135 @code{gnus-message-archive-method} says what virtual server gnus is to
11136 use to store sent messages.  The default is:
11137
11138 @lisp
11139 (nnfolder "archive"
11140           (nnfolder-directory   "~/Mail/archive")
11141           (nnfolder-active-file "~/Mail/archive/active")
11142           (nnfolder-get-new-mail nil)
11143           (nnfolder-inhibit-expiry t))
11144 @end lisp
11145
11146 You can, however, use any mail select method (@code{nnml},
11147 @code{nnmbox}, etc.).  @code{nnfolder} is a quite likable select method
11148 for doing this sort of thing, though.  If you don't like the default
11149 directory chosen, you could say something like:
11150
11151 @lisp
11152 (setq gnus-message-archive-method
11153       '(nnfolder "archive"
11154                  (nnfolder-inhibit-expiry t)
11155                  (nnfolder-active-file "~/News/sent-mail/active")
11156                  (nnfolder-directory "~/News/sent-mail/")))
11157 @end lisp
11158
11159 @vindex gnus-message-archive-group
11160 @cindex Gcc
11161 Gnus will insert @code{Gcc} headers in all outgoing messages that point
11162 to one or more group(s) on that server.  Which group to use is
11163 determined by the @code{gnus-message-archive-group} variable.
11164
11165 This variable can be used to do the following:
11166
11167 @itemize @bullet
11168 @item
11169 a string
11170 Messages will be saved in that group.
11171
11172 Note that you can include a select method in the group name, then the
11173 message will not be stored in the select method given by
11174 @code{gnus-message-archive-method}, but in the select method specified
11175 by the group name, instead.  Suppose @code{gnus-message-archive-method}
11176 has the default value shown above.  Then setting
11177 @code{gnus-message-archive-group} to @code{"foo"} means that outgoing
11178 messages are stored in @samp{nnfolder+archive:foo}, but if you use the
11179 value @code{"nnml:foo"}, then outgoing messages will be stored in
11180 @samp{nnml:foo}.
11181 @item
11182 a list of strings
11183 Messages will be saved in all those groups.
11184 @item
11185 an alist of regexps, functions and forms
11186 When a key ``matches'', the result is used.
11187 @item
11188 @code{nil}
11189 No message archiving will take place.  This is the default.
11190 @end itemize
11191
11192 Let's illustrate:
11193
11194 Just saving to a single group called @samp{MisK}:
11195 @lisp
11196 (setq gnus-message-archive-group "MisK")
11197 @end lisp
11198
11199 Saving to two groups, @samp{MisK} and @samp{safe}:
11200 @lisp
11201 (setq gnus-message-archive-group '("MisK" "safe"))
11202 @end lisp
11203
11204 Save to different groups based on what group you are in:
11205 @lisp
11206 (setq gnus-message-archive-group
11207       '(("^alt" "sent-to-alt")
11208         ("mail" "sent-to-mail")
11209         (".*" "sent-to-misc")))
11210 @end lisp
11211
11212 More complex stuff:
11213 @lisp
11214 (setq gnus-message-archive-group
11215       '((if (message-news-p)
11216             "misc-news"
11217           "misc-mail")))
11218 @end lisp
11219
11220 How about storing all news messages in one file, but storing all mail
11221 messages in one file per month:
11222
11223 @lisp
11224 (setq gnus-message-archive-group
11225       '((if (message-news-p)
11226             "misc-news"
11227           (concat "mail." (format-time-string "%Y-%m")))))
11228 @end lisp
11229
11230 @c (XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to
11231 @c use a different value for @code{gnus-message-archive-group} there.)
11232
11233 Now, when you send a message off, it will be stored in the appropriate
11234 group.  (If you want to disable storing for just one particular message,
11235 you can just remove the @code{Gcc} header that has been inserted.)  The
11236 archive group will appear in the group buffer the next time you start
11237 gnus, or the next time you press @kbd{F} in the group buffer.  You can
11238 enter it and read the articles in it just like you'd read any other
11239 group.  If the group gets really big and annoying, you can simply rename
11240 if (using @kbd{G r} in the group buffer) to something
11241 nice---@samp{misc-mail-september-1995}, or whatever.  New messages will
11242 continue to be stored in the old (now empty) group.
11243
11244 That's the default method of archiving sent messages.  Gnus offers a
11245 different way for the people who don't like the default method.  In that
11246 case you should set @code{gnus-message-archive-group} to @code{nil};
11247 this will disable archiving.
11248
11249 @table @code
11250 @item gnus-outgoing-message-group
11251 @vindex gnus-outgoing-message-group
11252 All outgoing messages will be put in this group.  If you want to store
11253 all your outgoing mail and articles in the group @samp{nnml:archive},
11254 you set this variable to that value.  This variable can also be a list of
11255 group names.
11256
11257 If you want to have greater control over what group to put each
11258 message in, you can set this variable to a function that checks the
11259 current newsgroup name and then returns a suitable group name (or list
11260 of names).
11261
11262 This variable can be used instead of @code{gnus-message-archive-group},
11263 but the latter is the preferred method.
11264
11265 @item gnus-gcc-mark-as-read
11266 @vindex gnus-gcc-mark-as-read
11267 If non-@code{nil}, automatically mark @code{Gcc} articles as read.
11268
11269 @item gnus-gcc-externalize-attachments
11270 @vindex gnus-gcc-externalize-attachments
11271 If @code{nil}, attach files as normal parts in Gcc copies; if a regexp
11272 and matches the Gcc group name, attach files as external parts; if it is
11273 @code{all}, attach local files as external parts; if it is other
11274 non-@code{nil}, the behavior is the same as @code{all}, but it may be
11275 changed in the future.
11276
11277 @end table
11278
11279
11280 @node Posting Styles
11281 @section Posting Styles
11282 @cindex posting styles
11283 @cindex styles
11284
11285 All them variables, they make my head swim.
11286
11287 So what if you want a different @code{Organization} and signature based
11288 on what groups you post to?  And you post both from your home machine
11289 and your work machine, and you want different @code{From} lines, and so
11290 on?
11291
11292 @vindex gnus-posting-styles
11293 One way to do stuff like that is to write clever hooks that change the
11294 variables you need to have changed.  That's a bit boring, so somebody
11295 came up with the bright idea of letting the user specify these things in
11296 a handy alist.  Here's an example of a @code{gnus-posting-styles}
11297 variable:
11298
11299 @lisp
11300 ((".*"
11301   (signature "Peace and happiness")
11302   (organization "What me?"))
11303  ("^comp"
11304   (signature "Death to everybody"))
11305  ("comp.emacs.i-love-it"
11306   (organization "Emacs is it")))
11307 @end lisp
11308
11309 As you might surmise from this example, this alist consists of several
11310 @dfn{styles}.  Each style will be applicable if the first element
11311 ``matches'', in some form or other.  The entire alist will be iterated
11312 over, from the beginning towards the end, and each match will be
11313 applied, which means that attributes in later styles that match override
11314 the same attributes in earlier matching styles.  So
11315 @samp{comp.programming.literate} will have the @samp{Death to everybody}
11316 signature and the @samp{What me?} @code{Organization} header.
11317
11318 The first element in each style is called the @code{match}.  If it's a
11319 string, then Gnus will try to regexp match it against the group name.
11320 If it is the form @code{(header MATCH REGEXP)}, then Gnus will look in
11321 the original article for a header whose name is MATCH and compare that
11322 REGEXP.  MATCH and REGEXP are strings.  (There original article is the
11323 one you are replying or following up to.  If you are not composing a
11324 reply or a followup, then there is nothing to match against.)  If the
11325 @code{match} is a function symbol, that function will be called with no
11326 arguments.  If it's a variable symbol, then the variable will be
11327 referenced.  If it's a list, then that list will be @code{eval}ed.  In
11328 any case, if this returns a non-@code{nil} value, then the style is said
11329 to @dfn{match}.
11330
11331 Each style may contain an arbitrary amount of @dfn{attributes}.  Each
11332 attribute consists of a @code{(@var{name} @var{value})} pair.  The
11333 attribute name can be one of @code{signature}, @code{signature-file},
11334 @code{x-face-file}, @code{address} (overriding
11335 @code{user-mail-address}), @code{name} (overriding
11336 @code{(user-full-name)}) or @code{body}.  The attribute name can also
11337 be a string or a symbol.  In that case, this will be used as a header
11338 name, and the value will be inserted in the headers of the article; if
11339 the value is @code{nil}, the header name will be removed.  If the
11340 attribute name is @code{eval}, the form is evaluated, and the result
11341 is thrown away.
11342
11343 The attribute value can be a string (used verbatim), a function with
11344 zero arguments (the return value will be used), a variable (its value
11345 will be used) or a list (it will be @code{eval}ed and the return value
11346 will be used).  The functions and sexps are called/@code{eval}ed in the
11347 message buffer that is being set up.  The headers of the current article
11348 are available through the @code{message-reply-headers} variable, which
11349 is a vector of the following headers: number subject from date id
11350 references chars lines xref extra.
11351
11352 @vindex message-reply-headers
11353
11354 If you wish to check whether the message you are about to compose is
11355 meant to be a news article or a mail message, you can check the values
11356 of the @code{message-news-p} and @code{message-mail-p} functions.
11357
11358 @findex message-mail-p
11359 @findex message-news-p
11360
11361 So here's a new example:
11362
11363 @lisp
11364 (setq gnus-posting-styles
11365       '((".*"
11366          (signature-file "~/.signature")
11367          (name "User Name")
11368          ("X-Home-Page" (getenv "WWW_HOME"))
11369          (organization "People's Front Against MWM"))
11370         ("^rec.humor"
11371          (signature my-funny-signature-randomizer))
11372         ((equal (system-name) "gnarly")  ;; A form
11373          (signature my-quote-randomizer))
11374         (message-news-p        ;; A function symbol
11375          (signature my-news-signature))
11376         (window-system         ;; A value symbol
11377          ("X-Window-System" (format "%s" window-system)))
11378         ;; If I'm replying to Larsi, set the Organization header.
11379         ((header "from" "larsi.*org")
11380          (Organization "Somewhere, Inc."))
11381         ((posting-from-work-p) ;; A user defined function
11382          (signature-file "~/.work-signature")
11383          (address "user@@bar.foo")
11384          (body "You are fired.\n\nSincerely, your boss.")
11385          (organization "Important Work, Inc"))
11386         ("nnml:.*"
11387          (From (save-excursion
11388                  (set-buffer gnus-article-buffer)
11389                  (message-fetch-field "to"))))
11390         ("^nn.+:"
11391          (signature-file "~/.mail-signature"))))
11392 @end lisp
11393
11394 The @samp{nnml:.*} rule means that you use the @code{To} address as the
11395 @code{From} address in all your outgoing replies, which might be handy
11396 if you fill many roles.
11397
11398 Setting the @code{gnus-named-posting-styles} variable will make
11399 posting-styles allow to have distinctive names.  You can specify an
11400 arbitrary posting-style when article posting with @kbd{S P} in the
11401 summary buffer.  @code{gnus-named-posting-styles} is an alist which maps
11402 the names to styles.  Once a posting-style is added to the alist, we can
11403 import it from @code{gnus-posting-styles}.  If an attribute whose name
11404 is @code{import} is found, Gnus will look for the attribute value in
11405 @code{gnus-named-posting-styles} and expand it in place.
11406
11407 Here's an example:
11408
11409 @lisp
11410 (setq gnus-named-posting-styles
11411       '(("Default"
11412          (signature-file "~/.signature")
11413          (name "User Name")
11414          ("X-Home-Page" (getenv "WWW_HOME"))
11415          (organization "People's Front Against MWM"))
11416         ("Emacs"
11417          (import "Default")
11418          (organization "The Church of Emacs"))))
11419 @end lisp
11420
11421 The posting-style named "Emacs" will inherit all the attributes from
11422 "Default" except @code{organization}.
11423
11424
11425 @node Drafts
11426 @section Drafts
11427 @cindex drafts
11428
11429 If you are writing a message (mail or news) and suddenly remember that
11430 you have a steak in the oven (or some pesto in the food processor, you
11431 craaazy vegetarians), you'll probably wish there was a method to save
11432 the message you are writing so that you can continue editing it some
11433 other day, and send it when you feel its finished.
11434
11435 Well, don't worry about it.  Whenever you start composing a message of
11436 some sort using the gnus mail and post commands, the buffer you get will
11437 automatically associate to an article in a special @dfn{draft} group.
11438 If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the
11439 article will be saved there.  (Auto-save files also go to the draft
11440 group.)
11441
11442 @cindex nndraft
11443 @vindex nndraft-directory
11444 The draft group is a special group (which is implemented as an
11445 @code{nndraft} group, if you absolutely have to know) called
11446 @samp{nndraft:drafts}.  The variable @code{nndraft-directory} says where
11447 @code{nndraft} is to store its files.  What makes this group special is
11448 that you can't tick any articles in it or mark any articles as
11449 read---all articles in the group are permanently unread.
11450
11451 If the group doesn't exist, it will be created and you'll be subscribed
11452 to it.  The only way to make it disappear from the Group buffer is to
11453 unsubscribe it.
11454
11455 @c @findex gnus-dissociate-buffer-from-draft
11456 @c @kindex C-c M-d (Mail)
11457 @c @kindex C-c M-d (Post)
11458 @c @findex gnus-associate-buffer-with-draft
11459 @c @kindex C-c C-d (Mail)
11460 @c @kindex C-c C-d (Post)
11461 @c If you're writing some super-secret message that you later want to
11462 @c encode with PGP before sending, you may wish to turn the auto-saving
11463 @c (and association with the draft group) off.  You never know who might be
11464 @c interested in reading all your extremely valuable and terribly horrible
11465 @c and interesting secrets.  The @kbd{C-c M-d}
11466 @c (@code{gnus-dissociate-buffer-from-draft}) command does that for you.
11467 @c If you change your mind and want to turn the auto-saving back on again,
11468 @c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that.
11469 @c
11470 @c @vindex gnus-use-draft
11471 @c To leave association with the draft group off by default, set
11472 @c @code{gnus-use-draft} to @code{nil}.  It is @code{t} by default.
11473
11474 @findex gnus-draft-edit-message
11475 @kindex D e (Draft)
11476 When you want to continue editing the article, you simply enter the
11477 draft group and push @kbd{D e} (@code{gnus-draft-edit-message}) to do
11478 that.  You will be placed in a buffer where you left off.
11479
11480 Rejected articles will also be put in this draft group (@pxref{Rejected
11481 Articles}).
11482
11483 @findex gnus-draft-send-all-messages
11484 @kindex D s (Draft)
11485 @findex gnus-draft-send-message
11486 @kindex D S (Draft)
11487 If you have lots of rejected messages you want to post (or mail) without
11488 doing further editing, you can use the @kbd{D s} command
11489 (@code{gnus-draft-send-message}).  This command understands the
11490 process/prefix convention (@pxref{Process/Prefix}).  The @kbd{D S}
11491 command (@code{gnus-draft-send-all-messages}) will ship off all messages
11492 in the buffer.
11493
11494 @findex gnus-draft-toggle-sending
11495 @kindex D t (Draft)
11496 If you have some messages that you wish not to send, you can use the
11497 @kbd{D t} (@code{gnus-draft-toggle-sending}) command to mark the message
11498 as unsendable.  This is a toggling command.
11499
11500
11501 @node Rejected Articles
11502 @section Rejected Articles
11503 @cindex rejected articles
11504
11505 Sometimes a news server will reject an article.  Perhaps the server
11506 doesn't like your face.  Perhaps it just feels miserable.  Perhaps
11507 @emph{there be demons}.  Perhaps you have included too much cited text.
11508 Perhaps the disk is full.  Perhaps the server is down.
11509
11510 These situations are, of course, totally beyond the control of gnus.
11511 (Gnus, of course, loves the way you look, always feels great, has angels
11512 fluttering around inside of it, doesn't care about how much cited text
11513 you include, never runs full and never goes down.)  So gnus saves these
11514 articles until some later time when the server feels better.
11515
11516 The rejected articles will automatically be put in a special draft group
11517 (@pxref{Drafts}).  When the server comes back up again, you'd then
11518 typically enter that group and send all the articles off.
11519
11520 @node Signing and encrypting
11521 @section Signing and encrypting
11522 @cindex using gpg
11523 @cindex using s/mime
11524 @cindex using smime
11525
11526 Gnus can digitally sign and encrypt your messages, using vanilla PGP
11527 format or @sc{pgp/mime} or @sc{s/mime}.  For decoding such messages,
11528 see the @code{mm-verify-option} and @code{mm-decrypt-option} options
11529 (@pxref{Security}).
11530
11531 @vindex gnus-message-replysign
11532 @vindex gnus-message-replyencrypt
11533 @vindex gnus-message-replysignencrypted
11534 Often, you would like to sign replies to people who send you signed
11535 messages.  Even more often, you might want to encrypt messages which
11536 are in reply to encrypted messages.  Gnus offers
11537 @code{gnus-message-replysign} to enable the former, and
11538 @code{gnus-message-replyencrypt} for the latter.  In addition, setting
11539 @code{gnus-message-replysignencrypted} (on by default) will sign
11540 automatically encrypted messages.
11541
11542 Instructing MML to perform security operations on a @sc{mime} part is
11543 done using the @kbd{C-c C-m s} key map for signing and the @kbd{C-c
11544 C-m c} key map for encryption, as follows.
11545
11546 @table @kbd
11547
11548 @item C-c C-m s s
11549 @kindex C-c C-m s s
11550 @findex mml-secure-message-sign-smime
11551
11552 Digitally sign current message using @sc{s/mime}.
11553
11554 @item C-c C-m s o
11555 @kindex C-c C-m s o
11556 @findex mml-secure-message-sign-pgp
11557
11558 Digitally sign current message using PGP.
11559
11560 @item C-c C-m s p
11561 @kindex C-c C-m s p
11562 @findex mml-secure-message-sign-pgp
11563
11564 Digitally sign current message using @sc{pgp/mime}.
11565
11566 @item C-c C-m c s
11567 @kindex C-c C-m c s
11568 @findex mml-secure-message-encrypt-smime
11569
11570 Digitally encrypt current message using @sc{s/mime}.
11571
11572 @item C-c C-m c o
11573 @kindex C-c C-m c o
11574 @findex mml-secure-message-encrypt-pgp
11575
11576 Digitally encrypt current message using PGP.
11577
11578 @item C-c C-m c p
11579 @kindex C-c C-m c p
11580 @findex mml-secure-message-encrypt-pgpmime
11581
11582 Digitally encrypt current message using @sc{pgp/mime}.
11583
11584 @item C-c C-m C-n
11585 @kindex C-c C-m C-n
11586 @findex mml-unsecure-message
11587 Remove security related MML tags from message.
11588
11589 @end table
11590
11591 @xref{Security, ,Security, message, Message Manual}, for more information.
11592
11593 @node Select Methods
11594 @chapter Select Methods
11595 @cindex foreign groups
11596 @cindex select methods
11597
11598 A @dfn{foreign group} is a group not read by the usual (or
11599 default) means.  It could be, for instance, a group from a different
11600 @sc{nntp} server, it could be a virtual group, or it could be your own
11601 personal mail group.
11602
11603 A foreign group (or any group, really) is specified by a @dfn{name} and
11604 a @dfn{select method}.  To take the latter first, a select method is a
11605 list where the first element says what back end to use (e.g. @code{nntp},
11606 @code{nnspool}, @code{nnml}) and the second element is the @dfn{server
11607 name}.  There may be additional elements in the select method, where the
11608 value may have special meaning for the back end in question.
11609
11610 One could say that a select method defines a @dfn{virtual server}---so
11611 we do just that (@pxref{Server Buffer}).
11612
11613 The @dfn{name} of the group is the name the back end will recognize the
11614 group as.
11615
11616 For instance, the group @samp{soc.motss} on the @sc{nntp} server
11617 @samp{some.where.edu} will have the name @samp{soc.motss} and select
11618 method @code{(nntp "some.where.edu")}.  Gnus will call this group
11619 @samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp}
11620 back end just knows this group as @samp{soc.motss}.
11621
11622 The different methods all have their peculiarities, of course.
11623
11624 @menu
11625 * Server Buffer::               Making and editing virtual servers.
11626 * Getting News::                Reading USENET news with Gnus.
11627 * Getting Mail::                Reading your personal mail with Gnus.
11628 * Browsing the Web::            Getting messages from a plethora of Web sources.
11629 * IMAP::                        Using Gnus as a @sc{imap} client.
11630 * Other Sources::               Reading directories, files, SOUP packets.
11631 * Combined Groups::             Combining groups into one group.
11632 * Gnus Unplugged::              Reading news and mail offline.
11633 @end menu
11634
11635
11636 @node Server Buffer
11637 @section Server Buffer
11638
11639 Traditionally, a @dfn{server} is a machine or a piece of software that
11640 one connects to, and then requests information from.  Gnus does not
11641 connect directly to any real servers, but does all transactions through
11642 one back end or other.  But that's just putting one layer more between
11643 the actual media and Gnus, so we might just as well say that each
11644 back end represents a virtual server.
11645
11646 For instance, the @code{nntp} back end may be used to connect to several
11647 different actual @sc{nntp} servers, or, perhaps, to many different ports
11648 on the same actual @sc{nntp} server.  You tell Gnus which back end to
11649 use, and what parameters to set by specifying a @dfn{select method}.
11650
11651 These select method specifications can sometimes become quite
11652 complicated---say, for instance, that you want to read from the
11653 @sc{nntp} server @samp{news.funet.fi} on port number 13, which
11654 hangs if queried for @sc{nov} headers and has a buggy select.  Ahem.
11655 Anyway, if you had to specify that for each group that used this
11656 server, that would be too much work, so Gnus offers a way of naming
11657 select methods, which is what you do in the server buffer.
11658
11659 To enter the server buffer, use the @kbd{^}
11660 (@code{gnus-group-enter-server-mode}) command in the group buffer.
11661
11662 @menu
11663 * Server Buffer Format::        You can customize the look of this buffer.
11664 * Server Commands::             Commands to manipulate servers.
11665 * Example Methods::             Examples server specifications.
11666 * Creating a Virtual Server::   An example session.
11667 * Server Variables::            Which variables to set.
11668 * Servers and Methods::         You can use server names as select methods.
11669 * Unavailable Servers::         Some servers you try to contact may be down.
11670 @end menu
11671
11672 @vindex gnus-server-mode-hook
11673 @code{gnus-server-mode-hook} is run when creating the server buffer.
11674
11675
11676 @node Server Buffer Format
11677 @subsection Server Buffer Format
11678 @cindex server buffer format
11679
11680 @vindex gnus-server-line-format
11681 You can change the look of the server buffer lines by changing the
11682 @code{gnus-server-line-format} variable.  This is a @code{format}-like
11683 variable, with some simple extensions:
11684
11685 @table @samp
11686
11687 @item h
11688 How the news is fetched---the back end name.
11689
11690 @item n
11691 The name of this server.
11692
11693 @item w
11694 Where the news is to be fetched from---the address.
11695
11696 @item s
11697 The opened/closed/denied status of the server.
11698 @end table
11699
11700 @vindex gnus-server-mode-line-format
11701 The mode line can also be customized by using the
11702 @code{gnus-server-mode-line-format} variable (@pxref{Mode Line
11703 Formatting}).  The following specs are understood:
11704
11705 @table @samp
11706 @item S
11707 Server name.
11708
11709 @item M
11710 Server method.
11711 @end table
11712
11713 Also @pxref{Formatting Variables}.
11714
11715
11716 @node Server Commands
11717 @subsection Server Commands
11718 @cindex server commands
11719
11720 @table @kbd
11721
11722 @item a
11723 @kindex a (Server)
11724 @findex gnus-server-add-server
11725 Add a new server (@code{gnus-server-add-server}).
11726
11727 @item e
11728 @kindex e (Server)
11729 @findex gnus-server-edit-server
11730 Edit a server (@code{gnus-server-edit-server}).
11731
11732 @item SPACE
11733 @kindex SPACE (Server)
11734 @findex gnus-server-read-server
11735 Browse the current server (@code{gnus-server-read-server}).
11736
11737 @item q
11738 @kindex q (Server)
11739 @findex gnus-server-exit
11740 Return to the group buffer (@code{gnus-server-exit}).
11741
11742 @item k
11743 @kindex k (Server)
11744 @findex gnus-server-kill-server
11745 Kill the current server (@code{gnus-server-kill-server}).
11746
11747 @item y
11748 @kindex y (Server)
11749 @findex gnus-server-yank-server
11750 Yank the previously killed server (@code{gnus-server-yank-server}).
11751
11752 @item c
11753 @kindex c (Server)
11754 @findex gnus-server-copy-server
11755 Copy the current server (@code{gnus-server-copy-server}).
11756
11757 @item l
11758 @kindex l (Server)
11759 @findex gnus-server-list-servers
11760 List all servers (@code{gnus-server-list-servers}).
11761
11762 @item s
11763 @kindex s (Server)
11764 @findex gnus-server-scan-server
11765 Request that the server scan its sources for new articles
11766 (@code{gnus-server-scan-server}).  This is mainly sensible with mail
11767 servers.
11768
11769 @item g
11770 @kindex g (Server)
11771 @findex gnus-server-regenerate-server
11772 Request that the server regenerate all its data structures
11773 (@code{gnus-server-regenerate-server}).  This can be useful if you have
11774 a mail back end that has gotten out of sync.
11775
11776 @end table
11777
11778
11779 @node Example Methods
11780 @subsection Example Methods
11781
11782 Most select methods are pretty simple and self-explanatory:
11783
11784 @lisp
11785 (nntp "news.funet.fi")
11786 @end lisp
11787
11788 Reading directly from the spool is even simpler:
11789
11790 @lisp
11791 (nnspool "")
11792 @end lisp
11793
11794 As you can see, the first element in a select method is the name of the
11795 back end, and the second is the @dfn{address}, or @dfn{name}, if you
11796 will.
11797
11798 After these two elements, there may be an arbitrary number of
11799 @code{(@var{variable} @var{form})} pairs.
11800
11801 To go back to the first example---imagine that you want to read from
11802 port 15 on that machine.  This is what the select method should
11803 look like then:
11804
11805 @lisp
11806 (nntp "news.funet.fi" (nntp-port-number 15))
11807 @end lisp
11808
11809 You should read the documentation to each back end to find out what
11810 variables are relevant, but here's an @code{nnmh} example:
11811
11812 @code{nnmh} is a mail back end that reads a spool-like structure.  Say
11813 you have two structures that you wish to access: One is your private
11814 mail spool, and the other is a public one.  Here's the possible spec for
11815 your private mail:
11816
11817 @lisp
11818 (nnmh "private" (nnmh-directory "~/private/mail/"))
11819 @end lisp
11820
11821 (This server is then called @samp{private}, but you may have guessed
11822 that.)
11823
11824 Here's the method for a public spool:
11825
11826 @lisp
11827 (nnmh "public"
11828       (nnmh-directory "/usr/information/spool/")
11829       (nnmh-get-new-mail nil))
11830 @end lisp
11831
11832 @cindex proxy
11833 @cindex firewall
11834
11835 If you are behind a firewall and only have access to the @sc{nntp}
11836 server from the firewall machine, you can instruct Gnus to @code{rlogin}
11837 on the firewall machine and telnet from there to the @sc{nntp} server.
11838 Doing this can be rather fiddly, but your virtual server definition
11839 should probably look something like this:
11840
11841 @lisp
11842 (nntp "firewall"
11843       (nntp-open-connection-function nntp-open-via-rlogin-and-telnet)
11844       (nntp-via-address "the.firewall.machine")
11845       (nntp-address "the.real.nntp.host")
11846       (nntp-end-of-line "\n"))
11847 @end lisp
11848
11849 If you want to use the wonderful @code{ssh} program to provide a
11850 compressed connection over the modem line, you could add the following
11851 configuration to the example above:
11852
11853 @lisp
11854       (nntp-via-rlogin-command "ssh")
11855 @end lisp
11856
11857 See also @code{nntp-via-rlogin-command-switches}.
11858
11859 If you're behind a firewall, but have direct access to the outside world
11860 through a wrapper command like "runsocks", you could open a socksified
11861 telnet connection to the news server as follows:
11862
11863 @lisp
11864 (nntp "outside"
11865       (nntp-pre-command "runsocks")
11866       (nntp-open-connection-function nntp-open-via-telnet)
11867       (nntp-address "the.news.server")
11868       (nntp-end-of-line "\n"))
11869 @end lisp
11870
11871 This means that you have to have set up @code{ssh-agent} correctly to
11872 provide automatic authorization, of course.  And to get a compressed
11873 connection, you have to have the @samp{Compression} option in the
11874 @code{ssh} @file{config} file.
11875
11876
11877 @node Creating a Virtual Server
11878 @subsection Creating a Virtual Server
11879
11880 If you're saving lots of articles in the cache by using persistent
11881 articles, you may want to create a virtual server to read the cache.
11882
11883 First you need to add a new server.  The @kbd{a} command does that.  It
11884 would probably be best to use @code{nnspool} to read the cache.  You
11885 could also use @code{nnml} or @code{nnmh}, though.
11886
11887 Type @kbd{a nnspool RET cache RET}.
11888
11889 You should now have a brand new @code{nnspool} virtual server called
11890 @samp{cache}.  You now need to edit it to have the right definitions.
11891 Type @kbd{e} to edit the server.  You'll be entered into a buffer that
11892 will contain the following:
11893
11894 @lisp
11895 (nnspool "cache")
11896 @end lisp
11897
11898 Change that to:
11899
11900 @lisp
11901 (nnspool "cache"
11902          (nnspool-spool-directory "~/News/cache/")
11903          (nnspool-nov-directory "~/News/cache/")
11904          (nnspool-active-file "~/News/cache/active"))
11905 @end lisp
11906
11907 Type @kbd{C-c C-c} to return to the server buffer.  If you now press
11908 @kbd{RET} over this virtual server, you should be entered into a browse
11909 buffer, and you should be able to enter any of the groups displayed.
11910
11911
11912 @node Server Variables
11913 @subsection Server Variables
11914
11915 One sticky point when defining variables (both on back ends and in Emacs
11916 in general) is that some variables are typically initialized from other
11917 variables when the definition of the variables is being loaded.  If you
11918 change the "base" variable after the variables have been loaded, you
11919 won't change the "derived" variables.
11920
11921 This typically affects directory and file variables.  For instance,
11922 @code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml}
11923 directory variables are initialized from that variable, so
11924 @code{nnml-active-file} will be @file{~/Mail/active}.  If you define a
11925 new virtual @code{nnml} server, it will @emph{not} suffice to set just
11926 @code{nnml-directory}---you have to explicitly set all the file
11927 variables to be what you want them to be.  For a complete list of
11928 variables for each back end, see each back end's section later in this
11929 manual, but here's an example @code{nnml} definition:
11930
11931 @lisp
11932 (nnml "public"
11933       (nnml-directory "~/my-mail/")
11934       (nnml-active-file "~/my-mail/active")
11935       (nnml-newsgroups-file "~/my-mail/newsgroups"))
11936 @end lisp
11937
11938
11939 @node Servers and Methods
11940 @subsection Servers and Methods
11941
11942 Wherever you would normally use a select method
11943 (e.g. @code{gnus-secondary-select-method}, in the group select method,
11944 when browsing a foreign server) you can use a virtual server name
11945 instead.  This could potentially save lots of typing.  And it's nice all
11946 over.
11947
11948
11949 @node Unavailable Servers
11950 @subsection Unavailable Servers
11951
11952 If a server seems to be unreachable, Gnus will mark that server as
11953 @code{denied}.  That means that any subsequent attempt to make contact
11954 with that server will just be ignored.  ``It can't be opened,'' Gnus
11955 will tell you, without making the least effort to see whether that is
11956 actually the case or not.
11957
11958 That might seem quite naughty, but it does make sense most of the time.
11959 Let's say you have 10 groups subscribed to on server
11960 @samp{nephelococcygia.com}.  This server is located somewhere quite far
11961 away from you and the machine is quite slow, so it takes 1 minute just
11962 to find out that it refuses connection to you today.  If Gnus were to
11963 attempt to do that 10 times, you'd be quite annoyed, so Gnus won't
11964 attempt to do that.  Once it has gotten a single ``connection refused'',
11965 it will regard that server as ``down''.
11966
11967 So, what happens if the machine was only feeling unwell temporarily?
11968 How do you test to see whether the machine has come up again?
11969
11970 You jump to the server buffer (@pxref{Server Buffer}) and poke it
11971 with the following commands:
11972
11973 @table @kbd
11974
11975 @item O
11976 @kindex O (Server)
11977 @findex gnus-server-open-server
11978 Try to establish connection to the server on the current line
11979 (@code{gnus-server-open-server}).
11980
11981 @item C
11982 @kindex C (Server)
11983 @findex gnus-server-close-server
11984 Close the connection (if any) to the server
11985 (@code{gnus-server-close-server}).
11986
11987 @item D
11988 @kindex D (Server)
11989 @findex gnus-server-deny-server
11990 Mark the current server as unreachable
11991 (@code{gnus-server-deny-server}).
11992
11993 @item M-o
11994 @kindex M-o (Server)
11995 @findex gnus-server-open-all-servers
11996 Open the connections to all servers in the buffer
11997 (@code{gnus-server-open-all-servers}).
11998
11999 @item M-c
12000 @kindex M-c (Server)
12001 @findex gnus-server-close-all-servers
12002 Close the connections to all servers in the buffer
12003 (@code{gnus-server-close-all-servers}).
12004
12005 @item R
12006 @kindex R (Server)
12007 @findex gnus-server-remove-denials
12008 Remove all marks to whether Gnus was denied connection from any servers
12009 (@code{gnus-server-remove-denials}).
12010
12011 @item L
12012 @kindex L (Server)
12013 @findex gnus-server-offline-server
12014 Set server status to offline (@code{gnus-server-offline-server}).
12015
12016 @end table
12017
12018
12019 @node Getting News
12020 @section Getting News
12021 @cindex reading news
12022 @cindex news back ends
12023
12024 A newsreader is normally used for reading news.  Gnus currently provides
12025 only two methods of getting news---it can read from an @sc{nntp} server,
12026 or it can read from a local spool.
12027
12028 @menu
12029 * NNTP::                        Reading news from an @sc{nntp} server.
12030 * News Spool::                  Reading news from the local spool.
12031 @end menu
12032
12033
12034 @node NNTP
12035 @subsection NNTP
12036 @cindex nntp
12037
12038 Subscribing to a foreign group from an @sc{nntp} server is rather easy.
12039 You just specify @code{nntp} as method and the address of the @sc{nntp}
12040 server as the, uhm, address.
12041
12042 If the @sc{nntp} server is located at a non-standard port, setting the
12043 third element of the select method to this port number should allow you
12044 to connect to the right port.  You'll have to edit the group info for
12045 that (@pxref{Foreign Groups}).
12046
12047 The name of the foreign group can be the same as a native group.  In
12048 fact, you can subscribe to the same group from as many different servers
12049 you feel like.  There will be no name collisions.
12050
12051 The following variables can be used to create a virtual @code{nntp}
12052 server:
12053
12054 @table @code
12055
12056 @item nntp-server-opened-hook
12057 @vindex nntp-server-opened-hook
12058 @cindex @sc{mode reader}
12059 @cindex authinfo
12060 @cindex authentification
12061 @cindex nntp authentification
12062 @findex nntp-send-authinfo
12063 @findex nntp-send-mode-reader
12064 is run after a connection has been made.  It can be used to send
12065 commands to the @sc{nntp} server after it has been contacted.  By
12066 default it sends the command @code{MODE READER} to the server with the
12067 @code{nntp-send-mode-reader} function.  This function should always be
12068 present in this hook.
12069
12070 @item nntp-authinfo-function
12071 @vindex nntp-authinfo-function
12072 @findex nntp-send-authinfo
12073 @vindex nntp-authinfo-file
12074 This function will be used to send @samp{AUTHINFO} to the @sc{nntp}
12075 server.  The default function is @code{nntp-send-authinfo}, which looks
12076 through your @file{~/.authinfo} (or whatever you've set the
12077 @code{nntp-authinfo-file} variable to) for applicable entries.  If none
12078 are found, it will prompt you for a login name and a password.  The
12079 format of the @file{~/.authinfo} file is (almost) the same as the
12080 @code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp}
12081 manual page, but here are the salient facts:
12082
12083 @enumerate
12084 @item
12085 The file contains one or more line, each of which define one server.
12086
12087 @item
12088 Each line may contain an arbitrary number of token/value pairs.
12089
12090 The valid tokens include @samp{machine}, @samp{login}, @samp{password},
12091 @samp{default}.  In addition Gnus introduces two new tokens, not present
12092 in the original @file{.netrc}/@code{ftp} syntax, namely @samp{port} and
12093 @samp{force}.  (This is the only way the @file{.authinfo} file format
12094 deviates from the @file{.netrc} file format.)  @samp{port} is used to
12095 indicate what port on the server the credentials apply to and
12096 @samp{force} is explained below.
12097
12098 @end enumerate
12099
12100 Here's an example file:
12101
12102 @example
12103 machine news.uio.no login larsi password geheimnis
12104 machine nntp.ifi.uio.no login larsi force yes
12105 @end example
12106
12107 The token/value pairs may appear in any order; @samp{machine} doesn't
12108 have to be first, for instance.
12109
12110 In this example, both login name and password have been supplied for the
12111 former server, while the latter has only the login name listed, and the
12112 user will be prompted for the password.  The latter also has the
12113 @samp{force} tag, which means that the authinfo will be sent to the
12114 @var{nntp} server upon connection; the default (i.e., when there is not
12115 @samp{force} tag) is to not send authinfo to the @var{nntp} server
12116 until the @var{nntp} server asks for it.
12117
12118 You can also add @samp{default} lines that will apply to all servers
12119 that don't have matching @samp{machine} lines.
12120
12121 @example
12122 default force yes
12123 @end example
12124
12125 This will force sending @samp{AUTHINFO} commands to all servers not
12126 previously mentioned.
12127
12128 Remember to not leave the @file{~/.authinfo} file world-readable.
12129
12130 @item nntp-server-action-alist
12131 @vindex nntp-server-action-alist
12132 This is a list of regexps to match on server types and actions to be
12133 taken when matches are made.  For instance, if you want Gnus to beep
12134 every time you connect to innd, you could say something like:
12135
12136 @lisp
12137 (setq nntp-server-action-alist
12138       '(("innd" (ding))))
12139 @end lisp
12140
12141 You probably don't want to do that, though.
12142
12143 The default value is
12144
12145 @lisp
12146 '(("nntpd 1\\.5\\.11t"
12147    (remove-hook 'nntp-server-opened-hook
12148                 'nntp-send-mode-reader)))
12149 @end lisp
12150
12151 This ensures that Gnus doesn't send the @code{MODE READER} command to
12152 nntpd 1.5.11t, since that command chokes that server, I've been told.
12153
12154 @item nntp-maximum-request
12155 @vindex nntp-maximum-request
12156 If the @sc{nntp} server doesn't support @sc{nov} headers, this back end
12157 will collect headers by sending a series of @code{head} commands.  To
12158 speed things up, the back end sends lots of these commands without
12159 waiting for reply, and then reads all the replies.  This is controlled
12160 by the @code{nntp-maximum-request} variable, and is 400 by default.  If
12161 your network is buggy, you should set this to 1.
12162
12163 @item nntp-connection-timeout
12164 @vindex nntp-connection-timeout
12165 If you have lots of foreign @code{nntp} groups that you connect to
12166 regularly, you're sure to have problems with @sc{nntp} servers not
12167 responding properly, or being too loaded to reply within reasonable
12168 time.  This is can lead to awkward problems, which can be helped
12169 somewhat by setting @code{nntp-connection-timeout}.  This is an integer
12170 that says how many seconds the @code{nntp} back end should wait for a
12171 connection before giving up.  If it is @code{nil}, which is the default,
12172 no timeouts are done.
12173
12174 @c @item nntp-command-timeout
12175 @c @vindex nntp-command-timeout
12176 @c @cindex PPP connections
12177 @c @cindex dynamic IP addresses
12178 @c If you're running Gnus on a machine that has a dynamically assigned
12179 @c address, Gnus may become confused.  If the address of your machine
12180 @c changes after connecting to the @sc{nntp} server, Gnus will simply sit
12181 @c waiting forever for replies from the server.  To help with this
12182 @c unfortunate problem, you can set this command to a number.  Gnus will
12183 @c then, if it sits waiting for a reply from the server longer than that
12184 @c number of seconds, shut down the connection, start a new one, and resend
12185 @c the command.  This should hopefully be transparent to the user.  A
12186 @c likely number is 30 seconds.
12187 @c
12188 @c @item nntp-retry-on-break
12189 @c @vindex nntp-retry-on-break
12190 @c If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus
12191 @c hangs.  This will have much the same effect as the command timeout
12192 @c described above.
12193
12194 @item nntp-server-hook
12195 @vindex nntp-server-hook
12196 This hook is run as the last step when connecting to an @sc{nntp}
12197 server.
12198
12199 @item nntp-buggy-select
12200 @vindex nntp-buggy-select
12201 Set this to non-@code{nil} if your select routine is buggy.
12202
12203 @item nntp-nov-is-evil
12204 @vindex nntp-nov-is-evil
12205 If the @sc{nntp} server does not support @sc{nov}, you could set this
12206 variable to @code{t}, but @code{nntp} usually checks automatically whether @sc{nov}
12207 can be used.
12208
12209 @item nntp-xover-commands
12210 @vindex nntp-xover-commands
12211 @cindex nov
12212 @cindex XOVER
12213 List of strings used as commands to fetch @sc{nov} lines from a
12214 server.  The default value of this variable is @code{("XOVER"
12215 "XOVERVIEW")}.
12216
12217 @item nntp-nov-gap
12218 @vindex nntp-nov-gap
12219 @code{nntp} normally sends just one big request for @sc{nov} lines to
12220 the server.  The server responds with one huge list of lines.  However,
12221 if you have read articles 2-5000 in the group, and only want to read
12222 article 1 and 5001, that means that @code{nntp} will fetch 4999 @sc{nov}
12223 lines that you will not need.  This variable says how
12224 big a gap between two consecutive articles is allowed to be before the
12225 @code{XOVER} request is split into several request.  Note that if your
12226 network is fast, setting this variable to a really small number means
12227 that fetching will probably be slower.  If this variable is @code{nil},
12228 @code{nntp} will never split requests.  The default is 5.
12229
12230 @item nntp-prepare-server-hook
12231 @vindex nntp-prepare-server-hook
12232 A hook run before attempting to connect to an @sc{nntp} server.
12233
12234 @item nntp-warn-about-losing-connection
12235 @vindex nntp-warn-about-losing-connection
12236 If this variable is non-@code{nil}, some noise will be made when a
12237 server closes connection.
12238
12239 @item nntp-record-commands
12240 @vindex nntp-record-commands
12241 If non-@code{nil}, @code{nntp} will log all commands it sends to the
12242 @sc{nntp} server (along with a timestamp) in the @samp{*nntp-log*}
12243 buffer.  This is useful if you are debugging a Gnus/@sc{nntp} connection
12244 that doesn't seem to work.
12245
12246 @item nntp-open-connection-function
12247 @vindex nntp-open-connection-function
12248 It is possible to customize how the connection to the nntp server will
12249 be opened.  If you specify an @code{nntp-open-connection-function}
12250 parameter, Gnus will use that function to establish the connection.
12251 Five pre-made functions are supplied.  These functions can be grouped in
12252 two categories: direct connection functions (three pre-made), and
12253 indirect ones (two pre-made).
12254
12255 @item nntp-prepare-post-hook
12256 @vindex nntp-prepare-post-hook
12257 A hook run just before posting an article.  If there is no
12258 @code{Message-ID} header in the article and the news server provides the
12259 recommended ID, it will be added to the article before running this
12260 hook.  It is useful to make @code{Cancel-Lock} headers even if you
12261 inhibit Gnus to add a @code{Message-ID} header, you could say:
12262
12263 @lisp
12264 (add-hook 'nntp-prepare-post-hook 'canlock-insert-header)
12265 @end lisp
12266
12267 Note that not all servers support the recommended ID.  This works for
12268 INN versions 2.3.0 and later, for instance.
12269
12270 @item nntp-read-timeout
12271 @vindex nntp-read-timeout
12272 How long nntp should wait between checking for the end of output.
12273 Shorter values mean quicker response, but is more CPU intensive.  The
12274 default is 0.1 seconds.  If you have a slow line to the server (and
12275 don't like to see Emacs eat your available CPU power), you might set
12276 this to, say, 1.
12277
12278 @item nntp-list-options
12279 @vindex nntp-list-options
12280 List of newsgroup name used for a option of the LIST command to restrict
12281 the listing output to only the specified newsgroups.  Each newsgroup name
12282 can be a shell-style wildcard, for instance, @dfn{fj.*}, @dfn{japan.*},
12283 etc.  Fortunately, if the server can accept such a option, it will
12284 probably make gnus run faster.  You may use it as a server variable as
12285 follows:
12286
12287 @lisp
12288 (setq gnus-select-method
12289       '(nntp "news.somewhere.edu"
12290              (nntp-list-options ("fj.*" "japan.*"))))
12291 @end lisp
12292
12293 @item nntp-options-subscribe
12294 @vindex nntp-options-subscribe
12295 Regexp matching the newsgroup names which will be subscribed
12296 unconditionally.  Use @dfn{ } instead of @dfn{$} for a regexp string.
12297 It may be effective as well as @code{nntp-list-options} even though the
12298 server could not accept a shell-style wildcard as a option of the LIST
12299 command.  You may use it as a server variable as follows:
12300
12301 @lisp
12302 (setq gnus-select-method
12303       '(nntp "news.somewhere.edu"
12304              (nntp-options-subscribe "^fj\\.\\|^japan\\.")))
12305 @end lisp
12306
12307 @item nntp-options-not-subscribe
12308 @vindex nntp-options-not-subscribe
12309 Regexp matching the newsgroup names which will not be subscribed
12310 unconditionally.  Use @dfn{ } instead of @dfn{$} for a regexp string.
12311 It may be effective as well as @code{nntp-list-options} even though the
12312 server could not accept a shell-style wildcard as a option of the LIST
12313 command.  You may use it as a server variable as follows:
12314
12315 @lisp
12316 (setq gnus-select-method
12317       '(nntp "news.somewhere.edu"
12318              (nntp-options-not-subscribe "\\.binaries\\.")))
12319 @end lisp
12320 @end table
12321
12322 @menu
12323 * Direct Functions::            Connecting directly to the server.
12324 * Indirect Functions::          Connecting indirectly to the server.
12325 * Common Variables::            Understood by several connection functions.
12326 @end menu
12327
12328
12329 @node Direct Functions
12330 @subsubsection Direct Functions
12331 @cindex direct connection functions
12332
12333 These functions are called direct because they open a direct connection
12334 between your machine and the @sc{nntp} server.  The behavior of these
12335 functions is also affected by commonly understood variables
12336 (@pxref{Common Variables}).
12337
12338 @table @code
12339 @findex nntp-open-network-stream
12340 @item nntp-open-network-stream
12341 This is the default, and simply connects to some port or other on the
12342 remote system.
12343
12344 @findex nntp-open-ssl-stream
12345 @item nntp-open-ssl-stream
12346 Opens a connection to a server over a @dfn{secure} channel.  To use
12347 this you must have OpenSSL (@uref{http://www.openssl.org}) or SSLeay
12348 installed (@uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL}, and you also
12349 need @file{ssl.el} (from the W3 distribution, for instance).  You then
12350 define a server as follows:
12351
12352 @lisp
12353 ;; Type `C-c C-c' after you've finished editing.
12354 ;;
12355 ;; "snews" is port 563 and is predefined in our /etc/services
12356 ;; however, openssl s_client -port doesn't like named ports
12357 ;;
12358 (nntp "snews.bar.com"
12359       (nntp-open-connection-function nntp-open-ssl-stream)
12360       (nntp-port-number 563)
12361       (nntp-address "snews.bar.com"))
12362 @end lisp
12363
12364 @findex nntp-open-telnet-stream
12365 @item nntp-open-telnet-stream
12366 Opens a connection to an @sc{nntp} server by simply @samp{telnet}'ing
12367 it.  You might wonder why this function exists, since we have the
12368 default @code{nntp-open-network-stream} which would do the job.  (One
12369 of) the reason(s) is that if you are behind a firewall but have direct
12370 connections to the outside world thanks to a command wrapper like
12371 @code{runsocks}, you can use it like this:
12372
12373 @lisp
12374 (nntp "socksified"
12375       (nntp-pre-command "runsocks")
12376       (nntp-open-connection-function nntp-open-telnet-stream)
12377       (nntp-address "the.news.server"))
12378 @end lisp
12379
12380 With the default method, you would need to wrap your whole Emacs
12381 session, which is not a good idea.
12382 @end table
12383
12384
12385 @node Indirect Functions
12386 @subsubsection Indirect Functions
12387 @cindex indirect connection functions
12388
12389 These functions are called indirect because they connect to an
12390 intermediate host before actually connecting to the @sc{nntp} server.
12391 All of these functions and related variables are also said to belong to
12392 the "via" family of connection: they're all prefixed with "via" to make
12393 things cleaner.  The behavior of these functions is also affected by
12394 commonly understood variables (@pxref{Common Variables}).
12395
12396 @table @code
12397 @item nntp-open-via-rlogin-and-telnet
12398 @findex nntp-open-via-rlogin-and-telnet
12399 Does an @samp{rlogin} on a remote system, and then does a @samp{telnet}
12400 to the real @sc{nntp} server from there.  This is useful for instance if
12401 you need to connect to a firewall machine first.
12402
12403 @code{nntp-open-via-rlogin-and-telnet}-specific variables:
12404
12405 @table @code
12406 @item nntp-via-rlogin-command
12407 @vindex nntp-via-rlogin-command
12408 Command used to log in on the intermediate host.  The default is
12409 @samp{rsh}, but @samp{ssh} is a popular alternative.
12410
12411 @item nntp-via-rlogin-command-switches
12412 @vindex nntp-via-rlogin-command-switches
12413 List of strings to be used as the switches to
12414 @code{nntp-via-rlogin-command}.  The default is @code{nil}.  If you use
12415 @samp{ssh} for `nntp-via-rlogin-command', you may set this to
12416 @samp{("-C")} in order to compress all data connections, otherwise set
12417 this to @samp{("-t")} or @samp{("-C" "-t")} if the telnet command
12418 requires a pseudo-tty allocation on an intermediate host.
12419 @end table
12420
12421 @item nntp-open-via-telnet-and-telnet
12422 @findex nntp-open-via-telnet-and-telnet
12423 Does essentially the same, but uses @samp{telnet} instead of
12424 @samp{rlogin} to connect to the intermediate host.
12425
12426 @code{nntp-open-via-telnet-and-telnet}-specific variables:
12427
12428 @table @code
12429 @item nntp-via-telnet-command
12430 @vindex nntp-via-telnet-command
12431 Command used to @code{telnet} the intermediate host.  The default is
12432 @samp{telnet}.
12433
12434 @item nntp-via-telnet-switches
12435 @vindex nntp-via-telnet-switches
12436 List of strings to be used as the switches to the
12437 @code{nntp-via-telnet-command} command.  The default is @samp{("-8")}.
12438
12439 @item nntp-via-user-password
12440 @vindex nntp-via-user-password
12441 Password to use when logging in on the intermediate host.
12442
12443 @item nntp-via-envuser
12444 @vindex nntp-via-envuser
12445 If non-@code{nil}, the intermediate @code{telnet} session (client and
12446 server both) will support the @code{ENVIRON} option and not prompt for
12447 login name. This works for Solaris @code{telnet}, for instance.
12448
12449 @item nntp-via-shell-prompt
12450 @vindex nntp-via-shell-prompt
12451 Regexp matching the shell prompt on the intermediate host.  The default
12452 is @samp{bash\\|\$ *\r?$\\|> *\r?}.
12453
12454 @end table
12455
12456 @end table
12457
12458
12459 Here are some additional variables that are understood by all the above
12460 functions:
12461
12462 @table @code
12463
12464 @item nntp-via-user-name
12465 @vindex nntp-via-user-name
12466 User name to use when connecting to the intermediate host.
12467
12468 @item nntp-via-address
12469 @vindex nntp-via-address
12470 Address of the intermediate host to connect to.
12471
12472 @end table
12473
12474
12475 @node Common Variables
12476 @subsubsection Common Variables
12477
12478 The following variables affect the behavior of all, or several of the
12479 pre-made connection functions. When not specified, all functions are
12480 affected.
12481
12482 @table @code
12483
12484 @item nntp-pre-command
12485 @vindex nntp-pre-command
12486 A command wrapper to use when connecting through a non native connection
12487 function (all except @code{nntp-open-network-stream} and
12488 @code{nntp-open-ssl-stream}.  This is where you would put a @samp{SOCKS}
12489 wrapper for instance.
12490
12491 @item nntp-address
12492 @vindex nntp-address
12493 The address of the @sc{nntp} server.
12494
12495 @item nntp-port-number
12496 @vindex nntp-port-number
12497 Port number to connect to the @sc{nntp} server.  The default is @samp{nntp}.
12498 If you use @sc{nntp} over @sc{ssl}, you may want to use integer ports rather
12499 than named ports (i.e, use @samp{563} instead of @samp{snews}), because
12500 external SSL tools may not work with named ports.
12501
12502 @item nntp-end-of-line
12503 @vindex nntp-end-of-line
12504 String to use as end-of-line marker when talking to the @sc{nntp}
12505 server.  This is @samp{\r\n} by default, but should be @samp{\n} when
12506 using a non native connection function.
12507
12508 @item nntp-telnet-command
12509 @vindex nntp-telnet-command
12510 Command to use when connecting to the @sc{nntp} server through
12511 @samp{telnet}.  This is NOT for an intermediate host.  This is just for
12512 the real @sc{nntp} server.  The default is @samp{telnet}.
12513
12514 @item nntp-telnet-switches
12515 @vindex nntp-telnet-switches
12516 A list of switches to pass to @code{nntp-telnet-command}.  The default
12517 is @samp{("-8")}.
12518
12519 @end table
12520
12521
12522 @node News Spool
12523 @subsection News Spool
12524 @cindex nnspool
12525 @cindex news spool
12526
12527 Subscribing to a foreign group from the local spool is extremely easy,
12528 and might be useful, for instance, to speed up reading groups that
12529 contain very big articles---@samp{alt.binaries.pictures.furniture}, for
12530 instance.
12531
12532 Anyway, you just specify @code{nnspool} as the method and @code{""} (or
12533 anything else) as the address.
12534
12535 If you have access to a local spool, you should probably use that as the
12536 native select method (@pxref{Finding the News}).  It is normally faster
12537 than using an @code{nntp} select method, but might not be.  It depends.
12538 You just have to try to find out what's best at your site.
12539
12540 @table @code
12541
12542 @item nnspool-inews-program
12543 @vindex nnspool-inews-program
12544 Program used to post an article.
12545
12546 @item nnspool-inews-switches
12547 @vindex nnspool-inews-switches
12548 Parameters given to the inews program when posting an article.
12549
12550 @item nnspool-spool-directory
12551 @vindex nnspool-spool-directory
12552 Where @code{nnspool} looks for the articles.  This is normally
12553 @file{/usr/spool/news/}.
12554
12555 @item nnspool-nov-directory
12556 @vindex nnspool-nov-directory
12557 Where @code{nnspool} will look for @sc{nov} files.  This is normally
12558 @file{/usr/spool/news/over.view/}.
12559
12560 @item nnspool-lib-dir
12561 @vindex nnspool-lib-dir
12562 Where the news lib dir is (@file{/usr/lib/news/} by default).
12563
12564 @item nnspool-active-file
12565 @vindex nnspool-active-file
12566 The name of the active file.
12567
12568 @item nnspool-newsgroups-file
12569 @vindex nnspool-newsgroups-file
12570 The name of the group descriptions file.
12571
12572 @item nnspool-history-file
12573 @vindex nnspool-history-file
12574 The name of the news history file.
12575
12576 @item nnspool-active-times-file
12577 @vindex nnspool-active-times-file
12578 The name of the active date file.
12579
12580 @item nnspool-nov-is-evil
12581 @vindex nnspool-nov-is-evil
12582 If non-@code{nil}, @code{nnspool} won't try to use any @sc{nov} files
12583 that it finds.
12584
12585 @item nnspool-sift-nov-with-sed
12586 @vindex nnspool-sift-nov-with-sed
12587 @cindex sed
12588 If non-@code{nil}, which is the default, use @code{sed} to get the
12589 relevant portion from the overview file.  If nil, @code{nnspool} will
12590 load the entire file into a buffer and process it there.
12591
12592 @end table
12593
12594
12595 @node Getting Mail
12596 @section Getting Mail
12597 @cindex reading mail
12598 @cindex mail
12599
12600 Reading mail with a newsreader---isn't that just plain WeIrD? But of
12601 course.
12602
12603 @menu
12604 * Mail in a Newsreader::        Important introductory notes.
12605 * Getting Started Reading Mail::  A simple cookbook example.
12606 * Splitting Mail::              How to create mail groups.
12607 * Mail Sources::                How to tell Gnus where to get mail from.
12608 * Mail Back End Variables::     Variables for customizing mail handling.
12609 * Fancy Mail Splitting::        Gnus can do hairy splitting of incoming mail.
12610 * Group Mail Splitting::        Use group customize to drive mail splitting.
12611 * Incorporating Old Mail::      What about the old mail you have?
12612 * Expiring Mail::               Getting rid of unwanted mail.
12613 * Washing Mail::                Removing gruft from the mail you get.
12614 * Duplicates::                  Dealing with duplicated mail.
12615 * Not Reading Mail::            Using mail back ends for reading other files.
12616 * Choosing a Mail Back End::    Gnus can read a variety of mail formats.
12617 @end menu
12618
12619
12620 @node Mail in a Newsreader
12621 @subsection Mail in a Newsreader
12622
12623 If you are used to traditional mail readers, but have decided to switch
12624 to reading mail with Gnus, you may find yourself experiencing something
12625 of a culture shock.
12626
12627 Gnus does not behave like traditional mail readers.  If you want to make
12628 it behave that way, you can, but it's an uphill battle.
12629
12630 Gnus, by default, handles all its groups using the same approach.  This
12631 approach is very newsreaderly---you enter a group, see the new/unread
12632 messages, and when you read the messages, they get marked as read, and
12633 you don't see them any more.  (Unless you explicitly ask for them.)
12634
12635 In particular, you do not do anything explicitly to delete messages.
12636
12637 Does this mean that all the messages that have been marked as read are
12638 deleted?  How awful!
12639
12640 But, no, it means that old messages are @dfn{expired} according to some
12641 scheme or other.  For news messages, the expire process is controlled by
12642 the news administrator; for mail, the expire process is controlled by
12643 you.  The expire process for mail is covered in depth in @pxref{Expiring
12644 Mail}.
12645
12646 What many Gnus users find, after using it a while for both news and
12647 mail, is that the transport mechanism has very little to do with how
12648 they want to treat a message.
12649
12650 Many people subscribe to several mailing lists.  These are transported
12651 via @sc{smtp}, and are therefore mail.  But we might go for weeks without
12652 answering, or even reading these messages very carefully.  We may not
12653 need to save them because if we should need to read one again, they are
12654 archived somewhere else.
12655
12656 Some people have local news groups which have only a handful of readers.
12657 These are transported via @sc{nntp}, and are therefore news.  But we may need
12658 to read and answer a large fraction of the messages very carefully in
12659 order to do our work.  And there may not be an archive, so we may need
12660 to save the interesting messages the same way we would personal mail.
12661
12662 The important distinction turns out to be not the transport mechanism,
12663 but other factors such as how interested we are in the subject matter,
12664 or how easy it is to retrieve the message if we need to read it again.
12665
12666 Gnus provides many options for sorting mail into ``groups'' which behave
12667 like newsgroups, and for treating each group (whether mail or news)
12668 differently.
12669
12670 Some users never get comfortable using the Gnus (ahem) paradigm and wish
12671 that Gnus should grow up and be a male, er, mail reader.  It is possible
12672 to whip Gnus into a more mailreaderly being, but, as said before, it's
12673 not easy.  People who prefer proper mail readers should try @sc{vm}
12674 instead, which is an excellent, and proper, mail reader.
12675
12676 I don't mean to scare anybody off, but I want to make it clear that you
12677 may be required to learn a new way of thinking about messages.  After
12678 you've been subjected to The Gnus Way, you will come to love it.  I can
12679 guarantee it.  (At least the guy who sold me the Emacs Subliminal
12680 Brain-Washing Functions that I've put into Gnus did guarantee it.  You
12681 Will Be Assimilated.  You Love Gnus.  You Love The Gnus Mail Way.
12682 You Do.)
12683
12684
12685 @node Getting Started Reading Mail
12686 @subsection Getting Started Reading Mail
12687
12688 It's quite easy to use Gnus to read your new mail.  You just plonk the
12689 mail back end of your choice into @code{gnus-secondary-select-methods},
12690 and things will happen automatically.
12691
12692 For instance, if you want to use @code{nnml} (which is a "one file per
12693 mail" back end), you could put the following in your @file{.gnus.el} file:
12694
12695 @lisp
12696 (setq gnus-secondary-select-methods '((nnml "")))
12697 @end lisp
12698
12699 Now, the next time you start Gnus, this back end will be queried for new
12700 articles, and it will move all the messages in your spool file to its
12701 directory, which is @code{~/Mail/} by default.  The new group that will
12702 be created (@samp{mail.misc}) will be subscribed, and you can read it
12703 like any other group.
12704
12705 You will probably want to split the mail into several groups, though:
12706
12707 @lisp
12708 (setq nnmail-split-methods
12709       '(("junk" "^From:.*Lars Ingebrigtsen")
12710         ("crazy" "^Subject:.*die\\|^Organization:.*flabby")
12711         ("other" "")))
12712 @end lisp
12713
12714 This will result in three new @code{nnml} mail groups being created:
12715 @samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}.  All the
12716 mail that doesn't fit into the first two groups will be placed in the
12717 last group.
12718
12719 This should be sufficient for reading mail with Gnus.  You might want to
12720 give the other sections in this part of the manual a perusal, though.
12721 Especially @pxref{Choosing a Mail Back End} and @pxref{Expiring Mail}.
12722
12723
12724 @node Splitting Mail
12725 @subsection Splitting Mail
12726 @cindex splitting mail
12727 @cindex mail splitting
12728
12729 @vindex nnmail-split-methods
12730 The @code{nnmail-split-methods} variable says how the incoming mail is
12731 to be split into groups.
12732
12733 @lisp
12734 (setq nnmail-split-methods
12735   '(("mail.junk" "^From:.*Lars Ingebrigtsen")
12736     ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby")
12737     ("mail.other" "")))
12738 @end lisp
12739
12740 This variable is a list of lists, where the first element of each of
12741 these lists is the name of the mail group (they do not have to be called
12742 something beginning with @samp{mail}, by the way), and the second
12743 element is a regular expression used on the header of each mail to
12744 determine if it belongs in this mail group.  The first string may
12745 contain @samp{\\1} forms, like the ones used by @code{replace-match} to
12746 insert sub-expressions from the matched text.  For instance:
12747
12748 @lisp
12749 ("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com")
12750 @end lisp
12751
12752 The second element can also be a function.  In that case, it will be
12753 called narrowed to the headers with the first element of the rule as the
12754 argument.  It should return a non-@code{nil} value if it thinks that the
12755 mail belongs in that group.
12756
12757 The last of these groups should always be a general one, and the regular
12758 expression should @emph{always} be @samp{} so that it matches any mails
12759 that haven't been matched by any of the other regexps.  (These rules are
12760 processed from the beginning of the alist toward the end.  The first
12761 rule to make a match will "win", unless you have crossposting enabled.
12762 In that case, all matching rules will "win".)
12763
12764 If you like to tinker with this yourself, you can set this variable to a
12765 function of your choice.  This function will be called without any
12766 arguments in a buffer narrowed to the headers of an incoming mail
12767 message.  The function should return a list of group names that it
12768 thinks should carry this mail message.
12769
12770 Note that the mail back ends are free to maul the poor, innocent,
12771 incoming headers all they want to.  They all add @code{Lines} headers;
12772 some add @code{X-Gnus-Group} headers; most rename the Unix mbox
12773 @code{From<SPACE>} line to something else.
12774
12775 @vindex nnmail-crosspost
12776 The mail back ends all support cross-posting.  If several regexps match,
12777 the mail will be ``cross-posted'' to all those groups.
12778 @code{nnmail-crosspost} says whether to use this mechanism or not.  Note
12779 that no articles are crossposted to the general (@samp{}) group.
12780
12781 @vindex nnmail-crosspost-link-function
12782 @cindex crosspost
12783 @cindex links
12784 @code{nnmh} and @code{nnml} makes crossposts by creating hard links to
12785 the crossposted articles.  However, not all file systems support hard
12786 links.  If that's the case for you, set
12787 @code{nnmail-crosspost-link-function} to @code{copy-file}.  (This
12788 variable is @code{add-name-to-file} by default.)
12789
12790 @kindex M-x nnmail-split-history
12791 @kindex nnmail-split-history
12792 If you wish to see where the previous mail split put the messages, you
12793 can use the @kbd{M-x nnmail-split-history} command.  If you wish to see
12794 where re-spooling messages would put the messages, you can use
12795 @code{gnus-summary-respool-trace} and related commands (@pxref{Mail
12796 Group Commands}).
12797
12798 @vindex nnmail-split-header-length-limit
12799 Header lines longer than the value of
12800 @code{nnmail-split-header-length-limit} are excluded from the split
12801 function.
12802
12803 @vindex nnmail-mail-splitting-charset
12804 @vindex nnmail-mail-splitting-decodes
12805 By default the splitting codes MIME decodes headers so you can match
12806 on non-ASCII strings.  The @code{nnmail-mail-splitting-charset}
12807 variable specifies the default charset for decoding.  The behaviour
12808 can be turned off completely by binding
12809 @code{nnmail-mail-splitting-decodes} to nil, which is useful if you
12810 want to match articles based on the raw header data.
12811
12812 @vindex nnmail-resplit-incoming
12813 By default, splitting is performed on all incoming messages.  If
12814 you specify a @code{directory} entry for the variable
12815 @code{mail-sources} @pxref{Mail Source Specifiers}, however, then
12816 splitting does @emph{not} happen by default.  You can set the variable
12817 @code{nnmail-resplit-incoming} to a non-nil value to make splitting
12818 happen even in this case.  (This variable has no effect on other kinds
12819 of entries.)
12820
12821 Gnus gives you all the opportunity you could possibly want for shooting
12822 yourself in the foot.  Let's say you create a group that will contain
12823 all the mail you get from your boss.  And then you accidentally
12824 unsubscribe from the group.  Gnus will still put all the mail from your
12825 boss in the unsubscribed group, and so, when your boss mails you ``Have
12826 that report ready by Monday or you're fired!'', you'll never see it and,
12827 come Tuesday, you'll still believe that you're gainfully employed while
12828 you really should be out collecting empty bottles to save up for next
12829 month's rent money.
12830
12831
12832 @node Mail Sources
12833 @subsection Mail Sources
12834
12835 Mail can be gotten from many different sources---the mail spool, from a
12836 POP mail server, from a procmail directory, or from a maildir, for
12837 instance.
12838
12839 @menu
12840 * Mail Source Specifiers::      How to specify what a mail source is.
12841 * Mail Source Customization::   Some variables that influence things.
12842 * Fetching Mail::               Using the mail source specifiers.
12843 @end menu
12844
12845
12846 @node Mail Source Specifiers
12847 @subsubsection Mail Source Specifiers
12848 @cindex POP
12849 @cindex mail server
12850 @cindex procmail
12851 @cindex mail spool
12852 @cindex mail source
12853
12854 You tell Gnus how to fetch mail by setting @code{mail-sources}
12855 (@pxref{Fetching Mail}) to a @dfn{mail source specifier}.
12856
12857 Here's an example:
12858
12859 @lisp
12860 (pop :server "pop3.mailserver.com" :user "myname")
12861 @end lisp
12862
12863 As can be observed, a mail source specifier is a list where the first
12864 element is a @dfn{mail source type}, followed by an arbitrary number of
12865 @dfn{keywords}.  Keywords that are not explicitly specified are given
12866 default values.
12867
12868 The following mail source types are available:
12869
12870 @table @code
12871 @item file
12872 Get mail from a single file; typically from the mail spool.
12873
12874 Keywords:
12875
12876 @table @code
12877 @item :path
12878 The file name.  Defaults to the value of the @code{MAIL}
12879 environment variable or the value of @code{rmail-spool-directory}
12880 (usually something like @file{/usr/mail/spool/user-name}).
12881 @end table
12882
12883 An example file mail source:
12884
12885 @lisp
12886 (file :path "/usr/spool/mail/user-name")
12887 @end lisp
12888
12889 Or using the default file name:
12890
12891 @lisp
12892 (file)
12893 @end lisp
12894
12895 If the mail spool file is not located on the local machine, it's best to
12896 use POP or @sc{imap} or the like to fetch the mail.  You can not use ange-ftp
12897 file names here---it has no way to lock the mail spool while moving the
12898 mail.
12899
12900 If it's impossible to set up a proper server, you can use ssh instead.
12901
12902 @lisp
12903 (setq mail-sources
12904       '((file :prescript "ssh host bin/getmail >%t")))
12905 @end lisp
12906
12907 The @samp{getmail} script would look something like the following:
12908
12909 @example
12910 #!/bin/sh
12911 #  getmail - move mail from spool to stdout
12912 #  flu@@iki.fi
12913
12914 MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail
12915 TMP=$HOME/Mail/tmp
12916 rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP
12917 @end example
12918
12919 Alter this script to fit find the @samp{movemail} you want to use.
12920
12921
12922 @item directory
12923 @vindex nnmail-scan-directory-mail-source-once
12924 Get mail from several files in a directory.  This is typically used when
12925 you have procmail split the incoming mail into several files.  That is,
12926 there is a one-to-one correspondence between files in that directory and
12927 groups, so that mail from the file @file{foo.bar.spool} will be put in
12928 the group @code{foo.bar}.  (You can change the suffix to be used instead
12929 of @code{.spool}.)  Setting
12930 @code{nnmail-scan-directory-mail-source-once} to non-nil forces Gnus to
12931 scan the mail source only once.  This is particularly useful if you want
12932 to scan mail groups at a specified level.
12933
12934 @vindex nnmail-resplit-incoming
12935 There is also the variable @code{nnmail-resplit-incoming}, if you set
12936 that to a non-nil value, then the normal splitting process is applied
12937 to all the files from the directory, @ref{Splitting Mail}.
12938
12939 Keywords:
12940
12941 @table @code
12942 @item :path
12943 The name of the directory where the files are.  There is no default
12944 value.
12945
12946 @item :suffix
12947 Only files ending with this suffix are used.  The default is
12948 @samp{.spool}.
12949
12950 @item :predicate
12951 Only files that have this predicate return non-@code{nil} are returned.
12952 The default is @code{identity}.  This is used as an additional
12953 filter---only files that have the right suffix @emph{and} satisfy this
12954 predicate are considered.
12955
12956 @item :prescript
12957 @itemx :postscript
12958 Script run before/after fetching mail.
12959
12960 @end table
12961
12962 An example directory mail source:
12963
12964 @lisp
12965 (directory :path "/home/user-name/procmail-dir/"
12966            :suffix ".prcml")
12967 @end lisp
12968
12969 @item pop
12970 Get mail from a POP server.
12971
12972 Keywords:
12973
12974 @table @code
12975 @item :server
12976 The name of the POP server.  The default is taken from the
12977 @code{MAILHOST} environment variable.
12978
12979 @item :port
12980 The port number of the POP server.  This can be a number (eg,
12981 @samp{:port 1234}) or a string (eg, @samp{:port "pop3"}).  If it is a
12982 string, it should be a service name as listed in @file{/etc/services} on
12983 Unix systems.  The default is @samp{"pop3"}.  On some systems you might
12984 need to specify it as @samp{"pop-3"} instead.
12985
12986 @item :user
12987 The user name to give to the POP server.  The default is the login
12988 name.
12989
12990 @item :password
12991 The password to give to the POP server.  If not specified, the user is
12992 prompted.
12993
12994 @item :program
12995 The program to use to fetch mail from the POP server.  This should be
12996 a @code{format}-like string.  Here's an example:
12997
12998 @example
12999 fetchmail %u@@%s -P %p %t
13000 @end example
13001
13002 The valid format specifier characters are:
13003
13004 @table @samp
13005 @item t
13006 The name of the file the mail is to be moved to.  This must always be
13007 included in this string.
13008
13009 @item s
13010 The name of the server.
13011
13012 @item P
13013 The port number of the server.
13014
13015 @item u
13016 The user name to use.
13017
13018 @item p
13019 The password to use.
13020 @end table
13021
13022 The values used for these specs are taken from the values you give the
13023 corresponding keywords.
13024
13025 @item :prescript
13026 A script to be run before fetching the mail.  The syntax is the same as
13027 the @code{:program} keyword.  This can also be a function to be run.
13028
13029 @item :postscript
13030 A script to be run after fetching the mail.  The syntax is the same as
13031 the @code{:program} keyword.  This can also be a function to be run.
13032
13033 @item :function
13034 The function to use to fetch mail from the POP server.  The function is
13035 called with one parameter---the name of the file where the mail should
13036 be moved to.
13037
13038 @item :authentication
13039 This can be either the symbol @code{password} or the symbol @code{apop}
13040 and says what authentication scheme to use.  The default is
13041 @code{password}.
13042
13043 @item :connection
13044 What stream to use for connecting to the server, this can be the symbol
13045 @code{ssl}, the symbol @code{tls} or others.  The default is @code{nil}
13046 and use insecure connections.  Note that for SSL/TLS, you need external
13047 programs and libraries:
13048
13049 @itemize @bullet
13050 @item
13051 @dfn{ssl:} Connect through SSL@. Requires OpenSSL (the program
13052 @samp{openssl}) or SSLeay (@samp{s_client}) as well as the external
13053 library @samp{ssl.el}.
13054 @item
13055 @dfn{starttls:} Connect via the STARTTLS extension (similar to SSL)@.
13056 Requires the external library @samp{starttls.el} and program
13057 @samp{starttls}.
13058 @end itemize
13059
13060 @item :leave
13061 Non-@code{nil} if mail is to be left on the server and UIDL used for
13062 message retrieval.  The default is @code{nil}.
13063
13064 @end table
13065
13066 If the @code{:program} and @code{:function} keywords aren't specified,
13067 @code{pop3-movemail} will be used.
13068
13069 Here are some examples.  Fetch from the default POP server, using the
13070 default user name, and default fetcher:
13071
13072 @lisp
13073 (pop)
13074 @end lisp
13075
13076 Fetch from a named server with a named user and password:
13077
13078 @lisp
13079 (pop :server "my.pop.server"
13080      :user "user-name" :password "secret")
13081 @end lisp
13082
13083 Use @samp{movemail} to move the mail:
13084
13085 @lisp
13086 (pop :program "movemail po:%u %t %p")
13087 @end lisp
13088
13089 @item maildir
13090 Get mail from a maildir.  This is a type of mailbox that is supported by
13091 at least qmail and postfix, where each file in a special directory
13092 contains exactly one mail.
13093
13094 Keywords:
13095
13096 @table @code
13097 @item :path
13098 The name of the directory where the mails are stored.  The default is
13099 taken from the @code{MAILDIR} environment variable or
13100 @samp{~/Maildir/}.
13101 @item :subdirs
13102 The subdirectories of the Maildir.  The default is
13103 @samp{("new" "cur")}.
13104
13105 @c If you sometimes look at your mail through a pop3 daemon before fetching
13106 @c them with Gnus, you may also have to fetch your mails from the
13107 @c @code{cur} directory inside the maildir, like in the first example
13108 @c below.
13109
13110 You can also get mails from remote hosts (because maildirs don't suffer
13111 from locking problems).
13112
13113 @end table
13114
13115 Two example maildir mail sources:
13116
13117 @lisp
13118 (maildir :path "/home/user-name/Maildir/"
13119          :subdirs ("cur" "new"))
13120 @end lisp
13121
13122 @lisp
13123 (maildir :path "/user@@remotehost.org:~/Maildir/"
13124          :subdirs ("new"))
13125 @end lisp
13126
13127 @item imap
13128 Get mail from a @sc{imap} server.  If you don't want to use @sc{imap}
13129 as intended, as a network mail reading protocol (ie with nnimap), for
13130 some reason or other, Gnus let you treat it similar to a POP server
13131 and fetches articles from a given @sc{imap} mailbox.  @xref{IMAP}, for
13132 more information.
13133
13134 Note that for the Kerberos, GSSAPI, SSL/TLS and STARTTLS support you
13135 may need external programs and libraries, @xref{IMAP}.
13136
13137 Keywords:
13138
13139 @table @code
13140 @item :server
13141 The name of the @sc{imap} server.  The default is taken from the
13142 @code{MAILHOST} environment variable.
13143
13144 @item :port
13145 The port number of the @sc{imap} server.  The default is @samp{143}, or
13146 @samp{993} for SSL/TLS connections.
13147
13148 @item :user
13149 The user name to give to the @sc{imap} server.  The default is the login
13150 name.
13151
13152 @item :password
13153 The password to give to the @sc{imap} server.  If not specified, the user is
13154 prompted.
13155
13156 @item :stream
13157 What stream to use for connecting to the server, this is one of the
13158 symbols in @code{imap-stream-alist}.  Right now, this means
13159 @samp{gssapi}, @samp{kerberos4}, @samp{starttls}, @samp{ssl},
13160 @samp{shell} or the default @samp{network}.
13161
13162 @item :authentication
13163 Which authenticator to use for authenticating to the server, this is
13164 one of the symbols in @code{imap-authenticator-alist}.  Right now,
13165 this means @samp{gssapi}, @samp{kerberos4}, @samp{digest-md5},
13166 @samp{cram-md5}, @samp{anonymous} or the default @samp{login}.
13167
13168 @item :program
13169 When using the `shell' :stream, the contents of this variable is
13170 mapped into the `imap-shell-program' variable.  This should be a
13171 @code{format}-like string (or list of strings).  Here's an example:
13172
13173 @example
13174 ssh %s imapd
13175 @end example
13176
13177 The valid format specifier characters are:
13178
13179 @table @samp
13180 @item s
13181 The name of the server.
13182
13183 @item l
13184 User name from `imap-default-user'.
13185
13186 @item p
13187 The port number of the server.
13188 @end table
13189
13190 The values used for these specs are taken from the values you give the
13191 corresponding keywords.
13192
13193 @item :mailbox
13194 The name of the mailbox to get mail from.  The default is @samp{INBOX}
13195 which normally is the mailbox which receive incoming mail.
13196
13197 @item :predicate
13198 The predicate used to find articles to fetch.  The default, @samp{UNSEEN
13199 UNDELETED}, is probably the best choice for most people, but if you
13200 sometimes peek in your mailbox with a @sc{imap} client and mark some
13201 articles as read (or; SEEN) you might want to set this to @samp{1:*}.
13202 Then all articles in the mailbox is fetched, no matter what.  For a
13203 complete list of predicates, see RFC 2060 section 6.4.4.
13204
13205 @item :fetchflag
13206 How to flag fetched articles on the server, the default @samp{\Deleted}
13207 will mark them as deleted, an alternative would be @samp{\Seen} which
13208 would simply mark them as read.  These are the two most likely choices,
13209 but more flags are defined in RFC 2060 section 2.3.2.
13210
13211 @item :dontexpunge
13212 If non-nil, don't remove all articles marked as deleted in the mailbox
13213 after finishing the fetch.
13214
13215 @end table
13216
13217 An example @sc{imap} mail source:
13218
13219 @lisp
13220 (imap :server "mail.mycorp.com"
13221       :stream kerberos4
13222       :fetchflag "\\Seen")
13223 @end lisp
13224
13225 @item webmail
13226 Get mail from a webmail server, such as @uref{www.hotmail.com},
13227 @uref{webmail.netscape.com}, @uref{www.netaddress.com},
13228 @uref{mail.yahoo..com}.
13229
13230 NOTE: Webmail largely depends cookies. A "one-line-cookie" patch is
13231 required for url "4.0pre.46".
13232
13233 WARNING: Mails may be lost.  NO WARRANTY.
13234
13235 Keywords:
13236
13237 @table @code
13238 @item :subtype
13239 The type of the webmail server.  The default is @code{hotmail}.  The
13240 alternatives are @code{netscape}, @code{netaddress}, @code{my-deja}.
13241
13242 @item :user
13243 The user name to give to the webmail server.  The default is the login
13244 name.
13245
13246 @item :password
13247 The password to give to the webmail server.  If not specified, the user is
13248 prompted.
13249
13250 @item :dontexpunge
13251 If non-nil, only fetch unread articles and don't move them to trash
13252 folder after finishing the fetch.
13253
13254 @end table
13255
13256 An example webmail source:
13257
13258 @lisp
13259 (webmail :subtype 'hotmail
13260          :user "user-name"
13261          :password "secret")
13262 @end lisp
13263 @end table
13264
13265 @table @dfn
13266 @item Common Keywords
13267 Common keywords can be used in any type of mail source.
13268
13269 Keywords:
13270
13271 @table @code
13272 @item :plugged
13273 If non-nil, fetch the mail even when Gnus is unplugged.  If you use
13274 directory source to get mail, you can specify it as in this example:
13275
13276 @lisp
13277 (setq mail-sources
13278       '((directory :path "/home/pavel/.Spool/"
13279                    :suffix ""
13280                    :plugged t)))
13281 @end lisp
13282
13283 Gnus will then fetch your mail even when you are unplugged.  This is
13284 useful when you use local mail and news.
13285
13286 @end table
13287 @end table
13288
13289 @subsubsection Function Interface
13290
13291 Some of the above keywords specify a Lisp function to be executed.
13292 For each keyword @code{:foo}, the Lisp variable @code{foo} is bound to
13293 the value of the keyword while the function is executing.  For example,
13294 consider the following mail-source setting:
13295
13296 @lisp
13297 (setq mail-sources '((pop :user "jrl"
13298                           :server "pophost" :function fetchfunc)))
13299 @end lisp
13300
13301 While the function @code{fetchfunc} is executing, the symbol @code{user}
13302 is bound to @code{"jrl"}, and the symbol @code{server} is bound to
13303 @code{"pophost"}.  The symbols @code{port}, @code{password},
13304 @code{program}, @code{prescript}, @code{postscript}, @code{function},
13305 and @code{authentication} are also bound (to their default values).
13306
13307 See above for a list of keywords for each type of mail source.
13308
13309
13310 @node Mail Source Customization
13311 @subsubsection Mail Source Customization
13312
13313 The following is a list of variables that influence how the mail is
13314 fetched.  You would normally not need to set or change any of these
13315 variables.
13316
13317 @table @code
13318 @item mail-source-crash-box
13319 @vindex mail-source-crash-box
13320 File where mail will be stored while processing it.  The default is
13321 @file{~/.emacs-mail-crash-box}.
13322
13323 @item mail-source-delete-incoming
13324 @vindex mail-source-delete-incoming
13325 If non-@code{nil}, delete incoming files after handling them.
13326
13327 @item mail-source-ignore-errors
13328 @vindex mail-source-ignore-errors
13329 If non-@code{nil}, ignore errors when reading mail from a mail source.
13330
13331 @item mail-source-directory
13332 @vindex mail-source-directory
13333 Directory where files (if any) will be stored.  The default is
13334 @file{~/Mail/}.  At present, the only thing this is used for is to say
13335 where the incoming files will be stored if the previous variable is
13336 @code{nil}.
13337
13338 @item mail-source-incoming-file-prefix
13339 @vindex mail-source-incoming-file-prefix
13340 Prefix for file name for storing incoming mail.  The default is
13341 @file{Incoming}, in which case files will end up with names like
13342 @file{Incoming30630D_} or @file{Incoming298602ZD}.  This is really only
13343 relevant if @code{mail-source-delete-incoming} is @code{nil}.
13344
13345 @item mail-source-default-file-modes
13346 @vindex mail-source-default-file-modes
13347 All new mail files will get this file mode.  The default is 384.
13348
13349 @item mail-source-movemail-program
13350 @vindex mail-source-movemail-program
13351 If non-nil, name of program for fetching new mail.  If nil,
13352 @code{movemail} in @var{exec-directory}.
13353
13354 @end table
13355
13356
13357 @node Fetching Mail
13358 @subsubsection Fetching Mail
13359
13360 @vindex mail-sources
13361 @vindex nnmail-spool-file
13362 The way to actually tell Gnus where to get new mail from is to set
13363 @code{mail-sources} to a list of mail source specifiers
13364 (@pxref{Mail Source Specifiers}).
13365
13366 If this variable (and the obsolescent @code{nnmail-spool-file}) is
13367 @code{nil}, the mail back ends will never attempt to fetch mail by
13368 themselves.
13369
13370 If you want to fetch mail both from your local spool as well as a POP
13371 mail server, you'd say something like:
13372
13373 @lisp
13374 (setq mail-sources
13375       '((file)
13376         (pop :server "pop3.mail.server"
13377              :password "secret")))
13378 @end lisp
13379
13380 Or, if you don't want to use any of the keyword defaults:
13381
13382 @lisp
13383 (setq mail-sources
13384       '((file :path "/var/spool/mail/user-name")
13385         (pop :server "pop3.mail.server"
13386              :user "user-name"
13387              :port "pop3"
13388              :password "secret")))
13389 @end lisp
13390
13391
13392 When you use a mail back end, Gnus will slurp all your mail from your
13393 inbox and plonk it down in your home directory.  Gnus doesn't move any
13394 mail if you're not using a mail back end---you have to do a lot of magic
13395 invocations first.  At the time when you have finished drawing the
13396 pentagram, lightened the candles, and sacrificed the goat, you really
13397 shouldn't be too surprised when Gnus moves your mail.
13398
13399
13400
13401 @node Mail Back End Variables
13402 @subsection Mail Back End Variables
13403
13404 These variables are (for the most part) pertinent to all the various
13405 mail back ends.
13406
13407 @table @code
13408 @vindex nnmail-read-incoming-hook
13409 @item nnmail-read-incoming-hook
13410 The mail back ends all call this hook after reading new mail.  You can
13411 use this hook to notify any mail watch programs, if you want to.
13412
13413 @vindex nnmail-split-hook
13414 @item nnmail-split-hook
13415 @findex gnus-article-decode-encoded-words
13416 @findex RFC 1522 decoding
13417 @findex RFC 2047 decoding
13418 Hook run in the buffer where the mail headers of each message is kept
13419 just before the splitting based on these headers is done.  The hook is
13420 free to modify the buffer contents in any way it sees fit---the buffer
13421 is discarded after the splitting has been done, and no changes performed
13422 in the buffer will show up in any files.
13423 @code{gnus-article-decode-encoded-words} is one likely function to add
13424 to this hook.
13425
13426 @vindex nnmail-pre-get-new-mail-hook
13427 @vindex nnmail-post-get-new-mail-hook
13428 @item nnmail-pre-get-new-mail-hook
13429 @itemx nnmail-post-get-new-mail-hook
13430 These are two useful hooks executed when treating new incoming
13431 mail---@code{nnmail-pre-get-new-mail-hook} (is called just before
13432 starting to handle the new mail) and
13433 @code{nnmail-post-get-new-mail-hook} (is called when the mail handling
13434 is done).  Here's and example of using these two hooks to change the
13435 default file modes the new mail files get:
13436
13437 @lisp
13438 (add-hook 'nnmail-pre-get-new-mail-hook
13439           (lambda () (set-default-file-modes 511)))
13440
13441 (add-hook 'nnmail-post-get-new-mail-hook
13442           (lambda () (set-default-file-modes 551)))
13443 @end lisp
13444
13445 @item nnmail-use-long-file-names
13446 @vindex nnmail-use-long-file-names
13447 If non-@code{nil}, the mail back ends will use long file and directory
13448 names.  Groups like @samp{mail.misc} will end up in directories
13449 (assuming use of @code{nnml} back end) or files (assuming use of
13450 @code{nnfolder} back end) like @file{mail.misc}.  If it is @code{nil},
13451 the same group will end up in @file{mail/misc}.
13452
13453 @item nnmail-delete-file-function
13454 @vindex nnmail-delete-file-function
13455 @findex delete-file
13456 Function called to delete files.  It is @code{delete-file} by default.
13457
13458 @item nnmail-cache-accepted-message-ids
13459 @vindex nnmail-cache-accepted-message-ids
13460 If non-@code{nil}, put the @code{Message-ID}s of articles imported into
13461 the back end (via @code{Gcc}, for instance) into the mail duplication
13462 discovery cache.  The default is @code{nil}.
13463
13464 @item nnmail-cache-ignore-groups
13465 @vindex nnmail-cache-ignore-groups
13466 This can be a regular expression or a list of regular expressions.
13467 Group names that match any of the regular expressions will never be
13468 recorded in the @code{Message-ID} cache.
13469
13470 This can be useful, for example, when using Fancy Splitting
13471 (@pxref{Fancy Mail Splitting}) together with the function
13472 @code{nnmail-split-fancy-with-parent}.
13473
13474 @end table
13475
13476
13477 @node Fancy Mail Splitting
13478 @subsection Fancy Mail Splitting
13479 @cindex mail splitting
13480 @cindex fancy mail splitting
13481
13482 @vindex nnmail-split-fancy
13483 @findex nnmail-split-fancy
13484 If the rather simple, standard method for specifying how to split mail
13485 doesn't allow you to do what you want, you can set
13486 @code{nnmail-split-methods} to @code{nnmail-split-fancy}.  Then you can
13487 play with the @code{nnmail-split-fancy} variable.
13488
13489 Let's look at an example value of this variable first:
13490
13491 @lisp
13492 ;; Messages from the mailer daemon are not crossposted to any of
13493 ;; the ordinary groups.  Warnings are put in a separate group
13494 ;; from real errors.
13495 (| ("from" mail (| ("subject" "warn.*" "mail.warning")
13496                    "mail.misc"))
13497    ;; Non-error messages are crossposted to all relevant
13498    ;; groups, but we don't crosspost between the group for the
13499    ;; (ding) list and the group for other (ding) related mail.
13500    (& (| (any "ding@@ifi\\.uio\\.no" "ding.list")
13501          ("subject" "ding" "ding.misc"))
13502       ;; Other mailing lists...
13503       (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list")
13504       (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list")
13505       ;; Both lists below have the same suffix, so prevent
13506       ;; cross-posting to mkpkg.list of messages posted only to
13507       ;; the bugs- list, but allow cross-posting when the
13508       ;; message was really cross-posted.
13509       (any "bugs-mypackage@@somewhere" "mypkg.bugs")
13510       (any "mypackage@@somewhere\" - "bugs-mypackage" "mypkg.list")
13511       ;; People...
13512       (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen"))
13513    ;; Unmatched mail goes to the catch all group.
13514    "misc.misc")
13515 @end lisp
13516
13517 This variable has the format of a @dfn{split}.  A split is a (possibly)
13518 recursive structure where each split may contain other splits.  Here are
13519 the five possible split syntaxes:
13520
13521 @enumerate
13522
13523 @item
13524 @samp{group}: If the split is a string, that will be taken as a group
13525 name.  Normal regexp match expansion will be done.  See below for
13526 examples.
13527
13528 @item
13529 @code{(@var{field} @var{value} @code{[-} @var{restrict}
13530 @code{[@dots{}]}@code{]} @var{split})}: If the split is a list, the
13531 first element of which is a string, then store the message as
13532 specified by @var{split}, if header @var{field} (a regexp) contains
13533 @var{value} (also a regexp).  If @var{restrict} (yet another regexp)
13534 matches some string after @var{field} and before the end of the
13535 matched @var{value}, the @var{split} is ignored.  If none of the
13536 @var{restrict} clauses match, @var{split} is processed.
13537
13538 @item
13539 @code{(| @var{split}@dots{})}: If the split is a list, and the first
13540 element is @code{|} (vertical bar), then process each @var{split} until
13541 one of them matches.  A @var{split} is said to match if it will cause
13542 the mail message to be stored in one or more groups.
13543
13544 @item
13545 @code{(& @var{split}@dots{})}: If the split is a list, and the first
13546 element is @code{&}, then process all @var{split}s in the list.
13547
13548 @item
13549 @code{junk}: If the split is the symbol @code{junk}, then don't save
13550 (i.e., delete) this message.  Use with extreme caution.
13551
13552 @item
13553 @code{(: @var{function} @var{arg1} @var{arg2} @dots{})}:  If the split is
13554 a list, and the first element is @code{:}, then the second element will
13555 be called as a function with @var{args} given as arguments.  The
13556 function should return a @var{split}.
13557
13558 @cindex body split
13559 For instance, the following function could be used to split based on the
13560 body of the messages:
13561
13562 @lisp
13563 (defun split-on-body ()
13564   (save-excursion
13565     (set-buffer " *nnmail incoming*")
13566     (goto-char (point-min))
13567     (when (re-search-forward "Some.*string" nil t)
13568       "string.group")))
13569 @end lisp
13570
13571 The @samp{" *nnmail incoming*"} is narrowed to the message in question
13572 when the @code{:} function is run.
13573
13574 @item
13575 @code{(! @var{func} @var{split})}: If the split is a list, and the first
13576 element is @code{!}, then SPLIT will be processed, and FUNC will be
13577 called as a function with the result of SPLIT as argument.  FUNC should
13578 return a split.
13579
13580 @item
13581 @code{nil}: If the split is @code{nil}, it is ignored.
13582
13583 @end enumerate
13584
13585 In these splits, @var{field} must match a complete field name.
13586 @var{value} must match a complete word according to the fundamental mode
13587 syntax table.  You can use @code{.*} in the regexps to match partial
13588 field names or words.  In other words, all @var{value}'s are wrapped in
13589 @samp{\<} and @samp{\>} pairs.
13590
13591 @vindex nnmail-split-abbrev-alist
13592 @var{field} and @var{value} can also be lisp symbols, in that case they
13593 are expanded as specified by the variable
13594 @code{nnmail-split-abbrev-alist}.  This is an alist of cons cells, where
13595 the @code{car} of a cell contains the key, and the @code{cdr} contains the associated
13596 value.
13597
13598 @vindex nnmail-split-fancy-syntax-table
13599 @code{nnmail-split-fancy-syntax-table} is the syntax table in effect
13600 when all this splitting is performed.
13601
13602 If you want to have Gnus create groups dynamically based on some
13603 information in the headers (i.e., do @code{replace-match}-like
13604 substitutions in the group names), you can say things like:
13605
13606 @example
13607 (any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1")
13608 @end example
13609
13610 In this example, messages sent to @samp{debian-foo@@lists.debian.org}
13611 will be filed in @samp{mail.debian.foo}.
13612
13613 If the string contains the element @samp{\&}, then the previously
13614 matched string will be substituted.  Similarly, the elements @samp{\\1}
13615 up to @samp{\\9} will be substituted with the text matched by the
13616 groupings 1 through 9.
13617
13618 @findex nnmail-split-fancy-with-parent
13619 @code{nnmail-split-fancy-with-parent} is a function which allows you to
13620 split followups into the same groups their parents are in.  Sometimes
13621 you can't make splitting rules for all your mail.  For example, your
13622 boss might send you personal mail regarding different projects you are
13623 working on, and as you can't tell your boss to put a distinguishing
13624 string into the subject line, you have to resort to manually moving the
13625 messages into the right group.  With this function, you only have to do
13626 it once per thread.
13627
13628 To use this feature, you have to set @code{nnmail-treat-duplicates} and
13629 @code{nnmail-cache-accepted-message-ids} to a non-nil value.  And then
13630 you can include @code{nnmail-split-fancy-with-parent} using the colon
13631 feature, like so:
13632 @lisp
13633 (setq nnmail-treat-duplicates 'warn     ; or 'delete
13634       nnmail-cache-accepted-message-ids t
13635       nnmail-split-fancy
13636       '(| (: nnmail-split-fancy-with-parent)
13637           ;; other splits go here
13638         ))
13639 @end lisp
13640
13641 This feature works as follows: when @code{nnmail-treat-duplicates} is
13642 non-nil, Gnus records the message id of every message it sees in the
13643 file specified by the variable @code{nnmail-message-id-cache-file},
13644 together with the group it is in (the group is omitted for non-mail
13645 messages).  When mail splitting is invoked, the function
13646 @code{nnmail-split-fancy-with-parent} then looks at the References (and
13647 In-Reply-To) header of each message to split and searches the file
13648 specified by @code{nnmail-message-id-cache-file} for the message ids.
13649 When it has found a parent, it returns the corresponding group name
13650 unless the group name matches the regexp
13651 @code{nnmail-split-fancy-with-parent-ignore-groups}.  It is recommended
13652 that you set @code{nnmail-message-id-cache-length} to a somewhat higher
13653 number than the default so that the message ids are still in the cache.
13654 (A value of 5000 appears to create a file some 300 kBytes in size.)
13655 @vindex nnmail-cache-accepted-message-ids
13656 When @code{nnmail-cache-accepted-message-ids} is non-@code{nil}, Gnus
13657 also records the message ids of moved articles, so that the followup
13658 messages goes into the new group.
13659
13660 Also see the variable @code{nnmail-cache-ignore-groups} if you don't
13661 want certain groups to be recorded in the cache.  For example, if all
13662 outgoing messages are written to an `outgoing' group, you could set
13663 @code{nnmail-cache-ignore-groups} to match that group name.
13664 Otherwise, answers to all your messages would end up in the
13665 `outgoing' group.
13666
13667
13668 @node Group Mail Splitting
13669 @subsection Group Mail Splitting
13670 @cindex mail splitting
13671 @cindex group mail splitting
13672
13673 @findex gnus-group-split
13674 If you subscribe to dozens of mailing lists but you don't want to
13675 maintain mail splitting rules manually, group mail splitting is for you.
13676 You just have to set @var{to-list} and/or @var{to-address} in group
13677 parameters or group customization and set @code{nnmail-split-methods} to
13678 @code{gnus-group-split}.  This splitting function will scan all groups
13679 for those parameters and split mail accordingly, i.e., messages posted
13680 from or to the addresses specified in the parameters @var{to-list} or
13681 @var{to-address} of a mail group will be stored in that group.
13682
13683 Sometimes, mailing lists have multiple addresses, and you may want mail
13684 splitting to recognize them all: just set the @var{extra-aliases} group
13685 parameter to the list of additional addresses and it's done.  If you'd
13686 rather use a regular expression, set @var{split-regexp}.
13687
13688 All these parameters in a group will be used to create an
13689 @code{nnmail-split-fancy} split, in which the @var{field} is @samp{any},
13690 the @var{value} is a single regular expression that matches
13691 @var{to-list}, @var{to-address}, all of @var{extra-aliases} and all
13692 matches of @var{split-regexp}, and the @var{split} is the name of the
13693 group.  @var{restrict}s are also supported: just set the
13694 @var{split-exclude} parameter to a list of regular expressions.
13695
13696 If you can't get the right split to be generated using all these
13697 parameters, or you just need something fancier, you can set the
13698 parameter @var{split-spec} to an @code{nnmail-split-fancy} split.  In
13699 this case, all other aforementioned parameters will be ignored by
13700 @code{gnus-group-split}.  In particular, @var{split-spec} may be set to
13701 @code{nil}, in which case the group will be ignored by
13702 @code{gnus-group-split}.
13703
13704 @vindex gnus-group-split-default-catch-all-group
13705 @code{gnus-group-split} will do cross-posting on all groups that match,
13706 by defining a single @code{&} fancy split containing one split for each
13707 group.  If a message doesn't match any split, it will be stored in the
13708 group named in @code{gnus-group-split-default-catch-all-group}, unless
13709 some group has @var{split-spec} set to @code{catch-all}, in which case
13710 that group is used as the catch-all group.  Even though this variable is
13711 often used just to name a group, it may also be set to an arbitrarily
13712 complex fancy split (after all, a group name is a fancy split), and this
13713 may be useful to split mail that doesn't go to any mailing list to
13714 personal mail folders.  Note that this fancy split is added as the last
13715 element of a @code{|} split list that also contains a @code{&} split
13716 with the rules extracted from group parameters.
13717
13718 It's time for an example.  Assume the following group parameters have
13719 been defined:
13720
13721 @example
13722 nnml:mail.bar:
13723 ((to-address . "bar@@femail.com")
13724  (split-regexp . ".*@@femail\\.com"))
13725 nnml:mail.foo:
13726 ((to-list . "foo@@nowhere.gov")
13727  (extra-aliases "foo@@localhost" "foo-redist@@home")
13728  (split-exclude "bugs-foo" "rambling-foo")
13729  (admin-address . "foo-request@@nowhere.gov"))
13730 nnml:mail.others:
13731 ((split-spec . catch-all))
13732 @end example
13733
13734 Setting @code{nnmail-split-methods} to @code{gnus-group-split} will
13735 behave as if @code{nnmail-split-fancy} had been selected and variable
13736 @code{nnmail-split-fancy} had been set as follows:
13737
13738 @lisp
13739 (| (& (any "\\(bar@@femail\\.com\\|.*@@femail\\.com\\)" "mail.bar")
13740       (any "\\(foo@@nowhere\\.gov\\|foo@@localhost\\|foo-redist@@home\\)"
13741            - "bugs-foo" - "rambling-foo" "mail.foo"))
13742    "mail.others")
13743 @end lisp
13744
13745 @findex gnus-group-split-fancy
13746 If you'd rather not use group splitting for all your mail groups, you
13747 may use it for only some of them, by using @code{nnmail-split-fancy}
13748 splits like this:
13749
13750 @lisp
13751 (: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL)
13752 @end lisp
13753
13754 @var{groups} may be a regular expression or a list of group names whose
13755 parameters will be scanned to generate the output split.
13756 @var{no-crosspost} can be used to disable cross-posting; in this case, a
13757 single @code{|} split will be output.  @var{catch-all} is the fallback
13758 fancy split, used like @var{gnus-group-split-default-catch-all-group}.
13759 If @var{catch-all} is @code{nil}, or if @var{split-regexp} matches the
13760 empty string in any selected group, no catch-all split will be issued.
13761 Otherwise, if some group has @var{split-spec} set to @code{catch-all},
13762 this group will override the value of the @var{catch-all} argument.
13763
13764 @findex gnus-group-split-setup
13765 Unfortunately, scanning all groups and their parameters can be quite
13766 slow, especially considering that it has to be done for every message.
13767 But don't despair!  The function @code{gnus-group-split-setup} can be
13768 used to enable @code{gnus-group-split} in a much more efficient way.  It
13769 sets @code{nnmail-split-methods} to @code{nnmail-split-fancy} and sets
13770 @code{nnmail-split-fancy} to the split produced by
13771 @code{gnus-group-split-fancy}.  Thus, the group parameters are only
13772 scanned once, no matter how many messages are split.
13773
13774 @findex gnus-group-split-update
13775 However, if you change group parameters, you'd have to update
13776 @code{nnmail-split-fancy} manually.  You can do it by running
13777 @code{gnus-group-split-update}.  If you'd rather have it updated
13778 automatically, just tell @code{gnus-group-split-setup} to do it for
13779 you.  For example, add to your @file{.gnus.el}:
13780
13781 @lisp
13782 (gnus-group-split-setup AUTO-UPDATE CATCH-ALL)
13783 @end lisp
13784
13785 If @var{auto-update} is non-@code{nil}, @code{gnus-group-split-update}
13786 will be added to @code{nnmail-pre-get-new-mail-hook}, so you won't ever
13787 have to worry about updating @code{nnmail-split-fancy} again.  If you
13788 don't omit @var{catch-all} (it's optional, equivalent to @code{nil}),
13789 @code{gnus-group-split-default-catch-all-group} will be set to its
13790 value.
13791
13792 @vindex gnus-group-split-updated-hook
13793 Because you may want to change @code{nnmail-split-fancy} after it is set
13794 by @code{gnus-group-split-update}, this function will run
13795 @code{gnus-group-split-updated-hook} just before finishing.
13796
13797 @node Incorporating Old Mail
13798 @subsection Incorporating Old Mail
13799 @cindex incorporating old mail
13800 @cindex import old mail
13801
13802 Most people have lots of old mail stored in various file formats.  If
13803 you have set up Gnus to read mail using one of the spiffy Gnus mail
13804 back ends, you'll probably wish to have that old mail incorporated into
13805 your mail groups.
13806
13807 Doing so can be quite easy.
13808
13809 To take an example: You're reading mail using @code{nnml}
13810 (@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a
13811 satisfactory value (@pxref{Splitting Mail}).  You have an old Unix mbox
13812 file filled with important, but old, mail.  You want to move it into
13813 your @code{nnml} groups.
13814
13815 Here's how:
13816
13817 @enumerate
13818 @item
13819 Go to the group buffer.
13820
13821 @item
13822 Type @kbd{G f} and give the file name to the mbox file when prompted to create an
13823 @code{nndoc} group from the mbox file (@pxref{Foreign Groups}).
13824
13825 @item
13826 Type @kbd{SPACE} to enter the newly created group.
13827
13828 @item
13829 Type @kbd{M P b} to process-mark all articles in this group's buffer
13830 (@pxref{Setting Process Marks}).
13831
13832 @item
13833 Type @kbd{B r} to respool all the process-marked articles, and answer
13834 @samp{nnml} when prompted (@pxref{Mail Group Commands}).
13835 @end enumerate
13836
13837 All the mail messages in the mbox file will now also be spread out over
13838 all your @code{nnml} groups.  Try entering them and check whether things
13839 have gone without a glitch.  If things look ok, you may consider
13840 deleting the mbox file, but I wouldn't do that unless I was absolutely
13841 sure that all the mail has ended up where it should be.
13842
13843 Respooling is also a handy thing to do if you're switching from one mail
13844 back end to another.  Just respool all the mail in the old mail groups
13845 using the new mail back end.
13846
13847
13848 @node Expiring Mail
13849 @subsection Expiring Mail
13850 @cindex article expiry
13851
13852 Traditional mail readers have a tendency to remove mail articles when
13853 you mark them as read, in some way.  Gnus takes a fundamentally
13854 different approach to mail reading.
13855
13856 Gnus basically considers mail just to be news that has been received in
13857 a rather peculiar manner.  It does not think that it has the power to
13858 actually change the mail, or delete any mail messages.  If you enter a
13859 mail group, and mark articles as ``read'', or kill them in some other
13860 fashion, the mail articles will still exist on the system.  I repeat:
13861 Gnus will not delete your old, read mail.  Unless you ask it to, of
13862 course.
13863
13864 To make Gnus get rid of your unwanted mail, you have to mark the
13865 articles as @dfn{expirable}.  (With the default keybindings, this means
13866 that you have to type @kbd{E}.)  This does not mean that the articles
13867 will disappear right away, however.  In general, a mail article will be
13868 deleted from your system if, 1) it is marked as expirable, AND 2) it is
13869 more than one week old.  If you do not mark an article as expirable, it
13870 will remain on your system until hell freezes over.  This bears
13871 repeating one more time, with some spurious capitalizations: IF you do
13872 NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES.
13873
13874 You do not have to mark articles as expirable by hand.  Gnus provides
13875 two features, called `auto-expire' and `total-expire', that can help you
13876 with this.  In a nutshell, `auto-expire' means that Gnus hits @kbd{E}
13877 for you when you select an article.  And `total-expire' means that Gnus
13878 considers all articles as expirable that are read.  So, in addition to
13879 the articles marked @samp{E}, also the articles marked @samp{r},
13880 @samp{R}, @samp{O}, @samp{K}, @samp{Y} and so on are considered
13881 expirable.
13882
13883 When should either auto-expire or total-expire be used?  Most people
13884 who are subscribed to mailing lists split each list into its own group
13885 and then turn on auto-expire or total-expire for those groups.
13886 (@xref{Splitting Mail}, for more information on splitting each list
13887 into its own group.)
13888
13889 Which one is better, auto-expire or total-expire?  It's not easy to
13890 answer.  Generally speaking, auto-expire is probably faster.  Another
13891 advantage of auto-expire is that you get more marks to work with: for
13892 the articles that are supposed to stick around, you can still choose
13893 between tick and dormant and read marks.  But with total-expire, you
13894 only have dormant and ticked to choose from.  The advantage of
13895 total-expire is that it works well with adaptive scoring @pxref{Adaptive
13896 Scoring}.  Auto-expire works with normal scoring but not with adaptive
13897 scoring.
13898
13899 @vindex gnus-auto-expirable-newsgroups
13900 Groups that match the regular expression
13901 @code{gnus-auto-expirable-newsgroups} will have all articles that you
13902 read marked as expirable automatically.  All articles marked as
13903 expirable have an @samp{E} in the first column in the summary buffer.
13904
13905 By default, if you have auto expiry switched on, Gnus will mark all the
13906 articles you read as expirable, no matter if they were read or unread
13907 before.  To avoid having articles marked as read marked as expirable
13908 automatically, you can put something like the following in your
13909 @file{.gnus.el} file:
13910
13911 @vindex gnus-mark-article-hook
13912 @lisp
13913 (remove-hook 'gnus-mark-article-hook
13914              'gnus-summary-mark-read-and-unread-as-read)
13915 (add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read)
13916 @end lisp
13917
13918 Note that making a group auto-expirable doesn't mean that all read
13919 articles are expired---only the articles marked as expirable
13920 will be expired.  Also note that using the @kbd{d} command won't make
13921 articles expirable---only semi-automatic marking of articles as read will
13922 mark the articles as expirable in auto-expirable groups.
13923
13924 Let's say you subscribe to a couple of mailing lists, and you want the
13925 articles you have read to disappear after a while:
13926
13927 @lisp
13928 (setq gnus-auto-expirable-newsgroups
13929       "mail.nonsense-list\\|mail.nice-list")
13930 @end lisp
13931
13932 Another way to have auto-expiry happen is to have the element
13933 @code{auto-expire} in the group parameters of the group.
13934
13935 If you use adaptive scoring (@pxref{Adaptive Scoring}) and
13936 auto-expiring, you'll have problems.  Auto-expiring and adaptive scoring
13937 don't really mix very well.
13938
13939 @vindex nnmail-expiry-wait
13940 The @code{nnmail-expiry-wait} variable supplies the default time an
13941 expirable article has to live.  Gnus starts counting days from when the
13942 message @emph{arrived}, not from when it was sent.  The default is seven
13943 days.
13944
13945 Gnus also supplies a function that lets you fine-tune how long articles
13946 are to live, based on what group they are in.  Let's say you want to
13947 have one month expiry period in the @samp{mail.private} group, a one day
13948 expiry period in the @samp{mail.junk} group, and a six day expiry period
13949 everywhere else:
13950
13951 @vindex nnmail-expiry-wait-function
13952 @lisp
13953 (setq nnmail-expiry-wait-function
13954       (lambda (group)
13955        (cond ((string= group "mail.private")
13956                31)
13957              ((string= group "mail.junk")
13958                1)
13959              ((string= group "important")
13960                'never)
13961              (t
13962                6))))
13963 @end lisp
13964
13965 The group names this function is fed are ``unadorned'' group
13966 names---no @samp{nnml:} prefixes and the like.
13967
13968 The @code{nnmail-expiry-wait} variable and
13969 @code{nnmail-expiry-wait-function} function can either be a number (not
13970 necessarily an integer) or one of the symbols @code{immediate} or
13971 @code{never}.
13972
13973 You can also use the @code{expiry-wait} group parameter to selectively
13974 change the expiry period (@pxref{Group Parameters}).
13975
13976 @vindex nnmail-expiry-target
13977 The normal action taken when expiring articles is to delete them.
13978 However, in some circumstances it might make more sense to move them
13979 to other groups instead of deleting them.  The variable
13980 @code{nnmail-expiry-target} (and the @code{expiry-target} group
13981 parameter) controls this.  The variable supplies a default value for
13982 all groups, which can be overridden for specific groups by the group
13983 parameter.  default value is @code{delete}, but this can also be a
13984 string (which should be the name of the group the message should be
13985 moved to), or a function (which will be called in a buffer narrowed to
13986 the message in question, and with the name of the group being moved
13987 from as its parameter) which should return a target -- either a group
13988 name or @code{delete}.
13989
13990 Here's an example for specifying a group name:
13991 @lisp
13992 (setq nnmail-expiry-target "nnml:expired")
13993 @end lisp
13994
13995 @findex nnmail-fancy-expiry-target
13996 @vindex nnmail-fancy-expiry-targets
13997 Gnus provides a function @code{nnmail-fancy-expiry-target} which will
13998 expire mail to groups according to the variable
13999 @code{nnmail-fancy-expiry-targets}.  Here's an example:
14000
14001 @lisp
14002  (setq nnmail-expiry-target 'nnmail-fancy-expiry-target
14003        nnmail-fancy-expiry-targets
14004        '((to-from "boss" "nnfolder:Work")
14005          ("subject" "IMPORTANT" "nnfolder:IMPORTANT.%Y.%b")
14006          ("from" ".*" "nnfolder:Archive-%Y")))
14007 @end lisp
14008
14009 With this setup, any mail that has @code{IMPORTANT} in its Subject
14010 header and was sent in the year @code{YYYY} and month @code{MMM}, will
14011 get expired to the group @code{nnfolder:IMPORTANT.YYYY.MMM}. If its
14012 From or To header contains the string @code{boss}, it will get expired
14013 to @code{nnfolder:Work}. All other mail will get expired to
14014 @code{nnfolder:Archive-YYYY}.
14015
14016 @vindex nnmail-keep-last-article
14017 If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never
14018 expire the final article in a mail newsgroup.  This is to make life
14019 easier for procmail users.
14020
14021 @vindex gnus-total-expirable-newsgroups
14022 By the way: That line up there, about Gnus never expiring non-expirable
14023 articles, is a lie.  If you put @code{total-expire} in the group
14024 parameters, articles will not be marked as expirable, but all read
14025 articles will be put through the expiry process.  Use with extreme
14026 caution.  Even more dangerous is the
14027 @code{gnus-total-expirable-newsgroups} variable.  All groups that match
14028 this regexp will have all read articles put through the expiry process,
14029 which means that @emph{all} old mail articles in the groups in question
14030 will be deleted after a while.  Use with extreme caution, and don't come
14031 crying to me when you discover that the regexp you used matched the
14032 wrong group and all your important mail has disappeared.  Be a
14033 @emph{man}!  Or a @emph{woman}!  Whatever you feel more comfortable
14034 with!  So there!
14035
14036 Most people make most of their mail groups total-expirable, though.
14037
14038 @vindex gnus-inhibit-user-auto-expire
14039 If @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user marking
14040 commands will not mark an article as expirable, even if the group has
14041 auto-expire turned on.
14042
14043
14044 @node Washing Mail
14045 @subsection Washing Mail
14046 @cindex mail washing
14047 @cindex list server brain damage
14048 @cindex incoming mail treatment
14049
14050 Mailers and list servers are notorious for doing all sorts of really,
14051 really stupid things with mail.  ``Hey, RFC 822 doesn't explicitly
14052 prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the
14053 end of all lines passing through our server, so let's do that!!!!1!''
14054 Yes, but RFC 822 wasn't designed to be read by morons.  Things that were
14055 considered to be self-evident were not discussed.  So.  Here we are.
14056
14057 Case in point:  The German version of Microsoft Exchange adds @samp{AW:
14058 } to the subjects of replies instead of @samp{Re: }.  I could pretend to
14059 be shocked and dismayed by this, but I haven't got the energy.  It is to
14060 laugh.
14061
14062 Gnus provides a plethora of functions for washing articles while
14063 displaying them, but it might be nicer to do the filtering before
14064 storing the mail to disk.  For that purpose, we have three hooks and
14065 various functions that can be put in these hooks.
14066
14067 @table @code
14068 @item nnmail-prepare-incoming-hook
14069 @vindex nnmail-prepare-incoming-hook
14070 This hook is called before doing anything with the mail and is meant for
14071 grand, sweeping gestures.  It is called in a buffer that contains all
14072 the new, incoming mail.  Functions to be used include:
14073
14074 @table @code
14075 @item nnheader-ms-strip-cr
14076 @findex nnheader-ms-strip-cr
14077 Remove trailing carriage returns from each line.  This is default on
14078 Emacs running on MS machines.
14079
14080 @end table
14081
14082 @item nnmail-prepare-incoming-header-hook
14083 @vindex nnmail-prepare-incoming-header-hook
14084 This hook is called narrowed to each header.  It can be used when
14085 cleaning up the headers.  Functions that can be used include:
14086
14087 @table @code
14088 @item nnmail-remove-leading-whitespace
14089 @findex nnmail-remove-leading-whitespace
14090 Clear leading white space that ``helpful'' listservs have added to the
14091 headers to make them look nice.  Aaah.
14092
14093 (Note that this function works on both the header on the body of all
14094 messages, so it is a potentially dangerous function to use (if a body
14095 of a message contains something that looks like a header line).  So
14096 rather than fix the bug, it is of course the right solution to make it
14097 into a feature by documenting it.)
14098
14099 @item nnmail-remove-list-identifiers
14100 @findex nnmail-remove-list-identifiers
14101 Some list servers add an identifier---for example, @samp{(idm)}---to the
14102 beginning of all @code{Subject} headers.  I'm sure that's nice for
14103 people who use stone age mail readers.  This function will remove
14104 strings that match the @code{nnmail-list-identifiers} regexp, which can
14105 also be a list of regexp.  @code{nnmail-list-identifiers} may not contain
14106 @code{\\(..\\)}.
14107
14108 For instance, if you want to remove the @samp{(idm)} and the
14109 @samp{nagnagnag} identifiers:
14110
14111 @lisp
14112 (setq nnmail-list-identifiers
14113       '("(idm)" "nagnagnag"))
14114 @end lisp
14115
14116 This can also be done non-destructively with
14117 @code{gnus-list-identifiers}, @xref{Article Hiding}.
14118
14119 @item nnmail-remove-tabs
14120 @findex nnmail-remove-tabs
14121 Translate all @samp{TAB} characters into @samp{SPACE} characters.
14122
14123 @item nnmail-fix-eudora-headers
14124 @findex nnmail-fix-eudora-headers
14125 @cindex Eudora
14126 Eudora produces broken @code{References} headers, but OK
14127 @code{In-Reply-To} headers.  This function will get rid of the
14128 @code{References} headers.
14129
14130 @end table
14131
14132 @item nnmail-prepare-incoming-message-hook
14133 @vindex nnmail-prepare-incoming-message-hook
14134 This hook is called narrowed to each message.  Functions to be used
14135 include:
14136
14137 @table @code
14138 @item article-de-quoted-unreadable
14139 @findex article-de-quoted-unreadable
14140 Decode Quoted Readable encoding.
14141
14142 @end table
14143 @end table
14144
14145
14146 @node Duplicates
14147 @subsection Duplicates
14148
14149 @vindex nnmail-treat-duplicates
14150 @vindex nnmail-message-id-cache-length
14151 @vindex nnmail-message-id-cache-file
14152 @cindex duplicate mails
14153 If you are a member of a couple of mailing lists, you will sometimes
14154 receive two copies of the same mail.  This can be quite annoying, so
14155 @code{nnmail} checks for and treats any duplicates it might find.  To do
14156 this, it keeps a cache of old @code{Message-ID}s---
14157 @code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by
14158 default.  The approximate maximum number of @code{Message-ID}s stored
14159 there is controlled by the @code{nnmail-message-id-cache-length}
14160 variable, which is 1000 by default.  (So 1000 @code{Message-ID}s will be
14161 stored.) If all this sounds scary to you, you can set
14162 @code{nnmail-treat-duplicates} to @code{warn} (which is what it is by
14163 default), and @code{nnmail} won't delete duplicate mails.  Instead it
14164 will insert a warning into the head of the mail saying that it thinks
14165 that this is a duplicate of a different message.
14166
14167 This variable can also be a function.  If that's the case, the function
14168 will be called from a buffer narrowed to the message in question with
14169 the @code{Message-ID} as a parameter.  The function must return either
14170 @code{nil}, @code{warn}, or @code{delete}.
14171
14172 You can turn this feature off completely by setting the variable to
14173 @code{nil}.
14174
14175 If you want all the duplicate mails to be put into a special
14176 @dfn{duplicates} group, you could do that using the normal mail split
14177 methods:
14178
14179 @lisp
14180 (setq nnmail-split-fancy
14181       '(| ;; Messages duplicates go to a separate group.
14182           ("gnus-warning" "duplicat\\(e\\|ion\\) of message" "duplicate")
14183           ;; Message from daemons, postmaster, and the like to another.
14184           (any mail "mail.misc")
14185           ;; Other rules.
14186           [ ... ] ))
14187 @end lisp
14188
14189 Or something like:
14190 @lisp
14191 (setq nnmail-split-methods
14192       '(("duplicates" "^Gnus-Warning:.*duplicate")
14193         ;; Other rules.
14194         [...]))
14195 @end lisp
14196
14197 Here's a neat feature: If you know that the recipient reads her mail
14198 with Gnus, and that she has @code{nnmail-treat-duplicates} set to
14199 @code{delete}, you can send her as many insults as you like, just by
14200 using a @code{Message-ID} of a mail that you know that she's already
14201 received.  Think of all the fun!  She'll never see any of it!  Whee!
14202
14203
14204 @node Not Reading Mail
14205 @subsection Not Reading Mail
14206
14207 If you start using any of the mail back ends, they have the annoying
14208 habit of assuming that you want to read mail with them.  This might not
14209 be unreasonable, but it might not be what you want.
14210
14211 If you set @code{mail-sources} and @code{nnmail-spool-file} to
14212 @code{nil}, none of the back ends will ever attempt to read incoming
14213 mail, which should help.
14214
14215 @vindex nnbabyl-get-new-mail
14216 @vindex nnmbox-get-new-mail
14217 @vindex nnml-get-new-mail
14218 @vindex nnmh-get-new-mail
14219 @vindex nnfolder-get-new-mail
14220 This might be too much, if, for instance, you are reading mail quite
14221 happily with @code{nnml} and just want to peek at some old @sc{rmail}
14222 file you have stashed away with @code{nnbabyl}.  All back ends have
14223 variables called back-end-@code{get-new-mail}.  If you want to disable
14224 the @code{nnbabyl} mail reading, you edit the virtual server for the
14225 group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}.
14226
14227 All the mail back ends will call @code{nn}*@code{-prepare-save-mail-hook}
14228 narrowed to the article to be saved before saving it when reading
14229 incoming mail.
14230
14231
14232 @node Choosing a Mail Back End
14233 @subsection Choosing a Mail Back End
14234
14235 Gnus will read the mail spool when you activate a mail group.  The mail
14236 file is first copied to your home directory.  What happens after that
14237 depends on what format you want to store your mail in.
14238
14239 There are six different mail back ends in the standard Gnus, and more
14240 back ends are available separately.  The mail back end most people use
14241 (because it is possibly the fastest) is @code{nnml} (@pxref{Mail
14242 Spool}).  You might notice that only five back ends are listed below;
14243 @code{nnmaildir}'s documentation has not yet been completely
14244 incorporated into this manual.  Until it is, you can find it at
14245 @uref{http://multivac.cwru.edu./nnmaildir/}.
14246
14247 @menu
14248 * Unix Mail Box::               Using the (quite) standard Un*x mbox.
14249 * Rmail Babyl::                 Emacs programs use the rmail babyl format.
14250 * Mail Spool::                  Store your mail in a private spool?
14251 * MH Spool::                    An mhspool-like back end.
14252 * Mail Folders::                Having one file for each group.
14253 * Comparing Mail Back Ends::    An in-depth looks at pros and cons.
14254 @end menu
14255
14256
14257 @node Unix Mail Box
14258 @subsubsection Unix Mail Box
14259 @cindex nnmbox
14260 @cindex unix mail box
14261
14262 @vindex nnmbox-active-file
14263 @vindex nnmbox-mbox-file
14264 The @dfn{nnmbox} back end will use the standard Un*x mbox file to store
14265 mail.  @code{nnmbox} will add extra headers to each mail article to say
14266 which group it belongs in.
14267
14268 Virtual server settings:
14269
14270 @table @code
14271 @item nnmbox-mbox-file
14272 @vindex nnmbox-mbox-file
14273 The name of the mail box in the user's home directory.  Default is
14274 @file{~/mbox}.
14275
14276 @item nnmbox-active-file
14277 @vindex nnmbox-active-file
14278 The name of the active file for the mail box.  Default is
14279 @file{~/.mbox-active}.
14280
14281 @item nnmbox-get-new-mail
14282 @vindex nnmbox-get-new-mail
14283 If non-@code{nil}, @code{nnmbox} will read incoming mail and split it
14284 into groups.  Default is @code{t}.
14285 @end table
14286
14287
14288 @node Rmail Babyl
14289 @subsubsection Rmail Babyl
14290 @cindex nnbabyl
14291 @cindex rmail mbox
14292
14293 @vindex nnbabyl-active-file
14294 @vindex nnbabyl-mbox-file
14295 The @dfn{nnbabyl} back end will use a babyl mail box (aka. @dfn{rmail
14296 mbox}) to store mail.  @code{nnbabyl} will add extra headers to each
14297 mail article to say which group it belongs in.
14298
14299 Virtual server settings:
14300
14301 @table @code
14302 @item nnbabyl-mbox-file
14303 @vindex nnbabyl-mbox-file
14304 The name of the rmail mbox file.  The default is @file{~/RMAIL}
14305
14306 @item nnbabyl-active-file
14307 @vindex nnbabyl-active-file
14308 The name of the active file for the rmail box.  The default is
14309 @file{~/.rmail-active}
14310
14311 @item nnbabyl-get-new-mail
14312 @vindex nnbabyl-get-new-mail
14313 If non-@code{nil}, @code{nnbabyl} will read incoming mail.  Default is
14314 @code{t}
14315 @end table
14316
14317
14318 @node Mail Spool
14319 @subsubsection Mail Spool
14320 @cindex nnml
14321 @cindex mail @sc{nov} spool
14322
14323 The @dfn{nnml} spool mail format isn't compatible with any other known
14324 format.  It should be used with some caution.
14325
14326 @vindex nnml-directory
14327 If you use this back end, Gnus will split all incoming mail into files,
14328 one file for each mail, and put the articles into the corresponding
14329 directories under the directory specified by the @code{nnml-directory}
14330 variable.  The default value is @file{~/Mail/}.
14331
14332 You do not have to create any directories beforehand; Gnus will take
14333 care of all that.
14334
14335 If you have a strict limit as to how many files you are allowed to store
14336 in your account, you should not use this back end.  As each mail gets its
14337 own file, you might very well occupy thousands of inodes within a few
14338 weeks.  If this is no problem for you, and it isn't a problem for you
14339 having your friendly systems administrator walking around, madly,
14340 shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should
14341 know that this is probably the fastest format to use.  You do not have
14342 to trudge through a big mbox file just to read your new mail.
14343
14344 @code{nnml} is probably the slowest back end when it comes to article
14345 splitting.  It has to create lots of files, and it also generates
14346 @sc{nov} databases for the incoming mails.  This makes it possibly the
14347 fastest back end when it comes to reading mail.
14348
14349 @cindex self contained nnml servers
14350 @cindex marks
14351 When the marks file is used (which it is by default), @code{nnml}
14352 servers have the property that you may backup them using @code{tar} or
14353 similar, and later be able to restore them into Gnus (by adding the
14354 proper @code{nnml} server) and have all your marks be preserved.  Marks
14355 for a group is usually stored in the @code{.marks} file (but see
14356 @code{nnml-marks-file-name}) within each @code{nnml} group's directory.
14357 Individual @code{nnml} groups are also possible to backup, use @kbd{G m}
14358 to restore the group (after restoring the backup into the nnml
14359 directory).
14360
14361 If for some reason you believe your @file{.marks} files are screwed
14362 up, you can just delete them all.  Gnus will then correctly regenerate
14363 them next time it starts.
14364
14365 Virtual server settings:
14366
14367 @table @code
14368 @item nnml-directory
14369 @vindex nnml-directory
14370 All @code{nnml} directories will be placed under this directory.
14371 The default is the value of `message-directory' (whose default value is
14372 @file{~/Mail}).
14373
14374 @item nnml-active-file
14375 @vindex nnml-active-file
14376 The active file for the @code{nnml} server.  The default is
14377 @file{~/Mail/active"}.
14378
14379 @item nnml-newsgroups-file
14380 @vindex nnml-newsgroups-file
14381 The @code{nnml} group descriptions file.  @xref{Newsgroups File
14382 Format}.  The default is @file{~/Mail/newsgroups"}.
14383
14384 @item nnml-get-new-mail
14385 @vindex nnml-get-new-mail
14386 If non-@code{nil}, @code{nnml} will read incoming mail.  The default is
14387 @code{t}.
14388
14389 @item nnml-nov-is-evil
14390 @vindex nnml-nov-is-evil
14391 If non-@code{nil}, this back end will ignore any @sc{nov} files.  The
14392 default is @code{nil}.
14393
14394 @item nnml-nov-file-name
14395 @vindex nnml-nov-file-name
14396 The name of the @sc{nov} files.  The default is @file{.overview}.
14397
14398 @item nnml-prepare-save-mail-hook
14399 @vindex nnml-prepare-save-mail-hook
14400 Hook run narrowed to an article before saving.
14401
14402 @item nnml-marks-is-evil
14403 @vindex nnml-marks-is-evil
14404 If non-@code{nil}, this back end will ignore any @sc{marks} files.  The
14405 default is @code{nil}.
14406
14407 @item nnml-marks-file-name
14408 @vindex nnml-marks-file-name
14409 The name of the @dfn{marks} files.  The default is @file{.marks}.
14410
14411 @item nnml-use-compressed-files
14412 @vindex nnml-use-compressed-files
14413 If non-@code{nil}, @code{nnml} will allow using compressed message
14414 files.
14415
14416 @end table
14417
14418 @findex nnml-generate-nov-databases
14419 If your @code{nnml} groups and @sc{nov} files get totally out of whack,
14420 you can do a complete update by typing @kbd{M-x
14421 nnml-generate-nov-databases}.  This command will trawl through the
14422 entire @code{nnml} hierarchy, looking at each and every article, so it
14423 might take a while to complete.  A better interface to this
14424 functionality can be found in the server buffer (@pxref{Server
14425 Commands}).
14426
14427
14428 @node MH Spool
14429 @subsubsection MH Spool
14430 @cindex nnmh
14431 @cindex mh-e mail spool
14432
14433 @code{nnmh} is just like @code{nnml}, except that is doesn't generate
14434 @sc{nov} databases and it doesn't keep an active file or marks file.
14435 This makes @code{nnmh} a @emph{much} slower back end than @code{nnml},
14436 but it also makes it easier to write procmail scripts for.
14437
14438 Virtual server settings:
14439
14440 @table @code
14441 @item nnmh-directory
14442 @vindex nnmh-directory
14443 All @code{nnmh} directories will be located under this directory.  The
14444 default is the value of @code{message-directory} (whose default is
14445 @file{~/Mail})
14446
14447 @item nnmh-get-new-mail
14448 @vindex nnmh-get-new-mail
14449 If non-@code{nil}, @code{nnmh} will read incoming mail.  The default is
14450 @code{t}.
14451
14452 @item nnmh-be-safe
14453 @vindex nnmh-be-safe
14454 If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make
14455 sure that the articles in the folder are actually what Gnus thinks they
14456 are.  It will check date stamps and stat everything in sight, so
14457 setting this to @code{t} will mean a serious slow-down.  If you never
14458 use anything but Gnus to read the @code{nnmh} articles, you do not have
14459 to set this variable to @code{t}.  The default is @code{nil}.
14460 @end table
14461
14462
14463 @node Mail Folders
14464 @subsubsection Mail Folders
14465 @cindex nnfolder
14466 @cindex mbox folders
14467 @cindex mail folders
14468
14469 @code{nnfolder} is a back end for storing each mail group in a separate
14470 file.  Each file is in the standard Un*x mbox format.  @code{nnfolder}
14471 will add extra headers to keep track of article numbers and arrival
14472 dates.
14473
14474 @cindex self contained nnfolder servers
14475 @cindex marks
14476 When the marks file is used (which it is by default), @code{nnfolder}
14477 servers have the property that you may backup them using @code{tar} or
14478 similar, and later be able to restore them into Gnus (by adding the
14479 proper @code{nnfolder} server) and have all your marks be preserved.
14480 Marks for a group is usually stored in a file named as the mbox file
14481 with @code{.mrk} concatenated to it (but see
14482 @code{nnfolder-marks-file-suffix}) within the @code{nnfolder} directory.
14483 Individual @code{nnfolder} groups are also possible to backup, use
14484 @kbd{G m} to restore the group (after restoring the backup into the
14485 @code{nnfolder} directory).
14486
14487 Virtual server settings:
14488
14489 @table @code
14490 @item nnfolder-directory
14491 @vindex nnfolder-directory
14492 All the @code{nnfolder} mail boxes will be stored under this directory.
14493 The default is the value of @code{message-directory} (whose default is
14494 @file{~/Mail})
14495
14496 @item nnfolder-active-file
14497 @vindex nnfolder-active-file
14498 The name of the active file.  The default is @file{~/Mail/active}.
14499
14500 @item nnfolder-newsgroups-file
14501 @vindex nnfolder-newsgroups-file
14502 The name of the group descriptions file.  @xref{Newsgroups File
14503 Format}.  The default is @file{~/Mail/newsgroups"}
14504
14505 @item nnfolder-get-new-mail
14506 @vindex nnfolder-get-new-mail
14507 If non-@code{nil}, @code{nnfolder} will read incoming mail.  The default
14508 is @code{t}
14509
14510 @item nnfolder-save-buffer-hook
14511 @vindex nnfolder-save-buffer-hook
14512 @cindex backup files
14513 Hook run before saving the folders.  Note that Emacs does the normal
14514 backup renaming of files even with the @code{nnfolder} buffers.  If you
14515 wish to switch this off, you could say something like the following in
14516 your @file{.emacs} file:
14517
14518 @lisp
14519 (defun turn-off-backup ()
14520   (set (make-local-variable 'backup-inhibited) t))
14521
14522 (add-hook 'nnfolder-save-buffer-hook 'turn-off-backup)
14523 @end lisp
14524
14525 @item nnfolder-delete-mail-hook
14526 @vindex nnfolder-delete-mail-hook
14527 Hook run in a buffer narrowed to the message that is to be deleted.
14528 This function can be used to copy the message to somewhere else, or to
14529 extract some information from it before removing it.
14530
14531 @item nnfolder-nov-is-evil
14532 @vindex nnfolder-nov-is-evil
14533 If non-@code{nil}, this back end will ignore any @sc{nov} files.  The
14534 default is @code{nil}.
14535
14536 @item nnfolder-nov-file-suffix
14537 @vindex nnfolder-nov-file-suffix
14538 The extension for @sc{nov} files.  The default is @file{.nov}.
14539
14540 @item nnfolder-nov-directory
14541 @vindex nnfolder-nov-directory
14542 The directory where the @sc{nov} files should be stored.  If nil,
14543 @code{nnfolder-directory} is used.
14544
14545 @item nnfolder-marks-is-evil
14546 @vindex nnfolder-marks-is-evil
14547 If non-@code{nil}, this back end will ignore any @sc{marks} files.  The
14548 default is @code{nil}.
14549
14550 @item nnfolder-marks-file-suffix
14551 @vindex nnfolder-marks-file-suffix
14552 The extension for @sc{marks} files.  The default is @file{.mrk}.
14553
14554 @item nnfolder-marks-directory
14555 @vindex nnfolder-marks-directory
14556 The directory where the @sc{marks} files should be stored.  If nil,
14557 @code{nnfolder-directory} is used.
14558
14559 @end table
14560
14561
14562 @findex nnfolder-generate-active-file
14563 @kindex M-x nnfolder-generate-active-file
14564 If you have lots of @code{nnfolder}-like files you'd like to read with
14565 @code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file}
14566 command to make @code{nnfolder} aware of all likely files in
14567 @code{nnfolder-directory}.  This only works if you use long file names,
14568 though.
14569
14570 @node Comparing Mail Back Ends
14571 @subsubsection Comparing Mail Back Ends
14572
14573 First, just for terminology, the @dfn{back end} is the common word for a
14574 low-level access method---a transport, if you will, by which something
14575 is acquired.  The sense is that one's mail has to come from somewhere,
14576 and so selection of a suitable back end is required in order to get that
14577 mail within spitting distance of Gnus.
14578
14579 The same concept exists for Usenet itself: Though access to articles is
14580 typically done by @sc{nntp} these days, once upon a midnight dreary, everyone
14581 in the world got at Usenet by running a reader on the machine where the
14582 articles lay (the machine which today we call an @sc{nntp} server), and
14583 access was by the reader stepping into the articles' directory spool
14584 area directly.  One can still select between either the @code{nntp} or
14585 @code{nnspool} back ends, to select between these methods, if one happens
14586 actually to live on the server (or can see its spool directly, anyway,
14587 via NFS).
14588
14589 The goal in selecting a mail back end is to pick one which
14590 simultaneously represents a suitable way of dealing with the original
14591 format plus leaving mail in a form that is convenient to use in the
14592 future.  Here are some high and low points on each:
14593
14594 @table @code
14595 @item nnmbox
14596
14597 UNIX systems have historically had a single, very common, and well-
14598 defined format.  All messages arrive in a single @dfn{spool file}, and
14599 they are delineated by a line whose regular expression matches
14600 @samp{^From_}.  (My notational use of @samp{_} is to indicate a space,
14601 to make it clear in this instance that this is not the RFC-specified
14602 @samp{From:} header.)  Because Emacs and therefore Gnus emanate
14603 historically from the Unix environment, it is simplest if one does not
14604 mess a great deal with the original mailbox format, so if one chooses
14605 this back end, Gnus' primary activity in getting mail from the real spool
14606 area to Gnus' preferred directory is simply to copy it, with no
14607 (appreciable) format change in the process.  It is the ``dumbest'' way
14608 to move mail into availability in the Gnus environment.  This makes it
14609 fast to move into place, but slow to parse, when Gnus has to look at
14610 what's where.
14611
14612 @item nnbabyl
14613
14614 Once upon a time, there was the DEC-10 and DEC-20, running operating
14615 systems called TOPS and related things, and the usual (only?) mail
14616 reading environment was a thing called Babyl.  I don't know what format
14617 was used for mail landing on the system, but Babyl had its own internal
14618 format to which mail was converted, primarily involving creating a
14619 spool-file-like entity with a scheme for inserting Babyl-specific
14620 headers and status bits above the top of each message in the file.
14621 RMAIL was Emacs' first mail reader, it was written by Richard Stallman,
14622 and Stallman came out of that TOPS/Babyl environment, so he wrote RMAIL
14623 to understand the mail files folks already had in existence.  Gnus (and
14624 VM, for that matter) continue to support this format because it's
14625 perceived as having some good qualities in those mailer-specific
14626 headers/status bits stuff.  RMAIL itself still exists as well, of
14627 course, and is still maintained by Stallman.
14628
14629 Both of the above forms leave your mail in a single file on your
14630 file system, and they must parse that entire file each time you take a
14631 look at your mail.
14632
14633 @item nnml
14634
14635 @code{nnml} is the back end which smells the most as though you were
14636 actually operating with an @code{nnspool}-accessed Usenet system.  (In
14637 fact, I believe @code{nnml} actually derived from @code{nnspool} code,
14638 lo these years ago.)  One's mail is taken from the original spool file,
14639 and is then cut up into individual message files, 1:1.  It maintains a
14640 Usenet-style active file (analogous to what one finds in an INN- or
14641 CNews-based news system in (for instance) @file{/var/lib/news/active},
14642 or what is returned via the @samp{NNTP LIST} verb) and also creates
14643 @dfn{overview} files for efficient group entry, as has been defined for
14644 @sc{nntp} servers for some years now.  It is slower in mail-splitting,
14645 due to the creation of lots of files, updates to the @code{nnml} active
14646 file, and additions to overview files on a per-message basis, but it is
14647 extremely fast on access because of what amounts to the indexing support
14648 provided by the active file and overviews.
14649
14650 @code{nnml} costs @dfn{inodes} in a big way; that is, it soaks up the
14651 resource which defines available places in the file system to put new
14652 files.  Sysadmins take a dim view of heavy inode occupation within
14653 tight, shared file systems.  But if you live on a personal machine where
14654 the file system is your own and space is not at a premium, @code{nnml}
14655 wins big.
14656
14657 It is also problematic using this back end if you are living in a
14658 FAT16-based Windows world, since much space will be wasted on all these
14659 tiny files.
14660
14661 @item nnmh
14662
14663 The Rand MH mail-reading system has been around UNIX systems for a very
14664 long time; it operates by splitting one's spool file of messages into
14665 individual files, but with little or no indexing support -- @code{nnmh}
14666 is considered to be semantically equivalent to ``@code{nnml} without
14667 active file or overviews''.  This is arguably the worst choice, because
14668 one gets the slowness of individual file creation married to the
14669 slowness of access parsing when learning what's new in one's groups.
14670
14671 @item nnfolder
14672
14673 Basically the effect of @code{nnfolder} is @code{nnmbox} (the first
14674 method described above) on a per-group basis.  That is, @code{nnmbox}
14675 itself puts *all* one's mail in one file; @code{nnfolder} provides a
14676 little bit of optimization to this so that each of one's mail groups has
14677 a Unix mail box file.  It's faster than @code{nnmbox} because each group
14678 can be parsed separately, and still provides the simple Unix mail box
14679 format requiring minimal effort in moving the mail around.  In addition,
14680 it maintains an ``active'' file making it much faster for Gnus to figure
14681 out how many messages there are in each separate group.
14682
14683 If you have groups that are expected to have a massive amount of
14684 messages, @code{nnfolder} is not the best choice, but if you receive
14685 only a moderate amount of mail, @code{nnfolder} is probably the most
14686 friendly mail back end all over.
14687
14688 @item nnmaildir
14689
14690 @code{nnmaildir} is largely similar to @code{nnml}, with some notable
14691 differences.  Each message is stored in a separate file, but the
14692 filename is unrelated to the article number in Gnus.  @code{nnmaildir}
14693 also stores the equivalent of @code{nnml}'s overview files in one file
14694 per article, so it uses about twice as many inodes as @code{nnml}.  (Use
14695 @code{df -i} to see how plentiful your inode supply is.)  If this slows
14696 you down or takes up very much space, consider switching to ReiserFS
14697 (@uref{http://www.namesys.com/}) or another non-block-structured
14698 file system.
14699
14700 Since maildirs don't require locking for delivery, the maildirs you use
14701 as groups can also be the maildirs your mail is directly delivered to.
14702 This means you can skip Gnus's mail splitting if your mail is already
14703 organized into different mailboxes during delivery.  A @code{directory}
14704 entry in @code{mail-sources} would have a similar effect, but would
14705 require one set of mailboxes for spooling deliveries (in mbox format,
14706 thus damaging message bodies), and another set to be used as groups (in
14707 whatever format you like).  A maildir has a built-in spool, in the
14708 @code{new/} subdirectory.  Beware that currently, mail moved from
14709 @code{new/} to @code{cur/} instead of via mail splitting will undergo
14710 treatment such as duplicate checking.
14711
14712 An article will not necessarily keep the same number across Gnus
14713 sessions; articles are renumbered starting from 1 for each Gnus session
14714 (more precisely, each time you open the @code{nnmaildir} server).  This
14715 way, you don't get gaps in your article number ranges, and when entering
14716 large groups, Gnus is likely to give a more accurate article count.  The
14717 price is that @code{nnmaildir} doesn't work with the cache or agent.
14718 This will probably be changed in the future.
14719
14720 @code{nnmaildir} stores article marks for a given group in the
14721 corresponding maildir, in a way designed so that it's easy to manipulate
14722 them from outside Gnus.  You can tar up a maildir, unpack it somewhere
14723 else, and still have your marks.  @code{nnml} also stores marks, but
14724 it's not as easy to work with them from outside Gnus as with
14725 @code{nnmaildir}.
14726
14727 For configuring expiry and other things, @code{nnmaildir} uses group
14728 parameters slightly different from those of other mail back ends.
14729
14730 @code{nnmaildir} uses a significant amount of memory to speed things up.
14731 (It keeps in memory some of the things that @code{nnml} stores in files
14732 and that @code{nnmh} repeatedly parses out of message files.)  If this
14733 is a problem for you, you can set the @code{nov-cache-size} group
14734 parameter to something small (0 would probably not work, but 1 probably
14735 would) to make it use less memory.
14736
14737 Startup and shutdown are likely to be slower with @code{nnmaildir} than
14738 with other back ends.  Everything in between is likely to be faster,
14739 depending in part on your file system.
14740
14741 @code{nnmaildir} does not use @code{nnoo}, so you cannot use @code{nnoo}
14742 to write an @code{nnmaildir}-derived back end.
14743
14744 @end table
14745
14746
14747 @node Browsing the Web
14748 @section Browsing the Web
14749 @cindex web
14750 @cindex browsing the web
14751 @cindex www
14752 @cindex http
14753
14754 Web-based discussion forums are getting more and more popular.  On many
14755 subjects, the web-based forums have become the most important forums,
14756 eclipsing the importance of mailing lists and news groups.  The reason
14757 is easy to understand---they are friendly to new users; you just point
14758 and click, and there's the discussion.  With mailing lists, you have to
14759 go through a cumbersome subscription procedure, and most people don't
14760 even know what a news group is.
14761
14762 The problem with this scenario is that web browsers are not very good at
14763 being newsreaders.  They do not keep track of what articles you've read;
14764 they do not allow you to score on subjects you're interested in; they do
14765 not allow off-line browsing; they require you to click around and drive
14766 you mad in the end.
14767
14768 So---if web browsers suck at reading discussion forums, why not use Gnus
14769 to do it instead?
14770
14771 Gnus has been getting a bit of a collection of back ends for providing
14772 interfaces to these sources.
14773
14774 @menu
14775 * Archiving Mail::              
14776 * Web Searches::                Creating groups from articles that match a string.
14777 * Slashdot::                    Reading the Slashdot comments.
14778 * Ultimate::                    The Ultimate Bulletin Board systems.
14779 * Web Archive::                 Reading mailing list archived on web.
14780 * RSS::                         Reading RDF site summary.
14781 * Customizing w3::              Doing stuff to Emacs/w3 from Gnus.
14782 @end menu
14783
14784 All the web sources require Emacs/w3 and the url library to work.
14785
14786 The main caveat with all these web sources is that they probably won't
14787 work for a very long time.  Gleaning information from the @sc{html} data
14788 is guesswork at best, and when the layout is altered, the Gnus back end
14789 will fail.  If you have reasonably new versions of these back ends,
14790 though, you should be ok.
14791
14792 One thing all these Web methods have in common is that the Web sources
14793 are often down, unavailable or just plain too slow to be fun.  In those
14794 cases, it makes a lot of sense to let the Gnus Agent (@pxref{Gnus
14795 Unplugged}) handle downloading articles, and then you can read them at
14796 leisure from your local disk.  No more World Wide Wait for you.
14797
14798 @node Archiving Mail
14799 @subsection Archiving Mail
14800 @cindex archiving mail
14801 @cindex backup of mail
14802
14803 Some of the back ends, notably @code{nnml}, @code{nnfolder}, and
14804 @code{nnmaildir}, now actually store the article marks with each group.
14805 For these servers, archiving and restoring a group while preserving
14806 marks is fairly simple.
14807
14808 (Preserving the group level and group parameters as well still
14809 requires ritual dancing and sacrifices to the @file{.newsrc.eld} deity
14810 though.)
14811
14812 To archive an entire @code{nnml}, @code{nnfolder}, or @code{nnmaildir}
14813 server, take a recursive copy of the server directory.  There is no need
14814 to shut down Gnus, so archiving may be invoked by @code{cron} or
14815 similar.  You restore the data by restoring the directory tree, and
14816 adding a server definition pointing to that directory in Gnus. The
14817 @ref{Article Backlog}, @ref{Asynchronous Fetching} and other things
14818 might interfere with overwriting data, so you may want to shut down Gnus
14819 before you restore the data.
14820
14821 It is also possible to archive individual @code{nnml},
14822 @code{nnfolder}, or @code{nnmaildir} groups, while preserving marks.
14823 For @code{nnml} or @code{nnmaildir}, you copy all files in the group's
14824 directory.  For @code{nnfolder} you need to copy both the base folder
14825 file itself (@file{FOO}, say), and the marks file (@file{FOO.mrk} in
14826 this example). Restoring the group is done with @kbd{G m} from the Group
14827 buffer.  The last step makes Gnus notice the new directory.
14828 @code{nnmaildir} notices the new directory automatically, so @kbd{G m}
14829 is unnecessary in that case.
14830
14831 @node Web Searches
14832 @subsection Web Searches
14833 @cindex nnweb
14834 @cindex Google
14835 @cindex dejanews
14836 @cindex gmane
14837 @cindex Usenet searches
14838 @cindex searching the Usenet
14839
14840 It's, like, too neat to search the Usenet for articles that match a
14841 string, but it, like, totally @emph{sucks}, like, totally, to use one of
14842 those, like, Web browsers, and you, like, have to, rilly, like, look at
14843 the commercials, so, like, with Gnus you can do @emph{rad}, rilly,
14844 searches without having to use a browser.
14845
14846 The @code{nnweb} back end allows an easy interface to the mighty search
14847 engine.  You create an @code{nnweb} group, enter a search pattern, and
14848 then enter the group and read the articles like you would any normal
14849 group.  The @kbd{G w} command in the group buffer (@pxref{Foreign
14850 Groups}) will do this in an easy-to-use fashion.
14851
14852 @code{nnweb} groups don't really lend themselves to being solid
14853 groups---they have a very fleeting idea of article numbers.  In fact,
14854 each time you enter an @code{nnweb} group (not even changing the search
14855 pattern), you are likely to get the articles ordered in a different
14856 manner.  Not even using duplicate suppression (@pxref{Duplicate
14857 Suppression}) will help, since @code{nnweb} doesn't even know the
14858 @code{Message-ID} of the articles before reading them using some search
14859 engines (Google, for instance).  The only possible way to keep track
14860 of which articles you've read is by scoring on the @code{Date}
14861 header---mark all articles posted before the last date you read the
14862 group as read.
14863
14864 If the search engine changes its output substantially, @code{nnweb}
14865 won't be able to parse it and will fail.  One could hardly fault the Web
14866 providers if they were to do this---their @emph{raison d'être} is to
14867 make money off of advertisements, not to provide services to the
14868 community.  Since @code{nnweb} washes the ads off all the articles, one
14869 might think that the providers might be somewhat miffed.  We'll see.
14870
14871 You must have the @code{url} and @code{w3} package installed to be able
14872 to use @code{nnweb}.
14873
14874 Virtual server variables:
14875
14876 @table @code
14877 @item nnweb-type
14878 @vindex nnweb-type
14879 What search engine type is being used.  The currently supported types
14880 are @code{google}, @code{dejanews}, and @code{gmane}. Note that
14881 @code{dejanews} is an alias to @code{google}.
14882
14883 @item nnweb-search
14884 @vindex nnweb-search
14885 The search string to feed to the search engine.
14886
14887 @item nnweb-max-hits
14888 @vindex nnweb-max-hits
14889 Advisory maximum number of hits per search to display.  The default is
14890 999.
14891
14892 @item nnweb-type-definition
14893 @vindex nnweb-type-definition
14894 Type-to-definition alist.  This alist says what @code{nnweb} should do
14895 with the various search engine types.  The following elements must be
14896 present:
14897
14898 @table @code
14899 @item article
14900 Function to decode the article and provide something that Gnus
14901 understands.
14902
14903 @item map
14904 Function to create an article number to message header and URL alist.
14905
14906 @item search
14907 Function to send the search string to the search engine.
14908
14909 @item address
14910 The address the aforementioned function should send the search string
14911 to.
14912
14913 @item id
14914 Format string URL to fetch an article by @code{Message-ID}.
14915 @end table
14916
14917 @end table
14918
14919
14920 @node Slashdot
14921 @subsection Slashdot
14922 @cindex Slashdot
14923 @cindex nnslashdot
14924
14925 Slashdot (@uref{http://slashdot.org/}) is a popular news site, with
14926 lively discussion following the news articles.  @code{nnslashdot} will
14927 let you read this forum in a convenient manner.
14928
14929 The easiest way to read this source is to put something like the
14930 following in your @file{.gnus.el} file:
14931
14932 @lisp
14933 (setq gnus-secondary-select-methods
14934       '((nnslashdot "")))
14935 @end lisp
14936
14937 This will make Gnus query the @code{nnslashdot} back end for new comments
14938 and groups.  The @kbd{F} command will subscribe each new news article as
14939 a new Gnus group, and you can read the comments by entering these
14940 groups.  (Note that the default subscription method is to subscribe new
14941 groups as zombies.  Other methods are available (@pxref{Subscription
14942 Methods}).
14943
14944 If you want to remove an old @code{nnslashdot} group, the @kbd{G DEL}
14945 command is the most handy tool (@pxref{Foreign Groups}).
14946
14947 When following up to @code{nnslashdot} comments (or posting new
14948 comments), some light @sc{html}izations will be performed.  In
14949 particular, text quoted with @samp{> } will be quoted with
14950 @code{blockquote} instead, and signatures will have @code{br} added to
14951 the end of each line.  Other than that, you can just write @sc{html}
14952 directly into the message buffer.  Note that Slashdot filters out some
14953 @sc{html} forms.
14954
14955 The following variables can be altered to change its behavior:
14956
14957 @table @code
14958 @item nnslashdot-threaded
14959 Whether @code{nnslashdot} should display threaded groups or not.  The
14960 default is @code{t}.  To be able to display threads, @code{nnslashdot}
14961 has to retrieve absolutely all comments in a group upon entry.  If a
14962 threaded display is not required, @code{nnslashdot} will only retrieve
14963 the comments that are actually wanted by the user.  Threading is nicer,
14964 but much, much slower than unthreaded.
14965
14966 @item nnslashdot-login-name
14967 @vindex nnslashdot-login-name
14968 The login name to use when posting.
14969
14970 @item nnslashdot-password
14971 @vindex nnslashdot-password
14972 The password to use when posting.
14973
14974 @item nnslashdot-directory
14975 @vindex nnslashdot-directory
14976 Where @code{nnslashdot} will store its files.  The default is
14977 @samp{~/News/slashdot/}.
14978
14979 @item nnslashdot-active-url
14980 @vindex nnslashdot-active-url
14981 The @sc{url} format string that will be used to fetch the information on
14982 news articles and comments.  The default is
14983 @samp{http://slashdot.org/search.pl?section=&min=%d}.
14984
14985 @item nnslashdot-comments-url
14986 @vindex nnslashdot-comments-url
14987 The @sc{url} format string that will be used to fetch comments.  The
14988 default is
14989 @samp{http://slashdot.org/comments.pl?sid=%s&threshold=%d&commentsort=%d&mode=flat&startat=%d}.
14990
14991 @item nnslashdot-article-url
14992 @vindex nnslashdot-article-url
14993 The @sc{url} format string that will be used to fetch the news article.  The
14994 default is
14995 @samp{http://slashdot.org/article.pl?sid=%s&mode=nocomment}.
14996
14997 @item nnslashdot-threshold
14998 @vindex nnslashdot-threshold
14999 The score threshold.  The default is -1.
15000
15001 @item nnslashdot-group-number
15002 @vindex nnslashdot-group-number
15003 The number of old groups, in addition to the ten latest, to keep
15004 updated.  The default is 0.
15005
15006 @end table
15007
15008
15009
15010 @node Ultimate
15011 @subsection Ultimate
15012 @cindex nnultimate
15013 @cindex Ultimate Bulletin Board
15014
15015 The Ultimate Bulletin Board (@uref{http://www.ultimatebb.com/}) is
15016 probably the most popular Web bulletin board system used.  It has a
15017 quite regular and nice interface, and it's possible to get the
15018 information Gnus needs to keep groups updated.
15019
15020 The easiest way to get started with @code{nnultimate} is to say
15021 something like the following in the group buffer:  @kbd{B nnultimate RET
15022 http://www.tcj.com/messboard/ubbcgi/ RET}.  (Substitute the @sc{url}
15023 (not including @samp{Ultimate.cgi} or the like at the end) for a forum
15024 you're interested in; there's quite a list of them on the Ultimate web
15025 site.)  Then subscribe to the groups you're interested in from the
15026 server buffer, and read them from the group buffer.
15027
15028 The following @code{nnultimate} variables can be altered:
15029
15030 @table @code
15031 @item nnultimate-directory
15032 @vindex nnultimate-directory
15033 The directory where @code{nnultimate} stores its files.  The default is
15034 @samp{~/News/ultimate/}.
15035 @end table
15036
15037
15038 @node Web Archive
15039 @subsection Web Archive
15040 @cindex nnwarchive
15041 @cindex Web Archive
15042
15043 Some mailing lists only have archives on Web servers, such as
15044 @uref{http://www.egroups.com/} and
15045 @uref{http://www.mail-archive.com/}.  It has a quite regular and nice
15046 interface, and it's possible to get the information Gnus needs to keep
15047 groups updated.
15048
15049 @findex gnus-group-make-warchive-group
15050 The easiest way to get started with @code{nnwarchive} is to say
15051 something like the following in the group buffer: @kbd{M-x
15052 gnus-group-make-warchive-group RET an_egroup RET egroups RET
15053 www.egroups.com RET your@@email.address RET}.  (Substitute the
15054 @sc{an_egroup} with the mailing list you subscribed, the
15055 @sc{your@@email.address} with your email address.), or to browse the
15056 back end by @kbd{B nnwarchive RET mail-archive RET}.
15057
15058 The following @code{nnwarchive} variables can be altered:
15059
15060 @table @code
15061 @item nnwarchive-directory
15062 @vindex nnwarchive-directory
15063 The directory where @code{nnwarchive} stores its files.  The default is
15064 @samp{~/News/warchive/}.
15065
15066 @item nnwarchive-login
15067 @vindex nnwarchive-login
15068 The account name on the web server.
15069
15070 @item nnwarchive-passwd
15071 @vindex nnwarchive-passwd
15072 The password for your account on the web server.
15073 @end table
15074
15075 @node RSS
15076 @subsection RSS
15077 @cindex nnrss
15078 @cindex RSS
15079
15080 Some sites have RDF site summary (RSS)
15081 @uref{http://purl.org/rss/1.0/spec}.  It has a quite regular and nice
15082 interface, and it's possible to get the information Gnus needs to keep
15083 groups updated.
15084
15085 The easiest way to get started with @code{nnrss} is to say something
15086 like the following in the group buffer: @kbd{B nnrss RET RET}, then
15087 subscribe groups.
15088
15089 The following @code{nnrss} variables can be altered:
15090
15091 @table @code
15092 @item nnrss-directory
15093 @vindex nnrss-directory
15094 The directory where @code{nnrss} stores its files.  The default is
15095 @samp{~/News/rss/}.
15096
15097 @end table
15098
15099 The following code may be helpful, if you want to show the description in
15100 the summary buffer.
15101
15102 @lisp
15103 (add-to-list 'nnmail-extra-headers nnrss-description-field)
15104 (setq gnus-summary-line-format "%U%R%z%I%(%[%4L: %-15,15f%]%) %s%uX\n")
15105
15106 (defun gnus-user-format-function-X (header)
15107   (let ((descr
15108          (assq nnrss-description-field (mail-header-extra header))))
15109     (if descr (concat "\n\t" (cdr descr)) "")))
15110 @end lisp
15111
15112 The following code may be useful to open an nnrss url directly from the
15113 summary buffer.
15114 @lisp
15115 (require 'browse-url)
15116
15117 (defun browse-nnrss-url( arg )
15118   (interactive "p")
15119   (let ((url (assq nnrss-url-field
15120                    (mail-header-extra
15121                     (gnus-data-header
15122                      (assq (gnus-summary-article-number)
15123                            gnus-newsgroup-data))))))
15124     (if url
15125         (progn
15126           (browse-url (cdr url))
15127           (gnus-summary-mark-as-read-forward 1))
15128       (gnus-summary-scroll-up arg))))
15129
15130 (eval-after-load "gnus"
15131   #'(define-key gnus-summary-mode-map
15132       (kbd "<RET>") 'browse-nnrss-url))
15133 (add-to-list 'nnmail-extra-headers nnrss-url-field)
15134 @end lisp
15135
15136 @node Customizing w3
15137 @subsection Customizing w3
15138 @cindex w3
15139 @cindex html
15140 @cindex url
15141 @cindex Netscape
15142
15143 Gnus uses the url library to fetch web pages and Emacs/w3 to display web
15144 pages.  Emacs/w3 is documented in its own manual, but there are some
15145 things that may be more relevant for Gnus users.
15146
15147 For instance, a common question is how to make Emacs/w3 follow links
15148 using the @code{browse-url} functions (which will call some external web
15149 browser like Netscape).  Here's one way:
15150
15151 @lisp
15152 (eval-after-load "w3"
15153   '(progn
15154     (fset 'w3-fetch-orig (symbol-function 'w3-fetch))
15155     (defun w3-fetch (&optional url target)
15156       (interactive (list (w3-read-url-with-default)))
15157       (if (eq major-mode 'gnus-article-mode)
15158           (browse-url url)
15159         (w3-fetch-orig url target)))))
15160 @end lisp
15161
15162 Put that in your @file{.emacs} file, and hitting links in w3-rendered
15163 @sc{html} in the Gnus article buffers will use @code{browse-url} to
15164 follow the link.
15165
15166
15167 @node IMAP
15168 @section IMAP
15169 @cindex nnimap
15170 @cindex @sc{imap}
15171
15172 @sc{imap} is a network protocol for reading mail (or news, or ...),
15173 think of it as a modernized @sc{nntp}.  Connecting to a @sc{imap}
15174 server is much similar to connecting to a news server, you just
15175 specify the network address of the server.
15176
15177 @sc{imap} has two properties.  First, @sc{imap} can do everything that
15178 POP can, it can hence be viewed as a POP++.  Secondly, @sc{imap} is a
15179 mail storage protocol, similar to @sc{nntp} being a news storage
15180 protocol -- however, @sc{imap} offers more features than @sc{nntp}
15181 because news is more or less read-only whereas mail is read-write.
15182
15183 If you want to use @sc{imap} as a POP++, use an imap entry in
15184 @code{mail-sources}.  With this, Gnus will fetch mails from the
15185 @sc{imap} server and store them on the local disk.  This is not the
15186 usage described in this section--@xref{Mail Sources}.
15187
15188 If you want to use @sc{imap} as a mail storage protocol, use an nnimap
15189 entry in @code{gnus-secondary-select-methods}.  With this, Gnus will
15190 manipulate mails stored on the @sc{imap} server.  This is the kind of
15191 usage explained in this section.
15192
15193 A server configuration in @code{~/.gnus} with a few @sc{imap} servers
15194 might look something like the following. (Note that for SSL/TLS, you
15195 need external programs and libraries, see below.)
15196
15197 @lisp
15198 (setq gnus-secondary-select-methods
15199       '((nnimap "simpleserver") ; no special configuration
15200         ; perhaps a ssh port forwarded server:
15201         (nnimap "dolk"
15202                 (nnimap-address "localhost")
15203                 (nnimap-server-port 1430))
15204         ; a UW server running on localhost
15205         (nnimap "barbar"
15206                 (nnimap-server-port 143)
15207                 (nnimap-address "localhost")
15208                 (nnimap-list-pattern ("INBOX" "mail/*")))
15209         ; anonymous public cyrus server:
15210         (nnimap "cyrus.andrew.cmu.edu"
15211                 (nnimap-authenticator anonymous)
15212                 (nnimap-list-pattern "archive.*")
15213                 (nnimap-stream network))
15214         ; a ssl server on a non-standard port:
15215         (nnimap "vic20"
15216                 (nnimap-address "vic20.somewhere.com")
15217                 (nnimap-server-port 9930)
15218                 (nnimap-stream ssl))))
15219 @end lisp
15220
15221 After defining the new server, you can subscribe to groups on the
15222 server using normal Gnus commands such as @kbd{U} in the Group Buffer
15223 (@pxref{Subscription Commands}) or via the Server Buffer
15224 (@pxref{Server Buffer}).
15225
15226 The following variables can be used to create a virtual @code{nnimap}
15227 server:
15228
15229 @table @code
15230
15231 @item nnimap-address
15232 @vindex nnimap-address
15233
15234 The address of the remote @sc{imap} server.  Defaults to the virtual
15235 server name if not specified.
15236
15237 @item nnimap-server-port
15238 @vindex nnimap-server-port
15239 Port on server to contact.  Defaults to port 143, or 993 for SSL.
15240
15241 Note that this should be an integer, example server specification:
15242
15243 @lisp
15244 (nnimap "mail.server.com"
15245         (nnimap-server-port 4711))
15246 @end lisp
15247
15248 @item nnimap-list-pattern
15249 @vindex nnimap-list-pattern
15250 String or list of strings of mailboxes to limit available groups to.
15251 This is used when the server has very many mailboxes and you're only
15252 interested in a few -- some servers export your home directory via
15253 @sc{imap}, you'll probably want to limit the mailboxes to those in
15254 @file{~/Mail/*} then.
15255
15256 The string can also be a cons of REFERENCE and the string as above, what
15257 REFERENCE is used for is server specific, but on the University of
15258 Washington server it's a directory that will be concatenated with the
15259 mailbox.
15260
15261 Example server specification:
15262
15263 @lisp
15264 (nnimap "mail.server.com"
15265         (nnimap-list-pattern ("INBOX" "Mail/*" "alt.sex.*"
15266                                ("~friend/Mail/" . "list/*"))))
15267 @end lisp
15268
15269 @item nnimap-stream
15270 @vindex nnimap-stream
15271 The type of stream used to connect to your server.  By default, nnimap
15272 will detect and automatically use all of the below, with the exception
15273 of SSL/TLS. (@sc{imap} over SSL/TLS is being replaced by STARTTLS, which
15274 can be automatically detected, but it's not widely deployed yet.)
15275
15276 Example server specification:
15277
15278 @lisp
15279 (nnimap "mail.server.com"
15280         (nnimap-stream ssl))
15281 @end lisp
15282
15283 Please note that the value of @code{nnimap-stream} is a symbol!
15284
15285 @itemize @bullet
15286 @item
15287 @dfn{gssapi:} Connect with GSSAPI (usually Kerberos 5). Requires the
15288 @samp{imtest} program.
15289 @item
15290 @dfn{kerberos4:} Connect with Kerberos 4. Requires the @samp{imtest} program.
15291 @item
15292 @dfn{starttls:} Connect via the STARTTLS extension (similar to
15293 SSL).  Requires the external library @samp{starttls.el} and program
15294 @samp{starttls}.
15295 @item
15296 @dfn{ssl:} Connect through SSL.  Requires OpenSSL (the program
15297 @samp{openssl}) or SSLeay (@samp{s_client}) as well as the external
15298 library @samp{ssl.el}.
15299 @item
15300 @dfn{shell:} Use a shell command to start @sc{imap} connection.
15301 @item
15302 @dfn{network:} Plain, TCP/IP network connection.
15303 @end itemize
15304
15305 @vindex imap-kerberos4-program
15306 The @samp{imtest} program is shipped with Cyrus IMAPD.  If you're
15307 using @samp{imtest} from Cyrus IMAPD < 2.0.14 (which includes version
15308 1.5.x and 1.6.x) you need to frob @code{imap-process-connection-type}
15309 to make @code{imap.el} use a pty instead of a pipe when communicating
15310 with @samp{imtest}.  You will then suffer from a line length
15311 restrictions on @sc{imap} commands, which might make Gnus seem to hang
15312 indefinitely if you have many articles in a mailbox.  The variable
15313 @code{imap-kerberos4-program} contain parameters to pass to the imtest
15314 program.
15315
15316 @vindex imap-ssl-program
15317 For SSL connections, the OpenSSL program is available from
15318 @uref{http://www.openssl.org/}. OpenSSL was formerly known as SSLeay,
15319 and nnimap support it too - although the most recent versions of
15320 SSLeay, 0.9.x, are known to have serious bugs making it
15321 useless. Earlier versions, especially 0.8.x, of SSLeay are known to
15322 work. The variable @code{imap-ssl-program} contain parameters to pass
15323 to OpenSSL/SSLeay.  You also need @samp{ssl.el} (from the W3
15324 distribution, for instance).
15325
15326 @vindex imap-shell-program
15327 @vindex imap-shell-host
15328 For @sc{imap} connections using the @code{shell} stream, the variable
15329 @code{imap-shell-program} specify what program to call.
15330
15331 @item nnimap-authenticator
15332 @vindex nnimap-authenticator
15333
15334 The authenticator used to connect to the server.  By default, nnimap
15335 will use the most secure authenticator your server is capable of.
15336
15337 Example server specification:
15338
15339 @lisp
15340 (nnimap "mail.server.com"
15341         (nnimap-authenticator anonymous))
15342 @end lisp
15343
15344 Please note that the value of @code{nnimap-authenticator} is a symbol!
15345
15346 @itemize @bullet
15347 @item
15348 @dfn{gssapi:} GSSAPI (usually kerberos 5) authentication. Requires
15349 external program @code{imtest}.
15350 @item
15351 @dfn{kerberos4:} Kerberos 4 authentication. Requires external program
15352 @code{imtest}.
15353 @item
15354 @dfn{digest-md5:} Encrypted username/password via DIGEST-MD5. Requires
15355 external library @code{digest-md5.el}.
15356 @item
15357 @dfn{cram-md5:} Encrypted username/password via CRAM-MD5.
15358 @item
15359 @dfn{login:} Plain-text username/password via LOGIN.
15360 @item
15361 @dfn{anonymous:} Login as `anonymous', supplying your email address as password.
15362 @end itemize
15363
15364 @item nnimap-expunge-on-close
15365 @cindex Expunging
15366 @vindex nnimap-expunge-on-close
15367 Unlike Parmenides the @sc{imap} designers has decided that things that
15368 doesn't exist actually does exist.  More specifically, @sc{imap} has
15369 this concept of marking articles @code{Deleted} which doesn't actually
15370 delete them, and this (marking them @code{Deleted}, that is) is what
15371 nnimap does when you delete a article in Gnus (with @kbd{B DEL} or
15372 similar).
15373
15374 Since the articles aren't really removed when we mark them with the
15375 @code{Deleted} flag we'll need a way to actually delete them.  Feel like
15376 running in circles yet?
15377
15378 Traditionally, nnimap has removed all articles marked as @code{Deleted}
15379 when closing a mailbox but this is now configurable by this server
15380 variable.
15381
15382 The possible options are:
15383
15384 @table @code
15385
15386 @item always
15387 The default behavior, delete all articles marked as "Deleted" when
15388 closing a mailbox.
15389 @item never
15390 Never actually delete articles.  Currently there is no way of showing
15391 the articles marked for deletion in nnimap, but other @sc{imap} clients
15392 may allow you to do this.  If you ever want to run the EXPUNGE command
15393 manually, @xref{Expunging mailboxes}.
15394 @item ask
15395 When closing mailboxes, nnimap will ask if you wish to expunge deleted
15396 articles or not.
15397
15398 @end table
15399
15400 @item nnimap-importantize-dormant
15401 @vindex nnimap-importantize-dormant
15402
15403 If non-nil (the default), marks dormant articles as ticked (as well),
15404 for other @sc{imap} clients. Within Gnus, dormant articles will
15405 naturally still (only) be marked as dormant.  This is to make dormant
15406 articles stand out, just like ticked articles, in other @sc{imap}
15407 clients. (In other words, Gnus has two ``Tick'' marks and @sc{imap}
15408 has only one.)
15409
15410 Probably the only reason for frobing this would be if you're trying
15411 enable per-user persistant dormant flags, using something like:
15412
15413 @lisp
15414 (setcdr (assq 'dormant nnimap-mark-to-flag-alist)
15415         (format "gnus-dormant-%s" (user-login-name)))
15416 (setcdr (assq 'dormant nnimap-mark-to-predicate-alist)
15417         (format "KEYWORD gnus-dormant-%s" (user-login-name)))
15418 @end lisp
15419
15420 In this case, you would not want the per-user dormant flag showing up
15421 as ticked for other users.
15422
15423 @item nnimap-expunge-search-string
15424 @cindex Expunging
15425 @vindex nnimap-expunge-search-string
15426
15427 This variable contain the @sc{imap} search command sent to server when
15428 searching for articles eligible for expiring.  The default is
15429 @code{"UID %s NOT SINCE %s"}, where the first @code{%s} is replaced by
15430 UID set and the second @code{%s} is replaced by a date.
15431
15432 Probably the only useful value to change this to is
15433 @code{"UID %s NOT SENTSINCE %s"}, which makes nnimap use the Date: in
15434 messages instead of the internal article date. See section 6.4.4 of
15435 RFC 2060 for more information on valid strings.
15436
15437 @item nnimap-authinfo-file
15438 @vindex nnimap-authinfo-file
15439
15440 A file containing credentials used to log in on servers.  The format is
15441 (almost) the same as the @code{ftp} @file{~/.netrc} file.  See the
15442 variable @code{nntp-authinfo-file} for exact syntax; also see
15443 @ref{NNTP}.
15444
15445 @end table
15446
15447 @menu
15448 * Splitting in IMAP::           Splitting mail with nnimap.
15449 * Expiring in IMAP::            Expiring mail with nnimap.
15450 * Editing IMAP ACLs::           Limiting/enabling other users access to a mailbox.
15451 * Expunging mailboxes::         Equivalent of a "compress mailbox" button.
15452 * A note on namespaces::        How to (not) use IMAP namespace in Gnus.
15453 @end menu
15454
15455
15456
15457 @node Splitting in IMAP
15458 @subsection Splitting in IMAP
15459 @cindex splitting imap mail
15460
15461 Splitting is something Gnus users has loved and used for years, and now
15462 the rest of the world is catching up.  Yeah, dream on, not many
15463 @sc{imap} server has server side splitting and those that have splitting
15464 seem to use some non-standard protocol.  This means that @sc{imap}
15465 support for Gnus has to do it's own splitting.
15466
15467 And it does.
15468
15469 Here are the variables of interest:
15470
15471 @table @code
15472
15473 @item nnimap-split-crosspost
15474 @cindex splitting, crosspost
15475 @cindex crosspost
15476 @vindex nnimap-split-crosspost
15477
15478 If non-nil, do crossposting if several split methods match the mail.  If
15479 nil, the first match in @code{nnimap-split-rule} found will be used.
15480
15481 Nnmail equivalent: @code{nnmail-crosspost}.
15482
15483 @item nnimap-split-inbox
15484 @cindex splitting, inbox
15485 @cindex inbox
15486 @vindex nnimap-split-inbox
15487
15488 A string or a list of strings that gives the name(s) of @sc{imap}
15489 mailboxes to split from.  Defaults to nil, which means that splitting is
15490 disabled!
15491
15492 @lisp
15493 (setq nnimap-split-inbox
15494       '("INBOX" ("~/friend/Mail" . "lists/*") "lists.imap"))
15495 @end lisp
15496
15497 No nnmail equivalent.
15498
15499 @item nnimap-split-rule
15500 @cindex Splitting, rules
15501 @vindex nnimap-split-rule
15502
15503 New mail found in @code{nnimap-split-inbox} will be split according to
15504 this variable.
15505
15506 This variable contains a list of lists, where the first element in the
15507 sublist gives the name of the @sc{imap} mailbox to move articles
15508 matching the regexp in the second element in the sublist.  Got that?
15509 Neither did I, we need examples.
15510
15511 @lisp
15512 (setq nnimap-split-rule
15513       '(("INBOX.nnimap"
15514          "^Sender: owner-nnimap@@vic20.globalcom.se")
15515         ("INBOX.junk"    "^Subject:.*MAKE MONEY")
15516         ("INBOX.private" "")))
15517 @end lisp
15518
15519 This will put all articles from the nnimap mailing list into mailbox
15520 INBOX.nnimap, all articles containing MAKE MONEY in the Subject: line
15521 into INBOX.junk and everything else in INBOX.private.
15522
15523 The first string may contain `\\1' forms, like the ones used by
15524 replace-match to insert sub-expressions from the matched text.  For
15525 instance:
15526
15527 @lisp
15528 ("INBOX.lists.\\1"     "^Sender: owner-\\([a-z-]+\\)@@")
15529 @end lisp
15530
15531 The first element can also be the symbol @code{junk} to indicate that
15532 matching messages should simply be deleted.  Use with care.
15533
15534 The second element can also be a function.  In that case, it will be
15535 called with the first element of the rule as the argument, in a buffer
15536 containing the headers of the article.  It should return a non-nil value
15537 if it thinks that the mail belongs in that group.
15538
15539 Nnmail users might recollect that the last regexp had to be empty to
15540 match all articles (like in the example above).  This is not required in
15541 nnimap.  Articles not matching any of the regexps will not be moved out
15542 of your inbox.  (This might affect performance if you keep lots of
15543 unread articles in your inbox, since the splitting code would go over
15544 them every time you fetch new mail.)
15545
15546 These rules are processed from the beginning of the alist toward the
15547 end.  The first rule to make a match will "win", unless you have
15548 crossposting enabled.  In that case, all matching rules will "win".
15549
15550 This variable can also have a function as its value, the function will
15551 be called with the headers narrowed and should return a group where it
15552 thinks the article should be split to.  See @code{nnimap-split-fancy}.
15553
15554 The splitting code tries to create mailboxes if it needs to.
15555
15556 To allow for different split rules on different virtual servers, and
15557 even different split rules in different inboxes on the same server,
15558 the syntax of this variable have been extended along the lines of:
15559
15560 @lisp
15561 (setq nnimap-split-rule
15562       '(("my1server"    (".*"    (("ding"    "ding@@gnus.org")
15563                                   ("junk"    "From:.*Simon")))
15564         ("my2server"    ("INBOX" nnimap-split-fancy))
15565         ("my[34]server" (".*"    (("private" "To:.*Simon")
15566                                   ("junk"    my-junk-func)))))
15567 @end lisp
15568
15569 The virtual server name is in fact a regexp, so that the same rules
15570 may apply to several servers.  In the example, the servers
15571 @code{my3server} and @code{my4server} both use the same rules.
15572 Similarly, the inbox string is also a regexp.  The actual splitting
15573 rules are as before, either a function, or a list with group/regexp or
15574 group/function elements.
15575
15576 Nnmail equivalent: @code{nnmail-split-methods}.
15577
15578 @item nnimap-split-predicate
15579 @cindex splitting
15580 @vindex nnimap-split-predicate
15581
15582 Mail matching this predicate in @code{nnimap-split-inbox} will be
15583 split, it is a string and the default is @samp{UNSEEN UNDELETED}.
15584
15585 This might be useful if you use another @sc{imap} client to read mail in
15586 your inbox but would like Gnus to split all articles in the inbox
15587 regardless of readedness. Then you might change this to
15588 @samp{UNDELETED}.
15589
15590 @item nnimap-split-fancy
15591 @cindex splitting, fancy
15592 @findex nnimap-split-fancy
15593 @vindex nnimap-split-fancy
15594
15595 It's possible to set @code{nnimap-split-rule} to
15596 @code{nnmail-split-fancy} if you want to use fancy
15597 splitting. @xref{Fancy Mail Splitting}.
15598
15599 However, to be able to have different fancy split rules for nnmail and
15600 nnimap back ends you can set @code{nnimap-split-rule} to
15601 @code{nnimap-split-fancy} and define the nnimap specific fancy split
15602 rule in @code{nnimap-split-fancy}.
15603
15604 Example:
15605
15606 @lisp
15607 (setq nnimap-split-rule 'nnimap-split-fancy
15608       nnimap-split-fancy ...)
15609 @end lisp
15610
15611 Nnmail equivalent: @code{nnmail-split-fancy}.
15612
15613 @item nnimap-split-download-body
15614 @findex nnimap-split-download-body
15615 @vindex nnimap-split-download-body
15616
15617 Set to non-nil to download entire articles during splitting.  This is
15618 generally not required, and will slow things down considerably.  You
15619 may need it if you want to use an advanced splitting function that
15620 analyses the body to split the article.
15621
15622 @end table
15623
15624 @node Expiring in IMAP
15625 @subsection Expiring in IMAP
15626 @cindex expiring imap mail
15627
15628 Even though @code{nnimap} is not a proper @code{nnmail} derived back
15629 end, it supports most features in regular expiring (@pxref{Expiring
15630 Mail}).  Unlike splitting in IMAP (@pxref{Splitting in IMAP}) it do
15631 not clone the @code{nnmail} variables (i.e., creating
15632 @var{nnimap-expiry-wait}) but reuse the @code{nnmail} variables.  What
15633 follows below are the variables used by the @code{nnimap} expiry
15634 process.
15635
15636 A note on how the expire mark is stored on the @sc{imap} server is
15637 appropriate here as well.  The expire mark is translated into a
15638 @code{imap} client specific mark, @code{gnus-expire}, and stored on the
15639 message.  This means that likely only Gnus will understand and treat
15640 the @code{gnus-expire} mark properly, although other clients may allow
15641 you to view client specific flags on the message.  It also means that
15642 your server must support permanent storage of client specific flags on
15643 messages.  Most do, fortunately.
15644
15645 @table @code
15646
15647 @item nnmail-expiry-wait
15648 @item nnmail-expiry-wait-function
15649
15650 These variables are fully supported.  The expire value can be a
15651 number, the symbol @var{immediate} or @var{never}.
15652
15653 @item nnmail-expiry-target
15654
15655 This variable is supported, and internally implemented by calling the
15656 @code{nnmail} functions that handle this.  It contains an optimization
15657 that if the destination is a IMAP group on the same server, the
15658 article is copied instead of appended (that is, uploaded again).
15659
15660 @end table
15661
15662 @node Editing IMAP ACLs
15663 @subsection Editing IMAP ACLs
15664 @cindex editing imap acls
15665 @cindex Access Control Lists
15666 @cindex Editing @sc{imap} ACLs
15667 @kindex G l
15668 @findex gnus-group-nnimap-edit-acl
15669
15670 ACL stands for Access Control List.  ACLs are used in @sc{imap} for
15671 limiting (or enabling) other users access to your mail boxes.  Not all
15672 @sc{imap} servers support this, this function will give an error if it
15673 doesn't.
15674
15675 To edit a ACL for a mailbox, type @kbd{G l}
15676 (@code{gnus-group-edit-nnimap-acl}) and you'll be presented with a ACL
15677 editing window with detailed instructions.
15678
15679 Some possible uses:
15680
15681 @itemize @bullet
15682 @item
15683 Giving "anyone" the "lrs" rights (lookup, read, keep seen/unseen flags)
15684 on your mailing list mailboxes enables other users on the same server to
15685 follow the list without subscribing to it.
15686 @item
15687 At least with the Cyrus server, you are required to give the user
15688 "anyone" posting ("p") capabilities to have "plussing" work (that is,
15689 mail sent to user+mailbox@@domain ending up in the @sc{imap} mailbox
15690 INBOX.mailbox).
15691 @end itemize
15692
15693 @node Expunging mailboxes
15694 @subsection Expunging mailboxes
15695 @cindex expunging
15696
15697 @cindex Expunge
15698 @cindex Manual expunging
15699 @kindex G x
15700 @findex gnus-group-nnimap-expunge
15701
15702 If you're using the @code{never} setting of @code{nnimap-expunge-on-close},
15703 you may want the option of expunging all deleted articles in a mailbox
15704 manually.  This is exactly what @kbd{G x} does.
15705
15706 Currently there is no way of showing deleted articles, you can just
15707 delete them.
15708
15709 @node A note on namespaces
15710 @subsection A note on namespaces
15711 @cindex IMAP namespace
15712 @cindex namespaces
15713
15714 The IMAP protocol has a concept called namespaces, described by the
15715 following text in the RFC:
15716
15717 @example
15718 5.1.2.  Mailbox Namespace Naming Convention
15719
15720    By convention, the first hierarchical element of any mailbox name
15721    which begins with "#" identifies the "namespace" of the remainder of
15722    the name.  This makes it possible to disambiguate between different
15723    types of mailbox stores, each of which have their own namespaces.
15724
15725       For example, implementations which offer access to USENET
15726       newsgroups MAY use the "#news" namespace to partition the USENET
15727       newsgroup namespace from that of other mailboxes.  Thus, the
15728       comp.mail.misc newsgroup would have an mailbox name of
15729       "#news.comp.mail.misc", and the name "comp.mail.misc" could refer
15730       to a different object (e.g. a user's private mailbox).
15731 @end example
15732
15733 While there is nothing in this text that warrants concern for the IMAP
15734 implementation in Gnus, some servers use namespace prefixes in a way
15735 that does not work with how Gnus uses mailbox names.
15736
15737 Specifically, University of Washington's IMAP server uses mailbox
15738 names like @code{#driver.mbx/read-mail} which are valid only in the
15739 @sc{create} and @sc{append} commands.  After the mailbox is created
15740 (or a messages is appended to a mailbox), it must be accessed without
15741 the namespace prefix, i.e @code{read-mail}.  Since Gnus do not make it
15742 possible for the user to guarantee that user entered mailbox names
15743 will only be used with the CREATE and APPEND commands, you should
15744 simply not use the namespace prefixed mailbox names in Gnus.
15745
15746 See the UoW @sc{imapd} documentation for the @code{#driver.*/} prefix
15747 for more information on how to use the prefixes.  They are a power
15748 tool and should be used only if you are sure what the effects are.
15749
15750 @node Other Sources
15751 @section Other Sources
15752
15753 Gnus can do more than just read news or mail.  The methods described
15754 below allow Gnus to view directories and files as if they were
15755 newsgroups.
15756
15757 @menu
15758 * Directory Groups::            You can read a directory as if it was a newsgroup.
15759 * Anything Groups::             Dired?  Who needs dired?
15760 * Document Groups::             Single files can be the basis of a group.
15761 * SOUP::                        Reading @sc{soup} packets ``offline''.
15762 * Mail-To-News Gateways::       Posting articles via mail-to-news gateways.
15763 @end menu
15764
15765
15766 @node Directory Groups
15767 @subsection Directory Groups
15768 @cindex nndir
15769 @cindex directory groups
15770
15771 If you have a directory that has lots of articles in separate files in
15772 it, you might treat it as a newsgroup.  The files have to have numerical
15773 names, of course.
15774
15775 This might be an opportune moment to mention @code{ange-ftp} (and its
15776 successor @code{efs}), that most wonderful of all wonderful Emacs
15777 packages.  When I wrote @code{nndir}, I didn't think much about it---a
15778 back end to read directories.  Big deal.
15779
15780 @code{ange-ftp} changes that picture dramatically.  For instance, if you
15781 enter the @code{ange-ftp} file name
15782 @file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the directory name,
15783 @code{ange-ftp} or @code{efs} will actually allow you to read this
15784 directory over at @samp{sina} as a newsgroup.  Distributed news ahoy!
15785
15786 @code{nndir} will use @sc{nov} files if they are present.
15787
15788 @code{nndir} is a ``read-only'' back end---you can't delete or expire
15789 articles with this method.  You can use @code{nnmh} or @code{nnml} for
15790 whatever you use @code{nndir} for, so you could switch to any of those
15791 methods if you feel the need to have a non-read-only @code{nndir}.
15792
15793
15794 @node Anything Groups
15795 @subsection Anything Groups
15796 @cindex nneething
15797
15798 From the @code{nndir} back end (which reads a single spool-like
15799 directory), it's just a hop and a skip to @code{nneething}, which
15800 pretends that any arbitrary directory is a newsgroup.  Strange, but
15801 true.
15802
15803 When @code{nneething} is presented with a directory, it will scan this
15804 directory and assign article numbers to each file.  When you enter such
15805 a group, @code{nneething} must create ``headers'' that Gnus can use.
15806 After all, Gnus is a newsreader, in case you're forgetting.
15807 @code{nneething} does this in a two-step process.  First, it snoops each
15808 file in question.  If the file looks like an article (i.e., the first
15809 few lines look like headers), it will use this as the head.  If this is
15810 just some arbitrary file without a head (e.g. a C source file),
15811 @code{nneething} will cobble up a header out of thin air.  It will use
15812 file ownership, name and date and do whatever it can with these
15813 elements.
15814
15815 All this should happen automatically for you, and you will be presented
15816 with something that looks very much like a newsgroup.  Totally like a
15817 newsgroup, to be precise.  If you select an article, it will be displayed
15818 in the article buffer, just as usual.
15819
15820 If you select a line that represents a directory, Gnus will pop you into
15821 a new summary buffer for this @code{nneething} group.  And so on.  You can
15822 traverse the entire disk this way, if you feel like, but remember that
15823 Gnus is not dired, really, and does not intend to be, either.
15824
15825 There are two overall modes to this action---ephemeral or solid.  When
15826 doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus
15827 will not store information on what files you have read, and what files
15828 are new, and so on.  If you create a solid @code{nneething} group the
15829 normal way with @kbd{G m}, Gnus will store a mapping table between
15830 article numbers and file names, and you can treat this group like any
15831 other groups.  When you activate a solid @code{nneething} group, you will
15832 be told how many unread articles it contains, etc., etc.
15833
15834 Some variables:
15835
15836 @table @code
15837 @item nneething-map-file-directory
15838 @vindex nneething-map-file-directory
15839 All the mapping files for solid @code{nneething} groups will be stored
15840 in this directory, which defaults to @file{~/.nneething/}.
15841
15842 @item nneething-exclude-files
15843 @vindex nneething-exclude-files
15844 All files that match this regexp will be ignored.  Nice to use to exclude
15845 auto-save files and the like, which is what it does by default.
15846
15847 @item nneething-include-files
15848 @vindex nneething-include-files
15849 Regexp saying what files to include in the group.  If this variable is
15850 non-@code{nil}, only files matching this regexp will be included.
15851
15852 @item nneething-map-file
15853 @vindex nneething-map-file
15854 Name of the map files.
15855 @end table
15856
15857
15858 @node Document Groups
15859 @subsection Document Groups
15860 @cindex nndoc
15861 @cindex documentation group
15862 @cindex help group
15863
15864 @code{nndoc} is a cute little thing that will let you read a single file
15865 as a newsgroup.  Several files types are supported:
15866
15867 @table @code
15868 @cindex babyl
15869 @cindex rmail mbox
15870
15871 @item babyl
15872 The babyl (rmail) mail box.
15873 @cindex mbox
15874 @cindex Unix mbox
15875
15876 @item mbox
15877 The standard Unix mbox file.
15878
15879 @cindex MMDF mail box
15880 @item mmdf
15881 The MMDF mail box format.
15882
15883 @item news
15884 Several news articles appended into a file.
15885
15886 @item rnews
15887 @cindex rnews batch files
15888 The rnews batch transport format.
15889 @cindex forwarded messages
15890
15891 @item forward
15892 Forwarded articles.
15893
15894 @item nsmail
15895 Netscape mail boxes.
15896
15897 @item mime-parts
15898 @sc{mime} multipart messages.
15899
15900 @item standard-digest
15901 The standard (RFC 1153) digest format.
15902
15903 @item mime-digest
15904 A @sc{mime} digest of messages.
15905
15906 @item lanl-gov-announce
15907 Announcement messages from LANL Gov Announce.
15908
15909 @item rfc822-forward
15910 A message forwarded according to RFC822.
15911
15912 @item outlook
15913 The Outlook mail box.
15914
15915 @item oe-dbx
15916 The Outlook Express dbx mail box.
15917
15918 @item exim-bounce
15919 A bounce message from the Exim MTA.
15920
15921 @item forward
15922 A message forwarded according to informal rules.
15923
15924 @item rfc934
15925 An RFC934-forwarded message.
15926
15927 @item mailman
15928 A mailman digest.
15929
15930 @item clari-briefs
15931 A digest of Clarinet brief news items.
15932
15933 @item slack-digest
15934 Non-standard digest format---matches most things, but does it badly.
15935
15936 @item mail-in-mail
15937 The last resort.
15938 @end table
15939
15940 You can also use the special ``file type'' @code{guess}, which means
15941 that @code{nndoc} will try to guess what file type it is looking at.
15942 @code{digest} means that @code{nndoc} should guess what digest type the
15943 file is.
15944
15945 @code{nndoc} will not try to change the file or insert any extra headers into
15946 it---it will simply, like, let you use the file as the basis for a
15947 group.  And that's it.
15948
15949 If you have some old archived articles that you want to insert into your
15950 new & spiffy Gnus mail back end, @code{nndoc} can probably help you with
15951 that.  Say you have an old @file{RMAIL} file with mail that you now want
15952 to split into your new @code{nnml} groups.  You look at that file using
15953 @code{nndoc} (using the @kbd{G f} command in the group buffer
15954 (@pxref{Foreign Groups})), set the process mark on all the articles in
15955 the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r})
15956 using @code{nnml}.  If all goes well, all the mail in the @file{RMAIL}
15957 file is now also stored in lots of @code{nnml} directories, and you can
15958 delete that pesky @file{RMAIL} file.  If you have the guts!
15959
15960 Virtual server variables:
15961
15962 @table @code
15963 @item nndoc-article-type
15964 @vindex nndoc-article-type
15965 This should be one of @code{mbox}, @code{babyl}, @code{digest},
15966 @code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
15967 @code{rfc822-forward}, @code{mime-parts}, @code{standard-digest},
15968 @code{slack-digest}, @code{clari-briefs}, @code{nsmail}, @code{outlook},
15969 @code{oe-dbx}, @code{mailman}, and @code{mail-in-mail} or @code{guess}.
15970
15971 @item nndoc-post-type
15972 @vindex nndoc-post-type
15973 This variable says whether Gnus is to consider the group a news group or
15974 a mail group.  There are two valid values:  @code{mail} (the default)
15975 and @code{news}.
15976 @end table
15977
15978 @menu
15979 * Document Server Internals::   How to add your own document types.
15980 @end menu
15981
15982
15983 @node Document Server Internals
15984 @subsubsection Document Server Internals
15985
15986 Adding new document types to be recognized by @code{nndoc} isn't
15987 difficult.  You just have to whip up a definition of what the document
15988 looks like, write a predicate function to recognize that document type,
15989 and then hook into @code{nndoc}.
15990
15991 First, here's an example document type definition:
15992
15993 @example
15994 (mmdf
15995  (article-begin .  "^\^A\^A\^A\^A\n")
15996  (body-end .  "^\^A\^A\^A\^A\n"))
15997 @end example
15998
15999 The definition is simply a unique @dfn{name} followed by a series of
16000 regexp pseudo-variable settings.  Below are the possible
16001 variables---don't be daunted by the number of variables; most document
16002 types can be defined with very few settings:
16003
16004 @table @code
16005 @item first-article
16006 If present, @code{nndoc} will skip past all text until it finds
16007 something that match this regexp.  All text before this will be
16008 totally ignored.
16009
16010 @item article-begin
16011 This setting has to be present in all document type definitions.  It
16012 says what the beginning of each article looks like.
16013
16014 @item head-begin-function
16015 If present, this should be a function that moves point to the head of
16016 the article.
16017
16018 @item nndoc-head-begin
16019 If present, this should be a regexp that matches the head of the
16020 article.
16021
16022 @item nndoc-head-end
16023 This should match the end of the head of the article.  It defaults to
16024 @samp{^$}---the empty line.
16025
16026 @item body-begin-function
16027 If present, this function should move point to the beginning of the body
16028 of the article.
16029
16030 @item body-begin
16031 This should match the beginning of the body of the article.  It defaults
16032 to @samp{^\n}.
16033
16034 @item body-end-function
16035 If present, this function should move point to the end of the body of
16036 the article.
16037
16038 @item body-end
16039 If present, this should match the end of the body of the article.
16040
16041 @item file-end
16042 If present, this should match the end of the file.  All text after this
16043 regexp will be totally ignored.
16044
16045 @end table
16046
16047 So, using these variables @code{nndoc} is able to dissect a document
16048 file into a series of articles, each with a head and a body.  However, a
16049 few more variables are needed since not all document types are all that
16050 news-like---variables needed to transform the head or the body into
16051 something that's palatable for Gnus:
16052
16053 @table @code
16054 @item prepare-body-function
16055 If present, this function will be called when requesting an article.  It
16056 will be called with point at the start of the body, and is useful if the
16057 document has encoded some parts of its contents.
16058
16059 @item article-transform-function
16060 If present, this function is called when requesting an article.  It's
16061 meant to be used for more wide-ranging transformation of both head and
16062 body of the article.
16063
16064 @item generate-head-function
16065 If present, this function is called to generate a head that Gnus can
16066 understand.  It is called with the article number as a parameter, and is
16067 expected to generate a nice head for the article in question.  It is
16068 called when requesting the headers of all articles.
16069
16070 @end table
16071
16072 Let's look at the most complicated example I can come up with---standard
16073 digests:
16074
16075 @example
16076 (standard-digest
16077  (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+"))
16078  (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+"))
16079  (prepare-body-function . nndoc-unquote-dashes)
16080  (body-end-function . nndoc-digest-body-end)
16081  (head-end . "^ ?$")
16082  (body-begin . "^ ?\n")
16083  (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
16084  (subtype digest guess))
16085 @end example
16086
16087 We see that all text before a 70-width line of dashes is ignored; all
16088 text after a line that starts with that @samp{^End of} is also ignored;
16089 each article begins with a 30-width line of dashes; the line separating
16090 the head from the body may contain a single space; and that the body is
16091 run through @code{nndoc-unquote-dashes} before being delivered.
16092
16093 To hook your own document definition into @code{nndoc}, use the
16094 @code{nndoc-add-type} function.  It takes two parameters---the first is
16095 the definition itself and the second (optional) parameter says where in
16096 the document type definition alist to put this definition.  The alist is
16097 traversed sequentially, and @code{nndoc-TYPE-type-p} is called for a given type @code{TYPE}.  So @code{nndoc-mmdf-type-p} is called to see whether a document
16098 is of @code{mmdf} type, and so on.  These type predicates should return
16099 @code{nil} if the document is not of the correct type; @code{t} if it is
16100 of the correct type; and a number if the document might be of the
16101 correct type.  A high number means high probability; a low number means
16102 low probability with @samp{0} being the lowest valid number.
16103
16104
16105 @node SOUP
16106 @subsection SOUP
16107 @cindex SOUP
16108 @cindex offline
16109
16110 In the PC world people often talk about ``offline'' newsreaders.  These
16111 are thingies that are combined reader/news transport monstrosities.
16112 With built-in modem programs.  Yecchh!
16113
16114 Of course, us Unix Weenie types of human beans use things like
16115 @code{uucp} and, like, @code{nntpd} and set up proper news and mail
16116 transport things like Ghod intended.  And then we just use normal
16117 newsreaders.
16118
16119 However, it can sometimes be convenient to do something that's a bit
16120 easier on the brain if you have a very slow modem, and you're not really
16121 that interested in doing things properly.
16122
16123 A file format called @sc{soup} has been developed for transporting news
16124 and mail from servers to home machines and back again.  It can be a bit
16125 fiddly.
16126
16127 First some terminology:
16128
16129 @table @dfn
16130
16131 @item server
16132 This is the machine that is connected to the outside world and where you
16133 get news and/or mail from.
16134
16135 @item home machine
16136 This is the machine that you want to do the actual reading and responding
16137 on.  It is typically not connected to the rest of the world in any way.
16138
16139 @item packet
16140 Something that contains messages and/or commands.  There are two kinds
16141 of packets:
16142
16143 @table @dfn
16144 @item message packets
16145 These are packets made at the server, and typically contain lots of
16146 messages for you to read.  These are called @file{SoupoutX.tgz} by
16147 default, where @var{x} is a number.
16148
16149 @item response packets
16150 These are packets made at the home machine, and typically contains
16151 replies that you've written.  These are called @file{SoupinX.tgz} by
16152 default, where @var{x} is a number.
16153
16154 @end table
16155
16156 @end table
16157
16158
16159 @enumerate
16160
16161 @item
16162 You log in on the server and create a @sc{soup} packet.  You can either
16163 use a dedicated @sc{soup} thingie (like the @code{awk} program), or you
16164 can use Gnus to create the packet with its @sc{soup} commands (@kbd{O
16165 s} and/or @kbd{G s b}; and then @kbd{G s p}) (@pxref{SOUP Commands}).
16166
16167 @item
16168 You transfer the packet home.  Rail, boat, car or modem will do fine.
16169
16170 @item
16171 You put the packet in your home directory.
16172
16173 @item
16174 You fire up Gnus on your home machine using the @code{nnsoup} back end as
16175 the native or secondary server.
16176
16177 @item
16178 You read articles and mail and answer and followup to the things you
16179 want (@pxref{SOUP Replies}).
16180
16181 @item
16182 You do the @kbd{G s r} command to pack these replies into a @sc{soup}
16183 packet.
16184
16185 @item
16186 You transfer this packet to the server.
16187
16188 @item
16189 You use Gnus to mail this packet out with the @kbd{G s s} command.
16190
16191 @item
16192 You then repeat until you die.
16193
16194 @end enumerate
16195
16196 So you basically have a bipartite system---you use @code{nnsoup} for
16197 reading and Gnus for packing/sending these @sc{soup} packets.
16198
16199 @menu
16200 * SOUP Commands::               Commands for creating and sending @sc{soup} packets
16201 * SOUP Groups::                 A back end for reading @sc{soup} packets.
16202 * SOUP Replies::                How to enable @code{nnsoup} to take over mail and news.
16203 @end menu
16204
16205
16206 @node SOUP Commands
16207 @subsubsection SOUP Commands
16208
16209 These are commands for creating and manipulating @sc{soup} packets.
16210
16211 @table @kbd
16212 @item G s b
16213 @kindex G s b (Group)
16214 @findex gnus-group-brew-soup
16215 Pack all unread articles in the current group
16216 (@code{gnus-group-brew-soup}).  This command understands the
16217 process/prefix convention.
16218
16219 @item G s w
16220 @kindex G s w (Group)
16221 @findex gnus-soup-save-areas
16222 Save all @sc{soup} data files (@code{gnus-soup-save-areas}).
16223
16224 @item G s s
16225 @kindex G s s (Group)
16226 @findex gnus-soup-send-replies
16227 Send all replies from the replies packet
16228 (@code{gnus-soup-send-replies}).
16229
16230 @item G s p
16231 @kindex G s p (Group)
16232 @findex gnus-soup-pack-packet
16233 Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}).
16234
16235 @item G s r
16236 @kindex G s r (Group)
16237 @findex nnsoup-pack-replies
16238 Pack all replies into a replies packet (@code{nnsoup-pack-replies}).
16239
16240 @item O s
16241 @kindex O s (Summary)
16242 @findex gnus-soup-add-article
16243 This summary-mode command adds the current article to a @sc{soup} packet
16244 (@code{gnus-soup-add-article}).  It understands the process/prefix
16245 convention (@pxref{Process/Prefix}).
16246
16247 @end table
16248
16249
16250 There are a few variables to customize where Gnus will put all these
16251 thingies:
16252
16253 @table @code
16254
16255 @item gnus-soup-directory
16256 @vindex gnus-soup-directory
16257 Directory where Gnus will save intermediate files while composing
16258 @sc{soup} packets.  The default is @file{~/SoupBrew/}.
16259
16260 @item gnus-soup-replies-directory
16261 @vindex gnus-soup-replies-directory
16262 This is what Gnus will use as a temporary directory while sending our
16263 reply packets.  @file{~/SoupBrew/SoupReplies/} is the default.
16264
16265 @item gnus-soup-prefix-file
16266 @vindex gnus-soup-prefix-file
16267 Name of the file where Gnus stores the last used prefix.  The default is
16268 @samp{gnus-prefix}.
16269
16270 @item gnus-soup-packer
16271 @vindex gnus-soup-packer
16272 A format string command for packing a @sc{soup} packet.  The default is
16273 @samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}.
16274
16275 @item gnus-soup-unpacker
16276 @vindex gnus-soup-unpacker
16277 Format string command for unpacking a @sc{soup} packet.  The default is
16278 @samp{gunzip -c %s | tar xvf -}.
16279
16280 @item gnus-soup-packet-directory
16281 @vindex gnus-soup-packet-directory
16282 Where Gnus will look for reply packets.  The default is @file{~/}.
16283
16284 @item gnus-soup-packet-regexp
16285 @vindex gnus-soup-packet-regexp
16286 Regular expression matching @sc{soup} reply packets in
16287 @code{gnus-soup-packet-directory}.
16288
16289 @end table
16290
16291
16292 @node SOUP Groups
16293 @subsubsection SOUP Groups
16294 @cindex nnsoup
16295
16296 @code{nnsoup} is the back end for reading @sc{soup} packets.  It will
16297 read incoming packets, unpack them, and put them in a directory where
16298 you can read them at leisure.
16299
16300 These are the variables you can use to customize its behavior:
16301
16302 @table @code
16303
16304 @item nnsoup-tmp-directory
16305 @vindex nnsoup-tmp-directory
16306 When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this
16307 directory.  (@file{/tmp/} by default.)
16308
16309 @item nnsoup-directory
16310 @vindex nnsoup-directory
16311 @code{nnsoup} then moves each message and index file to this directory.
16312 The default is @file{~/SOUP/}.
16313
16314 @item nnsoup-replies-directory
16315 @vindex nnsoup-replies-directory
16316 All replies will be stored in this directory before being packed into a
16317 reply packet.  The default is @file{~/SOUP/replies/"}.
16318
16319 @item nnsoup-replies-format-type
16320 @vindex nnsoup-replies-format-type
16321 The @sc{soup} format of the replies packets.  The default is @samp{?n}
16322 (rnews), and I don't think you should touch that variable.  I probably
16323 shouldn't even have documented it.  Drats!  Too late!
16324
16325 @item nnsoup-replies-index-type
16326 @vindex nnsoup-replies-index-type
16327 The index type of the replies packet.  The default is @samp{?n}, which
16328 means ``none''.  Don't fiddle with this one either!
16329
16330 @item nnsoup-active-file
16331 @vindex nnsoup-active-file
16332 Where @code{nnsoup} stores lots of information.  This is not an ``active
16333 file'' in the @code{nntp} sense; it's an Emacs Lisp file.  If you lose
16334 this file or mess it up in any way, you're dead.  The default is
16335 @file{~/SOUP/active}.
16336
16337 @item nnsoup-packer
16338 @vindex nnsoup-packer
16339 Format string command for packing a reply @sc{soup} packet.  The default
16340 is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}.
16341
16342 @item nnsoup-unpacker
16343 @vindex nnsoup-unpacker
16344 Format string command for unpacking incoming @sc{soup} packets.  The
16345 default is @samp{gunzip -c %s | tar xvf -}.
16346
16347 @item nnsoup-packet-directory
16348 @vindex nnsoup-packet-directory
16349 Where @code{nnsoup} will look for incoming packets.  The default is
16350 @file{~/}.
16351
16352 @item nnsoup-packet-regexp
16353 @vindex nnsoup-packet-regexp
16354 Regular expression matching incoming @sc{soup} packets.  The default is
16355 @samp{Soupout}.
16356
16357 @item nnsoup-always-save
16358 @vindex nnsoup-always-save
16359 If non-@code{nil}, save the replies buffer after each posted message.
16360
16361 @end table
16362
16363
16364 @node SOUP Replies
16365 @subsubsection SOUP Replies
16366
16367 Just using @code{nnsoup} won't mean that your postings and mailings end
16368 up in @sc{soup} reply packets automagically.  You have to work a bit
16369 more for that to happen.
16370
16371 @findex nnsoup-set-variables
16372 The @code{nnsoup-set-variables} command will set the appropriate
16373 variables to ensure that all your followups and replies end up in the
16374 @sc{soup} system.
16375
16376 In specific, this is what it does:
16377
16378 @lisp
16379 (setq message-send-news-function 'nnsoup-request-post)
16380 (setq message-send-mail-function 'nnsoup-request-mail)
16381 @end lisp
16382
16383 And that's it, really.  If you only want news to go into the @sc{soup}
16384 system you just use the first line.  If you only want mail to be
16385 @sc{soup}ed you use the second.
16386
16387
16388 @node Mail-To-News Gateways
16389 @subsection Mail-To-News Gateways
16390 @cindex mail-to-news gateways
16391 @cindex gateways
16392
16393 If your local @code{nntp} server doesn't allow posting, for some reason
16394 or other, you can post using one of the numerous mail-to-news gateways.
16395 The @code{nngateway} back end provides the interface.
16396
16397 Note that you can't read anything from this back end---it can only be
16398 used to post with.
16399
16400 Server variables:
16401
16402 @table @code
16403 @item nngateway-address
16404 @vindex nngateway-address
16405 This is the address of the mail-to-news gateway.
16406
16407 @item nngateway-header-transformation
16408 @vindex nngateway-header-transformation
16409 News headers often have to be transformed in some odd way or other
16410 for the mail-to-news gateway to accept it.  This variable says what
16411 transformation should be called, and defaults to
16412 @code{nngateway-simple-header-transformation}.  The function is called
16413 narrowed to the headers to be transformed and with one parameter---the
16414 gateway address.
16415
16416 This default function just inserts a new @code{To} header based on the
16417 @code{Newsgroups} header and the gateway address.
16418 For instance, an article with this @code{Newsgroups} header:
16419
16420 @example
16421 Newsgroups: alt.religion.emacs
16422 @end example
16423
16424 will get this @code{To} header inserted:
16425
16426 @example
16427 To: alt-religion-emacs@@GATEWAY
16428 @end example
16429
16430 The following pre-defined functions exist:
16431
16432 @findex nngateway-simple-header-transformation
16433 @table @code
16434
16435 @item nngateway-simple-header-transformation
16436 Creates a @code{To} header that looks like
16437 @var{newsgroup}@@@code{nngateway-address}.
16438
16439 @findex nngateway-mail2news-header-transformation
16440
16441 @item nngateway-mail2news-header-transformation
16442 Creates a @code{To} header that looks like
16443 @code{nngateway-address}.
16444
16445 Here's an example:
16446
16447 @lisp
16448 (setq gnus-post-method
16449       '(nngateway
16450         "mail2news@@replay.com"
16451         (nngateway-header-transformation
16452          nngateway-mail2news-header-transformation)))
16453 @end lisp
16454
16455 @end table
16456
16457
16458 @end table
16459
16460 So, to use this, simply say something like:
16461
16462 @lisp
16463 (setq gnus-post-method '(nngateway "GATEWAY.ADDRESS"))
16464 @end lisp
16465
16466
16467
16468 @node Combined Groups
16469 @section Combined Groups
16470
16471 Gnus allows combining a mixture of all the other group types into bigger
16472 groups.
16473
16474 @menu
16475 * Virtual Groups::              Combining articles from many groups.
16476 * Kibozed Groups::              Looking through parts of the newsfeed for articles.
16477 @end menu
16478
16479
16480 @node Virtual Groups
16481 @subsection Virtual Groups
16482 @cindex nnvirtual
16483 @cindex virtual groups
16484 @cindex merging groups
16485
16486 An @dfn{nnvirtual group} is really nothing more than a collection of
16487 other groups.
16488
16489 For instance, if you are tired of reading many small groups, you can
16490 put them all in one big group, and then grow tired of reading one
16491 big, unwieldy group.  The joys of computing!
16492
16493 You specify @code{nnvirtual} as the method.  The address should be a
16494 regexp to match component groups.
16495
16496 All marks in the virtual group will stick to the articles in the
16497 component groups.  So if you tick an article in a virtual group, the
16498 article will also be ticked in the component group from whence it
16499 came.  (And vice versa---marks from the component groups will also be
16500 shown in the virtual group.). To create an empty virtual group, run
16501 @kbd{G V} (@code{gnus-group-make-empty-virtual}) in the group buffer
16502 and edit the method regexp with @kbd{M-e}
16503 (@code{gnus-group-edit-group-method})
16504
16505 Here's an example @code{nnvirtual} method that collects all Andrea Dworkin
16506 newsgroups into one, big, happy newsgroup:
16507
16508 @lisp
16509 (nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*")
16510 @end lisp
16511
16512 The component groups can be native or foreign; everything should work
16513 smoothly, but if your computer explodes, it was probably my fault.
16514
16515 Collecting the same group from several servers might actually be a good
16516 idea if users have set the Distribution header to limit distribution.
16517 If you would like to read @samp{soc.motss} both from a server in Japan
16518 and a server in Norway, you could use the following as the group regexp:
16519
16520 @example
16521 "^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$"
16522 @end example
16523
16524 (Remember, though, that if you're creating the group with @kbd{G m}, you
16525 shouldn't double the backslashes, and you should leave off the quote
16526 characters at the beginning and the end of the string.)
16527
16528 This should work kinda smoothly---all articles from both groups should
16529 end up in this one, and there should be no duplicates.  Threading (and
16530 the rest) will still work as usual, but there might be problems with the
16531 sequence of articles.  Sorting on date might be an option here
16532 (@pxref{Selecting a Group}).
16533
16534 One limitation, however---all groups included in a virtual
16535 group have to be alive (i.e., subscribed or unsubscribed).  Killed or
16536 zombie groups can't be component groups for @code{nnvirtual} groups.
16537
16538 @vindex nnvirtual-always-rescan
16539 If the @code{nnvirtual-always-rescan} is non-@code{nil},
16540 @code{nnvirtual} will always scan groups for unread articles when
16541 entering a virtual group.  If this variable is @code{nil} (which is the
16542 default) and you read articles in a component group after the virtual
16543 group has been activated, the read articles from the component group
16544 will show up when you enter the virtual group.  You'll also see this
16545 effect if you have two virtual groups that have a component group in
16546 common.  If that's the case, you should set this variable to @code{t}.
16547 Or you can just tap @code{M-g} on the virtual group every time before
16548 you enter it---it'll have much the same effect.
16549
16550 @code{nnvirtual} can have both mail and news groups as component groups.
16551 When responding to articles in @code{nnvirtual} groups, @code{nnvirtual}
16552 has to ask the back end of the component group the article comes from
16553 whether it is a news or mail back end.  However, when you do a @kbd{^},
16554 there is typically no sure way for the component back end to know this,
16555 and in that case @code{nnvirtual} tells Gnus that the article came from a
16556 not-news back end.  (Just to be on the safe side.)
16557
16558 @kbd{C-c C-n} in the message buffer will insert the @code{Newsgroups}
16559 line from the article you respond to in these cases.
16560
16561 @code{nnvirtual} groups do not inherit anything but articles and marks
16562 from component groups---group parameters, for instance, are not
16563 inherited.
16564
16565
16566 @node Kibozed Groups
16567 @subsection Kibozed Groups
16568 @cindex nnkiboze
16569 @cindex kibozing
16570
16571 @dfn{Kibozing} is defined by @sc{oed} as ``grepping through (parts of)
16572 the news feed''.  @code{nnkiboze} is a back end that will do this for
16573 you.  Oh joy!  Now you can grind any @sc{nntp} server down to a halt
16574 with useless requests!  Oh happiness!
16575
16576 @kindex G k (Group)
16577 To create a kibozed group, use the @kbd{G k} command in the group
16578 buffer.
16579
16580 The address field of the @code{nnkiboze} method is, as with
16581 @code{nnvirtual}, a regexp to match groups to be ``included'' in the
16582 @code{nnkiboze} group.  That's where most similarities between @code{nnkiboze}
16583 and @code{nnvirtual} end.
16584
16585 In addition to this regexp detailing component groups, an @code{nnkiboze} group
16586 must have a score file to say what articles are to be included in
16587 the group (@pxref{Scoring}).
16588
16589 @kindex M-x nnkiboze-generate-groups
16590 @findex nnkiboze-generate-groups
16591 You must run @kbd{M-x nnkiboze-generate-groups} after creating the
16592 @code{nnkiboze} groups you want to have.  This command will take time.  Lots of
16593 time.  Oodles and oodles of time.  Gnus has to fetch the headers from
16594 all the articles in all the component groups and run them through the
16595 scoring process to determine if there are any articles in the groups
16596 that are to be part of the @code{nnkiboze} groups.
16597
16598 Please limit the number of component groups by using restrictive
16599 regexps.  Otherwise your sysadmin may become annoyed with you, and the
16600 @sc{nntp} site may throw you off and never let you back in again.
16601 Stranger things have happened.
16602
16603 @code{nnkiboze} component groups do not have to be alive---they can be dead,
16604 and they can be foreign.  No restrictions.
16605
16606 @vindex nnkiboze-directory
16607 The generation of an @code{nnkiboze} group means writing two files in
16608 @code{nnkiboze-directory}, which is @file{~/News/} by default.  One
16609 contains the @sc{nov} header lines for all the articles in the group,
16610 and the other is an additional @file{.newsrc} file to store information
16611 on what groups have been searched through to find component articles.
16612
16613 Articles marked as read in the @code{nnkiboze} group will have
16614 their @sc{nov} lines removed from the @sc{nov} file.
16615
16616
16617 @node Gnus Unplugged
16618 @section Gnus Unplugged
16619 @cindex offline
16620 @cindex unplugged
16621 @cindex Agent
16622 @cindex Gnus Agent
16623 @cindex Gnus Unplugged
16624
16625 In olden times (ca. February '88), people used to run their newsreaders
16626 on big machines with permanent connections to the net.  News transport
16627 was dealt with by news servers, and all the newsreaders had to do was to
16628 read news.  Believe it or not.
16629
16630 Nowadays most people read news and mail at home, and use some sort of
16631 modem to connect to the net.  To avoid running up huge phone bills, it
16632 would be nice to have a way to slurp down all the news and mail, hang up
16633 the phone, read for several hours, and then upload any responses you
16634 have to make.  And then you repeat the procedure.
16635
16636 Of course, you can use news servers for doing this as well.  I've used
16637 @code{inn} together with @code{slurp}, @code{pop} and @code{sendmail}
16638 for some years, but doing that's a bore.  Moving the news server
16639 functionality up to the newsreader makes sense if you're the only person
16640 reading news on a machine.
16641
16642 Setting up Gnus as an ``offline'' newsreader is quite simple.  In
16643 fact, you don't even have to configure anything.
16644
16645 Of course, to use it as such, you have to learn a few new commands.
16646
16647 @menu
16648 * Agent Basics::                How it all is supposed to work.
16649 * Agent Categories::            How to tell the Gnus Agent what to download.
16650 * Agent Commands::              New commands for all the buffers.
16651 * Agent as Cache::              The Agent is a big cache too.
16652 * Agent Expiry::                How to make old articles go away.
16653 * Agent Regeneration::          How to recover from lost connections and other accidents.
16654 * Agent and IMAP::              How to use the Agent with IMAP.
16655 * Outgoing Messages::           What happens when you post/mail something?
16656 * Agent Variables::             Customizing is fun.
16657 * Example Setup::               An example @file{.gnus.el} file for offline people.
16658 * Batching Agents::             How to fetch news from a @code{cron} job.
16659 * Agent Caveats::               What you think it'll do and what it does.
16660 @end menu
16661
16662
16663 @node Agent Basics
16664 @subsection Agent Basics
16665
16666 First, let's get some terminology out of the way.
16667
16668 The Gnus Agent is said to be @dfn{unplugged} when you have severed the
16669 connection to the net (and notified the Agent that this is the case).
16670 When the connection to the net is up again (and Gnus knows this), the
16671 Agent is @dfn{plugged}.
16672
16673 The @dfn{local} machine is the one you're running on, and which isn't
16674 connected to the net continuously.
16675
16676 @dfn{Downloading} means fetching things from the net to your local
16677 machine.  @dfn{Uploading} is doing the opposite.
16678
16679 Let's take a typical Gnus session using the Agent.
16680
16681 @itemize @bullet
16682
16683 @item
16684 @findex gnus-unplugged
16685 You start Gnus with @code{gnus-unplugged}.  This brings up the Gnus
16686 Agent in a disconnected state.  You can read all the news that you have
16687 already fetched while in this mode.
16688
16689 @item
16690 You then decide to see whether any new news has arrived.  You connect
16691 your machine to the net (using PPP or whatever), and then hit @kbd{J j}
16692 to make Gnus become @dfn{plugged} and use @kbd{g} to check for new mail
16693 as usual.  To check for new mail in unplugged mode, see (@pxref{Mail
16694 Source Specifiers}).
16695
16696 @item
16697 You can then read the new news immediately, or you can download the news
16698 onto your local machine.  If you want to do the latter, you press @kbd{g}
16699 to check if there are any new news and then @kbd{J
16700 s} to fetch all the eligible articles in all the groups.  (To let Gnus
16701 know which articles you want to download, @pxref{Agent Categories}.)
16702
16703 @item
16704 After fetching the articles, you press @kbd{J j} to make Gnus become
16705 unplugged again, and you shut down the PPP thing (or whatever).  And
16706 then you read the news offline.
16707
16708 @item
16709 And then you go to step 2.
16710 @end itemize
16711
16712 Here are some things you should do the first time (or so) that you use
16713 the Agent.
16714
16715 @itemize @bullet
16716
16717 @item
16718 Decide which servers should be covered by the Agent.  If you have a mail
16719 back end, it would probably be nonsensical to have it covered by the
16720 Agent.  Go to the server buffer (@kbd{^} in the group buffer) and press
16721 @kbd{J a} on the server (or servers) that you wish to have covered by the
16722 Agent (@pxref{Server Agent Commands}), or @kbd{J r} on automatically
16723 added servers you do not wish to have covered by the Agent.  By default,
16724 all @code{nntp} and @code{nnimap} groups in @code{gnus-select-method} and
16725 @code{gnus-secondary-select-methods} are agentized.
16726
16727 @item
16728 Decide on download policy.  @xref{Agent Categories}.
16729
16730 @item
16731 Uhm... that's it.
16732 @end itemize
16733
16734
16735 @node Agent Categories
16736 @subsection Agent Categories
16737
16738 One of the main reasons to integrate the news transport layer into the
16739 newsreader is to allow greater control over what articles to download.
16740 There's not much point in downloading huge amounts of articles, just to
16741 find out that you're not interested in reading any of them.  It's better
16742 to be somewhat more conservative in choosing what to download, and then
16743 mark the articles for downloading manually if it should turn out that
16744 you're interested in the articles anyway.
16745
16746 The main way to control what is to be downloaded is to create a
16747 @dfn{category} and then assign some (or all) groups to this category.
16748 Groups that do not belong in any other category belong to the
16749 @code{default} category.  Gnus has its own buffer for creating and
16750 managing categories.
16751
16752 @menu
16753 * Category Syntax::             What a category looks like.
16754 * Category Buffer::             A buffer for maintaining categories.
16755 * Category Variables::          Customize'r'Us.
16756 @end menu
16757
16758
16759 @node Category Syntax
16760 @subsubsection Category Syntax
16761
16762 A category consists of two things.
16763
16764 @enumerate
16765 @item
16766 A predicate which (generally) gives a rough outline of which articles
16767 are eligible for downloading; and
16768
16769 @item
16770 a score rule which (generally) gives you a finer granularity when
16771 deciding what articles to download.  (Note that this @dfn{download
16772 score} is not necessarily related to normal scores.)
16773 @end enumerate
16774
16775 A predicate in its simplest form can be a single predicate such as
16776 @code{true} or @code{false}.  These two will download every available
16777 article or nothing respectively.  In the case of these two special
16778 predicates an additional score rule is superfluous.
16779
16780 Predicates of @code{high} or @code{low} download articles in respect of
16781 their scores in relationship to @code{gnus-agent-high-score} and
16782 @code{gnus-agent-low-score} as described below.
16783
16784 To gain even finer control of what is to be regarded eligible for
16785 download a predicate can consist of a number of predicates with logical
16786 operators sprinkled in between.
16787
16788 Perhaps some examples are in order.
16789
16790 Here's a simple predicate.  (It's the default predicate, in fact, used
16791 for all groups that don't belong to any other category.)
16792
16793 @lisp
16794 short
16795 @end lisp
16796
16797 Quite simple, eh?  This predicate is true if and only if the article is
16798 short (for some value of ``short'').
16799
16800 Here's a more complex predicate:
16801
16802 @lisp
16803 (or high
16804     (and
16805      (not low)
16806      (not long)))
16807 @end lisp
16808
16809 This means that an article should be downloaded if it has a high score,
16810 or if the score is not low and the article is not long.  You get the
16811 drift.
16812
16813 The available logical operators are @code{or}, @code{and} and
16814 @code{not}.  (If you prefer, you can use the more ``C''-ish operators
16815 @samp{|}, @code{&} and @code{!} instead.)
16816
16817 The following predicates are pre-defined, but if none of these fit what
16818 you want to do, you can write your own.
16819
16820 @table @code
16821 @item short
16822 True iff the article is shorter than @code{gnus-agent-short-article}
16823 lines; default 100.
16824
16825 @item long
16826 True iff the article is longer than @code{gnus-agent-long-article}
16827 lines; default 200.
16828
16829 @item low
16830 True iff the article has a download score less than
16831 @code{gnus-agent-low-score}; default 0.
16832
16833 @item high
16834 True iff the article has a download score greater than
16835 @code{gnus-agent-high-score}; default 0.
16836
16837 @item spam
16838 True iff the Gnus Agent guesses that the article is spam.  The
16839 heuristics may change over time, but at present it just computes a
16840 checksum and sees whether articles match.
16841
16842 @item true
16843 Always true.
16844
16845 @item false
16846 Always false.
16847 @end table
16848
16849 If you want to create your own predicate function, here's what you have
16850 to know:  The functions are called with no parameters, but the
16851 @code{gnus-headers} and @code{gnus-score} dynamic variables are bound to
16852 useful values.
16853
16854 For example, you could decide that you don't want to download articles
16855 that were posted more than a certain number of days ago (e.g. posted
16856 more than @code{gnus-agent-expire-days} ago) you might write a function
16857 something along the lines of the following:
16858
16859 @lisp
16860 (defun my-article-old-p ()
16861   "Say whether an article is old."
16862   (< (time-to-days (date-to-time (mail-header-date gnus-headers)))
16863      (- (time-to-days (current-time)) gnus-agent-expire-days)))
16864 @end lisp
16865
16866 with the predicate then defined as:
16867
16868 @lisp
16869 (not my-article-old-p)
16870 @end lisp
16871
16872 or you could append your predicate to the predefined
16873 @code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or
16874 wherever.
16875
16876 @lisp
16877 (require 'gnus-agent)
16878 (setq  gnus-category-predicate-alist
16879   (append gnus-category-predicate-alist
16880          '((old . my-article-old-p))))
16881 @end lisp
16882
16883 and simply specify your predicate as:
16884
16885 @lisp
16886 (not old)
16887 @end lisp
16888
16889 If/when using something like the above, be aware that there are many
16890 misconfigured systems/mailers out there and so an article's date is not
16891 always a reliable indication of when it was posted.  Hell, some people
16892 just don't give a damn.
16893
16894 The above predicates apply to *all* the groups which belong to the
16895 category.  However, if you wish to have a specific predicate for an
16896 individual group within a category, or you're just too lazy to set up a
16897 new category, you can enter a group's individual predicate in it's group
16898 parameters like so:
16899
16900 @lisp
16901 (agent-predicate . short)
16902 @end lisp
16903
16904 This is the group parameter equivalent of the agent category default.
16905 Note that when specifying a single word predicate like this, the
16906 @code{agent-predicate} specification must be in dotted pair notation.
16907
16908 The equivalent of the longer example from above would be:
16909
16910 @lisp
16911 (agent-predicate or high (and (not low) (not long)))
16912 @end lisp
16913
16914 The outer parenthesis required in the category specification are not
16915 entered here as, not being in dotted pair notation, the value of the
16916 predicate is assumed to be a list.
16917
16918
16919 Now, the syntax of the download score is the same as the syntax of
16920 normal score files, except that all elements that require actually
16921 seeing the article itself are verboten.  This means that only the
16922 following headers can be scored on: @code{Subject}, @code{From},
16923 @code{Date}, @code{Message-ID}, @code{References}, @code{Chars},
16924 @code{Lines}, and @code{Xref}.
16925
16926 As with predicates, the specification of the @code{download score rule}
16927 to use in respect of a group can be in either the category definition if
16928 it's to be applicable to all groups in therein, or a group's parameters
16929 if it's to be specific to that group.
16930
16931 In both of these places the @code{download score rule} can take one of
16932 three forms:
16933
16934 @enumerate
16935 @item
16936 Score rule
16937
16938 This has the same syntax as a normal gnus score file except only a
16939 subset of scoring keywords are available as mentioned above.
16940
16941 example:
16942
16943 @itemize @bullet
16944 @item
16945 Category specification
16946
16947 @lisp
16948 (("from"
16949        ("Lars Ingebrigtsen" 1000000 nil s))
16950 ("lines"
16951        (500 -100 nil <)))
16952 @end lisp
16953
16954 @item
16955 Group Parameter specification
16956
16957 @lisp
16958 (agent-score ("from"
16959                    ("Lars Ingebrigtsen" 1000000 nil s))
16960              ("lines"
16961                    (500 -100 nil <)))
16962 @end lisp
16963
16964 Again, note the omission of the outermost parenthesis here.
16965 @end itemize
16966
16967 @item
16968 Agent score file
16969
16970 These score files must *only* contain the permitted scoring keywords
16971 stated above.
16972
16973 example:
16974
16975 @itemize @bullet
16976 @item
16977 Category specification
16978
16979 @lisp
16980 ("~/News/agent.SCORE")
16981 @end lisp
16982
16983 or perhaps
16984
16985 @lisp
16986 ("~/News/agent.SCORE" "~/News/agent.group.SCORE")
16987 @end lisp
16988
16989 @item
16990 Group Parameter specification
16991
16992 @lisp
16993 (agent-score "~/News/agent.SCORE")
16994 @end lisp
16995
16996 Additional score files can be specified as above.  Need I say anything
16997 about parenthesis?
16998 @end itemize
16999
17000 @item
17001 Use @code{normal} score files
17002
17003 If you don't want to maintain two sets of scoring rules for a group, and
17004 your desired @code{downloading} criteria for a group are the same as your
17005 @code{reading} criteria then you can tell the agent to refer to your
17006 @code{normal} score files when deciding what to download.
17007
17008 These directives in either the category definition or a group's
17009 parameters will cause the agent to read in all the applicable score
17010 files for a group, *filtering out* those sections that do not
17011 relate to one of the permitted subset of scoring keywords.
17012
17013 @itemize @bullet
17014 @item
17015 Category Specification
17016
17017 @lisp
17018 file
17019 @end lisp
17020
17021 @item
17022 Group Parameter specification
17023
17024 @lisp
17025 (agent-score . file)
17026 @end lisp
17027 @end itemize
17028 @end enumerate
17029
17030 @node Category Buffer
17031 @subsubsection Category Buffer
17032
17033 You'd normally do all category maintenance from the category buffer.
17034 When you enter it for the first time (with the @kbd{J c} command from
17035 the group buffer), you'll only see the @code{default} category.
17036
17037 The following commands are available in this buffer:
17038
17039 @table @kbd
17040 @item q
17041 @kindex q (Category)
17042 @findex gnus-category-exit
17043 Return to the group buffer (@code{gnus-category-exit}).
17044
17045 @item k
17046 @kindex k (Category)
17047 @findex gnus-category-kill
17048 Kill the current category (@code{gnus-category-kill}).
17049
17050 @item c
17051 @kindex c (Category)
17052 @findex gnus-category-copy
17053 Copy the current category (@code{gnus-category-copy}).
17054
17055 @item a
17056 @kindex a (Category)
17057 @findex gnus-category-add
17058 Add a new category (@code{gnus-category-add}).
17059
17060 @item p
17061 @kindex p (Category)
17062 @findex gnus-category-edit-predicate
17063 Edit the predicate of the current category
17064 (@code{gnus-category-edit-predicate}).
17065
17066 @item g
17067 @kindex g (Category)
17068 @findex gnus-category-edit-groups
17069 Edit the list of groups belonging to the current category
17070 (@code{gnus-category-edit-groups}).
17071
17072 @item s
17073 @kindex s (Category)
17074 @findex gnus-category-edit-score
17075 Edit the download score rule of the current category
17076 (@code{gnus-category-edit-score}).
17077
17078 @item l
17079 @kindex l (Category)
17080 @findex gnus-category-list
17081 List all the categories (@code{gnus-category-list}).
17082 @end table
17083
17084
17085 @node Category Variables
17086 @subsubsection Category Variables
17087
17088 @table @code
17089 @item gnus-category-mode-hook
17090 @vindex gnus-category-mode-hook
17091 Hook run in category buffers.
17092
17093 @item gnus-category-line-format
17094 @vindex gnus-category-line-format
17095 Format of the lines in the category buffer (@pxref{Formatting
17096 Variables}).  Valid elements are:
17097
17098 @table @samp
17099 @item c
17100 The name of the category.
17101
17102 @item g
17103 The number of groups in the category.
17104 @end table
17105
17106 @item gnus-category-mode-line-format
17107 @vindex gnus-category-mode-line-format
17108 Format of the category mode line (@pxref{Mode Line Formatting}).
17109
17110 @item gnus-agent-short-article
17111 @vindex gnus-agent-short-article
17112 Articles that have fewer lines than this are short.  Default 100.
17113
17114 @item gnus-agent-long-article
17115 @vindex gnus-agent-long-article
17116 Articles that have more lines than this are long.  Default 200.
17117
17118 @item gnus-agent-low-score
17119 @vindex gnus-agent-low-score
17120 Articles that have a score lower than this have a low score.  Default
17121 0.
17122
17123 @item gnus-agent-high-score
17124 @vindex gnus-agent-high-score
17125 Articles that have a score higher than this have a high score.  Default
17126 0.
17127
17128 @end table
17129
17130
17131 @node Agent Commands
17132 @subsection Agent Commands
17133 @findex gnus-agent-toggle-plugged
17134 @kindex J j (Agent)
17135
17136 All the Gnus Agent commands are on the @kbd{J} submap.  The @kbd{J j}
17137 (@code{gnus-agent-toggle-plugged}) command works in all modes, and
17138 toggles the plugged/unplugged state of the Gnus Agent.
17139
17140
17141 @menu
17142 * Group Agent Commands::        Configure groups and fetch their contents.
17143 * Summary Agent Commands::      Manually select then fetch specific articles.
17144 * Server Agent Commands::       Select the servers that are supported by the agent.
17145 @end menu
17146
17147
17148
17149
17150 @node Group Agent Commands
17151 @subsubsection Group Agent Commands
17152
17153 @table @kbd
17154 @item J u
17155 @kindex J u (Agent Group)
17156 @findex gnus-agent-fetch-groups
17157 Fetch all eligible articles in the current group
17158 (@code{gnus-agent-fetch-groups}).
17159
17160 @item J c
17161 @kindex J c (Agent Group)
17162 @findex gnus-enter-category-buffer
17163 Enter the Agent category buffer (@code{gnus-enter-category-buffer}).
17164
17165 @item J s
17166 @kindex J s (Agent Group)
17167 @findex gnus-agent-fetch-session
17168 Fetch all eligible articles in all groups
17169 (@code{gnus-agent-fetch-session}).
17170
17171 @item J S
17172 @kindex J S (Agent Group)
17173 @findex gnus-group-send-queue
17174 Send all sendable messages in the queue group
17175 (@code{gnus-group-send-queue}).  @xref{Drafts}.
17176
17177 @item J a
17178 @kindex J a (Agent Group)
17179 @findex gnus-agent-add-group
17180 Add the current group to an Agent category
17181 (@code{gnus-agent-add-group}).  This command understands the
17182 process/prefix convention (@pxref{Process/Prefix}).
17183
17184 @item J r
17185 @kindex J r (Agent Group)
17186 @findex gnus-agent-remove-group
17187 Remove the current group from its category, if any
17188 (@code{gnus-agent-remove-group}).  This command understands the
17189 process/prefix convention (@pxref{Process/Prefix}).
17190
17191 @item J Y
17192 @kindex J Y (Agent Group)
17193 @findex gnus-agent-synchronize-flags
17194 Synchronize flags changed while unplugged with remote server, if any.
17195
17196
17197 @end table
17198
17199
17200 @node Summary Agent Commands
17201 @subsubsection Summary Agent Commands
17202
17203 @table @kbd
17204 @item J #
17205 @kindex J # (Agent Summary)
17206 @findex gnus-agent-mark-article
17207 Mark the article for downloading (@code{gnus-agent-mark-article}).
17208
17209 @item J M-#
17210 @kindex J M-# (Agent Summary)
17211 @findex gnus-agent-unmark-article
17212 Remove the downloading mark from the article
17213 (@code{gnus-agent-unmark-article}).
17214
17215 @cindex %
17216 @item @@
17217 @kindex @@ (Agent Summary)
17218 @findex gnus-agent-toggle-mark
17219 Toggle whether to download the article
17220 (@code{gnus-agent-toggle-mark}).  The dowload mark is @samp{%} by
17221 default. 
17222
17223 @item J c
17224 @kindex J c (Agent Summary)
17225 @findex gnus-agent-catchup
17226 Mark all articles as read (@code{gnus-agent-catchup}) that are neither cached, downloaded, nor downloadable.
17227
17228 @item J S
17229 @kindex J S (Agent Summary)
17230 @findex gnus-agent-fetch-group
17231 Download all eligible (See @pxref{Agent Categories}) articles in this group.
17232 (@code{gnus-agent-fetch-group}).
17233
17234 @item J s
17235 @kindex J s (Agent Summary)
17236 @findex gnus-agent-fetch-series
17237 Download all processable articles in this group.
17238 (@code{gnus-agent-fetch-series}).
17239
17240 @item J u
17241 @kindex J u (Agent Summary)
17242 @findex gnus-agent-summary-fetch-group
17243 Download all downloadable articles in the current group
17244 (@code{gnus-agent-summary-fetch-group}).
17245
17246 @end table
17247
17248
17249 @node Server Agent Commands
17250 @subsubsection Server Agent Commands
17251
17252 @table @kbd
17253 @item J a
17254 @kindex J a (Agent Server)
17255 @findex gnus-agent-add-server
17256 Add the current server to the list of servers covered by the Gnus Agent
17257 (@code{gnus-agent-add-server}).
17258
17259 @item J r
17260 @kindex J r (Agent Server)
17261 @findex gnus-agent-remove-server
17262 Remove the current server from the list of servers covered by the Gnus
17263 Agent (@code{gnus-agent-remove-server}).
17264
17265 @end table
17266
17267
17268 @node Agent as Cache
17269 @subsection Agent as Cache
17270
17271 When Gnus is plugged, it is not efficient to download headers or
17272 articles from the server again, if they are already stored in the
17273 Agent.  So, Gnus normally only downloads headers once, and stores them
17274 in the Agent.  These headers are later used when generating the summary
17275 buffer, regardless of whether you are plugged or unplugged.  Articles
17276 are not cached in the Agent by default though (that would potentially
17277 consume lots of disk space), but if you have already downloaded an
17278 article into the Agent, Gnus will not download the article from the
17279 server again but use the locally stored copy instead.
17280
17281 This behaviour can be controlled by @code{gnus-agent-cache}
17282 (@pxref{Agent Variables}).
17283
17284 @node Agent Expiry
17285 @subsection Agent Expiry
17286
17287 @vindex gnus-agent-expire-days
17288 @findex gnus-agent-expire
17289 @kindex M-x gnus-agent-expire
17290 @cindex Agent expiry
17291 @cindex Gnus Agent expiry
17292 @cindex expiry
17293
17294 @code{nnagent} doesn't handle expiry.  Instead, there's a special
17295 @code{gnus-agent-expire} command that will expire all read articles that
17296 are older than @code{gnus-agent-expire-days} days.  It can be run
17297 whenever you feel that you're running out of space.  It's not
17298 particularly fast or efficient, and it's not a particularly good idea to
17299 interrupt it (with @kbd{C-g} or anything else) once you've started it.
17300
17301 Note that other functions, e.g. @code{gnus-request-expire-articles},
17302 might run @code{gnus-agent-expire} for you to keep the agent 
17303 synchronized with the group.
17304
17305 @code{gnus-agent-expire-days} can also be a list of regexp/day pairs.
17306 The regexps will be matched against group names to allow differing
17307 expiry in different groups.
17308
17309 @lisp
17310 (setq gnus-agent-expire-days
17311       '(("alt\\." 7)
17312         (".*binary" 1)
17313         ("." 21)))
17314 @end lisp
17315
17316 If you use the list form, the last element must always be the default
17317 method---it must always match all groups. Also, for a regexp to match,
17318 it must match from the beginning of the group's name.
17319
17320 @vindex gnus-agent-expire-all
17321 If @code{gnus-agent-expire-all} is non-@code{nil}, this command will
17322 expire all articles---unread, read, ticked and dormant.  If @code{nil}
17323 (which is the default), only read articles are eligible for expiry, and
17324 unread, ticked and dormant articles will be kept indefinitely.
17325
17326 If you find that some articles eligible for expiry are never expired,
17327 perhaps some Gnus Agent files are corrupted.  There's a special
17328 @code{gnus-agent-regenerate} command to fix possible problems.
17329
17330 @node Agent Regeneration
17331 @subsection Agent Regeneration
17332
17333 @cindex Agent Regeneration
17334 @cindex Gnus Agent Regeneration
17335 @cindex regeneration
17336
17337 The local data structures used by @code{nnagent} may become corrupted
17338 due to certain exceptional conditions.  When this happens,
17339 @code{nnagent} functionality may degrade or even fail.  The solution
17340 to this problem is to repair the local data structures by removing all
17341 internal inconsistencies.
17342
17343 For example, if your connection to your server is lost while
17344 downloaded articles into the agent, the local data structures will not
17345 know about articles downloaded prior to the connection failure.
17346 Running @code{gnus-agent-regenerate} or
17347 @code{gnus-agent-regenerate-group} will update the data structures
17348 such that you don't need to download these articles a second time.
17349
17350 @findex gnus-agent-regenerate
17351 @kindex M-x gnus-agent-regenerate
17352 The command @code{gnus-agent-regenerate} will perform
17353 @code{gnus-agent-regenerate-group} on every agentized group.  While
17354 you can run @code{gnus-agent-regenerate} in any buffer, it is strongly
17355 recommended that you first close all summary buffers.
17356
17357 @findex gnus-agent-regenerate-group
17358 @kindex M-x gnus-agent-regenerate-group
17359 The command @code{gnus-agent-regenerate-group} uses the local copies
17360 of individual articles to repair the local NOV(header) database.  It
17361 then updates the internal data structures that document which articles
17362 are stored locally.  An optional argument will mark articles in the
17363 agent as unread.
17364
17365 @node Agent and IMAP
17366 @subsection Agent and IMAP
17367
17368 The Agent works with any Gnus back end, including nnimap.  However,
17369 since there are some conceptual differences between @sc{nntp} and
17370 @sc{imap}, this section (should) provide you with some information to
17371 make Gnus Agent work smoother as a @sc{imap} Disconnected Mode client.
17372
17373 The first thing to keep in mind is that all flags (read, ticked, etc)
17374 are kept on the @sc{imap} server, rather than in @file{.newsrc} as is the
17375 case for nntp.  Thus Gnus need to remember flag changes when
17376 disconnected, and synchronize these flags when you plug back in.
17377
17378 Gnus keeps track of flag changes when reading nnimap groups under the
17379 Agent.  When you plug back in, Gnus will check if you have any changed
17380 any flags and ask if you wish to synchronize these with the server.
17381 The behavior is customizable by @code{gnus-agent-synchronize-flags}.
17382
17383 @vindex gnus-agent-synchronize-flags
17384 If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
17385 never automatically synchronize flags.  If it is @code{ask}, which is
17386 the default, the Agent will check if you made any changes and if so
17387 ask if you wish to synchronize these when you re-connect.  If it has
17388 any other value, all flags will be synchronized automatically.
17389
17390 If you do not wish to synchronize flags automatically when you
17391 re-connect, you can do it manually with the
17392 @code{gnus-agent-synchronize-flags} command that is bound to @kbd{J Y}
17393 in the group buffer.
17394
17395 Some things are currently not implemented in the Agent that you'd might
17396 expect from a disconnected @sc{imap} client, including:
17397
17398 @itemize @bullet
17399
17400 @item
17401 Copying/moving articles into nnimap groups when unplugged.
17402
17403 @item
17404 Creating/deleting nnimap groups when unplugged.
17405
17406 @end itemize
17407
17408 Technical note: the synchronization algorithm does not work by "pushing"
17409 all local flags to the server, but rather incrementally update the
17410 server view of flags by changing only those flags that were changed by
17411 the user.  Thus, if you set one flag on a article, quit the group and
17412 re-select the group and remove the flag; the flag will be set and
17413 removed from the server when you "synchronize".  The queued flag
17414 operations can be found in the per-server @code{flags} file in the Agent
17415 directory.  It's emptied when you synchronize flags.
17416
17417
17418 @node Outgoing Messages
17419 @subsection Outgoing Messages
17420
17421 When Gnus is unplugged, all outgoing messages (both mail and news) are
17422 stored in the draft group ``queue'' (@pxref{Drafts}).  You can view
17423 them there after posting, and edit them at will.
17424
17425 When Gnus is plugged again, you can send the messages either from the
17426 draft group with the special commands available there, or you can use
17427 the @kbd{J S} command in the group buffer to send all the sendable
17428 messages in the draft group.
17429
17430
17431
17432 @node Agent Variables
17433 @subsection Agent Variables
17434
17435 @table @code
17436 @item gnus-agent-directory
17437 @vindex gnus-agent-directory
17438 Where the Gnus Agent will store its files.  The default is
17439 @file{~/News/agent/}.
17440
17441 @item gnus-agent-handle-level
17442 @vindex gnus-agent-handle-level
17443 Groups on levels (@pxref{Group Levels}) higher than this variable will
17444 be ignored by the Agent.  The default is @code{gnus-level-subscribed},
17445 which means that only subscribed group will be considered by the Agent
17446 by default.
17447
17448 @item gnus-agent-plugged-hook
17449 @vindex gnus-agent-plugged-hook
17450 Hook run when connecting to the network.
17451
17452 @item gnus-agent-unplugged-hook
17453 @vindex gnus-agent-unplugged-hook
17454 Hook run when disconnecting from the network.
17455
17456 @item gnus-agent-fetched-hook
17457 @vindex gnus-agent-fetched-hook
17458 Hook run when after finishing fetching articles.
17459
17460 @item gnus-agent-cache
17461 @vindex gnus-agent-cache
17462 Variable to control whether use the locally stored @sc{nov} and
17463 articles when plugged, e.g. essentially using the Agent as a cache.
17464 The default is non-nil, which means to use the Agent as a cache.
17465
17466 @item gnus-agent-go-online
17467 @vindex gnus-agent-go-online
17468 If @code{gnus-agent-go-online} is @code{nil}, the Agent will never
17469 automatically switch offline servers into online status.  If it is
17470 @code{ask}, the default, the Agent will ask if you wish to switch
17471 offline servers into online status when you re-connect.  If it has any
17472 other value, all offline servers will be automatically switched into
17473 online status.
17474
17475 @item gnus-agent-mark-unread-after-downloaded
17476 @vindex gnus-agent-mark-unread-after-downloaded
17477 If @code{gnus-agent-mark-unread-after-downloaded} is non-@code{nil},
17478 mark articles as unread after downloading.  The default is t.
17479
17480 @item gnus-agent-consider-all-articles
17481 @vindex gnus-agent-consider-all-articles
17482 If @code{gnus-agent-consider-all-articles} is non-@code{nil}, the
17483 agent will fetch all missing headers.  When @code{nil}, the agent will
17484 fetch only new headers. The default is @code{nil}.
17485
17486 @item gnus-agent-max-fetch-size
17487 @vindex gnus-agent-max-fetch-size
17488 The agent fetches articles into a temporary buffer prior to parsing
17489 them into individual files.  To avoid exceeding the max. buffer size,
17490 the agent alternates between fetching and parsing until all articles
17491 have been fetched.  @code{gnus-agent-max-fetch-size} provides a size
17492 limit to control how often the cycling occurs.  A large value improves
17493 performance.  A small value minimizes the time lost should the
17494 connection be lost while fetching (You may need to run
17495 @code{gnus-agent-regenerate-group} to update the group's state.
17496 However, all articles parsed prior to loosing the connection will be
17497 available while unplugged).
17498
17499 @item gnus-server-unopen-status
17500 @vindex gnus-server-unopen-status
17501 Perhaps not a Agent variable, but closely related to the Agent, this
17502 variable says what will happen if Gnus cannot open a server.  If the
17503 Agent is enabled, the default, @code{nil}, makes Gnus ask the user
17504 whether to deny the server or whether to unplug the agent.  If the
17505 Agent is disabled, Gnus always simply deny the server.  Other choices
17506 for this variable include @code{denied} and @code{offline} the latter
17507 is only valid if the Agent is used.
17508
17509 @end table
17510
17511
17512 @node Example Setup
17513 @subsection Example Setup
17514
17515 If you don't want to read this manual, and you have a fairly standard
17516 setup, you may be able to use something like the following as your
17517 @file{.gnus.el} file to get started.
17518
17519 @lisp
17520 ;;; Define how Gnus is to fetch news.  We do this over @sc{nntp}
17521 ;;; from your ISP's server.
17522 (setq gnus-select-method '(nntp "news.your-isp.com"))
17523
17524 ;;; Define how Gnus is to read your mail.  We read mail from
17525 ;;; your ISP's POP server.
17526 (setq mail-sources '((pop :server "pop.your-isp.com")))
17527
17528 ;;; Say how Gnus is to store the mail.  We use nnml groups.
17529 (setq gnus-secondary-select-methods '((nnml "")))
17530
17531 ;;; Make Gnus into an offline newsreader.
17532 ;;; (gnus-agentize) ; The obsolete setting.
17533 ;;; (setq gnus-agent t) ; Now the default.
17534 @end lisp
17535
17536 That should be it, basically.  Put that in your @file{~/.gnus.el} file,
17537 edit to suit your needs, start up PPP (or whatever), and type @kbd{M-x
17538 gnus}.
17539
17540 If this is the first time you've run Gnus, you will be subscribed
17541 automatically to a few default newsgroups.  You'll probably want to
17542 subscribe to more groups, and to do that, you have to query the
17543 @sc{nntp} server for a complete list of groups with the @kbd{A A}
17544 command.  This usually takes quite a while, but you only have to do it
17545 once.
17546
17547 After reading and parsing a while, you'll be presented with a list of
17548 groups.  Subscribe to the ones you want to read with the @kbd{u}
17549 command.  @kbd{l} to make all the killed groups disappear after you've
17550 subscribe to all the groups you want to read.  (@kbd{A k} will bring
17551 back all the killed groups.)
17552
17553 You can now read the groups at once, or you can download the articles
17554 with the @kbd{J s} command.  And then read the rest of this manual to
17555 find out which of the other gazillion things you want to customize.
17556
17557
17558 @node Batching Agents
17559 @subsection Batching Agents
17560 @findex gnus-agent-batch
17561
17562 Having the Gnus Agent fetch articles (and post whatever messages you've
17563 written) is quite easy once you've gotten things set up properly.  The
17564 following shell script will do everything that is necessary:
17565
17566 You can run a complete batch command from the command line with the
17567 following incantation:
17568
17569 @example
17570 #!/bin/sh
17571 emacs -batch -l ~/.emacs -f -l ~/.gnus.el gnus-agent-batch >/dev/null 2>&1
17572 @end example
17573
17574
17575 @node Agent Caveats
17576 @subsection Agent Caveats
17577
17578 The Gnus Agent doesn't seem to work like most other offline
17579 newsreaders.  Here are some common questions that some imaginary people
17580 may ask:
17581
17582 @table @dfn
17583 @item If I read an article while plugged, do they get entered into the Agent?
17584
17585 @strong{No}.  If you want this behaviour, add
17586 @code{gnus-agent-fetch-selected-article} to
17587 @code{gnus-select-article-hook}.
17588
17589 @item If I read an article while plugged, and the article already exists in the Agent, will it get downloaded once more?
17590
17591 @strong{No}, unless @code{gnus-agent-cache} is `nil'.
17592
17593 @end table
17594
17595 In short, when Gnus is unplugged, it only looks into the locally stored
17596 articles; when it's plugged, it talks to your ISP and may also use the
17597 locally stored articles.
17598
17599
17600 @node Scoring
17601 @chapter Scoring
17602 @cindex scoring
17603
17604 Other people use @dfn{kill files}, but we here at Gnus Towers like
17605 scoring better than killing, so we'd rather switch than fight.  They do
17606 something completely different as well, so sit up straight and pay
17607 attention!
17608
17609 @vindex gnus-summary-mark-below
17610 All articles have a default score (@code{gnus-summary-default-score}),
17611 which is 0 by default.  This score may be raised or lowered either
17612 interactively or by score files.  Articles that have a score lower than
17613 @code{gnus-summary-mark-below} are marked as read.
17614
17615 Gnus will read any @dfn{score files} that apply to the current group
17616 before generating the summary buffer.
17617
17618 There are several commands in the summary buffer that insert score
17619 entries based on the current article.  You can, for instance, ask Gnus to
17620 lower or increase the score of all articles with a certain subject.
17621
17622 There are two sorts of scoring entries: Permanent and temporary.
17623 Temporary score entries are self-expiring entries.  Any entries that are
17624 temporary and have not been used for, say, a week, will be removed
17625 silently to help keep the sizes of the score files down.
17626
17627 @menu
17628 * Summary Score Commands::      Adding score entries for the current group.
17629 * Group Score Commands::        General score commands.
17630 * Score Variables::             Customize your scoring.  (My, what terminology).
17631 * Score File Format::           What a score file may contain.
17632 * Score File Editing::          You can edit score files by hand as well.
17633 * Adaptive Scoring::            Big Sister Gnus knows what you read.
17634 * Home Score File::             How to say where new score entries are to go.
17635 * Followups To Yourself::       Having Gnus notice when people answer you.
17636 * Scoring On Other Headers::    Scoring on non-standard headers.
17637 * Scoring Tips::                How to score effectively.
17638 * Reverse Scoring::             That problem child of old is not problem.
17639 * Global Score Files::          Earth-spanning, ear-splitting score files.
17640 * Kill Files::                  They are still here, but they can be ignored.
17641 * Converting Kill Files::       Translating kill files to score files.
17642 * GroupLens::                   Getting predictions on what you like to read.
17643 * Advanced Scoring::            Using logical expressions to build score rules.
17644 * Score Decays::                It can be useful to let scores wither away.
17645 @end menu
17646
17647
17648 @node Summary Score Commands
17649 @section Summary Score Commands
17650 @cindex score commands
17651
17652 The score commands that alter score entries do not actually modify real
17653 score files.  That would be too inefficient.  Gnus maintains a cache of
17654 previously loaded score files, one of which is considered the
17655 @dfn{current score file alist}.  The score commands simply insert
17656 entries into this list, and upon group exit, this list is saved.
17657
17658 The current score file is by default the group's local score file, even
17659 if no such score file actually exists.  To insert score commands into
17660 some other score file (e.g. @file{all.SCORE}), you must first make this
17661 score file the current one.
17662
17663 General score commands that don't actually change the score file:
17664
17665 @table @kbd
17666
17667 @item V s
17668 @kindex V s (Summary)
17669 @findex gnus-summary-set-score
17670 Set the score of the current article (@code{gnus-summary-set-score}).
17671
17672 @item V S
17673 @kindex V S (Summary)
17674 @findex gnus-summary-current-score
17675 Display the score of the current article
17676 (@code{gnus-summary-current-score}).
17677
17678 @item V t
17679 @kindex V t (Summary)
17680 @findex gnus-score-find-trace
17681 Display all score rules that have been used on the current article
17682 (@code{gnus-score-find-trace}).
17683
17684 @item V w
17685 @kindex V w (Summary)
17686 @findex gnus-score-find-favourite-words
17687 List words used in scoring (@code{gnus-score-find-favourite-words}).
17688
17689 @item V R
17690 @kindex V R (Summary)
17691 @findex gnus-summary-rescore
17692 Run the current summary through the scoring process
17693 (@code{gnus-summary-rescore}).  This might be useful if you're playing
17694 around with your score files behind Gnus' back and want to see the
17695 effect you're having.
17696
17697 @item V c
17698 @kindex V c (Summary)
17699 @findex gnus-score-change-score-file
17700 Make a different score file the current
17701 (@code{gnus-score-change-score-file}).
17702
17703 @item V e
17704 @kindex V e (Summary)
17705 @findex gnus-score-edit-current-scores
17706 Edit the current score file (@code{gnus-score-edit-current-scores}).
17707 You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score
17708 File Editing}).
17709
17710 @item V f
17711 @kindex V f (Summary)
17712 @findex gnus-score-edit-file
17713 Edit a score file and make this score file the current one
17714 (@code{gnus-score-edit-file}).
17715
17716 @item V F
17717 @kindex V F (Summary)
17718 @findex gnus-score-flush-cache
17719 Flush the score cache (@code{gnus-score-flush-cache}).  This is useful
17720 after editing score files.
17721
17722 @item V C
17723 @kindex V C (Summary)
17724 @findex gnus-score-customize
17725 Customize a score file in a visually pleasing manner
17726 (@code{gnus-score-customize}).
17727
17728 @end table
17729
17730 The rest of these commands modify the local score file.
17731
17732 @table @kbd
17733
17734 @item V m
17735 @kindex V m (Summary)
17736 @findex gnus-score-set-mark-below
17737 Prompt for a score, and mark all articles with a score below this as
17738 read (@code{gnus-score-set-mark-below}).
17739
17740 @item V x
17741 @kindex V x (Summary)
17742 @findex gnus-score-set-expunge-below
17743 Prompt for a score, and add a score rule to the current score file to
17744 expunge all articles below this score
17745 (@code{gnus-score-set-expunge-below}).
17746 @end table
17747
17748 The keystrokes for actually making score entries follow a very regular
17749 pattern, so there's no need to list all the commands.  (Hundreds of
17750 them.)
17751
17752 @findex gnus-summary-increase-score
17753 @findex gnus-summary-lower-score
17754
17755 @enumerate
17756 @item
17757 The first key is either @kbd{I} (upper case i) for increasing the score
17758 or @kbd{L} for lowering the score.
17759 @item
17760 The second key says what header you want to score on.  The following
17761 keys are available:
17762 @table @kbd
17763
17764 @item a
17765 Score on the author name.
17766
17767 @item s
17768 Score on the subject line.
17769
17770 @item x
17771 Score on the @code{Xref} line---i.e., the cross-posting line.
17772
17773 @item r
17774 Score on the @code{References} line.
17775
17776 @item d
17777 Score on the date.
17778
17779 @item l
17780 Score on the number of lines.
17781
17782 @item i
17783 Score on the @code{Message-ID} header.
17784
17785 @item e
17786 Score on an "extra" header, that is, one of those in gnus-extra-headers,
17787 if your @sc{nntp} server tracks additional header data in overviews.
17788
17789 @item f
17790 Score on followups---this matches the author name, and adds scores to
17791 the followups to this author.  (Using this key leads to the creation of
17792 @file{ADAPT} files.)
17793
17794 @item b
17795 Score on the body.
17796
17797 @item h
17798 Score on the head.
17799
17800 @item t
17801 Score on thread.  (Using this key leads to the creation of @file{ADAPT}
17802 files.)
17803
17804 @end table
17805
17806 @item
17807 The third key is the match type.  Which match types are valid depends on
17808 what headers you are scoring on.
17809
17810 @table @code
17811
17812 @item strings
17813
17814 @table @kbd
17815
17816 @item e
17817 Exact matching.
17818
17819 @item s
17820 Substring matching.
17821
17822 @item f
17823 Fuzzy matching (@pxref{Fuzzy Matching}).
17824
17825 @item r
17826 Regexp matching
17827 @end table
17828
17829 @item date
17830 @table @kbd
17831
17832 @item b
17833 Before date.
17834
17835 @item a
17836 After date.
17837
17838 @item n
17839 This date.
17840 @end table
17841
17842 @item number
17843 @table @kbd
17844
17845 @item <
17846 Less than number.
17847
17848 @item =
17849 Equal to number.
17850
17851 @item >
17852 Greater than number.
17853 @end table
17854 @end table
17855
17856 @item
17857 The fourth and usually final key says whether this is a temporary (i.e.,
17858 expiring) score entry, or a permanent (i.e., non-expiring) score entry,
17859 or whether it is to be done immediately, without adding to the score
17860 file.
17861 @table @kbd
17862
17863 @item t
17864 Temporary score entry.
17865
17866 @item p
17867 Permanent score entry.
17868
17869 @item i
17870 Immediately scoring.
17871 @end table
17872
17873 @item
17874 If you are scoring on `e' (extra) headers, you will then be prompted for
17875 the header name on which you wish to score.  This must be a header named
17876 in gnus-extra-headers, and @samp{TAB} completion is available.
17877
17878 @end enumerate
17879
17880 So, let's say you want to increase the score on the current author with
17881 exact matching permanently: @kbd{I a e p}.  If you want to lower the
17882 score based on the subject line, using substring matching, and make a
17883 temporary score entry: @kbd{L s s t}.  Pretty easy.
17884
17885 To make things a bit more complicated, there are shortcuts.  If you use
17886 a capital letter on either the second or third keys, Gnus will use
17887 defaults for the remaining one or two keystrokes.  The defaults are
17888 ``substring'' and ``temporary''.  So @kbd{I A} is the same as @kbd{I a s
17889 t}, and @kbd{I a R} is the same as @kbd{I a r t}.
17890
17891 These functions take both the numerical prefix and the symbolic prefix
17892 (@pxref{Symbolic Prefixes}).  A numerical prefix says how much to lower
17893 (or increase) the score of the article.  A symbolic prefix of @code{a}
17894 says to use the @file{all.SCORE} file for the command instead of the
17895 current score file.
17896
17897 @vindex gnus-score-mimic-keymap
17898 The @code{gnus-score-mimic-keymap} says whether these commands will
17899 pretend they are keymaps or not.
17900
17901
17902 @node Group Score Commands
17903 @section Group Score Commands
17904 @cindex group score commands
17905
17906 There aren't many of these as yet, I'm afraid.
17907
17908 @table @kbd
17909
17910 @item W f
17911 @kindex W f (Group)
17912 @findex gnus-score-flush-cache
17913 Gnus maintains a cache of score alists to avoid having to reload them
17914 all the time.  This command will flush the cache
17915 (@code{gnus-score-flush-cache}).
17916
17917 @end table
17918
17919 You can do scoring from the command line by saying something like:
17920
17921 @findex gnus-batch-score
17922 @cindex batch scoring
17923 @example
17924 $ emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score
17925 @end example
17926
17927
17928 @node Score Variables
17929 @section Score Variables
17930 @cindex score variables
17931
17932 @table @code
17933
17934 @item gnus-use-scoring
17935 @vindex gnus-use-scoring
17936 If @code{nil}, Gnus will not check for score files, and will not, in
17937 general, do any score-related work.  This is @code{t} by default.
17938
17939 @item gnus-kill-killed
17940 @vindex gnus-kill-killed
17941 If this variable is @code{nil}, Gnus will never apply score files to
17942 articles that have already been through the kill process.  While this
17943 may save you lots of time, it also means that if you apply a kill file
17944 to a group, and then change the kill file and want to run it over you
17945 group again to kill more articles, it won't work.  You have to set this
17946 variable to @code{t} to do that.  (It is @code{t} by default.)
17947
17948 @item gnus-kill-files-directory
17949 @vindex gnus-kill-files-directory
17950 All kill and score files will be stored in this directory, which is
17951 initialized from the @code{SAVEDIR} environment variable by default.
17952 This is @file{~/News/} by default.
17953
17954 @item gnus-score-file-suffix
17955 @vindex gnus-score-file-suffix
17956 Suffix to add to the group name to arrive at the score file name
17957 (@samp{SCORE} by default.)
17958
17959 @item gnus-score-uncacheable-files
17960 @vindex gnus-score-uncacheable-files
17961 @cindex score cache
17962 All score files are normally cached to avoid excessive re-loading of
17963 score files.  However, if this might make your Emacs grow big and
17964 bloated, so this regexp can be used to weed out score files unlikely to be needed again.  It would be a bad idea to deny caching of
17965 @file{all.SCORE}, while it might be a good idea to not cache
17966 @file{comp.infosystems.www.authoring.misc.ADAPT}.  In fact, this
17967 variable is @samp{ADAPT$} by default, so no adaptive score files will
17968 be cached.
17969
17970 @item gnus-save-score
17971 @vindex gnus-save-score
17972 If you have really complicated score files, and do lots of batch
17973 scoring, then you might set this variable to @code{t}.  This will make
17974 Gnus save the scores into the @file{.newsrc.eld} file.
17975
17976 If you do not set this to @code{t}, then manual scores (like those set
17977 with @kbd{V s} (@code{gnus-summary-set-score})) will not be preserved
17978 across group visits.
17979
17980 @item gnus-score-interactive-default-score
17981 @vindex gnus-score-interactive-default-score
17982 Score used by all the interactive raise/lower commands to raise/lower
17983 score with.  Default is 1000, which may seem excessive, but this is to
17984 ensure that the adaptive scoring scheme gets enough room to play with.
17985 We don't want the small changes from the adaptive scoring to overwrite
17986 manually entered data.
17987
17988 @item gnus-summary-default-score
17989 @vindex gnus-summary-default-score
17990 Default score of an article, which is 0 by default.
17991
17992 @item gnus-summary-expunge-below
17993 @vindex gnus-summary-expunge-below
17994 Don't display the summary lines of articles that have scores lower than
17995 this variable.  This is @code{nil} by default, which means that no
17996 articles will be hidden.  This variable is local to the summary buffers,
17997 and has to be set from @code{gnus-summary-mode-hook}.
17998
17999 @item gnus-score-over-mark
18000 @vindex gnus-score-over-mark
18001 Mark (in the third column) used for articles with a score over the
18002 default.  Default is @samp{+}.
18003
18004 @item gnus-score-below-mark
18005 @vindex gnus-score-below-mark
18006 Mark (in the third column) used for articles with a score below the
18007 default.  Default is @samp{-}.
18008
18009 @item gnus-score-find-score-files-function
18010 @vindex gnus-score-find-score-files-function
18011 Function used to find score files for the current group.  This function
18012 is called with the name of the group as the argument.
18013
18014 Predefined functions available are:
18015 @table @code
18016
18017 @item gnus-score-find-single
18018 @findex gnus-score-find-single
18019 Only apply the group's own score file.
18020
18021 @item gnus-score-find-bnews
18022 @findex gnus-score-find-bnews
18023 Apply all score files that match, using bnews syntax.  This is the
18024 default.  If the current group is @samp{gnu.emacs.gnus}, for instance,
18025 @file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and
18026 @file{gnu.all.SCORE} would all apply.  In short, the instances of
18027 @samp{all} in the score file names are translated into @samp{.*}, and
18028 then a regexp match is done.
18029
18030 This means that if you have some score entries that you want to apply to
18031 all groups, then you put those entries in the @file{all.SCORE} file.
18032
18033 The score files are applied in a semi-random order, although Gnus will
18034 try to apply the more general score files before the more specific score
18035 files.  It does this by looking at the number of elements in the score
18036 file names---discarding the @samp{all} elements.
18037
18038 @item gnus-score-find-hierarchical
18039 @findex gnus-score-find-hierarchical
18040 Apply all score files from all the parent groups.  This means that you
18041 can't have score files like @file{all.SCORE}, but you can have
18042 @file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE} for each
18043 server.
18044
18045 @end table
18046 This variable can also be a list of functions.  In that case, all
18047 these functions will be called with the group name as argument, and
18048 all the returned lists of score files will be applied.  These
18049 functions can also return lists of lists of score alists directly.  In
18050 that case, the functions that return these non-file score alists
18051 should probably be placed before the ``real'' score file functions, to
18052 ensure that the last score file returned is the local score file.
18053 Phu.
18054
18055 For example, to do hierarchical scoring but use a non-server-specific
18056 overall score file, you could use the value
18057 @example
18058 (list (lambda (group) ("all.SCORE"))
18059       'gnus-score-find-hierarchical)
18060 @end example
18061
18062 @item gnus-score-expiry-days
18063 @vindex gnus-score-expiry-days
18064 This variable says how many days should pass before an unused score file
18065 entry is expired.  If this variable is @code{nil}, no score file entries
18066 are expired.  It's 7 by default.
18067
18068 @item gnus-update-score-entry-dates
18069 @vindex gnus-update-score-entry-dates
18070 If this variable is non-@code{nil}, temporary score entries that have
18071 been triggered (matched) will have their dates updated.  (This is how Gnus
18072 controls expiry---all non-matched-entries will become too old while
18073 matched entries will stay fresh and young.)  However, if you set this
18074 variable to @code{nil}, even matched entries will grow old and will
18075 have to face that oh-so grim reaper.
18076
18077 @item gnus-score-after-write-file-function
18078 @vindex gnus-score-after-write-file-function
18079 Function called with the name of the score file just written.
18080
18081 @item gnus-score-thread-simplify
18082 @vindex gnus-score-thread-simplify
18083 If this variable is non-@code{nil}, article subjects will be simplified
18084 for subject scoring purposes in the same manner as with
18085 threading---according to the current value of
18086 gnus-simplify-subject-functions.  If the scoring entry uses
18087 @code{substring} or @code{exact} matching, the match will also be
18088 simplified in this manner.
18089
18090 @end table
18091
18092
18093 @node Score File Format
18094 @section Score File Format
18095 @cindex score file format
18096
18097 A score file is an @code{emacs-lisp} file that normally contains just a
18098 single form.  Casual users are not expected to edit these files;
18099 everything can be changed from the summary buffer.
18100
18101 Anyway, if you'd like to dig into it yourself, here's an example:
18102
18103 @lisp
18104 (("from"
18105   ("Lars Ingebrigtsen" -10000)
18106   ("Per Abrahamsen")
18107   ("larsi\\|lmi" -50000 nil R))
18108  ("subject"
18109   ("Ding is Badd" nil 728373))
18110  ("xref"
18111   ("alt.politics" -1000 728372 s))
18112  ("lines"
18113   (2 -100 nil <))
18114  (mark 0)
18115  (expunge -1000)
18116  (mark-and-expunge -10)
18117  (read-only nil)
18118  (orphan -10)
18119  (adapt t)
18120  (files "/hom/larsi/News/gnu.SCORE")
18121  (exclude-files "all.SCORE")
18122  (local (gnus-newsgroup-auto-expire t)
18123         (gnus-summary-make-false-root empty))
18124  (eval (ding)))
18125 @end lisp
18126
18127 This example demonstrates most score file elements.  For a different
18128 approach, see @pxref{Advanced Scoring}.
18129
18130 Even though this looks much like lisp code, nothing here is actually
18131 @code{eval}ed.  The lisp reader is used to read this form, though, so it
18132 has to be valid syntactically, if not semantically.
18133
18134 Six keys are supported by this alist:
18135
18136 @table @code
18137
18138 @item STRING
18139 If the key is a string, it is the name of the header to perform the
18140 match on.  Scoring can only be performed on these eight headers:
18141 @code{From}, @code{Subject}, @code{References}, @code{Message-ID},
18142 @code{Xref}, @code{Lines}, @code{Chars} and @code{Date}.  In addition to
18143 these headers, there are three strings to tell Gnus to fetch the entire
18144 article and do the match on larger parts of the article: @code{Body}
18145 will perform the match on the body of the article, @code{Head} will
18146 perform the match on the head of the article, and @code{All} will
18147 perform the match on the entire article.  Note that using any of these
18148 last three keys will slow down group entry @emph{considerably}.  The
18149 final ``header'' you can score on is @code{Followup}.  These score
18150 entries will result in new score entries being added for all follow-ups
18151 to articles that matches these score entries.
18152
18153 Following this key is a arbitrary number of score entries, where each
18154 score entry has one to four elements.
18155 @enumerate
18156
18157 @item
18158 The first element is the @dfn{match element}.  On most headers this will
18159 be a string, but on the Lines and Chars headers, this must be an
18160 integer.
18161
18162 @item
18163 If the second element is present, it should be a number---the @dfn{score
18164 element}.  This number should be an integer in the neginf to posinf
18165 interval.  This number is added to the score of the article if the match
18166 is successful.  If this element is not present, the
18167 @code{gnus-score-interactive-default-score} number will be used
18168 instead.  This is 1000 by default.
18169
18170 @item
18171 If the third element is present, it should be a number---the @dfn{date
18172 element}.  This date says when the last time this score entry matched,
18173 which provides a mechanism for expiring the score entries.  It this
18174 element is not present, the score entry is permanent.  The date is
18175 represented by the number of days since December 31, 1 BCE.
18176
18177 @item
18178 If the fourth element is present, it should be a symbol---the @dfn{type
18179 element}.  This element specifies what function should be used to see
18180 whether this score entry matches the article.  What match types that can
18181 be used depends on what header you wish to perform the match on.
18182 @table @dfn
18183
18184 @item From, Subject, References, Xref, Message-ID
18185 For most header types, there are the @code{r} and @code{R} (regexp), as
18186 well as @code{s} and @code{S} (substring) types, and @code{e} and
18187 @code{E} (exact match), and @code{w} (word match) types.  If this
18188 element is not present, Gnus will assume that substring matching should
18189 be used.  @code{R}, @code{S}, and @code{E} differ from the others in
18190 that the matches will be done in a case-sensitive manner.  All these
18191 one-letter types are really just abbreviations for the @code{regexp},
18192 @code{string}, @code{exact}, and @code{word} types, which you can use
18193 instead, if you feel like.
18194
18195 @item Extra
18196 Just as for the standard string overview headers, if you are using
18197 gnus-extra-headers, you can score on these headers' values.  In this
18198 case, there is a 5th element in the score entry, being the name of the
18199 header to be scored.  The following entry is useful in your
18200 @file{all.SCORE} file in case of spam attacks from a single origin host,
18201 if your @sc{nntp} server tracks NNTP-Posting-Host in overviews:
18202
18203 @lisp
18204 ("111.222.333.444" -1000 nil s "NNTP-Posting-Host")
18205 @end lisp
18206
18207 @item Lines, Chars
18208 These two headers use different match types: @code{<}, @code{>},
18209 @code{=}, @code{>=} and @code{<=}.
18210
18211 These predicates are true if
18212
18213 @example
18214 (PREDICATE HEADER MATCH)
18215 @end example
18216
18217 evaluates to non-@code{nil}.  For instance, the advanced match
18218 @code{("lines" 4 <)} (@pxref{Advanced Scoring}) will result in the
18219 following form:
18220
18221 @lisp
18222 (< header-value 4)
18223 @end lisp
18224
18225 Or to put it another way: When using @code{<} on @code{Lines} with 4 as
18226 the match, we get the score added if the article has less than 4 lines.
18227 (It's easy to get confused and think it's the other way around.  But
18228 it's not.  I think.)
18229
18230 When matching on @code{Lines}, be careful because some back ends (like
18231 @code{nndir}) do not generate @code{Lines} header, so every article ends
18232 up being marked as having 0 lines.  This can lead to strange results if
18233 you happen to lower score of the articles with few lines.
18234
18235 @item Date
18236 For the Date header we have three kinda silly match types:
18237 @code{before}, @code{at} and @code{after}.  I can't really imagine this
18238 ever being useful, but, like, it would feel kinda silly not to provide
18239 this function.  Just in case.  You never know.  Better safe than sorry.
18240 Once burnt, twice shy.  Don't judge a book by its cover.  Never not have
18241 sex on a first date.  (I have been told that at least one person, and I
18242 quote, ``found this function indispensable'', however.)
18243
18244 @cindex ISO8601
18245 @cindex date
18246 A more useful match type is @code{regexp}.  With it, you can match the
18247 date string using a regular expression.  The date is normalized to
18248 ISO8601 compact format first---@var{YYYYMMDD}@code{T}@var{HHMMSS}.  If
18249 you want to match all articles that have been posted on April 1st in
18250 every year, you could use @samp{....0401.........} as a match string,
18251 for instance.  (Note that the date is kept in its original time zone, so
18252 this will match articles that were posted when it was April 1st where
18253 the article was posted from.  Time zones are such wholesome fun for the
18254 whole family, eh?)
18255
18256 @item Head, Body, All
18257 These three match keys use the same match types as the @code{From} (etc)
18258 header uses.
18259
18260 @item Followup
18261 This match key is somewhat special, in that it will match the
18262 @code{From} header, and affect the score of not only the matching
18263 articles, but also all followups to the matching articles.  This allows
18264 you e.g. increase the score of followups to your own articles, or
18265 decrease the score of followups to the articles of some known
18266 trouble-maker.  Uses the same match types as the @code{From} header
18267 uses.  (Using this match key will lead to creation of @file{ADAPT}
18268 files.)
18269
18270 @item Thread
18271 This match key works along the same lines as the @code{Followup} match
18272 key.  If you say that you want to score on a (sub-)thread started by an
18273 article with a @code{Message-ID} @var{x}, then you add a @samp{thread}
18274 match.  This will add a new @samp{thread} match for each article that
18275 has @var{x} in its @code{References} header.  (These new @samp{thread}
18276 matches will use the @code{Message-ID}s of these matching articles.)
18277 This will ensure that you can raise/lower the score of an entire thread,
18278 even though some articles in the thread may not have complete
18279 @code{References} headers.  Note that using this may lead to
18280 undeterministic scores of the articles in the thread.  (Using this match
18281 key will lead to creation of @file{ADAPT} files.)
18282 @end table
18283 @end enumerate
18284
18285 @cindex Score File Atoms
18286 @item mark
18287 The value of this entry should be a number.  Any articles with a score
18288 lower than this number will be marked as read.
18289
18290 @item expunge
18291 The value of this entry should be a number.  Any articles with a score
18292 lower than this number will be removed from the summary buffer.
18293
18294 @item mark-and-expunge
18295 The value of this entry should be a number.  Any articles with a score
18296 lower than this number will be marked as read and removed from the
18297 summary buffer.
18298
18299 @item thread-mark-and-expunge
18300 The value of this entry should be a number.  All articles that belong to
18301 a thread that has a total score below this number will be marked as read
18302 and removed from the summary buffer.  @code{gnus-thread-score-function}
18303 says how to compute the total score for a thread.
18304
18305 @item files
18306 The value of this entry should be any number of file names.  These files
18307 are assumed to be score files as well, and will be loaded the same way
18308 this one was.
18309
18310 @item exclude-files
18311 The clue of this entry should be any number of files.  These files will
18312 not be loaded, even though they would normally be so, for some reason or
18313 other.
18314
18315 @item eval
18316 The value of this entry will be @code{eval}el.  This element will be
18317 ignored when handling global score files.
18318
18319 @item read-only
18320 Read-only score files will not be updated or saved.  Global score files
18321 should feature this atom (@pxref{Global Score Files}).  (Note:
18322 @dfn{Global} here really means @dfn{global}; not your personal
18323 apply-to-all-groups score files.)
18324
18325 @item orphan
18326 The value of this entry should be a number.  Articles that do not have
18327 parents will get this number added to their scores.  Imagine you follow
18328 some high-volume newsgroup, like @samp{comp.lang.c}.  Most likely you
18329 will only follow a few of the threads, also want to see any new threads.
18330
18331 You can do this with the following two score file entries:
18332
18333 @example
18334         (orphan -500)
18335         (mark-and-expunge -100)
18336 @end example
18337
18338 When you enter the group the first time, you will only see the new
18339 threads.  You then raise the score of the threads that you find
18340 interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) the
18341 rest.  Next time you enter the group, you will see new articles in the
18342 interesting threads, plus any new threads.
18343
18344 I.e.---the orphan score atom is for high-volume groups where a few
18345 interesting threads which can't be found automatically by ordinary
18346 scoring rules exist.
18347
18348 @item adapt
18349 This entry controls the adaptive scoring.  If it is @code{t}, the
18350 default adaptive scoring rules will be used.  If it is @code{ignore}, no
18351 adaptive scoring will be performed on this group.  If it is a list, this
18352 list will be used as the adaptive scoring rules.  If it isn't present,
18353 or is something other than @code{t} or @code{ignore}, the default
18354 adaptive scoring rules will be used.  If you want to use adaptive
18355 scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to
18356 @code{t}, and insert an @code{(adapt ignore)} in the groups where you do
18357 not want adaptive scoring.  If you only want adaptive scoring in a few
18358 groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and
18359 insert @code{(adapt t)} in the score files of the groups where you want
18360 it.
18361
18362 @item adapt-file
18363 All adaptive score entries will go to the file named by this entry.  It
18364 will also be applied when entering the group.  This atom might be handy
18365 if you want to adapt on several groups at once, using the same adaptive
18366 file for a number of groups.
18367
18368 @item local
18369 @cindex local variables
18370 The value of this entry should be a list of @code{(VAR VALUE)} pairs.
18371 Each @var{var} will be made buffer-local to the current summary buffer,
18372 and set to the value specified.  This is a convenient, if somewhat
18373 strange, way of setting variables in some groups if you don't like hooks
18374 much.  Note that the @var{value} won't be evaluated.
18375 @end table
18376
18377
18378 @node Score File Editing
18379 @section Score File Editing
18380
18381 You normally enter all scoring commands from the summary buffer, but you
18382 might feel the urge to edit them by hand as well, so we've supplied you
18383 with a mode for that.
18384
18385 It's simply a slightly customized @code{emacs-lisp} mode, with these
18386 additional commands:
18387
18388 @table @kbd
18389
18390 @item C-c C-c
18391 @kindex C-c C-c (Score)
18392 @findex gnus-score-edit-done
18393 Save the changes you have made and return to the summary buffer
18394 (@code{gnus-score-edit-done}).
18395
18396 @item C-c C-d
18397 @kindex C-c C-d (Score)
18398 @findex gnus-score-edit-insert-date
18399 Insert the current date in numerical format
18400 (@code{gnus-score-edit-insert-date}).  This is really the day number, if
18401 you were wondering.
18402
18403 @item C-c C-p
18404 @kindex C-c C-p (Score)
18405 @findex gnus-score-pretty-print
18406 The adaptive score files are saved in an unformatted fashion.  If you
18407 intend to read one of these files, you want to @dfn{pretty print} it
18408 first.  This command (@code{gnus-score-pretty-print}) does that for
18409 you.
18410
18411 @end table
18412
18413 Type @kbd{M-x gnus-score-mode} to use this mode.
18414
18415 @vindex gnus-score-mode-hook
18416 @code{gnus-score-menu-hook} is run in score mode buffers.
18417
18418 In the summary buffer you can use commands like @kbd{V f} and @kbd{V
18419 e} to begin editing score files.
18420
18421
18422 @node Adaptive Scoring
18423 @section Adaptive Scoring
18424 @cindex adaptive scoring
18425
18426 If all this scoring is getting you down, Gnus has a way of making it all
18427 happen automatically---as if by magic.  Or rather, as if by artificial
18428 stupidity, to be precise.
18429
18430 @vindex gnus-use-adaptive-scoring
18431 When you read an article, or mark an article as read, or kill an
18432 article, you leave marks behind.  On exit from the group, Gnus can sniff
18433 these marks and add score elements depending on what marks it finds.
18434 You turn on this ability by setting @code{gnus-use-adaptive-scoring} to
18435 @code{t} or @code{(line)}.  If you want score adaptively on separate
18436 words appearing in the subjects, you should set this variable to
18437 @code{(word)}.  If you want to use both adaptive methods, set this
18438 variable to @code{(word line)}.
18439
18440 @vindex gnus-default-adaptive-score-alist
18441 To give you complete control over the scoring process, you can customize
18442 the @code{gnus-default-adaptive-score-alist} variable.  For instance, it
18443 might look something like this:
18444
18445 @lisp
18446 (setq gnus-default-adaptive-score-alist
18447   '((gnus-unread-mark)
18448     (gnus-ticked-mark (from 4))
18449     (gnus-dormant-mark (from 5))
18450     (gnus-del-mark (from -4) (subject -1))
18451     (gnus-read-mark (from 4) (subject 2))
18452     (gnus-expirable-mark (from -1) (subject -1))
18453     (gnus-killed-mark (from -1) (subject -3))
18454     (gnus-kill-file-mark)
18455     (gnus-ancient-mark)
18456     (gnus-low-score-mark)
18457     (gnus-catchup-mark (from -1) (subject -1))))
18458 @end lisp
18459
18460 As you see, each element in this alist has a mark as a key (either a
18461 variable name or a ``real'' mark---a character).  Following this key is
18462 a arbitrary number of header/score pairs.  If there are no header/score
18463 pairs following the key, no adaptive scoring will be done on articles
18464 that have that key as the article mark.  For instance, articles with
18465 @code{gnus-unread-mark} in the example above will not get adaptive score
18466 entries.
18467
18468 Each article can have only one mark, so just a single of these rules
18469 will be applied to each article.
18470
18471 To take @code{gnus-del-mark} as an example---this alist says that all
18472 articles that have that mark (i.e., are marked with @samp{D}) will have a
18473 score entry added to lower based on the @code{From} header by -4, and
18474 lowered by @code{Subject} by -1.  Change this to fit your prejudices.
18475
18476 If you have marked 10 articles with the same subject with
18477 @code{gnus-del-mark}, the rule for that mark will be applied ten times.
18478 That means that that subject will get a score of ten times -1, which
18479 should be, unless I'm much mistaken, -10.
18480
18481 If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), all
18482 the read articles will be marked with the @samp{E} mark.  This'll
18483 probably make adaptive scoring slightly impossible, so auto-expiring and
18484 adaptive scoring doesn't really mix very well.
18485
18486 The headers you can score on are @code{from}, @code{subject},
18487 @code{message-id}, @code{references}, @code{xref}, @code{lines},
18488 @code{chars} and @code{date}.  In addition, you can score on
18489 @code{followup}, which will create an adaptive score entry that matches
18490 on the @code{References} header using the @code{Message-ID} of the
18491 current article, thereby matching the following thread.
18492
18493 If you use this scheme, you should set the score file atom @code{mark}
18494 to something small---like -300, perhaps, to avoid having small random
18495 changes result in articles getting marked as read.
18496
18497 After using adaptive scoring for a week or so, Gnus should start to
18498 become properly trained and enhance the authors you like best, and kill
18499 the authors you like least, without you having to say so explicitly.
18500
18501 You can control what groups the adaptive scoring is to be performed on
18502 by using the score files (@pxref{Score File Format}).  This will also
18503 let you use different rules in different groups.
18504
18505 @vindex gnus-adaptive-file-suffix
18506 The adaptive score entries will be put into a file where the name is the
18507 group name with @code{gnus-adaptive-file-suffix} appended.  The default
18508 is @samp{ADAPT}.
18509
18510 @vindex gnus-score-exact-adapt-limit
18511 When doing adaptive scoring, substring or fuzzy matching would probably
18512 give you the best results in most cases.  However, if the header one
18513 matches is short, the possibility for false positives is great, so if
18514 the length of the match is less than
18515 @code{gnus-score-exact-adapt-limit}, exact matching will be used.  If
18516 this variable is @code{nil}, exact matching will always be used to avoid
18517 this problem.
18518
18519 @vindex gnus-default-adaptive-word-score-alist
18520 As mentioned above, you can adapt either on individual words or entire
18521 headers.  If you adapt on words, the
18522 @code{gnus-default-adaptive-word-score-alist} variable says what score
18523 each instance of a word should add given a mark.
18524
18525 @lisp
18526 (setq gnus-default-adaptive-word-score-alist
18527       `((,gnus-read-mark . 30)
18528         (,gnus-catchup-mark . -10)
18529         (,gnus-killed-mark . -20)
18530         (,gnus-del-mark . -15)))
18531 @end lisp
18532
18533 This is the default value.  If you have adaption on words enabled, every
18534 word that appears in subjects of articles marked with
18535 @code{gnus-read-mark} will result in a score rule that increase the
18536 score with 30 points.
18537
18538 @vindex gnus-default-ignored-adaptive-words
18539 @vindex gnus-ignored-adaptive-words
18540 Words that appear in the @code{gnus-default-ignored-adaptive-words} list
18541 will be ignored.  If you wish to add more words to be ignored, use the
18542 @code{gnus-ignored-adaptive-words} list instead.
18543
18544 @vindex gnus-adaptive-word-length-limit
18545 Some may feel that short words shouldn't count when doing adaptive
18546 scoring.  If so, you may set @code{gnus-adaptive-word-length-limit} to
18547 an integer.  Words shorter than this number will be ignored.  This
18548 variable defaults to @code{nil}.
18549
18550 @vindex gnus-adaptive-word-syntax-table
18551 When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the
18552 syntax table in effect.  It is similar to the standard syntax table, but
18553 it considers numbers to be non-word-constituent characters.
18554
18555 @vindex gnus-adaptive-word-minimum
18556 If @code{gnus-adaptive-word-minimum} is set to a number, the adaptive
18557 word scoring process will never bring down the score of an article to
18558 below this number.  The default is @code{nil}.
18559
18560 @vindex gnus-adaptive-word-no-group-words
18561 If @code{gnus-adaptive-word-no-group-words} is set to @code{t}, gnus
18562 won't adaptively word score any of the words in the group name.  Useful
18563 for groups like @samp{comp.editors.emacs}, where most of the subject
18564 lines contain the word @samp{emacs}.
18565
18566 After using this scheme for a while, it might be nice to write a
18567 @code{gnus-psychoanalyze-user} command to go through the rules and see
18568 what words you like and what words you don't like.  Or perhaps not.
18569
18570 Note that the adaptive word scoring thing is highly experimental and is
18571 likely to change in the future.  Initial impressions seem to indicate
18572 that it's totally useless as it stands.  Some more work (involving more
18573 rigorous statistical methods) will have to be done to make this useful.
18574
18575
18576 @node Home Score File
18577 @section Home Score File
18578
18579 The score file where new score file entries will go is called the
18580 @dfn{home score file}.  This is normally (and by default) the score file
18581 for the group itself.  For instance, the home score file for
18582 @samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}.
18583
18584 However, this may not be what you want.  It is often convenient to share
18585 a common home score file among many groups---all @samp{emacs} groups
18586 could perhaps use the same home score file.
18587
18588 @vindex gnus-home-score-file
18589 The variable that controls this is @code{gnus-home-score-file}.  It can
18590 be:
18591
18592 @enumerate
18593 @item
18594 A string.  Then this file will be used as the home score file for all
18595 groups.
18596
18597 @item
18598 A function.  The result of this function will be used as the home score
18599 file.  The function will be called with the name of the group as the
18600 parameter.
18601
18602 @item
18603 A list.  The elements in this list can be:
18604
18605 @enumerate
18606 @item
18607 @code{(@var{regexp} @var{file-name})}.  If the @var{regexp} matches the
18608 group name, the @var{file-name} will be used as the home score file.
18609
18610 @item
18611 A function.  If the function returns non-nil, the result will be used as
18612 the home score file.
18613
18614 @item
18615 A string.  Use the string as the home score file.
18616 @end enumerate
18617
18618 The list will be traversed from the beginning towards the end looking
18619 for matches.
18620
18621 @end enumerate
18622
18623 So, if you want to use just a single score file, you could say:
18624
18625 @lisp
18626 (setq gnus-home-score-file
18627       "my-total-score-file.SCORE")
18628 @end lisp
18629
18630 If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and
18631 @file{rec.SCORE} for all @samp{rec} groups (and so on), you can say:
18632
18633 @findex gnus-hierarchial-home-score-file
18634 @lisp
18635 (setq gnus-home-score-file
18636       'gnus-hierarchial-home-score-file)
18637 @end lisp
18638
18639 This is a ready-made function provided for your convenience.
18640 Other functions include
18641
18642 @table @code
18643 @item gnus-current-home-score-file
18644 @findex gnus-current-home-score-file
18645 Return the ``current'' regular score file.  This will make scoring
18646 commands add entry to the ``innermost'' matching score file.
18647
18648 @end table
18649
18650 If you want to have one score file for the @samp{emacs} groups and
18651 another for the @samp{comp} groups, while letting all other groups use
18652 their own home score files:
18653
18654 @lisp
18655 (setq gnus-home-score-file
18656       ;; All groups that match the regexp "\\.emacs"
18657       '(("\\.emacs" "emacs.SCORE")
18658         ;; All the comp groups in one score file
18659         ("^comp" "comp.SCORE")))
18660 @end lisp
18661
18662 @vindex gnus-home-adapt-file
18663 @code{gnus-home-adapt-file} works exactly the same way as
18664 @code{gnus-home-score-file}, but says what the home adaptive score file
18665 is instead.  All new adaptive file entries will go into the file
18666 specified by this variable, and the same syntax is allowed.
18667
18668 In addition to using @code{gnus-home-score-file} and
18669 @code{gnus-home-adapt-file}, you can also use group parameters
18670 (@pxref{Group Parameters}) and topic parameters (@pxref{Topic
18671 Parameters}) to achieve much the same.  Group and topic parameters take
18672 precedence over this variable.
18673
18674
18675 @node Followups To Yourself
18676 @section Followups To Yourself
18677
18678 Gnus offers two commands for picking out the @code{Message-ID} header in
18679 the current buffer.  Gnus will then add a score rule that scores using
18680 this @code{Message-ID} on the @code{References} header of other
18681 articles.  This will, in effect, increase the score of all articles that
18682 respond to the article in the current buffer.  Quite useful if you want
18683 to easily note when people answer what you've said.
18684
18685 @table @code
18686
18687 @item gnus-score-followup-article
18688 @findex gnus-score-followup-article
18689 This will add a score to articles that directly follow up your own
18690 article.
18691
18692 @item gnus-score-followup-thread
18693 @findex gnus-score-followup-thread
18694 This will add a score to all articles that appear in a thread ``below''
18695 your own article.
18696 @end table
18697
18698 @vindex message-sent-hook
18699 These two functions are both primarily meant to be used in hooks like
18700 @code{message-sent-hook}, like this:
18701 @lisp
18702 (add-hook 'message-sent-hook 'gnus-score-followup-thread)
18703 @end lisp
18704
18705
18706 If you look closely at your own @code{Message-ID}, you'll notice that
18707 the first two or three characters are always the same.  Here's two of
18708 mine:
18709
18710 @example
18711 <x6u3u47icf.fsf@@eyesore.no>
18712 <x6sp9o7ibw.fsf@@eyesore.no>
18713 @end example
18714
18715 So ``my'' ident on this machine is @samp{x6}.  This can be
18716 exploited---the following rule will raise the score on all followups to
18717 myself:
18718
18719 @lisp
18720 ("references"
18721  ("<x6[0-9a-z]+\\.fsf\\(_-_\\)?@@.*eyesore\\.no>"
18722   1000 nil r))
18723 @end lisp
18724
18725 Whether it's the first two or first three characters that are ``yours''
18726 is system-dependent.
18727
18728
18729 @node Scoring On Other Headers
18730 @section Scoring On Other Headers
18731 @cindex scoring on other headers
18732
18733 Gnus is quite fast when scoring the ``traditional''
18734 headers---@samp{From}, @samp{Subject} and so on.  However, scoring
18735 other headers requires writing a @code{head} scoring rule, which means
18736 that Gnus has to request every single article from the back end to find
18737 matches.  This takes a long time in big groups.
18738
18739 Now, there's not much you can do about this for news groups, but for
18740 mail groups, you have greater control.  In the @pxref{To From
18741 Newsgroups} section of the manual, it's explained in greater detail what
18742 this mechanism does, but here's a cookbook example for @code{nnml} on
18743 how to allow scoring on the @samp{To} and @samp{Cc} headers.
18744
18745 Put the following in your @file{.gnus.el} file.
18746
18747 @lisp
18748 (setq gnus-extra-headers '(To Cc Newsgroups Keywords)
18749       nnmail-extra-headers gnus-extra-headers)
18750 @end lisp
18751
18752 Restart Gnus and rebuild your @code{nnml} overview files with the
18753 @kbd{M-x nnml-generate-nov-databases} command.  This will take a long
18754 time if you have much mail.
18755
18756 Now you can score on @samp{To} and @samp{Cc} as ``extra headers'' like
18757 so: @kbd{I e s p To RET <your name> RET}.
18758
18759 See?  Simple.
18760
18761
18762 @node Scoring Tips
18763 @section Scoring Tips
18764 @cindex scoring tips
18765
18766 @table @dfn
18767
18768 @item Crossposts
18769 @cindex crossposts
18770 @cindex scoring crossposts
18771 If you want to lower the score of crossposts, the line to match on is
18772 the @code{Xref} header.
18773 @lisp
18774 ("xref" (" talk.politics.misc:" -1000))
18775 @end lisp
18776
18777 @item Multiple crossposts
18778 If you want to lower the score of articles that have been crossposted to
18779 more than, say, 3 groups:
18780 @lisp
18781 ("xref"
18782   ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+"
18783    -1000 nil r))
18784 @end lisp
18785
18786 @item Matching on the body
18787 This is generally not a very good idea---it takes a very long time.
18788 Gnus actually has to fetch each individual article from the server.  But
18789 you might want to anyway, I guess.  Even though there are three match
18790 keys (@code{Head}, @code{Body} and @code{All}), you should choose one
18791 and stick with it in each score file.  If you use any two, each article
18792 will be fetched @emph{twice}.  If you want to match a bit on the
18793 @code{Head} and a bit on the @code{Body}, just use @code{All} for all
18794 the matches.
18795
18796 @item Marking as read
18797 You will probably want to mark articles that have scores below a certain
18798 number as read.  This is most easily achieved by putting the following
18799 in your @file{all.SCORE} file:
18800 @lisp
18801 ((mark -100))
18802 @end lisp
18803 You may also consider doing something similar with @code{expunge}.
18804
18805 @item Negated character classes
18806 If you say stuff like @code{[^abcd]*}, you may get unexpected results.
18807 That will match newlines, which might lead to, well, The Unknown.  Say
18808 @code{[^abcd\n]*} instead.
18809 @end table
18810
18811
18812 @node Reverse Scoring
18813 @section Reverse Scoring
18814 @cindex reverse scoring
18815
18816 If you want to keep just articles that have @samp{Sex with Emacs} in the
18817 subject header, and expunge all other articles, you could put something
18818 like this in your score file:
18819
18820 @lisp
18821 (("subject"
18822   ("Sex with Emacs" 2))
18823  (mark 1)
18824  (expunge 1))
18825 @end lisp
18826
18827 So, you raise all articles that match @samp{Sex with Emacs} and mark the
18828 rest as read, and expunge them to boot.
18829
18830
18831 @node Global Score Files
18832 @section Global Score Files
18833 @cindex global score files
18834
18835 Sure, other newsreaders have ``global kill files''.  These are usually
18836 nothing more than a single kill file that applies to all groups, stored
18837 in the user's home directory.  Bah!  Puny, weak newsreaders!
18838
18839 What I'm talking about here are Global Score Files.  Score files from
18840 all over the world, from users everywhere, uniting all nations in one
18841 big, happy score file union!  Ange-score!  New and untested!
18842
18843 @vindex gnus-global-score-files
18844 All you have to do to use other people's score files is to set the
18845 @code{gnus-global-score-files} variable.  One entry for each score file,
18846 or each score file directory.  Gnus will decide by itself what score
18847 files are applicable to which group.
18848
18849 To use the score file
18850 @file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} and
18851 all score files in the @file{/ftp@@ftp.some-where:/pub/score} directory,
18852 say this:
18853
18854 @lisp
18855 (setq gnus-global-score-files
18856       '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE"
18857         "/ftp@@ftp.some-where:/pub/score/"))
18858 @end lisp
18859
18860 @findex gnus-score-search-global-directories
18861 @noindent
18862 Simple, eh?  Directory names must end with a @samp{/}.  These
18863 directories are typically scanned only once during each Gnus session.
18864 If you feel the need to manually re-scan the remote directories, you can
18865 use the @code{gnus-score-search-global-directories} command.
18866
18867 Note that, at present, using this option will slow down group entry
18868 somewhat.  (That is---a lot.)
18869
18870 If you want to start maintaining score files for other people to use,
18871 just put your score file up for anonymous ftp and announce it to the
18872 world.  Become a retro-moderator!  Participate in the retro-moderator
18873 wars sure to ensue, where retro-moderators battle it out for the
18874 sympathy of the people, luring them to use their score files on false
18875 premises!  Yay!  The net is saved!
18876
18877 Here are some tips for the would-be retro-moderator, off the top of my
18878 head:
18879
18880 @itemize @bullet
18881
18882 @item
18883 Articles heavily crossposted are probably junk.
18884 @item
18885 To lower a single inappropriate article, lower by @code{Message-ID}.
18886 @item
18887 Particularly brilliant authors can be raised on a permanent basis.
18888 @item
18889 Authors that repeatedly post off-charter for the group can safely be
18890 lowered out of existence.
18891 @item
18892 Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest
18893 articles completely.
18894
18895 @item
18896 Use expiring score entries to keep the size of the file down.  You
18897 should probably have a long expiry period, though, as some sites keep
18898 old articles for a long time.
18899 @end itemize
18900
18901 ... I wonder whether other newsreaders will support global score files
18902 in the future.  @emph{Snicker}.  Yup, any day now, newsreaders like Blue
18903 Wave, xrn and 1stReader are bound to implement scoring.  Should we start
18904 holding our breath yet?
18905
18906
18907 @node Kill Files
18908 @section Kill Files
18909 @cindex kill files
18910
18911 Gnus still supports those pesky old kill files.  In fact, the kill file
18912 entries can now be expiring, which is something I wrote before Daniel
18913 Quinlan thought of doing score files, so I've left the code in there.
18914
18915 In short, kill processing is a lot slower (and I do mean @emph{a lot})
18916 than score processing, so it might be a good idea to rewrite your kill
18917 files into score files.
18918
18919 Anyway, a kill file is a normal @code{emacs-lisp} file.  You can put any
18920 forms into this file, which means that you can use kill files as some
18921 sort of primitive hook function to be run on group entry, even though
18922 that isn't a very good idea.
18923
18924 Normal kill files look like this:
18925
18926 @lisp
18927 (gnus-kill "From" "Lars Ingebrigtsen")
18928 (gnus-kill "Subject" "ding")
18929 (gnus-expunge "X")
18930 @end lisp
18931
18932 This will mark every article written by me as read, and remove the
18933 marked articles from the summary buffer.  Very useful, you'll agree.
18934
18935 Other programs use a totally different kill file syntax.  If Gnus
18936 encounters what looks like a @code{rn} kill file, it will take a stab at
18937 interpreting it.
18938
18939 Two summary functions for editing a GNUS kill file:
18940
18941 @table @kbd
18942
18943 @item M-k
18944 @kindex M-k (Summary)
18945 @findex gnus-summary-edit-local-kill
18946 Edit this group's kill file (@code{gnus-summary-edit-local-kill}).
18947
18948 @item M-K
18949 @kindex M-K (Summary)
18950 @findex gnus-summary-edit-global-kill
18951 Edit the general kill file (@code{gnus-summary-edit-global-kill}).
18952 @end table
18953
18954 Two group mode functions for editing the kill files:
18955
18956 @table @kbd
18957
18958 @item M-k
18959 @kindex M-k (Group)
18960 @findex gnus-group-edit-local-kill
18961 Edit this group's kill file (@code{gnus-group-edit-local-kill}).
18962
18963 @item M-K
18964 @kindex M-K (Group)
18965 @findex gnus-group-edit-global-kill
18966 Edit the general kill file (@code{gnus-group-edit-global-kill}).
18967 @end table
18968
18969 Kill file variables:
18970
18971 @table @code
18972 @item gnus-kill-file-name
18973 @vindex gnus-kill-file-name
18974 A kill file for the group @samp{soc.motss} is normally called
18975 @file{soc.motss.KILL}.  The suffix appended to the group name to get
18976 this file name is detailed by the @code{gnus-kill-file-name} variable.
18977 The ``global'' kill file (not in the score file sense of ``global'', of
18978 course) is just called @file{KILL}.
18979
18980 @vindex gnus-kill-save-kill-file
18981 @item gnus-kill-save-kill-file
18982 If this variable is non-@code{nil}, Gnus will save the
18983 kill file after processing, which is necessary if you use expiring
18984 kills.
18985
18986 @item gnus-apply-kill-hook
18987 @vindex gnus-apply-kill-hook
18988 @findex gnus-apply-kill-file-unless-scored
18989 @findex gnus-apply-kill-file
18990 A hook called to apply kill files to a group.  It is
18991 @code{(gnus-apply-kill-file)} by default.  If you want to ignore the
18992 kill file if you have a score file for the same group, you can set this
18993 hook to @code{(gnus-apply-kill-file-unless-scored)}.  If you don't want
18994 kill files to be processed, you should set this variable to @code{nil}.
18995
18996 @item gnus-kill-file-mode-hook
18997 @vindex gnus-kill-file-mode-hook
18998 A hook called in kill-file mode buffers.
18999
19000 @end table
19001
19002
19003 @node Converting Kill Files
19004 @section Converting Kill Files
19005 @cindex kill files
19006 @cindex converting kill files
19007
19008 If you have loads of old kill files, you may want to convert them into
19009 score files.  If they are ``regular'', you can use
19010 the @file{gnus-kill-to-score.el} package; if not, you'll have to do it
19011 by hand.
19012
19013 The kill to score conversion package isn't included in Gnus by default.
19014 You can fetch it from
19015 @uref{http://www.stud.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el}.
19016
19017 If your old kill files are very complex---if they contain more
19018 non-@code{gnus-kill} forms than not, you'll have to convert them by
19019 hand.  Or just let them be as they are.  Gnus will still use them as
19020 before.
19021
19022
19023 @node GroupLens
19024 @section GroupLens
19025 @cindex GroupLens
19026
19027 GroupLens (@uref{http://www.cs.umn.edu/Research/GroupLens/}) is a
19028 collaborative filtering system that helps you work together with other
19029 people to find the quality news articles out of the huge volume of
19030 news articles generated every day.
19031
19032 To accomplish this the GroupLens system combines your opinions about
19033 articles you have already read with the opinions of others who have done
19034 likewise and gives you a personalized prediction for each unread news
19035 article.  Think of GroupLens as a matchmaker.  GroupLens watches how you
19036 rate articles, and finds other people that rate articles the same way.
19037 Once it has found some people you agree with it tells you, in the form
19038 of a prediction, what they thought of the article.  You can use this
19039 prediction to help you decide whether or not you want to read the
19040 article.
19041
19042 @sc{Note:} Unfortunately the GroupLens system seems to have shut down,
19043 so this section is mostly of historical interest.
19044
19045 @menu
19046 * Using GroupLens::             How to make Gnus use GroupLens.
19047 * Rating Articles::             Letting GroupLens know how you rate articles.
19048 * Displaying Predictions::      Displaying predictions given by GroupLens.
19049 * GroupLens Variables::         Customizing GroupLens.
19050 @end menu
19051
19052
19053 @node Using GroupLens
19054 @subsection Using GroupLens
19055
19056 To use GroupLens you must register a pseudonym with your local Better
19057 Bit Bureau (BBB).
19058 @uref{http://www.cs.umn.edu/Research/GroupLens/bbb.html} is the only
19059 better bit in town at the moment.
19060
19061 Once you have registered you'll need to set a couple of variables.
19062
19063 @table @code
19064
19065 @item gnus-use-grouplens
19066 @vindex gnus-use-grouplens
19067 Setting this variable to a non-@code{nil} value will make Gnus hook into
19068 all the relevant GroupLens functions.
19069
19070 @item grouplens-pseudonym
19071 @vindex grouplens-pseudonym
19072 This variable should be set to the pseudonym you got when registering
19073 with the Better Bit Bureau.
19074
19075 @item grouplens-newsgroups
19076 @vindex grouplens-newsgroups
19077 A list of groups that you want to get GroupLens predictions for.
19078
19079 @end table
19080
19081 That's the minimum of what you need to get up and running with GroupLens.
19082 Once you've registered, GroupLens will start giving you scores for
19083 articles based on the average of what other people think.  But, to get
19084 the real benefit of GroupLens you need to start rating articles
19085 yourself.  Then the scores GroupLens gives you will be personalized for
19086 you, based on how the people you usually agree with have already rated.
19087
19088
19089 @node Rating Articles
19090 @subsection Rating Articles
19091
19092 In GroupLens, an article is rated on a scale from 1 to 5, inclusive.
19093 Where 1 means something like this article is a waste of bandwidth and 5
19094 means that the article was really good.  The basic question to ask
19095 yourself is, "on a scale from 1 to 5 would I like to see more articles
19096 like this one?"
19097
19098 There are four ways to enter a rating for an article in GroupLens.
19099
19100 @table @kbd
19101
19102 @item r
19103 @kindex r (GroupLens)
19104 @findex bbb-summary-rate-article
19105 This function will prompt you for a rating on a scale of one to five.
19106
19107 @item k
19108 @kindex k (GroupLens)
19109 @findex grouplens-score-thread
19110 This function will prompt you for a rating, and rate all the articles in
19111 the thread.  This is really useful for some of those long running giant
19112 threads in rec.humor.
19113
19114 @end table
19115
19116 The next two commands, @kbd{n} and @kbd{,} take a numerical prefix to be
19117 the score of the article you're reading.
19118
19119 @table @kbd
19120
19121 @item 1-5 n
19122 @kindex n (GroupLens)
19123 @findex grouplens-next-unread-article
19124 Rate the article and go to the next unread article.
19125
19126 @item 1-5 ,
19127 @kindex , (GroupLens)
19128 @findex grouplens-best-unread-article
19129 Rate the article and go to the next unread article with the highest score.
19130
19131 @end table
19132
19133 If you want to give the current article a score of 4 and then go to the
19134 next article, just type @kbd{4 n}.
19135
19136
19137 @node Displaying Predictions
19138 @subsection Displaying Predictions
19139
19140 GroupLens makes a prediction for you about how much you will like a
19141 news article.  The predictions from GroupLens are on a scale from 1 to
19142 5, where 1 is the worst and 5 is the best.  You can use the predictions
19143 from GroupLens in one of three ways controlled by the variable
19144 @code{gnus-grouplens-override-scoring}.
19145
19146 @vindex gnus-grouplens-override-scoring
19147 There are three ways to display predictions in grouplens.  You may
19148 choose to have the GroupLens scores contribute to, or override the
19149 regular gnus scoring mechanism.  override is the default; however, some
19150 people prefer to see the Gnus scores plus the grouplens scores.  To get
19151 the separate scoring behavior you need to set
19152 @code{gnus-grouplens-override-scoring} to @code{'separate}.  To have the
19153 GroupLens predictions combined with the grouplens scores set it to
19154 @code{'override} and to combine the scores set
19155 @code{gnus-grouplens-override-scoring} to @code{'combine}.  When you use
19156 the combine option you will also want to set the values for
19157 @code{grouplens-prediction-offset} and
19158 @code{grouplens-score-scale-factor}.
19159
19160 @vindex grouplens-prediction-display
19161 In either case, GroupLens gives you a few choices for how you would like
19162 to see your predictions displayed.  The display of predictions is
19163 controlled by the @code{grouplens-prediction-display} variable.
19164
19165 The following are valid values for that variable.
19166
19167 @table @code
19168 @item prediction-spot
19169 The higher the prediction, the further to the right an @samp{*} is
19170 displayed.
19171
19172 @item confidence-interval
19173 A numeric confidence interval.
19174
19175 @item prediction-bar
19176 The higher the prediction, the longer the bar.
19177
19178 @item confidence-bar
19179 Numerical confidence.
19180
19181 @item confidence-spot
19182 The spot gets bigger with more confidence.
19183
19184 @item prediction-num
19185 Plain-old numeric value.
19186
19187 @item confidence-plus-minus
19188 Prediction +/- confidence.
19189
19190 @end table
19191
19192
19193 @node GroupLens Variables
19194 @subsection GroupLens Variables
19195
19196 @table @code
19197
19198 @item gnus-summary-grouplens-line-format
19199 The summary line format used in GroupLens-enhanced summary buffers.  It
19200 accepts the same specs as the normal summary line format (@pxref{Summary
19201 Buffer Lines}).  The default is @samp{%U%R%z%l%I%(%[%4L: %-23,23n%]%)
19202 %s\n}.
19203
19204 @item grouplens-bbb-host
19205 Host running the bbbd server.  @samp{grouplens.cs.umn.edu} is the
19206 default.
19207
19208 @item grouplens-bbb-port
19209 Port of the host running the bbbd server.  The default is 9000.
19210
19211 @item grouplens-score-offset
19212 Offset the prediction by this value.  In other words, subtract the
19213 prediction value by this number to arrive at the effective score.  The
19214 default is 0.
19215
19216 @item grouplens-score-scale-factor
19217 This variable allows the user to magnify the effect of GroupLens scores.
19218 The scale factor is applied after the offset.  The default is 1.
19219
19220 @end table
19221
19222
19223 @node Advanced Scoring
19224 @section Advanced Scoring
19225
19226 Scoring on Subjects and From headers is nice enough, but what if you're
19227 really interested in what a person has to say only when she's talking
19228 about a particular subject?  Or what if you really don't want to
19229 read what person A has to say when she's following up to person B, but
19230 want to read what she says when she's following up to person C?
19231
19232 By using advanced scoring rules you may create arbitrarily complex
19233 scoring patterns.
19234
19235 @menu
19236 * Advanced Scoring Syntax::     A definition.
19237 * Advanced Scoring Examples::   What they look like.
19238 * Advanced Scoring Tips::       Getting the most out of it.
19239 @end menu
19240
19241
19242 @node Advanced Scoring Syntax
19243 @subsection Advanced Scoring Syntax
19244
19245 Ordinary scoring rules have a string as the first element in the rule.
19246 Advanced scoring rules have a list as the first element.  The second
19247 element is the score to be applied if the first element evaluated to a
19248 non-@code{nil} value.
19249
19250 These lists may consist of three logical operators, one redirection
19251 operator, and various match operators.
19252
19253 Logical operators:
19254
19255 @table @code
19256 @item &
19257 @itemx and
19258 This logical operator will evaluate each of its arguments until it finds
19259 one that evaluates to @code{false}, and then it'll stop.  If all arguments
19260 evaluate to @code{true} values, then this operator will return
19261 @code{true}.
19262
19263 @item |
19264 @itemx or
19265 This logical operator will evaluate each of its arguments until it finds
19266 one that evaluates to @code{true}.  If no arguments are @code{true},
19267 then this operator will return @code{false}.
19268
19269 @item !
19270 @itemx not
19271 @itemx Â¬
19272 This logical operator only takes a single argument.  It returns the
19273 logical negation of the value of its argument.
19274
19275 @end table
19276
19277 There is an @dfn{indirection operator} that will make its arguments
19278 apply to the ancestors of the current article being scored.  For
19279 instance, @code{1-} will make score rules apply to the parent of the
19280 current article.  @code{2-} will make score rules apply to the
19281 grandparent of the current article.  Alternatively, you can write
19282 @code{^^}, where the number of @code{^}s (carets) says how far back into
19283 the ancestry you want to go.
19284
19285 Finally, we have the match operators.  These are the ones that do the
19286 real work.  Match operators are header name strings followed by a match
19287 and a match type.  A typical match operator looks like @samp{("from"
19288 "Lars Ingebrigtsen" s)}.  The header names are the same as when using
19289 simple scoring, and the match types are also the same.
19290
19291
19292 @node Advanced Scoring Examples
19293 @subsection Advanced Scoring Examples
19294
19295 Please note that the following examples are score file rules.  To
19296 make a complete score file from them, surround them with another pair
19297 of parentheses.
19298
19299 Let's say you want to increase the score of articles written by Lars
19300 when he's talking about Gnus:
19301
19302 @example
19303 ((&
19304   ("from" "Lars Ingebrigtsen")
19305   ("subject" "Gnus"))
19306  1000)
19307 @end example
19308
19309 Quite simple, huh?
19310
19311 When he writes long articles, he sometimes has something nice to say:
19312
19313 @example
19314 ((&
19315   ("from" "Lars Ingebrigtsen")
19316   (|
19317    ("subject" "Gnus")
19318    ("lines" 100 >)))
19319  1000)
19320 @end example
19321
19322 However, when he responds to things written by Reig Eigil Logge, you
19323 really don't want to read what he's written:
19324
19325 @example
19326 ((&
19327   ("from" "Lars Ingebrigtsen")
19328   (1- ("from" "Reig Eigir Logge")))
19329  -100000)
19330 @end example
19331
19332 Everybody that follows up Redmondo when he writes about disappearing
19333 socks should have their scores raised, but only when they talk about
19334 white socks.  However, when Lars talks about socks, it's usually not
19335 very interesting:
19336
19337 @example
19338 ((&
19339   (1-
19340    (&
19341     ("from" "redmondo@@.*no" r)
19342     ("body" "disappearing.*socks" t)))
19343   (! ("from" "Lars Ingebrigtsen"))
19344   ("body" "white.*socks"))
19345  1000)
19346 @end example
19347
19348 The possibilities are endless.
19349
19350
19351 @node Advanced Scoring Tips
19352 @subsection Advanced Scoring Tips
19353
19354 The @code{&} and @code{|} logical operators do short-circuit logic.
19355 That is, they stop processing their arguments when it's clear what the
19356 result of the operation will be.  For instance, if one of the arguments
19357 of an @code{&} evaluates to @code{false}, there's no point in evaluating
19358 the rest of the arguments.  This means that you should put slow matches
19359 (@samp{body}, @samp{header}) last and quick matches (@samp{from},
19360 @samp{subject}) first.
19361
19362 The indirection arguments (@code{1-} and so on) will make their
19363 arguments work on previous generations of the thread.  If you say
19364 something like:
19365
19366 @example
19367 ...
19368 (1-
19369  (1-
19370   ("from" "lars")))
19371 ...
19372 @end example
19373
19374 Then that means "score on the from header of the grandparent of the
19375 current article".  An indirection is quite fast, but it's better to say:
19376
19377 @example
19378 (1-
19379  (&
19380   ("from" "Lars")
19381   ("subject" "Gnus")))
19382 @end example
19383
19384 than it is to say:
19385
19386 @example
19387 (&
19388  (1- ("from" "Lars"))
19389  (1- ("subject" "Gnus")))
19390 @end example
19391
19392
19393 @node Score Decays
19394 @section Score Decays
19395 @cindex score decays
19396 @cindex decays
19397
19398 You may find that your scores have a tendency to grow without
19399 bounds, especially if you're using adaptive scoring.  If scores get too
19400 big, they lose all meaning---they simply max out and it's difficult to
19401 use them in any sensible way.
19402
19403 @vindex gnus-decay-scores
19404 @findex gnus-decay-score
19405 @vindex gnus-decay-score-function
19406 Gnus provides a mechanism for decaying scores to help with this problem.
19407 When score files are loaded and @code{gnus-decay-scores} is
19408 non-@code{nil}, Gnus will run the score files through the decaying
19409 mechanism thereby lowering the scores of all non-permanent score rules.
19410 The decay itself if performed by the @code{gnus-decay-score-function}
19411 function, which is @code{gnus-decay-score} by default.  Here's the
19412 definition of that function:
19413
19414 @lisp
19415 (defun gnus-decay-score (score)
19416   "Decay SCORE.
19417 This is done according to `gnus-score-decay-constant'
19418 and `gnus-score-decay-scale'."
19419   (floor
19420    (- score
19421       (* (if (< score 0) 1 -1)
19422          (min (abs score)
19423               (max gnus-score-decay-constant
19424                    (* (abs score)
19425                       gnus-score-decay-scale)))))))
19426 @end lisp
19427
19428 @vindex gnus-score-decay-scale
19429 @vindex gnus-score-decay-constant
19430 @code{gnus-score-decay-constant} is 3 by default and
19431 @code{gnus-score-decay-scale} is 0.05.  This should cause the following:
19432
19433 @enumerate
19434 @item
19435 Scores between -3 and 3 will be set to 0 when this function is called.
19436
19437 @item
19438 Scores with magnitudes between 3 and 60 will be shrunk by 3.
19439
19440 @item
19441 Scores with magnitudes greater than 60 will be shrunk by 5% of the
19442 score.
19443 @end enumerate
19444
19445 If you don't like this decay function, write your own.  It is called
19446 with the score to be decayed as its only parameter, and it should return
19447 the new score, which should be an integer.
19448
19449 Gnus will try to decay scores once a day.  If you haven't run Gnus for
19450 four days, Gnus will decay the scores four times, for instance.
19451
19452 @iftex
19453 @iflatex
19454 @chapter Message
19455 @include message.texi
19456 @chapter Emacs MIME
19457 @include emacs-mime.texi
19458 @chapter Sieve
19459 @include sieve.texi
19460 @c @chapter PGG
19461 @c @include pgg.texi
19462 @end iflatex
19463 @end iftex
19464
19465 @node Various
19466 @chapter Various
19467
19468 @menu
19469 * Process/Prefix::              A convention used by many treatment commands.
19470 * Interactive::                 Making Gnus ask you many questions.
19471 * Symbolic Prefixes::           How to supply some Gnus functions with options.
19472 * Formatting Variables::        You can specify what buffers should look like.
19473 * Window Layout::               Configuring the Gnus buffer windows.
19474 * Faces and Fonts::             How to change how faces look.
19475 * Compilation::                 How to speed Gnus up.
19476 * Mode Lines::                  Displaying information in the mode lines.
19477 * Highlighting and Menus::      Making buffers look all nice and cozy.
19478 * Buttons::                     Get tendinitis in ten easy steps!
19479 * Daemons::                     Gnus can do things behind your back.
19480 * NoCeM::                       How to avoid spam and other fatty foods.
19481 * Undo::                        Some actions can be undone.
19482 * Predicate Specifiers::        Specifying predicates.
19483 * Moderation::                  What to do if you're a moderator.
19484 * Image Enhancements::          Modern versions of Emacs/XEmacs can display images.
19485 * Fuzzy Matching::              What's the big fuzz?
19486 * Thwarting Email Spam::        A how-to on avoiding unsolicited commercial email.
19487 * Various Various::             Things that are really various.
19488 @end menu
19489
19490
19491 @node Process/Prefix
19492 @section Process/Prefix
19493 @cindex process/prefix convention
19494
19495 Many functions, among them functions for moving, decoding and saving
19496 articles, use what is known as the @dfn{Process/Prefix convention}.
19497
19498 This is a method for figuring out what articles the user wants the
19499 command to be performed on.
19500
19501 It goes like this:
19502
19503 If the numeric prefix is N, perform the operation on the next N
19504 articles, starting with the current one.  If the numeric prefix is
19505 negative, perform the operation on the previous N articles, starting
19506 with the current one.
19507
19508 @vindex transient-mark-mode
19509 If @code{transient-mark-mode} in non-@code{nil} and the region is
19510 active, all articles in the region will be worked upon.
19511
19512 If there is no numeric prefix, but some articles are marked with the
19513 process mark, perform the operation on the articles marked with
19514 the process mark.
19515
19516 If there is neither a numeric prefix nor any articles marked with the
19517 process mark, just perform the operation on the current article.
19518
19519 Quite simple, really, but it needs to be made clear so that surprises
19520 are avoided.
19521
19522 Commands that react to the process mark will push the current list of
19523 process marked articles onto a stack and will then clear all process
19524 marked articles.  You can restore the previous configuration with the
19525 @kbd{M P y} command (@pxref{Setting Process Marks}).
19526
19527 @vindex gnus-summary-goto-unread
19528 One thing that seems to shock & horrify lots of people is that, for
19529 instance, @kbd{3 d} does exactly the same as @kbd{d} @kbd{d} @kbd{d}.
19530 Since each @kbd{d} (which marks the current article as read) by default
19531 goes to the next unread article after marking, this means that @kbd{3 d}
19532 will mark the next three unread articles as read, no matter what the
19533 summary buffer looks like.  Set @code{gnus-summary-goto-unread} to
19534 @code{nil} for a more straightforward action.
19535
19536 Many commands do not use the process/prefix convention.  All commands
19537 that do explicitly say so in this manual.  To apply the process/prefix
19538 convention to commands that do not use it, you can use the @kbd{M-&}
19539 command.  For instance, to mark all the articles in the group as
19540 expirable, you could say `M P b M-& E'.
19541
19542
19543 @node Interactive
19544 @section Interactive
19545 @cindex interaction
19546
19547 @table @code
19548
19549 @item gnus-novice-user
19550 @vindex gnus-novice-user
19551 If this variable is non-@code{nil}, you are either a newcomer to the
19552 World of Usenet, or you are very cautious, which is a nice thing to be,
19553 really.  You will be given questions of the type ``Are you sure you want
19554 to do this?'' before doing anything dangerous.  This is @code{t} by
19555 default.
19556
19557 @item gnus-expert-user
19558 @vindex gnus-expert-user
19559 If this variable is non-@code{nil}, you will seldom be asked any
19560 questions by Gnus.  It will simply assume you know what you're doing, no
19561 matter how strange.
19562
19563 @item gnus-interactive-catchup
19564 @vindex gnus-interactive-catchup
19565 Require confirmation before catching up a group if non-@code{nil}.  It
19566 is @code{t} by default.
19567
19568 @item gnus-interactive-exit
19569 @vindex gnus-interactive-exit
19570 Require confirmation before exiting Gnus.  This variable is @code{t} by
19571 default.
19572 @end table
19573
19574
19575 @node Symbolic Prefixes
19576 @section Symbolic Prefixes
19577 @cindex symbolic prefixes
19578
19579 Quite a lot of Emacs commands react to the (numeric) prefix.  For
19580 instance, @kbd{C-u 4 C-f} moves point four characters forward, and
19581 @kbd{C-u 9 0 0 I s s p} adds a permanent @code{Subject} substring score
19582 rule of 900 to the current article.
19583
19584 This is all nice and well, but what if you want to give a command some
19585 additional information?  Well, what most commands do is interpret the
19586 ``raw'' prefix in some special way.  @kbd{C-u 0 C-x C-s} means that one
19587 doesn't want a backup file to be created when saving the current buffer,
19588 for instance.  But what if you want to save without making a backup
19589 file, and you want Emacs to flash lights and play a nice tune at the
19590 same time?  You can't, and you're probably perfectly happy that way.
19591
19592 @kindex M-i (Summary)
19593 @findex gnus-symbolic-argument
19594 I'm not, so I've added a second prefix---the @dfn{symbolic prefix}.  The
19595 prefix key is @kbd{M-i} (@code{gnus-symbolic-argument}), and the next
19596 character typed in is the value.  You can stack as many @kbd{M-i}
19597 prefixes as you want.  @kbd{M-i a C-M-u} means ``feed the @kbd{C-M-u}
19598 command the symbolic prefix @code{a}''.  @kbd{M-i a M-i b C-M-u} means
19599 ``feed the @kbd{C-M-u} command the symbolic prefixes @code{a} and
19600 @code{b}''.  You get the drift.
19601
19602 Typing in symbolic prefixes to commands that don't accept them doesn't
19603 hurt, but it doesn't do any good either.  Currently not many Gnus
19604 functions make use of the symbolic prefix.
19605
19606 If you're interested in how Gnus implements this, @pxref{Extended
19607 Interactive}.
19608
19609
19610 @node Formatting Variables
19611 @section Formatting Variables
19612 @cindex formatting variables
19613
19614 Throughout this manual you've probably noticed lots of variables called
19615 things like @code{gnus-group-line-format} and
19616 @code{gnus-summary-mode-line-format}.  These control how Gnus is to
19617 output lines in the various buffers.  There's quite a lot of them.
19618 Fortunately, they all use the same syntax, so there's not that much to
19619 be annoyed by.
19620
19621 Here's an example format spec (from the group buffer): @samp{%M%S%5y:
19622 %(%g%)\n}.  We see that it is indeed extremely ugly, and that there are
19623 lots of percentages everywhere.
19624
19625 @menu
19626 * Formatting Basics::           A formatting variable is basically a format string.
19627 * Mode Line Formatting::        Some rules about mode line formatting variables.
19628 * Advanced Formatting::         Modifying output in various ways.
19629 * User-Defined Specs::          Having Gnus call your own functions.
19630 * Formatting Fonts::            Making the formatting look colorful and nice.
19631 * Positioning Point::           Moving point to a position after an operation.
19632 * Tabulation::                  Tabulating your output.
19633 * Wide Characters::             Dealing with wide characters.
19634 @end menu
19635
19636 Currently Gnus uses the following formatting variables:
19637 @code{gnus-group-line-format}, @code{gnus-summary-line-format},
19638 @code{gnus-server-line-format}, @code{gnus-topic-line-format},
19639 @code{gnus-group-mode-line-format},
19640 @code{gnus-summary-mode-line-format},
19641 @code{gnus-article-mode-line-format},
19642 @code{gnus-server-mode-line-format}, and
19643 @code{gnus-summary-pick-line-format}.
19644
19645 All these format variables can also be arbitrary elisp forms.  In that
19646 case, they will be @code{eval}ed to insert the required lines.
19647
19648 @kindex M-x gnus-update-format
19649 @findex gnus-update-format
19650 Gnus includes a command to help you while creating your own format
19651 specs.  @kbd{M-x gnus-update-format} will @code{eval} the current form,
19652 update the spec in question and pop you to a buffer where you can
19653 examine the resulting lisp code to be run to generate the line.
19654
19655
19656
19657 @node Formatting Basics
19658 @subsection Formatting Basics
19659
19660 Each @samp{%} element will be replaced by some string or other when the
19661 buffer in question is generated.  @samp{%5y} means ``insert the @samp{y}
19662 spec, and pad with spaces to get a 5-character field''.
19663
19664 As with normal C and Emacs Lisp formatting strings, the numerical
19665 modifier between the @samp{%} and the formatting type character will
19666 @dfn{pad} the output so that it is always at least that long.
19667 @samp{%5y} will make the field always (at least) five characters wide by
19668 padding with spaces to the left.  If you say @samp{%-5y}, it will pad to
19669 the right instead.
19670
19671 You may also wish to limit the length of the field to protect against
19672 particularly wide values.  For that you can say @samp{%4,6y}, which
19673 means that the field will never be more than 6 characters wide and never
19674 less than 4 characters wide.
19675
19676 Also Gnus supports some extended format specifications, such as
19677 @samp{%&user-date;}.
19678
19679
19680 @node Mode Line Formatting
19681 @subsection Mode Line Formatting
19682
19683 Mode line formatting variables (e.g.,
19684 @code{gnus-summary-mode-line-format}) follow the same rules as other,
19685 buffer line oriented formatting variables (@pxref{Formatting Basics})
19686 with the following two differences:
19687
19688 @enumerate
19689
19690 @item
19691 There must be no newline (@samp{\n}) at the end.
19692
19693 @item
19694 The special @samp{%%b} spec can be used to display the buffer name.
19695 Well, it's no spec at all, really---@samp{%%} is just a way to quote
19696 @samp{%} to allow it to pass through the formatting machinery unmangled,
19697 so that Emacs receives @samp{%b}, which is something the Emacs mode line
19698 display interprets to mean ``show the buffer name''.  For a full list of
19699 mode line specs Emacs understands, see the documentation of the
19700 @code{mode-line-format} variable.
19701
19702 @end enumerate
19703
19704
19705 @node Advanced Formatting
19706 @subsection Advanced Formatting
19707
19708 It is frequently useful to post-process the fields in some way.
19709 Padding, limiting, cutting off parts and suppressing certain values can
19710 be achieved by using @dfn{tilde modifiers}.  A typical tilde spec might
19711 look like @samp{%~(cut 3)~(ignore "0")y}.
19712
19713 These are the valid modifiers:
19714
19715 @table @code
19716 @item pad
19717 @itemx pad-left
19718 Pad the field to the left with spaces until it reaches the required
19719 length.
19720
19721 @item pad-right
19722 Pad the field to the right with spaces until it reaches the required
19723 length.
19724
19725 @item max
19726 @itemx max-left
19727 Cut off characters from the left until it reaches the specified length.
19728
19729 @item max-right
19730 Cut off characters from the right until it reaches the specified
19731 length.
19732
19733 @item cut
19734 @itemx cut-left
19735 Cut off the specified number of characters from the left.
19736
19737 @item cut-right
19738 Cut off the specified number of characters from the right.
19739
19740 @item ignore
19741 Return an empty string if the field is equal to the specified value.
19742
19743 @item form
19744 Use the specified form as the field value when the @samp{@@} spec is
19745 used.
19746
19747 Here's an example:
19748
19749 @lisp
19750 "~(form (current-time-string))@@"
19751 @end lisp
19752
19753 @end table
19754
19755 Let's take an example.  The @samp{%o} spec in the summary mode lines
19756 will return a date in compact ISO8601 format---@samp{19960809T230410}.
19757 This is quite a mouthful, so we want to shave off the century number and
19758 the time, leaving us with a six-character date.  That would be
19759 @samp{%~(cut-left 2)~(max-right 6)~(pad 6)o}.  (Cutting is done before
19760 maxing, and we need the padding to ensure that the date is never less
19761 than 6 characters to make it look nice in columns.)
19762
19763 Ignoring is done first; then cutting; then maxing; and then as the very
19764 last operation, padding.
19765
19766 @vindex gnus-compile-user-specs
19767 If @code{gnus-compile-user-specs} is set to @code{nil} (@code{t} by
19768 default) with your strong personality, and use a lots of these advanced
19769 thingies, you'll find that Gnus gets quite slow.  This can be helped
19770 enormously by running @kbd{M-x gnus-compile} when you are satisfied with
19771 the look of your lines.
19772 @xref{Compilation}.
19773
19774
19775 @node User-Defined Specs
19776 @subsection User-Defined Specs
19777
19778 All the specs allow for inserting user defined specifiers---@samp{u}.
19779 The next character in the format string should be a letter.  Gnus
19780 will call the function @code{gnus-user-format-function-}@samp{X}, where
19781 @samp{X} is the letter following @samp{%u}.  The function will be passed
19782 a single parameter---what the parameter means depends on what buffer
19783 it's being called from.  The function should return a string, which will
19784 be inserted into the buffer just like information from any other
19785 specifier.  This function may also be called with dummy values, so it
19786 should protect against that.
19787
19788 Also Gnus supports extended user-defined specs, such as @samp{%u&foo;}.
19789 Gnus will call the function @code{gnus-user-format-function-}@samp{foo}.
19790
19791 You can also use tilde modifiers (@pxref{Advanced Formatting} to achieve
19792 much the same without defining new functions.  Here's an example:
19793 @samp{%~(form (count-lines (point-min) (point)))@@}.  The form
19794 given here will be evaluated to yield the current line number, and then
19795 inserted.
19796
19797
19798 @node Formatting Fonts
19799 @subsection Formatting Fonts
19800
19801 There are specs for highlighting, and these are shared by all the format
19802 variables.  Text inside the @samp{%(} and @samp{%)} specifiers will get
19803 the special @code{mouse-face} property set, which means that it will be
19804 highlighted (with @code{gnus-mouse-face}) when you put the mouse pointer
19805 over it.
19806
19807 Text inside the @samp{%@{} and @samp{%@}} specifiers will have their
19808 normal faces set using @code{gnus-face-0}, which is @code{bold} by
19809 default.  If you say @samp{%1@{}, you'll get @code{gnus-face-1} instead,
19810 and so on.  Create as many faces as you wish.  The same goes for the
19811 @code{mouse-face} specs---you can say @samp{%3(hello%)} to have
19812 @samp{hello} mouse-highlighted with @code{gnus-mouse-face-3}.
19813
19814 Text inside the @samp{%<<} and @samp{%>>} specifiers will get the
19815 special @code{balloon-help} property set to @code{gnus-balloon-face-0}.
19816 If you say @samp{%1<<}, you'll get @code{gnus-balloon-face-1} and so on.
19817 The @code{gnus-balloon-face-*} variables should be either strings or
19818 symbols naming functions that return a string.  When the mouse passes
19819 over text with this property set, a balloon window will appear and
19820 display the string.  Please refer to @ref{(emacs)Help Echo} (in GNU
19821 Emacs) or the doc string of @code{balloon-help-mode} (in XEmacs) for
19822 more information on this.  (For technical reasons, the guillemets have
19823 been approximated as @samp{<<} and @samp{>>} in this paragraph.)
19824
19825 Here's an alternative recipe for the group buffer:
19826
19827 @lisp
19828 ;; Create three face types.
19829 (setq gnus-face-1 'bold)
19830 (setq gnus-face-3 'italic)
19831
19832 ;; We want the article count to be in
19833 ;; a bold and green face.  So we create
19834 ;; a new face called `my-green-bold'.
19835 (copy-face 'bold 'my-green-bold)
19836 ;; Set the color.
19837 (set-face-foreground 'my-green-bold "ForestGreen")
19838 (setq gnus-face-2 'my-green-bold)
19839
19840 ;; Set the new & fancy format.
19841 (setq gnus-group-line-format
19842       "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n")
19843 @end lisp
19844
19845 I'm sure you'll be able to use this scheme to create totally unreadable
19846 and extremely vulgar displays.  Have fun!
19847
19848 Note that the @samp{%(} specs (and friends) do not make any sense on the
19849 mode-line variables.
19850
19851 @node Positioning Point
19852 @subsection Positioning Point
19853
19854 Gnus usually moves point to a pre-defined place on each line in most
19855 buffers.  By default, point move to the first colon character on the
19856 line.  You can customize this behaviour in three different ways.
19857
19858 You can move the colon character to somewhere else on the line.
19859
19860 @findex gnus-goto-colon
19861 You can redefine the function that moves the point to the colon.  The
19862 function is called @code{gnus-goto-colon}.
19863
19864 But perhaps the most convenient way to deal with this, if you don't want
19865 to have a colon in your line, is to use the @samp{%*} specifier.  If you
19866 put a @samp{%*} somewhere in your format line definition, Gnus will
19867 place point there.
19868
19869
19870 @node Tabulation
19871 @subsection Tabulation
19872
19873 You can usually line up your displays by padding and cutting your
19874 strings.  However, when combining various strings of different size, it
19875 can often be more convenient to just output the strings, and then worry
19876 about lining up the following text afterwards.
19877
19878 To do that, Gnus supplies tabulator specs--@samp{%=}.  There are two
19879 different types---@dfn{hard tabulators} and @dfn{soft tabulators}.
19880
19881 @samp{%50=} will insert space characters to pad the line up to column
19882 50.  If the text is already past column 50, nothing will be inserted.
19883 This is the soft tabulator.
19884
19885 @samp{%-50=} will insert space characters to pad the line up to column
19886 50.  If the text is already past column 50, the excess text past column
19887 50 will be removed.  This is the hard tabulator.
19888
19889
19890 @node Wide Characters
19891 @subsection Wide Characters
19892
19893 Proportional fonts in most countries have characters of the same width.
19894 Some countries, however, use Latin characters mixed with wider
19895 characters---most notable East Asian countries.
19896
19897 The problem is that when formatting, Gnus assumes that if a string is 10
19898 characters wide, it'll be 10 Latin characters wide on the screen.  In
19899 these countries, that's not true.
19900
19901 @vindex gnus-use-correct-string-widths
19902 To help fix this, you can set @code{gnus-use-correct-string-widths} to
19903 @code{t}.  This makes buffer generation slower, but the results will be
19904 prettier.  The default value under XEmacs is @code{t} but @code{nil}
19905 for Emacs.
19906
19907
19908 @node Window Layout
19909 @section Window Layout
19910 @cindex window layout
19911
19912 No, there's nothing here about X, so be quiet.
19913
19914 @vindex gnus-use-full-window
19915 If @code{gnus-use-full-window} non-@code{nil}, Gnus will delete all
19916 other windows and occupy the entire Emacs screen by itself.  It is
19917 @code{t} by default.
19918
19919 Setting this variable to @code{nil} kinda works, but there are
19920 glitches.  Use at your own peril.
19921
19922 @vindex gnus-buffer-configuration
19923 @code{gnus-buffer-configuration} describes how much space each Gnus
19924 buffer should be given.  Here's an excerpt of this variable:
19925
19926 @lisp
19927 ((group (vertical 1.0 (group 1.0 point)
19928                       (if gnus-carpal (group-carpal 4))))
19929  (article (vertical 1.0 (summary 0.25 point)
19930                         (article 1.0))))
19931 @end lisp
19932
19933 This is an alist.  The @dfn{key} is a symbol that names some action or
19934 other.  For instance, when displaying the group buffer, the window
19935 configuration function will use @code{group} as the key.  A full list of
19936 possible names is listed below.
19937
19938 The @dfn{value} (i.e., the @dfn{split}) says how much space each buffer
19939 should occupy.  To take the @code{article} split as an example -
19940
19941 @lisp
19942 (article (vertical 1.0 (summary 0.25 point)
19943                        (article 1.0)))
19944 @end lisp
19945
19946 This @dfn{split} says that the summary buffer should occupy 25% of upper
19947 half of the screen, and that it is placed over the article buffer.  As
19948 you may have noticed, 100% + 25% is actually 125% (yup, I saw y'all
19949 reaching for that calculator there).  However, the special number
19950 @code{1.0} is used to signal that this buffer should soak up all the
19951 rest of the space available after the rest of the buffers have taken
19952 whatever they need.  There should be only one buffer with the @code{1.0}
19953 size spec per split.
19954
19955 Point will be put in the buffer that has the optional third element
19956 @code{point}.  In a @code{frame} split, the last subsplit having a leaf
19957 split where the tag @code{frame-focus} is a member (i.e. is the third or
19958 fourth element in the list, depending on whether the @code{point} tag is
19959 present) gets focus.
19960
19961 Here's a more complicated example:
19962
19963 @lisp
19964 (article (vertical 1.0 (group 4)
19965                        (summary 0.25 point)
19966                        (if gnus-carpal (summary-carpal 4))
19967                        (article 1.0)))
19968 @end lisp
19969
19970 If the size spec is an integer instead of a floating point number,
19971 then that number will be used to say how many lines a buffer should
19972 occupy, not a percentage.
19973
19974 If the @dfn{split} looks like something that can be @code{eval}ed (to be
19975 precise---if the @code{car} of the split is a function or a subr), this
19976 split will be @code{eval}ed.  If the result is non-@code{nil}, it will
19977 be used as a split.  This means that there will be three buffers if
19978 @code{gnus-carpal} is @code{nil}, and four buffers if @code{gnus-carpal}
19979 is non-@code{nil}.
19980
19981 Not complicated enough for you?  Well, try this on for size:
19982
19983 @lisp
19984 (article (horizontal 1.0
19985              (vertical 0.5
19986                  (group 1.0)
19987                  (gnus-carpal 4))
19988              (vertical 1.0
19989                  (summary 0.25 point)
19990                  (summary-carpal 4)
19991                  (article 1.0))))
19992 @end lisp
19993
19994 Whoops.  Two buffers with the mystery 100% tag.  And what's that
19995 @code{horizontal} thingie?
19996
19997 If the first element in one of the split is @code{horizontal}, Gnus will
19998 split the window horizontally, giving you two windows side-by-side.
19999 Inside each of these strips you may carry on all you like in the normal
20000 fashion.  The number following @code{horizontal} says what percentage of
20001 the screen is to be given to this strip.
20002
20003 For each split, there @emph{must} be one element that has the 100% tag.
20004 The splitting is never accurate, and this buffer will eat any leftover
20005 lines from the splits.
20006
20007 To be slightly more formal, here's a definition of what a valid split
20008 may look like:
20009
20010 @example
20011 split      = frame | horizontal | vertical | buffer | form
20012 frame      = "(frame " size *split ")"
20013 horizontal = "(horizontal " size *split ")"
20014 vertical   = "(vertical " size *split ")"
20015 buffer     = "(" buf-name " " size *[ "point" ] *[ "frame-focus"] ")"
20016 size       = number | frame-params
20017 buf-name   = group | article | summary ...
20018 @end example
20019
20020 The limitations are that the @code{frame} split can only appear as the
20021 top-level split.  @var{form} should be an Emacs Lisp form that should
20022 return a valid split.  We see that each split is fully recursive, and
20023 may contain any number of @code{vertical} and @code{horizontal} splits.
20024
20025 @vindex gnus-window-min-width
20026 @vindex gnus-window-min-height
20027 @cindex window height
20028 @cindex window width
20029 Finding the right sizes can be a bit complicated.  No window may be less
20030 than @code{gnus-window-min-height} (default 1) characters high, and all
20031 windows must be at least @code{gnus-window-min-width} (default 1)
20032 characters wide.  Gnus will try to enforce this before applying the
20033 splits.  If you want to use the normal Emacs window width/height limit,
20034 you can just set these two variables to @code{nil}.
20035
20036 If you're not familiar with Emacs terminology, @code{horizontal} and
20037 @code{vertical} splits may work the opposite way of what you'd expect.
20038 Windows inside a @code{horizontal} split are shown side-by-side, and
20039 windows within a @code{vertical} split are shown above each other.
20040
20041 @findex gnus-configure-frame
20042 If you want to experiment with window placement, a good tip is to call
20043 @code{gnus-configure-frame} directly with a split.  This is the function
20044 that does all the real work when splitting buffers.  Below is a pretty
20045 nonsensical configuration with 5 windows; two for the group buffer and
20046 three for the article buffer.  (I said it was nonsensical.)  If you
20047 @code{eval} the statement below, you can get an idea of how that would
20048 look straight away, without going through the normal Gnus channels.
20049 Play with it until you're satisfied, and then use
20050 @code{gnus-add-configuration} to add your new creation to the buffer
20051 configuration list.
20052
20053 @lisp
20054 (gnus-configure-frame
20055  '(horizontal 1.0
20056     (vertical 10
20057       (group 1.0)
20058       (article 0.3 point))
20059     (vertical 1.0
20060       (article 1.0)
20061       (horizontal 4
20062         (group 1.0)
20063         (article 10)))))
20064 @end lisp
20065
20066 You might want to have several frames as well.  No prob---just use the
20067 @code{frame} split:
20068
20069 @lisp
20070 (gnus-configure-frame
20071  '(frame 1.0
20072          (vertical 1.0
20073                    (summary 0.25 point frame-focus)
20074                    (article 1.0))
20075          (vertical ((height . 5) (width . 15)
20076                     (user-position . t)
20077                     (left . -1) (top . 1))
20078                    (picon 1.0))))
20079
20080 @end lisp
20081
20082 This split will result in the familiar summary/article window
20083 configuration in the first (or ``main'') frame, while a small additional
20084 frame will be created where picons will be shown.  As you can see,
20085 instead of the normal @code{1.0} top-level spec, each additional split
20086 should have a frame parameter alist as the size spec.
20087 @xref{Frame Parameters, , Frame Parameters, elisp, The GNU Emacs Lisp
20088 Reference Manual}.  Under XEmacs, a frame property list will be
20089 accepted, too---for instance, @code{(height 5 width 15 left -1 top 1)}
20090 is such a plist.
20091 The list of all possible keys for @code{gnus-buffer-configuration} can
20092 be found in its default value.
20093
20094 Note that the @code{message} key is used for both
20095 @code{gnus-group-mail} and @code{gnus-summary-mail-other-window}.  If
20096 it is desirable to distinguish between the two, something like this
20097 might be used:
20098
20099 @lisp
20100 (message (horizontal 1.0
20101                      (vertical 1.0 (message 1.0 point))
20102                      (vertical 0.24
20103                                (if (buffer-live-p gnus-summary-buffer)
20104                                    '(summary 0.5))
20105                                (group 1.0))))
20106 @end lisp
20107
20108 One common desire for a multiple frame split is to have a separate frame
20109 for composing mail and news while leaving the original frame intact.  To
20110 accomplish that, something like the following can be done:
20111
20112 @lisp
20113 (message
20114   (frame 1.0
20115          (if (not (buffer-live-p gnus-summary-buffer))
20116              (car (cdr (assoc 'group gnus-buffer-configuration)))
20117            (car (cdr (assoc 'summary gnus-buffer-configuration))))
20118          (vertical ((user-position . t) (top . 1) (left . 1)
20119                     (name . "Message"))
20120                    (message 1.0 point))))
20121 @end lisp
20122
20123 @findex gnus-add-configuration
20124 Since the @code{gnus-buffer-configuration} variable is so long and
20125 complicated, there's a function you can use to ease changing the config
20126 of a single setting: @code{gnus-add-configuration}.  If, for instance,
20127 you want to change the @code{article} setting, you could say:
20128
20129 @lisp
20130 (gnus-add-configuration
20131  '(article (vertical 1.0
20132                (group 4)
20133                (summary .25 point)
20134                (article 1.0))))
20135 @end lisp
20136
20137 You'd typically stick these @code{gnus-add-configuration} calls in your
20138 @file{.gnus.el} file or in some startup hook---they should be run after
20139 Gnus has been loaded.
20140
20141 @vindex gnus-always-force-window-configuration
20142 If all windows mentioned in the configuration are already visible, Gnus
20143 won't change the window configuration.  If you always want to force the
20144 ``right'' window configuration, you can set
20145 @code{gnus-always-force-window-configuration} to non-@code{nil}.
20146
20147 If you're using tree displays (@pxref{Tree Display}), and the tree
20148 window is displayed vertically next to another window, you may also want
20149 to fiddle with @code{gnus-tree-minimize-window} to avoid having the
20150 windows resized.
20151
20152 @subsection Example Window Configurations
20153
20154 @itemize @bullet
20155 @item
20156 Narrow left hand side occupied by group buffer.  Right hand side split
20157 between summary buffer (top one-sixth) and article buffer (bottom).
20158
20159 @ifinfo
20160 @example
20161 +---+---------+
20162 | G | Summary |
20163 | r +---------+
20164 | o |         |
20165 | u | Article |
20166 | p |         |
20167 +---+---------+
20168 @end example
20169 @end ifinfo
20170
20171 @lisp
20172 (gnus-add-configuration
20173  '(article
20174    (horizontal 1.0
20175                (vertical 25 (group 1.0))
20176                (vertical 1.0
20177                          (summary 0.16 point)
20178                          (article 1.0)))))
20179
20180 (gnus-add-configuration
20181  '(summary
20182    (horizontal 1.0
20183                (vertical 25 (group 1.0))
20184                (vertical 1.0 (summary 1.0 point)))))
20185 @end lisp
20186
20187 @end itemize
20188
20189
20190 @node Faces and Fonts
20191 @section Faces and Fonts
20192 @cindex faces
20193 @cindex fonts
20194 @cindex colors
20195
20196 Fiddling with fonts and faces used to be very difficult, but these days
20197 it is very simple.  You simply say @kbd{M-x customize-face}, pick out
20198 the face you want to alter, and alter it via the standard Customize
20199 interface.
20200
20201
20202 @node Compilation
20203 @section Compilation
20204 @cindex compilation
20205 @cindex byte-compilation
20206
20207 @findex gnus-compile
20208
20209 Remember all those line format specification variables?
20210 @code{gnus-summary-line-format}, @code{gnus-group-line-format}, and so
20211 on.  By default, T-gnus will use the byte-compiled codes of these
20212 variables and we can keep a slow-down to a minimum.  However, if you set
20213 @code{gnus-compile-user-specs} to @code{nil} (@code{t} by default),
20214 unfortunately, changing them will mean a quite significant slow-down.
20215 (The default values of these variables have byte-compiled functions
20216 associated with them, while the user-generated versions do not, of
20217 course.)
20218
20219 To help with this, you can run @kbd{M-x gnus-compile} after you've
20220 fiddled around with the variables and feel that you're (kind of)
20221 satisfied.  This will result in the new specs being byte-compiled, and
20222 you'll get top speed again.  Note that T-gnus will not save these
20223 compiled specs in the @file{.newsrc.eld} file.
20224
20225 @table @code
20226 @item gnus-compile-user-specs
20227 @vindex gnus-compile-user-specs
20228 If it is non-nil, the user-defined format specs will be byte-compiled
20229 automatically.  The default value of this variable is @code{t}.  It has
20230 an effect on the values of @code{gnus-*-line-format-spec}.
20231 @end table
20232
20233
20234 @node Mode Lines
20235 @section Mode Lines
20236 @cindex mode lines
20237
20238 @vindex gnus-updated-mode-lines
20239 @code{gnus-updated-mode-lines} says what buffers should keep their mode
20240 lines updated.  It is a list of symbols.  Supported symbols include
20241 @code{group}, @code{article}, @code{summary}, @code{server},
20242 @code{browse}, and @code{tree}.  If the corresponding symbol is present,
20243 Gnus will keep that mode line updated with information that may be
20244 pertinent.  If this variable is @code{nil}, screen refresh may be
20245 quicker.
20246
20247 @cindex display-time
20248
20249 @vindex gnus-mode-non-string-length
20250 By default, Gnus displays information on the current article in the mode
20251 lines of the summary and article buffers.  The information Gnus wishes
20252 to display (e.g. the subject of the article) is often longer than the
20253 mode lines, and therefore have to be cut off at some point.  The
20254 @code{gnus-mode-non-string-length} variable says how long the other
20255 elements on the line is (i.e., the non-info part).  If you put
20256 additional elements on the mode line (e.g. a clock), you should modify
20257 this variable:
20258
20259 @c Hook written by Francesco Potorti` <pot@cnuce.cnr.it>
20260 @lisp
20261 (add-hook 'display-time-hook
20262           (lambda () (setq gnus-mode-non-string-length
20263                            (+ 21
20264                               (if line-number-mode 5 0)
20265                               (if column-number-mode 4 0)
20266                               (length display-time-string)))))
20267 @end lisp
20268
20269 If this variable is @code{nil} (which is the default), the mode line
20270 strings won't be chopped off, and they won't be padded either.  Note
20271 that the default is unlikely to be desirable, as even the percentage
20272 complete in the buffer may be crowded off the mode line; the user should
20273 configure this variable appropriately for her configuration.
20274
20275
20276 @node Highlighting and Menus
20277 @section Highlighting and Menus
20278 @cindex visual
20279 @cindex highlighting
20280 @cindex menus
20281
20282 @vindex gnus-visual
20283 The @code{gnus-visual} variable controls most of the Gnus-prettifying
20284 aspects.  If @code{nil}, Gnus won't attempt to create menus or use fancy
20285 colors or fonts.  This will also inhibit loading the @file{gnus-vis.el}
20286 file.
20287
20288 This variable can be a list of visual properties that are enabled.  The
20289 following elements are valid, and are all included by default:
20290
20291 @table @code
20292 @item group-highlight
20293 Do highlights in the group buffer.
20294 @item summary-highlight
20295 Do highlights in the summary buffer.
20296 @item article-highlight
20297 Do highlights in the article buffer.
20298 @item highlight
20299 Turn on highlighting in all buffers.
20300 @item group-menu
20301 Create menus in the group buffer.
20302 @item summary-menu
20303 Create menus in the summary buffers.
20304 @item article-menu
20305 Create menus in the article buffer.
20306 @item browse-menu
20307 Create menus in the browse buffer.
20308 @item server-menu
20309 Create menus in the server buffer.
20310 @item score-menu
20311 Create menus in the score buffers.
20312 @item menu
20313 Create menus in all buffers.
20314 @end table
20315
20316 So if you only want highlighting in the article buffer and menus in all
20317 buffers, you could say something like:
20318
20319 @lisp
20320 (setq gnus-visual '(article-highlight menu))
20321 @end lisp
20322
20323 If you want highlighting only and no menus whatsoever, you'd say:
20324
20325 @lisp
20326 (setq gnus-visual '(highlight))
20327 @end lisp
20328
20329 If @code{gnus-visual} is @code{t}, highlighting and menus will be used
20330 in all Gnus buffers.
20331
20332 Other general variables that influence the look of all buffers include:
20333
20334 @table @code
20335 @item gnus-mouse-face
20336 @vindex gnus-mouse-face
20337 This is the face (i.e., font) used for mouse highlighting in Gnus.  No
20338 mouse highlights will be done if @code{gnus-visual} is @code{nil}.
20339
20340 @end table
20341
20342 There are hooks associated with the creation of all the different menus:
20343
20344 @table @code
20345
20346 @item gnus-article-menu-hook
20347 @vindex gnus-article-menu-hook
20348 Hook called after creating the article mode menu.
20349
20350 @item gnus-group-menu-hook
20351 @vindex gnus-group-menu-hook
20352 Hook called after creating the group mode menu.
20353
20354 @item gnus-summary-menu-hook
20355 @vindex gnus-summary-menu-hook
20356 Hook called after creating the summary mode menu.
20357
20358 @item gnus-server-menu-hook
20359 @vindex gnus-server-menu-hook
20360 Hook called after creating the server mode menu.
20361
20362 @item gnus-browse-menu-hook
20363 @vindex gnus-browse-menu-hook
20364 Hook called after creating the browse mode menu.
20365
20366 @item gnus-score-menu-hook
20367 @vindex gnus-score-menu-hook
20368 Hook called after creating the score mode menu.
20369
20370 @end table
20371
20372
20373 @node Buttons
20374 @section Buttons
20375 @cindex buttons
20376 @cindex mouse
20377 @cindex click
20378
20379 Those new-fangled @dfn{mouse} contraptions is very popular with the
20380 young, hep kids who don't want to learn the proper way to do things
20381 these days.  Why, I remember way back in the summer of '89, when I was
20382 using Emacs on a Tops 20 system.  Three hundred users on one single
20383 machine, and every user was running Simula compilers.  Bah!
20384
20385 Right.
20386
20387 @vindex gnus-carpal
20388 Well, you can make Gnus display bufferfuls of buttons you can click to
20389 do anything by setting @code{gnus-carpal} to @code{t}.  Pretty simple,
20390 really.  Tell the chiropractor I sent you.
20391
20392
20393 @table @code
20394
20395 @item gnus-carpal-mode-hook
20396 @vindex gnus-carpal-mode-hook
20397 Hook run in all carpal mode buffers.
20398
20399 @item gnus-carpal-button-face
20400 @vindex gnus-carpal-button-face
20401 Face used on buttons.
20402
20403 @item gnus-carpal-header-face
20404 @vindex gnus-carpal-header-face
20405 Face used on carpal buffer headers.
20406
20407 @item gnus-carpal-group-buffer-buttons
20408 @vindex gnus-carpal-group-buffer-buttons
20409 Buttons in the group buffer.
20410
20411 @item gnus-carpal-summary-buffer-buttons
20412 @vindex gnus-carpal-summary-buffer-buttons
20413 Buttons in the summary buffer.
20414
20415 @item gnus-carpal-server-buffer-buttons
20416 @vindex gnus-carpal-server-buffer-buttons
20417 Buttons in the server buffer.
20418
20419 @item gnus-carpal-browse-buffer-buttons
20420 @vindex gnus-carpal-browse-buffer-buttons
20421 Buttons in the browse buffer.
20422 @end table
20423
20424 All the @code{buttons} variables are lists.  The elements in these list
20425 are either cons cells where the @code{car} contains a text to be displayed and
20426 the @code{cdr} contains a function symbol, or a simple string.
20427
20428
20429 @node Daemons
20430 @section Daemons
20431 @cindex demons
20432 @cindex daemons
20433
20434 Gnus, being larger than any program ever written (allegedly), does lots
20435 of strange stuff that you may wish to have done while you're not
20436 present.  For instance, you may want it to check for new mail once in a
20437 while.  Or you may want it to close down all connections to all servers
20438 when you leave Emacs idle.  And stuff like that.
20439
20440 Gnus will let you do stuff like that by defining various
20441 @dfn{handlers}.  Each handler consists of three elements:  A
20442 @var{function}, a @var{time}, and an @var{idle} parameter.
20443
20444 Here's an example of a handler that closes connections when Emacs has
20445 been idle for thirty minutes:
20446
20447 @lisp
20448 (gnus-demon-close-connections nil 30)
20449 @end lisp
20450
20451 Here's a handler that scans for PGP headers every hour when Emacs is
20452 idle:
20453
20454 @lisp
20455 (gnus-demon-scan-pgp 60 t)
20456 @end lisp
20457
20458 This @var{time} parameter and than @var{idle} parameter work together
20459 in a strange, but wonderful fashion.  Basically, if @var{idle} is
20460 @code{nil}, then the function will be called every @var{time} minutes.
20461
20462 If @var{idle} is @code{t}, then the function will be called after
20463 @var{time} minutes only if Emacs is idle.  So if Emacs is never idle,
20464 the function will never be called.  But once Emacs goes idle, the
20465 function will be called every @var{time} minutes.
20466
20467 If @var{idle} is a number and @var{time} is a number, the function will
20468 be called every @var{time} minutes only when Emacs has been idle for
20469 @var{idle} minutes.
20470
20471 If @var{idle} is a number and @var{time} is @code{nil}, the function
20472 will be called once every time Emacs has been idle for @var{idle}
20473 minutes.
20474
20475 And if @var{time} is a string, it should look like @samp{07:31}, and
20476 the function will then be called once every day somewhere near that
20477 time.  Modified by the @var{idle} parameter, of course.
20478
20479 @vindex gnus-demon-timestep
20480 (When I say ``minute'' here, I really mean @code{gnus-demon-timestep}
20481 seconds.  This is 60 by default.  If you change that variable,
20482 all the timings in the handlers will be affected.)
20483
20484 So, if you want to add a handler, you could put something like this in
20485 your @file{.gnus.el} file:
20486
20487 @findex gnus-demon-add-handler
20488 @lisp
20489 (gnus-demon-add-handler 'gnus-demon-close-connections 30 t)
20490 @end lisp
20491
20492 @findex gnus-demon-add-nocem
20493 @findex gnus-demon-add-scanmail
20494 @findex gnus-demon-add-rescan
20495 @findex gnus-demon-add-scan-timestamps
20496 @findex gnus-demon-add-disconnection
20497 Some ready-made functions to do this have been created:
20498 @code{gnus-demon-add-nocem}, @code{gnus-demon-add-disconnection},
20499 @code{gnus-demon-add-nntp-close-connection},
20500 @code{gnus-demon-add-scan-timestamps}, @code{gnus-demon-add-rescan}, and
20501 @code{gnus-demon-add-scanmail}.  Just put those functions in your
20502 @file{.gnus.el} if you want those abilities.
20503
20504 @findex gnus-demon-init
20505 @findex gnus-demon-cancel
20506 @vindex gnus-demon-handlers
20507 If you add handlers to @code{gnus-demon-handlers} directly, you should
20508 run @code{gnus-demon-init} to make the changes take hold.  To cancel all
20509 daemons, you can use the @code{gnus-demon-cancel} function.
20510
20511 Note that adding daemons can be pretty naughty if you over do it.  Adding
20512 functions that scan all news and mail from all servers every two seconds
20513 is a sure-fire way of getting booted off any respectable system.  So
20514 behave.
20515
20516
20517 @node NoCeM
20518 @section NoCeM
20519 @cindex nocem
20520 @cindex spam
20521
20522 @dfn{Spamming} is posting the same article lots and lots of times.
20523 Spamming is bad.  Spamming is evil.
20524
20525 Spamming is usually canceled within a day or so by various anti-spamming
20526 agencies.  These agencies usually also send out @dfn{NoCeM} messages.
20527 NoCeM is pronounced ``no see-'em'', and means what the name
20528 implies---these are messages that make the offending articles, like, go
20529 away.
20530
20531 What use are these NoCeM messages if the articles are canceled anyway?
20532 Some sites do not honor cancel messages and some sites just honor cancels
20533 from a select few people.  Then you may wish to make use of the NoCeM
20534 messages, which are distributed in the @samp{alt.nocem.misc} newsgroup.
20535
20536 Gnus can read and parse the messages in this group automatically, and
20537 this will make spam disappear.
20538
20539 There are some variables to customize, of course:
20540
20541 @table @code
20542 @item gnus-use-nocem
20543 @vindex gnus-use-nocem
20544 Set this variable to @code{t} to set the ball rolling.  It is @code{nil}
20545 by default.
20546
20547 @item gnus-nocem-groups
20548 @vindex gnus-nocem-groups
20549 Gnus will look for NoCeM messages in the groups in this list.  The
20550 default is @code{("news.lists.filters" "news.admin.net-abuse.bulletins"
20551 "alt.nocem.misc" "news.admin.net-abuse.announce")}.
20552
20553 @item gnus-nocem-issuers
20554 @vindex gnus-nocem-issuers
20555 There are many people issuing NoCeM messages.  This list says what
20556 people you want to listen to.  The default is @code{("Automoose-1"
20557 "clewis@@ferret.ocunix.on.ca" "cosmo.roadkill" "SpamHippo"
20558 "hweede@@snafu.de")}; fine, upstanding citizens all of them.
20559
20560 Known despammers that you can put in this list are listed at
20561 @uref{http://www.xs4all.nl/~rosalind/nocemreg/nocemreg.html}.
20562
20563 You do not have to heed NoCeM messages from all these people---just the
20564 ones you want to listen to.  You also don't have to accept all NoCeM
20565 messages from the people you like.  Each NoCeM message has a @dfn{type}
20566 header that gives the message a (more or less, usually less) rigorous
20567 definition.  Common types are @samp{spam}, @samp{spew}, @samp{mmf},
20568 @samp{binary}, and @samp{troll}.  To specify this, you have to use
20569 @code{(@var{issuer} @var{conditions} @dots{})} elements in the list.
20570 Each condition is either a string (which is a regexp that matches types
20571 you want to use) or a list on the form @code{(not @var{string})}, where
20572 @var{string} is a regexp that matches types you don't want to use.
20573
20574 For instance, if you want all NoCeM messages from Chris Lewis except his
20575 @samp{troll} messages, you'd say:
20576
20577 @lisp
20578 ("clewis@@ferret.ocunix.on.ca" ".*" (not "troll"))
20579 @end lisp
20580
20581 On the other hand, if you just want nothing but his @samp{spam} and
20582 @samp{spew} messages, you'd say:
20583
20584 @lisp
20585 ("clewis@@ferret.ocunix.on.ca" (not ".*") "spew" "spam")
20586 @end lisp
20587
20588 The specs are applied left-to-right.
20589
20590
20591 @item gnus-nocem-verifyer
20592 @vindex gnus-nocem-verifyer
20593 @findex mc-verify
20594 This should be a function for verifying that the NoCeM issuer is who she
20595 says she is.  The default is @code{mc-verify}, which is a Mailcrypt
20596 function.  If this is too slow and you don't care for verification
20597 (which may be dangerous), you can set this variable to @code{nil}.
20598
20599 If you want signed NoCeM messages to be verified and unsigned messages
20600 not to be verified (but used anyway), you could do something like:
20601
20602 @lisp
20603 (setq gnus-nocem-verifyer 'my-gnus-mc-verify)
20604
20605 (defun my-gnus-mc-verify ()
20606   (not (eq 'forged
20607            (ignore-errors
20608              (if (mc-verify)
20609                  t
20610                'forged)))))
20611 @end lisp
20612
20613 This might be dangerous, though.
20614
20615 @item gnus-nocem-directory
20616 @vindex gnus-nocem-directory
20617 This is where Gnus will store its NoCeM cache files.  The default is
20618 @file{~/News/NoCeM/}.
20619
20620 @item gnus-nocem-expiry-wait
20621 @vindex gnus-nocem-expiry-wait
20622 The number of days before removing old NoCeM entries from the cache.
20623 The default is 15.  If you make it shorter Gnus will be faster, but you
20624 might then see old spam.
20625
20626 @item gnus-nocem-check-from
20627 @vindex gnus-nocem-check-from
20628 Non-@code{nil} means check for valid issuers in message bodies.
20629 Otherwise don't bother fetching articles unless their author matches a
20630 valid issuer; that is much faster if you are selective about the
20631 issuers.
20632
20633 @item gnus-nocem-check-article-limit
20634 @vindex gnus-nocem-check-article-limit
20635 If non-@code{nil}, the maximum number of articles to check in any NoCeM
20636 group.  NoCeM groups can be huge and very slow to process.
20637
20638 @end table
20639
20640 Using NoCeM could potentially be a memory hog.  If you have many living
20641 (i. e., subscribed or unsubscribed groups), your Emacs process will grow
20642 big.  If this is a problem, you should kill off all (or most) of your
20643 unsubscribed groups (@pxref{Subscription Commands}).
20644
20645
20646 @node Undo
20647 @section Undo
20648 @cindex undo
20649
20650 It is very useful to be able to undo actions one has done.  In normal
20651 Emacs buffers, it's easy enough---you just push the @code{undo} button.
20652 In Gnus buffers, however, it isn't that simple.
20653
20654 The things Gnus displays in its buffer is of no value whatsoever to
20655 Gnus---it's all just data designed to look nice to the user.
20656 Killing a group in the group buffer with @kbd{C-k} makes the line
20657 disappear, but that's just a side-effect of the real action---the
20658 removal of the group in question from the internal Gnus structures.
20659 Undoing something like that can't be done by the normal Emacs
20660 @code{undo} function.
20661
20662 Gnus tries to remedy this somewhat by keeping track of what the user
20663 does and coming up with actions that would reverse the actions the user
20664 takes.  When the user then presses the @code{undo} key, Gnus will run
20665 the code to reverse the previous action, or the previous actions.
20666 However, not all actions are easily reversible, so Gnus currently offers
20667 a few key functions to be undoable.  These include killing groups,
20668 yanking groups, and changing the list of read articles of groups.
20669 That's it, really.  More functions may be added in the future, but each
20670 added function means an increase in data to be stored, so Gnus will
20671 never be totally undoable.
20672
20673 @findex gnus-undo-mode
20674 @vindex gnus-use-undo
20675 @findex gnus-undo
20676 The undoability is provided by the @code{gnus-undo-mode} minor mode.  It
20677 is used if @code{gnus-use-undo} is non-@code{nil}, which is the
20678 default.  The @kbd{C-M-_} key performs the @code{gnus-undo}
20679 command, which should feel kinda like the normal Emacs @code{undo}
20680 command.
20681
20682
20683 @node Predicate Specifiers
20684 @section Predicate Specifiers
20685 @cindex predicate specifiers
20686
20687 Some Gnus variables are @dfn{predicate specifiers}.  This is a special
20688 form that allows flexible specification of predicates without having
20689 to type all that much.
20690
20691 These specifiers are lists consisting of functions, symbols and lists.
20692
20693 Here's an example:
20694
20695 @lisp
20696 (or gnus-article-unseen-p
20697     gnus-article-unread-p)
20698 @end lisp
20699
20700 The available symbols are @code{or}, @code{and} and @code{not}.  The
20701 functions all take one parameter.
20702
20703 @findex gnus-make-predicate
20704 Internally, Gnus calls @code{gnus-make-predicate} on these specifiers
20705 to create a function that can be called.  This input parameter to this
20706 function will be passed along to all the functions in the predicate
20707 specifier.
20708
20709
20710 @node Moderation
20711 @section Moderation
20712 @cindex moderation
20713
20714 If you are a moderator, you can use the @file{gnus-mdrtn.el} package.
20715 It is not included in the standard Gnus package.  Write a mail to
20716 @samp{larsi@@gnus.org} and state what group you moderate, and you'll
20717 get a copy.
20718
20719 The moderation package is implemented as a minor mode for summary
20720 buffers.  Put
20721
20722 @lisp
20723 (add-hook 'gnus-summary-mode-hook 'gnus-moderate)
20724 @end lisp
20725
20726 in your @file{.gnus.el} file.
20727
20728 If you are the moderator of @samp{rec.zoofle}, this is how it's
20729 supposed to work:
20730
20731 @enumerate
20732 @item
20733 You split your incoming mail by matching on
20734 @samp{Newsgroups:.*rec.zoofle}, which will put all the to-be-posted
20735 articles in some mail group---for instance, @samp{nnml:rec.zoofle}.
20736
20737 @item
20738 You enter that group once in a while and post articles using the @kbd{e}
20739 (edit-and-post) or @kbd{s} (just send unedited) commands.
20740
20741 @item
20742 If, while reading the @samp{rec.zoofle} newsgroup, you happen upon some
20743 articles that weren't approved by you, you can cancel them with the
20744 @kbd{c} command.
20745 @end enumerate
20746
20747 To use moderation mode in these two groups, say:
20748
20749 @lisp
20750 (setq gnus-moderated-list
20751       "^nnml:rec.zoofle$\\|^rec.zoofle$")
20752 @end lisp
20753
20754
20755 @node Image Enhancements
20756 @section Image Enhancements
20757
20758 XEmacs, as well as Emacs 21, is able to display pictures and stuff, so
20759 Gnus has taken advantage of that.
20760
20761 @menu
20762 * Picons::                      How to display pictures of what you're reading.
20763 * Smileys::                     Show all those happy faces the way they were meant to be shown.
20764 * X-Face::                      Display a funky, teensy black-and-white image.
20765 * XVarious::                    Other XEmacsy Gnusey variables.
20766 @end menu
20767
20768
20769 @node Picons
20770 @subsection Picons
20771
20772 @iftex
20773 @iflatex
20774 \include{picons}
20775 @end iflatex
20776 @end iftex
20777
20778 So@dots{}  You want to slow down your news reader even more!  This is a
20779 good way to do so.  Its also a great way to impress people staring
20780 over your shoulder as you read news.
20781
20782 What are Picons?  To quote directly from the Picons Web site:
20783
20784 @iftex
20785 @iflatex
20786 \margindex{}
20787 @end iflatex
20788 @end iftex
20789
20790 @quotation
20791 @dfn{Picons} is short for ``personal icons''.  They're small,
20792 constrained images used to represent users and domains on the net,
20793 organized into databases so that the appropriate image for a given
20794 e-mail address can be found.  Besides users and domains, there are picon
20795 databases for Usenet newsgroups and weather forecasts.  The picons are
20796 in either monochrome @code{XBM} format or color @code{XPM} and
20797 @code{GIF} formats.
20798 @end quotation
20799
20800 @vindex gnus-picon-databases
20801 For instructions on obtaining and installing the picons databases,
20802 point your Web browser at
20803 @uref{http://www.cs.indiana.edu/picons/ftp/index.html}.
20804
20805 If you are using Debian GNU/Linux, saying @samp{apt-get install
20806 picons.*} will install the picons where Gnus can find them.
20807
20808 To enable displaying picons, simply make sure that
20809 @code{gnus-picon-databases} points to the directory containing the
20810 Picons databases.
20811
20812 The following variables offer control over where things are located.
20813
20814 @table @code
20815
20816 @item gnus-picon-databases
20817 @vindex gnus-picon-databases
20818 The location of the picons database.  This is a list of directories
20819 containing the @file{news}, @file{domains}, @file{users} (and so on)
20820 subdirectories.  Defaults to @code{("/usr/lib/picon"
20821 "/usr/local/faces")}.
20822
20823 @item gnus-picon-news-directories
20824 @vindex gnus-picon-news-directories
20825 List of subdirectories to search in @code{gnus-picon-databases} for
20826 newsgroups faces.  @code{("news")} is the default.
20827
20828 @item gnus-picon-user-directories
20829 @vindex gnus-picon-user-directories
20830 List of subdirectories to search in @code{gnus-picon-databases} for user
20831 faces.  @code{("users" "usenix" "local" "misc")} is the default.
20832
20833 @item gnus-picon-domain-directories
20834 @vindex gnus-picon-domain-directories
20835 List of subdirectories to search in @code{gnus-picon-databases} for
20836 domain name faces.  Defaults to @code{("domains")}.  Some people may
20837 want to add @samp{"unknown"} to this list.
20838
20839 @item gnus-picon-file-types
20840 @vindex gnus-picon-file-types
20841 Ordered list of suffixes on picon file names to try.  Defaults to
20842 @code{("xpm" "gif" "xbm")} minus those not builtin your Emacs.
20843
20844 @end table
20845
20846 @node Smileys
20847 @subsection Smileys
20848 @cindex smileys
20849
20850 @iftex
20851 @iflatex
20852 \gnusfig{-3cm}{0.5cm}{\epsfig{figure=ps/BigFace,height=20cm}}
20853 \input{smiley}
20854 @end iflatex
20855 @end iftex
20856
20857 @dfn{Smiley} is a package separate from Gnus, but since Gnus is
20858 currently the only package that uses Smiley, it is documented here.
20859
20860 In short---to use Smiley in Gnus, put the following in your
20861 @file{.gnus.el} file:
20862
20863 @lisp
20864 (setq gnus-treat-display-smileys t)
20865 @end lisp
20866
20867 Smiley maps text smiley faces---@samp{:-)}, @samp{8-)}, @samp{:-(} and
20868 the like---to pictures and displays those instead of the text smiley
20869 faces.  The conversion is controlled by a list of regexps that matches
20870 text and maps that to file names.
20871
20872 @vindex smiley-regexp-alist
20873 The alist used is specified by the @code{smiley-regexp-alist}
20874 variable.  The first item in each element is the regexp to be matched;
20875 the second element is the regexp match group that is to be replaced by
20876 the picture; and the third element is the name of the file to be
20877 displayed.
20878
20879 The following variables customize where Smiley will look for these
20880 files:
20881
20882 @table @code
20883
20884 @item smiley-data-directory
20885 @vindex smiley-data-directory
20886 Where Smiley will look for smiley faces files.
20887
20888 @item gnus-smiley-file-types
20889 @vindex gnus-smiley-file-types
20890 List of suffixes on smiley file names to try.
20891
20892 @end table
20893
20894
20895 @node X-Face
20896 @subsection X-Face
20897 @cindex x-face
20898
20899 @code{X-Face} headers describe a 48x48 pixel black-and-white (1 bit
20900 depth) image that's supposed to represent the author of the message.
20901 It seems to be supported by an ever-growing number of mail and news
20902 readers.
20903
20904 @cindex x-face
20905 @findex gnus-article-display-x-face
20906 @findex gnus-article-x-face-command
20907 @vindex gnus-article-x-face-command
20908 @vindex gnus-article-x-face-too-ugly
20909 @iftex
20910 @iflatex
20911 \include{xface}
20912 @end iflatex
20913 @end iftex
20914 @c @anchor{X-Face}
20915
20916 Decoding an @code{X-Face} header either requires an Emacs that has
20917 @samp{compface} support (which most XEmacs versions has), or that you
20918 have @samp{compface} installed on your system.  If either is true,
20919 Gnus will default to displaying @code{X-Face} headers.
20920
20921 The variable that controls this is the
20922 @code{gnus-article-x-face-command} variable.  If this variable is a
20923 string, this string will be executed in a sub-shell.  If it is a
20924 function, this function will be called with the face as the argument.
20925 If the @code{gnus-article-x-face-too-ugly} (which is a regexp) matches
20926 the @code{From} header, the face will not be shown.
20927
20928 The default action under Emacs 20 is to fork off the @code{display}
20929 program@footnote{@code{display} is from the ImageMagick package.  For
20930 the @code{uncompface} and @code{icontopbm} programs look for a package
20931 like @code{compface} or @code{faces-xface} on a GNU/Linux system.}  to
20932 view the face.
20933
20934 Under XEmacs or Emacs 21+ with suitable image support, the default
20935 action is to display the face before the @code{From} header.  (It's
20936 nicer if XEmacs has been compiled with @code{X-Face} support---that
20937 will make display somewhat faster.  If there's no native @code{X-Face}
20938 support, Gnus will try to convert the @code{X-Face} header using
20939 external programs from the @code{pbmplus} package and
20940 friends.@footnote{On a GNU/Linux system look for packages with names
20941 like @code{netpbm}, @code{libgr-progs} and @code{compface}.})
20942
20943 (NOTE: @code{x-face} is used in the variable/function names, not
20944 @code{xface}).
20945
20946 Gnus provides a few convenience functions and variables to allow
20947 easier insertion of X-Face headers in outgoing messages.
20948
20949 @findex gnus-random-x-face
20950 @vindex gnus-convert-pbm-to-x-face-command
20951 @vindex gnus-x-face-directory
20952 @code{gnus-random-x-face} goes through all the @samp{pbm} files in
20953 @code{gnus-x-face-directory} and picks one at random, and then
20954 converts it to the X-Face format by using the
20955 @code{gnus-convert-pbm-to-x-face-command} shell command.  The
20956 @samp{pbm} files should be 48x48 pixels big.  It returns the X-Face
20957 header data as a string.
20958
20959 @findex gnus-insert-random-x-face-header
20960 @code{gnus-insert-random-x-face-header} calls
20961 @code{gnus-random-x-face} and inserts a @samp{X-Face} header with the
20962 randomly generated data.
20963
20964 @findex gnus-x-face-from-file
20965 @vindex gnus-convert-image-to-x-face-command
20966 @code{gnus-x-face-from-file} takes a GIF file as the parameter, and then
20967 converts the file to X-Face format by using the
20968 @code{gnus-convert-image-to-x-face-command} shell command.
20969
20970 Here's how you would typically use the first function.  Put something
20971 like the following in your @file{.gnus.el} file:
20972
20973 @lisp
20974 (setq message-required-news-headers
20975       (nconc message-required-news-headers
20976              (list '(X-Face . gnus-random-x-face))))
20977 @end lisp
20978
20979 Using the last function would be something like this:
20980
20981 @lisp
20982 (setq message-required-news-headers
20983       (nconc message-required-news-headers
20984              (list '(X-Face . (lambda ()
20985                                 (gnus-x-face-from-file
20986                                  "~/My-face.gif"))))))
20987 @end lisp
20988
20989
20990 @node XVarious
20991 @subsection Various XEmacs Variables
20992
20993 @table @code
20994 @item gnus-xmas-glyph-directory
20995 @vindex gnus-xmas-glyph-directory
20996 This is where Gnus will look for pictures.  Gnus will normally
20997 auto-detect this directory, but you may set it manually if you have an
20998 unusual directory structure.
20999
21000 @item gnus-xmas-logo-color-alist
21001 @vindex gnus-xmas-logo-color-alist
21002 This is an alist where the key is a type symbol and the values are the
21003 foreground and background color of the splash page glyph.
21004
21005 @item gnus-xmas-logo-color-style
21006 @vindex gnus-xmas-logo-color-style
21007 This is the key used to look up the color in the alist described above.
21008 Valid values include @code{flame}, @code{pine}, @code{moss},
21009 @code{irish}, @code{sky}, @code{tin}, @code{velvet}, @code{grape},
21010 @code{labia}, @code{berry}, @code{neutral}, and @code{september}.
21011
21012 @item gnus-xmas-modeline-glyph
21013 @vindex gnus-xmas-modeline-glyph
21014 A glyph displayed in all Gnus mode lines.  It is a tiny gnu head by
21015 default.
21016
21017 @end table
21018
21019 @subsubsection Toolbar
21020
21021 @table @code
21022
21023 @item gnus-use-toolbar
21024 @vindex gnus-use-toolbar
21025 If @code{nil}, don't display toolbars.  If non-@code{nil}, it should be
21026 one of @code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar},
21027 @code{right-toolbar}, or @code{left-toolbar}.
21028
21029 @item gnus-group-toolbar
21030 @vindex gnus-group-toolbar
21031 The toolbar in the group buffer.
21032
21033 @item gnus-summary-toolbar
21034 @vindex gnus-summary-toolbar
21035 The toolbar in the summary buffer.
21036
21037 @item gnus-summary-mail-toolbar
21038 @vindex gnus-summary-mail-toolbar
21039 The toolbar in the summary buffer of mail groups.
21040
21041 @end table
21042
21043 @iftex
21044 @iflatex
21045 \margindex{}
21046 @end iflatex
21047 @end iftex
21048
21049
21050 @node Fuzzy Matching
21051 @section Fuzzy Matching
21052 @cindex fuzzy matching
21053
21054 Gnus provides @dfn{fuzzy matching} of @code{Subject} lines when doing
21055 things like scoring, thread gathering and thread comparison.
21056
21057 As opposed to regular expression matching, fuzzy matching is very fuzzy.
21058 It's so fuzzy that there's not even a definition of what @dfn{fuzziness}
21059 means, and the implementation has changed over time.
21060
21061 Basically, it tries to remove all noise from lines before comparing.
21062 @samp{Re: }, parenthetical remarks, white space, and so on, are filtered
21063 out of the strings before comparing the results.  This often leads to
21064 adequate results---even when faced with strings generated by text
21065 manglers masquerading as newsreaders.
21066
21067
21068 @node Thwarting Email Spam
21069 @section Thwarting Email Spam
21070 @cindex email spam
21071 @cindex spam
21072 @cindex UCE
21073 @cindex unsolicited commercial email
21074
21075 In these last days of the Usenet, commercial vultures are hanging about
21076 and grepping through news like crazy to find email addresses they can
21077 foist off their scams and products to.  As a reaction to this, many
21078 people have started putting nonsense addresses into their @code{From}
21079 lines.  I think this is counterproductive---it makes it difficult for
21080 people to send you legitimate mail in response to things you write, as
21081 well as making it difficult to see who wrote what.  This rewriting may
21082 perhaps be a bigger menace than the unsolicited commercial email itself
21083 in the end.
21084
21085 The biggest problem I have with email spam is that it comes in under
21086 false pretenses.  I press @kbd{g} and Gnus merrily informs me that I
21087 have 10 new emails.  I say ``Golly gee!  Happy is me!'' and select the
21088 mail group, only to find two pyramid schemes, seven advertisements
21089 (``New!  Miracle tonic for growing full, lustrous hair on your toes!'')
21090 and one mail asking me to repent and find some god.
21091
21092 This is annoying.  Here's what you can do about it.
21093
21094 @menu
21095 * The problem of spam::         Some background, and some solutions
21096 * Anti-Spam Basics::            Simple steps to reduce the amount of spam.
21097 * SpamAssassin::                How to use external anti-spam tools.
21098 * Hashcash::                    Reduce spam by burning CPU time.
21099 * Filtering Spam Using The Spam ELisp Package::  
21100 * Filtering Spam Using Statistics with spam-stat::  
21101 @end menu
21102
21103 @node The problem of spam
21104 @subsection The problem of spam
21105 @cindex email spam
21106 @cindex spam filtering approaches
21107 @cindex filtering approaches, spam
21108 @cindex UCE
21109 @cindex unsolicited commercial email
21110
21111 First, some background on spam.
21112
21113 If you have access to e-mail, you are familiar with spam (technically
21114 termed @acronym{UCE}, Unsolicited Commercial E-mail).  Simply put, it exists
21115 because e-mail delivery is very cheap compared to paper mail, so only
21116 a very small percentage of people need to respond to an UCE to make it
21117 worthwhile to the advertiser.  Ironically, one of the most common
21118 spams is the one offering a database of e-mail addresses for further
21119 spamming.  Senders of spam are usually called @emph{spammers}, but terms like
21120 @emph{vermin}, @emph{scum}, and @emph{morons} are in common use as well.
21121
21122 Spam comes from a wide variety of sources.  It is simply impossible to
21123 dispose of all spam without discarding useful messages.  A good
21124 example is the TMDA system, which requires senders
21125 unknown to you to confirm themselves as legitimate senders before
21126 their e-mail can reach you.  Without getting into the technical side
21127 of TMDA, a downside is clearly that e-mail from legitimate sources may
21128 be discarded if those sources can't or won't confirm themselves
21129 through the TMDA system.  Another problem with TMDA is that it
21130 requires its users to have a basic understanding of e-mail delivery
21131 and processing.
21132
21133 The simplest approach to filtering spam is filtering.  If you get 200
21134 spam messages per day from @samp{random-address@@vmadmin.com}, you
21135 block @samp{vmadmin.com}.  If you get 200 messages about
21136 @samp{VIAGRA}, you discard all messages with @samp{VIAGRA} in the
21137 message.  This, unfortunately, is a great way to discard legitimate
21138 e-mail.  For instance, the very informative and useful RISKS digest
21139 has been blocked by overzealous mail filters because it
21140 @strong{contained} words that were common in spam messages.
21141 Nevertheless, in isolated cases, with great care, direct filtering of
21142 mail can be useful.
21143
21144 Another approach to filtering e-mail is the distributed spam
21145 processing, for instance DCC implements such a system.  In essence,
21146 @code{N} systems around the world agree that a machine @samp{X} in
21147 China, Ghana, or California is sending out spam e-mail, and these
21148 @code{N} systems enter @samp{X} or the spam e-mail from @samp{X} into
21149 a database.  The criteria for spam detection vary - it may be the
21150 number of messages sent, the content of the messages, and so on.  When
21151 a user of the distributed processing system wants to find out if a
21152 message is spam, he consults one of those @code{N} systems.
21153
21154 Distributed spam processing works very well against spammers that send
21155 a large number of messages at once, but it requires the user to set up
21156 fairly complicated checks.  There are commercial and free distributed
21157 spam processing systems.  Distributed spam processing has its risks as
21158 well.  For instance legitimate e-mail senders have been accused of
21159 sending spam, and their web sites have been shut down for some time
21160 because of the incident.
21161
21162 The statistical approach to spam filtering is also popular.  It is
21163 based on a statistical analysis of previous spam messages.  Usually
21164 the analysis is a simple word frequency count, with perhaps pairs of
21165 words or 3-word combinations thrown into the mix.  Statistical
21166 analysis of spam works very well in most of the cases, but it can
21167 classify legitimate e-mail as spam in some cases.  It takes time to
21168 run the analysis, the full message must be analyzed, and the user has
21169 to store the database of spam analyses.
21170
21171 @node Anti-Spam Basics
21172 @subsection Anti-Spam Basics
21173 @cindex email spam
21174 @cindex spam
21175 @cindex UCE
21176 @cindex unsolicited commercial email
21177
21178 One way of dealing with spam is having Gnus split out all spam into a
21179 @samp{spam} mail group (@pxref{Splitting Mail}).
21180
21181 First, pick one (1) valid mail address that you can be reached at, and
21182 put it in your @code{From} header of all your news articles.  (I've
21183 chosen @samp{larsi@@trym.ifi.uio.no}, but for many addresses on the form
21184 @samp{larsi+usenet@@ifi.uio.no} will be a better choice.  Ask your
21185 sysadmin whether your sendmail installation accepts keywords in the local
21186 part of the mail address.)
21187
21188 @lisp
21189 (setq message-default-news-headers
21190       "From: Lars Magne Ingebrigtsen <larsi@@trym.ifi.uio.no>\n")
21191 @end lisp
21192
21193 Then put the following split rule in @code{nnmail-split-fancy}
21194 (@pxref{Fancy Mail Splitting}):
21195
21196 @lisp
21197 (
21198  ...
21199  (to "larsi@@trym.ifi.uio.no"
21200       (| ("subject" "re:.*" "misc")
21201          ("references" ".*@@.*" "misc")
21202          "spam"))
21203  ...
21204 )
21205 @end lisp
21206
21207 This says that all mail to this address is suspect, but if it has a
21208 @code{Subject} that starts with a @samp{Re:} or has a @code{References}
21209 header, it's probably ok.  All the rest goes to the @samp{spam} group.
21210 (This idea probably comes from Tim Pierce.)
21211
21212 In addition, many mail spammers talk directly to your @sc{smtp} server
21213 and do not include your email address explicitly in the @code{To}
21214 header.  Why they do this is unknown---perhaps it's to thwart this
21215 thwarting scheme?  In any case, this is trivial to deal with---you just
21216 put anything not addressed to you in the @samp{spam} group by ending
21217 your fancy split rule in this way:
21218
21219 @lisp
21220 (
21221  ...
21222  (to "larsi" "misc")
21223  "spam")
21224 @end lisp
21225
21226 In my experience, this will sort virtually everything into the right
21227 group.  You still have to check the @samp{spam} group from time to time to
21228 check for legitimate mail, though.  If you feel like being a good net
21229 citizen, you can even send off complaints to the proper authorities on
21230 each unsolicited commercial email---at your leisure.
21231
21232 If you are also a lazy net citizen, you will probably prefer complaining
21233 automatically with the @file{gnus-junk.el} package, available FOR FREE
21234 at @* @uref{http://stud2.tuwien.ac.at/~e9426626/gnus-junk.html}.
21235 Since most e-mail spam is sent automatically, this may reconcile the
21236 cosmic balance somewhat.
21237
21238 This works for me.  It allows people an easy way to contact me (they can
21239 just press @kbd{r} in the usual way), and I'm not bothered at all with
21240 spam.  It's a win-win situation.  Forging @code{From} headers to point
21241 to non-existent domains is yucky, in my opinion.
21242
21243
21244
21245 @node SpamAssassin
21246 @subsection SpamAssassin, Vipul's Razor, DCC, etc
21247 @cindex SpamAssassin
21248 @cindex Vipul's Razor
21249 @cindex DCC
21250
21251 The days where the hints in the previous section was sufficient in
21252 avoiding spam is coming to an end.  There are many tools out there
21253 that claim to reduce the amount of spam you get.  This section could
21254 easily become outdated fast, as new products replace old, but
21255 fortunately most of these tools seem to have similar interfaces.  Even
21256 though this section will use SpamAssassin as an example, it should be
21257 easy to adapt it to most other tools.
21258
21259 If the tool you are using is not installed on the mail server, you
21260 need to invoke it yourself.  Ideas on how to use the
21261 @code{:postscript} mail source parameter (@pxref{Mail Source
21262 Specifiers}) follows.
21263
21264 @lisp
21265 (setq mail-sources
21266       '((file :prescript "formail -bs spamassassin < /var/mail/%u")
21267         (pop :user "jrl"
21268              :server "pophost"
21269              :postscript "mv %t /tmp/foo; formail -bs spamc < /tmp/foo > %t")))
21270 @end lisp
21271
21272 Once you managed to process your incoming spool somehow, thus making
21273 the mail contain e.g. a header indicating it is spam, you are ready to
21274 filter it out.  Using normal split methods (@pxref{Splitting Mail}):
21275
21276 @lisp
21277 (setq nnmail-split-methods '(("spam"  "^X-Spam-Flag: YES")
21278                              ...))
21279 @end lisp
21280
21281 Or using fancy split methods (@pxref{Fancy Mail Splitting}):
21282
21283 @lisp
21284 (setq nnmail-split-methods 'nnmail-split-fancy
21285       nnmail-split-fancy '(| ("X-Spam-Flag" "YES" "spam")
21286                              ...))
21287 @end lisp
21288
21289 Some people might not like the idea of piping the mail through various
21290 programs using a @code{:prescript} (if some program is buggy, you
21291 might lose all mail).  If you are one of them, another solution is to
21292 call the external tools during splitting.  Example fancy split method:
21293
21294 @lisp
21295 (setq nnmail-split-fancy '(| (: kevin-spamassassin)
21296                              ...))
21297 (defun kevin-spamassassin ()
21298   (save-excursion
21299     (let ((buf (or (get-buffer " *nnmail incoming*")
21300                    (get-buffer " *nnml move*"))))
21301       (if (not buf)
21302           (progn (message "Oops, cannot find message buffer") nil)
21303         (set-buffer buf)
21304         (if (eq 1 (call-process-region (point-min) (point-max)
21305                                        "spamc" nil nil nil "-c"))
21306             "spam")))))
21307 @end lisp
21308
21309 That is about it.  As some spam is likely to get through anyway, you
21310 might want to have a nifty function to call when you happen to read
21311 spam.  And here is the nifty function:
21312
21313 @lisp
21314  (defun my-gnus-raze-spam ()
21315   "Submit SPAM to Vipul's Razor, then mark it as expirable."
21316   (interactive)
21317   (gnus-summary-show-raw-article)
21318   (gnus-summary-save-in-pipe "razor-report -f -d")
21319   (gnus-summary-mark-as-expirable 1))
21320 @end lisp
21321
21322 @node Hashcash
21323 @subsection Hashcash
21324 @cindex hashcash
21325
21326 A novel technique to fight spam is to require senders to do something
21327 costly for each message they send.  This has the obvious drawback that
21328 you cannot rely on that everyone in the world uses this technique,
21329 since it is not part of the Internet standards, but it may be useful
21330 in smaller communities.
21331
21332 While the tools in the previous section work well in practice, they
21333 work only because the tools are constantly maintained and updated as
21334 new form of spam appears.  This means that a small percentage of spam
21335 will always get through.  It also means that somewhere, someone needs
21336 to read lots of spam to update these tools.  Hashcash avoids that, but
21337 instead requires that everyone you communicate with supports the
21338 scheme.  You can view the two approaches as pragmatic vs dogmatic.
21339 The approaches have their own advantages and disadvantages, but as
21340 often in the real world, a combination of them is stronger than either
21341 one of them separately.
21342
21343 @cindex X-Hashcash
21344 The ``something costly'' is to burn CPU time, more specifically to
21345 compute a hash collision up to a certain number of bits.  The
21346 resulting hashcash cookie is inserted in a @samp{X-Hashcash:}
21347 header. For more details, and for the external application
21348 @code{hashcash} you need to install to use this feature, see
21349 @uref{http://www.cypherspace.org/~adam/hashcash/}.  Even more
21350 information can be found at @uref{http://www.camram.org/}.
21351
21352 If you wish to call hashcash for each message you send, say something
21353 like:
21354
21355 @lisp
21356 (require 'hashcash)
21357 (add-hook 'message-send-hook 'mail-add-payment)
21358 @end lisp
21359
21360 The @code{hashcash.el} library can be found at
21361 @uref{http://users.actrix.gen.nz/mycroft/hashcash.el}, or in the Gnus
21362 development contrib directory.
21363
21364 You will need to set up some additional variables as well:
21365
21366 @table @code
21367
21368 @item hashcash-default-payment
21369 @vindex hashcash-default-payment
21370 This variable indicates the default number of bits the hash collision
21371 should consist of.  By default this is 0, meaning nothing will be
21372 done.  Suggested useful values include 17 to 29.
21373
21374 @item hashcash-payment-alist
21375 @vindex hashcash-payment-alist
21376 Some receivers may require you to spend burn more CPU time than the
21377 default.  This variable contains a list of @samp{(ADDR AMOUNT)} cells,
21378 where ADDR is the receiver (email address or newsgroup) and AMOUNT is
21379 the number of bits in the collision that is needed.  It can also
21380 contain @samp{(ADDR STRING AMOUNT)} cells, where the STRING is the
21381 string to use (normally the email address or newsgroup name is used).
21382
21383 @item hashcash
21384 @vindex hashcash
21385 Where the @code{hashcash} binary is installed.
21386
21387 @end table
21388
21389 Currently there is no built in functionality in Gnus to verify
21390 hashcash cookies, it is expected that this is performed by your hand
21391 customized mail filtering scripts.  Improvements in this area would be
21392 a useful contribution, however.
21393
21394 @node Filtering Spam Using The Spam ELisp Package
21395 @subsection Filtering Spam Using The Spam ELisp Package
21396 @cindex spam filtering
21397 @cindex spam
21398
21399 The idea behind @code{spam.el} is to have a control center for spam detection
21400 and filtering in Gnus.  To that end, @code{spam.el} does two things: it
21401 filters incoming mail, and it analyzes mail known to be spam or ham.
21402 @emph{Ham} is the name used throughout @code{spam.el} to indicate
21403 non-spam messages.
21404
21405 So, what happens when you load @code{spam.el}?  First of all, you get
21406 the following keyboard commands:
21407
21408 @table @kbd
21409
21410 @item M-d
21411 @itemx M s x
21412 @itemx S x
21413 @kindex M-d
21414 @kindex S x
21415 @kindex M s x
21416 @findex gnus-summary-mark-as-spam
21417 @code{gnus-summary-mark-as-spam}.
21418
21419 Mark current article as spam, showing it with the @samp{$} mark.
21420 Whenever you see a spam article, make sure to mark its summary line
21421 with @kbd{M-d} before leaving the group.  This is done automatically
21422 for unread articles in @emph{spam} groups.
21423
21424 @item M s t
21425 @itemx S t
21426 @kindex M s t
21427 @kindex S t
21428 @findex spam-bogofilter-score
21429 @code{spam-bogofilter-score}.
21430
21431 You must have Bogofilter installed for that command to work properly.
21432
21433 @xref{Bogofilter}.
21434
21435 @end table
21436
21437 Also, when you load @code{spam.el}, you will be able to customize its
21438 variables.  Try @code{customize-group} on the @samp{spam} variable
21439 group.
21440
21441 The concepts of ham processors and spam processors are very important.
21442 Ham processors and spam processors for a group can be set with the
21443 @code{spam-process} group parameter, or the
21444 @code{gnus-spam-process-newsgroups} variable.  Ham processors take
21445 mail known to be non-spam (@emph{ham}) and process it in some way so
21446 that later similar mail will also be considered non-spam.  Spam
21447 processors take mail known to be spam and process it so similar spam
21448 will be detected later.
21449
21450 Gnus learns from the spam you get.  You have to collect your spam in
21451 one or more spam groups, and set or customize the variable
21452 @code{spam-junk-mailgroups} as appropriate.  You can also declare
21453 groups to contain spam by setting their group parameter
21454 @code{spam-contents} to @code{gnus-group-spam-classification-spam}, or
21455 by customizing the corresponding variable
21456 @code{gnus-spam-newsgroup-contents}.  The @code{spam-contents} group
21457 parameter and the @code{gnus-spam-newsgroup-contents} variable can
21458 also be used to declare groups as @emph{ham} groups if you set their
21459 classification to @code{gnus-group-spam-classification-ham}.  If
21460 groups are not classified by means of @code{spam-junk-mailgroups},
21461 @code{spam-contents}, or @code{gnus-spam-newsgroup-contents}, they are
21462 considered @emph{unclassified}.  All groups are unclassified by
21463 default.
21464
21465 In spam groups, all messages are considered to be spam by default:
21466 they get the @samp{$} mark when you enter the group.  You must review
21467 these messages from time to time and remove the @samp{$} mark for
21468 every message that is not spam after all.  To remove the @samp{$}
21469 mark, you can use @kbd{M-u} to "unread" the article, or @kbd{d} for
21470 declaring it read the non-spam way.  When you leave a group, all
21471 spam-marked (@samp{$}) articles are sent to a spam processor which
21472 will study them as spam samples.
21473
21474 Messages may also be deleted in various other ways, and unless
21475 @code{spam-ham-marks} gets overridden below, marks @samp{R} and
21476 @samp{r} for default read or explicit delete, marks @samp{X} and
21477 @samp{K} for automatic or explicit kills, as well as mark @samp{Y} for
21478 low scores, are all considered to be associated with articles which
21479 are not spam.  This assumption might be false, in particular if you
21480 use kill files or score files as means for detecting genuine spam, you
21481 should then adjust the @code{spam-ham-marks} variable.
21482
21483 @defvar spam-ham-marks
21484 You can customize this variable to be the list of marks you want to
21485 consider ham.  By default, the list contains the deleted, read,
21486 killed, kill-filed, and low-score marks.
21487 @end defvar
21488
21489 @defvar spam-spam-marks
21490 You can customize this variable to be the list of marks you want to
21491 consider spam.  By default, the list contains only the spam mark.
21492 @end defvar
21493
21494 When you leave @emph{any} group, regardless of its
21495 @code{spam-contents} classification, all spam-marked articles are sent
21496 to a spam processor, which will study these as spam samples.  If you
21497 explicit kill a lot, you might sometimes end up with articles marked
21498 @samp{K} which you never saw, and which might accidentally contain
21499 spam.  Best is to make sure that real spam is marked with @samp{$},
21500 and nothing else.
21501
21502 When you leave a @emph{spam} group, all spam-marked articles are
21503 marked as expired after processing with the spam processor.  This is
21504 not done for @emph{unclassified} or @emph{ham} groups.  Also, any
21505 @strong{ham} articles in a spam group will be moved to a location
21506 determined by either the @code{ham-process-destination} group
21507 parameter or a match in the @code{gnus-ham-process-destinations}
21508 variable, which is a list of regular expressions matched with group
21509 names (it's easiest to customize this variable with
21510 @code{customize-variable gnus-ham-process-destinations}).  The ultimate
21511 location is a group name.  If the @code{ham-process-destination}
21512 parameter is not set, spam articles are only expired.
21513
21514 When you leave a @emph{ham} group, all ham-marked articles are sent to
21515 a ham processor, which will study these as non-spam samples.
21516
21517 When you leave a @emph{ham} or @emph{unclassified} group, all
21518 @strong{spam} articles are moved to a location determined by either
21519 the @code{spam-process-destination} group parameter or a match in the
21520 @code{gnus-spam-process-destinations} variable, which is a list of
21521 regular expressions matched with group names (it's easiest to
21522 customize this variable with @code{customize-variable
21523 gnus-spam-process-destinations}).  The ultimate location is a group
21524 name.  If the @code{spam-process-destination} parameter is not set,
21525 the spam articles are only expired.
21526
21527 To use the @code{spam.el} facilities for incoming mail filtering, you
21528 must add the following to your fancy split list
21529 @code{nnmail-split-fancy} or @code{nnimap-split-fancy}:
21530
21531 @example
21532 (: spam-split)
21533 @end example
21534
21535 Note that the fancy split may be called @code{nnmail-split-fancy} or
21536 @code{nnimap-split-fancy}, depending on whether you use the nnmail or
21537 nnimap back ends to retrieve your mail.
21538
21539 The @code{spam-split} function will process incoming mail and send the
21540 mail considered to be spam into the group name given by the variable
21541 @code{spam-split-group}.  By default that group name is @samp{spam},
21542 but you can customize it.
21543
21544 @emph{Note for IMAP users}
21545
21546 The boolean variable @code{nnimap-split-download-body} needs to be
21547 set, if you want to split based on the whole message instead of just
21548 the headers.  By default, the nnimap backend will only retrieve the
21549 message headers.  If you use spam-check-bogofilter, spam-check-ifile,
21550 or spam-check-stat (the splitters that can benefit from the full
21551 message body), you should set this variable.  It is not set by default
21552 because it will slow IMAP down.
21553
21554 @xref{Splitting in IMAP}.
21555
21556 @emph{TODO: Currently, spam.el only supports insertion of articles
21557 into a backend.  There is no way to tell spam.el that an article is no
21558 longer spam or ham.}
21559
21560 @emph{TODO: spam.el needs to provide a uniform way of training all the
21561 statistical databases.  Some have that functionality built-in, others
21562 don't.}
21563
21564 The following are the methods you can use to control the behavior of
21565 @code{spam-split} and their corresponding spam and ham processors:
21566
21567 @menu
21568 * Blacklists and Whitelists::   
21569 * BBDB Whitelists::             
21570 * Blackholes::                  
21571 * Regular Expressions Header Matching::  
21572 * Bogofilter::                  
21573 * ifile spam filtering::        
21574 * spam-stat spam filtering::    
21575 * Extending the spam elisp package::  
21576 @end menu
21577
21578 @node Blacklists and Whitelists
21579 @subsubsection Blacklists and Whitelists
21580 @cindex spam filtering
21581 @cindex whitelists, spam filtering
21582 @cindex blacklists, spam filtering
21583 @cindex spam
21584
21585 @defvar spam-use-blacklist
21586
21587 Set this variable to @code{t} if you want to use blacklists when
21588 splitting incoming mail.  Messages whose senders are in the blacklist
21589 will be sent to the @code{spam-split-group}.  This is an explicit
21590 filter, meaning that it acts only on mail senders @emph{declared} to
21591 be spammers.
21592
21593 @end defvar
21594
21595 @defvar spam-use-whitelist
21596
21597 Set this variable to @code{t} if you want to use whitelists when
21598 splitting incoming mail.  Messages whose senders are not in the
21599 whitelist will be sent to the next spam-split rule.  This is an
21600 explicit filter, meaning that unless someone is in the whitelist, their
21601 messages are not assumed to be spam or ham.
21602
21603 @end defvar
21604
21605 @defvar spam-use-whitelist-exclusive
21606
21607 Set this variable to @code{t} if you want to use whitelists as an
21608 implicit filter, meaning that every message will be considered spam
21609 unless the sender is in the whitelist.  Use with care.
21610
21611 @end defvar
21612
21613 @defvar gnus-group-spam-exit-processor-blacklist
21614
21615 Add this symbol to a group's @code{spam-process} parameter by
21616 customizing the group parameters or the
21617 @code{gnus-spam-process-newsgroups} variable.  When this symbol is
21618 added to a group's @code{spam-process} parameter, the senders of
21619 spam-marked articles will be added to the blacklist.
21620
21621 @end defvar
21622
21623 @defvar gnus-group-ham-exit-processor-whitelist
21624
21625 Add this symbol to a group's @code{spam-process} parameter by
21626 customizing the group parameters or the
21627 @code{gnus-spam-process-newsgroups} variable.  When this symbol is
21628 added to a group's @code{spam-process} parameter, the senders of
21629 ham-marked articles in @emph{ham} groups will be added to the
21630 whitelist.  Note that this ham processor has no effect in @emph{spam}
21631 or @emph{unclassified} groups.
21632
21633 @end defvar
21634
21635 Blacklists are lists of regular expressions matching addresses you
21636 consider to be spam senders.  For instance, to block mail from any
21637 sender at @samp{vmadmin.com}, you can put @samp{vmadmin.com} in your
21638 blacklist.  You start out with an empty blacklist.  Blacklist entries
21639 use the Emacs regular expression syntax.
21640
21641 Conversely, whitelists tell Gnus what addresses are considered
21642 legitimate.  All messages from whitelisted addresses are considered
21643 non-spam.  Also see @ref{BBDB Whitelists}.  Whitelist entries use the
21644 Emacs regular expression syntax.
21645
21646 The blacklist and whitelist file locations can be customized with the
21647 @code{spam-directory} variable (@file{~/News/spam} by default), or
21648 the @code{spam-whitelist} and @code{spam-blacklist} variables
21649 directly.  The whitelist and blacklist files will by default be in the
21650 @code{spam-directory} directory, named @file{whitelist} and
21651 @file{blacklist} respectively.
21652
21653 @node BBDB Whitelists
21654 @subsubsection BBDB Whitelists
21655 @cindex spam filtering
21656 @cindex BBDB whitelists, spam filtering
21657 @cindex BBDB, spam filtering
21658 @cindex spam
21659
21660 @defvar spam-use-BBDB
21661
21662 Analogous to @code{spam-use-whitelist} (@pxref{Blacklists and
21663 Whitelists}), but uses the BBDB as the source of whitelisted
21664 addresses, without regular expressions.  You must have the BBDB loaded
21665 for @code{spam-use-BBDB} to work properly.  Messages whose senders are
21666 not in the BBDB will be sent to the next spam-split rule.  This is an
21667 explicit filter, meaning that unless someone is in the BBDB, their
21668 messages are not assumed to be spam or ham.
21669
21670 @end defvar
21671
21672 @defvar spam-use-BBDB-exclusive
21673
21674 Set this variable to @code{t} if you want to use the BBDB as an
21675 implicit filter, meaning that every message will be considered spam
21676 unless the sender is in the BBDB.  Use with care.  Only sender
21677 addresses in the BBDB will be allowed through; all others will be
21678 classified as spammers.
21679
21680 @end defvar
21681
21682 @defvar gnus-group-ham-exit-processor-BBDB
21683
21684 Add this symbol to a group's @code{spam-process} parameter by
21685 customizing the group parameters or the
21686 @code{gnus-spam-process-newsgroups} variable.  When this symbol is
21687 added to a group's @code{spam-process} parameter, the senders of
21688 ham-marked articles in @emph{ham} groups will be added to the
21689 BBDB.  Note that this ham processor has no effect in @emph{spam}
21690 or @emph{unclassified} groups.
21691
21692 @end defvar
21693
21694 @node Blackholes
21695 @subsubsection Blackholes
21696 @cindex spam filtering
21697 @cindex blackholes, spam filtering
21698 @cindex spam
21699
21700 @defvar spam-use-blackholes
21701
21702 This option is disabled by default.  You can let Gnus consult the
21703 blackhole-type distributed spam processing systems (DCC, for instance)
21704 when you set this option.  The variable @code{spam-blackhole-servers}
21705 holds the list of blackhole servers Gnus will consult.  The current
21706 list is fairly comprehensive, but make sure to let us know if it
21707 contains outdated servers.
21708
21709 The blackhole check uses the @code{dig.el} package, but you can tell
21710 @code{spam.el} to use @code{dns.el} instead for better performance if
21711 you set @code{spam-use-dig} to nil.  It is not recommended at this
21712 time to set @code{spam-use-dig} to nil despite the possible
21713 performance improvements, because some users may be unable to use it,
21714 but you can try it and see if it works for you.
21715
21716 @end defvar
21717
21718 @defvar spam-blackhole-servers
21719
21720 The list of servers to consult for blackhole checks.
21721
21722 @end defvar
21723
21724 @defvar spam-blackhole-good-server-regex
21725
21726 A regular expression for IPs that should not be checked against the
21727 blackhole server list.  When set to nil, it has no effect.
21728
21729 @end defvar
21730
21731 @defvar spam-use-dig
21732
21733 Use the @code{dig.el} package instead of the @code{dns.el} package.
21734 The default setting of @code{t} is recommended.
21735
21736 @end defvar
21737
21738 Blackhole checks are done only on incoming mail.  There is no spam or
21739 ham processor for blackholes.
21740
21741 @node Regular Expressions Header Matching
21742 @subsubsection Regular Expressions Header Matching
21743 @cindex spam filtering
21744 @cindex regular expressions header matching, spam filtering
21745 @cindex spam
21746
21747 @defvar spam-use-regex-headers
21748
21749 This option is disabled by default.  You can let Gnus check the
21750 message headers against lists of regular expressions when you set this
21751 option.  The variables @code{spam-regex-headers-spam} and
21752 @code{spam-regex-headers-ham} hold the list of regular expressions.
21753 Gnus will check against the message headers to determine if the
21754 message is spam or ham, respectively.
21755
21756 @end defvar
21757
21758 @defvar spam-regex-headers-spam
21759
21760 The list of regular expressions that, when matched in the headers of
21761 the message, positively identify it as spam.
21762
21763 @end defvar
21764
21765 @defvar spam-regex-headers-ham
21766
21767 The list of regular expressions that, when matched in the headers of
21768 the message, positively identify it as ham.
21769
21770 @end defvar
21771
21772 Regular expression header checks are done only on incoming mail.
21773 There is no specific spam or ham processor for regular expressions.
21774
21775 @node Bogofilter
21776 @subsubsection Bogofilter
21777 @cindex spam filtering
21778 @cindex bogofilter, spam filtering
21779 @cindex spam
21780
21781 @defvar spam-use-bogofilter
21782
21783 Set this variable if you want @code{spam-split} to use Eric Raymond's
21784 speedy Bogofilter.
21785
21786 With a minimum of care for associating the @samp{$} mark for spam
21787 articles only, Bogofilter training all gets fairly automatic.  You
21788 should do this until you get a few hundreds of articles in each
21789 category, spam or not.  The command @kbd{S t} in summary mode, either
21790 for debugging or for curiosity, shows the @emph{spamicity} score of
21791 the current article (between 0.0 and 1.0).
21792
21793 Bogofilter determines if a message is spam based on an internal
21794 threshold, set at compilation time.  That threshold can't be
21795 customized.
21796
21797 If the @code{bogofilter} executable is not in your path, Bogofilter
21798 processing will be turned off.
21799
21800 You should not enable this if you use @code{spam-use-bogofilter-headers}.
21801
21802 @end defvar
21803
21804 @defvar spam-use-bogofilter-headers
21805
21806 Set this variable if you want @code{spam-split} to use Eric Raymond's
21807 speedy Bogofilter, looking only at the message headers.  It works
21808 similarly to @code{spam-use-bogofilter}, but the @code{X-Bogosity} header
21809 must be in the message already.  Normally you would do this with a
21810 procmail recipe or something similar; consult the Bogofilter
21811 installation documents for details.
21812
21813 You should not enable this if you use @code{spam-use-bogofilter}.
21814
21815 @end defvar
21816
21817 @defvar gnus-group-spam-exit-processor-bogofilter
21818 Add this symbol to a group's @code{spam-process} parameter by
21819 customizing the group parameters or the
21820 @code{gnus-spam-process-newsgroups} variable.  When this symbol is
21821 added to a group's @code{spam-process} parameter, spam-marked articles
21822 will be added to the Bogofilter spam database.
21823 @end defvar
21824
21825 @defvar gnus-group-ham-exit-processor-bogofilter
21826 Add this symbol to a group's @code{spam-process} parameter by
21827 customizing the group parameters or the
21828 @code{gnus-spam-process-newsgroups} variable.  When this symbol is
21829 added to a group's @code{spam-process} parameter, the ham-marked
21830 articles in @emph{ham} groups will be added to the Bogofilter database
21831 of non-spam messages.  Note that this ham processor has no effect in
21832 @emph{spam} or @emph{unclassified} groups.
21833 @end defvar
21834
21835 @defvar spam-bogofilter-database-directory
21836
21837 This is the directory where Bogofilter will store its databases.  It
21838 is not specified by default, so Bogofilter will use its own default
21839 database directory.
21840
21841 @end defvar
21842
21843 The Bogofilter mail classifier is similar to ifile in intent and
21844 purpose.  A ham and a spam processor are provided, plus the
21845 @code{spam-use-bogofilter} and @code{spam-use-bogofilter-headers}
21846 variables to indicate to spam-split that Bogofilter should either be
21847 used, or has already been used on the article.  The 0.9.2.1 version of
21848 Bogofilter was used to test this functionality.
21849
21850 @node ifile spam filtering
21851 @subsubsection ifile spam filtering
21852 @cindex spam filtering
21853 @cindex ifile, spam filtering
21854 @cindex spam
21855
21856 @defvar spam-use-ifile
21857
21858 Enable this variable if you want @code{spam-split} to use ifile, a
21859 statistical analyzer similar to Bogofilter.
21860
21861 @end defvar
21862
21863 @defvar spam-ifile-all-categories
21864
21865 Enable this variable if you want @code{spam-use-ifile} to give you all
21866 the ifile categories, not just spam/non-spam.  If you use this, make
21867 sure you train ifile as described in its documentation.
21868
21869 @end defvar
21870
21871 @defvar spam-ifile-spam-category
21872
21873 This is the category of spam messages as far as ifile is concerned.
21874 The actual string used is irrelevant, but you probably want to leave
21875 the default value of @samp{spam}.
21876 @end defvar
21877
21878 @defvar spam-ifile-database-path
21879
21880 This is the filename for the ifile database.  It is not specified by
21881 default, so ifile will use its own default database name.
21882
21883 @end defvar
21884
21885 The ifile mail classifier is similar to Bogofilter in intent and
21886 purpose.  A ham and a spam processor are provided, plus the
21887 @code{spam-use-ifile} variable to indicate to spam-split that ifile
21888 should be used.  The 1.2.1 version of ifile was used to test this
21889 functionality.
21890
21891 @node spam-stat spam filtering
21892 @subsubsection spam-stat spam filtering
21893 @cindex spam filtering
21894 @cindex spam-stat, spam filtering
21895 @cindex spam-stat
21896 @cindex spam
21897
21898 @xref{Filtering Spam Using Statistics with spam-stat}.
21899
21900 @defvar spam-use-stat
21901
21902 Enable this variable if you want @code{spam-split} to use
21903 spam-stat.el, an Emacs Lisp statistical analyzer.
21904
21905 @end defvar
21906
21907 @defvar gnus-group-spam-exit-processor-stat
21908 Add this symbol to a group's @code{spam-process} parameter by
21909 customizing the group parameters or the
21910 @code{gnus-spam-process-newsgroups} variable.  When this symbol is
21911 added to a group's @code{spam-process} parameter, the spam-marked
21912 articles will be added to the spam-stat database of spam messages.
21913 @end defvar
21914
21915 @defvar gnus-group-ham-exit-processor-stat
21916 Add this symbol to a group's @code{spam-process} parameter by
21917 customizing the group parameters or the
21918 @code{gnus-spam-process-newsgroups} variable.  When this symbol is
21919 added to a group's @code{spam-process} parameter, the ham-marked
21920 articles in @emph{ham} groups will be added to the spam-stat database
21921 of non-spam messages.  Note that this ham processor has no effect in
21922 @emph{spam} or @emph{unclassified} groups.
21923 @end defvar
21924
21925 This enables spam.el to cooperate with spam-stat.el.  spam-stat.el
21926 provides an internal (Lisp-only) spam database, which unlike ifile or
21927 Bogofilter does not require external programs.  A spam and a ham
21928 processor, and the @code{spam-use-stat} variable for @code{spam-split}
21929 are provided.
21930
21931 @node Extending the spam elisp package
21932 @subsubsection Extending the spam elisp package
21933 @cindex spam filtering
21934 @cindex spam elisp package, extending
21935 @cindex extending the spam elisp package
21936
21937 Say you want to add a new back end called blackbox.  For filtering
21938 incoming mail, provide the following:
21939
21940 @enumerate
21941
21942 @item
21943 code
21944
21945 @example
21946 (defvar spam-use-blackbox nil
21947   "True if blackbox should be used.")
21948 @end example
21949
21950 Add
21951 @example
21952     (spam-use-blackbox   . spam-check-blackbox)
21953 @end example
21954 to @code{spam-list-of-checks}.
21955
21956 @item
21957 functionality
21958
21959 Write the @code{spam-check-blackbox} function.  It should return
21960 @samp{nil} or @code{spam-split-group}.  See the existing
21961 @code{spam-check-*} functions for examples of what you can do.
21962 @end enumerate
21963
21964 For processing spam and ham messages, provide the following:
21965
21966 @enumerate
21967
21968 @item
21969 code 
21970
21971 Note you don't have to provide a spam or a ham processor.  Only
21972 provide them if Blackbox supports spam or ham processing.
21973
21974 @example
21975 (defvar gnus-group-spam-exit-processor-blackbox "blackbox"
21976   "The Blackbox summary exit spam processor.
21977 Only applicable to spam groups.")
21978
21979 (defvar gnus-group-ham-exit-processor-blackbox "blackbox"
21980   "The whitelist summary exit ham processor.
21981 Only applicable to non-spam (unclassified and ham) groups.")
21982
21983 @end example
21984
21985 @item
21986 functionality
21987
21988 @example
21989 (defun spam-blackbox-register-spam-routine ()
21990   (spam-generic-register-routine
21991    ;; the spam function
21992    (lambda (article)
21993      (let ((from (spam-fetch-field-from-fast article)))
21994        (when (stringp from)
21995            (blackbox-do-something-with-this-spammer from))))
21996    ;; the ham function
21997    nil))
21998
21999 (defun spam-blackbox-register-ham-routine ()
22000   (spam-generic-register-routine
22001    ;; the spam function
22002    nil
22003    ;; the ham function
22004    (lambda (article)
22005      (let ((from (spam-fetch-field-from-fast article)))
22006        (when (stringp from)
22007            (blackbox-do-something-with-this-ham-sender from))))))
22008 @end example
22009
22010 Write the @code{blackbox-do-something-with-this-ham-sender} and
22011 @code{blackbox-do-something-with-this-spammer} functions.  You can add
22012 more complex code than fetching the message sender, but keep in mind
22013 that retrieving the whole message takes significantly longer than the
22014 sender through @code{spam-fetch-field-from-fast}, because the message
22015 senders are kept in memory by Gnus.
22016
22017 @end enumerate
22018
22019
22020 @node Filtering Spam Using Statistics with spam-stat
22021 @subsection Filtering Spam Using Statistics with spam-stat
22022 @cindex Paul Graham
22023 @cindex Graham, Paul
22024 @cindex naive Bayesian spam filtering
22025 @cindex Bayesian spam filtering, naive
22026 @cindex spam filtering, naive Bayesian
22027
22028 Paul Graham has written an excellent essay about spam filtering using
22029 statistics: @uref{http://www.paulgraham.com/spam.html,A Plan for
22030 Spam}.  In it he describes the inherent deficiency of rule-based
22031 filtering as used by SpamAssassin, for example: Somebody has to write
22032 the rules, and everybody else has to install these rules.  You are
22033 always late.  It would be much better, he argues, to filter mail based
22034 on whether it somehow resembles spam or non-spam.  One way to measure
22035 this is word distribution.  He then goes on to describe a solution
22036 that checks whether a new mail resembles any of your other spam mails
22037 or not.
22038
22039 The basic idea is this:  Create a two collections of your mail, one
22040 with spam, one with non-spam.  Count how often each word appears in
22041 either collection, weight this by the total number of mails in the
22042 collections, and store this information in a dictionary.  For every
22043 word in a new mail, determine its probability to belong to a spam or a
22044 non-spam mail.  Use the 15 most conspicuous words, compute the total
22045 probability of the mail being spam.  If this probability is higher
22046 than a certain threshold, the mail is considered to be spam.
22047
22048 Gnus supports this kind of filtering.  But it needs some setting up.
22049 First, you need two collections of your mail, one with spam, one with
22050 non-spam.  Then you need to create a dictionary using these two
22051 collections, and save it.  And last but not least, you need to use
22052 this dictionary in your fancy mail splitting rules.
22053
22054 @menu
22055 * Creating a spam-stat dictionary::  
22056 * Splitting mail using spam-stat::  
22057 * Low-level interface to the spam-stat dictionary::  
22058 @end menu
22059
22060 @node Creating a spam-stat dictionary
22061 @subsubsection Creating a spam-stat dictionary
22062
22063 Before you can begin to filter spam based on statistics, you must
22064 create these statistics based on two mail collections, one with spam,
22065 one with non-spam.  These statistics are then stored in a dictionary
22066 for later use.  In order for these statistics to be meaningful, you
22067 need several hundred emails in both collections.
22068
22069 Gnus currently supports only the nnml back end for automated dictionary
22070 creation.  The nnml back end stores all mails in a directory, one file
22071 per mail.  Use the following:
22072
22073 @defun spam-stat-process-spam-directory
22074 Create spam statistics for every file in this directory.  Every file
22075 is treated as one spam mail.
22076 @end defun
22077
22078 @defun spam-stat-process-non-spam-directory
22079 Create non-spam statistics for every file in this directory.  Every
22080 file is treated as one non-spam mail.
22081 @end defun
22082
22083 Usually you would call @code{spam-stat-process-spam-directory} on a
22084 directory such as @file{~/Mail/mail/spam} (this usually corresponds
22085 the the group @samp{nnml:mail.spam}), and you would call
22086 @code{spam-stat-process-non-spam-directory} on a directory such as
22087 @file{~/Mail/mail/misc} (this usually corresponds the the group
22088 @samp{nnml:mail.misc}).
22089
22090 When you are using IMAP, you won't have the mails available locally,
22091 so that will not work.  One solution is to use the Gnus Agent to cache
22092 the articles.  Then you can use directories such as
22093 @file{"~/News/agent/nnimap/mail.yourisp.com/personal_spam"} for
22094 @code{spam-stat-process-spam-directory}.  @xref{Agent as Cache}.
22095
22096 @defvar spam-stat
22097 This variable holds the hash-table with all the statistics -- the
22098 dictionary we have been talking about.  For every word in either
22099 collection, this hash-table stores a vector describing how often the
22100 word appeared in spam and often it appeared in non-spam mails.
22101 @end defvar
22102
22103 If you want to regenerate the statistics from scratch, you need to
22104 reset the dictionary.
22105
22106 @defun spam-stat-reset
22107 Reset the @code{spam-stat} hash-table, deleting all the statistics.
22108 @end defun
22109
22110 When you are done, you must save the dictionary.  The dictionary may
22111 be rather large.  If you will not update the dictionary incrementally
22112 (instead, you will recreate it once a month, for example), then you
22113 can reduce the size of the dictionary by deleting all words that did
22114 not appear often enough or that do not clearly belong to only spam or
22115 only non-spam mails.
22116
22117 @defun spam-stat-reduce-size
22118 Reduce the size of the dictionary.  Use this only if you do not want
22119 to update the dictionary incrementally.
22120 @end defun
22121
22122 @defun spam-stat-save
22123 Save the dictionary.
22124 @end defun
22125
22126 @defvar spam-stat-file
22127 The filename used to store the dictionary.  This defaults to
22128 @file{~/.spam-stat.el}.
22129 @end defvar
22130
22131 @node Splitting mail using spam-stat
22132 @subsubsection Splitting mail using spam-stat
22133
22134 In order to use @code{spam-stat} to split your mail, you need to add the
22135 following to your @file{~/.gnus} file:
22136
22137 @example
22138 (require 'spam-stat)
22139 (spam-stat-load)
22140 @end example
22141
22142 This will load the necessary Gnus code, and the dictionary you
22143 created.
22144
22145 Next, you need to adapt your fancy splitting rules:  You need to
22146 determine how to use @code{spam-stat}.  The following examples are for
22147 the nnml back end.  Using the nnimap back end works just as well.  Just
22148 use @code{nnimap-split-fancy} instead of @code{nnmail-split-fancy}.
22149
22150 In the simplest case, you only have two groups, @samp{mail.misc} and
22151 @samp{mail.spam}.  The following expression says that mail is either
22152 spam or it should go into @samp{mail.misc}.  If it is spam, then
22153 @code{spam-stat-split-fancy} will return @samp{mail.spam}.
22154
22155 @example
22156 (setq nnmail-split-fancy
22157       `(| (: spam-stat-split-fancy)
22158           "mail.misc"))
22159 @end example
22160
22161 @defvar spam-stat-split-fancy-spam-group
22162 The group to use for spam.  Default is @samp{mail.spam}.
22163 @end defvar
22164
22165 If you also filter mail with specific subjects into other groups, use
22166 the following expression.  Only mails not matching the regular
22167 expression are considered potential spam.
22168
22169 @example
22170 (setq nnmail-split-fancy
22171       `(| ("Subject" "\\bspam-stat\\b" "mail.emacs")
22172           (: spam-stat-split-fancy)
22173           "mail.misc"))
22174 @end example
22175
22176 If you want to filter for spam first, then you must be careful when
22177 creating the dictionary.  Note that @code{spam-stat-split-fancy} must
22178 consider both mails in @samp{mail.emacs} and in @samp{mail.misc} as
22179 non-spam, therefore both should be in your collection of non-spam
22180 mails, when creating the dictionary!
22181
22182 @example
22183 (setq nnmail-split-fancy
22184       `(| (: spam-stat-split-fancy)
22185           ("Subject" "\\bspam-stat\\b" "mail.emacs")
22186           "mail.misc"))
22187 @end example
22188
22189 You can combine this with traditional filtering.  Here, we move all
22190 HTML-only mails into the @samp{mail.spam.filtered} group.  Note that since
22191 @code{spam-stat-split-fancy} will never see them, the mails in
22192 @samp{mail.spam.filtered} should be neither in your collection of spam mails,
22193 nor in your collection of non-spam mails, when creating the
22194 dictionary!
22195
22196 @example
22197 (setq nnmail-split-fancy
22198       `(| ("Content-Type" "text/html" "mail.spam.filtered")
22199           (: spam-stat-split-fancy)
22200           ("Subject" "\\bspam-stat\\b" "mail.emacs")
22201           "mail.misc"))
22202 @end example
22203
22204
22205 @node Low-level interface to the spam-stat dictionary
22206 @subsubsection Low-level interface to the spam-stat dictionary
22207
22208 The main interface to using @code{spam-stat}, are the following functions:
22209
22210 @defun spam-stat-buffer-is-spam
22211 Called in a buffer, that buffer is considered to be a new spam mail.
22212 Use this for new mail that has not been processed before.
22213 @end defun
22214
22215 @defun spam-stat-buffer-is-no-spam
22216 Called in a buffer, that buffer is considered to be a new non-spam
22217 mail.  Use this for new mail that has not been processed before.
22218 @end defun
22219
22220 @defun spam-stat-buffer-change-to-spam
22221 Called in a buffer, that buffer is no longer considered to be normal
22222 mail but spam.  Use this to change the status of a mail that has
22223 already been processed as non-spam.
22224 @end defun
22225
22226 @defun spam-stat-buffer-change-to-non-spam
22227 Called in a buffer, that buffer is no longer considered to be spam but
22228 normal mail.  Use this to change the status of a mail that has already
22229 been processed as spam.
22230 @end defun
22231
22232 @defun spam-stat-save
22233 Save the hash table to the file.  The filename used is stored in the
22234 variable @code{spam-stat-file}.
22235 @end defun
22236
22237 @defun spam-stat-load
22238 Load the hash table from a file.  The filename used is stored in the
22239 variable @code{spam-stat-file}.
22240 @end defun
22241
22242 @defun spam-stat-score-word
22243 Return the spam score for a word.
22244 @end defun
22245
22246 @defun spam-stat-score-buffer
22247 Return the spam score for a buffer.
22248 @end defun
22249
22250 @defun spam-stat-split-fancy
22251 Use this function for fancy mail splitting.  Add the rule @samp{(:
22252 spam-stat-split-fancy)} to @code{nnmail-split-fancy}
22253 @end defun
22254
22255 Make sure you load the dictionary before using it.  This requires the
22256 following in your @file{~/.gnus} file:
22257
22258 @example
22259 (require 'spam-stat)
22260 (spam-stat-load)
22261 @end example
22262
22263 Typical test will involve calls to the following functions:
22264
22265 @example
22266 Reset: (setq spam-stat (make-hash-table :test 'equal))
22267 Learn spam: (spam-stat-process-spam-directory "~/Mail/mail/spam")
22268 Learn non-spam: (spam-stat-process-non-spam-directory "~/Mail/mail/misc")
22269 Save table: (spam-stat-save)
22270 File size: (nth 7 (file-attributes spam-stat-file))
22271 Number of words: (hash-table-count spam-stat)
22272 Test spam: (spam-stat-test-directory "~/Mail/mail/spam")
22273 Test non-spam: (spam-stat-test-directory "~/Mail/mail/misc")
22274 Reduce table size: (spam-stat-reduce-size)
22275 Save table: (spam-stat-save)
22276 File size: (nth 7 (file-attributes spam-stat-file))
22277 Number of words: (hash-table-count spam-stat)
22278 Test spam: (spam-stat-test-directory "~/Mail/mail/spam")
22279 Test non-spam: (spam-stat-test-directory "~/Mail/mail/misc")
22280 @end example
22281
22282 Here is how you would create your dictionary:
22283
22284 @example
22285 Reset: (setq spam-stat (make-hash-table :test 'equal))
22286 Learn spam: (spam-stat-process-spam-directory "~/Mail/mail/spam")
22287 Learn non-spam: (spam-stat-process-non-spam-directory "~/Mail/mail/misc")
22288 Repeat for any other non-spam group you need...
22289 Reduce table size: (spam-stat-reduce-size)
22290 Save table: (spam-stat-save)
22291 @end example
22292
22293 @node Various Various
22294 @section Various Various
22295 @cindex mode lines
22296 @cindex highlights
22297
22298 @table @code
22299
22300 @item gnus-home-directory
22301 @vindex gnus-home-directory
22302 All Gnus file and directory variables will be initialized from this
22303 variable, which defaults to @file{~/}.
22304
22305 @item gnus-directory
22306 @vindex gnus-directory
22307 Most Gnus storage file and directory variables will be initialized from
22308 this variable, which defaults to the @samp{SAVEDIR} environment
22309 variable, or @file{~/News/} if that variable isn't set.
22310
22311 Note that gnus is mostly loaded when the @file{.gnus.el} file is read.
22312 This means that other directory variables that are initialized from this
22313 variable won't be set properly if you set this variable in
22314 @file{.gnus.el}.  Set this variable in @file{.emacs} instead.
22315
22316 @item gnus-default-directory
22317 @vindex gnus-default-directory
22318 Not related to the above variable at all---this variable says what the
22319 default directory of all Gnus buffers should be.  If you issue commands
22320 like @kbd{C-x C-f}, the prompt you'll get starts in the current buffer's
22321 default directory.  If this variable is @code{nil} (which is the
22322 default), the default directory will be the default directory of the
22323 buffer you were in when you started Gnus.
22324
22325 @item gnus-verbose
22326 @vindex gnus-verbose
22327 This variable is an integer between zero and ten.  The higher the value,
22328 the more messages will be displayed.  If this variable is zero, Gnus
22329 will never flash any messages, if it is seven (which is the default),
22330 most important messages will be shown, and if it is ten, Gnus won't ever
22331 shut up, but will flash so many messages it will make your head swim.
22332
22333 @item gnus-verbose-backends
22334 @vindex gnus-verbose-backends
22335 This variable works the same way as @code{gnus-verbose}, but it applies
22336 to the Gnus back ends instead of Gnus proper.
22337
22338 @item nnheader-max-head-length
22339 @vindex nnheader-max-head-length
22340 When the back ends read straight heads of articles, they all try to read
22341 as little as possible.  This variable (default 4096) specifies
22342 the absolute max length the back ends will try to read before giving up
22343 on finding a separator line between the head and the body.  If this
22344 variable is @code{nil}, there is no upper read bound.  If it is
22345 @code{t}, the back ends won't try to read the articles piece by piece,
22346 but read the entire articles.  This makes sense with some versions of
22347 @code{ange-ftp} or @code{efs}.
22348
22349 @item nnheader-head-chop-length
22350 @vindex nnheader-head-chop-length
22351 This variable (default 2048) says how big a piece of each article to
22352 read when doing the operation described above.
22353
22354 @item nnheader-file-name-translation-alist
22355 @vindex nnheader-file-name-translation-alist
22356 @cindex file names
22357 @cindex invalid characters in file names
22358 @cindex characters in file names
22359 This is an alist that says how to translate characters in file names.
22360 For instance, if @samp{:} is invalid as a file character in file names
22361 on your system (you OS/2 user you), you could say something like:
22362
22363 @lisp
22364 (setq nnheader-file-name-translation-alist
22365       '((?: . ?_)))
22366 @end lisp
22367
22368 In fact, this is the default value for this variable on OS/2 and MS
22369 Windows (phooey) systems.
22370
22371 @item gnus-hidden-properties
22372 @vindex gnus-hidden-properties
22373 This is a list of properties to use to hide ``invisible'' text.  It is
22374 @code{(invisible t intangible t)} by default on most systems, which
22375 makes invisible text invisible and intangible.
22376
22377 @item gnus-parse-headers-hook
22378 @vindex gnus-parse-headers-hook
22379 A hook called before parsing headers.  It can be used, for instance, to
22380 gather statistics on the headers fetched, or perhaps you'd like to prune
22381 some headers.  I don't see why you'd want that, though.
22382
22383 @item gnus-shell-command-separator
22384 @vindex gnus-shell-command-separator
22385 String used to separate two shell commands.  The default is @samp{;}.
22386
22387 @item gnus-invalid-group-regexp
22388 @vindex gnus-invalid-group-regexp
22389
22390 Regexp to match ``invalid'' group names when querying user for a group
22391 name.  The default value catches some @strong{really} invalid group
22392 names who could possibly mess up Gnus internally (like allowing
22393 @samp{:} in a group name, which is normally used to delimit method and
22394 group).
22395
22396 @sc{imap} users might want to allow @samp{/} in group names though.
22397
22398
22399 @end table
22400
22401 @node The End
22402 @chapter The End
22403
22404 Well, that's the manual---you can get on with your life now.  Keep in
22405 touch.  Say hello to your cats from me.
22406
22407 My @strong{ghod}---I just can't stand goodbyes.  Sniffle.
22408
22409 Ol' Charles Reznikoff said it pretty well, so I leave the floor to him:
22410
22411 @quotation
22412 @strong{Te Deum}
22413
22414 @sp 1
22415 Not because of victories @*
22416 I sing,@*
22417 having none,@*
22418 but for the common sunshine,@*
22419 the breeze,@*
22420 the largess of the spring.
22421
22422 @sp 1
22423 Not for victory@*
22424 but for the day's work done@*
22425 as well as I was able;@*
22426 not for a seat upon the dais@*
22427 but at the common table.@*
22428 @end quotation
22429
22430
22431 @node Appendices
22432 @chapter Appendices
22433
22434 @menu
22435 * XEmacs::                      Requirements for installing under XEmacs.
22436 * History::                     How Gnus got where it is today.
22437 * On Writing Manuals::          Why this is not a beginner's guide.
22438 * Terminology::                 We use really difficult, like, words here.
22439 * Customization::               Tailoring Gnus to your needs.
22440 * Troubleshooting::             What you might try if things do not work.
22441 * Gnus Reference Guide::        Rilly, rilly technical stuff.
22442 * Emacs for Heathens::          A short introduction to Emacsian terms.
22443 * Frequently Asked Questions::
22444 @end menu
22445
22446
22447 @node XEmacs
22448 @section XEmacs
22449 @cindex XEmacs
22450 @cindex Installing under XEmacs
22451
22452 XEmacs is distributed as a collection of packages.  You should install
22453 whatever packages the Gnus XEmacs package requires.  The current
22454 requirements are @samp{gnus}, @samp{w3}, @samp{mh-e},
22455 @samp{mailcrypt}, @samp{rmail}, @samp{eterm}, @samp{mail-lib},
22456 @samp{xemacs-base}, @samp{sh-script} and @samp{fsf-compat}.  The
22457 @samp{misc-games} package is required for Morse decoding.
22458
22459
22460 @node History
22461 @section History
22462
22463 @cindex history
22464 @sc{gnus} was written by Masanobu @sc{Umeda}.  When autumn crept up in
22465 '94, Lars Magne Ingebrigtsen grew bored and decided to rewrite Gnus.
22466
22467 If you want to investigate the person responsible for this outrage,
22468 you can point your (feh!) web browser to
22469 @uref{http://quimby.gnus.org/}.  This is also the primary
22470 distribution point for the new and spiffy versions of Gnus, and is
22471 known as The Site That Destroys Newsrcs And Drives People Mad.
22472
22473 During the first extended alpha period of development, the new Gnus was
22474 called ``(ding) Gnus''.  @dfn{(ding)} is, of course, short for
22475 @dfn{ding is not Gnus}, which is a total and utter lie, but who cares?
22476 (Besides, the ``Gnus'' in this abbreviation should probably be
22477 pronounced ``news'' as @sc{Umeda} intended, which makes it a more
22478 appropriate name, don't you think?)
22479
22480 In any case, after spending all that energy on coming up with a new and
22481 spunky name, we decided that the name was @emph{too} spunky, so we
22482 renamed it back again to ``Gnus''.  But in mixed case.  ``Gnus'' vs.
22483 ``@sc{gnus}''.  New vs. old.
22484
22485 @menu
22486 * Gnus Versions::               What Gnus versions have been released.
22487 * Other Gnus Versions::         Other Gnus versions that also have been released.
22488 * Why?::                        What's the point of Gnus?
22489 * Compatibility::               Just how compatible is Gnus with @sc{gnus}?
22490 * Conformity::                  Gnus tries to conform to all standards.
22491 * Emacsen::                     Gnus can be run on a few modern Emacsen.
22492 * Gnus Development::            How Gnus is developed.
22493 * Contributors::                Oodles of people.
22494 * New Features::                Pointers to some of the new stuff in Gnus.
22495 @end menu
22496
22497
22498 @node Gnus Versions
22499 @subsection Gnus Versions
22500 @cindex ding Gnus
22501 @cindex September Gnus
22502 @cindex Red Gnus
22503 @cindex Quassia Gnus
22504 @cindex Pterodactyl Gnus
22505 @cindex Oort Gnus
22506 @cindex No Gnus
22507
22508 The first ``proper'' release of Gnus 5 was done in November 1995 when it
22509 was included in the Emacs 19.30 distribution (132 (ding) Gnus releases
22510 plus 15 Gnus 5.0 releases).
22511
22512 In May 1996 the next Gnus generation (aka. ``September Gnus'' (after 99
22513 releases)) was released under the name ``Gnus 5.2'' (40 releases).
22514
22515 On July 28th 1996 work on Red Gnus was begun, and it was released on
22516 January 25th 1997 (after 84 releases) as ``Gnus 5.4'' (67 releases).
22517
22518 On September 13th 1997, Quassia Gnus was started and lasted 37 releases.
22519 If was released as ``Gnus 5.6'' on March 8th 1998 (46 releases).
22520
22521 Gnus 5.6 begat Pterodactyl Gnus on August 29th 1998 and was released as
22522 ``Gnus 5.8'' (after 99 releases and a CVS repository) on December 3rd
22523 1999.
22524
22525 On the 26th of October 2000, Oort Gnus was begun.
22526
22527 If you happen upon a version of Gnus that has a prefixed name --
22528 ``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'',
22529 ``Pterodactyl Gnus'', ``Oort Gnus'' -- don't panic.  Don't let it know
22530 that you're frightened.  Back away.  Slowly.  Whatever you do, don't
22531 run.  Walk away, calmly, until you're out of its reach.  Find a proper
22532 released version of Gnus and snuggle up to that instead.
22533
22534
22535 @node Other Gnus Versions
22536 @subsection Other Gnus Versions
22537 @cindex Semi-gnus
22538
22539 In addition to the versions of Gnus which have had their releases
22540 coordinated by Lars, one major development has been Semi-gnus from
22541 Japan.  It's based on a library called @sc{semi}, which provides
22542 @sc{mime} capabilities.
22543
22544 These Gnusae are based mainly on Gnus 5.6 and Pterodactyl Gnus.
22545 Collectively, they are called ``Semi-gnus'', and different strains are
22546 called T-gnus, ET-gnus, Nana-gnus and Chaos.  These provide powerful
22547 @sc{mime} and multilingualization things, especially important for
22548 Japanese users.
22549
22550
22551 @node Why?
22552 @subsection Why?
22553
22554 What's the point of Gnus?
22555
22556 I want to provide a ``rad'', ``happening'', ``way cool'' and ``hep''
22557 newsreader, that lets you do anything you can think of.  That was my
22558 original motivation, but while working on Gnus, it has become clear to
22559 me that this generation of newsreaders really belong in the stone age.
22560 Newsreaders haven't developed much since the infancy of the net.  If the
22561 volume continues to rise with the current rate of increase, all current
22562 newsreaders will be pretty much useless.  How do you deal with
22563 newsgroups that have thousands of new articles each day?  How do you
22564 keep track of millions of people who post?
22565
22566 Gnus offers no real solutions to these questions, but I would very much
22567 like to see Gnus being used as a testing ground for new methods of
22568 reading and fetching news.  Expanding on @sc{Umeda}-san's wise decision
22569 to separate the newsreader from the back ends, Gnus now offers a simple
22570 interface for anybody who wants to write new back ends for fetching mail
22571 and news from different sources.  I have added hooks for customizations
22572 everywhere I could imagine it being useful.  By doing so, I'm inviting
22573 every one of you to explore and invent.
22574
22575 May Gnus never be complete.  @kbd{C-u 100 M-x all-hail-emacs} and
22576 @kbd{C-u 100 M-x all-hail-xemacs}.
22577
22578
22579 @node Compatibility
22580 @subsection Compatibility
22581
22582 @cindex compatibility
22583 Gnus was designed to be fully compatible with @sc{gnus}.  Almost all key
22584 bindings have been kept.  More key bindings have been added, of course,
22585 but only in one or two obscure cases have old bindings been changed.
22586
22587 Our motto is:
22588 @quotation
22589 @cartouche
22590 @center In a cloud bones of steel.
22591 @end cartouche
22592 @end quotation
22593
22594 All commands have kept their names.  Some internal functions have changed
22595 their names.
22596
22597 The @code{gnus-uu} package has changed drastically.  @xref{Decoding
22598 Articles}.
22599
22600 One major compatibility question is the presence of several summary
22601 buffers.  All variables relevant while reading a group are
22602 buffer-local to the summary buffer they belong in.  Although many
22603 important variables have their values copied into their global
22604 counterparts whenever a command is executed in the summary buffer, this
22605 change might lead to incorrect values being used unless you are careful.
22606
22607 All code that relies on knowledge of @sc{gnus} internals will probably
22608 fail.  To take two examples: Sorting @code{gnus-newsrc-alist} (or
22609 changing it in any way, as a matter of fact) is strictly verboten.  Gnus
22610 maintains a hash table that points to the entries in this alist (which
22611 speeds up many functions), and changing the alist directly will lead to
22612 peculiar results.
22613
22614 @cindex hilit19
22615 @cindex highlighting
22616 Old hilit19 code does not work at all.  In fact, you should probably
22617 remove all hilit code from all Gnus hooks
22618 (@code{gnus-group-prepare-hook} and @code{gnus-summary-prepare-hook}).
22619 Gnus provides various integrated functions for highlighting.  These are
22620 faster and more accurate.  To make life easier for everybody, Gnus will
22621 by default remove all hilit calls from all hilit hooks.  Uncleanliness!
22622 Away!
22623
22624 Packages like @code{expire-kill} will no longer work.  As a matter of
22625 fact, you should probably remove all old @sc{gnus} packages (and other
22626 code) when you start using Gnus.  More likely than not, Gnus already
22627 does what you have written code to make @sc{gnus} do.  (Snicker.)
22628
22629 Even though old methods of doing things are still supported, only the
22630 new methods are documented in this manual.  If you detect a new method of
22631 doing something while reading this manual, that does not mean you have
22632 to stop doing it the old way.
22633
22634 Gnus understands all @sc{gnus} startup files.
22635
22636 @kindex M-x gnus-bug
22637 @findex gnus-bug
22638 @cindex reporting bugs
22639 @cindex bugs
22640 Overall, a casual user who hasn't written much code that depends on
22641 @sc{gnus} internals should suffer no problems.  If problems occur,
22642 please let me know by issuing that magic command @kbd{M-x gnus-bug}.
22643
22644 @vindex gnus-bug-create-help-buffer
22645 If you are in the habit of sending bug reports @emph{very} often, you
22646 may find the helpful help buffer annoying after a while.  If so, set
22647 @code{gnus-bug-create-help-buffer} to @code{nil} to avoid having it pop
22648 up at you.
22649
22650
22651 @node Conformity
22652 @subsection Conformity
22653
22654 No rebels without a clue here, ma'am.  We conform to all standards known
22655 to (wo)man.  Except for those standards and/or conventions we disagree
22656 with, of course.
22657
22658 @table @strong
22659
22660 @item RFC (2)822
22661 @cindex RFC 822
22662 @cindex RFC 2822
22663 There are no known breaches of this standard.
22664
22665 @item RFC 1036
22666 @cindex RFC 1036
22667 There are no known breaches of this standard, either.
22668
22669 @item Son-of-RFC 1036
22670 @cindex Son-of-RFC 1036
22671 We do have some breaches to this one.
22672
22673 @table @emph
22674
22675 @item X-Newsreader
22676 @itemx User-Agent
22677 These are considered to be ``vanity headers'', while I consider them
22678 to be consumer information.  After seeing so many badly formatted
22679 articles coming from @code{tin} and @code{Netscape} I know not to use
22680 either of those for posting articles.  I would not have known that if
22681 it wasn't for the @code{X-Newsreader} header.
22682 @end table
22683
22684 @item USEFOR
22685 @cindex USEFOR
22686 USEFOR is an IETF working group writing a successor to RFC 1036, based
22687 on Son-of-RFC 1036.  They have produced a number of drafts proposing
22688 various changes to the format of news articles.  The Gnus towers will
22689 look into implementing the changes when the draft is accepted as an RFC.
22690
22691 @item MIME - RFC 2045-2049 etc
22692 @cindex MIME
22693 All the various @sc{mime} RFCs are supported.
22694
22695 @item Disposition Notifications - RFC 2298
22696 Message Mode is able to request notifications from the receiver.
22697
22698 @item PGP - RFC 1991 and RFC 2440
22699 @cindex RFC 1991
22700 @cindex RFC 2440
22701 RFC 1991 is the original PGP message specification, published as a
22702 Information RFC.  RFC 2440 was the follow-up, now called Open PGP, and
22703 put on the Standards Track.  Both document a non-@sc{mime} aware PGP
22704 format.  Gnus supports both encoding (signing and encryption) and
22705 decoding (verification and decryption).
22706
22707 @item PGP/MIME - RFC 2015/3156
22708 RFC 2015 (superseded by 3156 which references RFC 2440 instead of RFC
22709 1991) describes the @sc{mime}-wrapping around the RF 1991/2440 format.
22710 Gnus supports both encoding and decoding.
22711
22712 @item S/MIME - RFC 2633
22713 RFC 2633 describes the @sc{s/mime} format.
22714
22715 @item IMAP - RFC 1730/2060, RFC 2195, RFC 2086, RFC 2359, RFC 2595, RFC 1731
22716 RFC 1730 is @sc{imap} version 4, updated somewhat by RFC 2060 (@sc{imap} 4
22717 revision 1).  RFC 2195 describes CRAM-MD5 authentication for @sc{imap}. RFC
22718 2086 describes access control lists (ACLs) for @sc{imap}. RFC 2359
22719 describes a @sc{imap} protocol enhancement.  RFC 2595 describes the proper
22720 TLS integration (STARTTLS) with @sc{imap}.  RFC 1731 describes the
22721 GSSAPI/Kerberos4 mechanisms for @sc{imap}.
22722
22723 @end table
22724
22725 If you ever notice Gnus acting non-compliant with regards to the texts
22726 mentioned above, don't hesitate to drop a note to Gnus Towers and let us
22727 know.
22728
22729
22730 @node Emacsen
22731 @subsection Emacsen
22732 @cindex Emacsen
22733 @cindex XEmacs
22734 @cindex Mule
22735 @cindex Emacs
22736
22737 Gnus should work on :
22738
22739 @itemize @bullet
22740
22741 @item
22742 Emacs 20.3 and up.
22743
22744 @item
22745 XEmacs 21.1.1 and up.
22746
22747 @end itemize
22748
22749 This Gnus version will absolutely not work on any Emacsen older than
22750 that.  Not reliably, at least.  Older versions of Gnus may work on older
22751 Emacs versions.  However, T-gnus does support ``Mule 2.3 based on Emacs
22752 19.34'' and possibly the versions of XEmacs prior to 21.1.1, e.g. 20.4.
22753 See the file ``README'' in the T-gnus distribution for more details.
22754
22755 There are some vague differences between Gnus on the various
22756 platforms---XEmacs features more graphics (a logo and a toolbar)---but
22757 other than that, things should look pretty much the same under all
22758 Emacsen.
22759
22760
22761 @node Gnus Development
22762 @subsection Gnus Development
22763
22764 Gnus is developed in a two-phased cycle.  The first phase involves much
22765 discussion on the @samp{ding@@gnus.org} mailing list, where people
22766 propose changes and new features, post patches and new back ends.  This
22767 phase is called the @dfn{alpha} phase, since the Gnusae released in this
22768 phase are @dfn{alpha releases}, or (perhaps more commonly in other
22769 circles) @dfn{snapshots}.  During this phase, Gnus is assumed to be
22770 unstable and should not be used by casual users.  Gnus alpha releases
22771 have names like ``Red Gnus'' and ``Quassia Gnus''.
22772
22773 After futzing around for 50-100 alpha releases, Gnus is declared
22774 @dfn{frozen}, and only bug fixes are applied.  Gnus loses the prefix,
22775 and is called things like ``Gnus 5.6.32'' instead.  Normal people are
22776 supposed to be able to use these, and these are mostly discussed on the
22777 @samp{gnu.emacs.gnus} newsgroup.
22778
22779 @cindex Incoming*
22780 @vindex mail-source-delete-incoming
22781 Some variable defaults differ between alpha Gnusae and released Gnusae.
22782 In particular, @code{mail-source-delete-incoming} defaults to @code{nil} in
22783 alpha Gnusae and @code{t} in released Gnusae.  This is to prevent
22784 lossage of mail if an alpha release hiccups while handling the mail.
22785
22786 The division of discussion between the ding mailing list and the Gnus
22787 newsgroup is not purely based on publicity concerns.  It's true that
22788 having people write about the horrible things that an alpha Gnus release
22789 can do (sometimes) in a public forum may scare people off, but more
22790 importantly, talking about new experimental features that have been
22791 introduced may confuse casual users.  New features are frequently
22792 introduced, fiddled with, and judged to be found wanting, and then
22793 either discarded or totally rewritten.  People reading the mailing list
22794 usually keep up with these rapid changes, while people on the newsgroup
22795 can't be assumed to do so.
22796
22797
22798
22799 @node Contributors
22800 @subsection Contributors
22801 @cindex contributors
22802
22803 The new Gnus version couldn't have been done without the help of all the
22804 people on the (ding) mailing list.  Every day for over a year I have
22805 gotten billions of nice bug reports from them, filling me with joy,
22806 every single one of them.  Smooches.  The people on the list have been
22807 tried beyond endurance, what with my ``oh, that's a neat idea <type
22808 type>, yup, I'll release it right away <ship off> no wait, that doesn't
22809 work at all <type type>, yup, I'll ship that one off right away <ship
22810 off> no, wait, that absolutely does not work'' policy for releases.
22811 Micro$oft---bah.  Amateurs.  I'm @emph{much} worse.  (Or is that
22812 ``worser''? ``much worser''?  ``worsest''?)
22813
22814 I would like to take this opportunity to thank the Academy for...  oops,
22815 wrong show.
22816
22817 @itemize @bullet
22818
22819 @item
22820 Masanobu @sc{Umeda}---the writer of the original @sc{gnus}.
22821
22822 @item
22823 Shenghuo Zhu---uudecode.el, mm-uu.el, rfc1843.el, webmail.el,
22824 nnwarchive and many, many other things connected with @sc{mime} and
22825 other types of en/decoding, as well as general bug fixing, new
22826 functionality and stuff.
22827
22828 @item
22829 Per Abrahamsen---custom, scoring, highlighting and @sc{soup} code (as
22830 well as numerous other things).
22831
22832 @item
22833 Luis Fernandes---design and graphics.
22834
22835 @item
22836 Joe Reiss---creator of the smiley faces.
22837
22838 @item
22839 Justin Sheehy--the FAQ maintainer.
22840
22841 @item
22842 Erik Naggum---help, ideas, support, code and stuff.
22843
22844 @item
22845 Wes Hardaker---@file{gnus-picon.el} and the manual section on
22846 @dfn{picons} (@pxref{Picons}).
22847
22848 @item
22849 Kim-Minh Kaplan---further work on the picon code.
22850
22851 @item
22852 Brad Miller---@file{gnus-gl.el} and the GroupLens manual section
22853 (@pxref{GroupLens}).
22854
22855 @item
22856 Sudish Joseph---innumerable bug fixes.
22857
22858 @item
22859 Ilja Weis---@file{gnus-topic.el}.
22860
22861 @item
22862 Steven L. Baur---lots and lots and lots of bugs detections and fixes.
22863
22864 @item
22865 Vladimir Alexiev---the refcard and reference booklets.
22866
22867 @item
22868 Felix Lee & Jamie Zawinski---I stole some pieces from the XGnus
22869 distribution by Felix Lee and JWZ.
22870
22871 @item
22872 Scott Byer---@file{nnfolder.el} enhancements & rewrite.
22873
22874 @item
22875 Peter Mutsaers---orphan article scoring code.
22876
22877 @item
22878 Ken Raeburn---POP mail support.
22879
22880 @item
22881 Hallvard B Furuseth---various bits and pieces, especially dealing with
22882 .newsrc files.
22883
22884 @item
22885 Brian Edmonds---@file{gnus-bbdb.el}.
22886
22887 @item
22888 David Moore---rewrite of @file{nnvirtual.el} and many other things.
22889
22890 @item
22891 Kevin Davidson---came up with the name @dfn{ding}, so blame him.
22892
22893 @item
22894 François Pinard---many, many interesting and thorough bug reports, as
22895 well as autoconf support.
22896
22897 @end itemize
22898
22899 This manual was proof-read by Adrian Aichner, with Ricardo Nassif, Mark
22900 Borges, and Jost Krieger proof-reading parts of the manual.
22901
22902 The following people have contributed many patches and suggestions:
22903
22904 Christopher Davis,
22905 Andrew Eskilsson,
22906 Kai Grossjohann,
22907 David KÃ¥gedal,
22908 Richard Pieri,
22909 Fabrice Popineau,
22910 Daniel Quinlan,
22911 Jason L. Tibbitts, III,
22912 and
22913 Jack Vinson.
22914
22915 Also thanks to the following for patches and stuff:
22916
22917 Jari Aalto,
22918 Adrian Aichner,
22919 Vladimir Alexiev,
22920 Russ Allbery,
22921 Peter Arius,
22922 Matt Armstrong,
22923 Marc Auslander,
22924 Miles Bader,
22925 Alexei V. Barantsev,
22926 Frank Bennett,
22927 Robert Bihlmeyer,
22928 Chris Bone,
22929 Mark Borges,
22930 Mark Boyns,
22931 Lance A. Brown,
22932 Rob Browning,
22933 Kees de Bruin,
22934 Martin Buchholz,
22935 Joe Buehler,
22936 Kevin Buhr,
22937 Alastair Burt,
22938 Joao Cachopo,
22939 Zlatko Calusic,
22940 Massimo Campostrini,
22941 Castor,
22942 David Charlap,
22943 Dan Christensen,
22944 Kevin Christian,
22945 Jae-you Chung, @c ?
22946 James H. Cloos, Jr.,
22947 Laura Conrad,
22948 Michael R. Cook,
22949 Glenn Coombs,
22950 Andrew J. Cosgriff,
22951 Neil Crellin,
22952 Frank D. Cringle,
22953 Geoffrey T. Dairiki,
22954 Andre Deparade,
22955 Ulrik Dickow,
22956 Dave Disser,
22957 Rui-Tao Dong, @c ?
22958 Joev Dubach,
22959 Michael Welsh Duggan,
22960 Dave Edmondson,
22961 Paul Eggert,
22962 Mark W. Eichin,
22963 Karl Eichwalder,
22964 Enami Tsugutomo, @c Enami
22965 Michael Ernst,
22966 Luc Van Eycken,
22967 Sam Falkner,
22968 Nelson Jose dos Santos Ferreira,
22969 Sigbjorn Finne,
22970 Sven Fischer,
22971 Paul Fisher,
22972 Decklin Foster,
22973 Gary D. Foster,
22974 Paul Franklin,
22975 Guy Geens,
22976 Arne Georg Gleditsch,
22977 David S. Goldberg,
22978 Michelangelo Grigni,
22979 Dale Hagglund,
22980 D. Hall,
22981 Magnus Hammerin,
22982 Kenichi Handa, @c Handa
22983 Raja R. Harinath,
22984 Yoshiki Hayashi, @c ?
22985 P. E. Jareth Hein,
22986 Hisashige Kenji, @c Hisashige
22987 Scott Hofmann,
22988 Marc Horowitz,
22989 Gunnar Horrigmo,
22990 Richard Hoskins,
22991 Brad Howes,
22992 Miguel de Icaza,
22993 François Felix Ingrand,
22994 Tatsuya Ichikawa, @c ?
22995 Ishikawa Ichiro, @c Ishikawa
22996 Lee Iverson,
22997 Iwamuro Motonori, @c Iwamuro
22998 Rajappa Iyer,
22999 Andreas Jaeger,
23000 Adam P. Jenkins,
23001 Randell Jesup,
23002 Fred Johansen,
23003 Gareth Jones,
23004 Simon Josefsson,
23005 Greg Klanderman,
23006 Karl Kleinpaste,
23007 Michael Klingbeil,
23008 Peter Skov Knudsen,
23009 Shuhei Kobayashi, @c Kobayashi
23010 Petr Konecny,
23011 Koseki Yoshinori, @c Koseki
23012 Thor Kristoffersen,
23013 Jens Lautenbacher,
23014 Martin Larose,
23015 Seokchan Lee, @c Lee
23016 Joerg Lenneis,
23017 Carsten Leonhardt,
23018 James LewisMoss,
23019 Christian Limpach,
23020 Markus Linnala,
23021 Dave Love,
23022 Mike McEwan,
23023 Tonny Madsen,
23024 Shlomo Mahlab,
23025 Nat Makarevitch,
23026 Istvan Marko,
23027 David Martin,
23028 Jason R. Mastaler,
23029 Gordon Matzigkeit,
23030 Timo Metzemakers,
23031 Richard Mlynarik,
23032 Lantz Moore,
23033 Morioka Tomohiko, @c Morioka
23034 Erik Toubro Nielsen,
23035 Hrvoje Niksic,
23036 Andy Norman,
23037 Fred Oberhauser,
23038 C. R. Oldham,
23039 Alexandre Oliva,
23040 Ken Olstad,
23041 Masaharu Onishi, @c Onishi
23042 Hideki Ono, @c Ono
23043 Ettore Perazzoli,
23044 William Perry,
23045 Stephen Peters,
23046 Jens-Ulrik Holger Petersen,
23047 Ulrich Pfeifer,
23048 Matt Pharr,
23049 Andy Piper,
23050 John McClary Prevost,
23051 Bill Pringlemeir,
23052 Mike Pullen,
23053 Jim Radford,
23054 Colin Rafferty,
23055 Lasse Rasinen,
23056 Lars Balker Rasmussen,
23057 Joe Reiss,
23058 Renaud Rioboo,
23059 Roland B. Roberts,
23060 Bart Robinson,
23061 Christian von Roques,
23062 Markus Rost,
23063 Jason Rumney,
23064 Wolfgang Rupprecht,
23065 Jay Sachs,
23066 Dewey M. Sasser,
23067 Conrad Sauerwald,
23068 Loren Schall,
23069 Dan Schmidt,
23070 Ralph Schleicher,
23071 Philippe Schnoebelen,
23072 Andreas Schwab,
23073 Randal L. Schwartz,
23074 Danny Siu,
23075 Matt Simmons,
23076 Paul D. Smith,
23077 Jeff Sparkes,
23078 Toby Speight,
23079 Michael Sperber,
23080 Darren Stalder,
23081 Richard Stallman,
23082 Greg Stark,
23083 Sam Steingold,
23084 Paul Stevenson,
23085 Jonas Steverud,
23086 Paul Stodghill,
23087 Kiyokazu Suto, @c Suto
23088 Kurt Swanson,
23089 Samuel Tardieu,
23090 Teddy,
23091 Chuck Thompson,
23092 Tozawa Akihiko, @c Tozawa
23093 Philippe Troin,
23094 James Troup,
23095 Trung Tran-Duc,
23096 Jack Twilley,
23097 Aaron M. Ucko,
23098 Aki Vehtari,
23099 Didier Verna,
23100 Vladimir Volovich,
23101 Jan Vroonhof,
23102 Stefan Waldherr,
23103 Pete Ware,
23104 Barry A. Warsaw,
23105 Christoph Wedler,
23106 Joe Wells,
23107 Lee Willis,
23108 Katsumi Yamaoka @c Yamaoka
23109 and
23110 Lloyd Zusman.
23111
23112
23113 For a full overview of what each person has done, the ChangeLogs
23114 included in the Gnus alpha distributions should give ample reading
23115 (550kB and counting).
23116
23117 Apologies to everybody that I've forgotten, of which there are many, I'm
23118 sure.
23119
23120 Gee, that's quite a list of people.  I guess that must mean that there
23121 actually are people who are using Gnus.  Who'd'a thunk it!
23122
23123
23124 @node New Features
23125 @subsection New Features
23126 @cindex new features
23127
23128 @menu
23129 * ding Gnus::                   New things in Gnus 5.0/5.1, the first new Gnus.
23130 * September Gnus::              The Thing Formally Known As Gnus 5.2/5.3.
23131 * Red Gnus::                    Third time best---Gnus 5.4/5.5.
23132 * Quassia Gnus::                Two times two is four, or Gnus 5.6/5.7.
23133 * Pterodactyl Gnus::            Pentad also starts with P, AKA Gnus 5.8/5.9.
23134 @end menu
23135
23136 These lists are, of course, just @emph{short} overviews of the
23137 @emph{most} important new features.  No, really.  There are tons more.
23138 Yes, we have feeping creaturism in full effect.
23139
23140 @node ding Gnus
23141 @subsubsection (ding) Gnus
23142
23143 New features in Gnus 5.0/5.1:
23144
23145 @itemize @bullet
23146
23147 @item
23148 The look of all buffers can be changed by setting format-like variables
23149 (@pxref{Group Buffer Format} and @pxref{Summary Buffer Format}).
23150
23151 @item
23152 Local spool and several @sc{nntp} servers can be used at once
23153 (@pxref{Select Methods}).
23154
23155 @item
23156 You can combine groups into virtual groups (@pxref{Virtual Groups}).
23157
23158 @item
23159 You can read a number of different mail formats (@pxref{Getting Mail}).
23160 All the mail back ends implement a convenient mail expiry scheme
23161 (@pxref{Expiring Mail}).
23162
23163 @item
23164 Gnus can use various strategies for gathering threads that have lost
23165 their roots (thereby gathering loose sub-threads into one thread) or it
23166 can go back and retrieve enough headers to build a complete thread
23167 (@pxref{Customizing Threading}).
23168
23169 @item
23170 Killed groups can be displayed in the group buffer, and you can read
23171 them as well (@pxref{Listing Groups}).
23172
23173 @item
23174 Gnus can do partial group updates---you do not have to retrieve the
23175 entire active file just to check for new articles in a few groups
23176 (@pxref{The Active File}).
23177
23178 @item
23179 Gnus implements a sliding scale of subscribedness to groups
23180 (@pxref{Group Levels}).
23181
23182 @item
23183 You can score articles according to any number of criteria
23184 (@pxref{Scoring}).  You can even get Gnus to find out how to score
23185 articles for you (@pxref{Adaptive Scoring}).
23186
23187 @item
23188 Gnus maintains a dribble buffer that is auto-saved the normal Emacs
23189 manner, so it should be difficult to lose much data on what you have
23190 read if your machine should go down (@pxref{Auto Save}).
23191
23192 @item
23193 Gnus now has its own startup file (@file{.gnus.el}) to avoid cluttering up
23194 the @file{.emacs} file.
23195
23196 @item
23197 You can set the process mark on both groups and articles and perform
23198 operations on all the marked items (@pxref{Process/Prefix}).
23199
23200 @item
23201 You can grep through a subset of groups and create a group from the
23202 results (@pxref{Kibozed Groups}).
23203
23204 @item
23205 You can list subsets of groups according to, well, anything
23206 (@pxref{Listing Groups}).
23207
23208 @item
23209 You can browse foreign servers and subscribe to groups from those
23210 servers (@pxref{Browse Foreign Server}).
23211
23212 @item
23213 Gnus can fetch articles, asynchronously, on a second connection to the
23214 server (@pxref{Asynchronous Fetching}).
23215
23216 @item
23217 You can cache articles locally (@pxref{Article Caching}).
23218
23219 @item
23220 The uudecode functions have been expanded and generalized
23221 (@pxref{Decoding Articles}).
23222
23223 @item
23224 You can still post uuencoded articles, which was a little-known feature
23225 of @sc{gnus}' past (@pxref{Uuencoding and Posting}).
23226
23227 @item
23228 Fetching parents (and other articles) now actually works without
23229 glitches (@pxref{Finding the Parent}).
23230
23231 @item
23232 Gnus can fetch FAQs and group descriptions (@pxref{Group Information}).
23233
23234 @item
23235 Digests (and other files) can be used as the basis for groups
23236 (@pxref{Document Groups}).
23237
23238 @item
23239 Articles can be highlighted and customized (@pxref{Customizing
23240 Articles}).
23241
23242 @item
23243 URLs and other external references can be buttonized (@pxref{Article
23244 Buttons}).
23245
23246 @item
23247 You can do lots of strange stuff with the Gnus window & frame
23248 configuration (@pxref{Window Layout}).
23249
23250 @item
23251 You can click on buttons instead of using the keyboard
23252 (@pxref{Buttons}).
23253
23254 @end itemize
23255
23256
23257 @node September Gnus
23258 @subsubsection September Gnus
23259
23260 @iftex
23261 @iflatex
23262 \gnusfig{-28cm}{0cm}{\epsfig{figure=ps/september,height=20cm}}
23263 @end iflatex
23264 @end iftex
23265
23266 New features in Gnus 5.2/5.3:
23267
23268 @itemize @bullet
23269
23270 @item
23271 A new message composition mode is used.  All old customization variables
23272 for @code{mail-mode}, @code{rnews-reply-mode} and @code{gnus-msg} are
23273 now obsolete.
23274
23275 @item
23276 Gnus is now able to generate @dfn{sparse} threads---threads where
23277 missing articles are represented by empty nodes (@pxref{Customizing
23278 Threading}).
23279
23280 @lisp
23281 (setq gnus-build-sparse-threads 'some)
23282 @end lisp
23283
23284 @item
23285 Outgoing articles are stored on a special archive server
23286 (@pxref{Archived Messages}).
23287
23288 @item
23289 Partial thread regeneration now happens when articles are
23290 referred.
23291
23292 @item
23293 Gnus can make use of GroupLens predictions (@pxref{GroupLens}).
23294
23295 @item
23296 Picons (personal icons) can be displayed under XEmacs (@pxref{Picons}).
23297
23298 @item
23299 A @code{trn}-like tree buffer can be displayed (@pxref{Tree Display}).
23300
23301 @lisp
23302 (setq gnus-use-trees t)
23303 @end lisp
23304
23305 @item
23306 An @code{nn}-like pick-and-read minor mode is available for the summary
23307 buffers (@pxref{Pick and Read}).
23308
23309 @lisp
23310 (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
23311 @end lisp
23312
23313 @item
23314 In binary groups you can use a special binary minor mode (@pxref{Binary
23315 Groups}).
23316
23317 @item
23318 Groups can be grouped in a folding topic hierarchy (@pxref{Group
23319 Topics}).
23320
23321 @lisp
23322 (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
23323 @end lisp
23324
23325 @item
23326 Gnus can re-send and bounce mail (@pxref{Summary Mail Commands}).
23327
23328 @item
23329 Groups can now have a score, and bubbling based on entry frequency
23330 is possible (@pxref{Group Score}).
23331
23332 @lisp
23333 (add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group)
23334 @end lisp
23335
23336 @item
23337 Groups can be process-marked, and commands can be performed on
23338 groups of groups (@pxref{Marking Groups}).
23339
23340 @item
23341 Caching is possible in virtual groups.
23342
23343 @item
23344 @code{nndoc} now understands all kinds of digests, mail boxes, rnews
23345 news batches, ClariNet briefs collections, and just about everything
23346 else (@pxref{Document Groups}).
23347
23348 @item
23349 Gnus has a new back end (@code{nnsoup}) to create/read SOUP packets
23350 (@pxref{SOUP}).
23351
23352 @item
23353 The Gnus cache is much faster.
23354
23355 @item
23356 Groups can be sorted according to many criteria (@pxref{Sorting
23357 Groups}).
23358
23359 @item
23360 New group parameters have been introduced to set list-addresses and
23361 expiry times (@pxref{Group Parameters}).
23362
23363 @item
23364 All formatting specs allow specifying faces to be used
23365 (@pxref{Formatting Fonts}).
23366
23367 @item
23368 There are several more commands for setting/removing/acting on process
23369 marked articles on the @kbd{M P} submap (@pxref{Setting Process Marks}).
23370
23371 @item
23372 The summary buffer can be limited to show parts of the available
23373 articles based on a wide range of criteria.  These commands have been
23374 bound to keys on the @kbd{/} submap (@pxref{Limiting}).
23375
23376 @item
23377 Articles can be made persistent with the @kbd{*} command
23378 (@pxref{Persistent Articles}).
23379
23380 @item
23381 All functions for hiding article elements are now toggles.
23382
23383 @item
23384 Article headers can be buttonized (@pxref{Article Washing}).
23385
23386 @item
23387 All mail back ends support fetching articles by @code{Message-ID}.
23388
23389 @item
23390 Duplicate mail can now be treated properly (@pxref{Duplicates}).
23391
23392 @item
23393 All summary mode commands are available directly from the article
23394 buffer (@pxref{Article Keymap}).
23395
23396 @item
23397 Frames can be part of @code{gnus-buffer-configuration} (@pxref{Window
23398 Layout}).
23399
23400 @item
23401 Mail can be re-scanned by a daemonic process (@pxref{Daemons}).
23402 @iftex
23403 @iflatex
23404 \marginpar[\mbox{}\hfill\epsfig{figure=ps/fseptember,height=5cm}]{\epsfig{figure=ps/fseptember,height=5cm}}
23405 @end iflatex
23406 @end iftex
23407
23408 @item
23409 Gnus can make use of NoCeM files to weed out spam (@pxref{NoCeM}).
23410
23411 @lisp
23412 (setq gnus-use-nocem t)
23413 @end lisp
23414
23415 @item
23416 Groups can be made permanently visible (@pxref{Listing Groups}).
23417
23418 @lisp
23419 (setq gnus-permanently-visible-groups "^nnml:")
23420 @end lisp
23421
23422 @item
23423 Many new hooks have been introduced to make customizing easier.
23424
23425 @item
23426 Gnus respects the @code{Mail-Copies-To} header.
23427
23428 @item
23429 Threads can be gathered by looking at the @code{References} header
23430 (@pxref{Customizing Threading}).
23431
23432 @lisp
23433 (setq gnus-summary-thread-gathering-function
23434       'gnus-gather-threads-by-references)
23435 @end lisp
23436
23437 @item
23438 Read articles can be stored in a special backlog buffer to avoid
23439 refetching (@pxref{Article Backlog}).
23440
23441 @lisp
23442 (setq gnus-keep-backlog 50)
23443 @end lisp
23444
23445 @item
23446 A clean copy of the current article is always stored in a separate
23447 buffer to allow easier treatment.
23448
23449 @item
23450 Gnus can suggest where to save articles (@pxref{Saving Articles}).
23451
23452 @item
23453 Gnus doesn't have to do as much prompting when saving (@pxref{Saving
23454 Articles}).
23455
23456 @lisp
23457 (setq gnus-prompt-before-saving t)
23458 @end lisp
23459
23460 @item
23461 @code{gnus-uu} can view decoded files asynchronously while fetching
23462 articles (@pxref{Other Decode Variables}).
23463
23464 @lisp
23465 (setq gnus-uu-grabbed-file-functions 'gnus-uu-grab-view)
23466 @end lisp
23467
23468 @item
23469 Filling in the article buffer now works properly on cited text
23470 (@pxref{Article Washing}).
23471
23472 @item
23473 Hiding cited text adds buttons to toggle hiding, and how much
23474 cited text to hide is now customizable (@pxref{Article Hiding}).
23475
23476 @lisp
23477 (setq gnus-cited-lines-visible 2)
23478 @end lisp
23479
23480 @item
23481 Boring headers can be hidden (@pxref{Article Hiding}).
23482
23483 @item
23484 Default scoring values can now be set from the menu bar.
23485
23486 @item
23487 Further syntax checking of outgoing articles have been added.
23488
23489 @end itemize
23490
23491
23492 @node Red Gnus
23493 @subsubsection Red Gnus
23494
23495 New features in Gnus 5.4/5.5:
23496
23497 @iftex
23498 @iflatex
23499 \gnusfig{-5.5cm}{-4cm}{\epsfig{figure=ps/red,height=20cm}}
23500 @end iflatex
23501 @end iftex
23502
23503 @itemize @bullet
23504
23505 @item
23506 @file{nntp.el} has been totally rewritten in an asynchronous fashion.
23507
23508 @item
23509 Article prefetching functionality has been moved up into
23510 Gnus (@pxref{Asynchronous Fetching}).
23511
23512 @item
23513 Scoring can now be performed with logical operators like @code{and},
23514 @code{or}, @code{not}, and parent redirection (@pxref{Advanced
23515 Scoring}).
23516
23517 @item
23518 Article washing status can be displayed in the
23519 article mode line (@pxref{Misc Article}).
23520
23521 @item
23522 @file{gnus.el} has been split into many smaller files.
23523
23524 @item
23525 Suppression of duplicate articles based on Message-ID can be done
23526 (@pxref{Duplicate Suppression}).
23527
23528 @lisp
23529 (setq gnus-suppress-duplicates t)
23530 @end lisp
23531
23532 @item
23533 New variables for specifying what score and adapt files are to be
23534 considered home score and adapt files (@pxref{Home Score File}) have
23535 been added.
23536
23537 @item
23538 @code{nndoc} was rewritten to be easily extendable (@pxref{Document
23539 Server Internals}).
23540
23541 @item
23542 Groups can inherit group parameters from parent topics (@pxref{Topic
23543 Parameters}).
23544
23545 @item
23546 Article editing has been revamped and is now actually usable.
23547
23548 @item
23549 Signatures can be recognized in more intelligent fashions
23550 (@pxref{Article Signature}).
23551
23552 @item
23553 Summary pick mode has been made to look more @code{nn}-like.  Line
23554 numbers are displayed and the @kbd{.} command can be used to pick
23555 articles (@code{Pick and Read}).
23556
23557 @item
23558 Commands for moving the @file{.newsrc.eld} from one server to
23559 another have been added (@pxref{Changing Servers}).
23560
23561 @item
23562 There's a way now to specify that ``uninteresting'' fields be suppressed
23563 when generating lines in buffers (@pxref{Advanced Formatting}).
23564
23565 @item
23566 Several commands in the group buffer can be undone with @kbd{C-M-_}
23567 (@pxref{Undo}).
23568
23569 @item
23570 Scoring can be done on words using the new score type @code{w}
23571 (@pxref{Score File Format}).
23572
23573 @item
23574 Adaptive scoring can be done on a Subject word-by-word basis
23575 (@pxref{Adaptive Scoring}).
23576
23577 @lisp
23578 (setq gnus-use-adaptive-scoring '(word))
23579 @end lisp
23580
23581 @item
23582 Scores can be decayed (@pxref{Score Decays}).
23583
23584 @lisp
23585 (setq gnus-decay-scores t)
23586 @end lisp
23587
23588 @item
23589 Scoring can be performed using a regexp on the Date header.  The Date is
23590 normalized to compact ISO 8601 format first (@pxref{Score File Format}).
23591
23592 @item
23593 A new command has been added to remove all data on articles from
23594 the native server (@pxref{Changing Servers}).
23595
23596 @item
23597 A new command for reading collections of documents
23598 (@code{nndoc} with @code{nnvirtual} on top) has been added---@kbd{C-M-d}
23599 (@pxref{Really Various Summary Commands}).
23600
23601 @item
23602 Process mark sets can be pushed and popped (@pxref{Setting Process
23603 Marks}).
23604
23605 @item
23606 A new mail-to-news back end makes it possible to post even when the @sc{nntp}
23607 server doesn't allow posting (@pxref{Mail-To-News Gateways}).
23608
23609 @item
23610 A new back end for reading searches from Web search engines
23611 (@dfn{DejaNews}, @dfn{Alta Vista}, @dfn{InReference}) has been added
23612 (@pxref{Web Searches}).
23613
23614 @item
23615 Groups inside topics can now be sorted using the standard sorting
23616 functions, and each topic can be sorted independently (@pxref{Topic
23617 Sorting}).
23618
23619 @item
23620 Subsets of the groups can be sorted independently (@code{Sorting
23621 Groups}).
23622
23623 @item
23624 Cached articles can be pulled into the groups (@pxref{Summary Generation
23625 Commands}).
23626 @iftex
23627 @iflatex
23628 \marginpar[\mbox{}\hfill\epsfig{figure=ps/fred,width=3cm}]{\epsfig{figure=ps/fred,width=3cm}}
23629 @end iflatex
23630 @end iftex
23631
23632 @item
23633 Score files are now applied in a more reliable order (@pxref{Score
23634 Variables}).
23635
23636 @item
23637 Reports on where mail messages end up can be generated (@pxref{Splitting
23638 Mail}).
23639
23640 @item
23641 More hooks and functions have been added to remove junk from incoming
23642 mail before saving the mail (@pxref{Washing Mail}).
23643
23644 @item
23645 Emphasized text can be properly fontisized:
23646
23647 @end itemize
23648
23649
23650 @node Quassia Gnus
23651 @subsubsection Quassia Gnus
23652
23653 New features in Gnus 5.6:
23654
23655 @itemize @bullet
23656
23657 @item
23658 New functionality for using Gnus as an offline newsreader has been
23659 added.  A plethora of new commands and modes have been added.  See
23660 @pxref{Gnus Unplugged} for the full story.
23661
23662 @item
23663  The @code{nndraft} back end has returned, but works differently than
23664 before.  All Message buffers are now also articles in the @code{nndraft}
23665 group, which is created automatically.
23666
23667 @item
23668 @code{gnus-alter-header-function} can now be used to alter header
23669 values.
23670
23671 @item
23672  @code{gnus-summary-goto-article} now accept Message-ID's.
23673
23674 @item
23675  A new Message command for deleting text in the body of a message
23676 outside the region: @kbd{C-c C-v}.
23677
23678 @item
23679  You can now post to component group in @code{nnvirtual} groups with
23680 @kbd{C-u C-c C-c}.
23681
23682 @item
23683  @code{nntp-rlogin-program}---new variable to ease customization.
23684
23685 @item
23686  @code{C-u C-c C-c} in @code{gnus-article-edit-mode} will now inhibit
23687 re-highlighting of the article buffer.
23688
23689 @item
23690  New element in @code{gnus-boring-article-headers}---@code{long-to}.
23691
23692 @item
23693  @kbd{M-i} symbolic prefix command.  See the section "Symbolic
23694 Prefixes" in the Gnus manual for details.
23695
23696 @item
23697  @kbd{L} and @kbd{I} in the summary buffer now take the symbolic prefix
23698 @kbd{a} to add the score rule to the "all.SCORE" file.
23699
23700 @item
23701  @code{gnus-simplify-subject-functions} variable to allow greater
23702 control over simplification.
23703
23704 @item
23705  @kbd{A T}---new command for fetching the current thread.
23706
23707 @item
23708  @kbd{/ T}---new command for including the current thread in the
23709 limit.
23710
23711 @item
23712  @kbd{M-RET} is a new Message command for breaking cited text.
23713
23714 @item
23715  @samp{\\1}-expressions are now valid in @code{nnmail-split-methods}.
23716
23717 @item
23718  The @code{custom-face-lookup} function has been removed.
23719 If you used this function in your initialization files, you must
23720 rewrite them to use @code{face-spec-set} instead.
23721
23722 @item
23723  Canceling now uses the current select method.  Symbolic prefix
23724 @kbd{a} forces normal posting method.
23725
23726 @item
23727  New command to translate M******** sm*rtq**t*s into proper
23728 text---@kbd{W d}.
23729
23730 @item
23731  For easier debugging of @code{nntp}, you can set
23732 @code{nntp-record-commands} to a non-@code{nil} value.
23733
23734 @item
23735  @code{nntp} now uses @file{~/.authinfo}, a @file{.netrc}-like file, for
23736 controlling where and how to send @sc{authinfo} to @sc{nntp} servers.
23737
23738 @item
23739  A command for editing group parameters from the summary buffer
23740 has been added.
23741
23742 @item
23743  A history of where mails have been split is available.
23744
23745 @item
23746  A new article date command has been added---@code{article-date-iso8601}.
23747
23748 @item
23749  Subjects can be simplified when threading by setting
23750 @code{gnus-score-thread-simplify}.
23751
23752 @item
23753  A new function for citing in Message has been
23754 added---@code{message-cite-original-without-signature}.
23755
23756 @item
23757  @code{article-strip-all-blank-lines}---new article command.
23758
23759 @item
23760  A new Message command to kill to the end of the article has
23761 been added.
23762
23763 @item
23764  A minimum adaptive score can be specified by using the
23765 @code{gnus-adaptive-word-minimum} variable.
23766
23767 @item
23768  The "lapsed date" article header can be kept continually
23769 updated by the @code{gnus-start-date-timer} command.
23770
23771 @item
23772  Web listserv archives can be read with the @code{nnlistserv} back end.
23773
23774 @item
23775  Old dejanews archives can now be read by @code{nnweb}.
23776
23777 @end itemize
23778
23779 @node Pterodactyl Gnus
23780 @subsubsection Pterodactyl Gnus
23781
23782 New features in Gnus 5.8:
23783
23784 @itemize @bullet
23785
23786 @item
23787 The mail-fetching functions have changed.  See the manual for the
23788 many details.  In particular, all procmail fetching variables are gone.
23789
23790 If you used procmail like in
23791
23792 @lisp
23793 (setq nnmail-use-procmail t)
23794 (setq nnmail-spool-file 'procmail)
23795 (setq nnmail-procmail-directory "~/mail/incoming/")
23796 (setq nnmail-procmail-suffix "\\.in")
23797 @end lisp
23798
23799 this now has changed to
23800
23801 @lisp
23802 (setq mail-sources
23803       '((directory :path "~/mail/incoming/"
23804                    :suffix ".in")))
23805 @end lisp
23806
23807 More information is available in the info doc at Select Methods ->
23808 Getting Mail -> Mail Sources
23809
23810 @item
23811 Gnus is now a @sc{mime}-capable reader.  This affects many parts of
23812 Gnus, and adds a slew of new commands.  See the manual for details.
23813
23814 @item
23815 Gnus has also been multilingualized.  This also affects too
23816 many parts of Gnus to summarize here, and adds many new variables.
23817
23818 @item
23819 @code{gnus-auto-select-first} can now be a function to be
23820 called to position point.
23821
23822 @item
23823 The user can now decide which extra headers should be included in
23824 summary buffers and @sc{nov} files.
23825
23826 @item
23827 @code{gnus-article-display-hook} has been removed.  Instead, a number
23828 of variables starting with @code{gnus-treat-} have been added.
23829
23830 @item
23831 The Gnus posting styles have been redone again and now works in a
23832 subtly different manner.
23833
23834 @item
23835 New web-based back ends have been added: @code{nnslashdot},
23836 @code{nnwarchive} and @code{nnultimate}.  nnweb has been revamped,
23837 again, to keep up with ever-changing layouts.
23838
23839 @item
23840 Gnus can now read @sc{imap} mail via @code{nnimap}.
23841
23842 @end itemize
23843
23844 @iftex
23845
23846 @page
23847 @node The Manual
23848 @section The Manual
23849 @cindex colophon
23850 @cindex manual
23851
23852 This manual was generated from a TeXinfo file and then run through
23853 either @code{texi2dvi}
23854 @iflatex
23855 or my own home-brewed TeXinfo to \LaTeX\ transformer,
23856 and then run through @code{latex} and @code{dvips}
23857 @end iflatex
23858 to get what you hold in your hands now.
23859
23860 The following conventions have been used:
23861
23862 @enumerate
23863
23864 @item
23865 This is a @samp{string}
23866
23867 @item
23868 This is a @kbd{keystroke}
23869
23870 @item
23871 This is a @file{file}
23872
23873 @item
23874 This is a @code{symbol}
23875
23876 @end enumerate
23877
23878 So if I were to say ``set @code{flargnoze} to @samp{yes}'', that would
23879 mean:
23880
23881 @lisp
23882 (setq flargnoze "yes")
23883 @end lisp
23884
23885 If I say ``set @code{flumphel} to @code{yes}'', that would mean:
23886
23887 @lisp
23888 (setq flumphel 'yes)
23889 @end lisp
23890
23891 @samp{yes} and @code{yes} are two @emph{very} different things---don't
23892 ever get them confused.
23893
23894 @iflatex
23895 @c @head
23896 Of course, everything in this manual is of vital interest, so you should
23897 read it all.  Several times.  However, if you feel like skimming the
23898 manual, look for that gnu head you should see in the margin over
23899 there---it means that what's being discussed is of more importance than
23900 the rest of the stuff.  (On the other hand, if everything is infinitely
23901 important, how can anything be more important than that?  Just one more
23902 of the mysteries of this world, I guess.)
23903 @end iflatex
23904
23905 @end iftex
23906
23907
23908 @node On Writing Manuals
23909 @section On Writing Manuals
23910
23911 I guess most manuals are written after-the-fact; documenting a program
23912 that's already there.  This is not how this manual is written.  When
23913 implementing something, I write the manual entry for that something
23914 straight away.  I then see that it's difficult to explain the
23915 functionality, so I write how it's supposed to be, and then I change the
23916 implementation.  Writing the documentation and writing the code goes
23917 hand in hand.
23918
23919 This, of course, means that this manual has no, or little, flow.  It
23920 documents absolutely everything in Gnus, but often not where you're
23921 looking for it.  It is a reference manual, and not a guide to how to get
23922 started with Gnus.
23923
23924 That would be a totally different book, that should be written using the
23925 reference manual as source material.  It would look quite differently.
23926
23927
23928 @page
23929 @node Terminology
23930 @section Terminology
23931
23932 @cindex terminology
23933 @table @dfn
23934
23935 @item news
23936 @cindex news
23937 This is what you are supposed to use this thing for---reading news.
23938 News is generally fetched from a nearby @sc{nntp} server, and is
23939 generally publicly available to everybody.  If you post news, the entire
23940 world is likely to read just what you have written, and they'll all
23941 snigger mischievously.  Behind your back.
23942
23943 @item mail
23944 @cindex mail
23945 Everything that's delivered to you personally is mail.  Some news/mail
23946 readers (like Gnus) blur the distinction between mail and news, but
23947 there is a difference.  Mail is private.  News is public.  Mailing is
23948 not posting, and replying is not following up.
23949
23950 @item reply
23951 @cindex reply
23952 Send a mail to the person who has written what you are reading.
23953
23954 @item follow up
23955 @cindex follow up
23956 Post an article to the current newsgroup responding to the article you
23957 are reading.
23958
23959 @item back end
23960 @cindex back end
23961 Gnus considers mail and news to be mostly the same, really.  The only
23962 difference is how to access the actual articles.  News articles are
23963 commonly fetched via the protocol NNTP, whereas mail messages could be
23964 read from a file on the local disk.  The internal architecture of Gnus
23965 thus comprises a `front end' and a number of `back ends'.  Internally,
23966 when you enter a group (by hitting @key{RET}, say), you thereby invoke
23967 a function in the front end in Gnus.  The front end then `talks' to a
23968 back end and says things like ``Give me the list of articles in the foo
23969 group'' or ``Show me article number 4711''.
23970
23971 So a back end mainly defines either a protocol (the @code{nntp} back end
23972 accesses news via NNTP, the @code{nnimap} back end accesses mail via
23973 IMAP) or a file format and directory layout (the @code{nnspool} back end
23974 accesses news via the common `spool directory' format, the @code{nnml}
23975 back end access mail via a file format and directory layout that's
23976 quite similar).
23977
23978 Gnus does not handle the underlying media, so to speak---this is all
23979 done by the back ends.  A back end is a collection of functions to
23980 access the articles.
23981
23982 However, sometimes the term `back end' is also used where `server'
23983 would have been more appropriate.  And then there is the term `select
23984 method' which can mean either.  The Gnus terminology can be quite
23985 confusing.
23986
23987 @item native
23988 @cindex native
23989 Gnus will always use one method (and back end) as the @dfn{native}, or
23990 default, way of getting news.
23991
23992 @item foreign
23993 @cindex foreign
23994 You can also have any number of foreign groups active at the same time.
23995 These are groups that use non-native non-secondary back ends for getting
23996 news.
23997
23998 @item secondary
23999 @cindex secondary
24000 Secondary back ends are somewhere half-way between being native and being
24001 foreign, but they mostly act like they are native.
24002
24003 @item article
24004 @cindex article
24005 A message that has been posted as news.
24006
24007 @item mail message
24008 @cindex mail message
24009 A message that has been mailed.
24010
24011 @item message
24012 @cindex message
24013 A mail message or news article
24014
24015 @item head
24016 @cindex head
24017 The top part of a message, where administrative information (etc.) is
24018 put.
24019
24020 @item body
24021 @cindex body
24022 The rest of an article.  Everything not in the head is in the
24023 body.
24024
24025 @item header
24026 @cindex header
24027 A line from the head of an article.
24028
24029 @item headers
24030 @cindex headers
24031 A collection of such lines, or a collection of heads.  Or even a
24032 collection of @sc{nov} lines.
24033
24034 @item @sc{nov}
24035 @cindex nov
24036 When Gnus enters a group, it asks the back end for the headers of all
24037 unread articles in the group.  Most servers support the News OverView
24038 format, which is more compact and much faster to read and parse than the
24039 normal @sc{head} format.
24040
24041 @item level
24042 @cindex levels
24043 Each group is subscribed at some @dfn{level} or other (1-9).  The ones
24044 that have a lower level are ``more'' subscribed than the groups with a
24045 higher level.  In fact, groups on levels 1-5 are considered
24046 @dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9
24047 are @dfn{killed}.  Commands for listing groups and scanning for new
24048 articles will all use the numeric prefix as @dfn{working level}.
24049
24050 @item killed groups
24051 @cindex killed groups
24052 No information on killed groups is stored or updated, which makes killed
24053 groups much easier to handle than subscribed groups.
24054
24055 @item zombie groups
24056 @cindex zombie groups
24057 Just like killed groups, only slightly less dead.
24058
24059 @item active file
24060 @cindex active file
24061 The news server has to keep track of what articles it carries, and what
24062 groups exist.  All this information in stored in the active file, which
24063 is rather large, as you might surmise.
24064
24065 @item bogus groups
24066 @cindex bogus groups
24067 A group that exists in the @file{.newsrc} file, but isn't known to the
24068 server (i.e.,  it isn't in the active file), is a @emph{bogus group}.
24069 This means that the group probably doesn't exist (any more).
24070
24071 @item activating
24072 @cindex activating groups
24073 The act of asking the server for info on a group and computing the
24074 number of unread articles is called @dfn{activating the group}.
24075 Un-activated groups are listed with @samp{*} in the group buffer.
24076
24077 @item server
24078 @cindex server
24079 A machine one can connect to and get news (or mail) from.
24080
24081 @item select method
24082 @cindex select method
24083 A structure that specifies the back end, the server and the virtual
24084 server settings.
24085
24086 @item virtual server
24087 @cindex virtual server
24088 A named select method.  Since a select method defines all there is to
24089 know about connecting to a (physical) server, taking the thing as a
24090 whole is a virtual server.
24091
24092 @item washing
24093 @cindex washing
24094 Taking a buffer and running it through a filter of some sort.  The
24095 result will (more often than not) be cleaner and more pleasing than the
24096 original.
24097
24098 @item ephemeral groups
24099 @cindex ephemeral groups
24100 Most groups store data on what articles you have read.  @dfn{Ephemeral}
24101 groups are groups that will have no data stored---when you exit the
24102 group, it'll disappear into the aether.
24103
24104 @item solid groups
24105 @cindex solid groups
24106 This is the opposite of ephemeral groups.  All groups listed in the
24107 group buffer are solid groups.
24108
24109 @item sparse articles
24110 @cindex sparse articles
24111 These are article placeholders shown in the summary buffer when
24112 @code{gnus-build-sparse-threads} has been switched on.
24113
24114 @item threading
24115 @cindex threading
24116 To put responses to articles directly after the articles they respond
24117 to---in a hierarchical fashion.
24118
24119 @item root
24120 @cindex root
24121 @cindex thread root
24122 The first article in a thread is the root.  It is the ancestor of all
24123 articles in the thread.
24124
24125 @item parent
24126 @cindex parent
24127 An article that has responses.
24128
24129 @item child
24130 @cindex child
24131 An article that responds to a different article---its parent.
24132
24133 @item digest
24134 @cindex digest
24135 A collection of messages in one file.  The most common digest format is
24136 specified by RFC 1153.
24137
24138 @end table
24139
24140
24141 @page
24142 @node Customization
24143 @section Customization
24144 @cindex general customization
24145
24146 All variables are properly documented elsewhere in this manual.  This
24147 section is designed to give general pointers on how to customize Gnus
24148 for some quite common situations.
24149
24150 @menu
24151 * Slow/Expensive Connection::   You run a local Emacs and get the news elsewhere.
24152 * Slow Terminal Connection::    You run a remote Emacs.
24153 * Little Disk Space::           You feel that having large setup files is icky.
24154 * Slow Machine::                You feel like buying a faster machine.
24155 @end menu
24156
24157
24158 @node Slow/Expensive Connection
24159 @subsection Slow/Expensive NNTP Connection
24160
24161 If you run Emacs on a machine locally, and get your news from a machine
24162 over some very thin strings, you want to cut down on the amount of data
24163 Gnus has to get from the @sc{nntp} server.
24164
24165 @table @code
24166
24167 @item gnus-read-active-file
24168 Set this to @code{nil}, which will inhibit Gnus from requesting the
24169 entire active file from the server.  This file is often v.  large.  You
24170 also have to set @code{gnus-check-new-newsgroups} and
24171 @code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus
24172 doesn't suddenly decide to fetch the active file anyway.
24173
24174 @item gnus-nov-is-evil
24175 This one has to be @code{nil}.  If not, grabbing article headers from
24176 the @sc{nntp} server will not be very fast.  Not all @sc{nntp} servers
24177 support @sc{xover}; Gnus will detect this by itself.
24178 @end table
24179
24180
24181 @node Slow Terminal Connection
24182 @subsection Slow Terminal Connection
24183
24184 Let's say you use your home computer for dialing up the system that runs
24185 Emacs and Gnus.  If your modem is slow, you want to reduce (as much as
24186 possible) the amount of data sent over the wires.
24187
24188 @table @code
24189
24190 @item gnus-auto-center-summary
24191 Set this to @code{nil} to inhibit Gnus from re-centering the summary
24192 buffer all the time.  If it is @code{vertical}, do only vertical
24193 re-centering.  If it is neither @code{nil} nor @code{vertical}, do both
24194 horizontal and vertical recentering.
24195
24196 @item gnus-visible-headers
24197 Cut down on the headers included in the articles to the
24198 minimum.  You can, in fact, make do without them altogether---most of the
24199 useful data is in the summary buffer, anyway.  Set this variable to
24200 @samp{^NEVVVVER} or @samp{From:}, or whatever you feel you need.
24201
24202 Set this hook to all the available hiding commands:
24203 @lisp
24204 (setq gnus-treat-hide-headers 'head
24205       gnus-treat-hide-signature t
24206       gnus-treat-hide-citation t)
24207 @end lisp
24208
24209 @item gnus-use-full-window
24210 By setting this to @code{nil}, you can make all the windows smaller.
24211 While this doesn't really cut down much generally, it means that you
24212 have to see smaller portions of articles before deciding that you didn't
24213 want to read them anyway.
24214
24215 @item gnus-thread-hide-subtree
24216 If this is non-@code{nil}, all threads in the summary buffer will be
24217 hidden initially.
24218
24219
24220 @item gnus-updated-mode-lines
24221 If this is @code{nil}, Gnus will not put information in the buffer mode
24222 lines, which might save some time.
24223 @end table
24224
24225
24226 @node Little Disk Space
24227 @subsection Little Disk Space
24228 @cindex disk space
24229
24230 The startup files can get rather large, so you may want to cut their
24231 sizes a bit if you are running out of space.
24232
24233 @table @code
24234
24235 @item gnus-save-newsrc-file
24236 If this is @code{nil}, Gnus will never save @file{.newsrc}---it will
24237 only save @file{.newsrc.eld}.  This means that you will not be able to
24238 use any other newsreaders than Gnus.  This variable is @code{t} by
24239 default.
24240
24241 @item gnus-read-newsrc-file
24242 If this is @code{nil}, Gnus will never read @file{.newsrc}---it will
24243 only read @file{.newsrc.eld}.  This means that you will not be able to
24244 use any other newsreaders than Gnus.  This variable is @code{t} by
24245 default.
24246
24247 @item gnus-save-killed-list
24248 If this is @code{nil}, Gnus will not save the list of dead groups.  You
24249 should also set @code{gnus-check-new-newsgroups} to @code{ask-server}
24250 and @code{gnus-check-bogus-newsgroups} to @code{nil} if you set this
24251 variable to @code{nil}.  This variable is @code{t} by default.
24252
24253 @end table
24254
24255
24256 @node Slow Machine
24257 @subsection Slow Machine
24258 @cindex slow machine
24259
24260 If you have a slow machine, or are just really impatient, there are a
24261 few things you can do to make Gnus run faster.
24262
24263 Set @code{gnus-check-new-newsgroups} and
24264 @code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster.
24265
24266 Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and
24267 @code{gnus-nov-is-evil} to @code{nil} to make entering and exiting the
24268 summary buffer faster.
24269
24270
24271 @page
24272 @node Troubleshooting
24273 @section Troubleshooting
24274 @cindex troubleshooting
24275
24276 Gnus works @emph{so} well straight out of the box---I can't imagine any
24277 problems, really.
24278
24279 Ahem.
24280
24281 @enumerate
24282
24283 @item
24284 Make sure your computer is switched on.
24285
24286 @item
24287 Make sure that you really load the current Gnus version.  If you have
24288 been running @sc{gnus}, you need to exit Emacs and start it up again before
24289 Gnus will work.
24290
24291 @item
24292 Try doing an @kbd{M-x gnus-version}.  If you get something that looks
24293 like @samp{T-gnus 6.15.* (based on Oort Gnus v0.*; for SEMI 1.1*, FLIM
24294 1.1*)} you have the right files loaded.  If, on the other hand, you get
24295 something like @samp{NNTP 3.x} or @samp{nntp flee}, you have some old
24296 @file{.el} files lying around.  Delete these.
24297
24298 @item
24299 Read the help group (@kbd{G h} in the group buffer) for a FAQ and a
24300 how-to.
24301
24302 @item
24303 @vindex max-lisp-eval-depth
24304 Gnus works on many recursive structures, and in some extreme (and very
24305 rare) cases Gnus may recurse down ``too deeply'' and Emacs will beep at
24306 you.  If this happens to you, set @code{max-lisp-eval-depth} to 500 or
24307 something like that.
24308 @end enumerate
24309
24310 If all else fails, report the problem as a bug.
24311
24312 @cindex bugs
24313 @cindex reporting bugs
24314
24315 @kindex M-x gnus-bug
24316 @findex gnus-bug
24317 If you find a bug in Gnus, you can report it with the @kbd{M-x gnus-bug}
24318 command.  @kbd{M-x set-variable RET debug-on-error RET t RET}, and send
24319 me the backtrace.  I will fix bugs, but I can only fix them if you send
24320 me a precise description as to how to reproduce the bug.
24321
24322 You really can never be too detailed in a bug report.  Always use the
24323 @kbd{M-x gnus-bug} command when you make bug reports, even if it creates
24324 a 10Kb mail each time you use it, and even if you have sent me your
24325 environment 500 times before.  I don't care.  I want the full info each
24326 time.
24327
24328 It is also important to remember that I have no memory whatsoever.  If
24329 you send a bug report, and I send you a reply, and then you just send
24330 back ``No, it's not! Moron!'', I will have no idea what you are
24331 insulting me about.  Always over-explain everything.  It's much easier
24332 for all of us---if I don't have all the information I need, I will just
24333 mail you and ask for more info, and everything takes more time.
24334
24335 If the problem you're seeing is very visual, and you can't quite explain
24336 it, copy the Emacs window to a file (with @code{xwd}, for instance), put
24337 it somewhere it can be reached, and include the URL of the picture in
24338 the bug report.
24339
24340 @cindex patches
24341 If you would like to contribute a patch to fix bugs or make
24342 improvements, please produce the patch using @samp{diff -u}.
24343
24344 @cindex edebug
24345 If you want to debug your problem further before reporting, possibly
24346 in order to solve the problem yourself and send a patch, you can use
24347 edebug.  Debugging lisp code is documented in the Elisp manual
24348 (@pxref{Debugging, , Debugging Lisp Programs, elisp, The GNU Emacs
24349 Lisp Reference Manual}).  To get you started with edebug, consider if
24350 you discover some weird behaviour when pressing @kbd{c}, the first
24351 step is to do @kbd{C-h k c} and click on the hyperlink (Emacs only) in
24352 the documentation buffer that leads you to the function definition,
24353 then press @kbd{M-x edebug-defun RET} with point inside that function,
24354 return to Gnus and press @kbd{c} to invoke the code.  You will be
24355 placed in the lisp buffer and can single step using @kbd{SPC} and
24356 evaluate expressions using @kbd{M-:} or inspect variables using
24357 @kbd{C-h v}, abort execution with @kbd{q}, and resume execution with
24358 @kbd{c} or @kbd{g}.
24359
24360 @cindex elp
24361 @cindex profile
24362 @cindex slow
24363 Sometimes, a problem do not directly generate a elisp error but
24364 manifests itself by causing Gnus to be very slow.  In these cases, you
24365 can use @kbd{M-x toggle-debug-on-quit} and press C-j when things are
24366 slow, and then try to analyze the backtrace (repeating the procedure
24367 helps isolating the real problem areas).  A fancier approach is to use
24368 the elisp profiler, ELP.  The profiler is (or should be) fully
24369 documented elsewhere, but to get you started there are a few steps
24370 that need to be followed.  First, instrument the part of Gnus you are
24371 interested in for profiling, e.g. @kbd{M-x elp-instrument-package RET
24372 gnus} or @kbd{M-x elp-instrument-packagre RET message}.  Then perform
24373 the operation that is slow and press @kbd{M-x elp-results}.  You will
24374 then see which operations that takes time, and can debug them further.
24375 If the entire operation takes much longer than the time spent in the
24376 slowest function in the profiler output, you probably profiled the
24377 wrong part of Gnus.  To reset profiling statistics, use @kbd{M-x
24378 elp-reset-all}.  @kbd{M-x elp-restore-all} is supposed to remove
24379 profiling, but given the complexities and dynamic code generation in
24380 Gnus, it might not always work perfectly.
24381
24382 If you just need help, you are better off asking on
24383 @samp{gnu.emacs.gnus}.  I'm not very helpful.
24384
24385 @cindex gnu.emacs.gnus
24386 @cindex ding mailing list
24387 You can also ask on the ding mailing list---@samp{ding@@gnus.org}.
24388 Write to @samp{ding-request@@gnus.org} to subscribe.
24389
24390
24391 @page
24392 @node Gnus Reference Guide
24393 @section Gnus Reference Guide
24394
24395 It is my hope that other people will figure out smart stuff that Gnus
24396 can do, and that other people will write those smart things as well.  To
24397 facilitate that I thought it would be a good idea to describe the inner
24398 workings of Gnus.  And some of the not-so-inner workings, while I'm at
24399 it.
24400
24401 You can never expect the internals of a program not to change, but I
24402 will be defining (in some details) the interface between Gnus and its
24403 back ends (this is written in stone), the format of the score files
24404 (ditto), data structures (some are less likely to change than others)
24405 and general methods of operation.
24406
24407 @menu
24408 * Gnus Utility Functions::      Common functions and variable to use.
24409 * Back End Interface::          How Gnus communicates with the servers.
24410 * Score File Syntax::           A BNF definition of the score file standard.
24411 * Headers::                     How Gnus stores headers internally.
24412 * Ranges::                      A handy format for storing mucho numbers.
24413 * Group Info::                  The group info format.
24414 * Extended Interactive::        Symbolic prefixes and stuff.
24415 * Emacs/XEmacs Code::           Gnus can be run under all modern Emacsen.
24416 * Various File Formats::        Formats of files that Gnus use.
24417 @end menu
24418
24419
24420 @node Gnus Utility Functions
24421 @subsection Gnus Utility Functions
24422 @cindex Gnus utility functions
24423 @cindex utility functions
24424 @cindex functions
24425 @cindex internal variables
24426
24427 When writing small functions to be run from hooks (and stuff), it's
24428 vital to have access to the Gnus internal functions and variables.
24429 Below is a list of the most common ones.
24430
24431 @table @code
24432
24433 @item gnus-newsgroup-name
24434 @vindex gnus-newsgroup-name
24435 This variable holds the name of the current newsgroup.
24436
24437 @item gnus-find-method-for-group
24438 @findex gnus-find-method-for-group
24439 A function that returns the select method for @var{group}.
24440
24441 @item gnus-group-real-name
24442 @findex gnus-group-real-name
24443 Takes a full (prefixed) Gnus group name, and returns the unprefixed
24444 name.
24445
24446 @item gnus-group-prefixed-name
24447 @findex gnus-group-prefixed-name
24448 Takes an unprefixed group name and a select method, and returns the full
24449 (prefixed) Gnus group name.
24450
24451 @item gnus-get-info
24452 @findex gnus-get-info
24453 Returns the group info list for @var{group}.
24454
24455 @item gnus-group-unread
24456 @findex gnus-group-unread
24457 The number of unread articles in @var{group}, or @code{t} if that is
24458 unknown.
24459
24460 @item gnus-active
24461 @findex gnus-active
24462 The active entry for @var{group}.
24463
24464 @item gnus-set-active
24465 @findex gnus-set-active
24466 Set the active entry for @var{group}.
24467
24468 @item gnus-add-current-to-buffer-list
24469 @findex gnus-add-current-to-buffer-list
24470 Adds the current buffer to the list of buffers to be killed on Gnus
24471 exit.
24472
24473 @item gnus-continuum-version
24474 @findex gnus-continuum-version
24475 Takes a Gnus version string as a parameter and returns a floating point
24476 number.  Earlier versions will always get a lower number than later
24477 versions.
24478
24479 @item gnus-group-read-only-p
24480 @findex gnus-group-read-only-p
24481 Says whether @var{group} is read-only or not.
24482
24483 @item gnus-news-group-p
24484 @findex gnus-news-group-p
24485 Says whether @var{group} came from a news back end.
24486
24487 @item gnus-ephemeral-group-p
24488 @findex gnus-ephemeral-group-p
24489 Says whether @var{group} is ephemeral or not.
24490
24491 @item gnus-server-to-method
24492 @findex gnus-server-to-method
24493 Returns the select method corresponding to @var{server}.
24494
24495 @item gnus-server-equal
24496 @findex gnus-server-equal
24497 Says whether two virtual servers are equal.
24498
24499 @item gnus-group-native-p
24500 @findex gnus-group-native-p
24501 Says whether @var{group} is native or not.
24502
24503 @item gnus-group-secondary-p
24504 @findex gnus-group-secondary-p
24505 Says whether @var{group} is secondary or not.
24506
24507 @item gnus-group-foreign-p
24508 @findex gnus-group-foreign-p
24509 Says whether @var{group} is foreign or not.
24510
24511 @item group-group-find-parameter
24512 @findex group-group-find-parameter
24513 Returns the parameter list of @var{group}.  If given a second parameter,
24514 returns the value of that parameter for @var{group}.
24515
24516 @item gnus-group-set-parameter
24517 @findex gnus-group-set-parameter
24518 Takes three parameters; @var{group}, @var{parameter} and @var{value}.
24519
24520 @item gnus-narrow-to-body
24521 @findex gnus-narrow-to-body
24522 Narrows the current buffer to the body of the article.
24523
24524 @item gnus-check-backend-function
24525 @findex gnus-check-backend-function
24526 Takes two parameters, @var{function} and @var{group}.  If the back end
24527 @var{group} comes from supports @var{function}, return non-@code{nil}.
24528
24529 @lisp
24530 (gnus-check-backend-function "request-scan" "nnml:misc")
24531 @result{} t
24532 @end lisp
24533
24534 @item gnus-read-method
24535 @findex gnus-read-method
24536 Prompts the user for a select method.
24537
24538 @end table
24539
24540
24541 @node Back End Interface
24542 @subsection Back End Interface
24543
24544 Gnus doesn't know anything about @sc{nntp}, spools, mail or virtual
24545 groups.  It only knows how to talk to @dfn{virtual servers}.  A virtual
24546 server is a @dfn{back end} and some @dfn{back end variables}.  As examples
24547 of the first, we have @code{nntp}, @code{nnspool} and @code{nnmbox}.  As
24548 examples of the latter we have @code{nntp-port-number} and
24549 @code{nnmbox-directory}.
24550
24551 When Gnus asks for information from a back end---say @code{nntp}---on
24552 something, it will normally include a virtual server name in the
24553 function parameters.  (If not, the back end should use the ``current''
24554 virtual server.)  For instance, @code{nntp-request-list} takes a virtual
24555 server as its only (optional) parameter.  If this virtual server hasn't
24556 been opened, the function should fail.
24557
24558 Note that a virtual server name has no relation to some physical server
24559 name.  Take this example:
24560
24561 @lisp
24562 (nntp "odd-one"
24563       (nntp-address "ifi.uio.no")
24564       (nntp-port-number 4324))
24565 @end lisp
24566
24567 Here the virtual server name is @samp{odd-one} while the name of
24568 the physical server is @samp{ifi.uio.no}.
24569
24570 The back ends should be able to switch between several virtual servers.
24571 The standard back ends implement this by keeping an alist of virtual
24572 server environments that they pull down/push up when needed.
24573
24574 There are two groups of interface functions: @dfn{required functions},
24575 which must be present, and @dfn{optional functions}, which Gnus will
24576 always check for presence before attempting to call 'em.
24577
24578 All these functions are expected to return data in the buffer
24579 @code{nntp-server-buffer} (@samp{ *nntpd*}), which is somewhat
24580 unfortunately named, but we'll have to live with it.  When I talk about
24581 @dfn{resulting data}, I always refer to the data in that buffer.  When I
24582 talk about @dfn{return value}, I talk about the function value returned by
24583 the function call.  Functions that fail should return @code{nil} as the
24584 return value.
24585
24586 Some back ends could be said to be @dfn{server-forming} back ends, and
24587 some might be said not to be.  The latter are back ends that generally
24588 only operate on one group at a time, and have no concept of ``server''
24589 -- they have a group, and they deliver info on that group and nothing
24590 more.
24591
24592 Gnus identifies each message by way of group name and article number.  A
24593 few remarks about these article numbers might be useful.  First of all,
24594 the numbers are positive integers.  Secondly, it is normally not
24595 possible for later articles to `re-use' older article numbers without
24596 confusing Gnus.  That is, if a group has ever contained a message
24597 numbered 42, then no other message may get that number, or Gnus will get
24598 mightily confused.@footnote{See the function
24599 @code{nnchoke-request-update-info}, @ref{Optional Back End Functions}.}
24600 Third, article numbers must be assigned in order of arrival in the
24601 group; this is not necessarily the same as the date of the message.
24602
24603 The previous paragraph already mentions all the `hard' restrictions that
24604 article numbers must fulfill.  But it seems that it might be useful to
24605 assign @emph{consecutive} article numbers, for Gnus gets quite confused
24606 if there are holes in the article numbering sequence.  However, due to
24607 the `no-reuse' restriction, holes cannot be avoided altogether.  It's
24608 also useful for the article numbers to start at 1 to avoid running out
24609 of numbers as long as possible.
24610
24611 Note that by convention, backends are named @code{nnsomething}, but
24612 Gnus also comes with some @code{nnnotbackends}, such as
24613 @file{nnheader.el}, @file{nnmail.el} and @file{nnoo.el}.
24614
24615 In the examples and definitions I will refer to the imaginary back end
24616 @code{nnchoke}.
24617
24618 @cindex @code{nnchoke}
24619
24620 @menu
24621 * Required Back End Functions::  Functions that must be implemented.
24622 * Optional Back End Functions::  Functions that need not be implemented.
24623 * Error Messaging::             How to get messages and report errors.
24624 * Writing New Back Ends::       Extending old back ends.
24625 * Hooking New Back Ends Into Gnus::  What has to be done on the Gnus end.
24626 * Mail-like Back Ends::         Some tips on mail back ends.
24627 @end menu
24628
24629
24630 @node Required Back End Functions
24631 @subsubsection Required Back End Functions
24632
24633 @table @code
24634
24635 @item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD)
24636
24637 @var{articles} is either a range of article numbers or a list of
24638 @code{Message-ID}s.  Current back ends do not fully support either---only
24639 sequences (lists) of article numbers, and most back ends do not support
24640 retrieval of @code{Message-ID}s.  But they should try for both.
24641
24642 The result data should either be HEADs or @sc{nov} lines, and the result
24643 value should either be @code{headers} or @code{nov} to reflect this.
24644 This might later be expanded to @code{various}, which will be a mixture
24645 of HEADs and @sc{nov} lines, but this is currently not supported by Gnus.
24646
24647 If @var{fetch-old} is non-@code{nil} it says to try fetching "extra
24648 headers", in some meaning of the word.  This is generally done by
24649 fetching (at most) @var{fetch-old} extra headers less than the smallest
24650 article number in @code{articles}, and filling the gaps as well.  The
24651 presence of this parameter can be ignored if the back end finds it
24652 cumbersome to follow the request.  If this is non-@code{nil} and not a
24653 number, do maximum fetches.
24654
24655 Here's an example HEAD:
24656
24657 @example
24658 221 1056 Article retrieved.
24659 Path: ifi.uio.no!sturles
24660 From: sturles@@ifi.uio.no (Sturle Sunde)
24661 Newsgroups: ifi.discussion
24662 Subject: Re: Something very droll
24663 Date: 27 Oct 1994 14:02:57 +0100
24664 Organization: Dept. of Informatics, University of Oslo, Norway
24665 Lines: 26
24666 Message-ID: <38o8e1$a0o@@holmenkollen.ifi.uio.no>
24667 References: <38jdmq$4qu@@visbur.ifi.uio.no>
24668 NNTP-Posting-Host: holmenkollen.ifi.uio.no
24669 .
24670 @end example
24671
24672 So a @code{headers} return value would imply that there's a number of
24673 these in the data buffer.
24674
24675 Here's a BNF definition of such a buffer:
24676
24677 @example
24678 headers        = *head
24679 head           = error / valid-head
24680 error-message  = [ "4" / "5" ] 2number " " <error message> eol
24681 valid-head     = valid-message *header "." eol
24682 valid-message  = "221 " <number> " Article retrieved." eol
24683 header         = <text> eol
24684 @end example
24685
24686 If the return value is @code{nov}, the data buffer should contain
24687 @dfn{network overview database} lines.  These are basically fields
24688 separated by tabs.
24689
24690 @example
24691 nov-buffer = *nov-line
24692 nov-line   = 8*9 [ field <TAB> ] eol
24693 field      = <text except TAB>
24694 @end example
24695
24696 For a closer look at what should be in those fields,
24697 @pxref{Headers}.
24698
24699
24700 @item (nnchoke-open-server SERVER &optional DEFINITIONS)
24701
24702 @var{server} is here the virtual server name.  @var{definitions} is a
24703 list of @code{(VARIABLE VALUE)} pairs that define this virtual server.
24704
24705 If the server can't be opened, no error should be signaled.  The back end
24706 may then choose to refuse further attempts at connecting to this
24707 server.  In fact, it should do so.
24708
24709 If the server is opened already, this function should return a
24710 non-@code{nil} value.  There should be no data returned.
24711
24712
24713 @item (nnchoke-close-server &optional SERVER)
24714
24715 Close connection to @var{server} and free all resources connected
24716 to it.  Return @code{nil} if the server couldn't be closed for some
24717 reason.
24718
24719 There should be no data returned.
24720
24721
24722 @item (nnchoke-request-close)
24723
24724 Close connection to all servers and free all resources that the back end
24725 have reserved.  All buffers that have been created by that back end
24726 should be killed.  (Not the @code{nntp-server-buffer}, though.)  This
24727 function is generally only called when Gnus is shutting down.
24728
24729 There should be no data returned.
24730
24731
24732 @item (nnchoke-server-opened &optional SERVER)
24733
24734 If @var{server} is the current virtual server, and the connection to the
24735 physical server is alive, then this function should return a
24736 non-@code{nil} vlue.  This function should under no circumstances
24737 attempt to reconnect to a server we have lost connection to.
24738
24739 There should be no data returned.
24740
24741
24742 @item (nnchoke-status-message &optional SERVER)
24743
24744 This function should return the last error message from @var{server}.
24745
24746 There should be no data returned.
24747
24748
24749 @item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER)
24750
24751 The result data from this function should be the article specified by
24752 @var{article}.  This might either be a @code{Message-ID} or a number.
24753 It is optional whether to implement retrieval by @code{Message-ID}, but
24754 it would be nice if that were possible.
24755
24756 If @var{to-buffer} is non-@code{nil}, the result data should be returned
24757 in this buffer instead of the normal data buffer.  This is to make it
24758 possible to avoid copying large amounts of data from one buffer to
24759 another, while Gnus mainly requests articles to be inserted directly
24760 into its article buffer.
24761
24762 If it is at all possible, this function should return a cons cell where
24763 the @code{car} is the group name the article was fetched from, and the @code{cdr} is
24764 the article number.  This will enable Gnus to find out what the real
24765 group and article numbers are when fetching articles by
24766 @code{Message-ID}.  If this isn't possible, @code{t} should be returned
24767 on successful article retrieval.
24768
24769
24770 @item (nnchoke-request-group GROUP &optional SERVER FAST)
24771
24772 Get data on @var{group}.  This function also has the side effect of
24773 making @var{group} the current group.
24774
24775 If @var{fast}, don't bother to return useful data, just make @var{group}
24776 the current group.
24777
24778 Here's an example of some result data and a definition of the same:
24779
24780 @example
24781 211 56 1000 1059 ifi.discussion
24782 @end example
24783
24784 The first number is the status, which should be 211.  Next is the
24785 total number of articles in the group, the lowest article number, the
24786 highest article number, and finally the group name.  Note that the total
24787 number of articles may be less than one might think while just
24788 considering the highest and lowest article numbers, but some articles
24789 may have been canceled.  Gnus just discards the total-number, so
24790 whether one should take the bother to generate it properly (if that is a
24791 problem) is left as an exercise to the reader.  If the group contains no
24792 articles, the lowest article number should be reported as 1 and the
24793 highest as 0.
24794
24795 @example
24796 group-status = [ error / info ] eol
24797 error        = [ "4" / "5" ] 2<number> " " <Error message>
24798 info         = "211 " 3* [ <number> " " ] <string>
24799 @end example
24800
24801
24802 @item (nnchoke-close-group GROUP &optional SERVER)
24803
24804 Close @var{group} and free any resources connected to it.  This will be
24805 a no-op on most back ends.
24806
24807 There should be no data returned.
24808
24809
24810 @item (nnchoke-request-list &optional SERVER)
24811
24812 Return a list of all groups available on @var{server}.  And that means
24813 @emph{all}.
24814
24815 Here's an example from a server that only carries two groups:
24816
24817 @example
24818 ifi.test 0000002200 0000002000 y
24819 ifi.discussion 3324 3300 n
24820 @end example
24821
24822 On each line we have a group name, then the highest article number in
24823 that group, the lowest article number, and finally a flag.  If the group
24824 contains no articles, the lowest article number should be reported as 1
24825 and the highest as 0.
24826
24827 @example
24828 active-file = *active-line
24829 active-line = name " " <number> " " <number> " " flags eol
24830 name        = <string>
24831 flags       = "n" / "y" / "m" / "x" / "j" / "=" name
24832 @end example
24833
24834 The flag says whether the group is read-only (@samp{n}), is moderated
24835 (@samp{m}), is dead (@samp{x}), is aliased to some other group
24836 (@samp{=other-group}) or none of the above (@samp{y}).
24837
24838
24839 @item (nnchoke-request-post &optional SERVER)
24840
24841 This function should post the current buffer.  It might return whether
24842 the posting was successful or not, but that's not required.  If, for
24843 instance, the posting is done asynchronously, it has generally not been
24844 completed by the time this function concludes.  In that case, this
24845 function should set up some kind of sentinel to beep the user loud and
24846 clear if the posting could not be completed.
24847
24848 There should be no result data from this function.
24849
24850 @end table
24851
24852
24853 @node Optional Back End Functions
24854 @subsubsection Optional Back End Functions
24855
24856 @table @code
24857
24858 @item (nnchoke-retrieve-groups GROUPS &optional SERVER)
24859
24860 @var{groups} is a list of groups, and this function should request data
24861 on all those groups.  How it does it is of no concern to Gnus, but it
24862 should attempt to do this in a speedy fashion.
24863
24864 The return value of this function can be either @code{active} or
24865 @code{group}, which says what the format of the result data is.  The
24866 former is in the same format as the data from
24867 @code{nnchoke-request-list}, while the latter is a buffer full of lines
24868 in the same format as @code{nnchoke-request-group} gives.
24869
24870 @example
24871 group-buffer = *active-line / *group-status
24872 @end example
24873
24874
24875 @item (nnchoke-request-update-info GROUP INFO &optional SERVER)
24876
24877 A Gnus group info (@pxref{Group Info}) is handed to the back end for
24878 alterations.  This comes in handy if the back end really carries all the
24879 information (as is the case with virtual and imap groups).  This
24880 function should destructively alter the info to suit its needs, and
24881 should return a non-nil value.
24882
24883 There should be no result data from this function.
24884
24885
24886 @item (nnchoke-request-type GROUP &optional ARTICLE)
24887
24888 When the user issues commands for ``sending news'' (@kbd{F} in the
24889 summary buffer, for instance), Gnus has to know whether the article the
24890 user is following up on is news or mail.  This function should return
24891 @code{news} if @var{article} in @var{group} is news, @code{mail} if it
24892 is mail and @code{unknown} if the type can't be decided.  (The
24893 @var{article} parameter is necessary in @code{nnvirtual} groups which
24894 might very well combine mail groups and news groups.)  Both @var{group}
24895 and @var{article} may be @code{nil}.
24896
24897 There should be no result data from this function.
24898
24899
24900 @item (nnchoke-request-set-mark GROUP ACTION &optional SERVER)
24901
24902 Set/remove/add marks on articles.  Normally Gnus handles the article
24903 marks (such as read, ticked, expired etc) internally, and store them in
24904 @file{~/.newsrc.eld}.  Some back ends (such as @sc{imap}) however carry
24905 all information about the articles on the server, so Gnus need to
24906 propagate the mark information to the server.
24907
24908 @var{action} is a list of mark setting requests, having this format:
24909
24910 @example
24911 (RANGE ACTION MARK)
24912 @end example
24913
24914 @var{range} is a range of articles you wish to update marks on.
24915 @var{action} is @code{add} or @code{del}, used to add marks or remove
24916 marks (preserving all marks not mentioned).  @var{mark} is a list of
24917 marks; where each mark is a symbol.  Currently used marks are
24918 @code{read}, @code{tick}, @code{reply}, @code{expire}, @code{killed},
24919 @code{dormant}, @code{save}, @code{download}, @code{unsend},
24920 @code{forward} and @code{recent}, but your back end should, if
24921 possible, not limit itself to these.
24922
24923 Given contradictory actions, the last action in the list should be the
24924 effective one.  That is, if your action contains a request to add the
24925 @code{tick} mark on article 1 and, later in the list, a request to
24926 remove the mark on the same article, the mark should in fact be removed.
24927
24928 An example action list:
24929
24930 @example
24931 (((5 12 30) 'del '(tick))
24932  ((10 . 90) 'add '(read expire))
24933  ((92 94) 'del '(read)))
24934 @end example
24935
24936 The function should return a range of articles it wasn't able to set the
24937 mark on (currently not used for anything).
24938
24939 There should be no result data from this function.
24940
24941 @item (nnchoke-request-update-mark GROUP ARTICLE MARK)
24942
24943 If the user tries to set a mark that the back end doesn't like, this
24944 function may change the mark.  Gnus will use whatever this function
24945 returns as the mark for @var{article} instead of the original
24946 @var{mark}.  If the back end doesn't care, it must return the original
24947 @var{mark}, and not @code{nil} or any other type of garbage.
24948
24949 The only use for this I can see is what @code{nnvirtual} does with
24950 it---if a component group is auto-expirable, marking an article as read
24951 in the virtual group should result in the article being marked as
24952 expirable.
24953
24954 There should be no result data from this function.
24955
24956
24957 @item (nnchoke-request-scan &optional GROUP SERVER)
24958
24959 This function may be called at any time (by Gnus or anything else) to
24960 request that the back end check for incoming articles, in one way or
24961 another.  A mail back end will typically read the spool file or query the
24962 POP server when this function is invoked.  The @var{group} doesn't have
24963 to be heeded---if the back end decides that it is too much work just
24964 scanning for a single group, it may do a total scan of all groups.  It
24965 would be nice, however, to keep things local if that's practical.
24966
24967 There should be no result data from this function.
24968
24969
24970 @item (nnchoke-request-group-description GROUP &optional SERVER)
24971
24972 The result data from this function should be a description of
24973 @var{group}.
24974
24975 @example
24976 description-line = name <TAB> description eol
24977 name             = <string>
24978 description      = <text>
24979 @end example
24980
24981 @item (nnchoke-request-list-newsgroups &optional SERVER)
24982
24983 The result data from this function should be the description of all
24984 groups available on the server.
24985
24986 @example
24987 description-buffer = *description-line
24988 @end example
24989
24990
24991 @item (nnchoke-request-newgroups DATE &optional SERVER)
24992
24993 The result data from this function should be all groups that were
24994 created after @samp{date}, which is in normal human-readable date format
24995 (i.e., the date format used in mail and news headers, and returned by
24996 the function @code{message-make-date} by default).  The data should be
24997 in the active buffer format.
24998
24999 It is okay for this function to return `too many' groups; some back ends
25000 might find it cheaper to return the full list of groups, rather than
25001 just the new groups.  But don't do this for back ends with many groups.
25002 Normally, if the user creates the groups herself, there won't be too
25003 many groups, so @code{nnml} and the like are probably safe.  But for
25004 back ends like @code{nntp}, where the groups have been created by the
25005 server, it is quite likely that there can be many groups.
25006
25007
25008 @item (nnchoke-request-create-group GROUP &optional SERVER)
25009
25010 This function should create an empty group with name @var{group}.
25011
25012 There should be no return data.
25013
25014
25015 @item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE)
25016
25017 This function should run the expiry process on all articles in the
25018 @var{articles} range (which is currently a simple list of article
25019 numbers.)  It is left up to the back end to decide how old articles
25020 should be before they are removed by this function.  If @var{force} is
25021 non-@code{nil}, all @var{articles} should be deleted, no matter how new
25022 they are.
25023
25024 This function should return a list of articles that it did not/was not
25025 able to delete.
25026
25027 There should be no result data returned.
25028
25029
25030 @item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM
25031 &optional LAST)
25032
25033 This function should move @var{article} (which is a number) from
25034 @var{group} by calling @var{accept-form}.
25035
25036 This function should ready the article in question for moving by
25037 removing any header lines it has added to the article, and generally
25038 should ``tidy up'' the article.  Then it should @code{eval}
25039 @var{accept-form} in the buffer where the ``tidy'' article is.  This
25040 will do the actual copying.  If this @code{eval} returns a
25041 non-@code{nil} value, the article should be removed.
25042
25043 If @var{last} is @code{nil}, that means that there is a high likelihood
25044 that there will be more requests issued shortly, so that allows some
25045 optimizations.
25046
25047 The function should return a cons where the @code{car} is the group name and
25048 the @code{cdr} is the article number that the article was entered as.
25049
25050 The group should exist before the backend is asked to accept the
25051 article for that group.
25052
25053 There should be no data returned.
25054
25055
25056 @item (nnchoke-request-accept-article GROUP &optional SERVER LAST)
25057
25058 This function takes the current buffer and inserts it into @var{group}.
25059 If @var{last} in @code{nil}, that means that there will be more calls to
25060 this function in short order.
25061
25062 The function should return a cons where the @code{car} is the group name and
25063 the @code{cdr} is the article number that the article was entered as.
25064
25065 There should be no data returned.
25066
25067
25068 @item (nnchoke-request-replace-article ARTICLE GROUP BUFFER)
25069
25070 This function should remove @var{article} (which is a number) from
25071 @var{group} and insert @var{buffer} there instead.
25072
25073 There should be no data returned.
25074
25075
25076 @item (nnchoke-request-delete-group GROUP FORCE &optional SERVER)
25077
25078 This function should delete @var{group}.  If @var{force}, it should
25079 really delete all the articles in the group, and then delete the group
25080 itself.  (If there is such a thing as ``the group itself''.)
25081
25082 There should be no data returned.
25083
25084
25085 @item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER)
25086
25087 This function should rename @var{group} into @var{new-name}.  All
25088 articles in @var{group} should move to @var{new-name}.
25089
25090 There should be no data returned.
25091
25092 @end table
25093
25094
25095 @node Error Messaging
25096 @subsubsection Error Messaging
25097
25098 @findex nnheader-report
25099 @findex nnheader-get-report
25100 The back ends should use the function @code{nnheader-report} to report
25101 error conditions---they should not raise errors when they aren't able to
25102 perform a request.  The first argument to this function is the back end
25103 symbol, and the rest are interpreted as arguments to @code{format} if
25104 there are multiple of them, or just a string if there is one of them.
25105 This function must always returns @code{nil}.
25106
25107 @lisp
25108 (nnheader-report 'nnchoke "You did something totally bogus")
25109
25110 (nnheader-report 'nnchoke "Could not request group %s" group)
25111 @end lisp
25112
25113 Gnus, in turn, will call @code{nnheader-get-report} when it gets a
25114 @code{nil} back from a server, and this function returns the most
25115 recently reported message for the back end in question.  This function
25116 takes one argument---the server symbol.
25117
25118 Internally, these functions access @var{back-end}@code{-status-string},
25119 so the @code{nnchoke} back end will have its error message stored in
25120 @code{nnchoke-status-string}.
25121
25122
25123 @node Writing New Back Ends
25124 @subsubsection Writing New Back Ends
25125
25126 Many back ends are quite similar.  @code{nnml} is just like
25127 @code{nnspool}, but it allows you to edit the articles on the server.
25128 @code{nnmh} is just like @code{nnml}, but it doesn't use an active file,
25129 and it doesn't maintain overview databases.  @code{nndir} is just like
25130 @code{nnml}, but it has no concept of ``groups'', and it doesn't allow
25131 editing articles.
25132
25133 It would make sense if it were possible to ``inherit'' functions from
25134 back ends when writing new back ends.  And, indeed, you can do that if you
25135 want to.  (You don't have to if you don't want to, of course.)
25136
25137 All the back ends declare their public variables and functions by using a
25138 package called @code{nnoo}.
25139
25140 To inherit functions from other back ends (and allow other back ends to
25141 inherit functions from the current back end), you should use the
25142 following macros:
25143
25144 @table @code
25145
25146 @item nnoo-declare
25147 This macro declares the first parameter to be a child of the subsequent
25148 parameters.  For instance:
25149
25150 @lisp
25151 (nnoo-declare nndir
25152   nnml nnmh)
25153 @end lisp
25154
25155 @code{nndir} has declared here that it intends to inherit functions from
25156 both @code{nnml} and @code{nnmh}.
25157
25158 @item defvoo
25159 This macro is equivalent to @code{defvar}, but registers the variable as
25160 a public server variable.  Most state-oriented variables should be
25161 declared with @code{defvoo} instead of @code{defvar}.
25162
25163 In addition to the normal @code{defvar} parameters, it takes a list of
25164 variables in the parent back ends to map the variable to when executing
25165 a function in those back ends.
25166
25167 @lisp
25168 (defvoo nndir-directory nil
25169   "Where nndir will look for groups."
25170   nnml-current-directory nnmh-current-directory)
25171 @end lisp
25172
25173 This means that @code{nnml-current-directory} will be set to
25174 @code{nndir-directory} when an @code{nnml} function is called on behalf
25175 of @code{nndir}.  (The same with @code{nnmh}.)
25176
25177 @item nnoo-define-basics
25178 This macro defines some common functions that almost all back ends should
25179 have.
25180
25181 @example
25182 (nnoo-define-basics nndir)
25183 @end example
25184
25185 @item deffoo
25186 This macro is just like @code{defun} and takes the same parameters.  In
25187 addition to doing the normal @code{defun} things, it registers the
25188 function as being public so that other back ends can inherit it.
25189
25190 @item nnoo-map-functions
25191 This macro allows mapping of functions from the current back end to
25192 functions from the parent back ends.
25193
25194 @example
25195 (nnoo-map-functions nndir
25196   (nnml-retrieve-headers 0 nndir-current-group 0 0)
25197   (nnmh-request-article 0 nndir-current-group 0 0))
25198 @end example
25199
25200 This means that when @code{nndir-retrieve-headers} is called, the first,
25201 third, and fourth parameters will be passed on to
25202 @code{nnml-retrieve-headers}, while the second parameter is set to the
25203 value of @code{nndir-current-group}.
25204
25205 @item nnoo-import
25206 This macro allows importing functions from back ends.  It should be the
25207 last thing in the source file, since it will only define functions that
25208 haven't already been defined.
25209
25210 @example
25211 (nnoo-import nndir
25212   (nnmh
25213    nnmh-request-list
25214    nnmh-request-newgroups)
25215   (nnml))
25216 @end example
25217
25218 This means that calls to @code{nndir-request-list} should just be passed
25219 on to @code{nnmh-request-list}, while all public functions from
25220 @code{nnml} that haven't been defined in @code{nndir} yet should be
25221 defined now.
25222
25223 @end table
25224
25225 Below is a slightly shortened version of the @code{nndir} back end.
25226
25227 @lisp
25228 ;;; nndir.el --- single directory newsgroup access for Gnus
25229 ;; Copyright (C) 1995,96 Free Software Foundation, Inc.
25230
25231 ;;; Code:
25232
25233 (require 'nnheader)
25234 (require 'nnmh)
25235 (require 'nnml)
25236 (require 'nnoo)
25237 (eval-when-compile (require 'cl))
25238
25239 (nnoo-declare nndir
25240   nnml nnmh)
25241
25242 (defvoo nndir-directory nil
25243   "Where nndir will look for groups."
25244   nnml-current-directory nnmh-current-directory)
25245
25246 (defvoo nndir-nov-is-evil nil
25247   "*Non-nil means that nndir will never retrieve NOV headers."
25248   nnml-nov-is-evil)
25249
25250 (defvoo nndir-current-group ""
25251   nil
25252   nnml-current-group nnmh-current-group)
25253 (defvoo nndir-top-directory nil nil nnml-directory nnmh-directory)
25254 (defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail)
25255
25256 (defvoo nndir-status-string "" nil nnmh-status-string)
25257 (defconst nndir-version "nndir 1.0")
25258
25259 ;;; Interface functions.
25260
25261 (nnoo-define-basics nndir)
25262
25263 (deffoo nndir-open-server (server &optional defs)
25264   (setq nndir-directory
25265         (or (cadr (assq 'nndir-directory defs))
25266             server))
25267   (unless (assq 'nndir-directory defs)
25268     (push `(nndir-directory ,server) defs))
25269   (push `(nndir-current-group
25270           ,(file-name-nondirectory
25271             (directory-file-name nndir-directory)))
25272         defs)
25273   (push `(nndir-top-directory
25274           ,(file-name-directory (directory-file-name nndir-directory)))
25275         defs)
25276   (nnoo-change-server 'nndir server defs))
25277
25278 (nnoo-map-functions nndir
25279   (nnml-retrieve-headers 0 nndir-current-group 0 0)
25280   (nnmh-request-article 0 nndir-current-group 0 0)
25281   (nnmh-request-group nndir-current-group 0 0)
25282   (nnmh-close-group nndir-current-group 0))
25283
25284 (nnoo-import nndir
25285   (nnmh
25286    nnmh-status-message
25287    nnmh-request-list
25288    nnmh-request-newgroups))
25289
25290 (provide 'nndir)
25291 @end lisp
25292
25293
25294 @node Hooking New Back Ends Into Gnus
25295 @subsubsection Hooking New Back Ends Into Gnus
25296
25297 @vindex gnus-valid-select-methods
25298 @findex gnus-declare-backend
25299 Having Gnus start using your new back end is rather easy---you just
25300 declare it with the @code{gnus-declare-backend} functions.  This will
25301 enter the back end into the @code{gnus-valid-select-methods} variable.
25302
25303 @code{gnus-declare-backend} takes two parameters---the back end name and
25304 an arbitrary number of @dfn{abilities}.
25305
25306 Here's an example:
25307
25308 @lisp
25309 (gnus-declare-backend "nnchoke" 'mail 'respool 'address)
25310 @end lisp
25311
25312 The above line would then go in the @file{nnchoke.el} file.
25313
25314 The abilities can be:
25315
25316 @table @code
25317 @item mail
25318 This is a mailish back end---followups should (probably) go via mail.
25319 @item post
25320 This is a newsish back end---followups should (probably) go via news.
25321 @item post-mail
25322 This back end supports both mail and news.
25323 @item none
25324 This is neither a post nor mail back end---it's something completely
25325 different.
25326 @item respool
25327 It supports respooling---or rather, it is able to modify its source
25328 articles and groups.
25329 @item address
25330 The name of the server should be in the virtual server name.  This is
25331 true for almost all back ends.
25332 @item prompt-address
25333 The user should be prompted for an address when doing commands like
25334 @kbd{B} in the group buffer.  This is true for back ends like
25335 @code{nntp}, but not @code{nnmbox}, for instance.
25336 @end table
25337
25338
25339 @node Mail-like Back Ends
25340 @subsubsection Mail-like Back Ends
25341
25342 One of the things that separate the mail back ends from the rest of the
25343 back ends is the heavy dependence by most of the mail back ends on
25344 common functions in @file{nnmail.el}.  For instance, here's the
25345 definition of @code{nnml-request-scan}:
25346
25347 @lisp
25348 (deffoo nnml-request-scan (&optional group server)
25349   (setq nnml-article-file-alist nil)
25350   (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group))
25351 @end lisp
25352
25353 It simply calls @code{nnmail-get-new-mail} with a few parameters,
25354 and @code{nnmail} takes care of all the moving and splitting of the
25355 mail.
25356
25357 This function takes four parameters.
25358
25359 @table @var
25360 @item method
25361 This should be a symbol to designate which back end is responsible for
25362 the call.
25363
25364 @item exit-function
25365 This function should be called after the splitting has been performed.
25366
25367 @item temp-directory
25368 Where the temporary files should be stored.
25369
25370 @item group
25371 This optional argument should be a group name if the splitting is to be
25372 performed for one group only.
25373 @end table
25374
25375 @code{nnmail-get-new-mail} will call @var{back-end}@code{-save-mail} to
25376 save each article.  @var{back-end}@code{-active-number} will be called to
25377 find the article number assigned to this article.
25378
25379 The function also uses the following variables:
25380 @var{back-end}@code{-get-new-mail} (to see whether to get new mail for
25381 this back end); and @var{back-end}@code{-group-alist} and
25382 @var{back-end}@code{-active-file} to generate the new active file.
25383 @var{back-end}@code{-group-alist} should be a group-active alist, like
25384 this:
25385
25386 @example
25387 (("a-group" (1 . 10))
25388  ("some-group" (34 . 39)))
25389 @end example
25390
25391
25392 @node Score File Syntax
25393 @subsection Score File Syntax
25394
25395 Score files are meant to be easily parseable, but yet extremely
25396 mallable.   It was decided that something that had the same read syntax
25397 as an Emacs Lisp list would fit that spec.
25398
25399 Here's a typical score file:
25400
25401 @lisp
25402 (("summary"
25403   ("win95" -10000 nil s)
25404   ("Gnus"))
25405  ("from"
25406   ("Lars" -1000))
25407  (mark -100))
25408 @end lisp
25409
25410 BNF definition of a score file:
25411
25412 @example
25413 score-file      = "" / "(" *element ")"
25414 element         = rule / atom
25415 rule            = string-rule / number-rule / date-rule
25416 string-rule     = "(" quote string-header quote space *string-match ")"
25417 number-rule     = "(" quote number-header quote space *number-match ")"
25418 date-rule       = "(" quote date-header quote space *date-match ")"
25419 quote           = <ascii 34>
25420 string-header   = "subject" / "from" / "references" / "message-id" /
25421                   "xref" / "body" / "head" / "all" / "followup"
25422 number-header   = "lines" / "chars"
25423 date-header     = "date"
25424 string-match    = "(" quote <string> quote [ "" / [ space score [ "" /
25425                   space date [ "" / [ space string-match-t ] ] ] ] ] ")"
25426 score           = "nil" / <integer>
25427 date            = "nil" / <natural number>
25428 string-match-t  = "nil" / "s" / "substring" / "S" / "Substring" /
25429                   "r" / "regex" / "R" / "Regex" /
25430                   "e" / "exact" / "E" / "Exact" /
25431                   "f" / "fuzzy" / "F" / "Fuzzy"
25432 number-match    = "(" <integer> [ "" / [ space score [ "" /
25433                   space date [ "" / [ space number-match-t ] ] ] ] ] ")"
25434 number-match-t  = "nil" / "=" / "<" / ">" / ">=" / "<="
25435 date-match      = "(" quote <string> quote [ "" / [ space score [ "" /
25436                   space date [ "" / [ space date-match-t ] ] ] ] ")"
25437 date-match-t    = "nil" / "at" / "before" / "after"
25438 atom            = "(" [ required-atom / optional-atom ] ")"
25439 required-atom   = mark / expunge / mark-and-expunge / files /
25440                   exclude-files / read-only / touched
25441 optional-atom   = adapt / local / eval
25442 mark            = "mark" space nil-or-number
25443 nil-or-number   = "nil" / <integer>
25444 expunge         = "expunge" space nil-or-number
25445 mark-and-expunge = "mark-and-expunge" space nil-or-number
25446 files           = "files" *[ space <string> ]
25447 exclude-files   = "exclude-files" *[ space <string> ]
25448 read-only       = "read-only" [ space "nil" / space "t" ]
25449 adapt        = "adapt" [ space "ignore" / space "t" / space adapt-rule ]
25450 adapt-rule      = "(" *[ <string> *[ "(" <string> <integer> ")" ] ")"
25451 local           = "local" *[ space "(" <string> space <form> ")" ]
25452 eval            = "eval" space <form>
25453 space           = *[ " " / <TAB> / <NEWLINE> ]
25454 @end example
25455
25456 Any unrecognized elements in a score file should be ignored, but not
25457 discarded.
25458
25459 As you can see, white space is needed, but the type and amount of white
25460 space is irrelevant.  This means that formatting of the score file is
25461 left up to the programmer---if it's simpler to just spew it all out on
25462 one looong line, then that's ok.
25463
25464 The meaning of the various atoms are explained elsewhere in this
25465 manual (@pxref{Score File Format}).
25466
25467
25468 @node Headers
25469 @subsection Headers
25470
25471 Internally Gnus uses a format for storing article headers that
25472 corresponds to the @sc{nov} format in a mysterious fashion.  One could
25473 almost suspect that the author looked at the @sc{nov} specification and
25474 just shamelessly @emph{stole} the entire thing, and one would be right.
25475
25476 @dfn{Header} is a severely overloaded term.  ``Header'' is used in
25477 RFC 1036 to talk about lines in the head of an article (e.g.,
25478 @code{From}).  It is used by many people as a synonym for
25479 ``head''---``the header and the body''.  (That should be avoided, in my
25480 opinion.)  And Gnus uses a format internally that it calls ``header'',
25481 which is what I'm talking about here.  This is a 9-element vector,
25482 basically, with each header (ouch) having one slot.
25483
25484 These slots are, in order: @code{number}, @code{subject}, @code{from},
25485 @code{date}, @code{id}, @code{references}, @code{chars}, @code{lines},
25486 @code{xref}, and @code{extra}.  There are macros for accessing and
25487 setting these slots---they all have predictable names beginning with
25488 @code{mail-header-} and @code{mail-header-set-}, respectively.
25489
25490 All these slots contain strings, except the @code{extra} slot, which
25491 contains an alist of header/value pairs (@pxref{To From Newsgroups}).
25492
25493
25494 @node Ranges
25495 @subsection Ranges
25496
25497 @sc{gnus} introduced a concept that I found so useful that I've started
25498 using it a lot and have elaborated on it greatly.
25499
25500 The question is simple: If you have a large amount of objects that are
25501 identified by numbers (say, articles, to take a @emph{wild} example)
25502 that you want to qualify as being ``included'', a normal sequence isn't
25503 very useful.  (A 200,000 length sequence is a bit long-winded.)
25504
25505 The solution is as simple as the question: You just collapse the
25506 sequence.
25507
25508 @example
25509 (1 2 3 4 5 6 10 11 12)
25510 @end example
25511
25512 is transformed into
25513
25514 @example
25515 ((1 . 6) (10 . 12))
25516 @end example
25517
25518 To avoid having those nasty @samp{(13 . 13)} elements to denote a
25519 lonesome object, a @samp{13} is a valid element:
25520
25521 @example
25522 ((1 . 6) 7 (10 . 12))
25523 @end example
25524
25525 This means that comparing two ranges to find out whether they are equal
25526 is slightly tricky:
25527
25528 @example
25529 ((1 . 5) 7 8 (10 . 12))
25530 @end example
25531
25532 and
25533
25534 @example
25535 ((1 . 5) (7 . 8) (10 . 12))
25536 @end example
25537
25538 are equal.  In fact, any non-descending list is a range:
25539
25540 @example
25541 (1 2 3 4 5)
25542 @end example
25543
25544 is a perfectly valid range, although a pretty long-winded one.  This is
25545 also valid:
25546
25547 @example
25548 (1 . 5)
25549 @end example
25550
25551 and is equal to the previous range.
25552
25553 Here's a BNF definition of ranges.  Of course, one must remember the
25554 semantic requirement that the numbers are non-descending.  (Any number
25555 of repetition of the same number is allowed, but apt to disappear in
25556 range handling.)
25557
25558 @example
25559 range           = simple-range / normal-range
25560 simple-range    = "(" number " . " number ")"
25561 normal-range    = "(" start-contents ")"
25562 contents        = "" / simple-range *[ " " contents ] /
25563                   number *[ " " contents ]
25564 @end example
25565
25566 Gnus currently uses ranges to keep track of read articles and article
25567 marks.  I plan on implementing a number of range operators in C if The
25568 Powers That Be are willing to let me.  (I haven't asked yet, because I
25569 need to do some more thinking on what operators I need to make life
25570 totally range-based without ever having to convert back to normal
25571 sequences.)
25572
25573
25574 @node Group Info
25575 @subsection Group Info
25576
25577 Gnus stores all permanent info on groups in a @dfn{group info} list.
25578 This list is from three to six elements (or more) long and exhaustively
25579 describes the group.
25580
25581 Here are two example group infos; one is a very simple group while the
25582 second is a more complex one:
25583
25584 @example
25585 ("no.group" 5 ((1 . 54324)))
25586
25587 ("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55))
25588                 ((tick (15 . 19)) (replied 3 6 (19 . 3)))
25589                 (nnml "")
25590                 ((auto-expire . t) (to-address . "ding@@gnus.org")))
25591 @end example
25592
25593 The first element is the @dfn{group name}---as Gnus knows the group,
25594 anyway.  The second element is the @dfn{subscription level}, which
25595 normally is a small integer.  (It can also be the @dfn{rank}, which is a
25596 cons cell where the @code{car} is the level and the @code{cdr} is the
25597 score.)  The third element is a list of ranges of read articles.  The
25598 fourth element is a list of lists of article marks of various kinds.
25599 The fifth element is the select method (or virtual server, if you like).
25600 The sixth element is a list of @dfn{group parameters}, which is what
25601 this section is about.
25602
25603 Any of the last three elements may be missing if they are not required.
25604 In fact, the vast majority of groups will normally only have the first
25605 three elements, which saves quite a lot of cons cells.
25606
25607 Here's a BNF definition of the group info format:
25608
25609 @example
25610 info          = "(" group space ralevel space read
25611                 [ "" / [ space marks-list [ "" / [ space method [ "" /
25612                 space parameters ] ] ] ] ] ")"
25613 group         = quote <string> quote
25614 ralevel       = rank / level
25615 level         = <integer in the range of 1 to inf>
25616 rank          = "(" level "." score ")"
25617 score         = <integer in the range of 1 to inf>
25618 read          = range
25619 marks-lists   = nil / "(" *marks ")"
25620 marks         = "(" <string> range ")"
25621 method        = "(" <string> *elisp-forms ")"
25622 parameters    = "(" *elisp-forms ")"
25623 @end example
25624
25625 Actually that @samp{marks} rule is a fib.  A @samp{marks} is a
25626 @samp{<string>} consed on to a @samp{range}, but that's a bitch to say
25627 in pseudo-BNF.
25628
25629 If you have a Gnus info and want to access the elements, Gnus offers a
25630 series of macros for getting/setting these elements.
25631
25632 @table @code
25633 @item gnus-info-group
25634 @itemx gnus-info-set-group
25635 @findex gnus-info-group
25636 @findex gnus-info-set-group
25637 Get/set the group name.
25638
25639 @item gnus-info-rank
25640 @itemx gnus-info-set-rank
25641 @findex gnus-info-rank
25642 @findex gnus-info-set-rank
25643 Get/set the group rank (@pxref{Group Score}).
25644
25645 @item gnus-info-level
25646 @itemx gnus-info-set-level
25647 @findex gnus-info-level
25648 @findex gnus-info-set-level
25649 Get/set the group level.
25650
25651 @item gnus-info-score
25652 @itemx gnus-info-set-score
25653 @findex gnus-info-score
25654 @findex gnus-info-set-score
25655 Get/set the group score (@pxref{Group Score}).
25656
25657 @item gnus-info-read
25658 @itemx gnus-info-set-read
25659 @findex gnus-info-read
25660 @findex gnus-info-set-read
25661 Get/set the ranges of read articles.
25662
25663 @item gnus-info-marks
25664 @itemx gnus-info-set-marks
25665 @findex gnus-info-marks
25666 @findex gnus-info-set-marks
25667 Get/set the lists of ranges of marked articles.
25668
25669 @item gnus-info-method
25670 @itemx gnus-info-set-method
25671 @findex gnus-info-method
25672 @findex gnus-info-set-method
25673 Get/set the group select method.
25674
25675 @item gnus-info-params
25676 @itemx gnus-info-set-params
25677 @findex gnus-info-params
25678 @findex gnus-info-set-params
25679 Get/set the group parameters.
25680 @end table
25681
25682 All the getter functions take one parameter---the info list.  The setter
25683 functions take two parameters---the info list and the new value.
25684
25685 The last three elements in the group info aren't mandatory, so it may be
25686 necessary to extend the group info before setting the element.  If this
25687 is necessary, you can just pass on a non-@code{nil} third parameter to
25688 the three final setter functions to have this happen automatically.
25689
25690
25691 @node Extended Interactive
25692 @subsection Extended Interactive
25693 @cindex interactive
25694 @findex gnus-interactive
25695
25696 Gnus extends the standard Emacs @code{interactive} specification
25697 slightly to allow easy use of the symbolic prefix (@pxref{Symbolic
25698 Prefixes}).  Here's an example of how this is used:
25699
25700 @lisp
25701 (defun gnus-summary-increase-score (&optional score symp)
25702   (interactive (gnus-interactive "P\ny"))
25703   ...
25704   )
25705 @end lisp
25706
25707 The best thing to do would have been to implement
25708 @code{gnus-interactive} as a macro which would have returned an
25709 @code{interactive} form, but this isn't possible since Emacs checks
25710 whether a function is interactive or not by simply doing an @code{assq}
25711 on the lambda form.  So, instead we have @code{gnus-interactive}
25712 function that takes a string and returns values that are usable to
25713 @code{interactive}.
25714
25715 This function accepts (almost) all normal @code{interactive} specs, but
25716 adds a few more.
25717
25718 @table @samp
25719 @item y
25720 @vindex gnus-current-prefix-symbol
25721 The current symbolic prefix---the @code{gnus-current-prefix-symbol}
25722 variable.
25723
25724 @item Y
25725 @vindex gnus-current-prefix-symbols
25726 A list of the current symbolic prefixes---the
25727 @code{gnus-current-prefix-symbol} variable.
25728
25729 @item A
25730 The current article number---the @code{gnus-summary-article-number}
25731 function.
25732
25733 @item H
25734 The current article header---the @code{gnus-summary-article-header}
25735 function.
25736
25737 @item g
25738 The current group name---the @code{gnus-group-group-name}
25739 function.
25740
25741 @end table
25742
25743
25744 @node Emacs/XEmacs Code
25745 @subsection Emacs/XEmacs Code
25746 @cindex XEmacs
25747 @cindex Emacsen
25748
25749 While Gnus runs under Emacs, XEmacs and Mule, I decided that one of the
25750 platforms must be the primary one.  I chose Emacs.  Not because I don't
25751 like XEmacs or Mule, but because it comes first alphabetically.
25752
25753 This means that Gnus will byte-compile under Emacs with nary a warning,
25754 while XEmacs will pump out gigabytes of warnings while byte-compiling.
25755 As I use byte-compilation warnings to help me root out trivial errors in
25756 Gnus, that's very useful.
25757
25758 I've also consistently used Emacs function interfaces, but have used
25759 Gnusey aliases for the functions.  To take an example:  Emacs defines a
25760 @code{run-at-time} function while XEmacs defines a @code{start-itimer}
25761 function.  I then define a function called @code{gnus-run-at-time} that
25762 takes the same parameters as the Emacs @code{run-at-time}.  When running
25763 Gnus under Emacs, the former function is just an alias for the latter.
25764 However, when running under XEmacs, the former is an alias for the
25765 following function:
25766
25767 @lisp
25768 (defun gnus-xmas-run-at-time (time repeat function &rest args)
25769   (start-itimer
25770    "gnus-run-at-time"
25771    `(lambda ()
25772       (,function ,@@args))
25773    time repeat))
25774 @end lisp
25775
25776 This sort of thing has been done for bunches of functions.  Gnus does
25777 not redefine any native Emacs functions while running under XEmacs---it
25778 does this @code{defalias} thing with Gnus equivalents instead.  Cleaner
25779 all over.
25780
25781 In the cases where the XEmacs function interface was obviously cleaner,
25782 I used it instead.  For example @code{gnus-region-active-p} is an alias
25783 for @code{region-active-p} in XEmacs, whereas in Emacs it is a function.
25784
25785 Of course, I could have chosen XEmacs as my native platform and done
25786 mapping functions the other way around.  But I didn't.  The performance
25787 hit these indirections impose on Gnus under XEmacs should be slight.
25788
25789
25790 @node Various File Formats
25791 @subsection Various File Formats
25792
25793 @menu
25794 * Active File Format::          Information on articles and groups available.
25795 * Newsgroups File Format::      Group descriptions.
25796 @end menu
25797
25798
25799 @node Active File Format
25800 @subsubsection Active File Format
25801
25802 The active file lists all groups available on the server in
25803 question.  It also lists the highest and lowest current article numbers
25804 in each group.
25805
25806 Here's an excerpt from a typical active file:
25807
25808 @example
25809 soc.motss 296030 293865 y
25810 alt.binaries.pictures.fractals 3922 3913 n
25811 comp.sources.unix 1605 1593 m
25812 comp.binaries.ibm.pc 5097 5089 y
25813 no.general 1000 900 y
25814 @end example
25815
25816 Here's a pseudo-BNF definition of this file:
25817
25818 @example
25819 active      = *group-line
25820 group-line  = group spc high-number spc low-number spc flag <NEWLINE>
25821 group       = <non-white-space string>
25822 spc         = " "
25823 high-number = <non-negative integer>
25824 low-number  = <positive integer>
25825 flag        = "y" / "n" / "m" / "j" / "x" / "=" group
25826 @end example
25827
25828 For a full description of this file, see the manual pages for
25829 @samp{innd}, in particular @samp{active(5)}.
25830
25831
25832 @node Newsgroups File Format
25833 @subsubsection Newsgroups File Format
25834
25835 The newsgroups file lists groups along with their descriptions.  Not all
25836 groups on the server have to be listed,  and not all groups in the file
25837 have to exist on the server.  The file is meant purely as information to
25838 the user.
25839
25840 The format is quite simple; a group name, a tab, and the description.
25841 Here's the definition:
25842
25843 @example
25844 newsgroups    = *line
25845 line          = group tab description <NEWLINE>
25846 group         = <non-white-space string>
25847 tab           = <TAB>
25848 description   = <string>
25849 @end example
25850
25851
25852 @page
25853 @node Emacs for Heathens
25854 @section Emacs for Heathens
25855
25856 Believe it or not, but some people who use Gnus haven't really used
25857 Emacs much before they embarked on their journey on the Gnus Love Boat.
25858 If you are one of those unfortunates whom ``@kbd{C-M-a}'', ``kill the
25859 region'', and ``set @code{gnus-flargblossen} to an alist where the key
25860 is a regexp that is used for matching on the group name'' are magical
25861 phrases with little or no meaning, then this appendix is for you.  If
25862 you are already familiar with Emacs, just ignore this and go fondle your
25863 cat instead.
25864
25865 @menu
25866 * Keystrokes::                  Entering text and executing commands.
25867 * Emacs Lisp::                  The built-in Emacs programming language.
25868 @end menu
25869
25870
25871 @node Keystrokes
25872 @subsection Keystrokes
25873
25874 @itemize @bullet
25875 @item
25876 Q: What is an experienced Emacs user?
25877
25878 @item
25879 A: A person who wishes that the terminal had pedals.
25880 @end itemize
25881
25882 Yes, when you use Emacs, you are apt to use the control key, the shift
25883 key and the meta key a lot.  This is very annoying to some people
25884 (notably @code{vi}le users), and the rest of us just love the hell out
25885 of it.  Just give up and submit.  Emacs really does stand for
25886 ``Escape-Meta-Alt-Control-Shift'', and not ``Editing Macros'', as you
25887 may have heard from other disreputable sources (like the Emacs author).
25888
25889 The shift keys are normally located near your pinky fingers, and are
25890 normally used to get capital letters and stuff.  You probably use it all
25891 the time.  The control key is normally marked ``CTRL'' or something like
25892 that.  The meta key is, funnily enough, never marked as such on any
25893 keyboard.  The one I'm currently at has a key that's marked ``Alt'',
25894 which is the meta key on this keyboard.  It's usually located somewhere
25895 to the left hand side of the keyboard, usually on the bottom row.
25896
25897 Now, us Emacs people don't say ``press the meta-control-m key'',
25898 because that's just too inconvenient.  We say ``press the @kbd{C-M-m}
25899 key''.  @kbd{M-} is the prefix that means ``meta'' and ``C-'' is the
25900 prefix that means ``control''.  So ``press @kbd{C-k}'' means ``press
25901 down the control key, and hold it down while you press @kbd{k}''.
25902 ``Press @kbd{C-M-k}'' means ``press down and hold down the meta key and
25903 the control key and then press @kbd{k}''.  Simple, ay?
25904
25905 This is somewhat complicated by the fact that not all keyboards have a
25906 meta key.  In that case you can use the ``escape'' key.  Then @kbd{M-k}
25907 means ``press escape, release escape, press @kbd{k}''.  That's much more
25908 work than if you have a meta key, so if that's the case, I respectfully
25909 suggest you get a real keyboard with a meta key.  You can't live without
25910 it.
25911
25912
25913
25914 @node Emacs Lisp
25915 @subsection Emacs Lisp
25916
25917 Emacs is the King of Editors because it's really a Lisp interpreter.
25918 Each and every key you tap runs some Emacs Lisp code snippet, and since
25919 Emacs Lisp is an interpreted language, that means that you can configure
25920 any key to run any arbitrary code.  You just, like, do it.
25921
25922 Gnus is written in Emacs Lisp, and is run as a bunch of interpreted
25923 functions.  (These are byte-compiled for speed, but it's still
25924 interpreted.)  If you decide that you don't like the way Gnus does
25925 certain things, it's trivial to have it do something a different way.
25926 (Well, at least if you know how to write Lisp code.)  However, that's
25927 beyond the scope of this manual, so we are simply going to talk about
25928 some common constructs that you normally use in your @file{.emacs} file
25929 to customize Gnus.
25930
25931 If you want to set the variable @code{gnus-florgbnize} to four (4), you
25932 write the following:
25933
25934 @lisp
25935 (setq gnus-florgbnize 4)
25936 @end lisp
25937
25938 This function (really ``special form'') @code{setq} is the one that can
25939 set a variable to some value.  This is really all you need to know.  Now
25940 you can go and fill your @file{.emacs} file with lots of these to change
25941 how Gnus works.
25942
25943 If you have put that thing in your @file{.emacs} file, it will be read
25944 and @code{eval}ed (which is lisp-ese for ``run'') the next time you
25945 start Emacs.  If you want to change the variable right away, simply say
25946 @kbd{C-x C-e} after the closing parenthesis.  That will @code{eval} the
25947 previous ``form'', which is a simple @code{setq} statement here.
25948
25949 Go ahead---just try it, if you're located at your Emacs.  After you
25950 @kbd{C-x C-e}, you will see @samp{4} appear in the echo area, which
25951 is the return value of the form you @code{eval}ed.
25952
25953 Some pitfalls:
25954
25955 If the manual says ``set @code{gnus-read-active-file} to @code{some}'',
25956 that means:
25957
25958 @lisp
25959 (setq gnus-read-active-file 'some)
25960 @end lisp
25961
25962 On the other hand, if the manual says ``set @code{gnus-nntp-server} to
25963 @samp{nntp.ifi.uio.no}'', that means:
25964
25965 @lisp
25966 (setq gnus-nntp-server "nntp.ifi.uio.no")
25967 @end lisp
25968
25969 So be careful not to mix up strings (the latter) with symbols (the
25970 former).  The manual is unambiguous, but it can be confusing.
25971
25972 @page
25973 @include gnus-faq.texi
25974
25975 @node Index
25976 @chapter Index
25977 @printindex cp
25978
25979 @node Key Index
25980 @chapter Key Index
25981 @printindex ky
25982
25983 @summarycontents
25984 @contents
25985 @bye
25986
25987 @iftex
25988 @iflatex
25989 \end{document}
25990 @end iflatex
25991 @end iftex
25992
25993 @c Local Variables:
25994 @c mode: texinfo
25995 @c coding: iso-8859-1
25996 @c End:
25997 % LocalWords:  BNF mucho detailmenu cindex kindex kbd
25998 % LocalWords:  findex Gnusae vindex dfn dfn samp nntp setq nnspool nntpserver
25999 % LocalWords:  nnmbox newusers Blllrph NEWGROUPS dingnusdingnusdingnus
26000 % LocalWords:  pre fab rec comp nnslashdot regex ga ga sci nnml nnbabyl nnmh
26001 % LocalWords:  nnfolder emph looong eld newsreaders defun init elc pxref