*** empty log message ***
[gnus] / texi / gnus.texi
1 \input texinfo                  @c -*-texinfo-*-
2
3 @setfilename gnus
4 @settitle Quassia Gnus 0.110 Manual
5 @synindex fn cp
6 @synindex vr cp
7 @synindex pg cp
8 @iftex
9 @finalout
10 @end iftex
11 @setchapternewpage odd
12
13 @iftex
14 @iflatex
15 \documentclass[twoside,a4paper,openright,11pt]{book}
16 \usepackage[latin1]{inputenc}
17 \usepackage{pagestyle}
18 \usepackage{epsfig}
19 \usepackage{bembo}
20
21 \makeindex
22 \begin{document}
23
24 \newcommand{\gnuschaptername}{}
25 \newcommand{\gnussectionname}{}
26
27 \newcommand{\gnusbackslash}{/}
28
29 \newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}}
30 \newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}}
31
32 \newcommand{\gnuskindex}[1]{\index{#1}}
33 \newcommand{\gnusindex}[1]{\index{#1}}
34
35 \newcommand{\gnustt}[1]{{\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}}
36 \newcommand{\gnuscode}[1]{\gnustt{#1}}
37 \newcommand{\gnussamp}[1]{``{\fontencoding{OT1}\fontfamily{pcr}\fontsize{10pt}{10}\selectfont #1}''}
38 \newcommand{\gnuslisp}[1]{\gnustt{#1}}
39 \newcommand{\gnuskbd}[1]{`\gnustt{#1}'}
40 \newcommand{\gnusfile}[1]{`\gnustt{#1}'}
41 \newcommand{\gnusdfn}[1]{\textit{#1}}
42 \newcommand{\gnusi}[1]{\textit{#1}}
43 \newcommand{\gnusstrong}[1]{\textbf{#1}}
44 \newcommand{\gnusemph}[1]{\textit{#1}}
45 \newcommand{\gnusvar}[1]{{\fontsize{10pt}{10}\selectfont\textsl{\textsf{#1}}}}
46 \newcommand{\gnussc}[1]{\textsc{#1}}
47 \newcommand{\gnustitle}[1]{{\huge\textbf{#1}}}
48 \newcommand{\gnusauthor}[1]{{\large\textbf{#1}}}
49
50 \newcommand{\gnusbullet}{{${\bullet}$}}
51 \newcommand{\gnusdollar}{\$}
52 \newcommand{\gnusampersand}{\&}
53 \newcommand{\gnuspercent}{\%}
54 \newcommand{\gnushash}{\#}
55 \newcommand{\gnushat}{\symbol{"5E}}
56 \newcommand{\gnusunderline}{\symbol{"5F}}
57 \newcommand{\gnusnot}{$\neg$}
58 \newcommand{\gnustilde}{\symbol{"7E}}
59 \newcommand{\gnusless}{{$<$}}
60 \newcommand{\gnusgreater}{{$>$}}
61
62 \newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=gnus-head.eps,height=1cm}}}
63 \newcommand{\gnusinteresting}{
64 \marginpar[\mbox{}\hfill\gnushead]{\gnushead}
65 }
66
67 \newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
68
69 \newcommand{\gnuspagechapter}[1]{
70 {\mbox{}}
71 }
72
73 \newdimen{\gnusdimen}
74 \gnusdimen 0pt
75
76 \newcommand{\gnuschapter}[2]{
77 \gnuscleardoublepage
78 \ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi
79 \chapter{#2}
80 \renewcommand{\gnussectionname}{}
81 \renewcommand{\gnuschaptername}{#2}
82 \thispagestyle{empty}
83 \hspace*{-2cm}
84 \begin{picture}(500,500)(0,0)
85 \put(480,350){\makebox(0,0)[tr]{#1}}
86 \put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}}
87 \end{picture}
88 \clearpage
89 }
90
91 \newcommand{\gnusfigure}[3]{
92 \begin{figure}
93 \mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2)
94 #3
95 \end{picture}
96 \caption{#1}
97 \end{figure}
98 }
99
100 \newcommand{\gnusicon}[1]{
101 \marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=tmp/#1-up.ps,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=tmp/#1-up.ps,height=1cm}}}
102 }
103
104 \newcommand{\gnuspicon}[1]{
105 \marginpar[\mbox{}\hfill\epsfig{figure=#1,height=1.5cm}]{\epsfig{figure=#1,height=1.5cm}}
106 }
107
108 \newcommand{\gnusxface}[1]{
109 \marginpar[\mbox{}\hfill\epsfig{figure=#1,height=1cm}]{\epsfig{figure=#1,height=1cm}}
110 }
111
112
113 \newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1}
114
115 \newcommand{\gnussection}[1]{
116 \renewcommand{\gnussectionname}{#1}
117 \section{#1}
118 }
119
120 \newenvironment{codelist}%
121 {\begin{list}{}{
122 }
123 }{\end{list}}
124
125 \newenvironment{kbdlist}%
126 {\begin{list}{}{
127 \labelwidth=0cm
128 }
129 }{\end{list}}
130
131 \newenvironment{dfnlist}%
132 {\begin{list}{}{
133 }
134 }{\end{list}}
135
136 \newenvironment{stronglist}%
137 {\begin{list}{}{
138 }
139 }{\end{list}}
140
141 \newenvironment{samplist}%
142 {\begin{list}{}{
143 }
144 }{\end{list}}
145
146 \newenvironment{varlist}%
147 {\begin{list}{}{
148 }
149 }{\end{list}}
150
151 \newenvironment{emphlist}%
152 {\begin{list}{}{
153 }
154 }{\end{list}}
155
156 \newlength\gnusheadtextwidth
157 \setlength{\gnusheadtextwidth}{\headtextwidth}
158 \addtolength{\gnusheadtextwidth}{1cm}
159
160 \newpagestyle{gnuspreamble}%
161 {
162 {
163 \ifodd\count0
164 {
165 \hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}}
166 }
167 \else
168 {
169 \hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}}
170 }
171 }
172 \fi
173 }
174 }
175 {
176 \ifodd\count0
177 \mbox{} \hfill 
178 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
179 \else
180 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
181 \hfill \mbox{}
182 \fi
183 }
184
185 \newpagestyle{gnusindex}%
186 {
187 {
188 \ifodd\count0
189 {
190 \hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}}
191 }
192 \else
193 {
194 \hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}
195 }
196 \fi
197 }
198 }
199 {
200 \ifodd\count0
201 \mbox{} \hfill 
202 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
203 \else
204 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
205 \hfill \mbox{}
206 \fi
207 }
208
209 \newpagestyle{gnus}%
210 {
211 {
212 \ifodd\count0
213 {
214 \makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}}
215 }
216 \else
217 {
218 \makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}}
219 }
220 \fi
221 }
222 }
223 {
224 \ifodd\count0
225 \mbox{} \hfill 
226 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
227 \else
228 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
229 \hfill \mbox{}
230 \fi
231 }
232
233 \pagenumbering{roman}
234 \pagestyle{gnuspreamble}
235
236 @end iflatex
237 @end iftex
238
239 @iftex
240 @iflatex
241 \begin{titlepage}
242 {
243
244 %\addtolength{\oddsidemargin}{-5cm}
245 %\addtolength{\evensidemargin}{-5cm}
246 \parindent=0cm
247 \addtolength{\textheight}{2cm}
248
249 \gnustitle{\gnustitlename}\\
250 \rule{15cm}{1mm}\\
251 \vfill
252 \hspace*{0cm}\epsfig{figure=gnus-big-logo.eps,height=15cm}
253 \vfill
254 \rule{15cm}{1mm}\\
255 \gnusauthor{by Lars Magne Ingebrigtsen}
256 \newpage
257 }
258
259 \mbox{}
260 \vfill
261
262 \thispagestyle{empty}
263
264 Copyright \copyright{} 1995,96 Free Software Foundation, Inc. 
265
266 Permission is granted to make and distribute verbatim copies of
267 this manual provided the copyright notice and this permission notice
268 are preserved on all copies.
269
270 Permission is granted to copy and distribute modified versions of this
271 manual under the conditions for verbatim copying, provided that the
272 entire resulting derived work is distributed under the terms of a
273 permission notice identical to this one.
274
275 Permission is granted to copy and distribute translations of this manual
276 into another language, under the above conditions for modified versions.
277
278 \newpage
279 \end{titlepage}
280 @end iflatex
281 @end iftex
282
283 @ifinfo
284
285 This file documents Gnus, the GNU Emacs newsreader.
286
287 Copyright (C) 1995,96 Free Software Foundation, Inc.
288
289 Permission is granted to make and distribute verbatim copies of
290 this manual provided the copyright notice and this permission notice
291 are preserved on all copies.
292
293 @ignore
294 Permission is granted to process this file through Tex and print the
295 results, provided the printed document carries copying permission
296 notice identical to this one except for the removal of this paragraph
297 (this paragraph not being relevant to the printed manual).
298
299 @end ignore
300 Permission is granted to copy and distribute modified versions of this
301 manual under the conditions for verbatim copying, provided also that the
302 entire resulting derived work is distributed under the terms of a
303 permission notice identical to this one.
304
305 Permission is granted to copy and distribute translations of this manual
306 into another language, under the above conditions for modified versions.
307 @end ifinfo
308
309 @tex
310
311 @titlepage
312 @title Quassia Gnus 0.110 Manual
313
314 @author by Lars Magne Ingebrigtsen
315 @page
316
317 @vskip 0pt plus 1filll
318 Copyright @copyright{} 1995,96,97 Free Software Foundation, Inc. 
319
320 Permission is granted to make and distribute verbatim copies of
321 this manual provided the copyright notice and this permission notice
322 are preserved on all copies.
323
324 Permission is granted to copy and distribute modified versions of this
325 manual under the conditions for verbatim copying, provided that the
326 entire resulting derived work is distributed under the terms of a
327 permission notice identical to this one.
328
329 Permission is granted to copy and distribute translations of this manual
330 into another language, under the above conditions for modified versions.
331
332 @end titlepage
333 @page
334
335 @end tex
336
337
338 @node Top
339 @top The Gnus Newsreader
340
341 @ifinfo
342
343 You can read news (and mail) from within Emacs by using Gnus.  The news
344 can be gotten by any nefarious means you can think of---@sc{nntp}, local
345 spool or your mbox file.  All at the same time, if you want to push your
346 luck.
347
348 This manual corresponds to Quassia Gnus 0.110.
349
350 @end ifinfo
351
352 @iftex
353
354 @iflatex
355 \tableofcontents
356 \gnuscleardoublepage
357 @end iflatex
358
359 Gnus is the advanced, self-documenting, customizable, extensible
360 unreal-time newsreader for GNU Emacs.  
361
362 Oops.  That sounds oddly familiar, so let's start over again to avoid
363 being accused of plagiarism:
364
365 Gnus is a message-reading laboratory.  It will let you look at just
366 about anything as if it were a newsgroup.  You can read mail with it,
367 you can browse directories with it, you can @code{ftp} with it---you can
368 even read news with it!
369
370 Gnus tries to empower people who read news the same way Emacs empowers
371 people who edit text.  Gnus sets no limits to what the user should be
372 allowed to do.  Users are encouraged to extend Gnus to make it behave
373 like they want it to behave.  A program should not control people;
374 people should be empowered to do what they want by using (or abusing)
375 the program.
376
377 @end iftex
378
379
380 @menu
381 * Starting Up::           Finding news can be a pain.
382 * The Group Buffer::      Selecting, subscribing and killing groups.
383 * The Summary Buffer::    Reading, saving and posting articles.
384 * The Article Buffer::    Displaying and handling articles.
385 * Composing Messages::    Information on sending mail and news.
386 * Select Methods::        Gnus reads all messages from various select methods.
387 * Scoring::               Assigning values to articles.
388 * Various::               General purpose settings.
389 * The End::               Farewell and goodbye.
390 * Appendices::            Terminology, Emacs intro, FAQ, History, Internals.
391 * Index::                 Variable, function and concept index.
392 * Key Index::             Key Index.
393 @end menu
394
395 @node Starting Up
396 @chapter Starting Gnus
397 @cindex starting up
398
399 @kindex M-x gnus
400 @findex gnus
401 If your system administrator has set things up properly, starting Gnus
402 and reading news is extremely easy---you just type @kbd{M-x gnus} in
403 your Emacs. 
404
405 @findex gnus-other-frame
406 @kindex M-x gnus-other-frame
407 If you want to start Gnus in a different frame, you can use the command
408 @kbd{M-x gnus-other-frame} instead.
409
410 If things do not go smoothly at startup, you have to twiddle some
411 variables in your @file{~/.gnus} file.  This file is similar to
412 @file{~/.emacs}, but is read when gnus starts.
413
414 @menu
415 * Finding the News::    Choosing a method for getting news.
416 * The First Time::      What does Gnus do the first time you start it?
417 * The Server is Down::  How can I read my mail then?
418 * Slave Gnusae::        You can have more than one Gnus active at a time.
419 * Fetching a Group::    Starting Gnus just to read a group.
420 * New Groups::          What is Gnus supposed to do with new groups?
421 * Startup Files::       Those pesky startup files---@file{.newsrc}.
422 * Auto Save::           Recovering from a crash.
423 * The Active File::     Reading the active file over a slow line Takes Time.
424 * Changing Servers::    You may want to move from one server to another.
425 * Startup Variables::   Other variables you might change.
426 @end menu
427
428
429 @node Finding the News
430 @section Finding the News
431 @cindex finding news
432
433 @vindex gnus-select-method
434 @c @head
435 The @code{gnus-select-method} variable says where Gnus should look for
436 news.  This variable should be a list where the first element says
437 @dfn{how} and the second element says @dfn{where}.  This method is your
438 native method.  All groups not fetched with this method are
439 foreign groups.
440
441 For instance, if the @samp{news.somewhere.edu} @sc{nntp} server is where
442 you want to get your daily dosage of news from, you'd say:
443
444 @lisp
445 (setq gnus-select-method '(nntp "news.somewhere.edu"))
446 @end lisp
447
448 If you want to read directly from the local spool, say:
449
450 @lisp
451 (setq gnus-select-method '(nnspool ""))
452 @end lisp
453
454 If you can use a local spool, you probably should, as it will almost
455 certainly be much faster.
456
457 @vindex gnus-nntpserver-file
458 @cindex NNTPSERVER
459 @cindex @sc{nntp} server
460 If this variable is not set, Gnus will take a look at the
461 @code{NNTPSERVER} environment variable.  If that variable isn't set,
462 Gnus will see whether @code{gnus-nntpserver-file}
463 (@file{/etc/nntpserver} by default) has any opinions on the matter.  If
464 that fails as well, Gnus will try to use the machine running Emacs as an @sc{nntp} server.  That's a long shot, though.
465
466 @vindex gnus-nntp-server
467 If @code{gnus-nntp-server} is set, this variable will override
468 @code{gnus-select-method}.  You should therefore set
469 @code{gnus-nntp-server} to @code{nil}, which is what it is by default.
470
471 @vindex gnus-secondary-servers
472 You can also make Gnus prompt you interactively for the name of an
473 @sc{nntp} server.  If you give a non-numerical prefix to @code{gnus}
474 (i.e., @kbd{C-u M-x gnus}), Gnus will let you choose between the servers
475 in the @code{gnus-secondary-servers} list (if any).  You can also just
476 type in the name of any server you feel like visiting.
477
478 @findex gnus-group-browse-foreign-server
479 @kindex B (Group)
480 However, if you use one @sc{nntp} server regularly and are just
481 interested in a couple of groups from a different server, you would be
482 better served by using the @kbd{B} command in the group buffer.  It will
483 let you have a look at what groups are available, and you can subscribe
484 to any of the groups you want to.  This also makes @file{.newsrc}
485 maintenance much tidier.  @xref{Foreign Groups}.
486
487 @vindex gnus-secondary-select-methods
488 @c @head
489 A slightly different approach to foreign groups is to set the
490 @code{gnus-secondary-select-methods} variable.  The select methods
491 listed in this variable are in many ways just as native as the
492 @code{gnus-select-method} server.  They will also be queried for active
493 files during startup (if that's required), and new newsgroups that
494 appear on these servers will be subscribed (or not) just as native
495 groups are.
496
497 For instance, if you use the @code{nnmbox} backend to read your mail, you
498 would typically set this variable to
499
500 @lisp
501 (setq gnus-secondary-select-methods '((nnmbox "")))
502 @end lisp
503
504
505 @node The First Time
506 @section The First Time
507 @cindex first time usage
508
509 If no startup files exist, Gnus will try to determine what groups should
510 be subscribed by default.
511
512 @vindex gnus-default-subscribed-newsgroups
513 If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus
514 will subscribe you to just those groups in that list, leaving the rest
515 killed.  Your system administrator should have set this variable to
516 something useful.
517
518 Since she hasn't, Gnus will just subscribe you to a few arbitrarily
519 picked groups (i.e., @samp{*.newusers}).  (@dfn{Arbitrary} is defined
520 here as @dfn{whatever Lars thinks you should read}.)
521
522 You'll also be subscribed to the Gnus documentation group, which should
523 help you with most common problems.  
524
525 If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will just
526 use the normal functions for handling new groups, and not do anything
527 special.
528
529
530 @node The Server is Down
531 @section The Server is Down
532 @cindex server errors
533
534 If the default server is down, Gnus will understandably have some
535 problems starting.  However, if you have some mail groups in addition to
536 the news groups, you may want to start Gnus anyway.
537
538 Gnus, being the trusting sort of program, will ask whether to proceed
539 without a native select method if that server can't be contacted.  This
540 will happen whether the server doesn't actually exist (i.e., you have
541 given the wrong address) or the server has just momentarily taken ill
542 for some reason or other.  If you decide to continue and have no foreign
543 groups, you'll find it difficult to actually do anything in the group
544 buffer.  But, hey, that's your problem.  Blllrph!
545
546 @findex gnus-no-server
547 @kindex M-x gnus-no-server
548 @c @head
549 If you know that the server is definitely down, or you just want to read
550 your mail without bothering with the server at all, you can use the
551 @code{gnus-no-server} command to start Gnus.  That might come in handy
552 if you're in a hurry as well.  This command will not attempt to contact
553 your primary server---instead, it will just activate all groups on level
554 1 and 2.  (You should preferably keep no native groups on those two
555 levels.)
556
557
558 @node Slave Gnusae
559 @section Slave Gnusae
560 @cindex slave
561
562 You might want to run more than one Emacs with more than one Gnus at the
563 same time.  If you are using different @file{.newsrc} files (e.g., if you
564 are using the two different Gnusae to read from two different servers),
565 that is no problem whatsoever.  You just do it.
566
567 The problem appears when you want to run two Gnusae that use the same
568 @code{.newsrc} file.
569
570 To work around that problem some, we here at the Think-Tank at the Gnus
571 Towers have come up with a new concept: @dfn{Masters} and
572 @dfn{slaves}.  (We have applied for a patent on this concept, and have
573 taken out a copyright on those words.  If you wish to use those words in
574 conjunction with each other, you have to send $1 per usage instance to
575 me.  Usage of the patent (@dfn{Master/Slave Relationships In Computer
576 Applications}) will be much more expensive, of course.)
577
578 Anyways, you start one Gnus up the normal way with @kbd{M-x gnus} (or
579 however you do it).  Each subsequent slave Gnusae should be started with
580 @kbd{M-x gnus-slave}.  These slaves won't save normal @file{.newsrc}
581 files, but instead save @dfn{slave files} that contain information only
582 on what groups have been read in the slave session.  When a master Gnus
583 starts, it will read (and delete) these slave files, incorporating all
584 information from them.  (The slave files will be read in the sequence
585 they were created, so the latest changes will have precedence.)
586
587 Information from the slave files has, of course, precedence over the
588 information in the normal (i.e., master) @code{.newsrc} file.
589
590
591 @node Fetching a Group
592 @section Fetching a Group
593 @cindex fetching a group
594
595 @findex gnus-fetch-group
596 It is sometimes convenient to be able to just say ``I want to read this
597 group and I don't care whether Gnus has been started or not''.  This is
598 perhaps more useful for people who write code than for users, but the
599 command @code{gnus-fetch-group} provides this functionality in any case.
600 It takes the group name as a parameter.
601
602
603 @node New Groups
604 @section New Groups
605 @cindex new groups
606 @cindex subscription
607
608 @vindex gnus-check-new-newsgroups
609 If you are satisfied that you really never want to see any new groups,
610 you can set @code{gnus-check-new-newsgroups} to @code{nil}.  This will
611 also save you some time at startup.  Even if this variable is
612 @code{nil}, you can always subscribe to the new groups just by pressing
613 @kbd{U} in the group buffer (@pxref{Group Maintenance}).  This variable
614 is @code{ask-server} by default.  If you set this variable to
615 @code{always}, then Gnus will query the backends for new groups even
616 when you do the @kbd{g} command (@pxref{Scanning New Messages}).
617
618 @menu
619 * Checking New Groups::      Determining what groups are new.
620 * Subscription Methods::     What Gnus should do with new groups.
621 * Filtering New Groups::     Making Gnus ignore certain new groups.
622 @end menu
623
624
625 @node Checking New Groups
626 @subsection Checking New Groups
627
628 Gnus normally determines whether a group is new or not by comparing the
629 list of groups from the active file(s) with the lists of subscribed and
630 dead groups.  This isn't a particularly fast method.  If
631 @code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask the
632 server for new groups since the last time.  This is both faster and
633 cheaper.  This also means that you can get rid of the list of killed
634 groups altogether, so you may set @code{gnus-save-killed-list} to
635 @code{nil}, which will save time both at startup, at exit, and all over.
636 Saves disk space, too.  Why isn't this the default, then?
637 Unfortunately, not all servers support this command. 
638
639 I bet I know what you're thinking now: How do I find out whether my
640 server supports @code{ask-server}?  No?  Good, because I don't have a
641 fail-safe answer.  I would suggest just setting this variable to
642 @code{ask-server} and see whether any new groups appear within the next
643 few days.  If any do, then it works.  If none do, then it doesn't
644 work.  I could write a function to make Gnus guess whether the server
645 supports @code{ask-server}, but it would just be a guess.  So I won't.
646 You could @code{telnet} to the server and say @code{HELP} and see
647 whether it lists @samp{NEWGROUPS} among the commands it understands.  If
648 it does, then it might work.  (But there are servers that lists
649 @samp{NEWGROUPS} without supporting the function properly.)
650
651 This variable can also be a list of select methods.  If so, Gnus will
652 issue an @code{ask-server} command to each of the select methods, and
653 subscribe them (or not) using the normal methods.  This might be handy
654 if you are monitoring a few servers for new groups.  A side effect is
655 that startup will take much longer, so you can meditate while waiting.
656 Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss.
657
658
659 @node Subscription Methods
660 @subsection Subscription Methods
661
662 @vindex gnus-subscribe-newsgroup-method
663 What Gnus does when it encounters a new group is determined by the
664 @code{gnus-subscribe-newsgroup-method} variable.
665
666 This variable should contain a function.  This function will be called
667 with the name of the new group as the only parameter.
668
669 Some handy pre-fab functions are:
670
671 @table @code
672
673 @item gnus-subscribe-zombies
674 @vindex gnus-subscribe-zombies
675 Make all new groups zombies.  This is the default.  You can browse the
676 zombies later (with @kbd{A z}) and either kill them all off properly
677 (with @kbd{S z}), or subscribe to them (with @kbd{u}).
678
679 @item gnus-subscribe-randomly
680 @vindex gnus-subscribe-randomly
681 Subscribe all new groups in arbitrary order.  This really means that all
682 new groups will be added at ``the top'' of the grop buffer.
683
684 @item gnus-subscribe-alphabetically
685 @vindex gnus-subscribe-alphabetically
686 Subscribe all new groups in alphabetical order.
687
688 @item gnus-subscribe-hierarchically
689 @vindex gnus-subscribe-hierarchically
690 Subscribe all new groups hierarchically.  The difference between this
691 function and @code{gnus-subscribe-alphabetically} is slight.
692 @code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly
693 alphabetical fashion, while this function will enter groups into it's
694 hierarchy.  So if you want to have the @samp{rec} hierarchy before the
695 @samp{comp} hierarchy, this function will not mess that configuration
696 up.  Or something like that.
697
698 @item gnus-subscribe-interactively
699 @vindex gnus-subscribe-interactively
700 Subscribe new groups interactively.  This means that Gnus will ask
701 you about @strong{all} new groups.  The groups you choose to subscribe
702 to will be subscribed hierarchically.
703
704 @item gnus-subscribe-killed
705 @vindex gnus-subscribe-killed
706 Kill all new groups.
707
708 @end table
709
710 @vindex gnus-subscribe-hierarchical-interactive
711 A closely related variable is
712 @code{gnus-subscribe-hierarchical-interactive}.  (That's quite a
713 mouthful.)  If this variable is non-@code{nil}, Gnus will ask you in a
714 hierarchical fashion whether to subscribe to new groups or not.  Gnus
715 will ask you for each sub-hierarchy whether you want to descend the
716 hierarchy or not.  
717
718 One common mistake is to set the variable a few paragraphs above
719 (@code{gnus-subscribe-newsgroup-method}) to
720 @code{gnus-subscribe-hierarchical-interactive}.  This is an error.  This
721 will not work.  This is ga-ga.  So don't do it.
722
723
724 @node Filtering New Groups
725 @subsection Filtering New Groups
726
727 A nice and portable way to control which new newsgroups should be
728 subscribed (or ignored) is to put an @dfn{options} line at the start of
729 the @file{.newsrc} file.  Here's an example:
730
731 @example
732 options -n !alt.all !rec.all sci.all
733 @end example
734
735 @vindex gnus-subscribe-options-newsgroup-method
736 This line obviously belongs to a serious-minded intellectual scientific
737 person (or she may just be plain old boring), because it says that all
738 groups that have names beginning with @samp{alt} and @samp{rec} should
739 be ignored, and all groups with names beginning with @samp{sci} should
740 be subscribed.  Gnus will not use the normal subscription method for
741 subscribing these groups.
742 @code{gnus-subscribe-options-newsgroup-method} is used instead.  This
743 variable defaults to @code{gnus-subscribe-alphabetically}.
744
745 @vindex gnus-options-not-subscribe
746 @vindex gnus-options-subscribe
747 If you don't want to mess with your @file{.newsrc} file, you can just
748 set the two variables @code{gnus-options-subscribe} and
749 @code{gnus-options-not-subscribe}.  These two variables do exactly the
750 same as the @file{.newsrc} @samp{options -n} trick.  Both are regexps,
751 and if the new group matches the former, it will be unconditionally
752 subscribed, and if it matches the latter, it will be ignored.
753
754 @vindex gnus-auto-subscribed-groups
755 Yet another variable that meddles here is
756 @code{gnus-auto-subscribed-groups}.  It works exactly like
757 @code{gnus-options-subscribe}, and is therefore really superfluous, but I
758 thought it would be nice to have two of these.  This variable is more
759 meant for setting some ground rules, while the other variable is used
760 more for user fiddling.  By default this variable makes all new groups
761 that come from mail backends (@code{nnml}, @code{nnbabyl},
762 @code{nnfolder}, @code{nnmbox}, and @code{nnmh}) subscribed.  If you
763 don't like that, just set this variable to @code{nil}.
764
765 New groups that match this regexp are subscribed using
766 @code{gnus-subscribe-options-newsgroup-method}.
767
768
769 @node Changing Servers
770 @section Changing Servers
771 @cindex changing servers
772
773 Sometimes it is necessary to move from one @sc{nntp} server to another.
774 This happens very rarely, but perhaps you change jobs, or one server is
775 very flaky and you want to use another.  
776
777 Changing the server is pretty easy, right?  You just change
778 @code{gnus-select-method} to point to the new server?  
779
780 @emph{Wrong!}
781
782 Article numbers are not (in any way) kept synchronized between different
783 @sc{nntp} servers, and the only way Gnus keeps track of what articles
784 you have read is by keeping track of article numbers.  So when you
785 change @code{gnus-select-method}, your @file{.newsrc} file becomes
786 worthless.  
787
788 Gnus provides a few functions to attempt to translate a @file{.newsrc}
789 file from one server to another.  They all have one thing in
790 common---they take a looong time to run.  You don't want to use these
791 functions more than absolutely necessary.
792
793 @kindex M-x gnus-change-server
794 @findex gnus-change-server
795 If you have access to both servers, Gnus can request the headers for all
796 the articles you have read and compare @code{Message-ID}s and map the
797 article numbers of the read articles and article marks.  The @kbd{M-x
798 gnus-change-server} command will do this for all your native groups.  It
799 will prompt for the method you want to move to.
800
801 @kindex M-x gnus-group-move-group-to-server
802 @findex gnus-group-move-group-to-server
803 You can also move individual groups with the @kbd{M-x
804 gnus-group-move-group-to-server} command.  This is useful if you want to
805 move a (foreign) group from one server to another.
806
807 @kindex M-x gnus-group-clear-data-on-native-groups
808 @findex gnus-group-clear-data-on-native-groups
809 If you don't have access to both the old and new server, all your marks
810 and read ranges have become worthless.  You can use the @kbd{M-x
811 gnus-group-clear-data-on-native-groups} command to clear out all data
812 that you have on your native groups.  Use with caution.
813
814
815 @node Startup Files
816 @section Startup Files
817 @cindex startup files
818 @cindex .newsrc
819 @cindex .newsrc.el
820 @cindex .newsrc.eld
821
822 Now, you all know about the @file{.newsrc} file.  All subscription
823 information is traditionally stored in this file.
824
825 Things got a bit more complicated with @sc{gnus}.  In addition to
826 keeping the @file{.newsrc} file updated, it also used a file called
827 @file{.newsrc.el} for storing all the information that didn't fit into
828 the @file{.newsrc} file.  (Actually, it also duplicated everything in
829 the @file{.newsrc} file.)  @sc{gnus} would read whichever one of these
830 files was the most recently saved, which enabled people to swap between
831 @sc{gnus} and other newsreaders.
832
833 That was kinda silly, so Gnus went one better: In addition to the
834 @file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called
835 @file{.newsrc.eld}.  It will read whichever of these files that are most
836 recent, but it will never write a @file{.newsrc.el} file.  You should
837 never delete the @file{.newsrc.eld} file---it contains much information
838 not stored in the @file{.newsrc} file.
839
840 @vindex gnus-save-newsrc-file
841 You can turn off writing the @file{.newsrc} file by setting
842 @code{gnus-save-newsrc-file} to @code{nil}, which means you can delete
843 the file and save some space, as well as making exit from Gnus faster.
844 However, this will make it impossible to use other newsreaders than
845 Gnus.  But hey, who would want to, right?
846
847 @vindex gnus-save-killed-list
848 If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus
849 will not save the list of killed groups to the startup file.  This will
850 save both time (when starting and quitting) and space (on disk).  It
851 will also mean that Gnus has no record of what groups are new or old,
852 so the automatic new groups subscription methods become meaningless.
853 You should always set @code{gnus-check-new-newsgroups} to @code{nil} or
854 @code{ask-server} if you set this variable to @code{nil} (@pxref{New
855 Groups}).  This variable can also be a regular expression.  If that's
856 the case, remove all groups that do not match this regexp before
857 saving.  This can be useful in certain obscure situations that involve
858 several servers where not all servers support @code{ask-server}.
859
860 @vindex gnus-startup-file
861 The @code{gnus-startup-file} variable says where the startup files are.
862 The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup
863 file being whatever that one is, with a @samp{.eld} appended.
864
865 @vindex gnus-save-newsrc-hook
866 @vindex gnus-save-quick-newsrc-hook
867 @vindex gnus-save-standard-newsrc-hook
868 @code{gnus-save-newsrc-hook} is called before saving any of the newsrc
869 files, while @code{gnus-save-quick-newsrc-hook} is called just before
870 saving the @file{.newsrc.eld} file, and
871 @code{gnus-save-standard-newsrc-hook} is called just before saving the
872 @file{.newsrc} file.  The latter two are commonly used to turn version
873 control on or off.  Version control is on by default when saving the
874 startup files.  If you want to turn backup creation off, say something like: 
875
876 @lisp
877 (defun turn-off-backup ()
878   (set (make-local-variable 'backup-inhibited) t))
879
880 (add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup)
881 (add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup)
882 @end lisp
883
884 @vindex gnus-init-file
885 When Gnus starts, it will read the @code{gnus-site-init-file}
886 (@file{.../site-lisp/gnus} by default) and @code{gnus-init-file}
887 (@file{~/.gnus} by default) files.  These are normal Emacs Lisp files
888 and can be used to avoid cluttering your @file{~/.emacs} and
889 @file{site-init} files with Gnus stuff.  Gnus will also check for files
890 with the same names as these, but with @file{.elc} and @file{.el}
891 suffixes.  In other words, if you have set @code{gnus-init-file} to
892 @file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el},
893 and finally @file{~/.gnus} (in this order).
894
895
896
897 @node Auto Save
898 @section Auto Save
899 @cindex dribble file
900 @cindex auto-save
901
902 Whenever you do something that changes the Gnus data (reading articles,
903 catching up, killing/subscribing groups), the change is added to a
904 special @dfn{dribble buffer}.  This buffer is auto-saved the normal
905 Emacs way.  If your Emacs should crash before you have saved the
906 @file{.newsrc} files, all changes you have made can be recovered from
907 this file.
908
909 If Gnus detects this file at startup, it will ask the user whether to
910 read it.  The auto save file is deleted whenever the real startup file is
911 saved.
912
913 @vindex gnus-use-dribble-file
914 If @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create and
915 maintain a dribble buffer.  The default is @code{t}.
916
917 @vindex gnus-dribble-directory
918 Gnus will put the dribble file(s) in @code{gnus-dribble-directory}.  If
919 this variable is @code{nil}, which it is by default, Gnus will dribble
920 into the directory where the @file{.newsrc} file is located.  (This is
921 normally the user's home directory.)  The dribble file will get the same
922 file permissions as the @code{.newsrc} file.
923
924
925 @node The Active File
926 @section The Active File
927 @cindex active file
928 @cindex ignored groups
929
930 When Gnus starts, or indeed whenever it tries to determine whether new
931 articles have arrived, it reads the active file.  This is a very large
932 file that lists all the active groups and articles on the server.
933
934 @vindex gnus-ignored-newsgroups
935 Before examining the active file, Gnus deletes all lines that match the
936 regexp @code{gnus-ignored-newsgroups}.  This is done primarily to reject
937 any groups with bogus names, but you can use this variable to make Gnus
938 ignore hierarchies you aren't ever interested in.  However, this is not
939 recommended.  In fact, it's highly discouraged.  Instead, @pxref{New
940 Groups} for an overview of other variables that can be used instead.
941
942 @c This variable is
943 @c @code{nil} by default, and will slow down active file handling somewhat
944 @c if you set it to anything else.
945
946 @vindex gnus-read-active-file
947 @c @head
948 The active file can be rather Huge, so if you have a slow network, you
949 can set @code{gnus-read-active-file} to @code{nil} to prevent Gnus from
950 reading the active file.  This variable is @code{some} by default.
951
952 Gnus will try to make do by getting information just on the groups that
953 you actually subscribe to.
954
955 Note that if you subscribe to lots and lots of groups, setting this
956 variable to @code{nil} will probably make Gnus slower, not faster.  At
957 present, having this variable @code{nil} will slow Gnus down
958 considerably, unless you read news over a 2400 baud modem.  
959
960 This variable can also have the value @code{some}.  Gnus will then
961 attempt to read active info only on the subscribed groups.  On some
962 servers this is quite fast (on sparkling, brand new INN servers that
963 support the @code{LIST ACTIVE group} command), on others this isn't fast
964 at all.  In any case, @code{some} should be faster than @code{nil}, and
965 is certainly faster than @code{t} over slow lines.
966
967 If this variable is @code{nil}, Gnus will ask for group info in total
968 lock-step, which isn't very fast.  If it is @code{some} and you use an
969 @sc{nntp} server, Gnus will pump out commands as fast as it can, and
970 read all the replies in one swoop.  This will normally result in better
971 performance, but if the server does not support the aforementioned
972 @code{LIST ACTIVE group} command, this isn't very nice to the server.
973
974 In any case, if you use @code{some} or @code{nil}, you should definitely
975 kill all groups that you aren't interested in to speed things up.
976
977 Note that this variable also affects active file retrieval from
978 secondary select methods.
979
980
981 @node Startup Variables
982 @section Startup Variables
983
984 @table @code
985
986 @item gnus-load-hook
987 @vindex gnus-load-hook
988 A hook run while Gnus is being loaded.  Note that this hook will
989 normally be run just once in each Emacs session, no matter how many
990 times you start Gnus.
991
992 @item gnus-before-startup-hook
993 @vindex gnus-before-startup-hook
994 A hook run after starting up Gnus successfully.
995
996 @item gnus-startup-hook
997 @vindex gnus-startup-hook
998 A hook run as the very last thing after starting up Gnus
999
1000 @item gnus-started-hook
1001 @vindex gnus-started-hook
1002 A hook that is run as the very last thing after starting up Gnus
1003 successfully.
1004
1005 @item gnus-started-hook
1006 @vindex gnus-started-hook
1007 A hook that is run after reading the @file{.newsrc} file(s), but before
1008 generating the group buffer.
1009
1010 @item gnus-check-bogus-newsgroups
1011 @vindex gnus-check-bogus-newsgroups
1012 If non-@code{nil}, Gnus will check for and delete all bogus groups at
1013 startup.  A @dfn{bogus group} is a group that you have in your
1014 @file{.newsrc} file, but doesn't exist on the news server.  Checking for
1015 bogus groups can take quite a while, so to save time and resources it's
1016 best to leave this option off, and do the checking for bogus groups once
1017 in a while from the group buffer instead (@pxref{Group Maintenance}).
1018
1019 @item gnus-inhibit-startup-message
1020 @vindex gnus-inhibit-startup-message
1021 If non-@code{nil}, the startup message won't be displayed.  That way,
1022 your boss might not notice as easily that you are reading news instead
1023 of doing your job.  Note that this variable is used before
1024 @file{.gnus.el} is loaded, so it should be set in @code{.emacs} instead.
1025
1026 @item gnus-no-groups-message
1027 @vindex gnus-no-groups-message
1028 Message displayed by Gnus when no groups are available.
1029
1030 @item gnus-play-startup-jingle
1031 @vindex gnus-play-startup-jingle
1032 If non-@code{nil}, play the Gnus jingle at startup.
1033
1034 @item gnus-startup-jingle
1035 @vindex gnus-startup-jingle
1036 Jingle to be played if the above variable is non-@code{nil}.  The
1037 default is @samp{Tuxedomoon.Jingle4.au}.
1038
1039 @end table
1040
1041
1042 @node The Group Buffer
1043 @chapter The Group Buffer
1044 @cindex group buffer
1045
1046 The @dfn{group buffer} lists all (or parts) of the available groups.  It
1047 is the first buffer shown when Gnus starts, and will never be killed as
1048 long as Gnus is active.
1049
1050 @iftex
1051 @iflatex
1052 \gnusfigure{The Group Buffer}{320}{
1053 \put(75,50){\epsfig{figure=tmp/group.ps,height=9cm}}
1054 \put(120,37){\makebox(0,0)[t]{Buffer name}}
1055 \put(120,38){\vector(1,2){10}}
1056 \put(40,60){\makebox(0,0)[r]{Mode line}}
1057 \put(40,58){\vector(1,0){30}}
1058 \put(200,28){\makebox(0,0)[t]{Native select method}}
1059 \put(200,26){\vector(-1,2){15}}
1060 }
1061 @end iflatex
1062 @end iftex
1063
1064 @menu
1065 * Group Buffer Format::    Information listed and how you can change it.
1066 * Group Maneuvering::      Commands for moving in the group buffer.
1067 * Selecting a Group::      Actually reading news.
1068 * Group Data::             Changing the info for a group.
1069 * Subscription Commands::  Unsubscribing, killing, subscribing.
1070 * Group Levels::           Levels? What are those, then?
1071 * Group Score::            A mechanism for finding out what groups you like.
1072 * Marking Groups::         You can mark groups for later processing.
1073 * Foreign Groups::         Creating and editing groups.
1074 * Group Parameters::       Each group may have different parameters set.
1075 * Listing Groups::         Gnus can list various subsets of the groups.
1076 * Sorting Groups::         Re-arrange the group order.
1077 * Group Maintenance::      Maintaining a tidy @file{.newsrc} file.
1078 * Browse Foreign Server::  You can browse a server.  See what it has to offer.
1079 * Exiting Gnus::           Stop reading news and get some work done.
1080 * Group Topics::           A folding group mode divided into topics.
1081 * Misc Group Stuff::       Other stuff that you can to do.
1082 @end menu
1083
1084
1085 @node Group Buffer Format
1086 @section Group Buffer Format
1087
1088 @menu 
1089 * Group Line Specification::       Deciding how the group buffer is to look.
1090 * Group Modeline Specification::   The group buffer modeline.
1091 * Group Highlighting::             Having nice colors in the group buffer.
1092 @end menu
1093
1094
1095 @node Group Line Specification
1096 @subsection Group Line Specification
1097 @cindex group buffer format
1098
1099 The default format of the group buffer is nice and dull, but you can
1100 make it as exciting and ugly as you feel like.
1101
1102 Here's a couple of example group lines:
1103
1104 @example
1105      25: news.announce.newusers
1106  *    0: alt.fan.andrea-dworkin
1107 @end example
1108
1109 Quite simple, huh?
1110
1111 You can see that there are 25 unread articles in
1112 @samp{news.announce.newusers}.  There are no unread articles, but some
1113 ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little
1114 asterisk at the beginning of the line?).
1115
1116 @vindex gnus-group-line-format
1117 You can change that format to whatever you want by fiddling with the
1118 @code{gnus-group-line-format} variable.  This variable works along the
1119 lines of a @code{format} specification, which is pretty much the same as
1120 a @code{printf} specifications, for those of you who use (feh!) C.
1121 @xref{Formatting Variables}. 
1122
1123 @samp{%M%S%5y: %(%g%)\n} is the value that produced those lines above.
1124
1125 There should always be a colon on the line; the cursor always moves to
1126 the colon after performing an operation.  Nothing else is required---not
1127 even the group name.  All displayed text is just window dressing, and is
1128 never examined by Gnus.  Gnus stores all real information it needs using
1129 text properties.
1130
1131 (Note that if you make a really strange, wonderful, spreadsheet-like
1132 layout, everybody will believe you are hard at work with the accounting
1133 instead of wasting time reading news.)
1134
1135 Here's a list of all available format characters:
1136
1137 @table @samp
1138
1139 @item M    
1140 An asterisk if the group only has marked articles.
1141
1142 @item S
1143 Whether the group is subscribed.
1144
1145 @item L    
1146 Level of subscribedness.
1147
1148 @item N
1149 Number of unread articles.
1150
1151 @item I
1152 Number of dormant articles.
1153
1154 @item T
1155 Number of ticked articles.
1156
1157 @item R
1158 Number of read articles.
1159
1160 @item t
1161 Estimated total number of articles.  (This is really @var{max-number}
1162 minus @var{min-number} plus 1.)
1163
1164 @item y
1165 Number of unread, unticked, non-dormant articles.
1166
1167 @item i
1168 Number of ticked and dormant articles.
1169
1170 @item g
1171 Full group name.
1172
1173 @item G
1174 Group name.
1175
1176 @item D
1177 Newsgroup description.
1178
1179 @item o
1180 @samp{m} if moderated.
1181
1182 @item O
1183 @samp{(m)} if moderated.
1184
1185 @item s
1186 Select method.
1187
1188 @item n
1189 Select from where.
1190
1191 @item z
1192 A string that looks like @samp{<%s:%n>} if a foreign select method is
1193 used.
1194
1195 @item P
1196 Indentation based on the level of the topic (@pxref{Group Topics}). 
1197
1198 @item c
1199 @vindex gnus-group-uncollapsed-levels
1200 Short (collapsed) group name.  The @code{gnus-group-uncollapsed-levels}
1201 variable says how many levels to leave at the end of the group name.
1202 The default is 1---this will mean that group names like
1203 @samp{gnu.emacs.gnus} will be shortened to @samp{g.emacs.gnus}.
1204
1205 @item m
1206 @vindex gnus-new-mail-mark
1207 @cindex %
1208 @samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail to
1209 the group lately.
1210
1211 @item d
1212 A string that says when you last read the group (@pxref{Group
1213 Timestamp}). 
1214
1215 @item u
1216 User defined specifier.  The next character in the format string should
1217 be a letter.  Gnus will call the function
1218 @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
1219 following @samp{%u}.  The function will be passed a single dummy
1220 parameter as argument.  The function should return a string, which will
1221 be inserted into the buffer just like information from any other
1222 specifier.
1223 @end table
1224
1225 @cindex *
1226 All the ``number-of'' specs will be filled with an asterisk (@samp{*})
1227 if no info is available---for instance, if it is a non-activated foreign
1228 group, or a bogus native group.
1229
1230
1231 @node Group Modeline Specification
1232 @subsection Group Modeline Specification
1233 @cindex group modeline
1234
1235 @vindex gnus-group-mode-line-format
1236 The mode line can be changed by setting
1237 @code{gnus-group-mode-line-format} (@pxref{Formatting Variables}).  It
1238 doesn't understand that many format specifiers:
1239
1240 @table @samp
1241 @item S
1242 The native news server.
1243 @item M
1244 The native select method.
1245 @end table
1246
1247
1248 @node Group Highlighting
1249 @subsection Group Highlighting
1250 @cindex highlighting
1251 @cindex group highlighting
1252
1253 @vindex gnus-group-highlight
1254 Highlighting in the group buffer is controlled by the
1255 @code{gnus-group-highlight} variable.  This is an alist with elements
1256 that look like @var{(form . face)}.  If @var{form} evaluates to
1257 something non-@code{nil}, the @var{face} will be used on the line.
1258
1259 Here's an example value for this variable that might look nice if the
1260 background is dark:
1261
1262 @lisp
1263 (face-spec-set 'my-group-face-1 '((t (:foreground "Red" :bold t))))
1264 (face-spec-set 'my-group-face-2 '((t (:foreground "SeaGreen" :bold t))))
1265 (face-spec-set 'my-group-face-3 '((t (:foreground "SpringGreen" :bold t))))
1266 (face-spec-set 'my-group-face-4 '((t (:foreground "SteelBlue" :bold t))))
1267 (face-spec-set 'my-group-face-5 '((t (:foreground "SkyBlue" :bold t))))
1268
1269 (setq gnus-group-highlight
1270       '(((> unread 200) . my-group-face-1)
1271         ((and (< level 3) (zerop unread)) . my-group-face-2)
1272         ((< level 3) . my-group-face-3)
1273         ((zerop unread) . my-group-face-4)
1274 (setq gnus-group-highlight
1275       `(((> unread 200) . 
1276          ,(custom-face-lookup "Red" nil nil t nil nil))
1277         ((and (< level 3) (zerop unread)) . 
1278          ,(custom-face-lookup "SeaGreen" nil nil t nil nil))
1279         ((< level 3) . 
1280          ,(custom-face-lookup "SpringGreen" nil nil t nil nil))
1281         ((zerop unread) . 
1282          ,(custom-face-lookup "SteelBlue" nil nil t nil nil))
1283         (t . 
1284          ,(custom-face-lookup "SkyBlue" nil nil t nil nil))))
1285         (t . my-group-face-5)))
1286 @end lisp
1287
1288 Variables that are dynamically bound when the forms are evaluated
1289 include:
1290
1291 @table @code
1292 @item group
1293 The group name.
1294 @item unread
1295 The number of unread articles in the group.
1296 @item method
1297 The select method.
1298 @item mailp
1299 Whether the group is a mail group.
1300 @item level
1301 The level of the group.
1302 @item score
1303 The score of the group.
1304 @item ticked 
1305 The number of ticked articles in the group.
1306 @item total
1307 The total number of articles in the group.  Or rather, MAX-NUMBER minus
1308 MIN-NUMBER plus one.
1309 @item topic
1310 When using the topic minor mode, this variable is bound to the current
1311 topic being inserted.
1312 @end table
1313
1314 When the forms are @code{eval}ed, point is at the beginning of the line
1315 of the group in question, so you can use many of the normal Gnus
1316 functions for snarfing info on the group.
1317
1318 @vindex gnus-group-update-hook
1319 @findex gnus-group-highlight-line
1320 @code{gnus-group-update-hook} is called when a group line is changed.
1321 It will not be called when @code{gnus-visual} is @code{nil}.  This hook
1322 calls @code{gnus-group-highlight-line} by default.
1323
1324
1325 @node Group Maneuvering
1326 @section Group Maneuvering
1327 @cindex group movement
1328
1329 All movement commands understand the numeric prefix and will behave as
1330 expected, hopefully. 
1331
1332 @table @kbd
1333
1334 @item n
1335 @kindex n (Group)
1336 @findex gnus-group-next-unread-group
1337 Go to the next group that has unread articles
1338 (@code{gnus-group-next-unread-group}).
1339
1340 @item p
1341 @itemx DEL
1342 @kindex DEL (Group)
1343 @kindex p (Group)
1344 @findex gnus-group-prev-unread-group
1345 Go to the previous group that has unread articles
1346 (@code{gnus-group-prev-unread-group}).
1347
1348 @item N
1349 @kindex N (Group)
1350 @findex gnus-group-next-group
1351 Go to the next group (@code{gnus-group-next-group}).
1352
1353 @item P
1354 @kindex P (Group)
1355 @findex gnus-group-prev-group
1356 Go to the previous group (@code{gnus-group-prev-group}).
1357
1358 @item M-p
1359 @kindex M-p (Group)
1360 @findex gnus-group-next-unread-group-same-level
1361 Go to the next unread group on the same (or lower) level
1362 (@code{gnus-group-next-unread-group-same-level}). 
1363
1364 @item M-n
1365 @kindex M-n (Group)
1366 @findex gnus-group-prev-unread-group-same-level
1367 Go to the previous unread group on the same (or lower) level
1368 (@code{gnus-group-prev-unread-group-same-level}). 
1369 @end table
1370
1371 Three commands for jumping to groups:
1372
1373 @table @kbd
1374
1375 @item j
1376 @kindex j (Group)
1377 @findex gnus-group-jump-to-group
1378 Jump to a group (and make it visible if it isn't already)
1379 (@code{gnus-group-jump-to-group}).  Killed groups can be jumped to, just
1380 like living groups.
1381
1382 @item ,
1383 @kindex , (Group)
1384 @findex gnus-group-best-unread-group
1385 Jump to the unread group with the lowest level
1386 (@code{gnus-group-best-unread-group}). 
1387
1388 @item .
1389 @kindex . (Group)
1390 @findex gnus-group-first-unread-group
1391 Jump to the first group with unread articles
1392 (@code{gnus-group-first-unread-group}).  
1393 @end table
1394
1395 @vindex gnus-group-goto-unread
1396 If @code{gnus-group-goto-unread} is @code{nil}, all the movement
1397 commands will move to the next group, not the next unread group.  Even
1398 the commands that say they move to the next unread group.  The default
1399 is @code{t}.
1400
1401
1402 @node Selecting a Group
1403 @section Selecting a Group
1404 @cindex group selection
1405
1406 @table @kbd
1407
1408 @item SPACE
1409 @kindex SPACE (Group)
1410 @findex gnus-group-read-group
1411 Select the current group, switch to the summary buffer and display the
1412 first unread article (@code{gnus-group-read-group}).  If there are no
1413 unread articles in the group, or if you give a non-numerical prefix to
1414 this command, Gnus will offer to fetch all the old articles in this
1415 group from the server.  If you give a numerical prefix @var{N}, @var{N}
1416 determines the number of articles Gnus will fetch.  If @var{N} is
1417 positive, Gnus fetches the @var{N} newest articles, if @var{N} is
1418 negative, Gnus fetches the @var{abs(N)} oldest articles.
1419
1420 @item RET
1421 @kindex RET (Group)
1422 @findex gnus-group-select-group
1423 Select the current group and switch to the summary buffer
1424 (@code{gnus-group-select-group}).  Takes the same arguments as
1425 @code{gnus-group-read-group}---the only difference is that this command
1426 does not display the first unread article automatically upon group
1427 entry. 
1428
1429 @item M-RET
1430 @kindex M-RET (Group)
1431 @findex gnus-group-quick-select-group
1432 This does the same as the command above, but tries to do it with the
1433 minimum amount of fuzz (@code{gnus-group-quick-select-group}).  No
1434 scoring/killing will be performed, there will be no highlights and no
1435 expunging.  This might be useful if you're in a real hurry and have to
1436 enter some humongous group.  If you give a 0 prefix to this command
1437 (i.e., @kbd{0 M-RET}), Gnus won't even generate the summary buffer,
1438 which is useful if you want to toggle threading before generating the
1439 summary buffer (@pxref{Summary Generation Commands}).
1440
1441 @item M-SPACE
1442 @kindex M-SPACE (Group)
1443 @findex gnus-group-visible-select-group
1444 This is yet one more command that does the same as the @kbd{RET}
1445 command, but this one does it without expunging and hiding dormants
1446 (@code{gnus-group-visible-select-group}).
1447
1448 @item M-C-RET
1449 @kindex M-C-RET (Group)
1450 @findex gnus-group-select-group-ephemerally
1451 Finally, this command selects the current group ephemerally without
1452 doing any processing of its contents
1453 (@code{gnus-group-select-group-ephemerally}).  Even threading has been
1454 turned off.  Everything you do in the group after selecting it in this
1455 manner will have no permanent effects.
1456
1457 @end table
1458
1459 @vindex gnus-large-newsgroup
1460 The @code{gnus-large-newsgroup} variable says what Gnus should consider
1461 to be a big group.  This is 200 by default.  If the group has more
1462 (unread and/or ticked) articles than this, Gnus will query the user
1463 before entering the group.  The user can then specify how many articles
1464 should be fetched from the server.  If the user specifies a negative
1465 number (@code{-n}), the @code{n} oldest articles will be fetched.  If it
1466 is positive, the @code{n} articles that have arrived most recently will
1467 be fetched.
1468
1469 @vindex gnus-select-group-hook
1470 @vindex gnus-auto-select-first
1471 @code{gnus-auto-select-first} control whether any articles are selected
1472 automatically when entering a group with the @kbd{SPACE} command.
1473
1474 @table @code
1475
1476 @item nil
1477 Don't select any articles when entering the group.  Just display the
1478 full summary buffer.
1479
1480 @item t
1481 Select the first unread article when entering the group.  
1482
1483 @item best
1484 Select the most high-scored article in the group when entering the
1485 group. 
1486 @end table
1487         
1488 If you want to prevent automatic selection in some group (say, in a
1489 binary group with Huge articles) you can set this variable to @code{nil}
1490 in @code{gnus-select-group-hook}, which is called when a group is
1491 selected.
1492
1493
1494 @node Subscription Commands
1495 @section Subscription Commands
1496 @cindex subscription
1497
1498 @table @kbd
1499
1500 @item S t
1501 @itemx u
1502 @kindex S t (Group)
1503 @kindex u (Group)
1504 @findex gnus-group-unsubscribe-current-group
1505 @c @icon{gnus-group-unsubscribe}
1506 Toggle subscription to the current group
1507 (@code{gnus-group-unsubscribe-current-group}).  
1508
1509 @item S s
1510 @itemx U
1511 @kindex S s (Group)
1512 @kindex U (Group)
1513 @findex gnus-group-unsubscribe-group
1514 Prompt for a group to subscribe, and then subscribe it.  If it was
1515 subscribed already, unsubscribe it instead
1516 (@code{gnus-group-unsubscribe-group}).
1517
1518 @item S k
1519 @itemx C-k
1520 @kindex S k (Group)
1521 @kindex C-k (Group)
1522 @findex gnus-group-kill-group
1523 @c @icon{gnus-group-kill-group}
1524 Kill the current group (@code{gnus-group-kill-group}).
1525
1526 @item S y
1527 @itemx C-y
1528 @kindex S y (Group)
1529 @kindex C-y (Group)
1530 @findex gnus-group-yank-group
1531 Yank the last killed group (@code{gnus-group-yank-group}).
1532
1533 @item C-x C-t
1534 @kindex C-x C-t (Group)
1535 @findex gnus-group-transpose-groups
1536 Transpose two groups (@code{gnus-group-transpose-groups}).  This isn't
1537 really a subscription command, but you can use it instead of a
1538 kill-and-yank sequence sometimes.
1539
1540 @item S w
1541 @itemx C-w
1542 @kindex S w (Group)
1543 @kindex C-w (Group)
1544 @findex gnus-group-kill-region
1545 Kill all groups in the region (@code{gnus-group-kill-region}). 
1546
1547 @item S z
1548 @kindex S z (Group)
1549 @findex gnus-group-kill-all-zombies
1550 Kill all zombie groups (@code{gnus-group-kill-all-zombies}).
1551
1552 @item S C-k
1553 @kindex S C-k (Group)
1554 @findex gnus-group-kill-level
1555 Kill all groups on a certain level (@code{gnus-group-kill-level}).
1556 These groups can't be yanked back after killing, so this command should
1557 be used with some caution.  The only time where this command comes in
1558 really handy is when you have a @file{.newsrc} with lots of unsubscribed
1559 groups that you want to get rid off.  @kbd{S C-k} on level 7 will
1560 kill off all unsubscribed groups that do not have message numbers in the
1561 @file{.newsrc} file.  
1562
1563 @end table
1564
1565 Also @pxref{Group Levels}.
1566
1567
1568 @node Group Data
1569 @section Group Data
1570
1571 @table @kbd
1572
1573 @item c
1574 @kindex c (Group)
1575 @findex gnus-group-catchup-current
1576 @vindex gnus-group-catchup-group-hook
1577 @c @icon{gnus-group-catchup-current}
1578 Mark all unticked articles in this group as read
1579 (@code{gnus-group-catchup-current}).
1580 @code{gnus-group-catchup-group-hook} is called when catching up a group from
1581 the group buffer.
1582
1583 @item C
1584 @kindex C (Group)
1585 @findex gnus-group-catchup-current-all
1586 Mark all articles in this group, even the ticked ones, as read
1587 (@code{gnus-group-catchup-current-all}).   
1588
1589 @item M-c
1590 @kindex M-c (Group)
1591 @findex gnus-group-clear-data
1592 Clear the data from the current group---nix out marks and the list of
1593 read articles (@code{gnus-group-clear-data}).
1594
1595 @item M-x gnus-group-clear-data-on-native-groups
1596 @kindex M-x gnus-group-clear-data-on-native-groups
1597 @findex gnus-group-clear-data-on-native-groups
1598 If you have switched from one @sc{nntp} server to another, all your marks
1599 and read ranges have become worthless.  You can use this command to
1600 clear out all data that you have on your native groups.  Use with
1601 caution. 
1602
1603 @end table
1604
1605
1606 @node Group Levels
1607 @section Group Levels
1608 @cindex group level
1609 @cindex level
1610
1611 All groups have a level of @dfn{subscribedness}.  For instance, if a
1612 group is on level 2, it is more subscribed than a group on level 5.  You
1613 can ask Gnus to just list groups on a given level or lower
1614 (@pxref{Listing Groups}), or to just check for new articles in groups on
1615 a given level or lower (@pxref{Scanning New Messages}).
1616
1617 Remember:  The higher the level of the group, the less important it is. 
1618
1619 @table @kbd
1620
1621 @item S l
1622 @kindex S l (Group)
1623 @findex gnus-group-set-current-level
1624 Set the level of the current group.  If a numeric prefix is given, the
1625 next @var{n} groups will have their levels set.  The user will be
1626 prompted for a level.
1627 @end table
1628
1629 @vindex gnus-level-killed
1630 @vindex gnus-level-zombie
1631 @vindex gnus-level-unsubscribed
1632 @vindex gnus-level-subscribed
1633 Gnus considers groups from levels 1 to
1634 @code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed,
1635 @code{gnus-level-subscribed} (exclusive) and
1636 @code{gnus-level-unsubscribed} (inclusive) (default 7) to be
1637 unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead)
1638 (default 8) and @code{gnus-level-killed} to be killed (completely dead)
1639 (default 9).  Gnus treats subscribed and unsubscribed groups exactly the
1640 same, but zombie and killed groups have no information on what articles
1641 you have read, etc, stored.  This distinction between dead and living
1642 groups isn't done because it is nice or clever, it is done purely for
1643 reasons of efficiency.
1644
1645 It is recommended that you keep all your mail groups (if any) on quite
1646 low levels (e.g. 1 or 2).
1647
1648 If you want to play with the level variables, you should show some care.
1649 Set them once, and don't touch them ever again.  Better yet, don't touch
1650 them at all unless you know exactly what you're doing.
1651
1652 @vindex gnus-level-default-unsubscribed
1653 @vindex gnus-level-default-subscribed
1654 Two closely related variables are @code{gnus-level-default-subscribed}
1655 (default 3) and @code{gnus-level-default-unsubscribed} (default 6),
1656 which are the levels that new groups will be put on if they are
1657 (un)subscribed.  These two variables should, of course, be inside the
1658 relevant valid ranges.
1659
1660 @vindex gnus-keep-same-level
1661 If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands
1662 will only move to groups of the same level (or lower).  In
1663 particular, going from the last article in one group to the next group
1664 will go to the next group of the same level (or lower).  This might be
1665 handy if you want to read the most important groups before you read the
1666 rest.
1667
1668 @vindex gnus-group-default-list-level
1669 All groups with a level less than or equal to
1670 @code{gnus-group-default-list-level} will be listed in the group buffer
1671 by default.
1672
1673 @vindex gnus-group-list-inactive-groups
1674 If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active
1675 groups will be listed along with the unread groups.  This variable is
1676 @code{t} by default.  If it is @code{nil}, inactive groups won't be
1677 listed. 
1678
1679 @vindex gnus-group-use-permanent-levels
1680 If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you
1681 give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
1682 use this level as the ``work'' level.
1683
1684 @vindex gnus-activate-level
1685 Gnus will normally just activate (i. e., query the server about) groups
1686 on level @code{gnus-activate-level} or less.  If you don't want to
1687 activate unsubscribed groups, for instance, you might set this variable
1688 to 5.  The default is 6.
1689
1690
1691 @node Group Score
1692 @section Group Score
1693 @cindex group score
1694
1695 You would normally keep important groups on high levels, but that scheme
1696 is somewhat restrictive.  Don't you wish you could have Gnus sort the
1697 group buffer according to how often you read groups, perhaps?  Within
1698 reason?  
1699
1700 This is what @dfn{group score} is for.  You can assign a score to each
1701 group.  You can then sort the group buffer based on this score.
1702 Alternatively, you can sort on score and then level.  (Taken together,
1703 the level and the score is called the @dfn{rank} of the group.  A group
1704 that is on level 4 and has a score of 1 has a higher rank than a group
1705 on level 5 that has a score of 300.  (The level is the most significant
1706 part and the score is the least significant part.))
1707
1708 @findex gnus-summary-bubble-group
1709 If you want groups you read often to get higher scores than groups you
1710 read seldom you can add the @code{gnus-summary-bubble-group} function to
1711 the @code{gnus-summary-exit-hook} hook.  This will result (after
1712 sorting) in a bubbling sort of action.  If you want to see that in
1713 action after each summary exit, you can add
1714 @code{gnus-group-sort-groups-by-rank} or
1715 @code{gnus-group-sort-groups-by-score} to the same hook, but that will
1716 slow things down somewhat.
1717
1718
1719 @node Marking Groups
1720 @section Marking Groups
1721 @cindex marking groups
1722
1723 If you want to perform some command on several groups, and they appear
1724 subsequently in the group buffer, you would normally just give a
1725 numerical prefix to the command.  Most group commands will then do your
1726 bidding on those groups.
1727
1728 However, if the groups are not in sequential order, you can still
1729 perform a command on several groups.  You simply mark the groups first
1730 with the process mark and then execute the command.
1731
1732 @table @kbd
1733
1734 @item #
1735 @kindex # (Group)
1736 @itemx M m
1737 @kindex M m (Group)
1738 @findex gnus-group-mark-group
1739 Set the mark on the current group (@code{gnus-group-mark-group}). 
1740
1741 @item M-#
1742 @kindex M-# (Group)
1743 @itemx M u
1744 @kindex M u (Group)
1745 @findex gnus-group-unmark-group
1746 Remove the mark from the current group
1747 (@code{gnus-group-unmark-group}). 
1748
1749 @item M U
1750 @kindex M U (Group)
1751 @findex gnus-group-unmark-all-groups
1752 Remove the mark from all groups (@code{gnus-group-unmark-all-groups}). 
1753
1754 @item M w
1755 @kindex M w (Group)
1756 @findex gnus-group-mark-region
1757 Mark all groups between point and mark (@code{gnus-group-mark-region}). 
1758
1759 @item M b
1760 @kindex M b (Group)
1761 @findex gnus-group-mark-buffer
1762 Mark all groups in the buffer (@code{gnus-group-mark-buffer}). 
1763
1764 @item M r
1765 @kindex M r (Group)
1766 @findex gnus-group-mark-regexp
1767 Mark all groups that match some regular expression
1768 (@code{gnus-group-mark-regexp}).  
1769 @end table
1770
1771 Also @pxref{Process/Prefix}.
1772
1773 @findex gnus-group-universal-argument
1774 If you want to execute some command on all groups that have been marked
1775 with the process mark, you can use the @kbd{M-&}
1776 (@code{gnus-group-universal-argument}) command.  It will prompt you for
1777 the command to be executed.
1778
1779
1780 @node Foreign Groups
1781 @section Foreign Groups
1782 @cindex foreign groups
1783
1784 Below are some group mode commands for making and editing general foreign
1785 groups, as well as commands to ease the creation of a few
1786 special-purpose groups.  All these commands insert the newly created
1787 groups under point---@code{gnus-subscribe-newsgroup-method} is not
1788 consulted.
1789
1790 @table @kbd
1791
1792 @item G m
1793 @kindex G m (Group)
1794 @findex gnus-group-make-group
1795 @cindex making groups
1796 Make a new group (@code{gnus-group-make-group}).  Gnus will prompt you
1797 for a name, a method and possibly an @dfn{address}.  For an easier way
1798 to subscribe to @sc{nntp} groups, @pxref{Browse Foreign Server}.
1799
1800 @item G r
1801 @kindex G r (Group)
1802 @findex gnus-group-rename-group
1803 @cindex renaming groups
1804 Rename the current group to something else
1805 (@code{gnus-group-rename-group}).  This is valid only on some
1806 groups---mail groups mostly.  This command might very well be quite slow
1807 on some backends.
1808
1809 @item G c
1810 @kindex G c (Group)
1811 @cindex customizing
1812 @findex gnus-group-customize
1813 Customize the group parameters (@code{gnus-group-customize}).
1814
1815 @item G e
1816 @kindex G e (Group)
1817 @findex gnus-group-edit-group-method
1818 @cindex renaming groups
1819 Enter a buffer where you can edit the select method of the current
1820 group (@code{gnus-group-edit-group-method}).
1821
1822 @item G p
1823 @kindex G p (Group)
1824 @findex gnus-group-edit-group-parameters
1825 Enter a buffer where you can edit the group parameters
1826 (@code{gnus-group-edit-group-parameters}). 
1827
1828 @item G E
1829 @kindex G E (Group)
1830 @findex gnus-group-edit-group
1831 Enter a buffer where you can edit the group info
1832 (@code{gnus-group-edit-group}).
1833
1834 @item G d
1835 @kindex G d (Group)
1836 @findex gnus-group-make-directory-group
1837 @cindex nndir
1838 Make a directory group (@pxref{Directory Groups}).  You will be prompted
1839 for a directory name (@code{gnus-group-make-directory-group}).
1840
1841 @item G h 
1842 @kindex G h (Group)
1843 @cindex help group
1844 @findex gnus-group-make-help-group
1845 Make the Gnus help group (@code{gnus-group-make-help-group}).
1846
1847 @item G a
1848 @kindex G a (Group)
1849 @cindex (ding) archive
1850 @cindex archive group
1851 @findex gnus-group-make-archive-group
1852 @vindex gnus-group-archive-directory
1853 @vindex gnus-group-recent-archive-directory
1854 Make a Gnus archive group (@code{gnus-group-make-archive-group}).  By
1855 default a group pointing to the most recent articles will be created
1856 (@code{gnus-group-recent-archive-directory}), but given a prefix, a full
1857 group will be created from @code{gnus-group-archive-directory}.
1858
1859 @item G k
1860 @kindex G k (Group)
1861 @findex gnus-group-make-kiboze-group
1862 @cindex nnkiboze
1863 Make a kiboze group.  You will be prompted for a name, for a regexp to
1864 match groups to be ``included'' in the kiboze group, and a series of
1865 strings to match on headers (@code{gnus-group-make-kiboze-group}).
1866 @xref{Kibozed Groups}.
1867
1868 @item G D
1869 @kindex G D (Group)
1870 @findex gnus-group-enter-directory
1871 @cindex nneething
1872 Read an arbitrary directory as if it were a newsgroup with the
1873 @code{nneething} backend (@code{gnus-group-enter-directory}).
1874 @xref{Anything Groups}. 
1875
1876 @item G f
1877 @kindex G f (Group)
1878 @findex gnus-group-make-doc-group
1879 @cindex ClariNet Briefs
1880 @cindex nndoc
1881 Make a group based on some file or other
1882 (@code{gnus-group-make-doc-group}).  If you give a prefix to this
1883 command, you will be prompted for a file name and a file type.
1884 Currently supported types are @code{babyl}, @code{mbox}, @code{digest},
1885 @code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs},
1886 @code{rfc934}, @code{rfc822-forward}, and @code{forward}.  If you run
1887 this command without a prefix, Gnus will guess at the file type.
1888 @xref{Document Groups}.
1889
1890 @item G w
1891 @kindex G w (Group)
1892 @findex gnus-group-make-web-group
1893 @cindex DejaNews
1894 @cindex Alta Vista
1895 @cindex InReference
1896 @cindex nnweb
1897 Make an ephemeral group based on a web search
1898 (@code{gnus-group-make-web-group}).  If you give a prefix to this
1899 command, make a solid group instead.  You will be prompted for the
1900 search engine type and the search string.  Valid search engine types
1901 include @code{dejanews}, @code{altavista} and @code{reference}.
1902 @xref{Web Searches}.
1903
1904 @item G DEL
1905 @kindex G DEL (Group)
1906 @findex gnus-group-delete-group
1907 This function will delete the current group
1908 (@code{gnus-group-delete-group}).  If given a prefix, this function will
1909 actually delete all the articles in the group, and forcibly remove the
1910 group itself from the face of the Earth.  Use a prefix only if you are
1911 absolutely sure of what you are doing.  This command can't be used on
1912 read-only groups (like @code{nntp} group), though.
1913
1914 @item G V
1915 @kindex G V (Group)
1916 @findex gnus-group-make-empty-virtual
1917 Make a new, fresh, empty @code{nnvirtual} group
1918 (@code{gnus-group-make-empty-virtual}).  @xref{Virtual Groups}.
1919
1920 @item G v
1921 @kindex G v (Group)
1922 @findex gnus-group-add-to-virtual
1923 Add the current group to an @code{nnvirtual} group
1924 (@code{gnus-group-add-to-virtual}).  Uses the process/prefix convention.
1925 @end table
1926
1927 @xref{Select Methods} for more information on the various select
1928 methods. 
1929
1930 @vindex gnus-activate-foreign-newsgroups
1931 If @code{gnus-activate-foreign-newsgroups} is a positive number,
1932 Gnus will check all foreign groups with this level or lower at startup.
1933 This might take quite a while, especially if you subscribe to lots of
1934 groups from different @sc{nntp} servers.
1935
1936
1937 @node Group Parameters
1938 @section Group Parameters
1939 @cindex group parameters
1940
1941 The group parameters store information local to a particular group:
1942
1943 @table @code
1944 @item to-address
1945 @cindex to-address
1946 If the group parameter list contains an element that looks like
1947 @code{(to-address .  "some@@where.com")}, that address will be used by
1948 the backend when doing followups and posts.  This is primarily useful in
1949 mail groups that represent closed mailing lists---mailing lists where
1950 it's expected that everybody that writes to the mailing list is
1951 subscribed to it.  Since using this parameter ensures that the mail only
1952 goes to the mailing list itself, it means that members won't receive two
1953 copies of your followups.
1954
1955 Using @code{to-address} will actually work whether the group is foreign
1956 or not.  Let's say there's a group on the server that is called
1957 @samp{fa.4ad-l}.  This is a real newsgroup, but the server has gotten
1958 the articles from a mail-to-news gateway.  Posting directly to this
1959 group is therefore impossible---you have to send mail to the mailing
1960 list address instead. 
1961
1962 @item to-list
1963 @cindex to-list
1964 If the group parameter list has an element that looks like
1965 @code{(to-list . "some@@where.com")}, that address will be used when
1966 doing a @kbd{a} in that group.  It is totally ignored when doing a
1967 followup---except that if it is present in a news group, you'll get mail
1968 group semantics when doing @kbd{f}.
1969
1970 If you do an @kbd{a} command in a mail group and you don't have a
1971 @code{to-list} group parameter, one will be added automatically upon
1972 sending the message.
1973
1974 @item visible
1975 @cindex visible
1976 If the group parameter list has the element @code{(visible . t)},
1977 that group will always be visible in the Group buffer, regardless
1978 of whether it has any unread articles.
1979
1980 @item broken-reply-to
1981 @cindex broken-reply-to
1982 Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
1983 headers in this group are to be ignored.  This can be useful if you're
1984 reading a mailing list group where the listserv has inserted
1985 @code{Reply-To} headers that point back to the listserv itself.  This is
1986 broken behavior.  So there!
1987
1988 @item to-group
1989 @cindex to-group
1990 Elements like @code{(to-group . "some.group.name")} means that all
1991 posts in that group will be sent to @code{some.group.name}.  
1992
1993 @item newsgroup
1994 @cindex newsgroup
1995 If this symbol is present in the group parameter list, Gnus will treat
1996 all responses as if they were responses to news articles.  This can be
1997 useful if you have a mail group that's really a mirror of a news group. 
1998
1999 @item gcc-self
2000 @cindex gcc-self
2001 If this symbol is present in the group parameter list and set to
2002 @code{t}, newly composed messages will be @code{Gcc}'d to the current
2003 group. If it is present and set to @code{none}, no @code{Gcc:} header
2004 will be generated, if it is present and a string, this string will be
2005 inserted literally as a @code{gcc} header (this symbol takes precedence
2006 over any default @code{Gcc} rules as described later).  @xref{Archived
2007 Messages}
2008
2009 @item auto-expire
2010 @cindex auto-expire
2011 If the group parameter has an element that looks like @code{(auto-expire
2012 . t)}, all articles read will be marked as expirable.  For an
2013 alternative approach, @pxref{Expiring Mail}.
2014
2015 @item total-expire
2016 @cindex total-expire
2017 If the group parameter has an element that looks like
2018 @code{(total-expire . t)}, all read articles will be put through the
2019 expiry process, even if they are not marked as expirable.  Use with
2020 caution.  Unread, ticked and dormant articles are not eligible for
2021 expiry.
2022
2023 @item expiry-wait
2024 @cindex expiry-wait
2025 @vindex nnmail-expiry-wait-function
2026 If the group parameter has an element that looks like @code{(expiry-wait
2027 . 10)}, this value will override any @code{nnmail-expiry-wait} and
2028 @code{nnmail-expiry-wait-function} when expiring expirable messages.
2029 The value can either be a number of days (not necessarily an integer) or
2030 the symbols @code{never} or @code{immediate}.
2031
2032 @item score-file
2033 @cindex score file group parameter
2034 Elements that look like @code{(score-file . "file")} will make
2035 @file{file} into the current adaptive score file for the group in
2036 question.  All adaptive score entries will be put into this file.
2037
2038 @item adapt-file
2039 @cindex adapt file group parameter
2040 Elements that look like @code{(adapt-file . "file")} will make
2041 @file{file} into the current adaptive file for the group in question.
2042 All adaptive score entries will be put into this file.
2043
2044 @item admin-address
2045 When unsubscribing from a mailing list you should never send the
2046 unsubscription notice to the mailing list itself.  Instead, you'd send
2047 messages to the administrative address.  This parameter allows you to
2048 put the admin address somewhere convenient.
2049
2050 @item display
2051 Elements that look like @code{(display . MODE)} say which articles to
2052 display on entering the group.  Valid values are:
2053
2054 @table @code
2055 @item all
2056 Display all articles, both read and unread.
2057
2058 @item default
2059 Display the default visible articles, which normally includes unread and
2060 ticked articles.
2061 @end table
2062
2063 @item comment
2064 Elements that look like @code{(comment . "This is a comment")}
2065 are arbitrary comments on the group.  They are currently ignored by
2066 Gnus, but provide a place for you to store information on particular
2067 groups. 
2068
2069 @item @var{(variable form)}
2070 You can use the group parameters to set variables local to the group you
2071 are entering.  If you want to turn threading off in @samp{news.answers},
2072 you could put @code{(gnus-show-threads nil)} in the group parameters of
2073 that group.  @code{gnus-show-threads} will be made into a local variable
2074 in the summary buffer you enter, and the form @code{nil} will be
2075 @code{eval}ed there.
2076
2077 This can also be used as a group-specific hook function, if you'd like.
2078 If you want to hear a beep when you enter a group, you could put
2079 something like @code{(dummy-variable (ding))} in the parameters of that
2080 group.  @code{dummy-variable} will be set to the result of the
2081 @code{(ding)} form, but who cares?
2082
2083 @end table
2084
2085 Use the @kbd{G p} command to edit group parameters of a group.
2086
2087 @pxref{Topic Parameters}.
2088
2089 Here's an example group parameter list:
2090
2091 @example
2092 ((to-address . "ding@@gnus.org")
2093  (auto-expiry . t))
2094 @end example
2095
2096
2097 @node Listing Groups
2098 @section Listing Groups
2099 @cindex group listing
2100
2101 These commands all list various slices of the groups available.
2102
2103 @table @kbd
2104
2105 @item l
2106 @itemx A s
2107 @kindex A s (Group)
2108 @kindex l (Group)
2109 @findex gnus-group-list-groups
2110 List all groups that have unread articles
2111 (@code{gnus-group-list-groups}).  If the numeric prefix is used, this
2112 command will list only groups of level ARG and lower.  By default, it
2113 only lists groups of level five (i. e.,
2114 @code{gnus-group-default-list-level}) or lower (i.e., just subscribed
2115 groups).
2116
2117 @item L
2118 @itemx A u
2119 @kindex A u (Group)
2120 @kindex L (Group)
2121 @findex gnus-group-list-all-groups
2122 List all groups, whether they have unread articles or not
2123 (@code{gnus-group-list-all-groups}).  If the numeric prefix is used,
2124 this command will list only groups of level ARG and lower.  By default,
2125 it lists groups of level seven or lower (i.e., just subscribed and
2126 unsubscribed groups).
2127
2128 @item A l
2129 @kindex A l (Group)
2130 @findex gnus-group-list-level
2131 List all unread groups on a specific level
2132 (@code{gnus-group-list-level}).  If given a prefix, also list the groups
2133 with no unread articles.
2134
2135 @item A k
2136 @kindex A k (Group)
2137 @findex gnus-group-list-killed
2138 List all killed groups (@code{gnus-group-list-killed}).  If given a
2139 prefix argument, really list all groups that are available, but aren't
2140 currently (un)subscribed.  This could entail reading the active file
2141 from the server.
2142
2143 @item A z
2144 @kindex A z (Group)
2145 @findex gnus-group-list-zombies
2146 List all zombie groups (@code{gnus-group-list-zombies}).
2147
2148 @item A m
2149 @kindex A m (Group)
2150 @findex gnus-group-list-matching
2151 List all unread, subscribed groups with names that match a regexp
2152 (@code{gnus-group-list-matching}). 
2153
2154 @item A M
2155 @kindex A M (Group)
2156 @findex gnus-group-list-all-matching
2157 List groups that match a regexp (@code{gnus-group-list-all-matching}).
2158
2159 @item A A
2160 @kindex A A (Group)
2161 @findex gnus-group-list-active
2162 List absolutely all groups in the active file(s) of the
2163 server(s) you are connected to (@code{gnus-group-list-active}).  This
2164 might very well take quite a while.  It might actually be a better idea
2165 to do a @kbd{A M} to list all matching, and just give @samp{.} as the
2166 thing to match on.  Also note that this command may list groups that
2167 don't exist (yet)---these will be listed as if they were killed groups.
2168 Take the output with some grains of salt.
2169
2170 @item A a
2171 @kindex A a (Group)
2172 @findex gnus-group-apropos
2173 List all groups that have names that match a regexp
2174 (@code{gnus-group-apropos}).
2175
2176 @item A d
2177 @kindex A d (Group)
2178 @findex gnus-group-description-apropos
2179 List all groups that have names or descriptions that match a regexp
2180 (@code{gnus-group-description-apropos}).
2181
2182 @end table
2183
2184 @vindex gnus-permanently-visible-groups
2185 @cindex visible group parameter
2186 Groups that match the @code{gnus-permanently-visible-groups} regexp will
2187 always be shown, whether they have unread articles or not.  You can also
2188 add the @code{visible} element to the group parameters in question to
2189 get the same effect.
2190
2191 @vindex gnus-list-groups-with-ticked-articles
2192 Groups that have just ticked articles in it are normally listed in the
2193 group buffer.  If @code{gnus-list-groups-with-ticked-articles} is
2194 @code{nil}, these groups will be treated just like totally empty
2195 groups.  It is @code{t} by default.
2196
2197
2198 @node Sorting Groups
2199 @section Sorting Groups
2200 @cindex sorting groups
2201
2202 @kindex C-c C-s (Group)
2203 @findex gnus-group-sort-groups
2204 @vindex gnus-group-sort-function
2205 The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the
2206 group buffer according to the function(s) given by the
2207 @code{gnus-group-sort-function} variable.  Available sorting functions
2208 include: 
2209
2210 @table @code
2211
2212 @item gnus-group-sort-by-alphabet
2213 @findex gnus-group-sort-by-alphabet
2214 Sort the group names alphabetically.  This is the default.
2215
2216 @item gnus-group-sort-by-real-name
2217 @findex gnus-group-sort-by-real-name
2218 Sort the group alphabetically on the real (unprefixed) group names.
2219
2220 @item gnus-group-sort-by-level
2221 @findex gnus-group-sort-by-level
2222 Sort by group level.
2223
2224 @item gnus-group-sort-by-score
2225 @findex gnus-group-sort-by-score
2226 Sort by group score.
2227
2228 @item gnus-group-sort-by-rank
2229 @findex gnus-group-sort-by-rank
2230 Sort by group score and then the group level.  The level and the score
2231 are, when taken together, the group's @dfn{rank}. 
2232
2233 @item gnus-group-sort-by-unread
2234 @findex gnus-group-sort-by-unread
2235 Sort by number of unread articles.
2236
2237 @item gnus-group-sort-by-method
2238 @findex gnus-group-sort-by-method
2239 Sort alphabetically on the select method.
2240
2241
2242 @end table
2243
2244 @code{gnus-group-sort-function} can also be a list of sorting
2245 functions.  In that case, the most significant sort key function must be
2246 the last one.
2247
2248
2249 There are also a number of commands for sorting directly according to
2250 some sorting criteria:
2251
2252 @table @kbd
2253 @item G S a
2254 @kindex G S a (Group)
2255 @findex gnus-group-sort-groups-by-alphabet
2256 Sort the group buffer alphabetically by group name
2257 (@code{gnus-group-sort-groups-by-alphabet}). 
2258
2259 @item G S u
2260 @kindex G S u (Group)
2261 @findex gnus-group-sort-groups-by-unread
2262 Sort the group buffer by the number of unread articles
2263 (@code{gnus-group-sort-groups-by-unread}).
2264
2265 @item G S l
2266 @kindex G S l (Group)
2267 @findex gnus-group-sort-groups-by-level
2268 Sort the group buffer by group level
2269 (@code{gnus-group-sort-groups-by-level}). 
2270
2271 @item G S v
2272 @kindex G S v (Group)
2273 @findex gnus-group-sort-groups-by-score
2274 Sort the group buffer by group score
2275 (@code{gnus-group-sort-groups-by-score}). 
2276
2277 @item G S r
2278 @kindex G S r (Group)
2279 @findex gnus-group-sort-groups-by-rank
2280 Sort the group buffer by group rank
2281 (@code{gnus-group-sort-groups-by-rank}). 
2282
2283 @item G S m
2284 @kindex G S m (Group)
2285 @findex gnus-group-sort-groups-by-method
2286 Sort the group buffer alphabetically by backend name
2287 (@code{gnus-group-sort-groups-by-method}). 
2288
2289 @end table
2290
2291 When given a prefix, all these commands will sort in reverse order. 
2292
2293 You can also sort a subset of the groups:
2294
2295 @table @kbd
2296 @item G P a
2297 @kindex G P a (Group)
2298 @findex gnus-group-sort-selected-groups-by-alphabet
2299 Sort the process/prefixed groups in the group buffer alphabetically by
2300 group name (@code{gnus-group-sort-selected-groups-by-alphabet}).
2301
2302 @item G P u
2303 @kindex G P u (Group)
2304 @findex gnus-group-sort-selected-groups-by-unread
2305 Sort the process/prefixed groups in the group buffer by the number of
2306 unread articles (@code{gnus-group-sort-selected-groups-by-unread}).
2307
2308 @item G P l
2309 @kindex G P l (Group)
2310 @findex gnus-group-sort-selected-groups-by-level
2311 Sort the process/prefixed groups in the group buffer by group level
2312 (@code{gnus-group-sort-selected-groups-by-level}).
2313
2314 @item G P v
2315 @kindex G P v (Group)
2316 @findex gnus-group-sort-selected-groups-by-score
2317 Sort the process/prefixed groups in the group buffer by group score
2318 (@code{gnus-group-sort-selected-groups-by-score}).
2319
2320 @item G P r
2321 @kindex G P r (Group)
2322 @findex gnus-group-sort-selected-groups-by-rank
2323 Sort the process/prefixed groups in the group buffer by group rank
2324 (@code{gnus-group-sort-selected-groups-by-rank}).
2325
2326 @item G P m
2327 @kindex G P m (Group)
2328 @findex gnus-group-sort-selected-groups-by-method
2329 Sort the process/prefixed groups in the group buffer alphabetically by
2330 backend name (@code{gnus-group-sort-selected-groups-by-method}).
2331
2332 @end table
2333
2334
2335
2336 @node Group Maintenance
2337 @section Group Maintenance
2338 @cindex bogus groups
2339
2340 @table @kbd
2341 @item b
2342 @kindex b (Group)
2343 @findex gnus-group-check-bogus-groups
2344 Find bogus groups and delete them
2345 (@code{gnus-group-check-bogus-groups}).
2346
2347 @item F
2348 @kindex F (Group)
2349 @findex gnus-group-find-new-groups
2350 Find new groups and process them (@code{gnus-group-find-new-groups}).
2351 If given a prefix, use the @code{ask-server} method to query the server
2352 for new groups.
2353
2354 @item C-c C-x
2355 @kindex C-c C-x (Group)
2356 @findex gnus-group-expire-articles
2357 Run all expirable articles in the current group through the expiry
2358 process (if any) (@code{gnus-group-expire-articles}).
2359
2360 @item C-c M-C-x
2361 @kindex C-c M-C-x (Group)
2362 @findex gnus-group-expire-all-groups
2363 Run all articles in all groups through the expiry process
2364 (@code{gnus-group-expire-all-groups}).
2365
2366 @end table
2367
2368
2369 @node Browse Foreign Server
2370 @section Browse Foreign Server
2371 @cindex foreign servers
2372 @cindex browsing servers
2373
2374 @table @kbd
2375 @item B
2376 @kindex B (Group)
2377 @findex gnus-group-browse-foreign-server
2378 You will be queried for a select method and a server name.  Gnus will
2379 then attempt to contact this server and let you browse the groups there
2380 (@code{gnus-group-browse-foreign-server}).
2381 @end table
2382
2383 @findex gnus-browse-mode
2384 A new buffer with a list of available groups will appear.  This buffer
2385 will use the @code{gnus-browse-mode}.  This buffer looks a bit (well,
2386 a lot) like a normal group buffer.
2387
2388 Here's a list of keystrokes available in the browse mode:
2389
2390 @table @kbd
2391 @item n
2392 @kindex n (Browse)
2393 @findex gnus-group-next-group
2394 Go to the next group (@code{gnus-group-next-group}).
2395
2396 @item p
2397 @kindex p (Browse)
2398 @findex gnus-group-prev-group
2399 Go to the previous group (@code{gnus-group-prev-group}).
2400
2401 @item SPACE
2402 @kindex SPACE (Browse)
2403 @findex gnus-browse-read-group
2404 Enter the current group and display the first article
2405 (@code{gnus-browse-read-group}). 
2406
2407 @item RET
2408 @kindex RET (Browse)
2409 @findex gnus-browse-select-group
2410 Enter the current group (@code{gnus-browse-select-group}). 
2411
2412 @item u
2413 @kindex u (Browse)
2414 @findex gnus-browse-unsubscribe-current-group
2415 Unsubscribe to the current group, or, as will be the case here,
2416 subscribe to it (@code{gnus-browse-unsubscribe-current-group}). 
2417
2418 @item l
2419 @itemx q
2420 @kindex q (Browse)
2421 @kindex l (Browse)
2422 @findex gnus-browse-exit
2423 Exit browse mode (@code{gnus-browse-exit}).
2424
2425 @item ?
2426 @kindex ? (Browse)
2427 @findex gnus-browse-describe-briefly
2428 Describe browse mode briefly (well, there's not much to describe, is
2429 there) (@code{gnus-browse-describe-briefly}).
2430 @end table
2431
2432
2433 @node Exiting Gnus
2434 @section Exiting Gnus
2435 @cindex exiting Gnus
2436
2437 Yes, Gnus is ex(c)iting.
2438
2439 @table @kbd
2440 @item z
2441 @kindex z (Group)
2442 @findex gnus-group-suspend
2443 Suspend Gnus (@code{gnus-group-suspend}).  This doesn't really exit Gnus,
2444 but it kills all buffers except the Group buffer.  I'm not sure why this
2445 is a gain, but then who am I to judge?
2446
2447 @item q
2448 @kindex q (Group)
2449 @findex gnus-group-exit
2450 @c @icon{gnus-group-exit}
2451 Quit Gnus (@code{gnus-group-exit}).
2452
2453 @item Q
2454 @kindex Q (Group)
2455 @findex gnus-group-quit
2456 Quit Gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}).
2457 The dribble file will be saved, though (@pxref{Auto Save}).
2458 @end table
2459
2460 @vindex gnus-exit-gnus-hook
2461 @vindex gnus-suspend-gnus-hook
2462 @code{gnus-suspend-gnus-hook} is called when you suspend Gnus and
2463 @code{gnus-exit-gnus-hook} is called when you quit Gnus, while
2464 @code{gnus-after-exiting-gnus-hook} is called as the final item when
2465 exiting Gnus.
2466
2467 @findex gnus-unload
2468 @cindex unloading
2469 If you wish to completely unload Gnus and all its adherents, you can use
2470 the @code{gnus-unload} command.  This command is also very handy when
2471 trying to customize meta-variables.
2472
2473 Note:
2474
2475 @quotation
2476 Miss Lisa Cannifax, while sitting in English class, felt her feet go
2477 numbly heavy and herself fall into a hazy trance as the boy sitting
2478 behind her drew repeated lines with his pencil across the back of her
2479 plastic chair.
2480 @end quotation
2481
2482
2483 @node Group Topics
2484 @section Group Topics
2485 @cindex topics
2486
2487 If you read lots and lots of groups, it might be convenient to group
2488 them hierarchically according to topics.  You put your Emacs groups over
2489 here, your sex groups over there, and the rest (what, two groups or so?)
2490 you put in some misc section that you never bother with anyway.  You can
2491 even group the Emacs sex groups as a sub-topic to either the Emacs
2492 groups or the sex groups---or both!  Go wild!
2493
2494 @iftex
2495 @iflatex
2496 \gnusfigure{Group Topics}{400}{
2497 \put(75,50){\epsfig{figure=tmp/group-topic.ps,height=9cm}}
2498 }
2499 @end iflatex
2500 @end iftex
2501
2502 Here's an example:
2503
2504 @example
2505 Gnus
2506   Emacs -- I wuw it!
2507      3: comp.emacs
2508      2: alt.religion.emacs
2509     Naughty Emacs
2510      452: alt.sex.emacs
2511        0: comp.talk.emacs.recovery
2512   Misc
2513      8: comp.binaries.fractals
2514     13: comp.sources.unix
2515 @end example
2516
2517 @findex gnus-topic-mode
2518 @kindex t (Group)
2519 To get this @emph{fab} functionality you simply turn on (ooh!) the
2520 @code{gnus-topic} minor mode---type @kbd{t} in the group buffer.  (This
2521 is a toggling command.)
2522
2523 Go ahead, just try it.  I'll still be here when you get back.  La de
2524 dum...  Nice tune, that...  la la la...  What, you're back? Yes, and now
2525 press @kbd{l}.  There.  All your groups are now listed under
2526 @samp{misc}.  Doesn't that make you feel all warm and fuzzy?  Hot and
2527 bothered?
2528
2529 If you want this permanently enabled, you should add that minor mode to
2530 the hook for the group mode:
2531
2532 @lisp
2533 (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
2534 @end lisp
2535
2536 @menu 
2537 * Topic Variables::    How to customize the topics the Lisp Way.
2538 * Topic Commands::     Interactive E-Z commands.
2539 * Topic Sorting::      Sorting each topic individually.
2540 * Topic Topology::     A map of the world.
2541 * Topic Parameters::   Parameters that apply to all groups in a topic.
2542 @end menu
2543
2544
2545 @node Topic Variables
2546 @subsection Topic Variables
2547 @cindex topic variables
2548
2549 Now, if you select a topic, it will fold/unfold that topic, which is
2550 really neat, I think.
2551
2552 @vindex gnus-topic-line-format
2553 The topic lines themselves are created according to the
2554 @code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
2555 Valid elements are:
2556
2557 @table @samp
2558 @item i
2559 Indentation.
2560 @item n
2561 Topic name.
2562 @item v
2563 Visibility.
2564 @item l
2565 Level.
2566 @item g
2567 Number of groups in the topic.
2568 @item a
2569 Number of unread articles in the topic.
2570 @item A 
2571 Number of unread articles in the topic and all its subtopics. 
2572 @end table
2573
2574 @vindex gnus-topic-indent-level
2575 Each sub-topic (and the groups in the sub-topics) will be indented with
2576 @code{gnus-topic-indent-level} times the topic level number of spaces.
2577 The default is 2.
2578
2579 @vindex gnus-topic-mode-hook
2580 @code{gnus-topic-mode-hook} is called in topic minor mode buffers. 
2581
2582 @vindex gnus-topic-display-empty-topics
2583 The @code{gnus-topic-display-empty-topics} says whether to display even
2584 topics that have no unread articles in them.  The default is @code{t}.
2585
2586
2587 @node Topic Commands
2588 @subsection Topic Commands
2589 @cindex topic commands
2590
2591 When the topic minor mode is turned on, a new @kbd{T} submap will be
2592 available.  In addition, a few of the standard keys change their
2593 definitions slightly.
2594
2595 @table @kbd
2596
2597 @item T n
2598 @kindex T n (Topic)
2599 @findex gnus-topic-create-topic
2600 Prompt for a new topic name and create it 
2601 (@code{gnus-topic-create-topic}). 
2602
2603 @item T m
2604 @kindex T m (Topic)
2605 @findex gnus-topic-move-group
2606 Move the current group to some other topic
2607 (@code{gnus-topic-move-group}).  This command uses the process/prefix
2608 convention (@pxref{Process/Prefix}).
2609
2610 @item T c
2611 @kindex T c (Topic)
2612 @findex gnus-topic-copy-group
2613 Copy the current group to some other topic
2614 (@code{gnus-topic-copy-group}).  This command uses the process/prefix
2615 convention (@pxref{Process/Prefix}).
2616
2617 @item T D
2618 @kindex T D (Topic)
2619 @findex gnus-topic-remove-group
2620 Remove a group from the current topic (@code{gnus-topic-remove-group}).
2621 This command uses the process/prefix convention
2622 (@pxref{Process/Prefix}).
2623
2624 @item T M
2625 @kindex T M (Topic)
2626 @findex gnus-topic-move-matching
2627 Move all groups that match some regular expression to a topic
2628 (@code{gnus-topic-move-matching}). 
2629
2630 @item T C
2631 @kindex T C (Topic)
2632 @findex gnus-topic-copy-matching
2633 Copy all groups that match some regular expression to a topic
2634 (@code{gnus-topic-copy-matching}). 
2635
2636 @item T h
2637 @kindex T h (Topic)
2638 @findex gnus-topic-toggle-display-empty-topics
2639 Toggle hiding empty topics
2640 (@code{gnus-topic-toggle-display-empty-topics}). 
2641
2642 @item T #
2643 @kindex T # (Topic)
2644 @findex gnus-topic-mark-topic
2645 Mark all groups in the current topic with the process mark
2646 (@code{gnus-topic-mark-topic}). 
2647
2648 @item T M-#
2649 @kindex T M-# (Topic)
2650 @findex gnus-topic-unmark-topic
2651 Remove the process mark from all groups in the current topic
2652 (@code{gnus-topic-unmark-topic}). 
2653
2654 @item RET
2655 @kindex RET (Topic)
2656 @findex gnus-topic-select-group
2657 @itemx SPACE
2658 Either select a group or fold a topic (@code{gnus-topic-select-group}).
2659 When you perform this command on a group, you'll enter the group, as
2660 usual.  When done on a topic line, the topic will be folded (if it was
2661 visible) or unfolded (if it was folded already).  So it's basically a
2662 toggling command on topics.  In addition, if you give a numerical
2663 prefix, group on that level (and lower) will be displayed.
2664
2665 @item T TAB
2666 @kindex T TAB (Topic)
2667 @findex gnus-topic-indent
2668 ``Indent'' the current topic so that it becomes a sub-topic of the
2669 previous topic (@code{gnus-topic-indent}).  If given a prefix,
2670 ``un-indent'' the topic instead.
2671
2672 @item C-k
2673 @kindex C-k (Topic)
2674 @findex gnus-topic-kill-group
2675 Kill a group or topic (@code{gnus-topic-kill-group}).  All groups in the
2676 topic will be removed along with the topic.
2677
2678 @item C-y
2679 @kindex C-y (Topic)
2680 @findex gnus-topic-yank-group
2681 Yank the previously killed group or topic
2682 (@code{gnus-topic-yank-group}).  Note that all topics will be yanked
2683 before all groups. 
2684
2685 @item T r
2686 @kindex T r (Topic)
2687 @findex gnus-topic-rename
2688 Rename a topic (@code{gnus-topic-rename}). 
2689
2690 @item T DEL
2691 @kindex T DEL (Topic)
2692 @findex gnus-topic-delete
2693 Delete an empty topic (@code{gnus-topic-delete}). 
2694
2695 @item A T
2696 @kindex A T (Topic)
2697 @findex gnus-topic-list-active
2698 List all groups that Gnus knows about in a topics-ified way
2699 (@code{gnus-topic-list-active}).
2700
2701 @item G p
2702 @kindex G p (Topic)
2703 @findex gnus-topic-edit-parameters
2704 @cindex group parameters
2705 @cindex topic parameters
2706 @cindex parameters
2707 Edit the topic parameters (@code{gnus-topic-edit-parameters}).
2708 @xref{Topic Parameters}.
2709
2710 @end table
2711
2712
2713 @node Topic Sorting
2714 @subsection Topic Sorting
2715 @cindex topic sorting
2716
2717 You can sort the groups in each topic individually with the following
2718 commands: 
2719
2720
2721 @table @kbd
2722 @item T S a
2723 @kindex T S a (Topic)
2724 @findex gnus-topic-sort-groups-by-alphabet
2725 Sort the current topic alphabetically by group name
2726 (@code{gnus-topic-sort-groups-by-alphabet}). 
2727
2728 @item T S u
2729 @kindex T S u (Topic)
2730 @findex gnus-topic-sort-groups-by-unread
2731 Sort the current topic by the number of unread articles
2732 (@code{gnus-topic-sort-groups-by-unread}).
2733
2734 @item T S l
2735 @kindex T S l (Topic)
2736 @findex gnus-topic-sort-groups-by-level
2737 Sort the current topic by group level
2738 (@code{gnus-topic-sort-groups-by-level}). 
2739
2740 @item T S v
2741 @kindex T S v (Topic)
2742 @findex gnus-topic-sort-groups-by-score
2743 Sort the current topic by group score
2744 (@code{gnus-topic-sort-groups-by-score}). 
2745
2746 @item T S r
2747 @kindex T S r (Topic)
2748 @findex gnus-topic-sort-groups-by-rank
2749 Sort the current topic by group rank
2750 (@code{gnus-topic-sort-groups-by-rank}). 
2751
2752 @item T S m
2753 @kindex T S m (Topic)
2754 @findex gnus-topic-sort-groups-by-method
2755 Sort the current topic alphabetically by backend name
2756 (@code{gnus-topic-sort-groups-by-method}). 
2757
2758 @end table
2759
2760 @xref{Sorting Groups} for more information about group sorting. 
2761
2762
2763 @node Topic Topology
2764 @subsection Topic Topology
2765 @cindex topic topology
2766 @cindex topology
2767
2768 So, let's have a look at an example group buffer:
2769
2770 @example
2771 Gnus
2772   Emacs -- I wuw it!
2773      3: comp.emacs
2774      2: alt.religion.emacs
2775     Naughty Emacs
2776      452: alt.sex.emacs
2777        0: comp.talk.emacs.recovery
2778   Misc
2779      8: comp.binaries.fractals
2780     13: comp.sources.unix
2781 @end example
2782
2783 So, here we have one top-level topic (@samp{Gnus}), two topics under
2784 that, and one sub-topic under one of the sub-topics.  (There is always
2785 just one (1) top-level topic).  This topology can be expressed as
2786 follows:
2787
2788 @lisp
2789 (("Gnus" visible)
2790  (("Emacs -- I wuw it!" visible) 
2791   (("Naughty Emacs" visible)))
2792  (("Misc" visible)))
2793 @end lisp
2794
2795 @vindex gnus-topic-topology
2796 This is in fact how the variable @code{gnus-topic-topology} would look
2797 for the display above.  That variable is saved in the @file{.newsrc.eld}
2798 file, and shouldn't be messed with manually---unless you really want
2799 to.  Since this variable is read from the @file{.newsrc.eld} file,
2800 setting it in any other startup files will have no effect.  
2801
2802 This topology shows what topics are sub-topics of what topics (right),
2803 and which topics are visible.  Two settings are currently
2804 allowed---@code{visible} and @code{invisible}.
2805
2806
2807 @node Topic Parameters
2808 @subsection Topic Parameters
2809 @cindex topic parameters
2810
2811 All groups in a topic will inherit group parameters from the parent (and
2812 ancestor) topic parameters.  All valid group parameters are valid topic
2813 parameters (@pxref{Group Parameters}).  
2814
2815 Group parameters (of course) override topic parameters, and topic
2816 parameters in sub-topics override topic parameters in super-topics.  You
2817 know.  Normal inheritance rules.  (@dfn{Rules} is here a noun, not a
2818 verb, although you may feel free to disagree with me here.)
2819
2820 @example
2821 Gnus
2822   Emacs
2823      3: comp.emacs
2824      2: alt.religion.emacs
2825    452: alt.sex.emacs
2826     Relief
2827      452: alt.sex.emacs
2828        0: comp.talk.emacs.recovery
2829   Misc
2830      8: comp.binaries.fractals
2831     13: comp.sources.unix
2832    452: alt.sex.emacs
2833 @end example
2834
2835 The @samp{Emacs} topic has the topic parameter @code{(score-file
2836 . "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter
2837 @code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has the
2838 topic parameter @code{(score-file . "emacs.SCORE")}.  In addition,
2839 @samp{alt.religion.emacs} has the group parameter @code{(score-file
2840 . "religion.SCORE")}.
2841
2842 Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you
2843 will get the @file{relief.SCORE} home score file.  If you enter the same
2844 group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home
2845 score file.  If you enter the group @samp{alt.religion.emacs}, you'll
2846 get the @file{religion.SCORE} home score file.
2847
2848 This seems rather simple and self-evident, doesn't it?  Well, yes.  But
2849 there are some problems, especially with the @code{total-expiry}
2850 parameter.  Say you have a mail group in two topics; one with
2851 @code{total-expiry} and one without.  What happens when you do @kbd{M-x
2852 gnus-expire-all-expirable-groups}?  Gnus has no way of telling which one
2853 of these topics you mean to expire articles from, so anything may
2854 happen.  In fact, I hereby declare that it is @dfn{undefined} what
2855 happens.  You just have to be careful if you do stuff like that.
2856
2857
2858 @node Misc Group Stuff
2859 @section Misc Group Stuff
2860
2861 @menu
2862 * Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
2863 * Group Information::     Information and help on groups and Gnus.
2864 * Group Timestamp::       Making Gnus keep track of when you last read a group.
2865 * File Commands::         Reading and writing the Gnus files.
2866 @end menu
2867
2868 @table @kbd
2869
2870 @item ^
2871 @kindex ^ (Group)
2872 @findex gnus-group-enter-server-mode
2873 Enter the server buffer (@code{gnus-group-enter-server-mode}).
2874 @xref{The Server Buffer}.
2875
2876 @item a
2877 @kindex a (Group)
2878 @findex gnus-group-post-news
2879 Post an article to a group (@code{gnus-group-post-news}).  If given a
2880 prefix, the current group name will be used as the default.
2881
2882 @item m
2883 @kindex m (Group)
2884 @findex gnus-group-mail
2885 Mail a message somewhere (@code{gnus-group-mail}).
2886
2887 @end table
2888
2889 Variables for the group buffer:
2890
2891 @table @code
2892
2893 @item gnus-group-mode-hook
2894 @vindex gnus-group-mode-hook
2895 is called after the group buffer has been
2896 created. 
2897
2898 @item gnus-group-prepare-hook
2899 @vindex gnus-group-prepare-hook
2900 is called after the group buffer is
2901 generated.  It may be used to modify the buffer in some strange,
2902 unnatural way.
2903
2904 @item gnus-permanently-visible-groups
2905 @vindex gnus-permanently-visible-groups
2906 Groups matching this regexp will always be listed in the group buffer,
2907 whether they are empty or not.
2908
2909 @end table
2910
2911
2912 @node Scanning New Messages
2913 @subsection Scanning New Messages
2914 @cindex new messages
2915 @cindex scanning new news
2916
2917 @table @kbd
2918
2919 @item g
2920 @kindex g (Group)
2921 @findex gnus-group-get-new-news
2922 @c @icon{gnus-group-get-new-news}
2923 Check the server(s) for new articles.  If the numerical prefix is used,
2924 this command will check only groups of level @var{arg} and lower
2925 (@code{gnus-group-get-new-news}).  If given a non-numerical prefix, this
2926 command will force a total re-reading of the active file(s) from the
2927 backend(s).
2928
2929 @item M-g
2930 @kindex M-g (Group)
2931 @findex gnus-group-get-new-news-this-group
2932 @vindex gnus-goto-next-group-when-activating
2933 @c @icon{gnus-group-get-new-news-this-group}
2934 Check whether new articles have arrived in the current group
2935 (@code{gnus-group-get-new-news-this-group}).
2936 @code{gnus-goto-next-group-when-activating} says whether this command is
2937 to move point to the next group or not.  It is @code{t} by default.
2938
2939 @findex gnus-activate-all-groups
2940 @cindex activating groups
2941 @item C-c M-g
2942 @kindex C-c M-g (Group)
2943 Activate absolutely all groups (@code{gnus-activate-all-groups}). 
2944
2945 @item R
2946 @kindex R (Group)
2947 @cindex restarting
2948 @findex gnus-group-restart
2949 Restart Gnus (@code{gnus-group-restart}).  This saves the @file{.newsrc}
2950 file(s), closes the connection to all servers, clears up all run-time
2951 Gnus variables, and then starts Gnus all over again.
2952
2953 @end table
2954
2955 @vindex gnus-get-new-news-hook
2956 @code{gnus-get-new-news-hook} is run just before checking for new news. 
2957
2958 @vindex gnus-after-getting-new-news-hook
2959 @code{gnus-after-getting-new-news-hook} is run after checking for new
2960 news.
2961
2962
2963 @node Group Information
2964 @subsection Group Information
2965 @cindex group information
2966 @cindex information on groups
2967
2968 @table @kbd
2969
2970
2971 @item H f
2972 @kindex H f (Group)
2973 @findex gnus-group-fetch-faq
2974 @vindex gnus-group-faq-directory
2975 @cindex FAQ
2976 @cindex ange-ftp
2977 Try to fetch the FAQ for the current group
2978 (@code{gnus-group-fetch-faq}).  Gnus will try to get the FAQ from
2979 @code{gnus-group-faq-directory}, which is usually a directory on a
2980 remote machine.  This variable can also be a list of directories.  In
2981 that case, giving a prefix to this command will allow you to choose
2982 between the various sites.  @code{ange-ftp} (or @code{efs}) will be used
2983 for fetching the file.
2984
2985 If fetching from the first site is unsuccessful, Gnus will attempt to go
2986 through @code{gnus-group-faq-directory} and try to open them one by one.
2987
2988 @item H d
2989 @itemx C-c C-d
2990 @c @icon{gnus-group-describe-group}
2991 @kindex H d (Group)
2992 @kindex C-c C-d (Group)
2993 @cindex describing groups
2994 @cindex group description
2995 @findex gnus-group-describe-group
2996 Describe the current group (@code{gnus-group-describe-group}).  If given
2997 a prefix, force Gnus to re-read the description from the server.
2998
2999 @item M-d
3000 @kindex M-d (Group)
3001 @findex gnus-group-describe-all-groups
3002 Describe all groups (@code{gnus-group-describe-all-groups}).  If given a
3003 prefix, force Gnus to re-read the description file from the server.
3004
3005 @item H v
3006 @itemx V
3007 @kindex V (Group)
3008 @kindex H v (Group)
3009 @cindex version
3010 @findex gnus-version
3011 Display current Gnus version numbers (@code{gnus-version}).
3012
3013 @item ?
3014 @kindex ? (Group)
3015 @findex gnus-group-describe-briefly
3016 Give a very short help message (@code{gnus-group-describe-briefly}).
3017
3018 @item C-c C-i
3019 @kindex C-c C-i (Group)
3020 @cindex info
3021 @cindex manual
3022 @findex gnus-info-find-node
3023 Go to the Gnus info node (@code{gnus-info-find-node}).
3024 @end table
3025
3026
3027 @node Group Timestamp
3028 @subsection Group Timestamp
3029 @cindex timestamps
3030 @cindex group timestamps
3031
3032 It can be convenient to let Gnus keep track of when you last read a
3033 group.  To set the ball rolling, you should add
3034 @code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}:
3035
3036 @lisp
3037 (add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
3038 @end lisp
3039
3040 After doing this, each time you enter a group, it'll be recorded.
3041
3042 This information can be displayed in various ways---the easiest is to
3043 use the @samp{%d} spec in the group line format:
3044
3045 @lisp
3046 (setq gnus-group-line-format 
3047       "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n")
3048 @end lisp
3049
3050 This will result in lines looking like:
3051
3052 @example
3053 *        0: mail.ding                                19961002T012943
3054          0: custom                                   19961002T012713
3055 @end example
3056
3057 As you can see, the date is displayed in compact ISO 8601 format.  This
3058 may be a bit too much, so to just display the date, you could say
3059 something like:
3060
3061 @lisp
3062 (setq gnus-group-line-format 
3063       "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n")
3064 @end lisp
3065
3066
3067 @node File Commands
3068 @subsection File Commands
3069 @cindex file commands
3070
3071 @table @kbd
3072
3073 @item r
3074 @kindex r (Group)
3075 @findex gnus-group-read-init-file
3076 @vindex gnus-init-file
3077 @cindex reading init file
3078 Re-read the init file (@code{gnus-init-file}, which defaults to
3079 @file{~/.gnus}) (@code{gnus-group-read-init-file}).
3080
3081 @item s
3082 @kindex s (Group)
3083 @findex gnus-group-save-newsrc
3084 @cindex saving .newsrc
3085 Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted)
3086 (@code{gnus-group-save-newsrc}).  If given a prefix, force saving the
3087 file(s) whether Gnus thinks it is necessary or not.
3088
3089 @c @item Z
3090 @c @kindex Z (Group)
3091 @c @findex gnus-group-clear-dribble
3092 @c Clear the dribble buffer (@code{gnus-group-clear-dribble}).
3093
3094 @end table
3095
3096
3097 @node The Summary Buffer
3098 @chapter The Summary Buffer
3099 @cindex summary buffer
3100
3101 A line for each article is displayed in the summary buffer.  You can
3102 move around, read articles, post articles and reply to articles.
3103
3104 The most common way to a summary buffer is to select a group from the
3105 group buffer (@pxref{Selecting a Group}).  
3106
3107 You can have as many summary buffers open as you wish.
3108
3109 @menu
3110 * Summary Buffer Format::       Deciding how the summary buffer is to look.
3111 * Summary Maneuvering::         Moving around the summary buffer.
3112 * Choosing Articles::           Reading articles.
3113 * Paging the Article::          Scrolling the current article.
3114 * Reply Followup and Post::     Posting articles.
3115 * Canceling and Superseding::   ``Whoops, I shouldn't have called him that.''
3116 * Marking Articles::            Marking articles as read, expirable, etc.
3117 * Limiting::                    You can limit the summary buffer.
3118 * Threading::                   How threads are made.
3119 * Sorting::                     How articles and threads are sorted.
3120 * Asynchronous Fetching::       Gnus might be able to pre-fetch articles.
3121 * Article Caching::             You may store articles in a cache.
3122 * Persistent Articles::         Making articles expiry-resistant.
3123 * Article Backlog::             Having already read articles hang around.
3124 * Saving Articles::             Ways of customizing article saving.
3125 * Decoding Articles::           Gnus can treat series of (uu)encoded articles.
3126 * Article Treatment::           The article buffer can be mangled at will.
3127 * Article Commands::            Doing various things with the article buffer.
3128 * Summary Sorting::             Sorting the summary buffer in various ways.
3129 * Finding the Parent::          No child support? Get the parent.
3130 * Alternative Approaches::      Reading using non-default summaries.
3131 * Tree Display::                A more visual display of threads.
3132 * Mail Group Commands::         Some commands can only be used in mail groups.
3133 * Various Summary Stuff::       What didn't fit anywhere else.
3134 * Exiting the Summary Buffer::  Returning to the Group buffer.
3135 * Crosspost Handling::          How crossposted articles are dealt with.
3136 * Duplicate Suppression::       An alternative when crosspost handling fails.
3137 @end menu
3138
3139
3140 @node Summary Buffer Format
3141 @section Summary Buffer Format
3142 @cindex summary buffer format
3143
3144 @iftex
3145 @iflatex
3146 \gnusfigure{The Summary Buffer}{180}{
3147 \put(0,0){\epsfig{figure=tmp/summary.ps,width=7.5cm}}
3148 \put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-article.ps,width=7.5cm}}}
3149 }
3150 @end iflatex
3151 @end iftex
3152
3153 @menu
3154 * Summary Buffer Lines::     You can specify how summary lines should look.
3155 * Summary Buffer Mode Line:: You can say how the mode line should look.
3156 * Summary Highlighting::     Making the summary buffer all pretty and nice.
3157 @end menu
3158
3159 @findex mail-extract-address-components
3160 @findex gnus-extract-address-components
3161 @vindex gnus-extract-address-components
3162 Gnus will use the value of the @code{gnus-extract-address-components}
3163 variable as a function for getting the name and address parts of a
3164 @code{From} header.  Two pre-defined functions exist:
3165 @code{gnus-extract-address-components}, which is the default, quite
3166 fast, and too simplistic solution; and
3167 @code{mail-extract-address-components}, which works very nicely, but is
3168 slower.  The default function will return the wrong answer in 5% of the
3169 cases.  If this is unacceptable to you, use the other function instead.
3170
3171 @vindex gnus-summary-same-subject
3172 @code{gnus-summary-same-subject} is a string indicating that the current
3173 article has the same subject as the previous.  This string will be used
3174 with those specs that require it.  The default is @code{""}.
3175
3176
3177 @node Summary Buffer Lines
3178 @subsection Summary Buffer Lines
3179
3180 @vindex gnus-summary-line-format
3181 You can change the format of the lines in the summary buffer by changing
3182 the @code{gnus-summary-line-format} variable.  It works along the same
3183 lines as a normal @code{format} string, with some extensions
3184 (@pxref{Formatting Variables}).
3185
3186 The default string is @samp{%U%R%z%I%(%[%4L: %-20,20n%]%) %s\n}.
3187
3188 The following format specification characters are understood:
3189
3190 @table @samp
3191 @item N 
3192 Article number.
3193 @item S
3194 Subject string.
3195 @item s
3196 Subject if the article is the root of the thread or the previous article
3197 had a different subject, @code{gnus-summary-same-subject} otherwise.
3198 (@code{gnus-summary-same-subject} defaults to @code{""}.)
3199 @item F
3200 Full @code{From} header.
3201 @item n
3202 The name (from the @code{From} header).
3203 @item a
3204 The name (from the @code{From} header).  This differs from the @code{n}
3205 spec in that it uses the function designated by the
3206 @code{gnus-extract-address-components} variable, which is slower, but
3207 may be more thorough.
3208 @item A
3209 The address (from the @code{From} header).  This works the same way as
3210 the @code{a} spec.
3211 @item L
3212 Number of lines in the article.
3213 @item c
3214 Number of characters in the article.
3215 @item I
3216 Indentation based on thread level (@pxref{Customizing Threading}).
3217 @item T
3218 Nothing if the article is a root and lots of spaces if it isn't (it
3219 pushes everything after it off the screen).
3220 @item [
3221 Opening bracket, which is normally @samp{[}, but can also be @samp{<}
3222 for adopted articles (@pxref{Customizing Threading}).
3223 @item ]
3224 Closing bracket, which is normally @samp{]}, but can also be @samp{>}
3225 for adopted articles.
3226 @item >
3227 One space for each thread level.
3228 @item <
3229 Twenty minus thread level spaces.
3230 @item U
3231 Unread.
3232 @item R
3233 Replied.
3234 @item i
3235 Score as a number (@pxref{Scoring}).
3236 @item z
3237 @vindex gnus-summary-zcore-fuzz
3238 Zcore, @samp{+} if above the default level and @samp{-} if below the
3239 default level.  If the difference between
3240 @code{gnus-summary-default-level} and the score is less than
3241 @code{gnus-summary-zcore-fuzz}, this spec will not be used.
3242 @item V
3243 Total thread score.
3244 @item x
3245 @code{Xref}.
3246 @item D
3247 @code{Date}.
3248 @item d
3249 The @code{Date} in @code{DD-MMM} format.
3250 @item o
3251 The @code{Date} in @var{YYYYMMDD}@code{T}@var{HHMMSS} format.
3252 @item M
3253 @code{Message-ID}.
3254 @item r
3255 @code{References}.
3256 @item t
3257 Number of articles in the current sub-thread.  Using this spec will slow
3258 down summary buffer generation somewhat.
3259 @item e
3260 An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the
3261 article has any children.
3262 @item P
3263 The line number.
3264 @item O
3265 Download mark.
3266 @item u
3267 User defined specifier.  The next character in the format string should
3268 be a letter.  Gnus will call the function
3269 @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
3270 following @samp{%u}.  The function will be passed the current header as
3271 argument.  The function should return a string, which will be inserted
3272 into the summary just like information from any other summary specifier.
3273 @end table
3274
3275 The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs
3276 have to be handled with care.  For reasons of efficiency, Gnus will
3277 compute what column these characters will end up in, and ``hard-code''
3278 that.  This means that it is invalid to have these specs after a
3279 variable-length spec.  Well, you might not be arrested, but your summary
3280 buffer will look strange, which is bad enough.
3281
3282 The smart choice is to have these specs as far to the left as possible.
3283 (Isn't that the case with everything, though?  But I digress.)
3284
3285 This restriction may disappear in later versions of Gnus.
3286
3287
3288 @node Summary Buffer Mode Line
3289 @subsection Summary Buffer Mode Line
3290
3291 @vindex gnus-summary-mode-line-format
3292 You can also change the format of the summary mode bar.  Set
3293 @code{gnus-summary-mode-line-format} to whatever you like.  The default
3294 is @samp{Gnus: %%b [%A] %Z}.  
3295
3296 Here are the elements you can play with:
3297
3298 @table @samp
3299 @item G
3300 Group name.
3301 @item p
3302 Unprefixed group name.
3303 @item A
3304 Current article number.
3305 @item V
3306 Gnus version.
3307 @item U
3308 Number of unread articles in this group.
3309 @item e
3310 Number of unread articles in this group that aren't displayed in the
3311 summary buffer.
3312 @item Z
3313 A string with the number of unread and unselected articles represented
3314 either as @samp{<%U(+%e) more>} if there are both unread and unselected
3315 articles, and just as @samp{<%U more>} if there are just unread articles
3316 and no unselected ones.
3317 @item g
3318 Shortish group name.  For instance, @samp{rec.arts.anime} will be
3319 shortened to @samp{r.a.anime}. 
3320 @item S
3321 Subject of the current article.
3322 @item u
3323 User-defined spec (@pxref{User-Defined Specs}).
3324 @item s
3325 Name of the current score file (@pxref{Scoring}).
3326 @item d
3327 Number of dormant articles (@pxref{Unread Articles}).
3328 @item t
3329 Number of ticked articles (@pxref{Unread Articles}).
3330 @item r
3331 Number of articles that have been marked as read in this session. 
3332 @item E
3333 Number of articles expunged by the score files.
3334 @end table
3335
3336
3337 @node Summary Highlighting
3338 @subsection Summary Highlighting
3339
3340 @table @code
3341
3342 @item gnus-visual-mark-article-hook
3343 @vindex gnus-visual-mark-article-hook
3344 This hook is run after selecting an article.  It is meant to be used for
3345 highlighting the article in some way.  It is not run if
3346 @code{gnus-visual} is @code{nil}.
3347
3348 @item gnus-summary-update-hook
3349 @vindex gnus-summary-update-hook
3350 This hook is called when a summary line is changed.  It is not run if
3351 @code{gnus-visual} is @code{nil}.
3352
3353 @item gnus-summary-selected-face
3354 @vindex gnus-summary-selected-face
3355 This is the face (or @dfn{font} as some people call it) used to
3356 highlight the current article in the summary buffer.
3357
3358 @item gnus-summary-highlight
3359 @vindex gnus-summary-highlight
3360 Summary lines are highlighted according to this variable, which is a
3361 list where the elements are of the format @var{(FORM . FACE)}.  If you
3362 would, for instance, like ticked articles to be italic and high-scored
3363 articles to be bold, you could set this variable to something like
3364 @lisp
3365 (((eq mark gnus-ticked-mark) . italic)
3366  ((> score default) . bold))
3367 @end lisp
3368 As you may have guessed, if @var{FORM} returns a non-@code{nil} value,
3369 @var{FACE} will be applied to the line.
3370 @end table
3371
3372
3373 @node Summary Maneuvering
3374 @section Summary Maneuvering
3375 @cindex summary movement
3376
3377 All the straight movement commands understand the numeric prefix and
3378 behave pretty much as you'd expect. 
3379
3380 None of these commands select articles.
3381
3382 @table @kbd
3383 @item G M-n
3384 @itemx M-n
3385 @kindex M-n (Summary)
3386 @kindex G M-n (Summary)
3387 @findex gnus-summary-next-unread-subject
3388 Go to the next summary line of an unread article
3389 (@code{gnus-summary-next-unread-subject}). 
3390
3391 @item G M-p
3392 @itemx M-p
3393 @kindex M-p (Summary)
3394 @kindex G M-p (Summary)
3395 @findex gnus-summary-prev-unread-subject
3396 Go to the previous summary line of an unread article
3397 (@code{gnus-summary-prev-unread-subject}). 
3398
3399 @item G j
3400 @itemx j
3401 @kindex j (Summary)
3402 @kindex G j (Summary)
3403 @findex gnus-summary-goto-article
3404 Ask for an article number or @code{Message-ID}, and then go to that
3405 article (@code{gnus-summary-goto-article}).
3406
3407 @item G g
3408 @kindex G g (Summary)
3409 @findex gnus-summary-goto-subject
3410 Ask for an article number and then go to the summary line of that article
3411 without displaying the article (@code{gnus-summary-goto-subject}).
3412 @end table
3413
3414 If Gnus asks you to press a key to confirm going to the next group, you
3415 can use the @kbd{C-n} and @kbd{C-p} keys to move around the group
3416 buffer, searching for the next group to read without actually returning
3417 to the group buffer.
3418
3419 Variables related to summary movement:
3420
3421 @table @code
3422
3423 @vindex gnus-auto-select-next
3424 @item gnus-auto-select-next
3425 If you issue one of the movement commands (like @kbd{n}) and there are
3426 no more unread articles after the current one, Gnus will offer to go to
3427 the next group.  If this variable is @code{t} and the next group is
3428 empty, Gnus will exit summary mode and return to the group buffer.  If
3429 this variable is neither @code{t} nor @code{nil}, Gnus will select the
3430 next group, no matter whether it has any unread articles or not.  As a
3431 special case, if this variable is @code{quietly}, Gnus will select the
3432 next group without asking for confirmation.  If this variable is
3433 @code{almost-quietly}, the same will happen only if you are located on
3434 the last article in the group.  Finally, if this variable is
3435 @code{slightly-quietly}, the @kbd{Z n} command will go to the next group
3436 without confirmation.  Also @pxref{Group Levels}.
3437
3438 @item gnus-auto-select-same
3439 @vindex gnus-auto-select-same
3440 If non-@code{nil}, all the movement commands will try to go to the next
3441 article with the same subject as the current.  (@dfn{Same} here might
3442 mean @dfn{roughly equal}.  See @code{gnus-summary-gather-subject-limit}
3443 for details (@pxref{Customizing Threading}).)  This variable is not
3444 particularly useful if you use a threaded display.
3445
3446 @item gnus-summary-check-current
3447 @vindex gnus-summary-check-current
3448 If non-@code{nil}, all the ``unread'' movement commands will not proceed
3449 to the next (or previous) article if the current article is unread.
3450 Instead, they will choose the current article.
3451
3452 @item gnus-auto-center-summary
3453 @vindex gnus-auto-center-summary
3454 If non-@code{nil}, Gnus will keep the point in the summary buffer
3455 centered at all times.  This makes things quite tidy, but if you have a
3456 slow network connection, or simply do not like this un-Emacsism, you can
3457 set this variable to @code{nil} to get the normal Emacs scrolling
3458 action.  This will also inhibit horizontal re-centering of the summary
3459 buffer, which might make it more inconvenient to read extremely long
3460 threads.
3461
3462 @end table
3463
3464
3465 @node Choosing Articles
3466 @section Choosing Articles
3467 @cindex selecting articles
3468
3469 @menu
3470 * Choosing Commands::        Commands for choosing articles.
3471 * Choosing Variables::       Variables that influence these commands.
3472 @end menu
3473
3474
3475 @node Choosing Commands
3476 @subsection Choosing Commands
3477
3478 None of the following movement commands understand the numeric prefix,
3479 and they all select and display an article.
3480
3481 @table @kbd
3482 @item SPACE
3483 @kindex SPACE (Summary)
3484 @findex gnus-summary-next-page
3485 Select the current article, or, if that one's read already, the next
3486 unread article (@code{gnus-summary-next-page}).
3487
3488 @item G n
3489 @itemx n
3490 @kindex n (Summary)
3491 @kindex G n (Summary)
3492 @findex gnus-summary-next-unread-article
3493 @c @icon{gnus-summary-next-unread}
3494 Go to next unread article (@code{gnus-summary-next-unread-article}).
3495
3496 @item G p
3497 @itemx p
3498 @kindex p (Summary)
3499 @findex gnus-summary-prev-unread-article
3500 @c @icon{gnus-summary-prev-unread}
3501 Go to previous unread article (@code{gnus-summary-prev-unread-article}).
3502
3503 @item G N
3504 @itemx N
3505 @kindex N (Summary)
3506 @kindex G N (Summary)
3507 @findex gnus-summary-next-article
3508 Go to the next article (@code{gnus-summary-next-article}).
3509
3510 @item G P
3511 @itemx P
3512 @kindex P (Summary)
3513 @kindex G P (Summary)
3514 @findex gnus-summary-prev-article
3515 Go to the previous article (@code{gnus-summary-prev-article}).
3516
3517 @item G C-n
3518 @kindex G C-n (Summary)
3519 @findex gnus-summary-next-same-subject
3520 Go to the next article with the same subject
3521 (@code{gnus-summary-next-same-subject}). 
3522
3523 @item G C-p
3524 @kindex G C-p (Summary)
3525 @findex gnus-summary-prev-same-subject
3526 Go to the previous article with the same subject
3527 (@code{gnus-summary-prev-same-subject}). 
3528
3529 @item G f
3530 @itemx .
3531 @kindex G f  (Summary)
3532 @kindex .  (Summary)
3533 @findex gnus-summary-first-unread-article
3534 Go to the first unread article
3535 (@code{gnus-summary-first-unread-article}).
3536
3537 @item G b
3538 @itemx ,
3539 @kindex G b (Summary)
3540 @kindex , (Summary)
3541 @findex gnus-summary-best-unread-article
3542 Go to the article with the highest score
3543 (@code{gnus-summary-best-unread-article}). 
3544
3545 @item G l
3546 @itemx l
3547 @kindex l (Summary)
3548 @kindex G l (Summary)
3549 @findex gnus-summary-goto-last-article
3550 Go to the previous article read (@code{gnus-summary-goto-last-article}).
3551
3552 @item G o
3553 @kindex G o (Summary)
3554 @findex gnus-summary-pop-article
3555 @cindex history
3556 @cindex article history
3557 Pop an article off the summary history and go to this article
3558 (@code{gnus-summary-pop-article}).  This command differs from the
3559 command above in that you can pop as many previous articles off the
3560 history as you like, while @kbd{l} toggles the two last read articles.
3561 For a somewhat related issue (if you use these commands a lot),
3562 @pxref{Article Backlog}.
3563 @end table
3564
3565
3566 @node Choosing Variables
3567 @subsection Choosing Variables
3568
3569 Some variables relevant for moving and selecting articles:
3570
3571 @table @code
3572 @item gnus-auto-extend-newsgroup
3573 @vindex gnus-auto-extend-newsgroup
3574 All the movement commands will try to go to the previous (or next)
3575 article, even if that article isn't displayed in the Summary buffer if
3576 this variable is non-@code{nil}.  Gnus will then fetch the article from
3577 the server and display it in the article buffer.
3578
3579 @item gnus-select-article-hook
3580 @vindex gnus-select-article-hook
3581 This hook is called whenever an article is selected.  By default it
3582 exposes any threads hidden under the selected article.
3583
3584 @item gnus-mark-article-hook
3585 @vindex gnus-mark-article-hook
3586 @findex gnus-summary-mark-unread-as-read
3587 @findex gnus-summary-mark-read-and-unread-as-read
3588 @findex gnus-unread-mark
3589 This hook is called whenever an article is selected.  It is intended to
3590 be used for marking articles as read.  The default value is
3591 @code{gnus-summary-mark-read-and-unread-as-read}, and will change the
3592 mark of almost any article you read to @code{gnus-unread-mark}.  The
3593 only articles not affected by this function are ticked, dormant, and
3594 expirable articles.  If you'd instead like to just have unread articles
3595 marked as read, you can use @code{gnus-summary-mark-unread-as-read}
3596 instead.  It will leave marks like @code{gnus-low-score-mark},
3597 @code{gnus-del-mark} (and so on) alone.
3598
3599 @end table
3600
3601
3602 @node Paging the Article
3603 @section Scrolling the Article
3604 @cindex article scrolling
3605
3606 @table @kbd
3607
3608 @item SPACE
3609 @kindex SPACE (Summary)
3610 @findex gnus-summary-next-page
3611 Pressing @kbd{SPACE} will scroll the current article forward one page,
3612 or, if you have come to the end of the current article, will choose the
3613 next article (@code{gnus-summary-next-page}).
3614
3615 @item DEL
3616 @kindex DEL (Summary)
3617 @findex gnus-summary-prev-page
3618 Scroll the current article back one page (@code{gnus-summary-prev-page}). 
3619
3620 @item RET
3621 @kindex RET (Summary)
3622 @findex gnus-summary-scroll-up
3623 Scroll the current article one line forward
3624 (@code{gnus-summary-scroll-up}).
3625
3626 @item A g
3627 @itemx g
3628 @kindex A g (Summary)
3629 @kindex g (Summary)
3630 @findex gnus-summary-show-article
3631 (Re)fetch the current article (@code{gnus-summary-show-article}).  If
3632 given a prefix, fetch the current article, but don't run any of the
3633 article treatment functions.  This will give you a ``raw'' article, just
3634 the way it came from the server.
3635
3636 @item A <
3637 @itemx <
3638 @kindex < (Summary)
3639 @kindex A < (Summary)
3640 @findex gnus-summary-beginning-of-article
3641 Scroll to the beginning of the article
3642 (@code{gnus-summary-beginning-of-article}).
3643
3644 @item A >
3645 @itemx >
3646 @kindex > (Summary)
3647 @kindex A > (Summary)
3648 @findex gnus-summary-end-of-article
3649 Scroll to the end of the article (@code{gnus-summary-end-of-article}).
3650
3651 @item A s 
3652 @itemx s
3653 @kindex A s (Summary)
3654 @kindex s (Summary)
3655 @findex gnus-summary-isearch-article
3656 Perform an isearch in the article buffer
3657 (@code{gnus-summary-isearch-article}).
3658
3659 @item h
3660 @kindex h (Summary)
3661 @findex gnus-summary-select-article-buffer
3662 Select the article buffer (@code{gnus-summary-select-article-buffer}).
3663
3664 @end table
3665
3666
3667 @node Reply Followup and Post
3668 @section Reply, Followup and Post
3669
3670 @menu
3671 * Summary Mail Commands::            Sending mail.
3672 * Summary Post Commands::            Sending news.
3673 @end menu
3674
3675
3676 @node Summary Mail Commands
3677 @subsection Summary Mail Commands
3678 @cindex mail
3679 @cindex composing mail
3680
3681 Commands for composing a mail message:
3682
3683 @table @kbd
3684
3685 @item S r
3686 @itemx r
3687 @kindex S r (Summary)
3688 @kindex r (Summary)
3689 @findex gnus-summary-reply
3690 @c @icon{gnus-summary-mail-reply}
3691 @c @icon{gnus-summary-reply}
3692 Mail a reply to the author of the current article
3693 (@code{gnus-summary-reply}). 
3694
3695 @item S R
3696 @itemx R
3697 @kindex R (Summary)
3698 @kindex S R (Summary)
3699 @findex gnus-summary-reply-with-original
3700 @c @icon{gnus-summary-reply-with-original}
3701 Mail a reply to the author of the current article and include the
3702 original message (@code{gnus-summary-reply-with-original}).  This
3703 command uses the process/prefix convention.
3704
3705 @item S w
3706 @kindex S w (Summary)
3707 @findex gnus-summary-wide-reply
3708 Mail a wide reply to the author of the current article
3709 (@code{gnus-summary-wide-reply}).  A @dfn{wide reply} is a reply that
3710 goes out to all people listed in the @code{To}, @code{From} (or
3711 @code{Reply-to}) and @code{Cc} headers.
3712
3713 @item S W
3714 @kindex S W (Summary)
3715 @findex gnus-summary-wide-reply-with-original
3716 Mail a wide reply to the current article and include the original
3717 message (@code{gnus-summary-reply-with-original}).  This command uses
3718 the process/prefix convention.
3719
3720 @item S o m
3721 @kindex S o m (Summary)
3722 @findex gnus-summary-mail-forward
3723 @c @icon{gnus-summary-mail-forward}
3724 Forward the current article to some other person
3725 (@code{gnus-summary-mail-forward}).  If given a prefix, include the full
3726 headers of the forwarded article.
3727
3728 @item S m
3729 @itemx m
3730 @kindex m (Summary)
3731 @kindex S m (Summary)
3732 @findex gnus-summary-mail-other-window
3733 @c @icon{gnus-summary-mail-originate}
3734 Send a mail to some other person
3735 (@code{gnus-summary-mail-other-window}).
3736
3737 @item S D b
3738 @kindex S D b (Summary)
3739 @findex gnus-summary-resend-bounced-mail
3740 @cindex bouncing mail
3741 If you have sent a mail, but the mail was bounced back to you for some
3742 reason (wrong address, transient failure), you can use this command to
3743 resend that bounced mail (@code{gnus-summary-resend-bounced-mail}).  You
3744 will be popped into a mail buffer where you can edit the headers before
3745 sending the mail off again.  If you give a prefix to this command, and
3746 the bounced mail is a reply to some other mail, Gnus will try to fetch
3747 that mail and display it for easy perusal of its headers.  This might
3748 very well fail, though.
3749
3750 @item S D r
3751 @kindex S D r (Summary)
3752 @findex gnus-summary-resend-message
3753 Not to be confused with the previous command,
3754 @code{gnus-summary-resend-message} will prompt you for an address to
3755 send the current message off to, and then send it to that place.  The
3756 headers of the message won't be altered---but lots of headers that say
3757 @code{Resent-To}, @code{Resent-From} and so on will be added.  This
3758 means that you actually send a mail to someone that has a @code{To}
3759 header that (probably) points to yourself.  This will confuse people.
3760 So, natcherly you'll only do that if you're really eVIl.  
3761
3762 This command is mainly used if you have several accounts and want to
3763 ship a mail to a different account of yours.  (If you're both
3764 @code{root} and @code{postmaster} and get a mail for @code{postmaster}
3765 to the @code{root} account, you may want to resend it to
3766 @code{postmaster}.  Ordnung muß sein!
3767
3768 This command understands the process/prefix convention
3769 (@pxref{Process/Prefix}). 
3770
3771 @item S O m
3772 @kindex S O m (Summary)
3773 @findex gnus-uu-digest-mail-forward
3774 Digest the current series (@pxref{Decoding Articles}) and forward the
3775 result using mail (@code{gnus-uu-digest-mail-forward}).  This command
3776 uses the process/prefix convention (@pxref{Process/Prefix}).
3777
3778 @item S M-c
3779 @kindex S M-c (Summary)
3780 @findex gnus-summary-mail-crosspost-complaint
3781 @cindex crossposting
3782 @cindex excessive crossposting
3783 Send a complaint about excessive crossposting to the author of the
3784 current article (@code{gnus-summary-mail-crosspost-complaint}).  
3785
3786 @findex gnus-crosspost-complaint
3787 This command is provided as a way to fight back agains the current
3788 crossposting pandemic that's sweeping Usenet.  It will compose a reply
3789 using the @code{gnus-crosspost-complaint} variable as a preamble.  This
3790 command understands the process/prefix convention
3791 (@pxref{Process/Prefix}) and will prompt you before sending each mail.
3792
3793 @end table
3794
3795
3796 @node Summary Post Commands
3797 @subsection Summary Post Commands
3798 @cindex post
3799 @cindex composing news
3800
3801 Commands for posting a news article:
3802
3803 @table @kbd
3804 @item S p
3805 @itemx a
3806 @kindex a (Summary)
3807 @kindex S p (Summary)
3808 @findex gnus-summary-post-news
3809 @c @icon{gnus-summary-post-news}
3810 Post an article to the current group
3811 (@code{gnus-summary-post-news}).
3812
3813 @item S f
3814 @itemx f
3815 @kindex f (Summary)
3816 @kindex S f (Summary)
3817 @findex gnus-summary-followup
3818 @c @icon{gnus-summary-followup}
3819 Post a followup to the current article (@code{gnus-summary-followup}).
3820
3821 @item S F
3822 @itemx F
3823 @kindex S F (Summary)
3824 @kindex F (Summary)
3825 @c @icon{gnus-summary-followup-with-original}
3826 @findex gnus-summary-followup-with-original
3827 Post a followup to the current article and include the original message
3828 (@code{gnus-summary-followup-with-original}).   This command uses the
3829 process/prefix convention.
3830
3831 @item S n
3832 @kindex S n (Summary)
3833 @findex gnus-summary-followup-to-mail
3834 Post a followup to the current article via news, even if you got the
3835 message through mail (@code{gnus-summary-followup-to-mail}).
3836
3837 @item S n
3838 @kindex S n (Summary)
3839 @findex gnus-summary-followup-to-mail
3840 Post a followup to the current article via news, even if you got the
3841 message through mail and include the original message
3842 (@code{gnus-summary-followup-to-mail-with-original}).  This command uses
3843 the process/prefix convention.
3844
3845 @item S o p
3846 @kindex S o p (Summary)
3847 @findex gnus-summary-post-forward
3848 Forward the current article to a newsgroup
3849 (@code{gnus-summary-post-forward}).  If given a prefix, include the full
3850 headers of the forwarded article.
3851
3852 @item S O p
3853 @kindex S O p (Summary)
3854 @findex gnus-uu-digest-post-forward
3855 @cindex digests
3856 @cindex making digests
3857 Digest the current series and forward the result to a newsgroup
3858 (@code{gnus-uu-digest-mail-forward}).  This command uses the
3859 process/prefix convention.
3860
3861 @item S u
3862 @kindex S u (Summary)
3863 @findex gnus-uu-post-news
3864 @c @icon{gnus-uu-post-news}
3865 Uuencode a file, split it into parts, and post it as a series
3866 (@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}). 
3867 @end table
3868
3869
3870 @node Canceling and Superseding
3871 @section Canceling Articles
3872 @cindex canceling articles
3873 @cindex superseding articles
3874
3875 Have you ever written something, and then decided that you really,
3876 really, really wish you hadn't posted that?
3877
3878 Well, you can't cancel mail, but you can cancel posts.
3879
3880 @findex gnus-summary-cancel-article
3881 @kindex C (Summary)
3882 @c @icon{gnus-summary-cancel-article}
3883 Find the article you wish to cancel (you can only cancel your own
3884 articles, so don't try any funny stuff).  Then press @kbd{C} or @kbd{S
3885 c} (@code{gnus-summary-cancel-article}).  Your article will be
3886 canceled---machines all over the world will be deleting your article.
3887 This command uses the process/prefix convention (@pxref{Process/Prefix}).
3888
3889 Be aware, however, that not all sites honor cancels, so your article may
3890 live on here and there, while most sites will delete the article in
3891 question.
3892
3893 Gnus will use the ``current'' select method when cancelling.  If you
3894 want to use the standard posting method, use the @samp{a} symbolic
3895 prefix (@pxref{Symbolic Prefixes}).
3896
3897 If you discover that you have made some mistakes and want to do some
3898 corrections, you can post a @dfn{superseding} article that will replace
3899 your original article.
3900
3901 @findex gnus-summary-supersede-article
3902 @kindex S (Summary)
3903 Go to the original article and press @kbd{S s}
3904 (@code{gnus-summary-supersede-article}).  You will be put in a buffer
3905 where you can edit the article all you want before sending it off the
3906 usual way.
3907
3908 The same goes for superseding as for canceling, only more so: Some
3909 sites do not honor superseding.  On those sites, it will appear that you
3910 have posted almost the same article twice.
3911
3912 If you have just posted the article, and change your mind right away,
3913 there is a trick you can use to cancel/supersede the article without
3914 waiting for the article to appear on your site first.  You simply return
3915 to the post buffer (which is called @code{*sent ...*}).  There you will
3916 find the article you just posted, with all the headers intact.  Change
3917 the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes}
3918 header by substituting one of those words for the word
3919 @code{Message-ID}.  Then just press @kbd{C-c C-c} to send the article as
3920 you would do normally.  The previous article will be
3921 canceled/superseded.
3922
3923 Just remember, kids: There is no 'c' in 'supersede'.
3924
3925
3926 @node Marking Articles
3927 @section Marking Articles
3928 @cindex article marking
3929 @cindex article ticking
3930 @cindex marks
3931
3932 There are several marks you can set on an article. 
3933
3934 You have marks that decide the @dfn{readedness} (whoo, neato-keano
3935 neologism ohoy!) of the article.  Alphabetic marks generally mean
3936 @dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.
3937
3938 In addition, you also have marks that do not affect readedness.
3939
3940 @menu
3941 * Unread Articles::      Marks for unread articles.
3942 * Read Articles::        Marks for read articles.
3943 * Other Marks::          Marks that do not affect readedness.
3944 @end menu
3945
3946 @ifinfo
3947 There's a plethora of commands for manipulating these marks:
3948 @end ifinfo
3949
3950 @menu
3951 * Setting Marks::           How to set and remove marks.
3952 * Setting Process Marks::   How to mark articles for later processing.
3953 @end menu
3954
3955
3956 @node Unread Articles
3957 @subsection Unread Articles
3958
3959 The following marks mark articles as (kinda) unread, in one form or
3960 other.
3961
3962 @table @samp
3963 @item !
3964 @vindex gnus-ticked-mark
3965 Marked as ticked (@code{gnus-ticked-mark}).
3966
3967 @dfn{Ticked articles} are articles that will remain visible always.  If
3968 you see an article that you find interesting, or you want to put off
3969 reading it, or replying to it, until sometime later, you'd typically
3970 tick it.  However, articles can be expired, so if you want to keep an
3971 article forever, you'll have to make it persistent (@pxref{Persistent
3972 Articles}).  
3973
3974 @item ?
3975 @vindex gnus-dormant-mark
3976 Marked as dormant (@code{gnus-dormant-mark}).  
3977
3978 @dfn{Dormant articles} will only appear in the summary buffer if there
3979 are followups to it.  If you want to see them even if they don't have
3980 followups, you can use the @kbd{/ D} command (@pxref{Limiting}).
3981
3982 @item SPACE
3983 @vindex gnus-unread-mark
3984 Markes as unread (@code{gnus-unread-mark}).
3985
3986 @dfn{Unread articles} are articles that haven't been read at all yet.
3987 @end table
3988
3989
3990 @node Read Articles
3991 @subsection Read Articles
3992 @cindex expirable mark
3993
3994 All the following marks mark articles as read.
3995
3996 @table @samp
3997
3998 @item r
3999 @vindex gnus-del-mark
4000 These are articles that the user has marked as read with the @kbd{d}
4001 command manually, more or less (@code{gnus-del-mark}).
4002
4003 @item R
4004 @vindex gnus-read-mark
4005 Articles that have actually been read (@code{gnus-read-mark}).
4006
4007 @item O
4008 @vindex gnus-ancient-mark
4009 Articles that were marked as read in previous sessions and are now
4010 @dfn{old} (@code{gnus-ancient-mark}).
4011
4012 @item K
4013 @vindex gnus-killed-mark
4014 Marked as killed (@code{gnus-killed-mark}).
4015
4016 @item X
4017 @vindex gnus-kill-file-mark
4018 Marked as killed by kill files (@code{gnus-kill-file-mark}).
4019
4020 @item Y
4021 @vindex gnus-low-score-mark
4022 Marked as read by having too low a score (@code{gnus-low-score-mark}).
4023
4024 @item C
4025 @vindex gnus-catchup-mark
4026 Marked as read by a catchup (@code{gnus-catchup-mark}).
4027
4028 @item G
4029 @vindex gnus-canceled-mark
4030 Canceled article (@code{gnus-canceled-mark})
4031
4032 @item F
4033 @vindex gnus-souped-mark
4034 @sc{SOUP}ed article (@code{gnus-souped-mark}).  @xref{SOUP}.
4035
4036 @item Q
4037 @vindex gnus-sparse-mark
4038 Sparsely reffed article (@code{gnus-sparse-mark}).  @xref{Customizing
4039 Threading}.
4040
4041 @item M
4042 @vindex gnus-duplicate-mark
4043 Article marked as read by duplicate suppression
4044 (@code{gnus-duplicated-mark}).  @xref{Duplicate Suppression}.
4045
4046 @end table
4047
4048 All these marks just mean that the article is marked as read, really.
4049 They are interpreted differently when doing adaptive scoring, though.
4050
4051 One more special mark, though:
4052
4053 @table @samp
4054 @item E
4055 @vindex gnus-expirable-mark
4056 Marked as expirable (@code{gnus-expirable-mark}).
4057
4058 Marking articles as @dfn{expirable} (or have them marked as such
4059 automatically) doesn't make much sense in normal groups---a user doesn't
4060 control expiring of news articles, but in mail groups, for instance,
4061 articles marked as @dfn{expirable} can be deleted by Gnus at
4062 any time.
4063 @end table
4064
4065
4066 @node Other Marks
4067 @subsection Other Marks
4068 @cindex process mark
4069 @cindex bookmarks
4070
4071 There are some marks that have nothing to do with whether the article is
4072 read or not.
4073
4074 @itemize @bullet
4075
4076 @item 
4077 You can set a bookmark in the current article.  Say you are reading a
4078 long thesis on cats' urinary tracts, and have to go home for dinner
4079 before you've finished reading the thesis.  You can then set a bookmark
4080 in the article, and Gnus will jump to this bookmark the next time it
4081 encounters the article.  @xref{Setting Marks}
4082
4083 @item
4084 @vindex gnus-replied-mark
4085 All articles that you have replied to or made a followup to (i.e., have
4086 answered) will be marked with an @samp{A} in the second column
4087 (@code{gnus-replied-mark}).
4088
4089 @item 
4090 @vindex gnus-cached-mark
4091 Articles stored in the article cache will be marked with an @samp{*} in
4092 the second column (@code{gnus-cached-mark}).  @xref{Article Caching}
4093
4094 @item 
4095 @vindex gnus-saved-mark
4096 Articles ``saved'' (in some manner or other; not necessarily
4097 religiously) are marked with an @samp{S} in the second column
4098 (@code{gnus-saved-mark}).
4099
4100 @item 
4101 @vindex gnus-not-empty-thread-mark
4102 @vindex gnus-empty-thread-mark
4103 If the @samp{%e} spec is used, the presence of threads or not will be
4104 marked with @code{gnus-not-empty-thread-mark} and
4105 @code{gnus-empty-thread-mark} in the third column, respectively.
4106
4107 @item 
4108 @vindex gnus-process-mark
4109 Finally we have the @dfn{process mark} (@code{gnus-process-mark}).  A
4110 variety of commands react to the presence of the process mark.  For
4111 instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view
4112 all articles that have been marked with the process mark.  Articles
4113 marked with the process mark have a @samp{#} in the second column.
4114
4115 @end itemize
4116
4117 You might have noticed that most of these ``non-readedness'' marks
4118 appear in the second column by default.  So if you have a cached, saved,
4119 replied article that you have process-marked, what will that look like?
4120
4121 Nothing much.  The precedence rules go as follows: process -> cache ->
4122 replied -> saved.  So if the article is in the cache and is replied,
4123 you'll only see the cache mark and not the replied mark.
4124
4125
4126 @node Setting Marks
4127 @subsection Setting Marks
4128 @cindex setting marks
4129
4130 All the marking commands understand the numeric prefix.
4131
4132 @table @kbd
4133 @item M c
4134 @itemx M-u
4135 @kindex M c (Summary)
4136 @kindex M-u (Summary)
4137 @findex gnus-summary-clear-mark-forward
4138 @cindex mark as unread
4139 Clear all readedness-marks from the current article
4140 (@code{gnus-summary-clear-mark-forward}).  In other words, mark the
4141 article as unread.
4142
4143 @item M t
4144 @itemx !
4145 @kindex ! (Summary)
4146 @kindex M t (Summary)
4147 @findex gnus-summary-tick-article-forward
4148 Tick the current article (@code{gnus-summary-tick-article-forward}).
4149 @xref{Article Caching} 
4150
4151 @item M ?
4152 @itemx ?
4153 @kindex ? (Summary)
4154 @kindex M ? (Summary)
4155 @findex gnus-summary-mark-as-dormant
4156 Mark the current article as dormant
4157 (@code{gnus-summary-mark-as-dormant}).  @xref{Article Caching} 
4158
4159 @item M d
4160 @itemx d
4161 @kindex M d (Summary)
4162 @kindex d (Summary)
4163 @findex gnus-summary-mark-as-read-forward
4164 Mark the current article as read
4165 (@code{gnus-summary-mark-as-read-forward}).
4166
4167 @item D
4168 @kindex D (Summary)
4169 @findex gnus-summary-mark-as-read-backward
4170 Mark the current article as read and move point to the previous line
4171 (@code{gnus-summary-mark-as-read-backward}).
4172
4173 @item M k
4174 @itemx k
4175 @kindex k (Summary)
4176 @kindex M k (Summary)
4177 @findex gnus-summary-kill-same-subject-and-select
4178 Mark all articles that have the same subject as the current one as read,
4179 and then select the next unread article
4180 (@code{gnus-summary-kill-same-subject-and-select}).
4181
4182 @item M K
4183 @itemx C-k
4184 @kindex M K (Summary)
4185 @kindex C-k (Summary)
4186 @findex gnus-summary-kill-same-subject
4187 Mark all articles that have the same subject as the current one as read
4188 (@code{gnus-summary-kill-same-subject}).  
4189
4190 @item M C
4191 @kindex M C (Summary)
4192 @findex gnus-summary-catchup
4193 @c @icon{gnus-summary-catchup}
4194 Mark all unread articles as read (@code{gnus-summary-catchup}).
4195
4196 @item M C-c
4197 @kindex M C-c (Summary)
4198 @findex gnus-summary-catchup-all
4199 Mark all articles in the group as read---even the ticked and dormant
4200 articles (@code{gnus-summary-catchup-all}).
4201
4202 @item M H
4203 @kindex M H (Summary)
4204 @findex gnus-summary-catchup-to-here
4205 Catchup the current group to point
4206 (@code{gnus-summary-catchup-to-here}). 
4207
4208 @item C-w
4209 @kindex C-w (Summary)
4210 @findex gnus-summary-mark-region-as-read
4211 Mark all articles between point and mark as read
4212 (@code{gnus-summary-mark-region-as-read}). 
4213
4214 @item M V k
4215 @kindex M V k (Summary)
4216 @findex gnus-summary-kill-below
4217 Kill all articles with scores below the default score (or below the
4218 numeric prefix) (@code{gnus-summary-kill-below}).
4219
4220 @item M e
4221 @itemx E
4222 @kindex M e (Summary)
4223 @kindex E (Summary)
4224 @findex gnus-summary-mark-as-expirable
4225 Mark the current article as expirable
4226 (@code{gnus-summary-mark-as-expirable}).
4227
4228 @item M b
4229 @kindex M b (Summary)
4230 @findex gnus-summary-set-bookmark
4231 Set a bookmark in the current article
4232 (@code{gnus-summary-set-bookmark}).
4233
4234 @item M B
4235 @kindex M B (Summary)
4236 @findex gnus-summary-remove-bookmark
4237 Remove the bookmark from the current article
4238 (@code{gnus-summary-remove-bookmark}).
4239
4240 @item M V c
4241 @kindex M V c (Summary)
4242 @findex gnus-summary-clear-above
4243 Clear all marks from articles with scores over the default score (or
4244 over the numeric prefix) (@code{gnus-summary-clear-above}).
4245
4246 @item M V u
4247 @kindex M V u (Summary)
4248 @findex gnus-summary-tick-above
4249 Tick all articles with scores over the default score (or over the
4250 numeric prefix) (@code{gnus-summary-tick-above}).
4251
4252 @item M V m
4253 @kindex M V m (Summary)
4254 @findex gnus-summary-mark-above
4255 Prompt for a mark, and mark all articles with scores over the default
4256 score (or over the numeric prefix) with this mark
4257 (@code{gnus-summary-clear-above}).
4258 @end table
4259
4260 @vindex gnus-summary-goto-unread
4261 The @code{gnus-summary-goto-unread} variable controls what action should
4262 be taken after setting a mark.  If non-@code{nil}, point will move to
4263 the next/previous unread article.  If @code{nil}, point will just move
4264 one line up or down.  As a special case, if this variable is
4265 @code{never}, all the marking commands as well as other commands (like
4266 @kbd{SPACE}) will move to the next article, whether it is unread or not.
4267 The default is @code{t}.
4268
4269
4270 @node Setting Process Marks
4271 @subsection Setting Process Marks
4272 @cindex setting process marks
4273
4274 @table @kbd
4275
4276 @item M P p
4277 @itemx #
4278 @kindex # (Summary)
4279 @kindex M P p (Summary)
4280 @findex gnus-summary-mark-as-processable
4281 Mark the current article with the process mark
4282 (@code{gnus-summary-mark-as-processable}). 
4283 @findex gnus-summary-unmark-as-processable
4284
4285 @item M P u 
4286 @itemx M-#
4287 @kindex M P u (Summary)
4288 @kindex M-# (Summary)
4289 Remove the process mark, if any, from the current article
4290 (@code{gnus-summary-unmark-as-processable}).
4291
4292 @item M P U
4293 @kindex M P U (Summary)
4294 @findex gnus-summary-unmark-all-processable
4295 Remove the process mark from all articles
4296 (@code{gnus-summary-unmark-all-processable}). 
4297
4298 @item M P i
4299 @kindex M P i (Summary)
4300 @findex gnus-uu-invert-processable
4301 Invert the list of process marked articles
4302 (@code{gnus-uu-invert-processable}). 
4303
4304 @item M P R
4305 @kindex M P R (Summary)
4306 @findex gnus-uu-mark-by-regexp
4307 Mark articles by a regular expression (@code{gnus-uu-mark-by-regexp}). 
4308
4309 @item M P r
4310 @kindex M P r (Summary)
4311 @findex gnus-uu-mark-region
4312 Mark articles in region (@code{gnus-uu-mark-region}).
4313
4314 @item M P t
4315 @kindex M P t (Summary)
4316 @findex gnus-uu-mark-thread
4317 Mark all articles in the current (sub)thread
4318 (@code{gnus-uu-mark-thread}).
4319
4320 @item M P T
4321 @kindex M P T (Summary)
4322 @findex gnus-uu-unmark-thread
4323 Unmark all articles in the current (sub)thread
4324 (@code{gnus-uu-unmark-thread}).
4325
4326 @item M P v
4327 @kindex M P v (Summary)
4328 @findex gnus-uu-mark-over
4329 Mark all articles that have a score above the prefix argument
4330 (@code{gnus-uu-mark-over}).
4331
4332 @item M P s
4333 @kindex M P s (Summary)
4334 @findex gnus-uu-mark-series
4335 Mark all articles in the current series (@code{gnus-uu-mark-series}).
4336
4337 @item M P S
4338 @kindex M P S (Summary)
4339 @findex gnus-uu-mark-sparse
4340 Mark all series that have already had some articles marked
4341 (@code{gnus-uu-mark-sparse}).
4342
4343 @item M P a
4344 @kindex M P a (Summary)
4345 @findex gnus-uu-mark-all
4346 Mark all articles in series order (@code{gnus-uu-mark-series}).
4347
4348 @item M P b
4349 @kindex M P b (Summary)
4350 @findex gnus-uu-mark-buffer
4351 Mark all articles in the buffer in the order they appear
4352 (@code{gnus-uu-mark-buffer}). 
4353
4354 @item M P k
4355 @kindex M P k (Summary)
4356 @findex gnus-summary-kill-process-mark
4357 Push the current process mark set onto the stack and unmark all articles
4358 (@code{gnus-summary-kill-process-mark}).
4359
4360 @item M P y
4361 @kindex M P y (Summary)
4362 @findex gnus-summary-yank-process-mark
4363 Pop the previous process mark set from the stack and restore it
4364 (@code{gnus-summary-yank-process-mark}).
4365
4366 @item M P w
4367 @kindex M P w (Summary)
4368 @findex gnus-summary-save-process-mark
4369 Push the current process mark set onto the stack
4370 (@code{gnus-summary-save-process-mark}).
4371
4372 @end table
4373
4374
4375 @node Limiting
4376 @section Limiting
4377 @cindex limiting
4378
4379 It can be convenient to limit the summary buffer to just show some
4380 subset of the articles currently in the group.  The effect most limit
4381 commands have is to remove a few (or many) articles from the summary
4382 buffer. 
4383
4384 All limiting commands work on subsets of the articles already fetched
4385 from the servers.  None of these commands query the server for
4386 additional articles.
4387
4388 @table @kbd
4389
4390 @item / /
4391 @itemx / s
4392 @kindex / / (Summary)
4393 @findex gnus-summary-limit-to-subject
4394 Limit the summary buffer to articles that match some subject
4395 (@code{gnus-summary-limit-to-subject}). 
4396
4397 @item / a
4398 @kindex / a (Summary)
4399 @findex gnus-summary-limit-to-author
4400 Limit the summary buffer to articles that match some author
4401 (@code{gnus-summary-limit-to-author}).
4402
4403 @item / u
4404 @itemx x
4405 @kindex / u (Summary)
4406 @kindex x (Summary)
4407 @findex gnus-summary-limit-to-unread
4408 Limit the summary buffer to articles not marked as read
4409 (@code{gnus-summary-limit-to-unread}).  If given a prefix, limit the
4410 buffer to articles strictly unread.  This means that ticked and
4411 dormant articles will also be excluded.
4412
4413 @item / m
4414 @kindex / m (Summary)
4415 @findex gnus-summary-limit-to-marks
4416 Ask for a mark and then limit to all articles that have not been marked
4417 with that mark (@code{gnus-summary-limit-to-marks}).
4418
4419 @item / t
4420 @kindex / t (Summary)
4421 @findex gnus-summary-limit-to-age
4422 Ask for a number and then limit the summary buffer to articles older than (or equal to) that number of days
4423 (@code{gnus-summary-limit-to-marks}).  If given a prefix, limit to
4424 articles younger than that number of days.
4425
4426 @item / n
4427 @kindex / n (Summary)
4428 @findex gnus-summary-limit-to-articles
4429 Limit the summary buffer to the current article
4430 (@code{gnus-summary-limit-to-articles}).  Uses the process/prefix
4431 convention (@pxref{Process/Prefix}).
4432
4433 @item / w
4434 @kindex / w (Summary)
4435 @findex gnus-summary-pop-limit
4436 Pop the previous limit off the stack and restore it
4437 (@code{gnus-summary-pop-limit}).  If given a prefix, pop all limits off
4438 the stack.
4439
4440 @item / v
4441 @kindex / v (Summary)
4442 @findex gnus-summary-limit-to-score
4443 Limit the summary buffer to articles that have a score at or above some
4444 score (@code{gnus-summary-limit-to-score}).
4445
4446 @item / E
4447 @itemx M S
4448 @kindex M S (Summary)
4449 @kindex / E (Summary)
4450 @findex gnus-summary-limit-include-expunged
4451 Display all expunged articles
4452 (@code{gnus-summary-limit-include-expunged}). 
4453
4454 @item / D
4455 @kindex / D (Summary)
4456 @findex gnus-summary-limit-include-dormant
4457 Display all dormant articles (@code{gnus-summary-limit-include-dormant}).
4458
4459 @item / d
4460 @kindex / d (Summary)
4461 @findex gnus-summary-limit-exclude-dormant
4462 Hide all dormant articles (@code{gnus-summary-limit-exclude-dormant}).
4463
4464 @item / T
4465 @kindex / T (Summary)
4466 @findex gnus-summary-limit-include-thread
4467 Include all the articles in the current thread.
4468
4469 @item / c
4470 @kindex / c (Summary)
4471 @findex gnus-summary-limit-exclude-childless-dormant
4472 Hide all dormant articles that have no children
4473 (@code{gnus-summary-limit-exclude-childless-dormant}). 
4474
4475 @item / C
4476 @kindex / C (Summary)
4477 @findex gnus-summary-limit-mark-excluded-as-read
4478 Mark all excluded unread articles as read
4479 (@code{gnus-summary-limit-mark-excluded-as-read}).   If given a prefix,
4480 also mark excluded ticked and dormant articles as read.
4481
4482 @end table
4483
4484
4485 @node Threading
4486 @section Threading
4487 @cindex threading
4488 @cindex article threading
4489
4490 Gnus threads articles by default.  @dfn{To thread} is to put responses
4491 to articles directly after the articles they respond to---in a
4492 hierarchical fashion.
4493
4494 Threading is done by looking at the @code{References} headers of the
4495 articles.  In a perfect world, this would be enough to build pretty
4496 trees, but unfortunately, the @code{References} header is often broken
4497 or simply missing.  Weird news propagration excarcerbates the problem,
4498 so one has to employ other heuristics to get pleasing results.  A
4499 plethora of approaches exists, as detailed in horrible detail in
4500 @pxref{Customizing Threading}. 
4501
4502 First, a quick overview of the concepts:
4503
4504 @table @dfn
4505 @item root
4506 The top-most article in a thread; the first article in the thread.
4507
4508 @item thread
4509 A tree-like article structure.
4510
4511 @item sub-thread
4512 A small(er) section of this tree-like structure.
4513
4514 @item loose threads
4515 Threads often lose their roots due to article expiry, or due to the root
4516 already having been read in a previous session, and not displayed in the
4517 summary buffer.  We then typicall have many sub-threads that really
4518 belong to one thread, but are without connecting roots.  These are
4519 called loose threads.
4520
4521 @item thread gathering
4522 An attempt to gather loose threads into bigger threads.
4523
4524 @item sparse threads
4525 A thread where the missing articles have been ``guessed'' at, and are
4526 displayed as empty lines in the summary buffer.
4527
4528 @end table
4529
4530
4531 @menu
4532 * Customizing Threading::     Variables you can change to affect the threading.
4533 * Thread Commands::           Thread based commands in the summary buffer.
4534 @end menu
4535
4536
4537 @node Customizing Threading
4538 @subsection Customizing Threading
4539 @cindex customizing threading
4540
4541 @menu
4542 * Loose Threads::        How Gnus gathers loose threads into bigger threads.
4543 * Filling In Threads::   Making the threads displayed look fuller.
4544 * More Threading::       Even more variables for fiddling with threads.
4545 * Low-Level Threading::  You thought it was over... but you were wrong!
4546 @end menu
4547
4548
4549 @node Loose Threads
4550 @subsubsection Loose Threads
4551 @cindex <
4552 @cindex >
4553 @cindex loose threads
4554
4555 @table @code
4556 @item gnus-summary-make-false-root
4557 @vindex gnus-summary-make-false-root
4558 If non-@code{nil}, Gnus will gather all loose subtrees into one big tree
4559 and create a dummy root at the top.  (Wait a minute.  Root at the top?
4560 Yup.)  Loose subtrees occur when the real root has expired, or you've
4561 read or killed the root in a previous session.
4562
4563 When there is no real root of a thread, Gnus will have to fudge
4564 something.  This variable says what fudging method Gnus should use.
4565 There are four possible values:
4566
4567 @iftex
4568 @iflatex
4569 \gnusfigure{The Summary Buffer}{390}{
4570 \put(0,0){\epsfig{figure=tmp/summary-adopt.ps,width=7.5cm}}
4571 \put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-empty.ps,width=7.5cm}}}
4572 \put(0,400){\makebox(0,0)[tl]{\epsfig{figure=tmp/summary-none.ps,width=7.5cm}}}
4573 \put(445,400){\makebox(0,0)[tr]{\epsfig{figure=tmp/summary-dummy.ps,width=7.5cm}}}
4574 }
4575 @end iflatex
4576 @end iftex
4577
4578 @cindex adopting articles
4579
4580 @table @code
4581
4582 @item adopt
4583 Gnus will make the first of the orphaned articles the parent.  This
4584 parent will adopt all the other articles.  The adopted articles will be
4585 marked as such by pointy brackets (@samp{<>}) instead of the standard
4586 square brackets (@samp{[]}).  This is the default method.
4587
4588 @item dummy
4589 @vindex gnus-summary-dummy-line-format
4590 Gnus will create a dummy summary line that will pretend to be the
4591 parent.  This dummy line does not correspond to any real article, so
4592 selecting it will just select the first real article after the dummy
4593 article.  @code{gnus-summary-dummy-line-format} is used to specify the
4594 format of the dummy roots.  It accepts only one format spec:  @samp{S},
4595 which is the subject of the article.  @xref{Formatting Variables}.
4596
4597 @item empty
4598 Gnus won't actually make any article the parent, but simply leave the
4599 subject field of all orphans except the first empty.  (Actually, it will
4600 use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
4601 Buffer Format}).)
4602
4603 @item none
4604 Don't make any article parent at all.  Just gather the threads and
4605 display them after one another.
4606
4607 @item nil
4608 Don't gather loose threads.
4609 @end table
4610
4611 @item gnus-summary-gather-subject-limit
4612 @vindex gnus-summary-gather-subject-limit
4613 Loose threads are gathered by comparing subjects of articles.  If this
4614 variable is @code{nil}, Gnus requires an exact match between the
4615 subjects of the loose threads before gathering them into one big
4616 super-thread.  This might be too strict a requirement, what with the
4617 presence of stupid newsreaders that chop off long subject lines.  If
4618 you think so, set this variable to, say, 20 to require that only the
4619 first 20 characters of the subjects have to match.  If you set this
4620 variable to a really low number, you'll find that Gnus will gather
4621 everything in sight into one thread, which isn't very helpful.
4622
4623 @cindex fuzzy article gathering
4624 If you set this variable to the special value @code{fuzzy}, Gnus will
4625 use a fuzzy string comparison algorithm on the subjects (@pxref{Fuzzy
4626 Matching}). 
4627
4628 @item gnus-simplify-subject-fuzzy-regexp
4629 @vindex gnus-simplify-subject-fuzzy-regexp
4630 This can either be a regular expression or list of regular expressions
4631 that match strings that will be removed from subjects if fuzzy subject
4632 simplification is used.
4633
4634 @item gnus-simplify-ignored-prefixes
4635 @vindex gnus-simplify-ignored-prefixes
4636 If you set @code{gnus-summary-gather-subject-limit} to something as low
4637 as 10, you might consider setting this variable to something sensible:
4638
4639 @c Written by Michael Ernst <mernst@cs.rice.edu>
4640 @lisp
4641 (setq gnus-simplify-ignored-prefixes
4642       (concat 
4643        "\\`\\[?\\("
4644        (mapconcat 
4645         'identity
4646         '("looking"
4647           "wanted" "followup" "summary\\( of\\)?"
4648           "help" "query" "problem" "question" 
4649           "answer" "reference" "announce"
4650           "How can I" "How to" "Comparison of"
4651           ;; ...
4652           )
4653         "\\|")
4654        "\\)\\s *\\("
4655        (mapconcat 'identity
4656                   '("for" "for reference" "with" "about")
4657                   "\\|")
4658        "\\)?\\]?:?[ \t]*"))
4659 @end lisp
4660
4661 All words that match this regexp will be removed before comparing two
4662 subjects. 
4663
4664 @item gnus-simplify-subject-functions
4665 @vindex gnus-simplify-subject-functions
4666 If non-@code{nil}, this variable overrides
4667 @code{gnus-summary-gather-subject-limit}.  This variable should be a
4668 list of functions to apply to the @code{Subject} string iteratively to
4669 arrive at the simplified version of the string.
4670
4671 Useful functions to put in this list include:
4672
4673 @table @code
4674 @item gnus-simplify-subject-re
4675 @findex gnus-simplify-subject-re
4676 Strip the leading @samp{Re:}.
4677
4678 @item gnus-simplify-subject-fuzzy
4679 @findex gnus-simplify-subject-fuzzy
4680 Simplify fuzzily.
4681
4682 @item gnus-simplify-whitespace
4683 @findex gnus-simplify-whitespace
4684 Remove excessive whitespace.
4685 @end table
4686
4687 You may also write your own functions, of course.
4688
4689
4690 @item gnus-summary-gather-exclude-subject
4691 @vindex gnus-summary-gather-exclude-subject
4692 Since loose thread gathering is done on subjects only, that might lead
4693 to many false hits, especially with certain common subjects like
4694 @samp{} and @samp{(none)}.  To make the situation slightly better,
4695 you can use the regexp @code{gnus-summary-gather-exclude-subject} to say
4696 what subjects should be excluded from the gathering process.@*
4697 The default is @samp{^ *$\\|^(none)$}.  
4698
4699 @item gnus-summary-thread-gathering-function
4700 @vindex gnus-summary-thread-gathering-function
4701 Gnus gathers threads by looking at @code{Subject} headers.  This means
4702 that totally unrelated articles may end up in the same ``thread'', which
4703 is confusing.  An alternate approach is to look at all the
4704 @code{Message-ID}s in all the @code{References} headers to find matches.
4705 This will ensure that no gathered threads ever include unrelated
4706 articles, but it also means that people who have posted with broken
4707 newsreaders won't be gathered properly.  The choice is yours---plague or
4708 cholera:
4709
4710 @table @code
4711 @item gnus-gather-threads-by-subject
4712 @findex gnus-gather-threads-by-subject
4713 This function is the default gathering function and looks at
4714 @code{Subject}s exclusively.
4715
4716 @item gnus-gather-threads-by-references
4717 @findex gnus-gather-threads-by-references
4718 This function looks at @code{References} headers exclusively.
4719 @end table
4720
4721 If you want to test gathering by @code{References}, you could say
4722 something like:
4723
4724 @lisp
4725 (setq gnus-summary-thread-gathering-function
4726       'gnus-gather-threads-by-references)
4727 @end lisp
4728
4729 @end table
4730
4731
4732 @node Filling In Threads
4733 @subsubsection Filling In Threads
4734
4735 @table @code
4736 @item gnus-fetch-old-headers
4737 @vindex gnus-fetch-old-headers
4738 If non-@code{nil}, Gnus will attempt to build old threads by fetching
4739 more old headers---headers to articles marked as read.  If you
4740 would like to display as few summary lines as possible, but still
4741 connect as many loose threads as possible, you should set this variable
4742 to @code{some} or a number.  If you set it to a number, no more than
4743 that number of extra old headers will be fetched.  In either case,
4744 fetching old headers only works if the backend you are using carries
4745 overview files---this would normally be @code{nntp}, @code{nnspool} and
4746 @code{nnml}.  Also remember that if the root of the thread has been
4747 expired by the server, there's not much Gnus can do about that.
4748
4749 This variable can also be set to @code{invisible}.  This won't have any
4750 visible effects, but is useful if you use the @kbd{A T} command a lot
4751 (@pxref{Finding the Parent}). 
4752
4753 @item gnus-build-sparse-threads
4754 @vindex gnus-build-sparse-threads
4755 Fetching old headers can be slow.  A low-rent similar effect can be
4756 gotten by setting this variable to @code{some}.  Gnus will then look at
4757 the complete @code{References} headers of all articles and try to string
4758 together articles that belong in the same thread.  This will leave
4759 @dfn{gaps} in the threading display where Gnus guesses that an article
4760 is missing from the thread.  (These gaps appear like normal summary
4761 lines.  If you select a gap, Gnus will try to fetch the article in
4762 question.)  If this variable is @code{t}, Gnus will display all these
4763 ``gaps'' without regard for whether they are useful for completing the
4764 thread or not.  Finally, if this variable is @code{more}, Gnus won't cut
4765 off sparse leaf nodes that don't lead anywhere.  This variable is
4766 @code{nil} by default.
4767
4768 @end table
4769
4770
4771 @node More Threading
4772 @subsubsection More Threading
4773
4774 @table @code
4775 @item gnus-show-threads
4776 @vindex gnus-show-threads
4777 If this variable is @code{nil}, no threading will be done, and all of
4778 the rest of the variables here will have no effect.  Turning threading
4779 off will speed group selection up a bit, but it is sure to make reading
4780 slower and more awkward.
4781
4782 @item gnus-thread-hide-subtree
4783 @vindex gnus-thread-hide-subtree
4784 If non-@code{nil}, all threads will be hidden when the summary buffer is
4785 generated.
4786
4787 @item gnus-thread-expunge-below
4788 @vindex gnus-thread-expunge-below
4789 All threads that have a total score (as defined by
4790 @code{gnus-thread-score-function}) less than this number will be
4791 expunged.  This variable is @code{nil} by default, which means that no
4792 threads are expunged.
4793
4794 @item gnus-thread-hide-killed
4795 @vindex gnus-thread-hide-killed
4796 if you kill a thread and this variable is non-@code{nil}, the subtree
4797 will be hidden.
4798
4799 @item gnus-thread-ignore-subject
4800 @vindex gnus-thread-ignore-subject
4801 Sometimes somebody changes the subject in the middle of a thread.  If
4802 this variable is non-@code{nil}, the subject change is ignored.  If it
4803 is @code{nil}, which is the default, a change in the subject will result
4804 in a new thread.
4805
4806 @item gnus-thread-indent-level
4807 @vindex gnus-thread-indent-level
4808 This is a number that says how much each sub-thread should be indented.
4809 The default is 4.
4810
4811 @end table
4812
4813
4814 @node Low-Level Threading
4815 @subsubsection Low-Level Threading
4816
4817 @table @code
4818
4819 @item gnus-parse-headers-hook
4820 @vindex gnus-parse-headers-hook
4821 Hook run before parsing any headers.  The default value is
4822 @code{(gnus-decode-rfc1522)}, which means that QPized headers will be
4823 slightly decoded in a hackish way.  This is likely to change in the
4824 future when Gnus becomes @sc{MIME}ified.
4825
4826 @item gnus-alter-header-function
4827 @vindex gnus-alter-header-function
4828 If non-@code{nil}, this function will be called to allow alteration of
4829 article header structures.  The function is called with one parameter,
4830 the article header vector, which it may alter in any way.  For instance,
4831 if you have a mail-to-news gateway which alters the @code{Message-ID}s
4832 in systematic ways (by adding prefixes and such), you can use this
4833 variable to un-scramble the @code{Message-ID}s so that they are more
4834 meaningful.  Here's one example:
4835
4836 @lisp
4837 (setq gnus-alter-header-function 'my-alter-message-id)
4838
4839 (defun my-alter-message-id (header)
4840   (let ((id (mail-header-id header)))
4841     (when (string-match
4842            "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id)
4843       (mail-header-set-id
4844        (concat (match-string 1 id) "@@" (match-string 2 id))
4845        header))))
4846 @end lisp
4847
4848 @end table
4849
4850
4851 @node Thread Commands
4852 @subsection Thread Commands
4853 @cindex thread commands
4854
4855 @table @kbd
4856
4857 @item T k
4858 @itemx M-C-k
4859 @kindex T k (Summary)
4860 @kindex M-C-k (Summary)
4861 @findex gnus-summary-kill-thread
4862 Mark all articles in the current (sub-)thread as read
4863 (@code{gnus-summary-kill-thread}).  If the prefix argument is positive,
4864 remove all marks instead.  If the prefix argument is negative, tick
4865 articles instead.
4866
4867 @item T l
4868 @itemx M-C-l
4869 @kindex T l (Summary)
4870 @kindex M-C-l (Summary)
4871 @findex gnus-summary-lower-thread
4872 Lower the score of the current (sub-)thread
4873 (@code{gnus-summary-lower-thread}). 
4874
4875 @item T i
4876 @kindex T i (Summary)
4877 @findex gnus-summary-raise-thread
4878 Increase the score of the current (sub-)thread
4879 (@code{gnus-summary-raise-thread}).
4880
4881 @item T #
4882 @kindex T # (Summary)
4883 @findex gnus-uu-mark-thread
4884 Set the process mark on the current (sub-)thread
4885 (@code{gnus-uu-mark-thread}).
4886
4887 @item T M-#
4888 @kindex T M-# (Summary)
4889 @findex gnus-uu-unmark-thread
4890 Remove the process mark from the current (sub-)thread
4891 (@code{gnus-uu-unmark-thread}).
4892
4893 @item T T
4894 @kindex T T (Summary)
4895 @findex gnus-summary-toggle-threads
4896 Toggle threading (@code{gnus-summary-toggle-threads}).
4897
4898 @item T s
4899 @kindex T s (Summary)
4900 @findex gnus-summary-show-thread
4901 Expose the (sub-)thread hidden under the current article, if any
4902 (@code{gnus-summary-show-thread}).
4903
4904 @item T h
4905 @kindex T h (Summary)
4906 @findex gnus-summary-hide-thread
4907 Hide the current (sub-)thread (@code{gnus-summary-hide-thread}).
4908
4909 @item T S
4910 @kindex T S (Summary)
4911 @findex gnus-summary-show-all-threads
4912 Expose all hidden threads (@code{gnus-summary-show-all-threads}).
4913
4914 @item T H
4915 @kindex T H (Summary)
4916 @findex gnus-summary-hide-all-threads
4917 Hide all threads (@code{gnus-summary-hide-all-threads}).
4918
4919 @item T t
4920 @kindex T t (Summary)
4921 @findex gnus-summary-rethread-current
4922 Re-thread the current article's thread
4923 (@code{gnus-summary-rethread-current}).  This works even when the
4924 summary buffer is otherwise unthreaded.
4925
4926 @item T ^
4927 @kindex T ^ (Summary)
4928 @findex gnus-summary-reparent-thread
4929 Make the current article the child of the marked (or previous) article
4930 (@code{gnus-summary-reparent-thread}).
4931
4932 @end table
4933
4934 The following commands are thread movement commands.  They all
4935 understand the numeric prefix.
4936
4937 @table @kbd
4938
4939 @item T n
4940 @kindex T n (Summary)
4941 @findex gnus-summary-next-thread
4942 Go to the next thread (@code{gnus-summary-next-thread}).
4943
4944 @item T p
4945 @kindex T p (Summary)
4946 @findex gnus-summary-prev-thread
4947 Go to the previous thread (@code{gnus-summary-prev-thread}).
4948
4949 @item T d
4950 @kindex T d (Summary)
4951 @findex gnus-summary-down-thread
4952 Descend the thread (@code{gnus-summary-down-thread}).
4953
4954 @item T u
4955 @kindex T u (Summary)
4956 @findex gnus-summary-up-thread
4957 Ascend the thread (@code{gnus-summary-up-thread}).
4958
4959 @item T o
4960 @kindex T o (Summary)
4961 @findex gnus-summary-top-thread
4962 Go to the top of the thread (@code{gnus-summary-top-thread}).
4963 @end table
4964
4965 @vindex gnus-thread-operation-ignore-subject 
4966 If you ignore subject while threading, you'll naturally end up with
4967 threads that have several different subjects in them.  If you then issue
4968 a command like `T k' (@code{gnus-summary-kill-thread}) you might not
4969 wish to kill the entire thread, but just those parts of the thread that
4970 have the same subject as the current article.  If you like this idea,
4971 you can fiddle with @code{gnus-thread-operation-ignore-subject}.  If it
4972 is non-@code{nil} (which it is by default), subjects will be ignored
4973 when doing thread commands.  If this variable is @code{nil}, articles in
4974 the same thread with different subjects will not be included in the
4975 operation in question.  If this variable is @code{fuzzy}, only articles
4976 that have subjects fuzzily equal will be included (@pxref{Fuzzy
4977 Matching}).
4978
4979
4980 @node Sorting
4981 @section Sorting
4982
4983 @findex gnus-thread-sort-by-total-score
4984 @findex gnus-thread-sort-by-date
4985 @findex gnus-thread-sort-by-score
4986 @findex gnus-thread-sort-by-subject
4987 @findex gnus-thread-sort-by-author
4988 @findex gnus-thread-sort-by-number
4989 @vindex gnus-thread-sort-functions
4990 If you are using a threaded summary display, you can sort the threads by
4991 setting @code{gnus-thread-sort-functions}, which is a list of functions.
4992 By default, sorting is done on article numbers.  Ready-made sorting
4993 predicate functions include @code{gnus-thread-sort-by-number},
4994 @code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject},
4995 @code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score}, and
4996 @code{gnus-thread-sort-by-total-score}.
4997
4998 Each function takes two threads and returns non-@code{nil} if the first
4999 thread should be sorted before the other.  Note that sorting really is
5000 normally done by looking only at the roots of each thread.  If you use
5001 more than one function, the primary sort key should be the last function
5002 in the list.  You should probably always include
5003 @code{gnus-thread-sort-by-number} in the list of sorting
5004 functions---preferably first.  This will ensure that threads that are
5005 equal with respect to the other sort criteria will be displayed in
5006 ascending article order.
5007
5008 If you would like to sort by score, then by subject, and finally by
5009 number, you could do something like:
5010
5011 @lisp
5012 (setq gnus-thread-sort-functions 
5013       '(gnus-thread-sort-by-number
5014         gnus-thread-sort-by-subject
5015         gnus-thread-sort-by-total-score))
5016 @end lisp
5017
5018 The threads that have highest score will be displayed first in the
5019 summary buffer.  When threads have the same score, they will be sorted
5020 alphabetically.  The threads that have the same score and the same
5021 subject will be sorted by number, which is (normally) the sequence in
5022 which the articles arrived.
5023
5024 If you want to sort by score and then reverse arrival order, you could
5025 say something like:
5026
5027 @lisp
5028 (setq gnus-thread-sort-functions
5029       '((lambda (t1 t2) 
5030           (not (gnus-thread-sort-by-number t2 t1)))
5031         gnus-thread-sort-by-score))
5032 @end lisp
5033
5034 @vindex gnus-thread-score-function
5035 The function in the @code{gnus-thread-score-function} variable (default
5036 @code{+}) is used for calculating the total score of a thread.  Useful
5037 functions might be @code{max}, @code{min}, or squared means, or whatever
5038 tickles your fancy.
5039
5040 @findex gnus-article-sort-functions
5041 @findex gnus-article-sort-by-date
5042 @findex gnus-article-sort-by-score
5043 @findex gnus-article-sort-by-subject
5044 @findex gnus-article-sort-by-author
5045 @findex gnus-article-sort-by-number
5046 If you are using an unthreaded display for some strange reason or other,
5047 you have to fiddle with the @code{gnus-article-sort-functions} variable.
5048 It is very similar to the @code{gnus-thread-sort-functions}, except that
5049 it uses slightly different functions for article comparison.  Available
5050 sorting predicate functions are @code{gnus-article-sort-by-number},
5051 @code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject},
5052 @code{gnus-article-sort-by-date}, and @code{gnus-article-sort-by-score}.
5053
5054 If you want to sort an unthreaded summary display by subject, you could
5055 say something like:
5056
5057 @lisp
5058 (setq gnus-article-sort-functions 
5059       '(gnus-article-sort-by-number
5060         gnus-article-sort-by-subject))
5061 @end lisp
5062
5063
5064
5065 @node Asynchronous Fetching
5066 @section Asynchronous Article Fetching
5067 @cindex asynchronous article fetching
5068 @cindex article pre-fetch
5069 @cindex pre-fetch
5070
5071 If you read your news from an @sc{nntp} server that's far away, the
5072 network latencies may make reading articles a chore.  You have to wait
5073 for a while after pressing @kbd{n} to go to the next article before the
5074 article appears.  Why can't Gnus just go ahead and fetch the article
5075 while you are reading the previous one?  Why not, indeed.
5076
5077 First, some caveats.  There are some pitfalls to using asynchronous
5078 article fetching, especially the way Gnus does it.  
5079
5080 Let's say you are reading article 1, which is short, and article 2 is
5081 quite long, and you are not interested in reading that.  Gnus does not
5082 know this, so it goes ahead and fetches article 2.  You decide to read
5083 article 3, but since Gnus is in the process of fetching article 2, the
5084 connection is blocked.
5085
5086 To avoid these situations, Gnus will open two (count 'em two)
5087 connections to the server.  Some people may think this isn't a very nice
5088 thing to do, but I don't see any real alternatives.  Setting up that
5089 extra connection takes some time, so Gnus startup will be slower.
5090
5091 Gnus will fetch more articles than you will read.  This will mean that
5092 the link between your machine and the @sc{nntp} server will become more
5093 loaded than if you didn't use article pre-fetch.  The server itself will
5094 also become more loaded---both with the extra article requests, and the
5095 extra connection.
5096
5097 Ok, so now you know that you shouldn't really use this thing...  unless
5098 you really want to.
5099
5100 @vindex gnus-asynchronous
5101 Here's how:  Set @code{gnus-asynchronous} to @code{t}.  The rest should
5102 happen automatically.
5103
5104 @vindex gnus-use-article-prefetch
5105 You can control how many articles are to be pre-fetched by setting
5106 @code{gnus-use-article-prefetch}.  This is 30 by default, which means
5107 that when you read an article in the group, the backend will pre-fetch
5108 the next 30 articles.  If this variable is @code{t}, the backend will
5109 pre-fetch all the articles it can without bound.  If it is
5110 @code{nil}, no pre-fetching will be done.
5111
5112 @vindex gnus-async-prefetch-article-p
5113 @findex gnus-async-read-p
5114 There are probably some articles that you don't want to pre-fetch---read
5115 articles, for instance.  The @code{gnus-async-prefetch-article-p} variable controls whether an article is to be pre-fetched.  This function should
5116 return non-@code{nil} when the article in question is to be
5117 pre-fetched.  The default is @code{gnus-async-read-p}, which returns
5118 @code{nil} on read articles.  The function is called with an article
5119 data structure as the only parameter.
5120
5121 If, for instance, you wish to pre-fetch only unread articles shorter than 100 lines, you could say something like:
5122
5123 @lisp
5124 (defun my-async-short-unread-p (data)
5125   "Return non-nil for short, unread articles."
5126   (and (gnus-data-unread-p data)
5127        (< (mail-header-lines (gnus-data-header data))
5128           100)))
5129
5130 (setq gnus-async-prefetch-article-p 'my-async-short-unread-p)
5131 @end lisp
5132
5133 These functions will be called many, many times, so they should
5134 preferably be short and sweet to avoid slowing down Gnus too much.
5135 It's probably a good idea to byte-compile things like this.
5136
5137 @vindex gnus-prefetched-article-deletion-strategy
5138 Articles have to be removed from the asynch buffer sooner or later.  The
5139 @code{gnus-prefetched-article-deletion-strategy} says when to remove
5140 articles.  This is a list that may contain the following elements:
5141
5142 @table @code
5143 @item read
5144 Remove articles when they are read.
5145
5146 @item exit
5147 Remove articles when exiting the group.
5148 @end table
5149
5150 The default value is @code{(read exit)}.
5151
5152 @vindex gnus-use-header-prefetch
5153 If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles
5154 from the next group.
5155
5156
5157 @node Article Caching
5158 @section Article Caching
5159 @cindex article caching
5160 @cindex caching
5161
5162 If you have an @emph{extremely} slow @sc{nntp} connection, you may
5163 consider turning article caching on.  Each article will then be stored
5164 locally under your home directory.  As you may surmise, this could
5165 potentially use @emph{huge} amounts of disk space, as well as eat up all
5166 your inodes so fast it will make your head swim.  In vodka.
5167
5168 Used carefully, though, it could be just an easier way to save articles.
5169
5170 @vindex gnus-use-long-file-name
5171 @vindex gnus-cache-directory
5172 @vindex gnus-use-cache
5173 To turn caching on, set @code{gnus-use-cache} to @code{t}.  By default,
5174 all articles ticked or marked as dormant will then be copied
5175 over to your local cache (@code{gnus-cache-directory}).  Whether this
5176 cache is flat or hierarchal is controlled by the
5177 @code{gnus-use-long-file-name} variable, as usual.
5178
5179 When re-selecting a ticked or dormant article, it will be fetched from the
5180 cache instead of from the server.  As articles in your cache will never
5181 expire, this might serve as a method of saving articles while still
5182 keeping them where they belong.  Just mark all articles you want to save
5183 as dormant, and don't worry.
5184
5185 When an article is marked as read, is it removed from the cache.
5186
5187 @vindex gnus-cache-remove-articles
5188 @vindex gnus-cache-enter-articles
5189 The entering/removal of articles from the cache is controlled by the
5190 @code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}
5191 variables.  Both are lists of symbols.  The first is @code{(ticked
5192 dormant)} by default, meaning that ticked and dormant articles will be
5193 put in the cache.  The latter is @code{(read)} by default, meaning that
5194 articles marked as read are removed from the cache.  Possibly
5195 symbols in these two lists are @code{ticked}, @code{dormant},
5196 @code{unread} and @code{read}.
5197
5198 @findex gnus-jog-cache
5199 So where does the massive article-fetching and storing come into the
5200 picture?  The @code{gnus-jog-cache} command will go through all
5201 subscribed newsgroups, request all unread articles, score them, and
5202 store them in the cache.  You should only ever, ever ever ever, use this
5203 command if 1) your connection to the @sc{nntp} server is really, really,
5204 really slow and 2) you have a really, really, really huge disk.
5205 Seriously.  One way to cut down on the number of articles downloaded is
5206 to score unwanted articles down and have them marked as read.  They will
5207 not then be downloaded by this command.
5208
5209 @vindex gnus-uncacheable-groups
5210 It is likely that you do not want caching on some groups.  For instance,
5211 if your @code{nnml} mail is located under your home directory, it makes no
5212 sense to cache it somewhere else under your home directory.  Unless you
5213 feel that it's neat to use twice as much space.  To limit the caching,
5214 you could set the @code{gnus-uncacheable-groups} regexp to
5215 @samp{^nnml}, for instance.  This variable is @code{nil} by
5216 default.
5217
5218 @findex gnus-cache-generate-nov-databases
5219 @findex gnus-cache-generate-active
5220 @vindex gnus-cache-active-file
5221 The cache stores information on what articles it contains in its active
5222 file (@code{gnus-cache-active-file}).  If this file (or any other parts
5223 of the cache) becomes all messed up for some reason or other, Gnus
5224 offers two functions that will try to set things right.  @kbd{M-x
5225 gnus-cache-generate-nov-databases} will (re)build all the @sc{nov}
5226 files, and @kbd{gnus-cache-generate-active} will (re)generate the active
5227 file.
5228
5229
5230 @node Persistent Articles
5231 @section Persistent Articles
5232 @cindex persistent articles
5233
5234 Closely related to article caching, we have @dfn{persistent articles}.
5235 In fact, it's just a different way of looking at caching, and much more
5236 useful in my opinion.
5237
5238 Say you're reading a newsgroup, and you happen on to some valuable gem
5239 that you want to keep and treasure forever.  You'd normally just save it
5240 (using one of the many saving commands) in some file.  The problem with
5241 that is that it's just, well, yucky.  Ideally you'd prefer just having
5242 the article remain in the group where you found it forever; untouched by
5243 the expiry going on at the news server.
5244
5245 This is what a @dfn{persistent article} is---an article that just won't
5246 be deleted.  It's implemented using the normal cache functions, but
5247 you use two explicit commands for managing persistent articles:
5248
5249 @table @kbd
5250
5251 @item *
5252 @kindex * (Summary)
5253 @findex gnus-cache-enter-article
5254 Make the current article persistent (@code{gnus-cache-enter-article}). 
5255
5256 @item M-*
5257 @kindex M-* (Summary)
5258 @findex gnus-cache-remove-article
5259 Remove the current article from the persistent articles
5260 (@code{gnus-cache-remove-article}).  This will normally delete the
5261 article. 
5262 @end table
5263
5264 Both these commands understand the process/prefix convention. 
5265
5266 To avoid having all ticked articles (and stuff) entered into the cache,
5267 you should set @code{gnus-use-cache} to @code{passive} if you're just
5268 interested in persistent articles:
5269
5270 @lisp
5271 (setq gnus-use-cache 'passive)
5272 @end lisp
5273
5274
5275 @node Article Backlog
5276 @section Article Backlog
5277 @cindex backlog
5278 @cindex article backlog
5279
5280 If you have a slow connection, but the idea of using caching seems
5281 unappealing to you (and it is, really), you can help the situation some
5282 by switching on the @dfn{backlog}.  This is where Gnus will buffer
5283 already read articles so that it doesn't have to re-fetch articles
5284 you've already read.  This only helps if you are in the habit of
5285 re-selecting articles you've recently read, of course.  If you never do
5286 that, turning the backlog on will slow Gnus down a little bit, and
5287 increase memory usage some.
5288
5289 @vindex gnus-keep-backlog
5290 If you set @code{gnus-keep-backlog} to a number @var{n}, Gnus will store
5291 at most @var{n} old articles in a buffer for later re-fetching.  If this
5292 variable is non-@code{nil} and is not a number, Gnus will store
5293 @emph{all} read articles, which means that your Emacs will grow without
5294 bound before exploding and taking your machine down with you.  I put
5295 that in there just to keep y'all on your toes.  
5296
5297 This variable is @code{nil} by default.
5298
5299
5300 @node Saving Articles
5301 @section Saving Articles
5302 @cindex saving articles
5303
5304 Gnus can save articles in a number of ways.  Below is the documentation
5305 for saving articles in a fairly straight-forward fashion (i.e., little
5306 processing of the article is done before it is saved).  For a different
5307 approach (uudecoding, unsharing) you should use @code{gnus-uu}
5308 (@pxref{Decoding Articles}).
5309
5310 @vindex gnus-save-all-headers
5311 If @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not delete
5312 unwanted headers before saving the article.
5313
5314 @vindex gnus-saved-headers
5315 If the preceding variable is @code{nil}, all headers that match the
5316 @code{gnus-saved-headers} regexp will be kept, while the rest will be
5317 deleted before saving.
5318
5319 @table @kbd
5320
5321 @item O o
5322 @itemx o
5323 @kindex O o (Summary)
5324 @kindex o (Summary)
5325 @findex gnus-summary-save-article
5326 @c @icon{gnus-summary-save-article}
5327 Save the current article using the default article saver
5328 (@code{gnus-summary-save-article}). 
5329
5330 @item O m
5331 @kindex O m (Summary)
5332 @findex gnus-summary-save-article-mail
5333 Save the current article in mail format
5334 (@code{gnus-summary-save-article-mail}). 
5335
5336 @item O r
5337 @kindex O r (Summary)
5338 @findex gnus-summary-save-article-rmail
5339 Save the current article in rmail format
5340 (@code{gnus-summary-save-article-rmail}). 
5341
5342 @item O f
5343 @kindex O f (Summary)
5344 @findex gnus-summary-save-article-file
5345 @c @icon{gnus-summary-save-article-file}
5346 Save the current article in plain file format
5347 (@code{gnus-summary-save-article-file}). 
5348
5349 @item O F
5350 @kindex O F (Summary)
5351 @findex gnus-summary-write-article-file
5352 Write the current article in plain file format, overwriting any previous
5353 file contents (@code{gnus-summary-write-article-file}). 
5354
5355 @item O b
5356 @kindex O b (Summary)
5357 @findex gnus-summary-save-article-body-file
5358 Save the current article body in plain file format
5359 (@code{gnus-summary-save-article-body-file}). 
5360
5361 @item O h
5362 @kindex O h (Summary)
5363 @findex gnus-summary-save-article-folder
5364 Save the current article in mh folder format
5365 (@code{gnus-summary-save-article-folder}). 
5366
5367 @item O v
5368 @kindex O v (Summary)
5369 @findex gnus-summary-save-article-vm
5370 Save the current article in a VM folder
5371 (@code{gnus-summary-save-article-vm}).
5372
5373 @item O p
5374 @kindex O p (Summary)
5375 @findex gnus-summary-pipe-output
5376 Save the current article in a pipe.  Uhm, like, what I mean is---Pipe
5377 the current article to a process (@code{gnus-summary-pipe-output}).
5378 @end table
5379
5380 @vindex gnus-prompt-before-saving
5381 All these commands use the process/prefix convention
5382 (@pxref{Process/Prefix}).  If you save bunches of articles using these
5383 functions, you might get tired of being prompted for files to save each
5384 and every article in.  The prompting action is controlled by
5385 the @code{gnus-prompt-before-saving} variable, which is @code{always} by
5386 default, giving you that excessive prompting action you know and
5387 loathe.  If you set this variable to @code{t} instead, you'll be prompted
5388 just once for each series of articles you save.  If you like to really
5389 have Gnus do all your thinking for you, you can even set this variable
5390 to @code{nil}, which means that you will never be prompted for files to
5391 save articles in.  Gnus will simply save all the articles in the default
5392 files. 
5393
5394
5395 @vindex gnus-default-article-saver
5396 You can customize the @code{gnus-default-article-saver} variable to make
5397 Gnus do what you want it to.  You can use any of the four ready-made
5398 functions below, or you can create your own.
5399
5400 @table @code
5401
5402 @item gnus-summary-save-in-rmail
5403 @findex gnus-summary-save-in-rmail
5404 @vindex gnus-rmail-save-name
5405 @findex gnus-plain-save-name
5406 This is the default format, @dfn{babyl}.  Uses the function in the
5407 @code{gnus-rmail-save-name} variable to get a file name to save the
5408 article in.  The default is @code{gnus-plain-save-name}.
5409
5410 @item gnus-summary-save-in-mail
5411 @findex gnus-summary-save-in-mail
5412 @vindex gnus-mail-save-name
5413 Save in a Unix mail (mbox) file.  Uses the function in the
5414 @code{gnus-mail-save-name} variable to get a file name to save the
5415 article in.  The default is @code{gnus-plain-save-name}.
5416
5417 @item gnus-summary-save-in-file
5418 @findex gnus-summary-save-in-file
5419 @vindex gnus-file-save-name
5420 @findex gnus-numeric-save-name
5421 Append the article straight to an ordinary file.  Uses the function in
5422 the @code{gnus-file-save-name} variable to get a file name to save the
5423 article in.  The default is @code{gnus-numeric-save-name}.
5424
5425 @item gnus-summary-save-body-in-file
5426 @findex gnus-summary-save-body-in-file
5427 Append the article body to an ordinary file.  Uses the function in the
5428 @code{gnus-file-save-name} variable to get a file name to save the
5429 article in.  The default is @code{gnus-numeric-save-name}.
5430
5431 @item gnus-summary-save-in-folder
5432 @findex gnus-summary-save-in-folder
5433 @findex gnus-folder-save-name
5434 @findex gnus-Folder-save-name
5435 @vindex gnus-folder-save-name
5436 @cindex rcvstore
5437 @cindex MH folders
5438 Save the article to an MH folder using @code{rcvstore} from the MH
5439 library.  Uses the function in the @code{gnus-folder-save-name} variable
5440 to get a file name to save the article in.  The default is
5441 @code{gnus-folder-save-name}, but you can also use
5442 @code{gnus-Folder-save-name}, which creates capitalized names.
5443
5444 @item gnus-summary-save-in-vm
5445 @findex gnus-summary-save-in-vm
5446 Save the article in a VM folder.  You have to have the VM mail
5447 reader to use this setting.
5448 @end table
5449
5450 @vindex gnus-article-save-directory
5451 All of these functions, except for the last one, will save the article
5452 in the @code{gnus-article-save-directory}, which is initialized from the
5453 @code{SAVEDIR} environment variable.  This is @file{~/News/} by
5454 default. 
5455
5456 As you can see above, the functions use different functions to find a
5457 suitable name of a file to save the article in.  Below is a list of
5458 available functions that generate names:
5459
5460 @table @code
5461
5462 @item gnus-Numeric-save-name
5463 @findex gnus-Numeric-save-name
5464 File names like @file{~/News/Alt.andrea-dworkin/45}.
5465
5466 @item gnus-numeric-save-name
5467 @findex gnus-numeric-save-name
5468 File names like @file{~/News/alt.andrea-dworkin/45}.
5469
5470 @item gnus-Plain-save-name
5471 @findex gnus-Plain-save-name
5472 File names like @file{~/News/Alt.andrea-dworkin}.
5473
5474 @item gnus-plain-save-name
5475 @findex gnus-plain-save-name
5476 File names like @file{~/News/alt.andrea-dworkin}.
5477 @end table
5478
5479 @vindex gnus-split-methods
5480 You can have Gnus suggest where to save articles by plonking a regexp into
5481 the @code{gnus-split-methods} alist.  For instance, if you would like to
5482 save articles related to Gnus in the file @file{gnus-stuff}, and articles
5483 related to VM in @code{vm-stuff}, you could set this variable to something
5484 like:
5485
5486 @lisp
5487 (("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff")
5488  ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff")
5489  (my-choosing-function "../other-dir/my-stuff")
5490  ((equal gnus-newsgroup-name "mail.misc") "mail-stuff"))
5491 @end lisp
5492
5493 We see that this is a list where each element is a list that has two
5494 elements---the @dfn{match} and the @dfn{file}.  The match can either be
5495 a string (in which case it is used as a regexp to match on the article
5496 head); it can be a symbol (which will be called as a function with the
5497 group name as a parameter); or it can be a list (which will be
5498 @code{eval}ed).  If any of these actions have a non-@code{nil} result,
5499 the @dfn{file} will be used as a default prompt.  In addition, the
5500 result of the operation itself will be used if the function or form
5501 called returns a string or a list of strings.
5502
5503 You basically end up with a list of file names that might be used when
5504 saving the current article.  (All ``matches'' will be used.)  You will
5505 then be prompted for what you really want to use as a name, with file
5506 name completion over the results from applying this variable.
5507
5508 This variable is @code{((gnus-article-archive-name))} by default, which
5509 means that Gnus will look at the articles it saves for an
5510 @code{Archive-name} line and use that as a suggestion for the file
5511 name. 
5512
5513 Here's an example function to clean up file names somewhat.  If you have
5514 lots of mail groups called things like
5515 @samp{nnml:mail.whatever}, you may want to chop off the beginning of
5516 these group names before creating the file name to save to.  The
5517 following will do just that:
5518
5519 @lisp
5520 (defun my-save-name (group)
5521   (when (string-match "^nnml:mail." group)
5522     (substring group (match-end 0))))
5523
5524 (setq gnus-split-methods
5525       '((gnus-article-archive-name)
5526         (my-save-name)))
5527 @end lisp
5528
5529
5530 @vindex gnus-use-long-file-name
5531 Finally, you have the @code{gnus-use-long-file-name} variable.  If it is
5532 @code{nil}, all the preceding functions will replace all periods
5533 (@samp{.}) in the group names with slashes (@samp{/})---which means that
5534 the functions will generate hierarchies of directories instead of having
5535 all the files in the toplevel directory
5536 (@file{~/News/alt/andrea-dworkin} instead of
5537 @file{~/News/alt.andrea-dworkin}.)  This variable is @code{t} by default
5538 on most systems.  However, for historical reasons, this is @code{nil} on
5539 Xenix and usg-unix-v machines by default.
5540
5541 This function also affects kill and score file names.  If this variable
5542 is a list, and the list contains the element @code{not-score}, long file
5543 names will not be used for score files, if it contains the element
5544 @code{not-save}, long file names will not be used for saving, and if it
5545 contains the element @code{not-kill}, long file names will not be used
5546 for kill files.
5547
5548 If you'd like to save articles in a hierarchy that looks something like
5549 a spool, you could
5550
5551 @lisp
5552 (setq gnus-use-long-file-name '(not-save)) ; to get a hierarchy
5553 (setq gnus-default-article-saver 'gnus-summary-save-in-file) ; no encoding
5554 @end lisp
5555
5556 Then just save with @kbd{o}.  You'd then read this hierarchy with
5557 ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and
5558 the toplevel directory as the argument (@file{~/News/}).  Then just walk
5559 around to the groups/directories with @code{nneething}.
5560
5561
5562 @node Decoding Articles
5563 @section Decoding Articles
5564 @cindex decoding articles
5565
5566 Sometime users post articles (or series of articles) that have been
5567 encoded in some way or other.  Gnus can decode them for you.
5568
5569 @menu 
5570 * Uuencoded Articles::    Uudecode articles.
5571 * Shell Archives::        Unshar articles.
5572 * PostScript Files::      Split PostScript.
5573 * Other Files::           Plain save and binhex.
5574 * Decoding Variables::    Variables for a happy decoding.
5575 * Viewing Files::         You want to look at the result of the decoding?
5576 @end menu
5577
5578 @cindex series
5579 @cindex article series
5580 All these functions use the process/prefix convention
5581 (@pxref{Process/Prefix}) for finding out what articles to work on, with
5582 the extension that a ``single article'' means ``a single series''.  Gnus
5583 can find out by itself what articles belong to a series, decode all the
5584 articles and unpack/view/save the resulting file(s).
5585
5586 Gnus guesses what articles are in the series according to the following
5587 simplish rule: The subjects must be (nearly) identical, except for the
5588 last two numbers of the line.  (Spaces are largely ignored, however.)
5589
5590 For example: If you choose a subject called @samp{cat.gif (2/3)}, Gnus
5591 will find all the articles that match the regexp @samp{^cat.gif
5592 ([0-9]+/[0-9]+).*$}.  
5593
5594 Subjects that are non-standard, like @samp{cat.gif (2/3) Part 6 of a
5595 series}, will not be properly recognized by any of the automatic viewing
5596 commands, and you have to mark the articles manually with @kbd{#}.
5597
5598
5599 @node Uuencoded Articles
5600 @subsection Uuencoded Articles
5601 @cindex uudecode
5602 @cindex uuencoded articles
5603
5604 @table @kbd
5605
5606 @item X u
5607 @kindex X u (Summary)
5608 @findex gnus-uu-decode-uu
5609 @c @icon{gnus-uu-decode-uu}
5610 Uudecodes the current series (@code{gnus-uu-decode-uu}).
5611
5612 @item X U
5613 @kindex X U (Summary)
5614 @findex gnus-uu-decode-uu-and-save
5615 Uudecodes and saves the current series
5616 (@code{gnus-uu-decode-uu-and-save}).
5617
5618 @item X v u
5619 @kindex X v u (Summary)
5620 @findex gnus-uu-decode-uu-view
5621 Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}).
5622
5623 @item X v U
5624 @kindex X v U (Summary)
5625 @findex gnus-uu-decode-uu-and-save-view
5626 Uudecodes, views and saves the current series
5627 (@code{gnus-uu-decode-uu-and-save-view}).
5628
5629 @end table
5630
5631 Remember that these all react to the presence of articles marked with
5632 the process mark.  If, for instance, you'd like to decode and save an
5633 entire newsgroup, you'd typically do @kbd{M P a}
5634 (@code{gnus-uu-mark-all}) and then @kbd{X U}
5635 (@code{gnus-uu-decode-uu-and-save}).
5636
5637 All this is very much different from how @code{gnus-uu} worked with
5638 @sc{gnus 4.1}, where you had explicit keystrokes for everything under
5639 the sun.  This version of @code{gnus-uu} generally assumes that you mark
5640 articles in some way (@pxref{Setting Process Marks}) and then press
5641 @kbd{X u}.
5642
5643 @vindex gnus-uu-notify-files
5644 Note: When trying to decode articles that have names matching
5645 @code{gnus-uu-notify-files}, which is hard-coded to
5646 @samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will
5647 automatically post an article on @samp{comp.unix.wizards} saying that
5648 you have just viewed the file in question.  This feature can't be turned
5649 off.
5650
5651
5652 @node Shell Archives
5653 @subsection Shell Archives
5654 @cindex unshar
5655 @cindex shell archives
5656 @cindex shared articles
5657
5658 Shell archives (``shar files'') used to be a popular way to distribute
5659 sources, but it isn't used all that much today.  In any case, we have
5660 some commands to deal with these:
5661
5662 @table @kbd
5663
5664 @item X s
5665 @kindex X s (Summary)
5666 @findex gnus-uu-decode-unshar
5667 Unshars the current series (@code{gnus-uu-decode-unshar}).
5668
5669 @item X S
5670 @kindex X S (Summary)
5671 @findex gnus-uu-decode-unshar-and-save
5672 Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}).
5673
5674 @item X v s
5675 @kindex X v s (Summary)
5676 @findex gnus-uu-decode-unshar-view
5677 Unshars and views the current series (@code{gnus-uu-decode-unshar-view}).
5678
5679 @item X v S
5680 @kindex X v S (Summary)
5681 @findex gnus-uu-decode-unshar-and-save-view
5682 Unshars, views and saves the current series
5683 (@code{gnus-uu-decode-unshar-and-save-view}). 
5684 @end table
5685
5686
5687 @node PostScript Files
5688 @subsection PostScript Files
5689 @cindex PostScript
5690
5691 @table @kbd
5692
5693 @item X p
5694 @kindex X p (Summary)
5695 @findex gnus-uu-decode-postscript
5696 Unpack the current PostScript series (@code{gnus-uu-decode-postscript}).
5697
5698 @item X P
5699 @kindex X P (Summary)
5700 @findex gnus-uu-decode-postscript-and-save
5701 Unpack and save the current PostScript series
5702 (@code{gnus-uu-decode-postscript-and-save}).
5703
5704 @item X v p
5705 @kindex X v p (Summary)
5706 @findex gnus-uu-decode-postscript-view
5707 View the current PostScript series
5708 (@code{gnus-uu-decode-postscript-view}).
5709
5710 @item X v P
5711 @kindex X v P (Summary)
5712 @findex gnus-uu-decode-postscript-and-save-view
5713 View and save the current PostScript series
5714 (@code{gnus-uu-decode-postscript-and-save-view}). 
5715 @end table
5716
5717
5718 @node Other Files
5719 @subsection Other Files
5720
5721 @table @kbd
5722 @item X o
5723 @kindex X o (Summary)
5724 @findex gnus-uu-decode-save
5725 Save the current series
5726 (@code{gnus-uu-decode-save}).
5727
5728 @item X b
5729 @kindex X b (Summary)
5730 @findex gnus-uu-decode-binhex
5731 Unbinhex the current series (@code{gnus-uu-decode-binhex}).  This
5732 doesn't really work yet.
5733 @end table
5734
5735
5736 @node Decoding Variables
5737 @subsection Decoding Variables
5738
5739 Adjective, not verb.
5740
5741 @menu 
5742 * Rule Variables::          Variables that say how a file is to be viewed.
5743 * Other Decode Variables::  Other decode variables.
5744 * Uuencoding and Posting::  Variables for customizing uuencoding.
5745 @end menu
5746
5747
5748 @node Rule Variables
5749 @subsubsection Rule Variables
5750 @cindex rule variables
5751
5752 Gnus uses @dfn{rule variables} to decide how to view a file.  All these
5753 variables are of the form
5754   
5755 @lisp
5756       (list '(regexp1 command2)
5757             '(regexp2 command2)
5758             ...)
5759 @end lisp
5760
5761 @table @code
5762
5763 @item gnus-uu-user-view-rules
5764 @vindex gnus-uu-user-view-rules
5765 @cindex sox
5766 This variable is consulted first when viewing files.  If you wish to use,
5767 for instance, @code{sox} to convert an @samp{.au} sound file, you could
5768 say something like:
5769 @lisp
5770 (setq gnus-uu-user-view-rules
5771       (list '(\"\\\\.au$\" \"sox %s -t .aiff > /dev/audio\")))
5772 @end lisp
5773
5774 @item gnus-uu-user-view-rules-end
5775 @vindex gnus-uu-user-view-rules-end
5776 This variable is consulted if Gnus couldn't make any matches from the
5777 user and default view rules.
5778
5779 @item gnus-uu-user-archive-rules
5780 @vindex gnus-uu-user-archive-rules
5781 This variable can be used to say what commands should be used to unpack
5782 archives.
5783 @end table
5784
5785
5786 @node Other Decode Variables
5787 @subsubsection Other Decode Variables
5788
5789 @table @code
5790 @vindex gnus-uu-grabbed-file-functions
5791
5792 @item gnus-uu-grabbed-file-functions
5793 All functions in this list will be called right after each file has been
5794 successfully decoded---so that you can move or view files right away,
5795 and don't have to wait for all files to be decoded before you can do
5796 anything.  Ready-made functions you can put in this list are:
5797
5798 @table @code
5799
5800 @item gnus-uu-grab-view
5801 @findex gnus-uu-grab-view
5802 View the file.
5803
5804 @item gnus-uu-grab-move
5805 @findex gnus-uu-grab-move
5806 Move the file (if you're using a saving function.)
5807 @end table
5808
5809 @item gnus-uu-be-dangerous
5810 @vindex gnus-uu-be-dangerous
5811 Specifies what to do if unusual situations arise during decoding.  If
5812 @code{nil}, be as conservative as possible.  If @code{t}, ignore things
5813 that didn't work, and overwrite existing files.  Otherwise, ask each
5814 time.
5815
5816 @item gnus-uu-ignore-files-by-name
5817 @vindex gnus-uu-ignore-files-by-name
5818 Files with name matching this regular expression won't be viewed.
5819
5820 @item gnus-uu-ignore-files-by-type
5821 @vindex gnus-uu-ignore-files-by-type
5822 Files with a @sc{mime} type matching this variable won't be viewed.
5823 Note that Gnus tries to guess what type the file is based on the name.
5824 @code{gnus-uu} is not a @sc{mime} package (yet), so this is slightly
5825 kludgey.
5826
5827 @item gnus-uu-tmp-dir
5828 @vindex gnus-uu-tmp-dir
5829 Where @code{gnus-uu} does its work.
5830
5831 @item gnus-uu-do-not-unpack-archives
5832 @vindex gnus-uu-do-not-unpack-archives
5833 Non-@code{nil} means that @code{gnus-uu} won't peek inside archives
5834 looking for files to display.
5835
5836 @item gnus-uu-view-and-save
5837 @vindex gnus-uu-view-and-save
5838 Non-@code{nil} means that the user will always be asked to save a file
5839 after viewing it.
5840
5841 @item gnus-uu-ignore-default-view-rules
5842 @vindex gnus-uu-ignore-default-view-rules
5843 Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing
5844 rules.
5845
5846 @item gnus-uu-ignore-default-archive-rules
5847 @vindex gnus-uu-ignore-default-archive-rules
5848 Non-@code{nil} means that @code{gnus-uu} will ignore the default archive
5849 unpacking commands.
5850
5851 @item gnus-uu-kill-carriage-return
5852 @vindex gnus-uu-kill-carriage-return
5853 Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns
5854 from articles.
5855
5856 @item gnus-uu-unmark-articles-not-decoded
5857 @vindex gnus-uu-unmark-articles-not-decoded
5858 Non-@code{nil} means that @code{gnus-uu} will mark unsuccessfully
5859 decoded articles as unread.
5860
5861 @item gnus-uu-correct-stripped-uucode
5862 @vindex gnus-uu-correct-stripped-uucode
5863 Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix
5864 uuencoded files that have had trailing spaces deleted.
5865
5866 @item gnus-uu-view-with-metamail
5867 @vindex gnus-uu-view-with-metamail
5868 @cindex metamail
5869 Non-@code{nil} means that @code{gnus-uu} will ignore the viewing
5870 commands defined by the rule variables and just fudge a @sc{mime}
5871 content type based on the file name.  The result will be fed to
5872 @code{metamail} for viewing.
5873
5874 @item gnus-uu-save-in-digest
5875 @vindex gnus-uu-save-in-digest
5876 Non-@code{nil} means that @code{gnus-uu}, when asked to save without
5877 decoding, will save in digests.  If this variable is @code{nil},
5878 @code{gnus-uu} will just save everything in a file without any
5879 embellishments.  The digesting almost conforms to RFC1153---no easy way
5880 to specify any meaningful volume and issue numbers were found, so I
5881 simply dropped them.
5882
5883 @end table
5884
5885
5886 @node Uuencoding and Posting
5887 @subsubsection Uuencoding and Posting
5888
5889 @table @code
5890
5891 @item gnus-uu-post-include-before-composing
5892 @vindex gnus-uu-post-include-before-composing
5893 Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode
5894 before you compose the article.  If this variable is @code{t}, you can
5895 either include an encoded file with @kbd{C-c C-i} or have one included
5896 for you when you post the article.
5897
5898 @item gnus-uu-post-length
5899 @vindex gnus-uu-post-length
5900 Maximum length of an article.  The encoded file will be split into how
5901 many articles it takes to post the entire file.
5902
5903 @item gnus-uu-post-threaded
5904 @vindex gnus-uu-post-threaded
5905 Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a
5906 thread.  This may not be smart, as no other decoder I have seen is able
5907 to follow threads when collecting uuencoded articles.  (Well, I have
5908 seen one package that does that---@code{gnus-uu}, but somehow, I don't
5909 think that counts...) Default is @code{nil}.
5910
5911 @item gnus-uu-post-separate-description
5912 @vindex gnus-uu-post-separate-description
5913 Non-@code{nil} means that the description will be posted in a separate
5914 article.  The first article will typically be numbered (0/x).  If this
5915 variable is @code{nil}, the description the user enters will be included
5916 at the beginning of the first article, which will be numbered (1/x).
5917 Default is @code{t}.
5918
5919 @end table
5920
5921
5922 @node Viewing Files
5923 @subsection Viewing Files
5924 @cindex viewing files
5925 @cindex pseudo-articles
5926
5927 After decoding, if the file is some sort of archive, Gnus will attempt
5928 to unpack the archive and see if any of the files in the archive can be
5929 viewed.  For instance, if you have a gzipped tar file @file{pics.tar.gz}
5930 containing the files @file{pic1.jpg} and @file{pic2.gif}, Gnus will
5931 uncompress and de-tar the main file, and then view the two pictures.
5932 This unpacking process is recursive, so if the archive contains archives
5933 of archives, it'll all be unpacked.
5934
5935 Finally, Gnus will normally insert a @dfn{pseudo-article} for each
5936 extracted file into the summary buffer.  If you go to these
5937 ``articles'', you will be prompted for a command to run (usually Gnus
5938 will make a suggestion), and then the command will be run.
5939
5940 @vindex gnus-view-pseudo-asynchronously
5941 If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait
5942 until the viewing is done before proceeding.
5943
5944 @vindex gnus-view-pseudos
5945 If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert
5946 the pseudo-articles into the summary buffer, but view them
5947 immediately.  If this variable is @code{not-confirm}, the user won't even
5948 be asked for a confirmation before viewing is done.
5949
5950 @vindex gnus-view-pseudos-separately 
5951 If @code{gnus-view-pseudos-separately} is non-@code{nil}, one
5952 pseudo-article will be created for each file to be viewed.  If
5953 @code{nil}, all files that use the same viewing command will be given as
5954 a list of parameters to that command.
5955
5956 @vindex gnus-insert-pseudo-articles
5957 If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert
5958 pseudo-articles when decoding.  It is @code{t} by default.
5959
5960 So; there you are, reading your @emph{pseudo-articles} in your
5961 @emph{virtual newsgroup} from the @emph{virtual server}; and you think:
5962 Why isn't anything real anymore? How did we get here?
5963
5964
5965 @node Article Treatment
5966 @section Article Treatment
5967
5968 Reading through this huge manual, you may have quite forgotten that the
5969 object of newsreaders is to actually, like, read what people have
5970 written.  Reading articles.  Unfortunately, people are quite bad at
5971 writing, so there are tons of functions and variables to make reading
5972 these articles easier.
5973
5974 @menu
5975 * Article Highlighting::    You want to make the article look like fruit salad.
5976 * Article Fontisizing::     Making emphasized text look niced.
5977 * Article Hiding::          You also want to make certain info go away.
5978 * Article Washing::         Lots of way-neat functions to make life better.
5979 * Article Buttons::         Click on URLs, Message-IDs, addresses and the like.
5980 * Article Date::            Grumble, UT!
5981 * Article Signature::       What is a signature?
5982 @end menu
5983
5984
5985 @node Article Highlighting
5986 @subsection Article Highlighting
5987 @cindex highlight
5988
5989 Not only do you want your article buffer to look like fruit salad, but
5990 you want it to look like technicolor fruit salad.
5991
5992 @table @kbd
5993
5994 @item W H a
5995 @kindex W H a (Summary)
5996 @findex gnus-article-highlight
5997 Highlight the current article (@code{gnus-article-highlight}).
5998
5999 @item W H h
6000 @kindex W H h (Summary)
6001 @findex gnus-article-highlight-headers
6002 @vindex gnus-header-face-alist
6003 Highlight the headers (@code{gnus-article-highlight-headers}).  The
6004 highlighting will be done according to the @code{gnus-header-face-alist}
6005 variable, which is a list where each element has the form @var{(regexp
6006 name content)}.  @var{regexp} is a regular expression for matching the
6007 header, @var{name} is the face used for highlighting the header name and
6008 @var{content} is the face for highlighting the header value.  The first
6009 match made will be used.  Note that @var{regexp} shouldn't have @samp{^}
6010 prepended---Gnus will add one.
6011
6012 @item W H c
6013 @kindex W H c (Summary)
6014 @findex gnus-article-highlight-citation
6015 Highlight cited text (@code{gnus-article-highlight-citation}). 
6016
6017 Some variables to customize the citation highlights:
6018
6019 @table @code
6020 @vindex gnus-cite-parse-max-size
6021
6022 @item gnus-cite-parse-max-size
6023 If the article size if bigger than this variable (which is 25000 by
6024 default), no citation highlighting will be performed.  
6025
6026 @item gnus-cite-prefix-regexp
6027 @vindex gnus-cite-prefix-regexp
6028 Regexp matching the longest possible citation prefix on a line. 
6029
6030 @item gnus-cite-max-prefix
6031 @vindex gnus-cite-max-prefix
6032 Maximum possible length for a citation prefix (default 20).
6033
6034 @item gnus-cite-face-list
6035 @vindex gnus-cite-face-list
6036 List of faces used for highlighting citations.  When there are citations
6037 from multiple articles in the same message, Gnus will try to give each
6038 citation from each article its own face.  This should make it easier to
6039 see who wrote what.
6040
6041 @item gnus-supercite-regexp
6042 @vindex gnus-supercite-regexp
6043 Regexp matching normal Supercite attribution lines.  
6044
6045 @item gnus-supercite-secondary-regexp
6046 @vindex gnus-supercite-secondary-regexp
6047 Regexp matching mangled Supercite attribution lines.
6048
6049 @item gnus-cite-minimum-match-count
6050 @vindex gnus-cite-minimum-match-count
6051 Minimum number of identical prefixes we have to see before we believe
6052 that it's a citation.
6053
6054 @item gnus-cite-attribution-prefix
6055 @vindex gnus-cite-attribution-prefix
6056 Regexp matching the beginning of an attribution line.
6057
6058 @item gnus-cite-attribution-suffix
6059 @vindex gnus-cite-attribution-suffix
6060 Regexp matching the end of an attribution line.
6061
6062 @item gnus-cite-attribution-face
6063 @vindex gnus-cite-attribution-face
6064 Face used for attribution lines.  It is merged with the face for the
6065 cited text belonging to the attribution.
6066
6067 @end table
6068
6069
6070 @item W H s
6071 @kindex W H s (Summary)
6072 @vindex gnus-signature-separator
6073 @vindex gnus-signature-face
6074 @findex gnus-article-highlight-signature
6075 Highlight the signature (@code{gnus-article-highlight-signature}).
6076 Everything after @code{gnus-signature-separator} (@pxref{Article
6077 Signature}) in an article will be considered a signature and will be
6078 highlighted with @code{gnus-signature-face}, which is @code{italic} by
6079 default.
6080
6081 @end table
6082
6083
6084 @node Article Fontisizing
6085 @subsection Article Fontisizing
6086 @cindex emphasis
6087 @cindex article emphasis
6088
6089 @findex gnus-article-emphasize
6090 @kindex W e (Summary)
6091 People commonly add emphasis to words in news articles by writing things
6092 like @samp{_this_} or @samp{*this*}.  Gnus can make this look nicer by
6093 running the article through the @kbd{W e}
6094 (@code{gnus-article-emphasize}) command.
6095
6096 @vindex gnus-article-emphasis
6097 How the emphasis is computed is controlled by the
6098 @code{gnus-article-emphasis} variable.  This is an alist where the first
6099 element is a regular expression to be matched.  The second is a number
6100 that says what regular expression grouping is used to find the entire
6101 emphasized word.  The third is a number that says what regexp grouping
6102 should be displayed and highlighted.  (The text between these two
6103 groupings will be hidden.)  The fourth is the face used for
6104 highlighting.
6105
6106 @lisp
6107 (setq gnus-article-emphasis
6108       '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline)
6109         ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold)))
6110 @end lisp
6111
6112 @vindex gnus-emphasis-underline
6113 @vindex gnus-emphasis-bold
6114 @vindex gnus-emphasis-italic
6115 @vindex gnus-emphasis-underline-bold
6116 @vindex gnus-emphasis-underline-italic
6117 @vindex gnus-emphasis-bold-italic
6118 @vindex gnus-emphasis-underline-bold-italic
6119 By default, there are seven rules, and they use the following faces:
6120 @code{gnus-emphasis-bold}, @code{gnus-emphasis-italic},
6121 @code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic},
6122 @code{gnus-emphasis-underline-italic},
6123 @code{gnus-emphasis-underline-bold}, and
6124 @code{gnus-emphasis-underline-bold-italic}.  
6125
6126 If you want to change these faces, you can either use @kbd{M-x
6127 customize}, or you can use @code{copy-face}.  For instance, if you want
6128 to make @code{gnus-emphasis-italic} use a red face instead, you could
6129 say something like:
6130
6131 @lisp
6132 (copy-face 'red 'gnus-emphasis-italic)
6133 @end lisp
6134
6135
6136 @node Article Hiding
6137 @subsection Article Hiding
6138 @cindex article hiding
6139
6140 Or rather, hiding certain things in each article.  There usually is much
6141 too much cruft in most articles.  
6142
6143 @table @kbd
6144
6145 @item W W a
6146 @kindex W W a (Summary)
6147 @findex gnus-article-hide
6148 Do maximum hiding on the summary buffer (@kbd{gnus-article-hide}). 
6149
6150 @item W W h
6151 @kindex W W h (Summary)
6152 @findex gnus-article-hide-headers
6153 Hide headers (@code{gnus-article-hide-headers}).  @xref{Hiding
6154 Headers}. 
6155
6156 @item W W b
6157 @kindex W W b (Summary)
6158 @findex gnus-article-hide-boring-headers
6159 Hide headers that aren't particularly interesting
6160 (@code{gnus-article-hide-boring-headers}).  @xref{Hiding Headers}.
6161
6162 @item W W s
6163 @kindex W W s (Summary)
6164 @findex gnus-article-hide-signature
6165 Hide signature (@code{gnus-article-hide-signature}).  @xref{Article
6166 Signature}. 
6167
6168 @item W W p
6169 @kindex W W p (Summary)
6170 @findex gnus-article-hide-pgp
6171 @vindex gnus-article-hide-pgp-hook
6172 Hide @sc{pgp} signatures (@code{gnus-article-hide-pgp}).  The
6173 @code{gnus-article-hide-pgp-hook} hook will be run after a @sc{pgp}
6174 signature has been hidden.
6175
6176 @item W W P
6177 @kindex W W P (Summary)
6178 @findex gnus-article-hide-pem
6179 Hide @sc{pem} (privacy enhanced messages) cruft
6180 (@code{gnus-article-hide-pem}).
6181
6182 @item W W c
6183 @kindex W W c (Summary)
6184 @findex gnus-article-hide-citation
6185 Hide citation (@code{gnus-article-hide-citation}).  Some variables for
6186 customizing the hiding:
6187
6188 @table @code
6189
6190 @item gnus-cite-hide-percentage
6191 @vindex gnus-cite-hide-percentage
6192 If the cited text is of a bigger percentage than this variable (default
6193 50), hide the cited text.
6194
6195 @item gnus-cite-hide-absolute
6196 @vindex gnus-cite-hide-absolute
6197 The cited text must have at least this length (default 10) before it
6198 is hidden.
6199
6200 @item gnus-cited-text-button-line-format
6201 @vindex gnus-cited-text-button-line-format
6202 Gnus adds buttons to show where the cited text has been hidden, and to
6203 allow toggle hiding the text.  The format of the variable is specified
6204 by this format-like variable (@pxref{Formatting Variables}).  These
6205 specs are valid:
6206
6207 @table @samp
6208 @item b
6209 Start point of the hidden text.
6210 @item e
6211 End point of the hidden text.
6212 @item l
6213 Length of the hidden text.
6214 @end table
6215
6216 @item gnus-cited-lines-visible
6217 @vindex gnus-cited-lines-visible
6218 The number of lines at the beginning of the cited text to leave shown. 
6219
6220 @end table
6221
6222 @item W W C
6223 @kindex W W C (Summary)
6224 @findex gnus-article-hide-citation-in-followups
6225 Hide cited text in articles that aren't roots
6226 (@code{gnus-article-hide-citation-in-followups}).  This isn't very
6227 useful as an interactive command, but might be a handy function to stick
6228 in @code{gnus-article-display-hook} (@pxref{Customizing Articles}). 
6229
6230 @end table
6231
6232 All these ``hiding'' commands are toggles, but if you give a negative
6233 prefix to these commands, they will show what they have previously
6234 hidden.  If you give a positive prefix, they will always hide.
6235
6236 Also @pxref{Article Highlighting} for further variables for
6237 citation customization.
6238
6239
6240 @node Article Washing
6241 @subsection Article Washing
6242 @cindex washing
6243 @cindex article washing
6244
6245 We call this ``article washing'' for a really good reason.  Namely, the
6246 @kbd{A} key was taken, so we had to use the @kbd{W} key instead.
6247
6248 @dfn{Washing} is defined by us as ``changing something from something to
6249 something else'', but normally results in something looking better.
6250 Cleaner, perhaps.
6251
6252 @table @kbd
6253
6254 @item W l
6255 @kindex W l (Summary)
6256 @findex gnus-summary-stop-page-breaking
6257 Remove page breaks from the current article
6258 (@code{gnus-summary-stop-page-breaking}).
6259
6260 @item W r
6261 @kindex W r (Summary)
6262 @findex gnus-summary-caesar-message
6263 @c @icon{gnus-summary-caesar-message}
6264 Do a Caesar rotate (rot13) on the article buffer
6265 (@code{gnus-summary-caesar-message}). 
6266 Unreadable articles that tell you to read them with Caesar rotate or rot13.
6267 (Typically offensive jokes and such.)
6268
6269 It's commonly called ``rot13'' because each letter is rotated 13
6270 positions in the alphabet, e. g. @samp{B} (letter #2) -> @samp{O} (letter
6271 #15).  It is sometimes referred to as ``Caesar rotate'' because Caesar
6272 is rumoured to have employed this form of, uh, somewhat weak encryption.
6273
6274 @item W t
6275 @kindex W t (Summary)
6276 @findex gnus-summary-toggle-header
6277 Toggle whether to display all headers in the article buffer
6278 (@code{gnus-summary-toggle-header}). 
6279
6280 @item W v
6281 @kindex W v (Summary)
6282 @findex gnus-summary-verbose-header
6283 Toggle whether to display all headers in the article buffer permanently
6284 (@code{gnus-summary-verbose-header}).
6285
6286 @item W m
6287 @kindex W m (Summary)
6288 @findex gnus-summary-toggle-mime
6289 Toggle whether to run the article through @sc{mime} before displaying
6290 (@code{gnus-summary-toggle-mime}).
6291
6292 @item W o
6293 @kindex W o (Summary)
6294 @findex gnus-article-treat-overstrike
6295 Treat overstrike (@code{gnus-article-treat-overstrike}).
6296
6297 @item W d
6298 @kindex W d (Summary)
6299 @findex gnus-article-treat-dumbquotes
6300 Treat M******** sm*rtq**t*s (@code{gnus-article-treat-dumbquotes}).
6301
6302 @item W w
6303 @kindex W w (Summary)
6304 @findex gnus-article-fill-cited-article
6305 Do word wrap (@code{gnus-article-fill-cited-article}).  If you use this
6306 function in @code{gnus-article-display-hook}, it should be run fairly
6307 late and certainly after any highlighting.
6308
6309 You can give the command a numerical prefix to specify the width to use
6310 when filling.
6311
6312 @item W c
6313 @kindex W c (Summary)
6314 @findex gnus-article-remove-cr
6315 Remove CR (i. e., @samp{^M}s on the end of the lines)
6316 (@code{gnus-article-remove-cr}).
6317
6318 @item W q
6319 @kindex W q (Summary)
6320 @findex gnus-article-de-quoted-unreadable
6321 Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}).
6322 Quoted-Printable is one common @sc{mime} encoding employed when sending
6323 non-ASCII (i. e., 8-bit) articles.  It typically makes strings like
6324 @samp{déjà vu} look like @samp{d=E9j=E0 vu}, which doesn't look very
6325 readable to me.
6326
6327 @item W f
6328 @kindex W f (Summary)
6329 @cindex x-face
6330 @findex gnus-article-display-x-face
6331 @findex gnus-article-x-face-command
6332 @vindex gnus-article-x-face-command
6333 @vindex gnus-article-x-face-too-ugly
6334 @iftex
6335 @iflatex
6336 \gnusxface{tmp/xface-karlheg.ps}
6337 \gnusxface{tmp/xface-kyle.ps}
6338 \gnusxface{tmp/xface-smb.ps}
6339 @end iflatex
6340 @end iftex
6341 Look for and display any X-Face headers
6342 (@code{gnus-article-display-x-face}).  The command executed by this
6343 function is given by the @code{gnus-article-x-face-command} variable.
6344 If this variable is a string, this string will be executed in a
6345 sub-shell.  If it is a function, this function will be called with the
6346 face as the argument.  If the @code{gnus-article-x-face-too-ugly} (which
6347 is a regexp) matches the @code{From} header, the face will not be shown.
6348 The default action under Emacs is to fork off an @code{xv} to view the
6349 face; under XEmacs the default action is to display the face before the
6350 @code{From} header.  (It's nicer if XEmacs has been compiled with X-Face
6351 support---that will make display somewhat faster.  If there's no native
6352 X-Face support, Gnus will try to convert the @code{X-Face} header using
6353 external programs from the @code{pbmplus} package and friends.)  If you
6354 want to have this function in the display hook, it should probably come
6355 last.
6356
6357 @item W b
6358 @kindex W b (Summary)
6359 @findex gnus-article-add-buttons
6360 Add clickable buttons to the article (@code{gnus-article-add-buttons}).
6361 @xref{Article Buttons}
6362
6363 @item W B
6364 @kindex W B (Summary)
6365 @findex gnus-article-add-buttons-to-head
6366 Add clickable buttons to the article headers
6367 (@code{gnus-article-add-buttons-to-head}).  
6368
6369 @item W E l
6370 @kindex W E l (Summary)
6371 @findex gnus-article-strip-leading-blank-lines
6372 Remove all blank lines from the beginning of the article
6373 (@code{gnus-article-strip-leading-blank-lines}).
6374
6375 @item W E m
6376 @kindex W E m (Summary)
6377 @findex gnus-article-strip-multiple-blank-lines
6378 Replace all blank lines with empty lines and then all multiple empty
6379 lines with a single empty line.
6380 (@code{gnus-article-strip-multiple-blank-lines}).
6381
6382 @item W E t
6383 @kindex W E t (Summary)
6384 @findex gnus-article-remove-trailing-blank-lines
6385 Remove all blank lines at the end of the article
6386 (@code{gnus-article-remove-trailing-blank-lines}).
6387
6388 @item W E a
6389 @kindex W E a (Summary)
6390 @findex gnus-article-strip-blank-lines
6391 Do all the three commands above
6392 (@code{gnus-article-strip-blank-lines}).
6393
6394 @item W E s
6395 @kindex W E s (Summary)
6396 @findex gnus-article-strip-leading-space
6397 Remove all white space from the beginning of all lines of the article
6398 body (@code{gnus-article-strip-leading-space}).
6399
6400 @end table
6401
6402
6403 @node Article Buttons
6404 @subsection Article Buttons
6405 @cindex buttons
6406
6407 People often include references to other stuff in articles, and it would
6408 be nice if Gnus could just fetch whatever it is that people talk about
6409 with the minimum of fuzz when you hit @kbd{RET} or use the middle mouse
6410 button on these references.
6411
6412 Gnus adds @dfn{buttons} to certain standard references by default:
6413 Well-formed URLs, mail addresses and Message-IDs.  This is controlled by
6414 two variables, one that handles article bodies and one that handles
6415 article heads:
6416
6417 @table @code
6418
6419 @item gnus-button-alist
6420 @vindex gnus-button-alist
6421 This is an alist where each entry has this form:
6422
6423 @lisp
6424 (REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
6425 @end lisp
6426
6427 @table @var
6428
6429 @item regexp
6430 All text that match this regular expression will be considered an
6431 external reference.  Here's a typical regexp that matches embedded URLs:
6432 @samp{<URL:\\([^\n\r>]*\\)>}. 
6433
6434 @item button-par
6435 Gnus has to know which parts of the matches is to be highlighted.  This
6436 is a number that says what sub-expression of the regexp is to be
6437 highlighted.  If you want it all highlighted, you use 0 here.
6438
6439 @item use-p
6440 This form will be @code{eval}ed, and if the result is non-@code{nil},
6441 this is considered a match.  This is useful if you want extra sifting to
6442 avoid false matches.
6443
6444 @item function
6445 This function will be called when you click on this button.
6446
6447 @item data-par
6448 As with @var{button-par}, this is a sub-expression number, but this one
6449 says which part of the match is to be sent as data to @var{function}. 
6450
6451 @end table
6452
6453 So the full entry for buttonizing URLs is then
6454
6455 @lisp
6456 ("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)
6457 @end lisp
6458
6459 @item gnus-header-button-alist
6460 @vindex gnus-header-button-alist
6461 This is just like the other alist, except that it is applied to the
6462 article head only, and that each entry has an additional element that is
6463 used to say what headers to apply the buttonize coding to:
6464
6465 @lisp
6466 (HEADER REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
6467 @end lisp
6468
6469 @var{HEADER} is a regular expression.
6470
6471 @item gnus-button-url-regexp
6472 @vindex gnus-button-url-regexp
6473 A regular expression that matches embedded URLs.  It is used in the
6474 default values of the variables above.
6475
6476 @item gnus-article-button-face
6477 @vindex gnus-article-button-face
6478 Face used on buttons.
6479
6480 @item gnus-article-mouse-face
6481 @vindex gnus-article-mouse-face
6482 Face used when the mouse cursor is over a button.
6483
6484 @end table
6485
6486
6487 @node Article Date
6488 @subsection Article Date
6489
6490 The date is most likely generated in some obscure timezone you've never
6491 heard of, so it's quite nice to be able to find out what the time was
6492 when the article was sent.
6493
6494 @table @kbd
6495
6496 @item W T u
6497 @kindex W T u (Summary)
6498 @findex gnus-article-date-ut
6499 Display the date in UT (aka. GMT, aka ZULU)
6500 (@code{gnus-article-date-ut}). 
6501
6502 @item W T l
6503 @kindex W T l (Summary)
6504 @findex gnus-article-date-local
6505 Display the date in the local timezone (@code{gnus-article-date-local}).
6506
6507 @item W T s
6508 @kindex W T s (Summary)
6509 @vindex gnus-article-time-format
6510 @findex gnus-article-date-user
6511 @findex format-time-string
6512 Display the date using a user-defined format
6513 (@code{gnus-article-date-user}).  The format is specified by the
6514 @code{gnus-article-time-format} variable, and is a string that's passed
6515 to @code{format-time-string}.  See the documentation of that variable
6516 for a list of possible format specs.
6517
6518 @item W T e
6519 @kindex W T e (Summary)
6520 @findex gnus-article-date-lapsed
6521 Say how much time has elapsed between the article was posted and now
6522 (@code{gnus-article-date-lapsed}).
6523
6524 @item W T o
6525 @kindex W T o (Summary)
6526 @findex gnus-article-date-original
6527 Display the original date (@code{gnus-article-date-original}).  This can
6528 be useful if you normally use some other conversion function and are
6529 worried that it might be doing something totally wrong.  Say, claiming
6530 that the article was posted in 1854.  Although something like that is
6531 @emph{totally} impossible.  Don't you trust me? *titter*
6532
6533 @end table
6534
6535
6536 @node Article Signature
6537 @subsection Article Signature
6538 @cindex signatures
6539 @cindex article signature
6540
6541 @vindex gnus-signature-separator
6542 Each article is divided into two parts---the head and the body.  The
6543 body can be divided into a signature part and a text part.  The variable
6544 that says what is to be considered a signature is
6545 @code{gnus-signature-separator}.  This is normally the standard
6546 @samp{^-- $} as mandated by son-of-RFC 1036.  However, many people use
6547 non-standard signature separators, so this variable can also be a list
6548 of regular expressions to be tested, one by one.  (Searches are done
6549 from the end of the body towards the beginning.)  One likely value is:
6550
6551 @lisp
6552 (setq gnus-signature-separator
6553       '("^-- $"         ; The standard
6554         "^-- *$"        ; A common mangling
6555         "^-------*$"    ; Many people just use a looong 
6556                         ; line of dashes.  Shame!
6557         "^ *--------*$" ; Double-shame!
6558         "^________*$"   ; Underscores are also popular
6559         "^========*$")) ; Pervert!
6560 @end lisp
6561
6562 The more permissive you are, the more likely it is that you'll get false
6563 positives.
6564
6565 @vindex gnus-signature-limit
6566 @code{gnus-signature-limit} provides a limit to what is considered a
6567 signature. 
6568
6569 @enumerate
6570 @item 
6571 If it is an integer, no signature may be longer (in characters) than
6572 that integer.
6573 @item 
6574 If it is a floating point number, no signature may be longer (in lines)
6575 than that number.
6576 @item 
6577 If it is a function, the function will be called without any parameters,
6578 and if it returns @code{nil}, there is no signature in the buffer.
6579 @item
6580 If it is a string, it will be used as a regexp.  If it matches, the text
6581 in question is not a signature.
6582 @end enumerate
6583
6584 This variable can also be a list where the elements may be of the types
6585 listed above.  Here's an example:
6586
6587 @lisp
6588 (setq gnus-signature-limit
6589       '(200.0 "^---*Forwarded article"))
6590 @end lisp
6591
6592 This means that if there are more than 200 lines after the signature
6593 separator, or the text after the signature separator is matched by
6594 the regular expression @samp{^---*Forwarded article}, then it isn't a
6595 signature after all.
6596
6597
6598 @node Article Commands
6599 @section Article Commands
6600
6601 @table @kbd
6602
6603 @item A P
6604 @cindex PostScript
6605 @cindex printing
6606 @kindex A P (Summary)
6607 @vindex gnus-ps-print-hook
6608 @findex gnus-summary-print-article 
6609 Generate and print a PostScript image of the article buffer
6610 (@code{gnus-summary-print-article}).  @code{gnus-ps-print-hook} will be
6611 run just before printing the buffer.
6612
6613 @end table
6614
6615
6616 @node Summary Sorting
6617 @section Summary Sorting
6618 @cindex summary sorting
6619
6620 You can have the summary buffer sorted in various ways, even though I
6621 can't really see why you'd want that.
6622
6623 @table @kbd
6624
6625 @item C-c C-s C-n
6626 @kindex C-c C-s C-n (Summary)
6627 @findex gnus-summary-sort-by-number
6628 Sort by article number (@code{gnus-summary-sort-by-number}).
6629
6630 @item C-c C-s C-a
6631 @kindex C-c C-s C-a (Summary)
6632 @findex gnus-summary-sort-by-author
6633 Sort by author (@code{gnus-summary-sort-by-author}).
6634
6635 @item C-c C-s C-s
6636 @kindex C-c C-s C-s (Summary)
6637 @findex gnus-summary-sort-by-subject
6638 Sort by subject (@code{gnus-summary-sort-by-subject}).
6639
6640 @item C-c C-s C-d
6641 @kindex C-c C-s C-d (Summary)
6642 @findex gnus-summary-sort-by-date
6643 Sort by date (@code{gnus-summary-sort-by-date}).
6644
6645 @item C-c C-s C-l
6646 @kindex C-c C-s C-l (Summary)
6647 @findex gnus-summary-sort-by-lines
6648 Sort by lines (@code{gnus-summary-sort-by-lines}).
6649
6650 @item C-c C-s C-i
6651 @kindex C-c C-s C-i (Summary)
6652 @findex gnus-summary-sort-by-score
6653 Sort by score (@code{gnus-summary-sort-by-score}).
6654 @end table
6655
6656 These functions will work both when you use threading and when you don't
6657 use threading.  In the latter case, all summary lines will be sorted,
6658 line by line.  In the former case, sorting will be done on a
6659 root-by-root basis, which might not be what you were looking for.  To
6660 toggle whether to use threading, type @kbd{T T} (@pxref{Thread
6661 Commands}).
6662
6663
6664 @node Finding the Parent
6665 @section Finding the Parent
6666 @cindex parent articles
6667 @cindex referring articles
6668
6669 @table @kbd
6670 @item ^
6671 @kindex ^ (Summary)
6672 @findex gnus-summary-refer-parent-article
6673 If you'd like to read the parent of the current article, and it is not
6674 displayed in the summary buffer, you might still be able to.  That is,
6675 if the current group is fetched by @sc{nntp}, the parent hasn't expired
6676 and the @code{References} in the current article are not mangled, you
6677 can just press @kbd{^} or @kbd{A r}
6678 (@code{gnus-summary-refer-parent-article}).  If everything goes well,
6679 you'll get the parent.  If the parent is already displayed in the
6680 summary buffer, point will just move to this article.
6681
6682 If given a positive numerical prefix, fetch that many articles back into
6683 the ancestry.  If given a negative numerical prefix, fetch just that
6684 ancestor.  So if you say @kbd{3 ^}, Gnus will fetch the parent, the
6685 grandparent and the grandgrandparent of the current article.  If you say
6686 @kbd{-3 ^}, Gnus will only fetch the grandgrandparent of the current
6687 article. 
6688
6689 @item A R (Summary)
6690 @findex gnus-summary-refer-references
6691 @kindex A R (Summary)
6692 Fetch all articles mentioned in the @code{References} header of the
6693 article (@code{gnus-summary-refer-references}).
6694
6695 @item A T (Summary)
6696 @findex gnus-summary-refer-thread
6697 @kindex A T (Summary)
6698 Display the full thread where the current article appears
6699 (@code{gnus-summary-refer-thread}).  This command has to fetch all the
6700 headers in the current group to work, so it usually takes a while.  If
6701 you do it often, you may consider setting @code{gnus-fetch-old-headers}
6702 to @code{invisible} (@pxref{Filling In Threads}).  This won't have any
6703 visible effects normally, but it'll make this command work a whole lot
6704 faster.  Of course, it'll make group entry somewhat slow.
6705
6706 @vindex gnus-refer-thread-limit
6707 The @code{gnus-refer-thread-limit} variable says how many old (i. e.,
6708 articles before the first displayed in the current group) headers to
6709 fetch when doing this command.  The default is 200.  If @code{t}, all
6710 the available headers will be fetched.  This variable can be overridden
6711 by giving the @kbd{A T} command a numerical prefix.
6712
6713 @item M-^ (Summary)
6714 @findex gnus-summary-refer-article
6715 @kindex M-^ (Summary)
6716 @cindex Message-ID
6717 @cindex fetching by Message-ID
6718 You can also ask the @sc{nntp} server for an arbitrary article, no
6719 matter what group it belongs to.  @kbd{M-^}
6720 (@code{gnus-summary-refer-article}) will ask you for a
6721 @code{Message-ID}, which is one of those long, hard-to-read thingies
6722 that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}.  You
6723 have to get it all exactly right.  No fuzzy searches, I'm afraid.
6724 @end table
6725
6726 The current select method will be used when fetching by
6727 @code{Message-ID} from non-news select method, but you can override this
6728 by giving this command a prefix.
6729
6730 @vindex gnus-refer-article-method
6731 If the group you are reading is located on a backend that does not
6732 support fetching by @code{Message-ID} very well (like @code{nnspool}),
6733 you can set @code{gnus-refer-article-method} to an @sc{nntp} method.  It
6734 would, perhaps, be best if the @sc{nntp} server you consult is the one
6735 updating the spool you are reading from, but that's not really
6736 necessary.
6737
6738 Most of the mail backends support fetching by @code{Message-ID}, but do
6739 not do a particularly excellent job at it.  That is, @code{nnmbox} and
6740 @code{nnbabyl} are able to locate articles from any groups, while
6741 @code{nnml} and @code{nnfolder} are only able to locate articles that
6742 have been posted to the current group.  (Anything else would be too time
6743 consuming.)  @code{nnmh} does not support this at all.
6744
6745
6746 @node Alternative Approaches
6747 @section Alternative Approaches
6748
6749 Different people like to read news using different methods.  This being
6750 Gnus, we offer a small selection of minor modes for the summary buffers.
6751
6752 @menu
6753 * Pick and Read::               First mark articles and then read them.
6754 * Binary Groups::               Auto-decode all articles.
6755 @end menu
6756
6757
6758 @node Pick and Read
6759 @subsection Pick and Read
6760 @cindex pick and read
6761
6762 Some newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) use
6763 a two-phased reading interface.  The user first marks in a summary
6764 buffer the articles she wants to read.  Then she starts reading the
6765 articles with just an article buffer displayed.
6766
6767 @findex gnus-pick-mode
6768 @kindex M-x gnus-pick-mode
6769 Gnus provides a summary buffer minor mode that allows
6770 this---@code{gnus-pick-mode}.  This basically means that a few process
6771 mark commands become one-keystroke commands to allow easy marking, and
6772 it provides one additional command for switching to the summary buffer.
6773
6774 Here are the available keystrokes when using pick mode:
6775
6776 @table @kbd
6777 @item .
6778 @kindex . (Pick)
6779 @findex gnus-summary-mark-as-processable
6780 Pick the article on the current line
6781 (@code{gnus-summary-mark-as-processable}).  If given a numerical prefix,
6782 go to that article and pick it.  (The line number is normally displayed
6783 at the beginning of the summary pick lines.)
6784
6785 @item SPACE
6786 @kindex SPACE (Pick)
6787 @findex gnus-pick-next-page
6788 Scroll the summary buffer up one page (@code{gnus-pick-next-page}).  If
6789 at the end of the buffer, start reading the picked articles.
6790
6791 @item u
6792 @kindex u (Pick)
6793 @findex gnus-summary-unmark-as-processable
6794 Unpick the article (@code{gnus-summary-unmark-as-processable}). 
6795
6796 @item U
6797 @kindex U (Pick)
6798 @findex gnus-summary-unmark-all-processable
6799 Unpick all articles (@code{gnus-summary-unmark-all-processable}). 
6800
6801 @item t
6802 @kindex t (Pick)
6803 @findex gnus-uu-mark-thread
6804 Pick the thread (@code{gnus-uu-mark-thread}). 
6805
6806 @item T
6807 @kindex T (Pick)
6808 @findex gnus-uu-unmark-thread
6809 Unpick the thread (@code{gnus-uu-unmark-thread}). 
6810
6811 @item r
6812 @kindex r (Pick)
6813 @findex gnus-uu-mark-region
6814 Pick the region (@code{gnus-uu-mark-region}). 
6815
6816 @item R
6817 @kindex R (Pick)
6818 @findex gnus-uu-unmark-region
6819 Unpick the region (@code{gnus-uu-unmark-region}). 
6820
6821 @item e
6822 @kindex e (Pick)
6823 @findex gnus-uu-mark-by-regexp
6824 Pick articles that match a regexp (@code{gnus-uu-mark-by-regexp}). 
6825
6826 @item E
6827 @kindex E (Pick)
6828 @findex gnus-uu-unmark-by-regexp
6829 Unpick articles that match a regexp (@code{gnus-uu-unmark-by-regexp}). 
6830
6831 @item b
6832 @kindex b (Pick)
6833 @findex gnus-uu-mark-buffer
6834 Pick the buffer (@code{gnus-uu-mark-buffer}). 
6835
6836 @item B
6837 @kindex B (Pick)
6838 @findex gnus-uu-unmark-buffer
6839 Unpick the buffer (@code{gnus-uu-unmark-buffer}). 
6840
6841 @item RET
6842 @kindex RET (Pick)
6843 @findex gnus-pick-start-reading
6844 @vindex gnus-pick-display-summary
6845 Start reading the picked articles (@code{gnus-pick-start-reading}).  If
6846 given a prefix, mark all unpicked articles as read first.  If
6847 @code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer
6848 will still be visible when you are reading.
6849
6850 @end table
6851
6852 If this sounds like a good idea to you, you could say:
6853
6854 @lisp
6855 (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
6856 @end lisp
6857
6858 @vindex gnus-pick-mode-hook
6859 @code{gnus-pick-mode-hook} is run in pick minor mode buffers.
6860
6861 @vindex gnus-mark-unpicked-articles-as-read
6862 If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark
6863 all unpicked articles as read.  The default is @code{nil}.
6864
6865 @vindex gnus-summary-pick-line-format
6866 The summary line format in pick mode is slightly different from the
6867 standard format.  At the beginning of each line the line number is
6868 displayed.  The pick mode line format is controlled by the
6869 @code{gnus-summary-pick-line-format} variable (@pxref{Formatting
6870 Variables}).  It accepts the same format specs that
6871 @code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}). 
6872
6873
6874 @node Binary Groups
6875 @subsection Binary Groups
6876 @cindex binary groups
6877
6878 @findex gnus-binary-mode
6879 @kindex M-x gnus-binary-mode
6880 If you spend much time in binary groups, you may grow tired of hitting
6881 @kbd{X u}, @kbd{n}, @kbd{RET} all the time.  @kbd{M-x gnus-binary-mode}
6882 is a minor mode for summary buffers that makes all ordinary Gnus article
6883 selection functions uudecode series of articles and display the result
6884 instead of just displaying the articles the normal way.  
6885
6886 @kindex g (Binary)
6887 @findex gnus-binary-show-article
6888 The only way, in fact, to see the actual articles is the @kbd{g}
6889 command, when you have turned on this mode
6890 (@code{gnus-binary-show-article}).
6891
6892 @vindex gnus-binary-mode-hook
6893 @code{gnus-binary-mode-hook} is called in binary minor mode buffers.
6894
6895
6896 @node Tree Display
6897 @section Tree Display
6898 @cindex trees
6899
6900 @vindex gnus-use-trees
6901 If you don't like the normal Gnus summary display, you might try setting
6902 @code{gnus-use-trees} to @code{t}.  This will create (by default) an
6903 additional @dfn{tree buffer}.  You can execute all summary mode commands
6904 in the tree buffer.  
6905
6906 There are a few variables to customize the tree display, of course:
6907
6908 @table @code
6909 @item gnus-tree-mode-hook
6910 @vindex gnus-tree-mode-hook
6911 A hook called in all tree mode buffers.
6912
6913 @item gnus-tree-mode-line-format
6914 @vindex gnus-tree-mode-line-format
6915 A format string for the mode bar in the tree mode buffers.  The default
6916 is @samp{Gnus: %%b %S %Z}.  For a list of valid specs, @pxref{Summary
6917 Buffer Mode Line}. 
6918
6919 @item gnus-selected-tree-face
6920 @vindex gnus-selected-tree-face
6921 Face used for highlighting the selected article in the tree buffer.  The
6922 default is @code{modeline}.
6923
6924 @item gnus-tree-line-format
6925 @vindex gnus-tree-line-format
6926 A format string for the tree nodes.  The name is a bit of a misnomer,
6927 though---it doesn't define a line, but just the node.  The default value
6928 is @samp{%(%[%3,3n%]%)}, which displays the first three characters of
6929 the name of the poster.  It is vital that all nodes are of the same
6930 length, so you @emph{must} use @samp{%4,4n}-like specifiers.
6931
6932 Valid specs are:
6933
6934 @table @samp
6935 @item n
6936 The name of the poster.
6937 @item f
6938 The @code{From} header.
6939 @item N
6940 The number of the article.
6941 @item [
6942 The opening bracket.
6943 @item ] 
6944 The closing bracket.
6945 @item s
6946 The subject.
6947 @end table
6948
6949 @xref{Formatting Variables}.
6950
6951 Variables related to the display are:
6952
6953 @table @code
6954 @item gnus-tree-brackets
6955 @vindex gnus-tree-brackets
6956 This is used for differentiating between ``real'' articles and
6957 ``sparse'' articles.  The format is @var{((real-open . real-close)
6958 (sparse-open . sparse-close) (dummy-open . dummy-close))}, and the
6959 default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))}.
6960
6961 @item gnus-tree-parent-child-edges
6962 @vindex gnus-tree-parent-child-edges
6963 This is a list that contains the characters used for connecting parent
6964 nodes to their children.  The default is @code{(?- ?\\ ?|)}. 
6965
6966 @end table
6967
6968 @item gnus-tree-minimize-window
6969 @vindex gnus-tree-minimize-window
6970 If this variable is non-@code{nil}, Gnus will try to keep the tree
6971 buffer as small as possible to allow more room for the other Gnus
6972 windows.  If this variable is a number, the tree buffer will never be
6973 higher than that number.  The default is @code{t}.  Note that if you
6974 have several windows displayed side-by-side in a frame and the tree
6975 buffer is one of these, minimizing the tree window will also resize all
6976 other windows displayed next to it.
6977
6978 @item gnus-generate-tree-function
6979 @vindex gnus-generate-tree-function
6980 @findex gnus-generate-horizontal-tree
6981 @findex gnus-generate-vertical-tree
6982 The function that actually generates the thread tree.  Two predefined
6983 functions are available: @code{gnus-generate-horizontal-tree} and
6984 @code{gnus-generate-vertical-tree} (which is the default).
6985
6986 @end table
6987
6988 Here's an example from a horizontal tree buffer:
6989
6990 @example
6991 @{***@}-(***)-[odd]-[Gun]
6992      |      \[Jan]
6993      |      \[odd]-[Eri]
6994      |      \(***)-[Eri]
6995      |            \[odd]-[Paa]
6996      \[Bjo]
6997      \[Gun]
6998      \[Gun]-[Jor]
6999 @end example
7000
7001 Here's the same thread displayed in a vertical tree buffer:
7002
7003 @example
7004 @{***@}
7005   |--------------------------\-----\-----\
7006 (***)                         [Bjo] [Gun] [Gun]
7007   |--\-----\-----\                          |
7008 [odd] [Jan] [odd] (***)                   [Jor]
7009   |           |     |--\
7010 [Gun]       [Eri] [Eri] [odd]
7011                           |
7012                         [Paa]
7013 @end example
7014
7015 If you're using horizontal trees, it might be nice to display the trees
7016 side-by-side with the summary buffer.  You could add something like the
7017 following to your @file{.gnus.el} file:
7018
7019 @lisp
7020 (setq gnus-use-trees t
7021       gnus-generate-tree-function 'gnus-generate-horizontal-tree
7022       gnus-tree-minimize-window nil)
7023 (gnus-add-configuration
7024  '(article
7025    (vertical 1.0
7026              (horizontal 0.25
7027                          (summary 0.75 point)
7028                          (tree 1.0))
7029              (article 1.0))))
7030 @end lisp
7031
7032 @xref{Windows Configuration}.
7033
7034
7035 @node Mail Group Commands
7036 @section Mail Group Commands
7037 @cindex mail group commands
7038
7039 Some commands only make sense in mail groups.  If these commands are
7040 invalid in the current group, they will raise a hell and let you know.
7041
7042 All these commands (except the expiry and edit commands) use the
7043 process/prefix convention (@pxref{Process/Prefix}).
7044
7045 @table @kbd
7046
7047 @item B e
7048 @kindex B e (Summary)
7049 @findex gnus-summary-expire-articles
7050 Expire all expirable articles in the group
7051 (@code{gnus-summary-expire-articles}).
7052
7053 @item B M-C-e
7054 @kindex B M-C-e (Summary)
7055 @findex gnus-summary-expire-articles-now
7056 Delete all the expirable articles in the group
7057 (@code{gnus-summary-expire-articles-now}).  This means that @strong{all}
7058 articles eligible for expiry in the current group will
7059 disappear forever into that big @file{/dev/null} in the sky.
7060
7061 @item B DEL
7062 @kindex B DEL (Summary)
7063 @findex gnus-summary-delete-article
7064 @c @icon{gnus-summary-mail-delete}
7065 Delete the mail article.  This is ``delete'' as in ``delete it from your
7066 disk forever and ever, never to return again.'' Use with caution.
7067 (@code{gnus-summary-delete-article}).
7068
7069 @item B m
7070 @kindex B m (Summary)
7071 @cindex move mail
7072 @findex gnus-summary-move-article
7073 Move the article from one mail group to another
7074 (@code{gnus-summary-move-article}). 
7075
7076 @item B c
7077 @kindex B c (Summary)
7078 @cindex copy mail
7079 @findex gnus-summary-copy-article
7080 @c @icon{gnus-summary-mail-copy}
7081 Copy the article from one group (mail group or not) to a mail group
7082 (@code{gnus-summary-copy-article}).
7083
7084 @item B C
7085 @kindex B C (Summary)
7086 @cindex crosspost mail
7087 @findex gnus-summary-crosspost-article
7088 Crosspost the current article to some other group
7089 (@code{gnus-summary-crosspost-article}).  This will create a new copy of
7090 the article in the other group, and the Xref headers of the article will
7091 be properly updated.
7092
7093 @item B i
7094 @kindex B i (Summary)
7095 @findex gnus-summary-import-article
7096 Import an arbitrary file into the current mail newsgroup
7097 (@code{gnus-summary-import-article}).  You will be prompted for a file
7098 name, a @code{From} header and a @code{Subject} header.
7099
7100 @item B r
7101 @kindex B r (Summary)
7102 @findex gnus-summary-respool-article
7103 Respool the mail article (@code{gnus-summary-move-article}).
7104 @code{gnus-summary-respool-default-method} will be used as the default
7105 select method when respooling.  This variable is @code{nil} by default,
7106 which means that the current group select method will be used instead.
7107
7108 @item B w
7109 @itemx e
7110 @kindex B w (Summary)
7111 @kindex e (Summary)
7112 @findex gnus-summary-edit-article
7113 @kindex C-c C-c (Article)
7114 Edit the current article (@code{gnus-summary-edit-article}).  To finish
7115 editing and make the changes permanent, type @kbd{C-c C-c}
7116 (@kbd{gnus-summary-edit-article-done}).  If you give a prefix to the
7117 @kbd{C-c C-c} command, Gnus won't re-highlight the article.
7118
7119 @item B q
7120 @kindex B q (Summary)
7121 @findex gnus-summary-respool-query
7122 If you want to re-spool an article, you might be curious as to what group
7123 the article will end up in before you do the re-spooling.  This command
7124 will tell you (@code{gnus-summary-respool-query}). 
7125
7126 @item B p
7127 @kindex B p (Summary)
7128 @findex gnus-summary-article-posted-p
7129 Some people have a tendency to send you "courtesy" copies when they
7130 follow up to articles you have posted.  These usually have a
7131 @code{Newsgroups} header in them, but not always.  This command
7132 (@code{gnus-summary-article-posted-p}) will try to fetch the current
7133 article from your news server (or rather, from
7134 @code{gnus-refer-article-method} or @code{gnus-select-method}) and will
7135 report back whether it found the article or not.  Even if it says that
7136 it didn't find the article, it may have been posted anyway---mail
7137 propagation is much faster than news propagation, and the news copy may
7138 just not have arrived yet.
7139
7140 @end table
7141
7142 @vindex gnus-move-split-methods
7143 @cindex moving articles
7144 If you move (or copy) articles regularly, you might wish to have Gnus
7145 suggest where to put the articles.  @code{gnus-move-split-methods} is a
7146 variable that uses the same syntax as @code{gnus-split-methods}
7147 (@pxref{Saving Articles}).  You may customize that variable to create
7148 suggestions you find reasonable.
7149
7150 @lisp
7151 (setq gnus-move-split-methods
7152       '(("^From:.*Lars Magne" "nnml:junk")
7153         ("^Subject:.*gnus" "nnfolder:important")
7154         (".*" "nnml:misc")))
7155 @end lisp
7156
7157
7158 @node Various Summary Stuff
7159 @section Various Summary Stuff
7160
7161 @menu
7162 * Summary Group Information::         Information oriented commands.
7163 * Searching for Articles::            Multiple article commands.
7164 * Summary Generation Commands::       (Re)generating the summary buffer.
7165 * Really Various Summary Commands::   Those pesky non-conformant commands.
7166 @end menu
7167
7168 @table @code
7169 @vindex gnus-summary-mode-hook
7170 @item gnus-summary-mode-hook
7171 This hook is called when creating a summary mode buffer.
7172
7173 @vindex gnus-summary-generate-hook
7174 @item gnus-summary-generate-hook
7175 This is called as the last thing before doing the threading and the
7176 generation of the summary buffer.  It's quite convenient for customizing
7177 the threading variables based on what data the newsgroup has.  This hook
7178 is called from the summary buffer after most summary buffer variables
7179 have been set.
7180
7181 @vindex gnus-summary-prepare-hook
7182 @item gnus-summary-prepare-hook
7183 It is called after the summary buffer has been generated.  You might use
7184 it to, for instance, highlight lines or modify the look of the buffer in
7185 some other ungodly manner.  I don't care.
7186
7187 @vindex gnus-summary-ignore-duplicates
7188 @item gnus-summary-ignore-duplicates
7189 When Gnus discovers two articles that have the same @code{Message-ID},
7190 it has to do something drastic.  No articles are allowed to have the
7191 same @code{Message-ID}, but this may happen when reading mail from some
7192 sources.  Gnus allows you to customize what happens with this variable.
7193 If it is @code{nil} (which is the default), Gnus will rename the
7194 @code{Message-ID} (for display purposes only) and display the article as
7195 any other article.  If this variable is @code{t}, it won't display the
7196 article---it'll be as if it never existed.
7197
7198 @end table
7199
7200
7201 @node Summary Group Information
7202 @subsection Summary Group Information
7203
7204 @table @kbd
7205
7206 @item H f
7207 @kindex H f (Summary)
7208 @findex gnus-summary-fetch-faq
7209 @vindex gnus-group-faq-directory
7210 Try to fetch the FAQ (list of frequently asked questions) for the
7211 current group (@code{gnus-summary-fetch-faq}).  Gnus will try to get the
7212 FAQ from @code{gnus-group-faq-directory}, which is usually a directory
7213 on a remote machine.  This variable can also be a list of directories.
7214 In that case, giving a prefix to this command will allow you to choose
7215 between the various sites.  @code{ange-ftp} or @code{efs} will probably
7216 be used for fetching the file.
7217
7218 @item H d
7219 @kindex H d (Summary)
7220 @findex gnus-summary-describe-group
7221 Give a brief description of the current group
7222 (@code{gnus-summary-describe-group}).  If given a prefix, force
7223 rereading the description from the server.
7224
7225 @item H h
7226 @kindex H h (Summary)
7227 @findex gnus-summary-describe-briefly
7228 Give an extremely brief description of the most important summary
7229 keystrokes (@code{gnus-summary-describe-briefly}).
7230
7231 @item H i
7232 @kindex H i (Summary)
7233 @findex gnus-info-find-node
7234 Go to the Gnus info node (@code{gnus-info-find-node}).
7235 @end table
7236
7237
7238 @node Searching for Articles
7239 @subsection Searching for Articles
7240
7241 @table @kbd
7242
7243 @item M-s
7244 @kindex M-s (Summary)
7245 @findex gnus-summary-search-article-forward
7246 Search through all subsequent articles for a regexp
7247 (@code{gnus-summary-search-article-forward}). 
7248
7249 @item M-r
7250 @kindex M-r (Summary)
7251 @findex gnus-summary-search-article-backward
7252 Search through all previous articles for a regexp
7253 (@code{gnus-summary-search-article-backward}). 
7254
7255 @item &
7256 @kindex & (Summary)
7257 @findex gnus-summary-execute-command
7258 This command will prompt you for a header field, a regular expression to
7259 match on this field, and a command to be executed if the match is made
7260 (@code{gnus-summary-execute-command}).  If given a prefix, search
7261 backward instead.
7262
7263 @item M-&
7264 @kindex M-& (Summary)
7265 @findex gnus-summary-universal-argument
7266 Perform any operation on all articles that have been marked with
7267 the process mark (@code{gnus-summary-universal-argument}).
7268 @end table
7269
7270 @node Summary Generation Commands
7271 @subsection Summary Generation Commands
7272
7273 @table @kbd
7274
7275 @item Y g
7276 @kindex Y g (Summary)
7277 @findex gnus-summary-prepare
7278 Regenerate the current summary buffer (@code{gnus-summary-prepare}).
7279
7280 @item Y c 
7281 @kindex Y c (Summary)
7282 @findex gnus-summary-insert-cached-articles
7283 Pull all cached articles (for the current group) into the summary buffer
7284 (@code{gnus-summary-insert-cached-articles}).
7285
7286 @end table
7287
7288
7289 @node Really Various Summary Commands
7290 @subsection Really Various Summary Commands
7291
7292 @table @kbd
7293
7294 @item C-d
7295 @kindex C-d (Summary)
7296 @findex gnus-summary-enter-digest-group
7297 If the current article is a collection of other articles (for instance,
7298 a digest), you might use this command to enter a group based on the that
7299 article (@code{gnus-summary-enter-digest-group}).  Gnus will try to
7300 guess what article type is currently displayed unless you give a prefix
7301 to this command, which forces a ``digest'' interpretation.  Basically,
7302 whenever you see a message that is a collection of other messages of
7303 some format, you @kbd{C-d} and read these messages in a more convenient
7304 fashion.
7305
7306 @item M-C-d
7307 @kindex M-C-d (Summary)
7308 @findex gnus-summary-read-document
7309 This command is very similar to the one above, but lets you gather
7310 several documents into one biiig group
7311 (@code{gnus-summary-read-document}).  It does this by opening several
7312 @code{nndoc} groups for each document, and then opening an
7313 @code{nnvirtual} group on top of these @code{nndoc} groups.  This
7314 command understands the process/prefix convention
7315 (@pxref{Process/Prefix}). 
7316
7317 @item C-t
7318 @kindex C-t (Summary)
7319 @findex gnus-summary-toggle-truncation
7320 Toggle truncation of summary lines
7321 (@code{gnus-summary-toggle-truncation}).  This will probably confuse the
7322 line centering function in the summary buffer, so it's not a good idea
7323 to have truncation switched off while reading articles.
7324
7325 @item =
7326 @kindex = (Summary)
7327 @findex gnus-summary-expand-window
7328 Expand the summary buffer window (@code{gnus-summary-expand-window}).
7329 If given a prefix, force an @code{article} window configuration. 
7330
7331 @end table
7332
7333
7334 @node Exiting the Summary Buffer
7335 @section Exiting the Summary Buffer
7336 @cindex summary exit
7337 @cindex exiting groups
7338
7339 Exiting from the summary buffer will normally update all info on the
7340 group and return you to the group buffer. 
7341
7342 @table @kbd
7343
7344 @item Z Z
7345 @itemx q
7346 @kindex Z Z (Summary)
7347 @kindex q (Summary)
7348 @findex gnus-summary-exit
7349 @vindex gnus-summary-exit-hook
7350 @vindex gnus-summary-prepare-exit-hook
7351 @c @icon{gnus-summary-exit}
7352 Exit the current group and update all information on the group
7353 (@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} is
7354 called before doing much of the exiting, which calls
7355 @code{gnus-summary-expire-articles} by default.
7356 @code{gnus-summary-exit-hook} is called after finishing the exit
7357 process.  @code{gnus-group-no-more-groups-hook} is run when returning to
7358 group mode having no more (unread) groups.
7359
7360 @item Z E
7361 @itemx Q
7362 @kindex Z E (Summary)
7363 @kindex Q (Summary)
7364 @findex gnus-summary-exit-no-update
7365 Exit the current group without updating any information on the group
7366 (@code{gnus-summary-exit-no-update}).
7367
7368 @item Z c
7369 @itemx c
7370 @kindex Z c (Summary)
7371 @kindex c (Summary)
7372 @findex gnus-summary-catchup-and-exit
7373 @c @icon{gnus-summary-catchup-and-exit}
7374 Mark all unticked articles in the group as read and then exit
7375 (@code{gnus-summary-catchup-and-exit}).
7376
7377 @item Z C
7378 @kindex Z C (Summary)
7379 @findex gnus-summary-catchup-all-and-exit
7380 Mark all articles, even the ticked ones, as read and then exit
7381 (@code{gnus-summary-catchup-all-and-exit}).
7382
7383 @item Z n
7384 @kindex Z n (Summary)
7385 @findex gnus-summary-catchup-and-goto-next-group
7386 Mark all articles as read and go to the next group
7387 (@code{gnus-summary-catchup-and-goto-next-group}). 
7388
7389 @item Z R
7390 @kindex Z R (Summary)
7391 @findex gnus-summary-reselect-current-group
7392 Exit this group, and then enter it again
7393 (@code{gnus-summary-reselect-current-group}).  If given a prefix, select
7394 all articles, both read and unread.
7395
7396 @item Z G
7397 @itemx M-g
7398 @kindex Z G (Summary)
7399 @kindex M-g (Summary)
7400 @findex gnus-summary-rescan-group
7401 @c @icon{gnus-summary-mail-get}
7402 Exit the group, check for new articles in the group, and select the
7403 group (@code{gnus-summary-rescan-group}).  If given a prefix, select all
7404 articles, both read and unread.
7405
7406 @item Z N
7407 @kindex Z N (Summary)
7408 @findex gnus-summary-next-group
7409 Exit the group and go to the next group
7410 (@code{gnus-summary-next-group}). 
7411
7412 @item Z P
7413 @kindex Z P (Summary)
7414 @findex gnus-summary-prev-group
7415 Exit the group and go to the previous group
7416 (@code{gnus-summary-prev-group}). 
7417
7418 @item Z s
7419 @kindex Z s (Summary)
7420 @findex gnus-summary-save-newsrc
7421 Save the current number of read/marked articles in the dribble buffer
7422 and then save the dribble buffer (@code{gnus-summary-save-newsrc}).  If
7423 given a prefix, also save the @file{.newsrc} file(s).  Using this
7424 command will make exit without updating (the @kbd{Q} command) worthless.
7425 @end table
7426
7427 @vindex gnus-exit-group-hook
7428 @code{gnus-exit-group-hook} is called when you exit the current
7429 group.  
7430
7431 @findex gnus-summary-wake-up-the-dead
7432 @findex gnus-dead-summary-mode
7433 @vindex gnus-kill-summary-on-exit
7434 If you're in the habit of exiting groups, and then changing your mind
7435 about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}.
7436 If you do that, Gnus won't kill the summary buffer when you exit it.
7437 (Quelle surprise!)  Instead it will change the name of the buffer to
7438 something like @samp{*Dead Summary ... *} and install a minor mode
7439 called @code{gnus-dead-summary-mode}.  Now, if you switch back to this
7440 buffer, you'll find that all keys are mapped to a function called
7441 @code{gnus-summary-wake-up-the-dead}.  So tapping any keys in a dead
7442 summary buffer will result in a live, normal summary buffer.  
7443
7444 There will never be more than one dead summary buffer at any one time. 
7445
7446 @vindex gnus-use-cross-reference
7447 The data on the current group will be updated (which articles you have
7448 read, which articles you have replied to, etc.) when you exit the
7449 summary buffer.  If the @code{gnus-use-cross-reference} variable is
7450 @code{t} (which is the default), articles that are cross-referenced to
7451 this group and are marked as read, will also be marked as read in the
7452 other subscribed groups they were cross-posted to.  If this variable is
7453 neither @code{nil} nor @code{t}, the article will be marked as read in
7454 both subscribed and unsubscribed groups (@pxref{Crosspost Handling}).
7455
7456
7457 @node Crosspost Handling
7458 @section Crosspost Handling
7459
7460 @cindex velveeta
7461 @cindex spamming
7462 Marking cross-posted articles as read ensures that you'll never have to
7463 read the same article more than once.  Unless, of course, somebody has
7464 posted it to several groups separately.  Posting the same article to
7465 several groups (not cross-posting) is called @dfn{spamming}, and you are
7466 by law required to send nasty-grams to anyone who perpetrates such a
7467 heinous crime.  You may want to try NoCeM handling to filter out spam
7468 (@pxref{NoCeM}). 
7469
7470 Remember: Cross-posting is kinda ok, but posting the same article
7471 separately to several groups is not.  Massive cross-posting (aka.
7472 @dfn{velveeta}) is to be avoided at all costs, and you can even use the
7473 @code{gnus-summary-mail-crosspost-complaint} command to complain about
7474 excessive crossposting (@pxref{Summary Mail Commands}).
7475
7476 @cindex cross-posting
7477 @cindex Xref
7478 @cindex @sc{nov}
7479 One thing that may cause Gnus to not do the cross-posting thing
7480 correctly is if you use an @sc{nntp} server that supports @sc{xover}
7481 (which is very nice, because it speeds things up considerably) which
7482 does not include the @code{Xref} header in its @sc{nov} lines.  This is
7483 Evil, but all too common, alas, alack.  Gnus tries to Do The Right Thing
7484 even with @sc{xover} by registering the @code{Xref} lines of all
7485 articles you actually read, but if you kill the articles, or just mark
7486 them as read without reading them, Gnus will not get a chance to snoop
7487 the @code{Xref} lines out of these articles, and will be unable to use
7488 the cross reference mechanism.
7489
7490 @cindex LIST overview.fmt
7491 @cindex overview.fmt
7492 To check whether your @sc{nntp} server includes the @code{Xref} header
7493 in its overview files, try @samp{telnet your.nntp.server nntp},
7494 @samp{MODE READER} on @code{inn} servers, and then say @samp{LIST
7495 overview.fmt}.  This may not work, but if it does, and the last line you
7496 get does not read @samp{Xref:full}, then you should shout and whine at
7497 your news admin until she includes the @code{Xref} header in the
7498 overview files.
7499
7500 @vindex gnus-nov-is-evil
7501 If you want Gnus to get the @code{Xref}s right all the time, you have to
7502 set @code{gnus-nov-is-evil} to @code{t}, which slows things down
7503 considerably.
7504
7505 C'est la vie.
7506
7507 For an alternative approach, @pxref{Duplicate Suppression}.
7508
7509
7510 @node Duplicate Suppression
7511 @section Duplicate Suppression
7512
7513 By default, Gnus tries to make sure that you don't have to read the same
7514 article more than once by utilizing the crossposting mechanism
7515 (@pxref{Crosspost Handling}).  However, that simple and efficient
7516 approach may not work satisfactory for some users for various
7517 reasons.  
7518
7519 @enumerate
7520 @item 
7521 The @sc{nntp} server may fail to generate the @code{Xref} header.  This
7522 is evil and not very common.
7523
7524 @item 
7525 The @sc{nntp} server may fail to include the @code{Xref} header in the
7526 @file{.overview} data bases.  This is evil and all too common, alas.
7527
7528 @item
7529 You may be reading the same group (or several related groups) from
7530 different @sc{nntp} servers.
7531
7532 @item
7533 You may be getting mail that duplicates articles posted to groups.
7534 @end enumerate
7535
7536 I'm sure there are other situations where @code{Xref} handling fails as
7537 well, but these four are the most common situations.
7538
7539 If, and only if, @code{Xref} handling fails for you, then you may
7540 consider switching on @dfn{duplicate suppression}.  If you do so, Gnus
7541 will remember the @code{Message-ID}s of all articles you have read or
7542 otherwise marked as read, and then, as if by magic, mark them as read
7543 all subsequent times you see them---in @emph{all} groups.  Using this
7544 mechanism is quite likely to be somewhat inefficient, but not overly
7545 so.  It's certainly preferable to reading the same articles more than
7546 once.
7547
7548 Duplicate suppression is not a very subtle instrument.  It's more like a
7549 sledge hammer than anything else.  It works in a very simple
7550 fashion---if you have marked an article as read, it adds this Message-ID
7551 to a cache.  The next time it sees this Message-ID, it will mark the
7552 article as read with the @samp{M} mark.  It doesn't care what group it
7553 saw the article in.
7554
7555 @table @code
7556 @item gnus-suppress-duplicates
7557 @vindex gnus-suppress-duplicates
7558 If non-@code{nil}, suppress duplicates.
7559
7560 @item gnus-save-duplicate-list
7561 @vindex gnus-save-duplicate-list
7562 If non-@code{nil}, save the list of duplicates to a file.  This will
7563 make startup and shutdown take longer, so the default is @code{nil}.
7564 However, this means that only duplicate articles read in a single Gnus
7565 session are suppressed.
7566
7567 @item gnus-duplicate-list-length
7568 @vindex gnus-duplicate-list-length
7569 This variable says how many @code{Message-ID}s to keep in the duplicate
7570 suppression list.  The default is 10000.  
7571
7572 @item gnus-duplicate-file
7573 @vindex gnus-duplicate-file
7574 The name of the file to store the duplicate suppression list in.  The
7575 default is @file{~/News/suppression}.
7576 @end table
7577
7578 If you have a tendency to stop and start Gnus often, setting
7579 @code{gnus-save-duplicate-list} to @code{t} is probably a good idea.  If
7580 you leave Gnus running for weeks on end, you may have it @code{nil}.  On
7581 the other hand, saving the list makes startup and shutdown much slower,
7582 so that means that if you stop and start Gnus often, you should set
7583 @code{gnus-save-duplicate-list} to @code{nil}.  Uhm.  I'll leave this up
7584 to you to figure out, I think.
7585
7586
7587 @node The Article Buffer
7588 @chapter The Article Buffer
7589 @cindex article buffer
7590
7591 The articles are displayed in the article buffer, of which there is only
7592 one.  All the summary buffers share the same article buffer unless you
7593 tell Gnus otherwise.
7594
7595 @menu
7596 * Hiding Headers::        Deciding what headers should be displayed.
7597 * Using MIME::            Pushing articles through @sc{mime} before reading them.
7598 * Customizing Articles::  Tailoring the look of the articles.
7599 * Article Keymap::        Keystrokes available in the article buffer.
7600 * Misc Article::          Other stuff.
7601 @end menu
7602
7603
7604 @node Hiding Headers
7605 @section Hiding Headers
7606 @cindex hiding headers
7607 @cindex deleting headers
7608
7609 The top section of each article is the @dfn{head}.  (The rest is the
7610 @dfn{body}, but you may have guessed that already.)
7611
7612 @vindex gnus-show-all-headers
7613 There is a lot of useful information in the head: the name of the person
7614 who wrote the article, the date it was written and the subject of the
7615 article.  That's well and nice, but there's also lots of information
7616 most people do not want to see---what systems the article has passed
7617 through before reaching you, the @code{Message-ID}, the
7618 @code{References}, etc. ad nauseum---and you'll probably want to get rid
7619 of some of those lines.  If you want to keep all those lines in the
7620 article buffer, you can set @code{gnus-show-all-headers} to @code{t}.
7621
7622 Gnus provides you with two variables for sifting headers:
7623
7624 @table @code
7625
7626 @item gnus-visible-headers
7627 @vindex gnus-visible-headers
7628 If this variable is non-@code{nil}, it should be a regular expression
7629 that says what headers you wish to keep in the article buffer.  All
7630 headers that do not match this variable will be hidden.
7631
7632 For instance, if you only want to see the name of the person who wrote
7633 the article and the subject, you'd say:
7634
7635 @lisp
7636 (setq gnus-visible-headers "^From:\\|^Subject:")
7637 @end lisp
7638
7639 This variable can also be a list of regexps to match headers to
7640 remain visible.
7641
7642 @item gnus-ignored-headers
7643 @vindex gnus-ignored-headers
7644 This variable is the reverse of @code{gnus-visible-headers}.  If this
7645 variable is set (and @code{gnus-visible-headers} is @code{nil}), it
7646 should be a regular expression that matches all lines that you want to
7647 hide.  All lines that do not match this variable will remain visible.
7648
7649 For instance, if you just want to get rid of the @code{References} line
7650 and the @code{Xref} line, you might say:
7651
7652 @lisp
7653 (setq gnus-ignored-headers "^References:\\|^Xref:")
7654 @end lisp
7655
7656 This variable can also be a list of regexps to match headers to
7657 be removed.
7658
7659 Note that if @code{gnus-visible-headers} is non-@code{nil}, this
7660 variable will have no effect.
7661
7662 @end table
7663
7664 @vindex gnus-sorted-header-list
7665 Gnus can also sort the headers for you.  (It does this by default.)  You
7666 can control the sorting by setting the @code{gnus-sorted-header-list}
7667 variable.  It is a list of regular expressions that says in what order
7668 the headers are to be displayed.
7669
7670 For instance, if you want the name of the author of the article first,
7671 and then the subject, you might say something like:
7672
7673 @lisp
7674 (setq gnus-sorted-header-list '("^From:" "^Subject:"))
7675 @end lisp
7676
7677 Any headers that are to remain visible, but are not listed in this
7678 variable, will be displayed in random order after all the headers listed in this variable.
7679
7680 @findex gnus-article-hide-boring-headers
7681 @vindex gnus-article-display-hook
7682 @vindex gnus-boring-article-headers
7683 You can hide further boring headers by entering
7684 @code{gnus-article-hide-boring-headers} into
7685 @code{gnus-article-display-hook}.  What this function does depends on
7686 the @code{gnus-boring-article-headers} variable.  It's a list, but this
7687 list doesn't actually contain header names.  Instead is lists various
7688 @dfn{boring conditions} that Gnus can check and remove from sight.
7689
7690 These conditions are:
7691 @table @code
7692 @item empty
7693 Remove all empty headers.
7694 @item newsgroups
7695 Remove the @code{Newsgroups} header if it only contains the current group
7696 name. 
7697 @item followup-to
7698 Remove the @code{Followup-To} header if it is identical to the
7699 @code{Newsgroups} header.
7700 @item reply-to
7701 Remove the @code{Reply-To} header if it lists the same address as the
7702 @code{From} header.
7703 @item date
7704 Remove the @code{Date} header if the article is less than three days
7705 old.
7706 @item long-to
7707 Remove the @code{To} header if it is very long.
7708 @item many-to
7709 Remove all @code{To} headers if there are more than one.
7710 @end table
7711
7712 To include the four first elements, you could say something like;
7713
7714 @lisp
7715 (setq gnus-boring-article-headers 
7716       '(empty newsgroups followup-to reply-to))
7717 @end lisp
7718
7719 This is also the default value for this variable.
7720
7721
7722 @node Using MIME
7723 @section Using @sc{mime}
7724 @cindex @sc{mime}
7725
7726 Mime is a standard for waving your hands through the air, aimlessly,
7727 while people stand around yawning.
7728
7729 @sc{mime}, however, is a standard for encoding your articles, aimlessly,
7730 while all newsreaders die of fear.
7731
7732 @sc{mime} may specify what character set the article uses, the encoding
7733 of the characters, and it also makes it possible to embed pictures and
7734 other naughty stuff in innocent-looking articles.
7735
7736 @vindex gnus-show-mime
7737 @vindex gnus-show-mime-method
7738 @vindex gnus-strict-mime
7739 @findex metamail-buffer
7740 Gnus handles @sc{mime} by pushing the articles through
7741 @code{gnus-show-mime-method}, which is @code{metamail-buffer} by
7742 default.  Set @code{gnus-show-mime} to @code{t} if you want to use
7743 @sc{mime} all the time.  However, if @code{gnus-strict-mime} is
7744 non-@code{nil}, the @sc{mime} method will only be used if there are
7745 @sc{mime} headers in the article.  If you have @code{gnus-show-mime}
7746 set, then you'll see some unfortunate display glitches in the article
7747 buffer.  These can't be avoided.
7748
7749 It might be best to just use the toggling functions from the summary
7750 buffer to avoid getting nasty surprises. (For instance, you enter the
7751 group @samp{alt.sing-a-long} and, before you know it, @sc{mime} has
7752 decoded the sound file in the article and some horrible sing-a-long song
7753 comes screaming out your speakers, and you can't find the volume
7754 button, because there isn't one, and people are starting to look at you,
7755 and you try to stop the program, but you can't, and you can't find the
7756 program to control the volume, and everybody else in the room suddenly
7757 decides to look at you disdainfully, and you'll feel rather stupid.)
7758
7759 Any similarity to real events and people is purely coincidental.  Ahem.
7760
7761
7762 @node Customizing Articles
7763 @section Customizing Articles
7764 @cindex article customization
7765
7766 @vindex gnus-article-display-hook
7767 The @code{gnus-article-display-hook} is called after the article has
7768 been inserted into the article buffer.  It is meant to handle all
7769 treatment of the article before it is displayed. 
7770
7771 @findex gnus-article-maybe-highlight
7772 By default this hook just contains @code{gnus-article-hide-headers},
7773 @code{gnus-article-treat-overstrike}, and
7774 @code{gnus-article-maybe-highlight}, but there are thousands, nay
7775 millions, of functions you can put in this hook.  For an overview of
7776 functions @pxref{Article Highlighting}, @pxref{Article Hiding},
7777 @pxref{Article Washing}, @pxref{Article Buttons} and @pxref{Article
7778 Date}.  Note that the order of functions in this hook might affect
7779 things, so you may have to fiddle a bit to get the desired results. 
7780
7781 You can, of course, write your own functions.  The functions are called
7782 from the article buffer, and you can do anything you like, pretty much.
7783 There is no information that you have to keep in the buffer---you can
7784 change everything.  However, you shouldn't delete any headers.  Instead
7785 make them invisible if you want to make them go away.
7786
7787
7788 @node Article Keymap
7789 @section Article Keymap
7790
7791 Most of the keystrokes in the summary buffer can also be used in the
7792 article buffer.  They should behave as if you typed them in the summary
7793 buffer, which means that you don't actually have to have a summary
7794 buffer displayed while reading.  You can do it all from the article
7795 buffer.
7796
7797 A few additional keystrokes are available:
7798
7799 @table @kbd
7800
7801 @item SPACE
7802 @kindex SPACE (Article)
7803 @findex gnus-article-next-page
7804 Scroll forwards one page (@code{gnus-article-next-page}).
7805
7806 @item DEL
7807 @kindex DEL (Article)
7808 @findex gnus-article-prev-page
7809 Scroll backwards one page (@code{gnus-article-prev-page}).
7810
7811 @item C-c ^
7812 @kindex C-c ^ (Article)
7813 @findex gnus-article-refer-article
7814 If point is in the neighborhood of a @code{Message-ID} and you press
7815 @kbd{r}, Gnus will try to get that article from the server
7816 (@code{gnus-article-refer-article}).
7817
7818 @item C-c C-m
7819 @kindex C-c C-m (Article)
7820 @findex gnus-article-mail
7821 Send a reply to the address near point (@code{gnus-article-mail}).  If
7822 given a prefix, include the mail.
7823
7824 @item s
7825 @kindex s (Article)
7826 @findex gnus-article-show-summary
7827 Reconfigure the buffers so that the summary buffer becomes visible
7828 (@code{gnus-article-show-summary}).
7829
7830 @item ?
7831 @kindex ? (Article)
7832 @findex gnus-article-describe-briefly
7833 Give a very brief description of the available keystrokes
7834 (@code{gnus-article-describe-briefly}). 
7835
7836 @item TAB
7837 @kindex TAB (Article)
7838 @findex gnus-article-next-button
7839 Go to the next button, if any (@code{gnus-article-next-button}).  This
7840 only makes sense if you have buttonizing turned on.
7841
7842 @item M-TAB
7843 @kindex M-TAB (Article)
7844 @findex gnus-article-prev-button
7845 Go to the previous button, if any (@code{gnus-article-prev-button}).  
7846
7847 @end table
7848
7849
7850 @node Misc Article
7851 @section Misc Article
7852
7853 @table @code
7854
7855 @item gnus-single-article-buffer
7856 @vindex gnus-single-article-buffer
7857 If non-@code{nil}, use the same article buffer for all the groups.
7858 (This is the default.)  If @code{nil}, each group will have its own
7859 article buffer.
7860
7861 @vindex gnus-article-prepare-hook
7862 @item gnus-article-prepare-hook
7863 This hook is called right after the article has been inserted into the
7864 article buffer.  It is mainly intended for functions that do something
7865 depending on the contents; it should probably not be used for changing
7866 the contents of the article buffer.
7867
7868 @vindex gnus-article-display-hook
7869 @item gnus-article-display-hook
7870 This hook is called as the last thing when displaying an article, and is
7871 intended for modifying the contents of the buffer, doing highlights,
7872 hiding headers, and the like.
7873
7874 @item gnus-article-mode-hook
7875 @vindex gnus-article-mode-hook
7876 Hook called in article mode buffers.
7877
7878 @item gnus-article-mode-syntax-table
7879 @vindex gnus-article-mode-syntax-table
7880 Syntax table used in article buffers.  It is initialized from
7881 @code{text-mode-syntax-table}. 
7882
7883 @vindex gnus-article-mode-line-format
7884 @item gnus-article-mode-line-format
7885 This variable is a format string along the same lines as
7886 @code{gnus-summary-mode-line-format}.  It accepts the same
7887 format specifications as that variable, with one extension:
7888
7889 @table @samp
7890 @item w
7891 The @dfn{wash status} of the article.  This is a short string with one
7892 character for each possible article wash operation that may have been
7893 performed. 
7894 @end table
7895
7896 @vindex gnus-break-pages
7897
7898 @item gnus-break-pages
7899 Controls whether @dfn{page breaking} is to take place.  If this variable
7900 is non-@code{nil}, the articles will be divided into pages whenever a
7901 page delimiter appears in the article.  If this variable is @code{nil},
7902 paging will not be done.
7903
7904 @item gnus-page-delimiter
7905 @vindex gnus-page-delimiter
7906 This is the delimiter mentioned above.  By default, it is @samp{^L}
7907 (formfeed).
7908 @end table
7909
7910
7911 @node Composing Messages
7912 @chapter Composing Messages
7913 @cindex composing messages
7914 @cindex messages
7915 @cindex mail
7916 @cindex sending mail
7917 @cindex reply
7918 @cindex followup
7919 @cindex post
7920
7921 @kindex C-c C-c (Post)
7922 All commands for posting and mailing will put you in a message buffer
7923 where you can edit the article all you like, before you send the article
7924 by pressing @kbd{C-c C-c}.  @xref{Top, , Top, message, The Message
7925 Manual}.  If you are in a foreign news group, and you wish to post the
7926 article using the foreign server, you can give a prefix to @kbd{C-c C-c}
7927 to make Gnus try to post using the foreign server.
7928
7929 @menu 
7930 * Mail::                 Mailing and replying.
7931 * Post::                 Posting and following up.
7932 * Posting Server::       What server should you post via?
7933 * Mail and Post::        Mailing and posting at the same time.
7934 * Archived Messages::    Where Gnus stores the messages you've sent.
7935 * Drafts::               Postponing messages and rejected messages.
7936 * Rejected Articles::    What happens if the server doesn't like your article?
7937 @end menu
7938
7939 Also see @pxref{Canceling and Superseding} for information on how to
7940 remove articles you shouldn't have posted.
7941
7942
7943 @node Mail
7944 @section Mail
7945
7946 Variables for customizing outgoing mail:
7947
7948 @table @code
7949 @item gnus-uu-digest-headers
7950 @vindex gnus-uu-digest-headers
7951 List of regexps to match headers included in digested messages.  The
7952 headers will be included in the sequence they are matched.
7953
7954 @item gnus-add-to-list
7955 @vindex gnus-add-to-list
7956 If non-@code{nil}, add a @code{to-list} group parameter to mail groups
7957 that have none when you do a @kbd{a}.
7958
7959 @end table
7960
7961
7962 @node Post
7963 @section Post
7964
7965 Variables for composing news articles:
7966
7967 @table @code
7968 @item gnus-sent-message-ids-file
7969 @vindex gnus-sent-message-ids-file
7970 Gnus will keep a @code{Message-ID} history file of all the mails it has
7971 sent.  If it discovers that it has already sent a mail, it will ask the
7972 user whether to re-send the mail.  (This is primarily useful when
7973 dealing with @sc{soup} packets and the like where one is apt to send the
7974 same packet multiple times.)  This variable says what the name of this
7975 history file is.  It is @file{~/News/Sent-Message-IDs} by default.  Set
7976 this variable to @code{nil} if you don't want Gnus to keep a history
7977 file.
7978
7979 @item gnus-sent-message-ids-length
7980 @vindex gnus-sent-message-ids-length
7981 This variable says how many @code{Message-ID}s to keep in the history
7982 file.  It is 1000 by default.
7983
7984 @end table
7985
7986
7987 @node Posting Server
7988 @section Posting Server
7989
7990 When you press those magical @kbd{C-c C-c} keys to ship off your latest
7991 (extremely intelligent, of course) article, where does it go?
7992
7993 Thank you for asking.  I hate you.
7994
7995 @vindex gnus-post-method
7996
7997 It can be quite complicated.  Normally, Gnus will use the same native
7998 server.  However.  If your native server doesn't allow posting, just
7999 reading, you probably want to use some other server to post your
8000 (extremely intelligent and fabulously interesting) articles.  You can
8001 then set the @code{gnus-post-method} to some other method:
8002
8003 @lisp
8004 (setq gnus-post-method '(nnspool ""))
8005 @end lisp
8006
8007 Now, if you've done this, and then this server rejects your article, or
8008 this server is down, what do you do then?  To override this variable you
8009 can use a non-zero prefix to the @kbd{C-c C-c} command to force using
8010 the ``current'' server for posting.
8011
8012 If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command,
8013 Gnus will prompt you for what method to use for posting.  
8014
8015 You can also set @code{gnus-post-method} to a list of select methods.
8016 If that's the case, Gnus will always prompt you for what method to use
8017 for posting. 
8018
8019
8020 @node Mail and Post
8021 @section Mail and Post
8022
8023 Here's a list of variables relevant to both mailing and
8024 posting:
8025
8026 @table @code
8027 @item gnus-mailing-list-groups
8028 @findex gnus-mailing-list-groups
8029 @cindex mailing lists
8030
8031 If your news server offers groups that are really mailing lists
8032 gatewayed to the @sc{nntp} server, you can read those groups without
8033 problems, but you can't post/followup to them without some difficulty.
8034 One solution is to add a @code{to-address} to the group parameters
8035 (@pxref{Group Parameters}).  An easier thing to do is set the
8036 @code{gnus-mailing-list-groups} to a regexp that matches the groups that
8037 really are mailing lists.  Then, at least, followups to the mailing
8038 lists will work most of the time.  Posting to these groups (@kbd{a}) is
8039 still a pain, though.
8040
8041 @end table
8042
8043 You may want to do spell-checking on messages that you send out.  Or, if
8044 you don't want to spell-check by hand, you could add automatic
8045 spell-checking via the @code{ispell} package:
8046
8047 @cindex ispell
8048 @findex ispell-message
8049 @lisp
8050 (add-hook 'message-send-hook 'ispell-message) 
8051 @end lisp
8052
8053
8054 @node Archived Messages
8055 @section Archived Messages
8056 @cindex archived messages
8057 @cindex sent messages
8058
8059 Gnus provides a few different methods for storing the mail and news you
8060 send.  The default method is to use the @dfn{archive virtual server} to
8061 store the messages.  If you want to disable this completely, the
8062 @code{gnus-message-archive-group} variable should be @code{nil}, which
8063 is the default.
8064
8065 @vindex gnus-message-archive-method
8066 @code{gnus-message-archive-method} says what virtual server Gnus is to
8067 use to store sent messages.  The default is:
8068
8069 @lisp
8070 (nnfolder "archive"
8071           (nnfolder-directory   "~/Mail/archive")
8072           (nnfolder-active-file "~/Mail/archive/active")
8073           (nnfolder-get-new-mail nil)
8074           (nnfolder-inhibit-expiry t))
8075 @end lisp
8076
8077 You can, however, use any mail select method (@code{nnml},
8078 @code{nnmbox}, etc.).  @code{nnfolder} is a quite likeable select method
8079 for doing this sort of thing, though.  If you don't like the default
8080 directory chosen, you could say something like:
8081
8082 @lisp
8083 (setq gnus-message-archive-method
8084       '(nnfolder "archive" 
8085                  (nnfolder-inhibit-expiry t)
8086                  (nnfolder-active-file "~/News/sent-mail/active")
8087                  (nnfolder-directory "~/News/sent-mail/")))
8088 @end lisp
8089
8090 @vindex gnus-message-archive-group
8091 @cindex Gcc
8092 Gnus will insert @code{Gcc} headers in all outgoing messages that point
8093 to one or more group(s) on that server.  Which group to use is
8094 determined by the @code{gnus-message-archive-group} variable.  
8095
8096 This variable can be used to do the following:
8097
8098 @itemize @bullet
8099 @item a string
8100 Messages will be saved in that group.
8101 @item a list of strings
8102 Messages will be saved in all those groups.
8103 @item an alist of regexps, functions and forms
8104 When a key ``matches'', the result is used.
8105 @item @code{nil}
8106 No message archiving will take place.  This is the default.
8107 @end itemize
8108
8109 Let's illustrate:
8110
8111 Just saving to a single group called @samp{MisK}:
8112 @lisp
8113 (setq gnus-message-archive-group "MisK")
8114 @end lisp
8115
8116 Saving to two groups, @samp{MisK} and @samp{safe}:
8117 @lisp
8118 (setq gnus-message-archive-group '("MisK" "safe"))
8119 @end lisp
8120
8121 Save to different groups based on what group you are in:
8122 @lisp
8123 (setq gnus-message-archive-group 
8124       '(("^alt" "sent-to-alt")
8125         ("mail" "sent-to-mail")
8126         (".*" "sent-to-misc")))
8127 @end lisp
8128
8129 More complex stuff:
8130 @lisp
8131 (setq gnus-message-archive-group 
8132       '((if (message-news-p)
8133             "misc-news" 
8134           "misc-mail")))
8135 @end lisp       
8136
8137 How about storing all news messages in one file, but storing all mail
8138 messages in one file per month:
8139
8140 @lisp
8141 (setq gnus-message-archive-group
8142       '((if (message-news-p)
8143             "misc-news" 
8144           (concat "mail." (format-time-string 
8145                            "%Y-%m" (current-time))))))
8146 @end lisp
8147
8148 (XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to
8149 use a different value for @code{gnus-message-archive-group} there.)
8150
8151 Now, when you send a message off, it will be stored in the appropriate
8152 group.  (If you want to disable storing for just one particular message,
8153 you can just remove the @code{Gcc} header that has been inserted.)  The
8154 archive group will appear in the group buffer the next time you start
8155 Gnus, or the next time you press @kbd{F} in the group buffer.  You can
8156 enter it and read the articles in it just like you'd read any other
8157 group.  If the group gets really big and annoying, you can simply rename
8158 if (using @kbd{G r} in the group buffer) to something
8159 nice---@samp{misc-mail-september-1995}, or whatever.  New messages will
8160 continue to be stored in the old (now empty) group.
8161
8162 That's the default method of archiving sent messages.  Gnus offers a
8163 different way for the people who don't like the default method.  In that
8164 case you should set @code{gnus-message-archive-group} to @code{nil};
8165 this will disable archiving.
8166
8167 @table @code
8168 @item gnus-outgoing-message-group 
8169 @vindex gnus-outgoing-message-group 
8170 All outgoing messages will be put in this group.  If you want to store
8171 all your outgoing mail and articles in the group @samp{nnml:archive},
8172 you set this variable to that value.  This variable can also be a list of
8173 group names.
8174
8175 If you want to have greater control over what group to put each
8176 message in, you can set this variable to a function that checks the
8177 current newsgroup name and then returns a suitable group name (or list
8178 of names).
8179
8180 This variable can be used instead of @code{gnus-message-archive-group},
8181 but the latter is the preferred method.
8182 @end table
8183
8184
8185 @c @node Posting Styles
8186 @c @section Posting Styles
8187 @c @cindex posting styles
8188 @c @cindex styles
8189 @c 
8190 @c All them variables, they make my head swim.  
8191 @c 
8192 @c So what if you want a different @code{Organization} and signature based
8193 @c on what groups you post to?  And you post both from your home machine
8194 @c and your work machine, and you want different @code{From} lines, and so
8195 @c on? 
8196 @c 
8197 @c @vindex gnus-posting-styles
8198 @c One way to do stuff like that is to write clever hooks that change the
8199 @c variables you need to have changed.  That's a bit boring, so somebody
8200 @c came up with the bright idea of letting the user specify these things in
8201 @c a handy alist.  Here's an example of a @code{gnus-posting-styles}
8202 @c variable: 
8203 @c 
8204 @c @lisp
8205 @c ((".*" 
8206 @c   (signature . "Peace and happiness")
8207 @c   (organization . "What me?"))
8208 @c  ("^comp" 
8209 @c   (signature . "Death to everybody"))
8210 @c  ("comp.emacs.i-love-it" 
8211 @c   (organization . "Emacs is it")))
8212 @c @end lisp
8213 @c 
8214 @c As you might surmise from this example, this alist consists of several
8215 @c @dfn{styles}.  Each style will be applicable if the first element
8216 @c ``matches'', in some form or other.  The entire alist will be iterated
8217 @c over, from the beginning towards the end, and each match will be
8218 @c applied, which means that attributes in later styles that match override
8219 @c the same attributes in earlier matching styles.  So
8220 @c @samp{comp.programming.literate} will have the @samp{Death to everybody}
8221 @c signature and the @samp{What me?} @code{Organization} header.
8222 @c 
8223 @c The first element in each style is called the @code{match}.  If it's a
8224 @c string, then Gnus will try to regexp match it against the group name.
8225 @c If it's a function symbol, that function will be called with no
8226 @c arguments.  If it's a variable symbol, then the variable will be
8227 @c referenced.  If it's a list, then that list will be @code{eval}ed.  In
8228 @c any case, if this returns a non-@code{nil} value, then the style is said
8229 @c to @dfn{match}.
8230 @c 
8231 @c Each style may contain a arbitrary amount of @dfn{attributes}.  Each
8232 @c attribute consists of a @var{(name . value)} pair.  The attribute name
8233 @c can be one of @code{signature}, @code{organization} or @code{from}.  The
8234 @c attribute name can also be a string.  In that case, this will be used as
8235 @c a header name, and the value will be inserted in the headers of the
8236 @c article.
8237 @c 
8238 @c The attribute value can be a string (used verbatim), a function (the
8239 @c return value will be used), a variable (its value will be used) or a
8240 @c list (it will be @code{eval}ed and the return value will be used).
8241 @c 
8242 @c So here's a new example:
8243 @c 
8244 @c @lisp
8245 @c (setq gnus-posting-styles
8246 @c       '((".*" 
8247 @c           (signature . "~/.signature") 
8248 @c           (from . "user@@foo (user)")
8249 @c           ("X-Home-Page" . (getenv "WWW_HOME"))
8250 @c           (organization . "People's Front Against MWM"))
8251 @c         ("^rec.humor" 
8252 @c           (signature . my-funny-signature-randomizer))
8253 @c         ((equal (system-name) "gnarly")
8254 @c           (signature . my-quote-randomizer))
8255 @c         (posting-from-work-p
8256 @c           (signature . "~/.work-signature")
8257 @c           (from . "user@@bar.foo (user)")
8258 @c           (organization . "Important Work, Inc"))
8259 @c         ("^nn.+:" 
8260 @c           (signature . "~/.mail-signature"))))
8261 @c @end lisp
8262
8263 @node Drafts
8264 @section Drafts
8265 @cindex drafts
8266
8267 If you are writing a message (mail or news) and suddenly remember that
8268 you have a steak in the oven (or some pesto in the food processor, you
8269 craaazy vegetarians), you'll probably wish there was a method to save
8270 the message you are writing so that you can continue editing it some
8271 other day, and send it when you feel its finished.
8272
8273 Well, don't worry about it.  Whenever you start composing a message of
8274 some sort using the Gnus mail and post commands, the buffer you get will
8275 automatically associate to an article in a special @dfn{draft} group.
8276 If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the
8277 article will be saved there.  (Auto-save files also go to the draft
8278 group.) 
8279
8280 @cindex nndraft
8281 @vindex nndraft-directory
8282 The draft group is a special group (which is implemented as an
8283 @code{nndraft} group, if you absolutely have to know) called
8284 @samp{nndraft:drafts}.  The variable @code{nndraft-directory} says where
8285 @code{nndraft} is to store its files.  What makes this group special is
8286 that you can't tick any articles in it or mark any articles as
8287 read---all articles in the group are permanently unread.
8288
8289 If the group doesn't exist, it will be created and you'll be subscribed
8290 to it.  The only way to make it disappear from the Group buffer is to
8291 unsubscribe it. 
8292
8293 @c @findex gnus-dissociate-buffer-from-draft
8294 @c @kindex C-c M-d (Mail)
8295 @c @kindex C-c M-d (Post)
8296 @c @findex gnus-associate-buffer-with-draft
8297 @c @kindex C-c C-d (Mail)
8298 @c @kindex C-c C-d (Post)
8299 @c If you're writing some super-secret message that you later want to
8300 @c encode with PGP before sending, you may wish to turn the auto-saving
8301 @c (and association with the draft group) off.  You never know who might be
8302 @c interested in reading all your extremely valuable and terribly horrible
8303 @c and interesting secrets.  The @kbd{C-c M-d}
8304 @c (@code{gnus-dissociate-buffer-from-draft}) command does that for you.
8305 @c If you change your mind and want to turn the auto-saving back on again,
8306 @c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that.
8307 @c 
8308 @c @vindex gnus-use-draft
8309 @c To leave association with the draft group off by default, set
8310 @c @code{gnus-use-draft} to @code{nil}.  It is @code{t} by default. 
8311
8312 @findex gnus-draft-edit-message
8313 @kindex D e (Draft)
8314 When you want to continue editing the article, you simply enter the
8315 draft group and push @kbd{D e} (@code{gnus-draft-edit-message}) to do
8316 that.  You will be placed in a buffer where you left off.
8317
8318 Rejected articles will also be put in this draft group (@pxref{Rejected
8319 Articles}).
8320
8321 @findex gnus-draft-send-all-messages
8322 @findex gnus-draft-send-message
8323 If you have lots of rejected messages you want to post (or mail) without
8324 doing further editing, you can use the @kbd{D s} command
8325 (@code{gnus-draft-send-message}).  This command understands the
8326 process/prefix convention (@pxref{Process/Prefix}).  The @kbd{D S}
8327 command (@code{gnus-draft-send-all-messages}) will ship off all messages
8328 in the buffer.
8329
8330 If you have some messages that you wish not to send, you can use the
8331 @kbd{D t} (@code{gnus-draft-toggle-sending}) command to mark the message
8332 as unsendable.  This is a toggling command.
8333
8334
8335 @node Rejected Articles
8336 @section Rejected Articles
8337 @cindex rejected articles
8338
8339 Sometimes a news server will reject an article.  Perhaps the server
8340 doesn't like your face.  Perhaps it just feels miserable.  Perhaps
8341 @emph{there be demons}.  Perhaps you have included too much cited text.
8342 Perhaps the disk is full.  Perhaps the server is down.
8343
8344 These situations are, of course, totally beyond the control of Gnus.
8345 (Gnus, of course, loves the way you look, always feels great, has angels
8346 fluttering around inside of it, doesn't care about how much cited text
8347 you include, never runs full and never goes down.)  So Gnus saves these
8348 articles until some later time when the server feels better.
8349
8350 The rejected articles will automatically be put in a special draft group
8351 (@pxref{Drafts}).  When the server comes back up again, you'd then
8352 typically enter that group and send all the articles off.
8353
8354
8355 @node Select Methods
8356 @chapter Select Methods
8357 @cindex foreign groups
8358 @cindex select methods
8359
8360 A @dfn{foreign group} is a group not read by the usual (or
8361 default) means.  It could be, for instance, a group from a different
8362 @sc{nntp} server, it could be a virtual group, or it could be your own
8363 personal mail group.
8364
8365 A foreign group (or any group, really) is specified by a @dfn{name} and
8366 a @dfn{select method}.  To take the latter first, a select method is a
8367 list where the first element says what backend to use (e.g. @code{nntp},
8368 @code{nnspool}, @code{nnml}) and the second element is the @dfn{server
8369 name}.  There may be additional elements in the select method, where the
8370 value may have special meaning for the backend in question.
8371
8372 One could say that a select method defines a @dfn{virtual server}---so
8373 we do just that (@pxref{The Server Buffer}).
8374
8375 The @dfn{name} of the group is the name the backend will recognize the
8376 group as.
8377
8378 For instance, the group @samp{soc.motss} on the @sc{nntp} server
8379 @samp{some.where.edu} will have the name @samp{soc.motss} and select
8380 method @code{(nntp "some.where.edu")}.  Gnus will call this group
8381 @samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp}
8382 backend just knows this group as @samp{soc.motss}.
8383
8384 The different methods all have their peculiarities, of course.
8385
8386 @menu
8387 * The Server Buffer::     Making and editing virtual servers.
8388 * Getting News::          Reading USENET news with Gnus.
8389 * Getting Mail::          Reading your personal mail with Gnus.
8390 * Other Sources::         Reading directories, files, SOUP packets.
8391 * Combined Groups::       Combining groups into one group.
8392 * Gnus Unplugged::        Reading news and mail offline.
8393 @end menu
8394
8395
8396 @node The Server Buffer
8397 @section The Server Buffer
8398
8399 Traditionally, a @dfn{server} is a machine or a piece of software that
8400 one connects to, and then requests information from.  Gnus does not
8401 connect directly to any real servers, but does all transactions through
8402 one backend or other.  But that's just putting one layer more between
8403 the actual media and Gnus, so we might just as well say that each
8404 backend represents a virtual server.
8405
8406 For instance, the @code{nntp} backend may be used to connect to several
8407 different actual @sc{nntp} servers, or, perhaps, to many different ports
8408 on the same actual @sc{nntp} server.  You tell Gnus which backend to
8409 use, and what parameters to set by specifying a @dfn{select method}.
8410
8411 These select method specifications can sometimes become quite
8412 complicated---say, for instance, that you want to read from the
8413 @sc{nntp} server @samp{news.funet.fi} on port number 13, which
8414 hangs if queried for @sc{nov} headers and has a buggy select.  Ahem.
8415 Anyways, if you had to specify that for each group that used this
8416 server, that would be too much work, so Gnus offers a way of naming
8417 select methods, which is what you do in the server buffer.
8418
8419 To enter the server buffer, use the @kbd{^}
8420 (@code{gnus-group-enter-server-mode}) command in the group buffer.
8421
8422 @menu
8423 * Server Buffer Format::      You can customize the look of this buffer.
8424 * Server Commands::           Commands to manipulate servers.
8425 * Example Methods::           Examples server specifications.
8426 * Creating a Virtual Server:: An example session.
8427 * Server Variables::          Which variables to set.
8428 * Servers and Methods::       You can use server names as select methods.
8429 * Unavailable Servers::       Some servers you try to contact may be down.
8430 @end menu
8431
8432 @vindex gnus-server-mode-hook
8433 @code{gnus-server-mode-hook} is run when creating the server buffer.
8434
8435
8436 @node Server Buffer Format
8437 @subsection Server Buffer Format
8438 @cindex server buffer format
8439
8440 @vindex gnus-server-line-format
8441 You can change the look of the server buffer lines by changing the
8442 @code{gnus-server-line-format} variable.  This is a @code{format}-like
8443 variable, with some simple extensions:
8444
8445 @table @samp
8446
8447 @item h 
8448 How the news is fetched---the backend name.
8449
8450 @item n
8451 The name of this server.
8452
8453 @item w
8454 Where the news is to be fetched from---the address.
8455
8456 @item s
8457 The opened/closed/denied status of the server.
8458 @end table
8459
8460 @vindex gnus-server-mode-line-format
8461 The mode line can also be customized by using the
8462 @code{gnus-server-mode-line-format} variable.  The following specs are
8463 understood: 
8464
8465 @table @samp
8466 @item S
8467 Server name.
8468
8469 @item M
8470 Server method.
8471 @end table
8472
8473 Also @pxref{Formatting Variables}.
8474
8475
8476 @node Server Commands
8477 @subsection Server Commands
8478 @cindex server commands
8479
8480 @table @kbd
8481
8482 @item a
8483 @kindex a (Server)
8484 @findex gnus-server-add-server
8485 Add a new server (@code{gnus-server-add-server}).
8486
8487 @item e
8488 @kindex e (Server)
8489 @findex gnus-server-edit-server
8490 Edit a server (@code{gnus-server-edit-server}).
8491
8492 @item SPACE
8493 @kindex SPACE (Server)
8494 @findex gnus-server-read-server
8495 Browse the current server (@code{gnus-server-read-server}).
8496
8497 @item q
8498 @kindex q (Server)
8499 @findex gnus-server-exit
8500 Return to the group buffer (@code{gnus-server-exit}).
8501
8502 @item k
8503 @kindex k (Server)
8504 @findex gnus-server-kill-server
8505 Kill the current server (@code{gnus-server-kill-server}).
8506
8507 @item y
8508 @kindex y (Server)
8509 @findex gnus-server-yank-server
8510 Yank the previously killed server (@code{gnus-server-yank-server}).
8511
8512 @item c
8513 @kindex c (Server)
8514 @findex gnus-server-copy-server
8515 Copy the current server (@code{gnus-server-copy-server}).
8516
8517 @item l
8518 @kindex l (Server)
8519 @findex gnus-server-list-servers
8520 List all servers (@code{gnus-server-list-servers}).
8521
8522 @item s
8523 @kindex s (Server)
8524 @findex gnus-server-scan-server
8525 Request that the server scan its sources for new articles
8526 (@code{gnus-server-scan-server}).  This is mainly sensible with mail
8527 servers. 
8528
8529 @item g
8530 @kindex g (Server)
8531 @findex gnus-server-regenerate-server
8532 Request that the server regenerate all its data structures
8533 (@code{gnus-server-regenerate-server}).  This can be useful if you have
8534 a mail backend that has gotten out of synch.
8535
8536 @end table
8537
8538
8539 @node Example Methods
8540 @subsection Example Methods
8541
8542 Most select methods are pretty simple and self-explanatory: 
8543
8544 @lisp
8545 (nntp "news.funet.fi")
8546 @end lisp
8547
8548 Reading directly from the spool is even simpler:
8549
8550 @lisp
8551 (nnspool "")
8552 @end lisp
8553
8554 As you can see, the first element in a select method is the name of the
8555 backend, and the second is the @dfn{address}, or @dfn{name}, if you
8556 will. 
8557
8558 After these two elements, there may be an arbitrary number of
8559 @var{(variable form)} pairs.
8560
8561 To go back to the first example---imagine that you want to read from
8562 port 15 on that machine.  This is what the select method should
8563 look like then:
8564
8565 @lisp
8566 (nntp "news.funet.fi" (nntp-port-number 15))
8567 @end lisp
8568
8569 You should read the documentation to each backend to find out what
8570 variables are relevant, but here's an @code{nnmh} example:
8571
8572 @code{nnmh} is a mail backend that reads a spool-like structure.  Say
8573 you have two structures that you wish to access: One is your private
8574 mail spool, and the other is a public one.  Here's the possible spec for
8575 your private mail:
8576
8577 @lisp
8578 (nnmh "private" (nnmh-directory "~/private/mail/"))
8579 @end lisp
8580
8581 (This server is then called @samp{private}, but you may have guessed
8582 that.)
8583
8584 Here's the method for a public spool:
8585
8586 @lisp
8587 (nnmh "public" 
8588       (nnmh-directory "/usr/information/spool/") 
8589       (nnmh-get-new-mail nil))
8590 @end lisp
8591
8592 If you are behind a firewall and only have access to the @sc{nntp}
8593 server from the firewall machine, you can instruct Gnus to @code{rlogin}
8594 on the firewall machine and telnet from there to the @sc{nntp} server.
8595 Doing this can be rather fiddly, but your virtual server definition
8596 should probably look something like this:
8597
8598 @lisp
8599 (nntp "firewall"
8600       (nntp-address "the.firewall.machine")
8601       (nntp-open-connection-function nntp-open-rlogin)
8602       (nntp-end-of-line "\n")
8603       (nntp-rlogin-parameters
8604        ("telnet" "the.real.nntp.host" "nntp")))
8605 @end lisp
8606
8607
8608
8609 @node Creating a Virtual Server
8610 @subsection Creating a Virtual Server
8611
8612 If you're saving lots of articles in the cache by using persistent
8613 articles, you may want to create a virtual server to read the cache.
8614
8615 First you need to add a new server.  The @kbd{a} command does that.  It
8616 would probably be best to use @code{nnspool} to read the cache.  You
8617 could also use @code{nnml} or @code{nnmh}, though.
8618
8619 Type @kbd{a nnspool RET cache RET}.
8620
8621 You should now have a brand new @code{nnspool} virtual server called
8622 @samp{cache}.  You now need to edit it to have the right definitions.
8623 Type @kbd{e} to edit the server.  You'll be entered into a buffer that
8624 will contain the following:
8625
8626 @lisp
8627 (nnspool "cache")
8628 @end lisp
8629
8630 Change that to:
8631
8632 @lisp
8633 (nnspool "cache"
8634          (nnspool-spool-directory "~/News/cache/")
8635          (nnspool-nov-directory "~/News/cache/")
8636          (nnspool-active-file "~/News/cache/active"))
8637 @end lisp
8638
8639 Type @kbd{C-c C-c} to return to the server buffer.  If you now press
8640 @kbd{RET} over this virtual server, you should be entered into a browse
8641 buffer, and you should be able to enter any of the groups displayed.
8642
8643
8644 @node Server Variables
8645 @subsection Server Variables
8646
8647 One sticky point when defining variables (both on backends and in Emacs
8648 in general) is that some variables are typically initialized from other
8649 variables when the definition of the variables is being loaded.  If you
8650 change the "base" variable after the variables have been loaded, you
8651 won't change the "derived" variables.
8652
8653 This typically affects directory and file variables.  For instance,
8654 @code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml}
8655 directory variables are initialized from that variable, so
8656 @code{nnml-active-file} will be @file{~/Mail/active}.  If you define a
8657 new virtual @code{nnml} server, it will @emph{not} suffice to set just
8658 @code{nnml-directory}---you have to explicitly set all the file
8659 variables to be what you want them to be.  For a complete list of
8660 variables for each backend, see each backend's section later in this
8661 manual, but here's an example @code{nnml} definition:
8662
8663 @lisp
8664 (nnml "public" 
8665       (nnml-directory "~/my-mail/")
8666       (nnml-active-file "~/my-mail/active")
8667       (nnml-newsgroups-file "~/my-mail/newsgroups"))
8668 @end lisp
8669
8670
8671 @node Servers and Methods
8672 @subsection Servers and Methods
8673
8674 Wherever you would normally use a select method
8675 (e.g. @code{gnus-secondary-select-method}, in the group select method,
8676 when browsing a foreign server) you can use a virtual server name
8677 instead.  This could potentially save lots of typing.  And it's nice all
8678 over.
8679
8680
8681 @node Unavailable Servers
8682 @subsection Unavailable Servers
8683
8684 If a server seems to be unreachable, Gnus will mark that server as
8685 @code{denied}.  That means that any subsequent attempt to make contact
8686 with that server will just be ignored.  ``It can't be opened,'' Gnus
8687 will tell you, without making the least effort to see whether that is
8688 actually the case or not.
8689
8690 That might seem quite naughty, but it does make sense most of the time.
8691 Let's say you have 10 groups subscribed to on server
8692 @samp{nephelococcygia.com}.  This server is located somewhere quite far
8693 away from you and the machine is quite slow, so it takes 1 minute just
8694 to find out that it refuses connection to you today.  If Gnus were to
8695 attempt to do that 10 times, you'd be quite annoyed, so Gnus won't
8696 attempt to do that.  Once it has gotten a single ``connection refused'',
8697 it will regard that server as ``down''.
8698
8699 So, what happens if the machine was only feeling unwell temporarily?
8700 How do you test to see whether the machine has come up again?
8701
8702 You jump to the server buffer (@pxref{The Server Buffer}) and poke it
8703 with the following commands:
8704
8705 @table @kbd
8706
8707 @item O
8708 @kindex O (Server)
8709 @findex gnus-server-open-server
8710 Try to establish connection to the server on the current line
8711 (@code{gnus-server-open-server}).
8712
8713 @item C
8714 @kindex C (Server)
8715 @findex gnus-server-close-server
8716 Close the connection (if any) to the server
8717 (@code{gnus-server-close-server}).
8718
8719 @item D
8720 @kindex D (Server)
8721 @findex gnus-server-deny-server
8722 Mark the current server as unreachable
8723 (@code{gnus-server-deny-server}). 
8724
8725 @item M-o
8726 @kindex M-o (Server)
8727 @findex gnus-server-open-all-servers
8728 Open the connections to all servers in the buffer
8729 (@code{gnus-server-open-all-servers}). 
8730
8731 @item M-c
8732 @kindex M-c (Server)
8733 @findex gnus-server-close-all-servers
8734 Close the connections to all servers in the buffer
8735 (@code{gnus-server-close-all-servers}). 
8736
8737 @item R
8738 @kindex R (Server)
8739 @findex gnus-server-remove-denials
8740 Remove all marks to whether Gnus was denied connection from any servers
8741 (@code{gnus-server-remove-denials}). 
8742
8743 @end table
8744
8745
8746 @node Getting News
8747 @section Getting News
8748 @cindex reading news
8749 @cindex news backends
8750
8751 A newsreader is normally used for reading news.  Gnus currently provides
8752 only two methods of getting news---it can read from an @sc{nntp} server,
8753 or it can read from a local spool.
8754
8755 @menu
8756 * NNTP::               Reading news from an @sc{nntp} server.
8757 * News Spool::         Reading news from the local spool.
8758 @end menu
8759
8760
8761 @node NNTP
8762 @subsection @sc{nntp}
8763 @cindex nntp
8764
8765 Subscribing to a foreign group from an @sc{nntp} server is rather easy.
8766 You just specify @code{nntp} as method and the address of the @sc{nntp}
8767 server as the, uhm, address.
8768
8769 If the @sc{nntp} server is located at a non-standard port, setting the
8770 third element of the select method to this port number should allow you
8771 to connect to the right port.  You'll have to edit the group info for
8772 that (@pxref{Foreign Groups}).
8773
8774 The name of the foreign group can be the same as a native group.  In
8775 fact, you can subscribe to the same group from as many different servers
8776 you feel like.  There will be no name collisions.
8777
8778 The following variables can be used to create a virtual @code{nntp}
8779 server: 
8780
8781 @table @code
8782
8783 @item nntp-server-opened-hook
8784 @vindex nntp-server-opened-hook
8785 @cindex @sc{mode reader}
8786 @cindex authinfo
8787 @cindex authentification
8788 @cindex nntp authentification
8789 @findex nntp-send-authinfo
8790 @findex nntp-send-mode-reader
8791 is run after a connection has been made.  It can be used to send
8792 commands to the @sc{nntp} server after it has been contacted.  By
8793 default it sends the command @code{MODE READER} to the server with the
8794 @code{nntp-send-mode-reader} function.  This function should always be
8795 present in this hook.
8796
8797 @item nntp-authinfo-function 
8798 @vindex nntp-authinfo-function 
8799 This function will be used to send @samp{AUTHINFO} to the @sc{nntp}
8800 server.  Available functions include:
8801
8802 @table @code
8803 @item nntp-send-authinfo
8804 @findex nntp-send-authinfo
8805 This function will use your current login name as the user name and will
8806 prompt you for the password.  This is the default.
8807
8808 @item nntp-send-nosy-authinfo
8809 @findex nntp-send-nosy-authinfo
8810 This function will prompt you for both user name and password.
8811
8812 @item nntp-send-authinfo-from-file
8813 @findex nntp-send-authinfo-from-file
8814 This function will use your current login name as the user name and will
8815 read the @sc{nntp} password from @file{~/.nntp-authinfo}.
8816 @end table
8817
8818 @item nntp-server-action-alist 
8819 @vindex nntp-server-action-alist 
8820 This is a list of regexps to match on server types and actions to be
8821 taken when matches are made.  For instance, if you want Gnus to beep
8822 every time you connect to innd, you could say something like:
8823
8824 @lisp
8825 (setq nntp-server-action-alist
8826       '(("innd" (ding))))
8827 @end lisp
8828
8829 You probably don't want to do that, though.
8830
8831 The default value is
8832
8833 @lisp
8834 '(("nntpd 1\\.5\\.11t" 
8835    (remove-hook 'nntp-server-opened-hook 'nntp-send-mode-reader)))
8836 @end lisp
8837
8838 This ensures that Gnus doesn't send the @code{MODE READER} command to
8839 nntpd 1.5.11t, since that command chokes that server, I've been told. 
8840
8841 @item nntp-maximum-request
8842 @vindex nntp-maximum-request
8843 If the @sc{nntp} server doesn't support @sc{nov} headers, this backend
8844 will collect headers by sending a series of @code{head} commands.  To
8845 speed things up, the backend sends lots of these commands without
8846 waiting for reply, and then reads all the replies.  This is controlled
8847 by the @code{nntp-maximum-request} variable, and is 400 by default.  If
8848 your network is buggy, you should set this to 1.
8849
8850 @item nntp-connection-timeout
8851 @vindex nntp-connection-timeout
8852 If you have lots of foreign @code{nntp} groups that you connect to
8853 regularly, you're sure to have problems with @sc{nntp} servers not
8854 responding properly, or being too loaded to reply within reasonable
8855 time.  This is can lead to awkward problems, which can be helped
8856 somewhat by setting @code{nntp-connection-timeout}.  This is an integer
8857 that says how many seconds the @code{nntp} backend should wait for a
8858 connection before giving up.  If it is @code{nil}, which is the default,
8859 no timeouts are done.
8860
8861 @c @item nntp-command-timeout
8862 @c @vindex nntp-command-timeout
8863 @c @cindex PPP connections
8864 @c @cindex dynamic IP addresses
8865 @c If you're running Gnus on a machine that has a dynamically assigned
8866 @c address, Gnus may become confused.  If the address of your machine
8867 @c changes after connecting to the @sc{nntp} server, Gnus will simply sit
8868 @c waiting forever for replies from the server.  To help with this
8869 @c unfortunate problem, you can set this command to a number.  Gnus will
8870 @c then, if it sits waiting for a reply from the server longer than that
8871 @c number of seconds, shut down the connection, start a new one, and resend
8872 @c the command.  This should hopefully be transparent to the user.  A
8873 @c likely number is 30 seconds.
8874 @c 
8875 @c @item nntp-retry-on-break
8876 @c @vindex nntp-retry-on-break
8877 @c If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus
8878 @c hangs.  This will have much the same effect as the command timeout
8879 @c described above.
8880
8881 @item nntp-server-hook
8882 @vindex nntp-server-hook
8883 This hook is run as the last step when connecting to an @sc{nntp}
8884 server.
8885
8886 @findex nntp-open-rlogin
8887 @findex nntp-open-telnet
8888 @findex nntp-open-network-stream
8889 @item nntp-open-connection-function
8890 @vindex nntp-open-connection-function
8891 This function is used to connect to the remote system.  Three pre-made
8892 functions are @code{nntp-open-network-stream}, which is the default, and
8893 simply connects to some port or other on the remote system.  The other
8894 two are @code{nntp-open-rlogin}, which does an @samp{rlogin} on the
8895 remote system, and then does a @samp{telnet} to the @sc{nntp} server
8896 available there, and @code{nntp-open-telnet}, which does a @samp{telnet}
8897 to the remote system and then another @samp{telnet} to get to the
8898 @sc{nntp} server.
8899
8900 @code{nntp-open-rlogin}-related variables:
8901
8902 @table @code
8903
8904 @item nntp-rlogin-program 
8905 @vindex nntp-rlogin-program 
8906 Program used to log in on remote machines.  The default is @samp{rsh},
8907 but @samp{ssh} is a popular alternative.
8908
8909 @item nntp-rlogin-parameters
8910 @vindex nntp-rlogin-parameters
8911 This list will be used as the parameter list given to @code{rsh}.
8912
8913 @item nntp-rlogin-user-name
8914 @vindex nntp-rlogin-user-name
8915 User name on the remote system.
8916
8917 @end table
8918
8919 @code{nntp-open-telnet}-related variables:
8920
8921 @table @code
8922 @item nntp-telnet-command
8923 @vindex nntp-telnet-command
8924 Command used to start @code{telnet}.
8925
8926 @item nntp-telnet-switches
8927 @vindex nntp-telnet-switches
8928 List of strings to be used as the switches to the @code{telnet} command.
8929
8930 @item nntp-telnet-user-name
8931 @vindex nntp-telnet-user-name
8932 User name for log in on the remote system.
8933
8934 @item nntp-telnet-passwd
8935 @vindex nntp-telnet-passwd
8936 Password to use when logging in.
8937
8938 @item nntp-telnet-parameters
8939 @vindex nntp-telnet-parameters
8940 A list of strings executed as a command after logging in
8941 via @code{telnet}.
8942
8943 @end table
8944
8945 @item nntp-end-of-line
8946 @vindex nntp-end-of-line
8947 String to use as end-of-line marker when talking to the @sc{nntp}
8948 server.  This is @samp{\r\n} by default, but should be @samp{\n} when
8949 using @code{rlogin} to talk to the server.
8950
8951 @item nntp-rlogin-user-name
8952 @vindex nntp-rlogin-user-name
8953 User name on the remote system when using the @code{rlogin} connect
8954 function. 
8955
8956 @item nntp-address
8957 @vindex nntp-address
8958 The address of the remote system running the @sc{nntp} server.
8959
8960 @item nntp-port-number
8961 @vindex nntp-port-number
8962 Port number to connect to when using the @code{nntp-open-network-stream}
8963 connect function.
8964
8965 @item nntp-buggy-select
8966 @vindex nntp-buggy-select
8967 Set this to non-@code{nil} if your select routine is buggy.
8968
8969 @item nntp-nov-is-evil 
8970 @vindex nntp-nov-is-evil 
8971 If the @sc{nntp} server does not support @sc{nov}, you could set this
8972 variable to @code{t}, but @code{nntp} usually checks automatically whether @sc{nov}
8973 can be used.
8974
8975 @item nntp-xover-commands
8976 @vindex nntp-xover-commands
8977 @cindex nov
8978 @cindex XOVER
8979 List of strings used as commands to fetch @sc{nov} lines from a
8980 server.  The default value of this variable is @code{("XOVER"
8981 "XOVERVIEW")}. 
8982
8983 @item nntp-nov-gap
8984 @vindex nntp-nov-gap
8985 @code{nntp} normally sends just one big request for @sc{nov} lines to
8986 the server.  The server responds with one huge list of lines.  However,
8987 if you have read articles 2-5000 in the group, and only want to read
8988 article 1 and 5001, that means that @code{nntp} will fetch 4999 @sc{nov}
8989 lines that you will not need.  This variable says how
8990 big a gap between two consecutive articles is allowed to be before the
8991 @code{XOVER} request is split into several request.  Note that if your
8992 network is fast, setting this variable to a really small number means
8993 that fetching will probably be slower.  If this variable is @code{nil},
8994 @code{nntp} will never split requests.  The default is 5.
8995
8996 @item nntp-prepare-server-hook
8997 @vindex nntp-prepare-server-hook
8998 A hook run before attempting to connect to an @sc{nntp} server.
8999
9000 @item nntp-warn-about-losing-connection
9001 @vindex nntp-warn-about-losing-connection
9002 If this variable is non-@code{nil}, some noise will be made when a
9003 server closes connection.
9004
9005 @end table
9006
9007
9008 @node News Spool
9009 @subsection News Spool
9010 @cindex nnspool
9011 @cindex news spool
9012
9013 Subscribing to a foreign group from the local spool is extremely easy,
9014 and might be useful, for instance, to speed up reading groups that
9015 contain very big articles---@samp{alt.binaries.pictures.furniture}, for
9016 instance. 
9017
9018 Anyways, you just specify @code{nnspool} as the method and @code{""} (or
9019 anything else) as the address.
9020
9021 If you have access to a local spool, you should probably use that as the
9022 native select method (@pxref{Finding the News}).  It is normally faster
9023 than using an @code{nntp} select method, but might not be.  It depends.
9024 You just have to try to find out what's best at your site.
9025
9026 @table @code
9027
9028 @item nnspool-inews-program
9029 @vindex nnspool-inews-program
9030 Program used to post an article.
9031
9032 @item nnspool-inews-switches
9033 @vindex nnspool-inews-switches
9034 Parameters given to the inews program when posting an article. 
9035
9036 @item nnspool-spool-directory
9037 @vindex nnspool-spool-directory
9038 Where @code{nnspool} looks for the articles.  This is normally
9039 @file{/usr/spool/news/}.
9040
9041 @item nnspool-nov-directory 
9042 @vindex nnspool-nov-directory 
9043 Where @code{nnspool} will look for @sc{nov} files.  This is normally
9044 @file{/usr/spool/news/over.view/}.
9045
9046 @item nnspool-lib-dir
9047 @vindex nnspool-lib-dir
9048 Where the news lib dir is (@file{/usr/lib/news/} by default).
9049
9050 @item nnspool-active-file
9051 @vindex nnspool-active-file
9052 The path to the active file.
9053
9054 @item nnspool-newsgroups-file
9055 @vindex nnspool-newsgroups-file
9056 The path to the group descriptions file.
9057
9058 @item nnspool-history-file
9059 @vindex nnspool-history-file
9060 The path to the news history file.
9061
9062 @item nnspool-active-times-file
9063 @vindex nnspool-active-times-file
9064 The path to the active date file.
9065
9066 @item nnspool-nov-is-evil
9067 @vindex nnspool-nov-is-evil
9068 If non-@code{nil}, @code{nnspool} won't try to use any @sc{nov} files
9069 that it finds.
9070
9071 @item nnspool-sift-nov-with-sed
9072 @vindex nnspool-sift-nov-with-sed
9073 @cindex sed
9074 If non-@code{nil}, which is the default, use @code{sed} to get the
9075 relevant portion from the overview file.  If nil, @code{nnspool} will
9076 load the entire file into a buffer and process it there.
9077
9078 @end table
9079
9080
9081 @node Getting Mail
9082 @section Getting Mail
9083 @cindex reading mail
9084 @cindex mail
9085
9086 Reading mail with a newsreader---isn't that just plain WeIrD? But of
9087 course.
9088
9089 @menu
9090 * Getting Started Reading Mail:: A simple cookbook example.
9091 * Splitting Mail::               How to create mail groups.
9092 * Mail Backend Variables::       Variables for customizing mail handling.
9093 * Fancy Mail Splitting::         Gnus can do hairy splitting of incoming mail.
9094 * Mail and Procmail::            Reading mail groups that procmail create.
9095 * Incorporating Old Mail::       What about the old mail you have?
9096 * Expiring Mail::                Getting rid of unwanted mail.
9097 * Washing Mail::                 Removing gruft from the mail you get.
9098 * Duplicates::                   Dealing with duplicated mail.
9099 * Not Reading Mail::             Using mail backends for reading other files.
9100 * Choosing a Mail Backend::      Gnus can read a variety of mail formats.
9101 @end menu
9102
9103
9104 @node Getting Started Reading Mail
9105 @subsection Getting Started Reading Mail
9106
9107 It's quite easy to use Gnus to read your new mail.  You just plonk the
9108 mail backend of your choice into @code{gnus-secondary-select-methods},
9109 and things will happen automatically.
9110
9111 For instance, if you want to use @code{nnml} (which is a "one file per
9112 mail" backend), you could put the following in your @file{.gnus} file:
9113
9114 @lisp
9115 (setq gnus-secondary-select-methods
9116       '((nnml "private")))
9117 @end lisp
9118
9119 Now, the next time you start Gnus, this backend will be queried for new
9120 articles, and it will move all the messages in your spool file to its
9121 directory, which is @code{~/Mail/} by default.  The new group that will
9122 be created (@samp{mail.misc}) will be subscribed, and you can read it
9123 like any other group.
9124
9125 You will probably want to split the mail into several groups, though:
9126
9127 @lisp
9128 (setq nnmail-split-methods
9129       '(("junk" "^From:.*Lars Ingebrigtsen")
9130         ("crazy" "^Subject:.*die\\|^Organization:.*flabby")
9131         ("other" "")))
9132 @end lisp
9133
9134 This will result in three new @code{nnml} mail groups being created:
9135 @samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}.  All the
9136 mail that doesn't fit into the first two groups will be placed in the
9137 last group.
9138
9139 This should be sufficient for reading mail with Gnus.  You might want to
9140 give the other sections in this part of the manual a perusal, though.
9141 Especially @pxref{Choosing a Mail Backend} and @pxref{Expiring Mail}. 
9142
9143
9144 @node Splitting Mail
9145 @subsection Splitting Mail
9146 @cindex splitting mail
9147 @cindex mail splitting
9148
9149 @vindex nnmail-split-methods
9150 The @code{nnmail-split-methods} variable says how the incoming mail is
9151 to be split into groups.
9152
9153 @lisp
9154 (setq nnmail-split-methods
9155   '(("mail.junk" "^From:.*Lars Ingebrigtsen")
9156     ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby")
9157     ("mail.other" "")))
9158 @end lisp
9159
9160 This variable is a list of lists, where the first element of each of
9161 these lists is the name of the mail group (they do not have to be called
9162 something beginning with @samp{mail}, by the way), and the second
9163 element is a regular expression used on the header of each mail to
9164 determine if it belongs in this mail group.  The first string may
9165 contain @samp{\\1} forms, like the ones used by @code{replace-match} to
9166 insert sub-expressions from the matched text.  For instance:
9167
9168 @lisp
9169 ("list.\\1" "From:.*\\(.*\\)-list@@majordomo.com")
9170 @end lisp
9171
9172 If the first element is the special symbol @code{junk}, then messages
9173 that match the regexp will disappear into the aether.  Use with
9174 extreme caution. 
9175
9176 The second element can also be a function.  In that case, it will be
9177 called narrowed to the headers with the first element of the rule as the
9178 argument.  It should return a non-@code{nil} value if it thinks that the
9179 mail belongs in that group.
9180
9181 The last of these groups should always be a general one, and the regular
9182 expression should @emph{always} be @samp{} so that it matches any mails
9183 that haven't been matched by any of the other regexps.  (These rules are
9184 processed from the beginning of the alist toward the end.  The first
9185 rule to make a match will "win", unless you have crossposting enabled.
9186 In that case, all matching rules will "win".)
9187
9188 If you like to tinker with this yourself, you can set this variable to a
9189 function of your choice.  This function will be called without any
9190 arguments in a buffer narrowed to the headers of an incoming mail
9191 message.  The function should return a list of group names that it
9192 thinks should carry this mail message.
9193
9194 Note that the mail backends are free to maul the poor, innocent,
9195 incoming headers all they want to.  They all add @code{Lines} headers;
9196 some add @code{X-Gnus-Group} headers; most rename the Unix mbox
9197 @code{From<SPACE>} line to something else.
9198
9199 @vindex nnmail-crosspost
9200 The mail backends all support cross-posting.  If several regexps match,
9201 the mail will be ``cross-posted'' to all those groups.
9202 @code{nnmail-crosspost} says whether to use this mechanism or not.  Note
9203 that no articles are crossposted to the general (@samp{}) group.
9204
9205 @vindex nnmail-crosspost-link-function
9206 @cindex crosspost
9207 @cindex links
9208 @code{nnmh} and @code{nnml} makes crossposts by creating hard links to
9209 the crossposted articles.  However, not all file systems support hard
9210 links.  If that's the case for you, set
9211 @code{nnmail-crosspost-link-function} to @code{copy-file}.  (This
9212 variable is @code{add-name-to-file} by default.)  
9213
9214 @kindex M-x nnmail-split-history
9215 @kindex nnmail-split-history
9216 If you wish to see where the previous mail split put the messages, you
9217 can use the @kbd{M-x nnmail-split-history} command.
9218
9219 Gnus gives you all the opportunity you could possibly want for shooting
9220 yourself in the foot.  Let's say you create a group that will contain
9221 all the mail you get from your boss.  And then you accidentally
9222 unsubscribe from the group.  Gnus will still put all the mail from your
9223 boss in the unsubscribed group, and so, when your boss mails you ``Have
9224 that report ready by Monday or you're fired!'', you'll never see it and,
9225 come Tuesday, you'll still believe that you're gainfully employed while
9226 you really should be out collecting empty bottles to save up for next
9227 month's rent money.
9228
9229
9230 @node Mail Backend Variables
9231 @subsection Mail Backend Variables
9232
9233 These variables are (for the most part) pertinent to all the various
9234 mail backends.
9235
9236 @table @code
9237 @vindex nnmail-read-incoming-hook
9238 @item nnmail-read-incoming-hook
9239 The mail backends all call this hook after reading new mail.  You can
9240 use this hook to notify any mail watch programs, if you want to.
9241
9242 @vindex nnmail-spool-file
9243 @item nnmail-spool-file
9244 @cindex POP mail
9245 @cindex MAILHOST
9246 @cindex movemail
9247 @vindex nnmail-pop-password
9248 @vindex nnmail-pop-password-required
9249 The backends will look for new mail in this file.  If this variable is
9250 @code{nil}, the mail backends will never attempt to fetch mail by
9251 themselves.  If you are using a POP mail server and your name is
9252 @samp{larsi}, you should set this variable to @samp{po:larsi}.  If
9253 your name is not @samp{larsi}, you should probably modify that
9254 slightly, but you may have guessed that already, you smart & handsome
9255 devil!  You can also set this variable to @code{pop}, and Gnus will try
9256 to figure out the POP mail string by itself.  In any case, Gnus will
9257 call @code{movemail} which will contact the POP server named in the
9258 @code{MAILHOST} environment variable.  If the POP server needs a
9259 password, you can either set @code{nnmail-pop-password-required} to
9260 @code{t} and be prompted for the password, or set
9261 @code{nnmail-pop-password} to the password itself.
9262
9263 @code{nnmail-spool-file} can also be a list of mailboxes.
9264
9265 Your Emacs has to have been configured with @samp{--with-pop} before
9266 compilation.  This is the default, but some installations have it
9267 switched off.
9268
9269 When you use a mail backend, Gnus will slurp all your mail from your
9270 inbox and plonk it down in your home directory.  Gnus doesn't move any
9271 mail if you're not using a mail backend---you have to do a lot of magic
9272 invocations first.  At the time when you have finished drawing the
9273 pentagram, lightened the candles, and sacrificed the goat, you really
9274 shouldn't be too surprised when Gnus moves your mail.
9275
9276 @vindex nnmail-use-procmail
9277 @vindex nnmail-procmail-suffix
9278 @item nnmail-use-procmail
9279 If non-@code{nil}, the mail backends will look in
9280 @code{nnmail-procmail-directory} for incoming mail.  All the files in
9281 that directory that have names ending in @code{nnmail-procmail-suffix}
9282 will be considered incoming mailboxes, and will be searched for new
9283 mail.
9284
9285 @vindex nnmail-crash-box
9286 @item nnmail-crash-box
9287 When a mail backend reads a spool file, mail is first moved to this
9288 file, which is @file{~/.gnus-crash-box} by default.  If this file
9289 already exists, it will always be read (and incorporated) before any
9290 other spool files.
9291
9292 @vindex nnmail-prepare-incoming-hook
9293 @item nnmail-prepare-incoming-hook
9294 This is run in a buffer that holds all the new incoming mail, and can be
9295 used for, well, anything, really.
9296
9297 @vindex nnmail-split-hook
9298 @item nnmail-split-hook
9299 @findex article-decode-rfc1522
9300 @findex RFC1522 decoding
9301 Hook run in the buffer where the mail headers of each message is kept
9302 just before the splitting based on these headers is done.  The hook is
9303 free to modify the buffer contents in any way it sees fit---the buffer
9304 is discarded after the splitting has been done, and no changes performed
9305 in the buffer will show up in any files.  @code{gnus-article-decode-rfc1522}
9306 is one likely function to add to this hook.
9307
9308 @vindex nnmail-pre-get-new-mail-hook
9309 @vindex nnmail-post-get-new-mail-hook
9310 @item nnmail-pre-get-new-mail-hook
9311 @itemx nnmail-post-get-new-mail-hook
9312 These are two useful hooks executed when treating new incoming
9313 mail---@code{nnmail-pre-get-new-mail-hook} (is called just before
9314 starting to handle the new mail) and
9315 @code{nnmail-post-get-new-mail-hook} (is called when the mail handling
9316 is done).  Here's and example of using these two hooks to change the
9317 default file modes the new mail files get:
9318
9319 @lisp
9320 (add-hook 'gnus-pre-get-new-mail-hook 
9321           (lambda () (set-default-file-modes 511)))
9322
9323 (add-hook 'gnus-post-get-new-mail-hook 
9324           (lambda () (set-default-file-modes 551)))
9325 @end lisp
9326
9327 @item nnmail-tmp-directory
9328 @vindex nnmail-tmp-directory
9329 This variable says where to move incoming mail to -- while processing
9330 it.  This is usually done in the same directory that the mail backend
9331 inhabits (e.g., @file{~/Mail/}), but if this variable is non-@code{nil},
9332 it will be used instead.
9333
9334 @item nnmail-movemail-program
9335 @vindex nnmail-movemail-program
9336 This program is executed to move mail from the user's inbox to her home
9337 directory.  The default is @samp{movemail}.
9338
9339 This can also be a function.  In that case, the function will be called
9340 with two parameters -- the name of the inbox, and the file to be moved
9341 to.
9342
9343 @item nnmail-delete-incoming
9344 @vindex nnmail-delete-incoming
9345 @cindex incoming mail files
9346 @cindex deleting incoming files
9347 If non-@code{nil}, the mail backends will delete the temporary incoming
9348 file after splitting mail into the proper groups.  This is @code{t} by
9349 default.
9350
9351 @c This is @code{nil} by
9352 @c default for reasons of security.
9353
9354 @c Since Red Gnus is an alpha release, it is to be expected to lose mail.
9355 (No Gnus release since (ding) Gnus 0.10 (or something like that) have
9356 lost mail, I think, but that's not the point.  (Except certain versions
9357 of Red Gnus.))  By not deleting the Incoming* files, one can be sure not
9358 to lose mail -- if Gnus totally whacks out, one can always recover what
9359 was lost.
9360
9361 You may delete the @file{Incoming*} files at will.
9362
9363 @item nnmail-use-long-file-names
9364 @vindex nnmail-use-long-file-names
9365 If non-@code{nil}, the mail backends will use long file and directory
9366 names.  Groups like @samp{mail.misc} will end up in directories
9367 (assuming use of @code{nnml} backend) or files (assuming use of
9368 @code{nnfolder} backend) like @file{mail.misc}.  If it is @code{nil},
9369 the same group will end up in @file{mail/misc}.
9370
9371 @item nnmail-delete-file-function
9372 @vindex nnmail-delete-file-function
9373 @findex delete-file
9374 Function called to delete files.  It is @code{delete-file} by default. 
9375
9376 @item nnmail-cache-accepted-message-ids
9377 @vindex nnmail-cache-accepted-message-ids
9378 If non-@code{nil}, put the @code{Message-ID}s of articles imported into
9379 the backend (via @code{Gcc}, for instance) into the mail duplication
9380 discovery cache.  The default is @code{nil}.
9381
9382 @end table
9383
9384
9385 @node Fancy Mail Splitting
9386 @subsection Fancy Mail Splitting
9387 @cindex mail splitting
9388 @cindex fancy mail splitting
9389
9390 @vindex nnmail-split-fancy
9391 @findex nnmail-split-fancy
9392 If the rather simple, standard method for specifying how to split mail
9393 doesn't allow you to do what you want, you can set
9394 @code{nnmail-split-methods} to @code{nnmail-split-fancy}.  Then you can
9395 play with the @code{nnmail-split-fancy} variable.
9396
9397 Let's look at an example value of this variable first:
9398
9399 @lisp
9400 ;; Messages from the mailer daemon are not crossposted to any of
9401 ;; the ordinary groups.  Warnings are put in a separate group
9402 ;; from real errors.
9403 (| ("from" mail (| ("subject" "warn.*" "mail.warning")
9404                    "mail.misc"))
9405    ;; Non-error messages are crossposted to all relevant
9406    ;; groups, but we don't crosspost between the group for the
9407    ;; (ding) list and the group for other (ding) related mail.
9408    (& (| (any "ding@@ifi\\.uio\\.no" "ding.list")
9409          ("subject" "ding" "ding.misc"))
9410       ;; Other mailing lists...
9411       (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list")
9412       (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list")
9413       ;; People...
9414       (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen"))
9415    ;; Unmatched mail goes to the catch all group.
9416    "misc.misc")
9417 @end lisp
9418
9419 This variable has the format of a @dfn{split}.  A split is a (possibly)
9420 recursive structure where each split may contain other splits.  Here are
9421 the five possible split syntaxes:
9422
9423 @enumerate
9424
9425 @item 
9426 @samp{group}: If the split is a string, that will be taken as a group name. 
9427
9428 @item
9429 @var{(FIELD VALUE SPLIT)}: If the split is a list, the first element of
9430 which is a string, then store the message as specified by SPLIT, if
9431 header FIELD (a regexp) contains VALUE (also a regexp).
9432
9433 @item
9434 @var{(| SPLIT...)}: If the split is a list, and the first element is
9435 @code{|} (vertical bar), then process each SPLIT until one of them
9436 matches.  A SPLIT is said to match if it will cause the mail message to
9437 be stored in one or more groups.
9438
9439 @item
9440 @var{(& SPLIT...)}: If the split is a list, and the first element is
9441 @code{&}, then process all SPLITs in the list.
9442
9443 @item 
9444 @code{junk}: If the split is the symbol @code{junk}, then don't save
9445 this message anywhere.
9446
9447 @item
9448 @var{(: function arg1 arg2 ...)}:  If the split is a list, and the first
9449 element is @code{:}, then the second element will be called as a
9450 function with @var{args} given as arguments.  The function should return
9451 a SPLIT.
9452
9453 @end enumerate
9454
9455 In these splits, @var{FIELD} must match a complete field name.
9456 @var{VALUE} must match a complete word according to the fundamental mode
9457 syntax table.  You can use @code{.*} in the regexps to match partial
9458 field names or words.  In other words, all @var{VALUE}'s are wrapped in
9459 @samp{\<} and @samp{\>} pairs.
9460
9461 @vindex nnmail-split-abbrev-alist
9462 @var{FIELD} and @var{VALUE} can also be lisp symbols, in that case they
9463 are expanded as specified by the variable
9464 @code{nnmail-split-abbrev-alist}.  This is an alist of cons cells, where
9465 the @code{car} of a cell contains the key, and the @code{cdr} contains the associated
9466 value.
9467
9468 @vindex nnmail-split-fancy-syntax-table
9469 @code{nnmail-split-fancy-syntax-table} is the syntax table in effect
9470 when all this splitting is performed.
9471
9472 If you want to have Gnus create groups dynamically based on some
9473 information in the headers (i.e., do @code{replace-match}-like
9474 substitions in the group names), you can say things like:
9475
9476 @example
9477 (any "debian-\(\\w*\\)@@lists.debian.org" "mail.debian.\\1")
9478 @end example
9479
9480 @node Mail and Procmail
9481 @subsection Mail and Procmail
9482 @cindex procmail
9483
9484 @cindex slocal
9485 @cindex elm
9486 Many people use @code{procmail} (or some other mail filter program or
9487 external delivery agent---@code{slocal}, @code{elm}, etc) to split
9488 incoming mail into groups.  If you do that, you should set
9489 @code{nnmail-spool-file} to @code{procmail} to ensure that the mail
9490 backends never ever try to fetch mail by themselves.
9491
9492 This also means that you probably don't want to set
9493 @code{nnmail-split-methods} either, which has some, perhaps, unexpected
9494 side effects.
9495
9496 When a mail backend is queried for what groups it carries, it replies
9497 with the contents of that variable, along with any groups it has figured
9498 out that it carries by other means.  None of the backends, except
9499 @code{nnmh}, actually go out to the disk and check what groups actually
9500 exist.  (It's not trivial to distinguish between what the user thinks is
9501 a basis for a newsgroup and what is just a plain old file or directory.)
9502
9503 This means that you have to tell Gnus (and the backends) by hand what
9504 groups exist.
9505
9506 Let's take the @code{nnmh} backend as an example:
9507
9508 The folders are located in @code{nnmh-directory}, say, @file{~/Mail/}.
9509 There are three folders, @file{foo}, @file{bar} and @file{mail.baz}.
9510
9511 Go to the group buffer and type @kbd{G m}.  When prompted, answer
9512 @samp{foo} for the name and @samp{nnmh} for the method.  Repeat
9513 twice for the two other groups, @samp{bar} and @samp{mail.baz}.  Be sure
9514 to include all your mail groups.
9515
9516 That's it.  You are now set to read your mail.  An active file for this
9517 method will be created automatically.
9518
9519 @vindex nnmail-procmail-suffix
9520 @vindex nnmail-procmail-directory
9521 If you use @code{nnfolder} or any other backend that store more than a
9522 single article in each file, you should never have procmail add mails to
9523 the file that Gnus sees.  Instead, procmail should put all incoming mail
9524 in @code{nnmail-procmail-directory}.  To arrive at the file name to put
9525 the incoming mail in, append @code{nnmail-procmail-suffix} to the group
9526 name.  The mail backends will read the mail from these files.
9527
9528 @vindex nnmail-resplit-incoming
9529 When Gnus reads a file called @file{mail.misc.spool}, this mail will be
9530 put in the @code{mail.misc}, as one would expect.  However, if you want
9531 Gnus to split the mail the normal way, you could set
9532 @code{nnmail-resplit-incoming} to @code{t}.
9533
9534 @vindex nnmail-keep-last-article
9535 If you use @code{procmail} to split things directly into an @code{nnmh}
9536 directory (which you shouldn't do), you should set
9537 @code{nnmail-keep-last-article} to non-@code{nil} to prevent Gnus from
9538 ever expiring the final article (i.e., the article with the highest
9539 article number) in a mail newsgroup.  This is quite, quite important.
9540
9541 Here's an example setup:  The incoming spools are located in
9542 @file{~/incoming/} and have @samp{""} as suffixes (i.e., the incoming
9543 spool files have the same names as the equivalent groups).  The
9544 @code{nnfolder} backend is to be used as the mail interface, and the
9545 @code{nnfolder} directory is @file{~/fMail/}.
9546
9547 @lisp
9548 (setq nnfolder-directory "~/fMail/")
9549 (setq nnmail-spool-file 'procmail)
9550 (setq nnmail-procmail-directory "~/incoming/")
9551 (setq gnus-secondary-select-methods '((nnfolder "")))
9552 (setq nnmail-procmail-suffix "")
9553 @end lisp
9554
9555
9556 @node Incorporating Old Mail
9557 @subsection Incorporating Old Mail
9558
9559 Most people have lots of old mail stored in various file formats.  If
9560 you have set up Gnus to read mail using one of the spiffy Gnus mail
9561 backends, you'll probably wish to have that old mail incorporated into
9562 your mail groups.
9563
9564 Doing so can be quite easy.
9565
9566 To take an example: You're reading mail using @code{nnml}
9567 (@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a
9568 satisfactory value (@pxref{Splitting Mail}).  You have an old Unix mbox
9569 file filled with important, but old, mail.  You want to move it into
9570 your @code{nnml} groups.
9571
9572 Here's how:
9573
9574 @enumerate
9575 @item
9576 Go to the group buffer.
9577
9578 @item 
9579 Type `G f' and give the path to the mbox file when prompted to create an
9580 @code{nndoc} group from the mbox file (@pxref{Foreign Groups}).
9581
9582 @item 
9583 Type `SPACE' to enter the newly created group.
9584
9585 @item
9586 Type `M P b' to process-mark all articles in this group's buffer
9587 (@pxref{Setting Process Marks}).
9588
9589 @item 
9590 Type `B r' to respool all the process-marked articles, and answer
9591 @samp{nnml} when prompted (@pxref{Mail Group Commands}).
9592 @end enumerate
9593
9594 All the mail messages in the mbox file will now also be spread out over
9595 all your @code{nnml} groups.  Try entering them and check whether things
9596 have gone without a glitch.  If things look ok, you may consider
9597 deleting the mbox file, but I wouldn't do that unless I was absolutely
9598 sure that all the mail has ended up where it should be.
9599
9600 Respooling is also a handy thing to do if you're switching from one mail
9601 backend to another.  Just respool all the mail in the old mail groups
9602 using the new mail backend.
9603
9604
9605 @node Expiring Mail
9606 @subsection Expiring Mail
9607 @cindex article expiry
9608
9609 Traditional mail readers have a tendency to remove mail articles when
9610 you mark them as read, in some way.  Gnus takes a fundamentally
9611 different approach to mail reading.
9612
9613 Gnus basically considers mail just to be news that has been received in
9614 a rather peculiar manner.  It does not think that it has the power to
9615 actually change the mail, or delete any mail messages.  If you enter a
9616 mail group, and mark articles as ``read'', or kill them in some other
9617 fashion, the mail articles will still exist on the system.  I repeat:
9618 Gnus will not delete your old, read mail.  Unless you ask it to, of
9619 course.
9620
9621 To make Gnus get rid of your unwanted mail, you have to mark the
9622 articles as @dfn{expirable}.  This does not mean that the articles will
9623 disappear right away, however.  In general, a mail article will be
9624 deleted from your system if, 1) it is marked as expirable, AND 2) it is
9625 more than one week old.  If you do not mark an article as expirable, it
9626 will remain on your system until hell freezes over.  This bears
9627 repeating one more time, with some spurious capitalizations: IF you do
9628 NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES.
9629
9630 @vindex gnus-auto-expirable-newsgroups
9631 You do not have to mark articles as expirable by hand.  Groups that
9632 match the regular expression @code{gnus-auto-expirable-newsgroups} will
9633 have all articles that you read marked as expirable automatically.  All
9634 articles marked as expirable have an @samp{E} in the first
9635 column in the summary buffer.
9636
9637 By default, if you have auto expiry switched on, Gnus will mark all the
9638 articles you read as expirable, no matter if they were read or unread
9639 before.  To avoid having articles marked as read marked as expirable
9640 automatically, you can put something like the following in your
9641 @file{.gnus} file:
9642
9643 @vindex gnus-mark-article-hook
9644 @lisp
9645 (remove-hook 'gnus-mark-article-hook                                
9646              'gnus-summary-mark-read-and-unread-as-read)            
9647 (add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read)
9648 @end lisp
9649
9650 Note that making a group auto-expirable doesn't mean that all read
9651 articles are expired---only the articles marked as expirable
9652 will be expired.  Also note that using the @kbd{d} command won't make
9653 groups expirable---only semi-automatic marking of articles as read will
9654 mark the articles as expirable in auto-expirable groups.
9655
9656 Let's say you subscribe to a couple of mailing lists, and you want the
9657 articles you have read to disappear after a while:
9658
9659 @lisp
9660 (setq gnus-auto-expirable-newsgroups 
9661       "mail.nonsense-list\\|mail.nice-list")
9662 @end lisp
9663
9664 Another way to have auto-expiry happen is to have the element
9665 @code{auto-expire} in the group parameters of the group. 
9666
9667 If you use adaptive scoring (@pxref{Adaptive Scoring}) and
9668 auto-expiring, you'll have problems.  Auto-expiring and adaptive scoring
9669 don't really mix very well.  
9670
9671 @vindex nnmail-expiry-wait
9672 The @code{nnmail-expiry-wait} variable supplies the default time an
9673 expirable article has to live.  Gnus starts counting days from when the
9674 message @emph{arrived}, not from when it was sent.  The default is seven
9675 days.
9676
9677 Gnus also supplies a function that lets you fine-tune how long articles
9678 are to live, based on what group they are in.  Let's say you want to
9679 have one month expiry period in the @samp{mail.private} group, a one day
9680 expiry period in the @samp{mail.junk} group, and a six day expiry period
9681 everywhere else:
9682
9683 @vindex nnmail-expiry-wait-function
9684 @lisp
9685 (setq nnmail-expiry-wait-function
9686       (lambda (group)
9687        (cond ((string= group "mail.private")
9688                31)
9689              ((string= group "mail.junk")
9690                1)
9691              ((string= group "important")
9692                'never)
9693              (t
9694                6))))
9695 @end lisp
9696
9697 The group names this function is fed are ``unadorned'' group
9698 names---no @samp{nnml:} prefixes and the like.
9699
9700 The @code{nnmail-expiry-wait} variable and
9701 @code{nnmail-expiry-wait-function} function can either be a number (not
9702 necessarily an integer) or one of the symbols @code{immediate} or
9703 @code{never}.
9704
9705 You can also use the @code{expiry-wait} group parameter to selectively
9706 change the expiry period (@pxref{Group Parameters}).
9707
9708 @vindex nnmail-keep-last-article
9709 If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never
9710 expire the final article in a mail newsgroup.  This is to make life
9711 easier for procmail users.
9712
9713 @vindex gnus-total-expirable-newsgroups
9714 By the way: That line up there, about Gnus never expiring non-expirable
9715 articles, is a lie.  If you put @code{total-expire} in the group
9716 parameters, articles will not be marked as expirable, but all read
9717 articles will be put through the expiry process.  Use with extreme
9718 caution.  Even more dangerous is the
9719 @code{gnus-total-expirable-newsgroups} variable.  All groups that match
9720 this regexp will have all read articles put through the expiry process,
9721 which means that @emph{all} old mail articles in the groups in question
9722 will be deleted after a while.  Use with extreme caution, and don't come
9723 crying to me when you discover that the regexp you used matched the
9724 wrong group and all your important mail has disappeared.  Be a
9725 @emph{man}!  Or a @emph{woman}!  Whatever you feel more comfortable
9726 with!  So there!
9727
9728 Most people make most of their mail groups total-expirable, though. 
9729
9730
9731 @node Washing Mail
9732 @subsection Washing Mail
9733 @cindex mail washing
9734 @cindex list server brain damage
9735 @cindex incoming mail treatment
9736
9737 Mailers and list servers are notorious for doing all sorts of really,
9738 really stupid things with mail.  ``Hey, RFC822 doesn't explicitly
9739 prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the
9740 end of all lines passing through our server, so let's do that!!!!1!''
9741 Yes, but RFC822 wasn't designed to be read by morons.  Things that were
9742 considered to be self-evident were not discussed.  So.  Here we are.
9743
9744 Case in point:  The German version of Microsoft Exchange adds @samp{AW:
9745 } to the subjects of replies instead of @samp{Re: }.  I could pretend to
9746 be shocked and dismayed by this, but I haven't got the energy.  It is to
9747 laugh.
9748
9749 Gnus provides a plethora of functions for washing articles while
9750 displaying them, but it might be nicer to do the filtering before
9751 storing the mail to disc.  For that purpose, we have three hooks and
9752 various functions that can be put in these hooks.
9753
9754 @table @code
9755 @item nnmail-prepare-incoming-hook
9756 @vindex nnmail-prepare-incoming-hook
9757 This hook is called before doing anything with the mail and is meant for
9758 grand, sweeping gestures.  Functions to be used include:
9759
9760 @table @code
9761 @item nnheader-ms-strip-cr
9762 @findex nnheader-ms-strip-cr
9763 Remove trailing carriage returns from each line.  This is default on
9764 Emacs running on MS machines.
9765
9766 @end table
9767
9768 @item nnmail-prepare-incoming-header-hook
9769 @vindex nnmail-prepare-incoming-header-hook
9770 This hook is called narrowed to each header.  It can be used when
9771 cleaning up the headers.  Functions that can be used include:
9772
9773 @table @code
9774 @item nnmail-remove-leading-whitespace
9775 @findex nnmail-remove-leading-whitespace
9776 Clear leading white space that ``helpful'' listservs have added to the
9777 headers to make them look nice.  Aaah.  
9778
9779 @item nnmail-remove-list-identifiers
9780 @findex nnmail-remove-list-identifiers
9781 Some list servers add an identifier---for example, @samp{(idm)}---to the
9782 beginning of all @code{Subject} headers.  I'm sure that's nice for
9783 people who use stone age mail readers.  This function will remove
9784 strings that match the @code{nnmail-list-identifiers} regexp, which can
9785 also be a list of regexp.
9786
9787 For instance, if you want to remove the @samp{(idm)} and the
9788 @samp{nagnagnag} identifiers:
9789
9790 @lisp
9791 (setq nnmail-list-identifiers
9792       '("(idm)" "nagnagnag"))
9793 @end lisp
9794
9795 @item nnmail-remove-tabs
9796 @findex nnmail-remove-tabs
9797 Translate all @samp{TAB} characters into @samp{SPACE} characters. 
9798
9799 @end table
9800
9801 @item nnmail-prepare-incoming-message-hook
9802 @vindex nnmail-prepare-incoming-message-hook
9803 This hook is called narrowed to each message.  Functions to be used
9804 include: 
9805
9806 @table @code
9807 @item article-de-quoted-unreadable
9808 @findex article-de-quoted-unreadable
9809 Decode Quoted Readable encoding.
9810
9811 @end table
9812 @end table
9813
9814
9815 @node Duplicates
9816 @subsection Duplicates
9817
9818 @vindex nnmail-treat-duplicates
9819 @vindex nnmail-message-id-cache-length
9820 @vindex nnmail-message-id-cache-file
9821 @cindex duplicate mails
9822 If you are a member of a couple of mailing lists, you will sometimes
9823 receive two copies of the same mail.  This can be quite annoying, so
9824 @code{nnmail} checks for and treats any duplicates it might find.  To do
9825 this, it keeps a cache of old @code{Message-ID}s---
9826 @code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by
9827 default.  The approximate maximum number of @code{Message-ID}s stored
9828 there is controlled by the @code{nnmail-message-id-cache-length}
9829 variable, which is 1000 by default. (So 1000 @code{Message-ID}s will be
9830 stored.) If all this sounds scary to you, you can set
9831 @code{nnmail-treat-duplicates} to @code{warn} (which is what it is by
9832 default), and @code{nnmail} won't delete duplicate mails.  Instead it
9833 will insert a warning into the head of the mail saying that it thinks
9834 that this is a duplicate of a different message.
9835
9836 This variable can also be a function.  If that's the case, the function
9837 will be called from a buffer narrowed to the message in question with
9838 the @code{Message-ID} as a parameter.  The function must return either
9839 @code{nil}, @code{warn}, or @code{delete}.
9840
9841 You can turn this feature off completely by setting the variable to
9842 @code{nil}.
9843
9844 If you want all the duplicate mails to be put into a special
9845 @dfn{duplicates} group, you could do that using the normal mail split
9846 methods:
9847
9848 @lisp
9849 (setq nnmail-split-fancy
9850       '(| ;; Messages duplicates go to a separate group.
9851           ("gnus-warning" "duplication of message" "duplicate")
9852           ;; Message from daemons, postmaster, and the like to another.
9853           (any mail "mail.misc")
9854           ;; Other rules.
9855           [ ... ] ))
9856 @end lisp
9857
9858 Or something like:
9859 @lisp
9860 (setq nnmail-split-methods 
9861       '(("duplicates" "^Gnus-Warning:")
9862         ;; Other rules.
9863         [...]))
9864 @end lisp
9865
9866 Here's a neat feature: If you know that the recipient reads her mail
9867 with Gnus, and that she has @code{nnmail-treat-duplicates} set to
9868 @code{delete}, you can send her as many insults as you like, just by
9869 using a @code{Message-ID} of a mail that you know that she's already
9870 received.  Think of all the fun!  She'll never see any of it!  Whee!
9871
9872
9873 @node Not Reading Mail
9874 @subsection Not Reading Mail
9875
9876 If you start using any of the mail backends, they have the annoying
9877 habit of assuming that you want to read mail with them.  This might not
9878 be unreasonable, but it might not be what you want.
9879
9880 If you set @code{nnmail-spool-file} to @code{nil}, none of the backends
9881 will ever attempt to read incoming mail, which should help.
9882
9883 @vindex nnbabyl-get-new-mail
9884 @vindex nnmbox-get-new-mail
9885 @vindex nnml-get-new-mail
9886 @vindex nnmh-get-new-mail
9887 @vindex nnfolder-get-new-mail
9888 This might be too much, if, for instance, you are reading mail quite
9889 happily with @code{nnml} and just want to peek at some old @sc{rmail}
9890 file you have stashed away with @code{nnbabyl}.  All backends have
9891 variables called backend-@code{get-new-mail}.  If you want to disable
9892 the @code{nnbabyl} mail reading, you edit the virtual server for the
9893 group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}.
9894
9895 All the mail backends will call @code{nn}*@code{-prepare-save-mail-hook}
9896 narrowed to the article to be saved before saving it when reading
9897 incoming mail.
9898
9899
9900 @node Choosing a Mail Backend
9901 @subsection Choosing a Mail Backend
9902
9903 Gnus will read the mail spool when you activate a mail group.  The mail
9904 file is first copied to your home directory.  What happens after that
9905 depends on what format you want to store your mail in.
9906
9907 @menu
9908 * Unix Mail Box::               Using the (quite) standard Un*x mbox.
9909 * Rmail Babyl::                 Emacs programs use the rmail babyl format.
9910 * Mail Spool::                  Store your mail in a private spool?
9911 * MH Spool::                    An mhspool-like backend.
9912 * Mail Folders::                Having one file for each group.
9913 @end menu
9914
9915
9916 @node Unix Mail Box
9917 @subsubsection Unix Mail Box
9918 @cindex nnmbox
9919 @cindex unix mail box
9920
9921 @vindex nnmbox-active-file
9922 @vindex nnmbox-mbox-file
9923 The @dfn{nnmbox} backend will use the standard Un*x mbox file to store
9924 mail.  @code{nnmbox} will add extra headers to each mail article to say
9925 which group it belongs in.
9926
9927 Virtual server settings:
9928
9929 @table @code
9930 @item nnmbox-mbox-file
9931 @vindex nnmbox-mbox-file
9932 The name of the mail box in the user's home directory. 
9933
9934 @item nnmbox-active-file
9935 @vindex nnmbox-active-file
9936 The name of the active file for the mail box.
9937
9938 @item nnmbox-get-new-mail
9939 @vindex nnmbox-get-new-mail
9940 If non-@code{nil}, @code{nnmbox} will read incoming mail and split it
9941 into groups.
9942 @end table
9943
9944
9945 @node Rmail Babyl
9946 @subsubsection Rmail Babyl
9947 @cindex nnbabyl
9948 @cindex rmail mbox
9949
9950 @vindex nnbabyl-active-file
9951 @vindex nnbabyl-mbox-file
9952 The @dfn{nnbabyl} backend will use a babyl mail box (aka. @dfn{rmail
9953 mbox}) to store mail. @code{nnbabyl} will add extra headers to each mail
9954 article to say which group it belongs in.
9955
9956 Virtual server settings:
9957
9958 @table @code
9959 @item nnbabyl-mbox-file
9960 @vindex nnbabyl-mbox-file
9961 The name of the rmail mbox file.
9962
9963 @item nnbabyl-active-file
9964 @vindex nnbabyl-active-file
9965 The name of the active file for the rmail box.
9966
9967 @item nnbabyl-get-new-mail
9968 @vindex nnbabyl-get-new-mail
9969 If non-@code{nil}, @code{nnbabyl} will read incoming mail. 
9970 @end table
9971
9972
9973 @node Mail Spool
9974 @subsubsection Mail Spool
9975 @cindex nnml
9976 @cindex mail @sc{nov} spool
9977
9978 The @dfn{nnml} spool mail format isn't compatible with any other known
9979 format.  It should be used with some caution.
9980
9981 @vindex nnml-directory
9982 If you use this backend, Gnus will split all incoming mail into files,
9983 one file for each mail, and put the articles into the corresponding
9984 directories under the directory specified by the @code{nnml-directory}
9985 variable.  The default value is @file{~/Mail/}.
9986
9987 You do not have to create any directories beforehand; Gnus will take
9988 care of all that.
9989
9990 If you have a strict limit as to how many files you are allowed to store
9991 in your account, you should not use this backend.  As each mail gets its
9992 own file, you might very well occupy thousands of inodes within a few
9993 weeks.  If this is no problem for you, and it isn't a problem for you
9994 having your friendly systems administrator walking around, madly,
9995 shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should
9996 know that this is probably the fastest format to use.  You do not have
9997 to trudge through a big mbox file just to read your new mail.
9998
9999 @code{nnml} is probably the slowest backend when it comes to article
10000 splitting.  It has to create lots of files, and it also generates
10001 @sc{nov} databases for the incoming mails.  This makes it the fastest
10002 backend when it comes to reading mail.
10003
10004 Virtual server settings:
10005
10006 @table @code
10007 @item nnml-directory
10008 @vindex nnml-directory
10009 All @code{nnml} directories will be placed under this directory. 
10010
10011 @item nnml-active-file
10012 @vindex nnml-active-file
10013 The active file for the @code{nnml} server.
10014
10015 @item nnml-newsgroups-file
10016 @vindex nnml-newsgroups-file
10017 The @code{nnml} group descriptions file.  @xref{Newsgroups File
10018 Format}. 
10019
10020 @item nnml-get-new-mail
10021 @vindex nnml-get-new-mail
10022 If non-@code{nil}, @code{nnml} will read incoming mail.
10023
10024 @item nnml-nov-is-evil
10025 @vindex nnml-nov-is-evil
10026 If non-@code{nil}, this backend will ignore any @sc{nov} files.  
10027
10028 @item nnml-nov-file-name
10029 @vindex nnml-nov-file-name
10030 The name of the @sc{nov} files.  The default is @file{.overview}. 
10031
10032 @item nnml-prepare-save-mail-hook
10033 @vindex nnml-prepare-save-mail-hook
10034 Hook run narrowed to an article before saving.
10035
10036 @end table
10037
10038 @findex nnml-generate-nov-databases
10039 If your @code{nnml} groups and @sc{nov} files get totally out of whack,
10040 you can do a complete update by typing @kbd{M-x
10041 nnml-generate-nov-databases}.  This command will trawl through the
10042 entire @code{nnml} hierarchy, looking at each and every article, so it
10043 might take a while to complete.  A better interface to this
10044 functionality can be found in the server buffer (@pxref{Server
10045 Commands}). 
10046
10047
10048 @node MH Spool
10049 @subsubsection MH Spool
10050 @cindex nnmh
10051 @cindex mh-e mail spool
10052
10053 @code{nnmh} is just like @code{nnml}, except that is doesn't generate
10054 @sc{nov} databases and it doesn't keep an active file.  This makes
10055 @code{nnmh} a @emph{much} slower backend than @code{nnml}, but it also
10056 makes it easier to write procmail scripts for.
10057
10058 Virtual server settings:
10059
10060 @table @code
10061 @item nnmh-directory
10062 @vindex nnmh-directory
10063 All @code{nnmh} directories will be located under this directory.
10064
10065 @item nnmh-get-new-mail
10066 @vindex nnmh-get-new-mail
10067 If non-@code{nil}, @code{nnmh} will read incoming mail.
10068
10069 @item nnmh-be-safe
10070 @vindex nnmh-be-safe
10071 If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make
10072 sure that the articles in the folder are actually what Gnus thinks they
10073 are.  It will check date stamps and stat everything in sight, so
10074 setting this to @code{t} will mean a serious slow-down.  If you never
10075 use anything but Gnus to read the @code{nnmh} articles, you do not have
10076 to set this variable to @code{t}.
10077 @end table
10078
10079
10080 @node Mail Folders
10081 @subsubsection Mail Folders
10082 @cindex nnfolder
10083 @cindex mbox folders
10084 @cindex mail folders
10085
10086 @code{nnfolder} is a backend for storing each mail group in a separate
10087 file.  Each file is in the standard Un*x mbox format.  @code{nnfolder}
10088 will add extra headers to keep track of article numbers and arrival
10089 dates.
10090
10091 Virtual server settings:
10092
10093 @table @code
10094 @item nnfolder-directory
10095 @vindex nnfolder-directory
10096 All the @code{nnfolder} mail boxes will be stored under this directory. 
10097
10098 @item nnfolder-active-file
10099 @vindex nnfolder-active-file
10100 The name of the active file.
10101
10102 @item nnfolder-newsgroups-file
10103 @vindex nnfolder-newsgroups-file
10104 The name of the group descriptions file.  @xref{Newsgroups File Format}.
10105
10106 @item nnfolder-get-new-mail
10107 @vindex nnfolder-get-new-mail
10108 If non-@code{nil}, @code{nnfolder} will read incoming mail.
10109 @end table
10110
10111 @findex nnfolder-generate-active-file
10112 @kindex M-x nnfolder-generate-active-file
10113 If you have lots of @code{nnfolder}-like files you'd like to read with
10114 @code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file}
10115 command to make @code{nnfolder} aware of all likely files in
10116 @code{nnfolder-directory}.
10117
10118
10119 @node Other Sources
10120 @section Other Sources
10121
10122 Gnus can do more than just read news or mail.  The methods described
10123 below allow Gnus to view directories and files as if they were
10124 newsgroups.
10125
10126 @menu
10127 * Directory Groups::      You can read a directory as if it was a newsgroup.
10128 * Anything Groups::       Dired?  Who needs dired?
10129 * Document Groups::       Single files can be the basis of a group.
10130 * SOUP::                  Reading @sc{SOUP} packets ``offline''.
10131 * Web Searches::          Creating groups from articles that match a string.
10132 * Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
10133 @end menu
10134
10135
10136 @node Directory Groups
10137 @subsection Directory Groups
10138 @cindex nndir
10139 @cindex directory groups
10140
10141 If you have a directory that has lots of articles in separate files in
10142 it, you might treat it as a newsgroup.  The files have to have numerical
10143 names, of course.
10144
10145 This might be an opportune moment to mention @code{ange-ftp} (and its
10146 successor @code{efs}), that most wonderful of all wonderful Emacs
10147 packages.  When I wrote @code{nndir}, I didn't think much about it---a
10148 backend to read directories.  Big deal.
10149
10150 @code{ange-ftp} changes that picture dramatically.  For instance, if you
10151 enter the @code{ange-ftp} file name
10152 @file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the directory name,
10153 @code{ange-ftp} or @code{efs} will actually allow you to read this
10154 directory over at @samp{sina} as a newsgroup.  Distributed news ahoy!
10155
10156 @code{nndir} will use @sc{nov} files if they are present.
10157
10158 @code{nndir} is a ``read-only'' backend---you can't delete or expire
10159 articles with this method.  You can use @code{nnmh} or @code{nnml} for
10160 whatever you use @code{nndir} for, so you could switch to any of those
10161 methods if you feel the need to have a non-read-only @code{nndir}.
10162
10163
10164 @node Anything Groups
10165 @subsection Anything Groups
10166 @cindex nneething
10167
10168 From the @code{nndir} backend (which reads a single spool-like
10169 directory), it's just a hop and a skip to @code{nneething}, which
10170 pretends that any arbitrary directory is a newsgroup.  Strange, but
10171 true.
10172
10173 When @code{nneething} is presented with a directory, it will scan this
10174 directory and assign article numbers to each file.  When you enter such
10175 a group, @code{nneething} must create ``headers'' that Gnus can use.
10176 After all, Gnus is a newsreader, in case you're
10177 forgetting. @code{nneething} does this in a two-step process.  First, it
10178 snoops each file in question.  If the file looks like an article (i.e.,
10179 the first few lines look like headers), it will use this as the head.
10180 If this is just some arbitrary file without a head (e.g. a C source
10181 file), @code{nneething} will cobble up a header out of thin air.  It
10182 will use file ownership, name and date and do whatever it can with these
10183 elements.
10184
10185 All this should happen automatically for you, and you will be presented
10186 with something that looks very much like a newsgroup.  Totally like a
10187 newsgroup, to be precise.  If you select an article, it will be displayed
10188 in the article buffer, just as usual.
10189
10190 If you select a line that represents a directory, Gnus will pop you into
10191 a new summary buffer for this @code{nneething} group.  And so on.  You can
10192 traverse the entire disk this way, if you feel like, but remember that
10193 Gnus is not dired, really, and does not intend to be, either.
10194
10195 There are two overall modes to this action---ephemeral or solid.  When
10196 doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus
10197 will not store information on what files you have read, and what files
10198 are new, and so on.  If you create a solid @code{nneething} group the
10199 normal way with @kbd{G m}, Gnus will store a mapping table between
10200 article numbers and file names, and you can treat this group like any
10201 other groups.  When you activate a solid @code{nneething} group, you will
10202 be told how many unread articles it contains, etc., etc.
10203
10204 Some variables:
10205
10206 @table @code
10207 @item nneething-map-file-directory
10208 @vindex nneething-map-file-directory
10209 All the mapping files for solid @code{nneething} groups will be stored
10210 in this directory, which defaults to @file{~/.nneething/}.
10211
10212 @item nneething-exclude-files
10213 @vindex nneething-exclude-files
10214 All files that match this regexp will be ignored.  Nice to use to exclude
10215 auto-save files and the like, which is what it does by default.
10216
10217 @item nneething-map-file
10218 @vindex nneething-map-file
10219 Name of the map files.
10220 @end table
10221
10222
10223 @node Document Groups
10224 @subsection Document Groups
10225 @cindex nndoc
10226 @cindex documentation group
10227 @cindex help group
10228
10229 @code{nndoc} is a cute little thing that will let you read a single file
10230 as a newsgroup.  Several files types are supported:
10231
10232 @table @code
10233 @cindex babyl
10234 @cindex rmail mbox
10235
10236 @item babyl
10237 The babyl (rmail) mail box.
10238 @cindex mbox
10239 @cindex Unix mbox
10240
10241 @item mbox
10242 The standard Unix mbox file.
10243
10244 @cindex MMDF mail box
10245 @item mmdf
10246 The MMDF mail box format.
10247
10248 @item news
10249 Several news articles appended into a file.
10250
10251 @item rnews
10252 @cindex rnews batch files
10253 The rnews batch transport format.
10254 @cindex forwarded messages
10255
10256 @item forward
10257 Forwarded articles.
10258
10259 @item mime-digest
10260 @cindex digest
10261 @cindex MIME digest
10262 @cindex 1153 digest
10263 @cindex RFC 1153 digest
10264 @cindex RFC 341 digest
10265 MIME (RFC 1341) digest format.
10266
10267 @item standard-digest
10268 The standard (RFC 1153) digest format.
10269
10270 @item slack-digest
10271 Non-standard digest format---matches most things, but does it badly. 
10272 @end table
10273
10274 You can also use the special ``file type'' @code{guess}, which means
10275 that @code{nndoc} will try to guess what file type it is looking at.
10276 @code{digest} means that @code{nndoc} should guess what digest type the
10277 file is.
10278
10279 @code{nndoc} will not try to change the file or insert any extra headers into
10280 it---it will simply, like, let you use the file as the basis for a
10281 group.  And that's it.
10282
10283 If you have some old archived articles that you want to insert into your
10284 new & spiffy Gnus mail backend, @code{nndoc} can probably help you with
10285 that.  Say you have an old @file{RMAIL} file with mail that you now want
10286 to split into your new @code{nnml} groups.  You look at that file using
10287 @code{nndoc} (using the @kbd{G f} command in the group buffer
10288 (@pxref{Foreign Groups})), set the process mark on all the articles in
10289 the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r})
10290 using @code{nnml}.  If all goes well, all the mail in the @file{RMAIL}
10291 file is now also stored in lots of @code{nnml} directories, and you can
10292 delete that pesky @file{RMAIL} file.  If you have the guts!
10293
10294 Virtual server variables:
10295
10296 @table @code
10297 @item nndoc-article-type
10298 @vindex nndoc-article-type
10299 This should be one of @code{mbox}, @code{babyl}, @code{digest},
10300 @code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
10301 @code{rfc822-forward}, @code{mime-digest}, @code{standard-digest},
10302 @code{slack-digest}, @code{clari-briefs} or @code{guess}.
10303
10304 @item nndoc-post-type
10305 @vindex nndoc-post-type
10306 This variable says whether Gnus is to consider the group a news group or
10307 a mail group.  There are two valid values:  @code{mail} (the default)
10308 and @code{news}.
10309 @end table
10310
10311 @menu
10312 * Document Server Internals::   How to add your own document types.
10313 @end menu
10314
10315
10316 @node Document Server Internals
10317 @subsubsection Document Server Internals
10318
10319 Adding new document types to be recognized by @code{nndoc} isn't
10320 difficult.  You just have to whip up a definition of what the document
10321 looks like, write a predicate function to recognize that document type,
10322 and then hook into @code{nndoc}.
10323
10324 First, here's an example document type definition:
10325
10326 @example
10327 (mmdf 
10328  (article-begin .  "^\^A\^A\^A\^A\n")
10329  (body-end .  "^\^A\^A\^A\^A\n"))
10330 @end example
10331
10332 The definition is simply a unique @dfn{name} followed by a series of
10333 regexp pseudo-variable settings.  Below are the possible
10334 variables---don't be daunted by the number of variables; most document
10335 types can be defined with very few settings:
10336
10337 @table @code
10338 @item first-article
10339 If present, @code{nndoc} will skip past all text until it finds
10340 something that match this regexp.  All text before this will be
10341 totally ignored. 
10342
10343 @item article-begin
10344 This setting has to be present in all document type definitions.  It
10345 says what the beginning of each article looks like.
10346
10347 @item head-begin-function
10348 If present, this should be a function that moves point to the head of
10349 the article.
10350
10351 @item nndoc-head-begin
10352 If present, this should be a regexp that matches the head of the
10353 article. 
10354
10355 @item nndoc-head-end
10356 This should match the end of the head of the article.  It defaults to
10357 @samp{^$}---the empty line.
10358
10359 @item body-begin-function
10360 If present, this function should move point to the beginning of the body
10361 of the article.
10362
10363 @item body-begin
10364 This should match the beginning of the body of the article.  It defaults
10365 to @samp{^\n}.
10366
10367 @item body-end-function
10368 If present, this function should move point to the end of the body of
10369 the article.
10370
10371 @item body-end
10372 If present, this should match the end of the body of the article.
10373
10374 @item file-end
10375 If present, this should match the end of the file.  All text after this
10376 regexp will be totally ignored. 
10377
10378 @end table
10379
10380 So, using these variables @code{nndoc} is able to dissect a document
10381 file into a series of articles, each with a head and a body.  However, a
10382 few more variables are needed since not all document types are all that
10383 news-like---variables needed to transform the head or the body into
10384 something that's palatable for Gnus:
10385
10386 @table @code
10387 @item prepare-body-function
10388 If present, this function will be called when requesting an article.  It
10389 will be called with point at the start of the body, and is useful if the
10390 document has encoded some parts of its contents. 
10391
10392 @item article-transform-function
10393 If present, this function is called when requesting an article.  It's
10394 meant to be used for more wide-ranging transformation of both head and
10395 body of the article.
10396
10397 @item generate-head-function
10398 If present, this function is called to generate a head that Gnus can
10399 understand.  It is called with the article number as a parameter, and is
10400 expected to generate a nice head for the article in question.  It is
10401 called when requesting the headers of all articles.
10402
10403 @end table
10404
10405 Let's look at the most complicated example I can come up with---standard
10406 digests:
10407
10408 @example
10409 (standard-digest
10410  (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+"))
10411  (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+"))
10412  (prepare-body-function . nndoc-unquote-dashes)
10413  (body-end-function . nndoc-digest-body-end)
10414  (head-end . "^ ?$")
10415  (body-begin . "^ ?\n")
10416  (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
10417  (subtype digest guess))
10418 @end example
10419
10420 We see that all text before a 70-width line of dashes is ignored; all
10421 text after a line that starts with that @samp{^End of} is also ignored;
10422 each article begins with a 30-width line of dashes; the line separating
10423 the head from the body may contain a single space; and that the body is
10424 run through @code{nndoc-unquote-dashes} before being delivered.
10425
10426 To hook your own document definition into @code{nndoc}, use the
10427 @code{nndoc-add-type} function.  It takes two parameters---the first is
10428 the definition itself and the second (optional) parameter says where in
10429 the document type definition alist to put this definition.  The alist is
10430 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
10431 is of @code{mmdf} type, and so on.  These type predicates should return
10432 @code{nil} if the document is not of the correct type; @code{t} if it is
10433 of the correct type; and a number if the document might be of the
10434 correct type.  A high number means high probability; a low number means
10435 low probability with @samp{0} being the lowest valid number.
10436
10437
10438 @node SOUP
10439 @subsection SOUP
10440 @cindex SOUP
10441 @cindex offline
10442
10443 In the PC world people often talk about ``offline'' newsreaders.  These
10444 are thingies that are combined reader/news transport monstrosities.
10445 With built-in modem programs.  Yecchh!
10446
10447 Of course, us Unix Weenie types of human beans use things like
10448 @code{uucp} and, like, @code{nntpd} and set up proper news and mail
10449 transport things like Ghod intended.  And then we just use normal
10450 newsreaders.  
10451
10452 However, it can sometimes be convenient to do something a that's a bit
10453 easier on the brain if you have a very slow modem, and you're not really
10454 that interested in doing things properly.  
10455
10456 A file format called @sc{soup} has been developed for transporting news
10457 and mail from servers to home machines and back again.  It can be a bit
10458 fiddly.
10459
10460 First some terminology:
10461
10462 @table @dfn
10463
10464 @item server
10465 This is the machine that is connected to the outside world and where you
10466 get news and/or mail from.
10467
10468 @item home machine
10469 This is the machine that you want to do the actual reading and responding
10470 on.  It is typically not connected to the rest of the world in any way.
10471
10472 @item packet
10473 Something that contains messages and/or commands.  There are two kinds
10474 of packets:
10475
10476 @table @dfn
10477 @item message packets
10478 These are packets made at the server, and typically contain lots of
10479 messages for you to read.  These are called @file{SoupoutX.tgz} by
10480 default, where @var{X} is a number.
10481
10482 @item response packets
10483 These are packets made at the home machine, and typically contains
10484 replies that you've written.  These are called @file{SoupinX.tgz} by
10485 default, where @var{X} is a number.
10486
10487 @end table
10488
10489 @end table
10490
10491
10492 @enumerate
10493
10494 @item
10495 You log in on the server and create a @sc{soup} packet.  You can either
10496 use a dedicated @sc{soup} thingie (like the @code{awk} program), or you
10497 can use Gnus to create the packet with its @sc{soup} commands (@kbd{O
10498 s} and/or @kbd{G s b}; and then @kbd{G s p}) (@pxref{SOUP Commands}).
10499
10500 @item 
10501 You transfer the packet home.  Rail, boat, car or modem will do fine.
10502
10503 @item
10504 You put the packet in your home directory.
10505
10506 @item
10507 You fire up Gnus on your home machine using the @code{nnsoup} backend as
10508 the native or secondary server.
10509
10510 @item
10511 You read articles and mail and answer and followup to the things you
10512 want (@pxref{SOUP Replies}).
10513
10514 @item 
10515 You do the @kbd{G s r} command to pack these replies into a @sc{soup}
10516 packet.
10517
10518 @item 
10519 You transfer this packet to the server.  
10520
10521 @item
10522 You use Gnus to mail this packet out with the @kbd{G s s} command.
10523
10524 @item
10525 You then repeat until you die.
10526
10527 @end enumerate
10528
10529 So you basically have a bipartite system---you use @code{nnsoup} for
10530 reading and Gnus for packing/sending these @sc{soup} packets.
10531
10532 @menu
10533 * SOUP Commands::     Commands for creating and sending @sc{soup} packets
10534 * SOUP Groups::       A backend for reading @sc{soup} packets.
10535 * SOUP Replies::      How to enable @code{nnsoup} to take over mail and news.
10536 @end menu
10537
10538
10539 @node SOUP Commands
10540 @subsubsection SOUP Commands
10541
10542 These are commands for creating and manipulating @sc{soup} packets.
10543
10544 @table @kbd
10545 @item G s b
10546 @kindex G s b (Group)
10547 @findex gnus-group-brew-soup
10548 Pack all unread articles in the current group
10549 (@code{gnus-group-brew-soup}).  This command understands the
10550 process/prefix convention.
10551
10552 @item G s w
10553 @kindex G s w (Group)
10554 @findex gnus-soup-save-areas
10555 Save all @sc{soup} data files (@code{gnus-soup-save-areas}).
10556
10557 @item G s s
10558 @kindex G s s (Group)
10559 @findex gnus-soup-send-replies
10560 Send all replies from the replies packet
10561 (@code{gnus-soup-send-replies}). 
10562
10563 @item G s p
10564 @kindex G s p (Group)
10565 @findex gnus-soup-pack-packet
10566 Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}). 
10567
10568 @item G s r
10569 @kindex G s r (Group)
10570 @findex nnsoup-pack-replies
10571 Pack all replies into a replies packet (@code{nnsoup-pack-replies}). 
10572
10573 @item O s
10574 @kindex O s (Summary)
10575 @findex gnus-soup-add-article
10576 This summary-mode command adds the current article to a @sc{soup} packet
10577 (@code{gnus-soup-add-article}).  It understands the process/prefix
10578 convention (@pxref{Process/Prefix}). 
10579
10580 @end table
10581
10582
10583 There are a few variables to customize where Gnus will put all these
10584 thingies:  
10585
10586 @table @code
10587
10588 @item gnus-soup-directory
10589 @vindex gnus-soup-directory
10590 Directory where Gnus will save intermediate files while composing
10591 @sc{soup} packets.  The default is @file{~/SoupBrew/}. 
10592
10593 @item gnus-soup-replies-directory
10594 @vindex gnus-soup-replies-directory
10595 This is what Gnus will use as a temporary directory while sending our
10596 reply packets.  @file{~/SoupBrew/SoupReplies/} is the default.
10597
10598 @item gnus-soup-prefix-file
10599 @vindex gnus-soup-prefix-file
10600 Name of the file where Gnus stores the last used prefix.  The default is
10601 @samp{gnus-prefix}. 
10602
10603 @item gnus-soup-packer
10604 @vindex gnus-soup-packer
10605 A format string command for packing a @sc{soup} packet.  The default is
10606 @samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}. 
10607
10608 @item gnus-soup-unpacker
10609 @vindex gnus-soup-unpacker
10610 Format string command for unpacking a @sc{soup} packet.  The default is
10611 @samp{gunzip -c %s | tar xvf -}.
10612
10613 @item gnus-soup-packet-directory
10614 @vindex gnus-soup-packet-directory
10615 Where Gnus will look for reply packets.  The default is @file{~/}. 
10616
10617 @item gnus-soup-packet-regexp
10618 @vindex gnus-soup-packet-regexp
10619 Regular expression matching @sc{soup} reply packets in
10620 @code{gnus-soup-packet-directory}. 
10621
10622 @end table
10623  
10624
10625 @node SOUP Groups
10626 @subsubsection @sc{soup} Groups
10627 @cindex nnsoup
10628
10629 @code{nnsoup} is the backend for reading @sc{soup} packets.  It will
10630 read incoming packets, unpack them, and put them in a directory where
10631 you can read them at leisure.
10632
10633 These are the variables you can use to customize its behavior:
10634
10635 @table @code
10636
10637 @item nnsoup-tmp-directory
10638 @vindex nnsoup-tmp-directory
10639 When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this
10640 directory.  (@file{/tmp/} by default.)  
10641
10642 @item nnsoup-directory
10643 @vindex nnsoup-directory
10644 @code{nnsoup} then moves each message and index file to this directory.
10645 The default is @file{~/SOUP/}.
10646
10647 @item nnsoup-replies-directory 
10648 @vindex nnsoup-replies-directory 
10649 All replies will be stored in this directory before being packed into a
10650 reply packet.  The default is @file{~/SOUP/replies/"}.
10651
10652 @item nnsoup-replies-format-type
10653 @vindex nnsoup-replies-format-type
10654 The @sc{soup} format of the replies packets.  The default is @samp{?n}
10655 (rnews), and I don't think you should touch that variable.  I probably
10656 shouldn't even have documented it.  Drats!  Too late!
10657
10658 @item nnsoup-replies-index-type
10659 @vindex nnsoup-replies-index-type
10660 The index type of the replies packet.  The default is @samp{?n}, which
10661 means ``none''.  Don't fiddle with this one either!
10662
10663 @item nnsoup-active-file
10664 @vindex nnsoup-active-file
10665 Where @code{nnsoup} stores lots of information.  This is not an ``active
10666 file'' in the @code{nntp} sense; it's an Emacs Lisp file.  If you lose
10667 this file or mess it up in any way, you're dead.  The default is
10668 @file{~/SOUP/active}.
10669
10670 @item nnsoup-packer
10671 @vindex nnsoup-packer
10672 Format string command for packing a reply @sc{soup} packet.  The default
10673 is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}. 
10674
10675 @item nnsoup-unpacker
10676 @vindex nnsoup-unpacker
10677 Format string command for unpacking incoming @sc{soup} packets.  The
10678 default is @samp{gunzip -c %s | tar xvf -}. 
10679
10680 @item nnsoup-packet-directory
10681 @vindex nnsoup-packet-directory
10682 Where @code{nnsoup} will look for incoming packets.  The default is
10683 @file{~/}.  
10684
10685 @item nnsoup-packet-regexp
10686 @vindex nnsoup-packet-regexp
10687 Regular expression matching incoming @sc{soup} packets.  The default is
10688 @samp{Soupout}.
10689
10690 @item nnsoup-always-save
10691 @vindex nnsoup-always-save
10692 If non-@code{nil}, save the replies buffer after each posted message.
10693
10694 @end table
10695
10696
10697 @node SOUP Replies
10698 @subsubsection SOUP Replies
10699
10700 Just using @code{nnsoup} won't mean that your postings and mailings end
10701 up in @sc{soup} reply packets automagically.  You have to work a bit
10702 more for that to happen.
10703
10704 @findex nnsoup-set-variables
10705 The @code{nnsoup-set-variables} command will set the appropriate
10706 variables to ensure that all your followups and replies end up in the
10707 @sc{soup} system.
10708
10709 In specific, this is what it does:
10710
10711 @lisp
10712 (setq message-send-news-function 'nnsoup-request-post)
10713 (setq message-send-mail-function 'nnsoup-request-mail)
10714 @end lisp
10715
10716 And that's it, really.  If you only want news to go into the @sc{soup}
10717 system you just use the first line.  If you only want mail to be
10718 @sc{soup}ed you use the second.
10719
10720
10721 @node Web Searches
10722 @subsection Web Searches
10723 @cindex nnweb
10724 @cindex DejaNews
10725 @cindex Alta Vista
10726 @cindex InReference
10727 @cindex Usenet searches
10728 @cindex searching the Usenet
10729
10730 It's, like, too neat to search the Usenet for articles that match a
10731 string, but it, like, totally @emph{sucks}, like, totally, to use one of
10732 those, like, Web browsers, and you, like, have to, rilly, like, look at
10733 the commercials, so, like, with Gnus you can do @emph{rad}, rilly,
10734 searches without having to use a browser.
10735
10736 The @code{nnweb} backend allows an easy interface to the mighty search
10737 engine.  You create an @code{nnweb} group, enter a search pattern, and
10738 then enter the group and read the articles like you would any normal
10739 group.  The @kbd{G w} command in the group buffer (@pxref{Foreign
10740 Groups}) will do this in an easy-to-use fashion.
10741
10742 @code{nnweb} groups don't really lend themselves to being solid
10743 groups---they have a very fleeting idea of article numbers.  In fact,
10744 each time you enter an @code{nnweb} group (not even changing the search
10745 pattern), you are likely to get the articles ordered in a different
10746 manner.  Not even using duplicate suppression (@pxref{Duplicate
10747 Suppression}) will help, since @code{nnweb} doesn't even know the
10748 @code{Message-ID} of the articles before reading them using some search
10749 engines (DejaNews, for instance).  The only possible way to keep track
10750 of which articles you've read is by scoring on the @code{Date}
10751 header---mark all articles posted before the last date you read the
10752 group as read.
10753
10754 If the search engine changes its output substantially, @code{nnweb}
10755 won't be able to parse it and will fail.  One could hardly fault the Web
10756 providers if they were to do this---their @emph{raison d'être} is to
10757 make money off of advertisements, not to provide services to the
10758 community.  Since @code{nnweb} washes the ads off all the articles, one
10759 might think that the providers might be somewhat miffed.  We'll see.
10760
10761 You must have the @code{url} and @code{w3} package installed to be able
10762 to use @code{nnweb}.
10763
10764 Virtual server variables:
10765
10766 @table @code
10767 @item nnweb-type
10768 @vindex nnweb-type
10769 What search engine type is being used.  The currently supported types
10770 are @code{dejanews}, @code{dejanewsold}, @code{altavista} and
10771 @code{reference}.
10772
10773 @item nnweb-search
10774 @vindex nnweb-search
10775 The search string to feed to the search engine.
10776
10777 @item nnweb-max-hits
10778 @vindex nnweb-max-hits
10779 Advisory maximum number of hits per search to display.  The default is
10780 100.
10781
10782 @item nnweb-type-definition
10783 @vindex nnweb-type-definition
10784 Type-to-definition alist.  This alist says what @code{nnweb} should do
10785 with the various search engine types.  The following elements must be
10786 present: 
10787
10788 @table @code
10789 @item article
10790 Function to decode the article and provide something that Gnus
10791 understands. 
10792
10793 @item map
10794 Function to create an article number to message header and URL alist. 
10795
10796 @item search
10797 Function to send the search string to the search engine.
10798
10799 @item address
10800 The address the aforementioned function should send the search string
10801 to. 
10802
10803 @item id
10804 Format string URL to fetch an article by @code{Message-ID}.
10805 @end table
10806
10807 @end table
10808
10809
10810
10811 @node Mail-To-News Gateways
10812 @subsection Mail-To-News Gateways
10813 @cindex mail-to-news gateways
10814 @cindex gateways
10815
10816 If your local @code{nntp} server doesn't allow posting, for some reason
10817 or other, you can post using one of the numerous mail-to-news gateways.
10818 The @code{nngateway} backend provides the interface.
10819
10820 Note that you can't read anything from this backend---it can only be
10821 used to post with.
10822
10823 Server variables:
10824
10825 @table @code
10826 @item nngateway-address 
10827 @vindex nngateway-address 
10828 This is the address of the mail-to-news gateway.
10829
10830 @item nngateway-header-transformation
10831 @vindex nngateway-header-transformation
10832 News headers often have to be transformed in some odd way or other
10833 for the mail-to-news gateway to accept it.  This variable says what 
10834 transformation should be called, and defaults to
10835 @code{nngateway-simple-header-transformation}.  The function is called
10836 narrowed to the headers to be transformed and with one parameter---the
10837 gateway address.
10838
10839 This default function just inserts a new @code{To} header based on the
10840 @code{Newsgroups} header and the gateway address.
10841 For instance, an article with this @code{Newsgroups} header:
10842
10843 @example
10844 Newsgroups: alt.religion.emacs
10845 @end example
10846
10847 will get this @code{From} header inserted:
10848
10849 @example
10850 To: alt-religion-emacs@@GATEWAY
10851 @end example
10852
10853 @end table
10854
10855 So, to use this, simply say something like:
10856
10857 @lisp
10858 (setq gnus-post-method '(nngateway "GATEWAY.ADDRESS"))
10859 @end lisp
10860
10861
10862 @node Combined Groups
10863 @section Combined Groups
10864
10865 Gnus allows combining a mixture of all the other group types into bigger
10866 groups.
10867
10868 @menu
10869 * Virtual Groups::     Combining articles from many groups.
10870 * Kibozed Groups::     Looking through parts of the newsfeed for articles.
10871 @end menu
10872
10873
10874 @node Virtual Groups
10875 @subsection Virtual Groups
10876 @cindex nnvirtual
10877 @cindex virtual groups
10878
10879 An @dfn{nnvirtual group} is really nothing more than a collection of
10880 other groups.
10881
10882 For instance, if you are tired of reading many small groups, you can
10883 put them all in one big group, and then grow tired of reading one
10884 big, unwieldy group.  The joys of computing!
10885
10886 You specify @code{nnvirtual} as the method.  The address should be a
10887 regexp to match component groups.
10888
10889 All marks in the virtual group will stick to the articles in the
10890 component groups.  So if you tick an article in a virtual group, the
10891 article will also be ticked in the component group from whence it came.
10892 (And vice versa---marks from the component groups will also be shown in
10893 the virtual group.)
10894
10895 Here's an example @code{nnvirtual} method that collects all Andrea Dworkin
10896 newsgroups into one, big, happy newsgroup:
10897
10898 @lisp
10899 (nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*")
10900 @end lisp
10901
10902 The component groups can be native or foreign; everything should work
10903 smoothly, but if your computer explodes, it was probably my fault.
10904
10905 Collecting the same group from several servers might actually be a good
10906 idea if users have set the Distribution header to limit distribution.
10907 If you would like to read @samp{soc.motss} both from a server in Japan
10908 and a server in Norway, you could use the following as the group regexp:
10909
10910 @example
10911 "^nntp+some.server.jp:soc.motss$\\|^nntp+some.server.no:soc.motss$"
10912 @end example
10913
10914 This should work kinda smoothly---all articles from both groups should
10915 end up in this one, and there should be no duplicates.  Threading (and
10916 the rest) will still work as usual, but there might be problems with the
10917 sequence of articles.  Sorting on date might be an option here
10918 (@pxref{Selecting a Group}).
10919
10920 One limitation, however---all groups included in a virtual
10921 group have to be alive (i.e., subscribed or unsubscribed).  Killed or
10922 zombie groups can't be component groups for @code{nnvirtual} groups.
10923
10924 @vindex nnvirtual-always-rescan
10925 If the @code{nnvirtual-always-rescan} is non-@code{nil},
10926 @code{nnvirtual} will always scan groups for unread articles when
10927 entering a virtual group.  If this variable is @code{nil} (which is the
10928 default) and you read articles in a component group after the virtual
10929 group has been activated, the read articles from the component group
10930 will show up when you enter the virtual group.  You'll also see this
10931 effect if you have two virtual groups that have a component group in
10932 common.  If that's the case, you should set this variable to @code{t}.
10933 Or you can just tap @code{M-g} on the virtual group every time before
10934 you enter it---it'll have much the same effect.
10935
10936
10937 @node Kibozed Groups
10938 @subsection Kibozed Groups
10939 @cindex nnkiboze
10940 @cindex kibozing
10941
10942 @dfn{Kibozing} is defined by @sc{oed} as ``grepping through (parts of)
10943 the news feed''.  @code{nnkiboze} is a backend that will do this for
10944 you.  Oh joy!  Now you can grind any @sc{nntp} server down to a halt
10945 with useless requests!  Oh happiness!
10946
10947 @kindex G k (Group)
10948 To create a kibozed group, use the @kbd{G k} command in the group
10949 buffer. 
10950
10951 The address field of the @code{nnkiboze} method is, as with
10952 @code{nnvirtual}, a regexp to match groups to be ``included'' in the
10953 @code{nnkiboze} group.  That's where most similarities between @code{nnkiboze}
10954 and @code{nnvirtual} end.
10955
10956 In addition to this regexp detailing component groups, an @code{nnkiboze} group
10957 must have a score file to say what articles are to be included in
10958 the group (@pxref{Scoring}).
10959
10960 @kindex M-x nnkiboze-generate-groups
10961 @findex nnkiboze-generate-groups
10962 You must run @kbd{M-x nnkiboze-generate-groups} after creating the
10963 @code{nnkiboze} groups you want to have.  This command will take time.  Lots of
10964 time.  Oodles and oodles of time.  Gnus has to fetch the headers from
10965 all the articles in all the component groups and run them through the
10966 scoring process to determine if there are any articles in the groups
10967 that are to be part of the @code{nnkiboze} groups.
10968
10969 Please limit the number of component groups by using restrictive
10970 regexps.  Otherwise your sysadmin may become annoyed with you, and the
10971 @sc{nntp} site may throw you off and never let you back in again.
10972 Stranger things have happened.
10973
10974 @code{nnkiboze} component groups do not have to be alive---they can be dead,
10975 and they can be foreign.  No restrictions.
10976
10977 @vindex nnkiboze-directory
10978 The generation of an @code{nnkiboze} group means writing two files in
10979 @code{nnkiboze-directory}, which is @file{~/News/} by default.  One
10980 contains the @sc{nov} header lines for all the articles in the group,
10981 and the other is an additional @file{.newsrc} file to store information
10982 on what groups have been searched through to find component articles.
10983
10984 Articles marked as read in the @code{nnkiboze} group will have
10985 their @sc{nov} lines removed from the @sc{nov} file.
10986
10987
10988 @node Gnus Unplugged
10989 @section Gnus Unplugged
10990 @cindex offline
10991 @cindex unplugged
10992 @cindex Agent
10993 @cindex Gnus Agent
10994 @cindex Gnus Unplugged
10995
10996 In olden times (ca. February '88), people used to run their newsreaders
10997 on big machines with permanent connections to the net.  News transport
10998 was dealt with by news servers, and all the newsreaders had to do was to
10999 read news.  Believe it or not.
11000
11001 Nowadays most people read news and mail at home, and use some sort of
11002 modem to connect to the net.  To avoid running up huge phone bills, it
11003 would be nice to have a way to slurp down all the news and mail, hang up
11004 the phone, read for several hours, and then upload any responses you
11005 have to make.  And then you repeat the procedure.
11006
11007 Of course, you can use news servers for doing this as well.  I've used
11008 @code{inn} together with @code{slurp}, @code{pop} and @code{sendmail}
11009 for some years, but doing that's a bore.  Moving the news server
11010 functionality up to the newsreader makes sense if you're the only person
11011 reading news on a machine.
11012
11013 Using Gnus as an ``offline'' newsreader is quite simple.
11014
11015 @itemize @bullet
11016 @item
11017 First, set up Gnus as you would do if you were running it on a machine
11018 that has full connection to the net.  Go ahead.  I'll still be waiting
11019 here.
11020
11021 @item
11022 Then, put the following magical incantation at the end of your
11023 @file{.gnus.el} file:
11024
11025 @lisp
11026 (gnus-agentize)
11027 @end lisp
11028 @end itemize
11029
11030 That's it.  Gnus is now an ``offline'' newsreader.
11031
11032 Of course, to use it as such, you have to learn a few new commands.
11033
11034 @menu
11035 * Agent Basics::           How it all is supposed to work.
11036 * Agent Categories::       How to tell the Gnus Agent what to download.
11037 * Agent Commands::         New commands for all the buffers.
11038 * Outgoing Messages::      What happens when you post/mail something?
11039 * Agent Variables::        Customizing is fun.
11040 * Example Setup::          An example @file{.gnus.el} file for offline people.
11041 @end menu
11042
11043
11044 @node Agent Basics
11045 @subsection Agent Basics
11046
11047 First, let's get some terminology out of the way.
11048
11049 The Gnus Agent is said to be @dfn{unplugged} when you have severed the
11050 connection to the net (and notified the Agent that this is the case).
11051 When the connection to the net is up again (and Gnus knows this), the
11052 Agent is @dfn{plugged}.
11053
11054 The @dfn{local} machine is the one you're running on, and which isn't
11055 connected to the net continously.
11056
11057 @dfn{Downloading} means fetching things from the net to your local
11058 machine.  @dfn{Uploading} is doing the opposite.
11059
11060 Let's take a typical Gnus session using the Agent.
11061
11062 @itemize @bullet
11063
11064 @item
11065 You start Gnus with @code{gnus-unplugged}.  This brings up the Gnus
11066 Agent in a disconnected state.  You can read all the news that you have
11067 already fetched while in this mode.
11068
11069 @item
11070 You then decide to see whether any new news has arrived.  You connect
11071 your machine to the net (using PPP or whatever), and then hit @kbd{J j}
11072 to make Gnus become @dfn{plugged}.
11073
11074 @item
11075 You can then read the new news immediately, or you can download the news
11076 onto your local machine.  If you want to do the latter, you press @kbd{J
11077 s} to fetch all the eligible articles in all the groups.  (To let Gnus
11078 know which articles you want to download, @pxref{Agent Categories}.)
11079
11080 @item
11081 After fetching the articles, you press @kbd{J j} to make Gnus become
11082 unplugged again, and you shut down the PPP thing (or whatever).  And
11083 then you read the news offline.
11084
11085 @item
11086 And then you go to step 2.
11087 @end itemize
11088
11089 Here are some things you should do the first time (or so) that you use
11090 the Agent.
11091
11092 @itemize @bullet
11093
11094 @item
11095 Decide which servers should be covered by the Agent.  If you have a mail
11096 backend, it would probably be nonsensical to have it covered by the
11097 Agent.  Go to the server buffer (@kbd{^} in the group buffer) and press
11098 @kbd{J a} the server (or servers) that you wish to have covered by the
11099 Agent (@pxref{Server Agent Commands}).  This will typically be only the
11100 primary select method, which is listed on the bottom in the buffer.
11101
11102 @item
11103 Decide on download policy.  @xref{Agent Categories}
11104
11105 @item
11106 Uhm... that's it.
11107 @end itemize
11108
11109
11110 @node Agent Categories
11111 @subsection Agent Categories
11112
11113 One of the main reasons to integrate the news transport layer into the
11114 newsreader is to allow greater control over what articles to download.
11115 There's not much point in downloading huge amounts of articles, just to
11116 find out that you're not interested in reading any of them.  It's better
11117 to be somewhat more conservative in choosing what to download, and then
11118 mark the articles for downloading manually if it should turn out that
11119 you're interested in the articles anyway.
11120
11121 The main way to control what is to be downloaded is to create a
11122 @dfn{category} and then assign some (or all) groups to this category. 
11123 Gnus has its own buffer for creating and managing categories.
11124
11125 @menu
11126 * Category Syntax::       What a category looks like.
11127 * The Category Buffer::   A buffer for maintaining categories.
11128 * Category Variables::    Customize'r'Us.
11129 @end menu
11130
11131
11132 @node Category Syntax
11133 @subsubsection Category Syntax
11134
11135 A category consists of two things.
11136
11137 @enumerate
11138 @item
11139 A predicate which (generally) gives a rough outline of which articles
11140 are eligible for downloading; and
11141
11142 @item
11143 a score rule which (generally) gives you a finer granularity when
11144 deciding what articles to download.  (Note that this @dfn{download
11145 score} is wholly unrelated to normal scores.)
11146 @end enumerate
11147
11148 A predicate consists of predicates with logical operators sprinkled in
11149 between.
11150
11151 Perhaps some examples are in order.
11152
11153 Here's a simple predicate.  (It's the default predicate, in fact, used
11154 for all groups that don't belong to any other category.)
11155
11156 @lisp
11157 short
11158 @end lisp
11159
11160 Quite simple, eh?  This predicate is true if and only if the article is
11161 short (for some value of ``short'').
11162
11163 Here's a more complex predicate:
11164
11165 @lisp
11166 (or high
11167     (and
11168      (not low)
11169      (not long)))
11170 @end lisp
11171
11172 This means that an article should be downloaded if it has a high score,
11173 or if the score is not low and the article is not long.  You get the
11174 drift.
11175
11176 The available logical operators are @code{or}, @code{and} and
11177 @code{not}.  (If you prefer, you can use the more ``C''-ish operators
11178 @samp{|}, @code{&} and @code{!} instead.)
11179
11180 The following predicates are pre-defined, but if none of these fit what
11181 you want to do, you can write your own.
11182
11183 @table @code
11184 @item short
11185 True iff the article is shorter than @code{gnus-agent-short-article}
11186 lines; default 100.
11187
11188 @item long
11189 True iff the article is longer than @code{gnus-agent-long-article}
11190 lines; default 200.
11191
11192 @item low
11193 True iff the article has a download score less than
11194 @code{gnus-agent-low-score}; default 0.
11195
11196 @item high
11197 True iff the article has a download score greater than
11198 @code{gnus-agent-high-score}; default 0.
11199
11200 @item spam
11201 True iff the Gnus Agent guesses that the article is spam.  The
11202 heuristics may change over time, but at present it just computes a
11203 checksum and sees whether articles match.
11204
11205 @item true
11206 Always true.
11207
11208 @item false
11209 Always false.
11210 @end table
11211
11212 If you want to create your own predicate function, here's what you have
11213 to know:  The functions are called with no parameters, but the
11214 @code{gnus-headers} and @code{gnus-score} dynamic variables are bound to
11215 useful values.
11216
11217 Now, the syntax of the download score is the same as the syntax of
11218 normal score files, except that all elements that require actually
11219 seeing the article itself are verboten.  This means that only the
11220 following headers can be scored on: @code{From}, @code{Subject},
11221 @code{Date}, @code{Xref}, @code{Lines}, @code{Chars}, @code{Message-ID},
11222 and @code{References}.
11223
11224
11225 @node The Category Buffer
11226 @subsubsection The Category Buffer
11227
11228 You'd normally do all category maintenance from the category buffer.
11229 When you enter it for the first time (with the @kbd{J c} command from
11230 the group buffer), you'll only see the @code{default} category.
11231
11232 The following commands are available in this buffer:
11233
11234 @table @kbd
11235 @item q
11236 @kindex q (Category)
11237 @findex gnus-category-exit
11238 Return to the group buffer (@code{gnus-category-exit}).
11239
11240 @item k
11241 @kindex k (Category)
11242 @findex gnus-category-kill
11243 Kill the current category (@code{gnus-category-kill}).
11244
11245 @item c
11246 @kindex c (Category)
11247 @findex gnus-category-copy
11248 Copy the current category (@code{gnus-category-copy}).
11249
11250 @item a
11251 @kindex a (Category)
11252 @findex gnus-category-add
11253 Add a new category (@code{gnus-category-add}).
11254
11255 @item p
11256 @kindex p (Category)
11257 @findex gnus-category-edit-predicate
11258 Edit the predicate of the current category
11259 (@code{gnus-category-edit-predicate}).
11260
11261 @item g
11262 @kindex g (Category)
11263 @findex gnus-category-edit-groups
11264 Edit the list of groups belonging to the current category
11265 (@code{gnus-category-edit-groups}).
11266
11267 @item s
11268 @kindex s (Category)
11269 @findex gnus-category-edit-score
11270 Edit the download score rule of the current category
11271 (@code{gnus-category-edit-score}).
11272
11273 @item l
11274 @kindex l (Category)
11275 @findex gnus-category-list
11276 List all the categories (@code{gnus-category-list}).
11277 @end table
11278
11279
11280 @node Category Variables
11281 @subsubsection Category Variables
11282
11283 @table @code
11284 @item gnus-category-mode-hook
11285 @vindex gnus-category-mode-hook
11286 Hook run in category buffers.
11287
11288 @item gnus-category-line-format
11289 @vindex gnus-category-line-format
11290 Format of the lines in the category buffer (@pxref{Formatting
11291 Variables}).  Legal elements are:
11292
11293 @table @samp
11294 @item c
11295 The name of the category.
11296
11297 @item g
11298 The number of groups in the category.
11299 @end table
11300
11301 @item gnus-category-mode-line-format
11302 @vindex gnus-category-mode-line-format
11303 Format of the category mode line.
11304
11305 @item gnus-agent-short-article 
11306 @vindex gnus-agent-short-article 
11307 Articles that have fewer lines than this are short.  Default 100.
11308
11309 @item gnus-agent-long-article 
11310 @vindex gnus-agent-long-article 
11311 Articles that have more lines than this are long.  Default 200.
11312
11313 @item gnus-agent-low-score 
11314 @vindex gnus-agent-low-score 
11315 Articles that have a score lower than this have a low score.  Default
11316 0. 
11317
11318 @item gnus-agent-high-score 
11319 @vindex gnus-agent-high-score 
11320 Articles that have a score higher than this have a high score.  Default
11321 0. 
11322
11323 @end table
11324
11325
11326 @node Agent Commands
11327 @subsection Agent Commands
11328
11329 All the Gnus Agent commands are on the @kbd{J} submap.  The @kbd{J j}
11330 (@code{gnus-agent-toggle-plugged} command works in all modes, and
11331 toggles the plugged/unplugged state of the Gnus Agent.
11332
11333
11334 @menu
11335 * Group Agent Commands::
11336 * Summary Agent Commands::
11337 * Server Agent Commands::
11338 @end menu
11339
11340 You can run a complete batch fetch from the command line with the
11341 following incantation:
11342
11343 @cindex gnus-agent-batch-fetch
11344 @example
11345 $ emacs -batch -l ~/.gnus.el -f gnus-agent-batch-fetch
11346 @end example
11347
11348
11349
11350 @node Group Agent Commands
11351 @subsubsection Group Agent Commands
11352
11353 @table @kbd
11354 @item J u 
11355 @kindex J u (Agent Group)
11356 @findex gnus-agent-fetch-group
11357 Fetch all eligible articles in the current group
11358 (@code{gnus-agent-fetch-group}).
11359
11360 @item J c
11361 @kindex J c (Agent Group)
11362 @findex gnus-enter-category-buffer
11363 Enter the Agent category buffer (@code{gnus-enter-category-buffer}).
11364
11365 @item J s
11366 @kindex J s (Agent Group)
11367 @findex gnus-agent-fetch-session
11368 Fetch all eligible articles in all groups
11369 (@code{gnus-agent-fetch-session}).
11370
11371 @item J S
11372 @kindex J S (Agent Group)
11373 @findex gnus-group-send-drafts
11374 Send all sendable messages in the draft group
11375 (@code{gnus-agent-fetch-session}).  @xref{Drafts}
11376
11377 @item J a
11378 @kindex J a (Agent Group)
11379 @findex gnus-agent-add-group
11380 Add the current group to an Agent category
11381 (@code{gnus-agent-add-group}).
11382
11383 @end table
11384
11385
11386 @node Summary Agent Commands
11387 @subsubsection Summary Agent Commands
11388
11389 @table @kbd
11390 @item J #
11391 @kindex J # (Agent Summary)
11392 @findex gnus-agent-mark-article
11393 Mark the article for downloading (@code{gnus-agent-mark-article}).
11394
11395 @item J M-#
11396 @kindex J M-# (Agent Summary)
11397 @findex gnus-agent-unmark-article
11398 Remove the downloading mark from the article
11399 (@code{gnus-agent-unmark-article}).
11400
11401 @item @@
11402 @kindex @@ (Agent Summary)
11403 @findex gnus-agent-toggle-mark
11404 Toggle whether to download the article (@code{gnus-agent-toggle-mark}).
11405
11406 @item J c
11407 @kindex J c (Agent Summary)
11408 @findex gnus-agent-catchup
11409 Mark all undownloaded articles as read (@code{gnus-agent-catchup}).
11410
11411 @end table
11412
11413
11414 @node Server Agent Commands
11415 @subsubsection Server Agent Commands
11416
11417 @table @kbd
11418 @item J a
11419 @kindex J a (Agent Server)
11420 @findex gnus-agent-add-server
11421 Add the current server to the list of servers covered by the Gnus Agent
11422 (@code{gnus-agent-add-server}).
11423
11424 @item J r
11425 @kindex J r (Agent Server)
11426 @findex gnus-agent-remove-server
11427 Remove the current server from the list of servers covered by the Gnus
11428 Agent (@code{gnus-agent-remove-server}).
11429
11430 @end table
11431
11432
11433 @node Outgoing Messages
11434 @subsection Outgoing Messages
11435
11436 When Gnus is unplugged, all outgoing messages (both mail and news) are
11437 stored in the draft groups (@pxref{Drafts}).  You can view them there
11438 after posting, and edit them at will.
11439
11440 When Gnus is plugged again, you can send the messages either from the
11441 draft group with the special commands available there, or you can use
11442 the @kbd{J S} command in the group buffer to send all the sendable
11443 messages in the draft group.
11444
11445
11446
11447 @node Agent Variables
11448 @subsection Agent Variables
11449
11450 @table @code
11451 @item gnus-agent-directory
11452 @vindex gnus-agent-directory
11453 Where the Gnus Agent will store its files.  The default is
11454 @file{~/News/agent/}.
11455
11456 @item gnus-agent-plugged-hook
11457 @vindex gnus-agent-plugged-hook
11458 Hook run when connecting to the network.
11459
11460 @item gnus-agent-unplugged-hook
11461 @vindex gnus-agent-unplugged-hook
11462 Hook run when disconnecting from the network.
11463
11464 @end table
11465
11466
11467 @node Example Setup
11468 @subsection Example Setup
11469
11470 If you don't want to read this manual, and you have a fairly standard
11471 setup, you may be able to use something like the following as your
11472 @file{.gnus.el} file to get started.
11473
11474 @lisp
11475 ;;; Define how Gnus is to fetch news.  We do this over NNTP
11476 ;;; from your ISP's server.
11477 (setq gnus-select-method '(nntp "nntp.your-isp.com"))
11478
11479 ;;; Define how Gnus is to read your mail.  We read mail from
11480 ;;; your ISP's POP server.
11481 (setenv "MAILHOST" "pop.your-isp.com")
11482 (setq nnmail-spool-file "po:username")
11483
11484 ;;; Say how Gnus is to store the mail.  We use nnml groups.
11485 (setq gnus-secondary-select-methods '((nnml "")))
11486
11487 ;;; Make Gnus into an offline newsreader.
11488 (gnus-agentize)
11489 @end lisp
11490
11491 That should be it, basically.  Put that in your @file{~/.gnus.el} file,
11492 edit to suit your needs, start up PPP (or whatever), and type @kbd{M-x
11493 gnus}.
11494
11495 If this is the first time you've run Gnus, you will be subscribed
11496 automatically to a few default newsgroups.  You'll probably want to
11497 subscribe to more groups, and to do that, you have to query the
11498 @sc{nntp} server for a complete list of groups with the @kbd{A A}
11499 command.  This usually takes quite a while, but you only have to do it
11500 once.
11501
11502 After reading and parsing a while, you'll be presented with a list of
11503 groups.  Subscribe to the ones you want to read with the @kbd{u}
11504 command.  @kbd{l} to make all the killed groups disappear after you've
11505 subscribe to all the groups you want to read.  (@kbd{A k} will bring
11506 back all the killed groups.)
11507
11508 You can now read the groups at once, or you can download the articles
11509 with the @kbd{J s} command.  And then read the rest of this manual to
11510 find out which of the other gazillion things you want to customize.
11511
11512
11513 @node Scoring
11514 @chapter Scoring
11515 @cindex scoring
11516
11517 Other people use @dfn{kill files}, but we here at Gnus Towers like
11518 scoring better than killing, so we'd rather switch than fight.  They do
11519 something completely different as well, so sit up straight and pay
11520 attention!
11521
11522 @vindex gnus-summary-mark-below
11523 All articles have a default score (@code{gnus-summary-default-score}),
11524 which is 0 by default.  This score may be raised or lowered either
11525 interactively or by score files.  Articles that have a score lower than
11526 @code{gnus-summary-mark-below} are marked as read.
11527
11528 Gnus will read any @dfn{score files} that apply to the current group
11529 before generating the summary buffer.
11530
11531 There are several commands in the summary buffer that insert score
11532 entries based on the current article.  You can, for instance, ask Gnus to
11533 lower or increase the score of all articles with a certain subject.
11534
11535 There are two sorts of scoring entries: Permanent and temporary.
11536 Temporary score entries are self-expiring entries.  Any entries that are
11537 temporary and have not been used for, say, a week, will be removed
11538 silently to help keep the sizes of the score files down.
11539
11540 @menu 
11541 * Summary Score Commands::   Adding score entries for the current group.
11542 * Group Score Commands::     General score commands.
11543 * Score Variables::          Customize your scoring.  (My, what terminology).
11544 * Score File Format::        What a score file may contain.
11545 * Score File Editing::       You can edit score files by hand as well.
11546 * Adaptive Scoring::         Big Sister Gnus knows what you read.
11547 * Home Score File::          How to say where new score entries are to go.
11548 * Followups To Yourself::    Having Gnus notice when people answer you.
11549 * Scoring Tips::             How to score effectively.
11550 * Reverse Scoring::          That problem child of old is not problem.
11551 * Global Score Files::       Earth-spanning, ear-splitting score files.
11552 * Kill Files::               They are still here, but they can be ignored.
11553 * Converting Kill Files::    Translating kill files to score files.
11554 * GroupLens::                Getting predictions on what you like to read.
11555 * Advanced Scoring::         Using logical expressions to build score rules.
11556 * Score Decays::             It can be useful to let scores wither away.
11557 @end menu
11558
11559
11560 @node Summary Score Commands
11561 @section Summary Score Commands
11562 @cindex score commands
11563
11564 The score commands that alter score entries do not actually modify real
11565 score files.  That would be too inefficient.  Gnus maintains a cache of
11566 previously loaded score files, one of which is considered the
11567 @dfn{current score file alist}.  The score commands simply insert
11568 entries into this list, and upon group exit, this list is saved.
11569
11570 The current score file is by default the group's local score file, even
11571 if no such score file actually exists.  To insert score commands into
11572 some other score file (e.g. @file{all.SCORE}), you must first make this
11573 score file the current one.
11574
11575 General score commands that don't actually change the score file:
11576
11577 @table @kbd
11578
11579 @item V s
11580 @kindex V s (Summary)
11581 @findex gnus-summary-set-score
11582 Set the score of the current article (@code{gnus-summary-set-score}).  
11583
11584 @item V S
11585 @kindex V S (Summary)
11586 @findex gnus-summary-current-score
11587 Display the score of the current article
11588 (@code{gnus-summary-current-score}).   
11589
11590 @item V t
11591 @kindex V t (Summary)
11592 @findex gnus-score-find-trace
11593 Display all score rules that have been used on the current article
11594 (@code{gnus-score-find-trace}).   
11595
11596 @item V R
11597 @kindex V R (Summary)
11598 @findex gnus-summary-rescore
11599 Run the current summary through the scoring process
11600 (@code{gnus-summary-rescore}).  This might be useful if you're playing
11601 around with your score files behind Gnus' back and want to see the
11602 effect you're having.
11603
11604 @item V a
11605 @kindex V a (Summary)
11606 @findex gnus-summary-score-entry
11607 Add a new score entry, and allow specifying all elements 
11608 (@code{gnus-summary-score-entry}).
11609
11610 @item V c
11611 @kindex V c (Summary)
11612 @findex gnus-score-change-score-file
11613 Make a different score file the current
11614 (@code{gnus-score-change-score-file}). 
11615
11616 @item V e
11617 @kindex V e (Summary)
11618 @findex gnus-score-edit-current-scores
11619 Edit the current score file (@code{gnus-score-edit-current-scores}).
11620 You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score
11621 File Editing}).
11622
11623 @item V f
11624 @kindex V f (Summary)
11625 @findex gnus-score-edit-file
11626 Edit a score file and make this score file the current one
11627 (@code{gnus-score-edit-file}).
11628
11629 @item V F
11630 @kindex V F (Summary)
11631 @findex gnus-score-flush-cache
11632 Flush the score cache (@code{gnus-score-flush-cache}).  This is useful
11633 after editing score files.
11634
11635 @item V C
11636 @kindex V C (Summary)
11637 @findex gnus-score-customize
11638 Customize a score file in a visually pleasing manner
11639 (@code{gnus-score-customize}). 
11640
11641 @end table
11642
11643 The rest of these commands modify the local score file.
11644
11645 @table @kbd
11646
11647 @item V m
11648 @kindex V m (Summary)
11649 @findex gnus-score-set-mark-below
11650 Prompt for a score, and mark all articles with a score below this as
11651 read (@code{gnus-score-set-mark-below}).
11652
11653 @item V x
11654 @kindex V x (Summary)
11655 @findex gnus-score-set-expunge-below
11656 Prompt for a score, and add a score rule to the current score file to
11657 expunge all articles below this score
11658 (@code{gnus-score-set-expunge-below}).
11659 @end table
11660
11661 The keystrokes for actually making score entries follow a very regular
11662 pattern, so there's no need to list all the commands.  (Hundreds of
11663 them.)  
11664
11665 @findex gnus-summary-increase-score
11666 @findex gnus-summary-lower-score
11667
11668 @enumerate
11669 @item
11670 The first key is either @kbd{I} (upper case i) for increasing the score
11671 or @kbd{L} for lowering the score. 
11672 @item
11673 The second key says what header you want to score on.  The following
11674 keys are available:
11675 @table @kbd
11676
11677 @item a
11678 Score on the author name.
11679
11680 @item s
11681 Score on the subject line.
11682
11683 @item x
11684 Score on the Xref line---i.e., the cross-posting line.
11685
11686 @item t
11687 Score on thread---the References line.
11688
11689 @item d
11690 Score on the date.
11691
11692 @item l
11693 Score on the number of lines.
11694
11695 @item i
11696 Score on the Message-ID.
11697
11698 @item f
11699 Score on followups.
11700
11701 @item b
11702 Score on the body.
11703
11704 @item h
11705 Score on the head.
11706 @end table
11707
11708 @item
11709 The third key is the match type.  Which match types are valid depends on
11710 what headers you are scoring on.
11711
11712 @table @code
11713
11714 @item strings 
11715
11716 @table @kbd
11717
11718 @item e
11719 Exact matching.
11720
11721 @item s
11722 Substring matching.
11723
11724 @item f
11725 Fuzzy matching (@pxref{Fuzzy Matching}).
11726
11727 @item r
11728 Regexp matching
11729 @end table
11730
11731 @item date
11732 @table @kbd
11733
11734 @item b
11735 Before date.
11736
11737 @item a
11738 At date.
11739
11740 @item n
11741 This date.
11742 @end table
11743
11744 @item number
11745 @table @kbd
11746
11747 @item <
11748 Less than number.
11749
11750 @item =
11751 Equal to number.
11752
11753 @item >
11754 Greater than number.
11755 @end table
11756 @end table
11757
11758 @item 
11759 The fourth and final key says whether this is a temporary (i.e., expiring)
11760 score entry, or a permanent (i.e., non-expiring) score entry, or whether
11761 it is to be done immediately, without adding to the score file.
11762 @table @kbd
11763
11764 @item t
11765 Temporary score entry.
11766
11767 @item p
11768 Permanent score entry.
11769
11770 @item i
11771 Immediately scoring.
11772 @end table
11773
11774 @end enumerate
11775
11776 So, let's say you want to increase the score on the current author with
11777 exact matching permanently: @kbd{I a e p}.  If you want to lower the
11778 score based on the subject line, using substring matching, and make a
11779 temporary score entry: @kbd{L s s t}.  Pretty easy.
11780
11781 To make things a bit more complicated, there are shortcuts.  If you use
11782 a capital letter on either the second or third keys, Gnus will use
11783 defaults for the remaining one or two keystrokes.  The defaults are
11784 ``substring'' and ``temporary''.  So @kbd{I A} is the same as @kbd{I a s
11785 t}, and @kbd{I a R} is the same as @kbd{I a r t}.
11786
11787 These functions take both the numerical prefix and the symbolic prefix
11788 (@pxref{Symbolic Prefixes}).  A numerical prefix says how much to lower
11789 (or increase) the score of the article.  A symbolic prefix of @code{a}
11790 says to use the @file{all.SCORE} file for the command instead of the
11791 current score file.
11792
11793 @vindex gnus-score-mimic-keymap
11794 The @code{gnus-score-mimic-keymap} says whether these commands will
11795 pretend they are keymaps or not.
11796
11797
11798 @node Group Score Commands
11799 @section Group Score Commands
11800 @cindex group score commands
11801
11802 There aren't many of these as yet, I'm afraid.
11803
11804 @table @kbd
11805
11806 @item W f
11807 @kindex W f (Group)
11808 @findex gnus-score-flush-cache
11809 Gnus maintains a cache of score alists to avoid having to reload them
11810 all the time.  This command will flush the cache
11811 (@code{gnus-score-flush-cache}). 
11812
11813 @end table
11814
11815
11816 @node Score Variables
11817 @section Score Variables
11818 @cindex score variables
11819
11820 @table @code
11821
11822 @item gnus-use-scoring
11823 @vindex gnus-use-scoring
11824 If @code{nil}, Gnus will not check for score files, and will not, in
11825 general, do any score-related work.  This is @code{t} by default.
11826
11827 @item gnus-kill-killed
11828 @vindex gnus-kill-killed
11829 If this variable is @code{nil}, Gnus will never apply score files to
11830 articles that have already been through the kill process.  While this
11831 may save you lots of time, it also means that if you apply a kill file
11832 to a group, and then change the kill file and want to run it over you
11833 group again to kill more articles, it won't work.  You have to set this
11834 variable to @code{t} to do that.  (It is @code{t} by default.)
11835
11836 @item gnus-kill-files-directory
11837 @vindex gnus-kill-files-directory
11838 All kill and score files will be stored in this directory, which is
11839 initialized from the @code{SAVEDIR} environment variable by default.
11840 This is @file{~/News/} by default.
11841
11842 @item gnus-score-file-suffix
11843 @vindex gnus-score-file-suffix
11844 Suffix to add to the group name to arrive at the score file name
11845 (@samp{SCORE} by default.)
11846
11847 @item gnus-score-uncacheable-files
11848 @vindex gnus-score-uncacheable-files
11849 @cindex score cache
11850 All score files are normally cached to avoid excessive re-loading of
11851 score files.  However, if this might make you Emacs grow big and
11852 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
11853 @file{all.SCORE}, while it might be a good idea to not cache
11854 @file{comp.infosystems.www.authoring.misc.ADAPT}.  In fact, this
11855 variable is @samp{ADAPT$} by default, so no adaptive score files will
11856 be cached.
11857
11858 @item gnus-save-score
11859 @vindex gnus-save-score
11860 If you have really complicated score files, and do lots of batch
11861 scoring, then you might set this variable to @code{t}.  This will make
11862 Gnus save the scores into the @file{.newsrc.eld} file.
11863
11864 @item gnus-score-interactive-default-score
11865 @vindex gnus-score-interactive-default-score
11866 Score used by all the interactive raise/lower commands to raise/lower
11867 score with.  Default is 1000, which may seem excessive, but this is to
11868 ensure that the adaptive scoring scheme gets enough room to play with.
11869 We don't want the small changes from the adaptive scoring to overwrite
11870 manually entered data.
11871
11872 @item gnus-summary-default-score
11873 @vindex gnus-summary-default-score
11874 Default score of an article, which is 0 by default.
11875
11876 @item gnus-summary-expunge-below
11877 @vindex gnus-summary-expunge-below
11878 Don't display the summary lines of articles that have scores lower than
11879 this variable.  This is @code{nil} by default, which means that no
11880 articles will be hidden.
11881
11882 @item gnus-score-over-mark
11883 @vindex gnus-score-over-mark
11884 Mark (in the third column) used for articles with a score over the
11885 default.  Default is @samp{+}.
11886
11887 @item gnus-score-below-mark
11888 @vindex gnus-score-below-mark
11889 Mark (in the third column) used for articles with a score below the
11890 default.  Default is @samp{-}.
11891
11892 @item gnus-score-find-score-files-function
11893 @vindex gnus-score-find-score-files-function
11894 Function used to find score files for the current group.  This function
11895 is called with the name of the group as the argument. 
11896
11897 Predefined functions available are:
11898 @table @code
11899
11900 @item gnus-score-find-single
11901 @findex gnus-score-find-single
11902 Only apply the group's own score file.
11903
11904 @item gnus-score-find-bnews
11905 @findex gnus-score-find-bnews
11906 Apply all score files that match, using bnews syntax.  This is the
11907 default.  If the current group is @samp{gnu.emacs.gnus}, for instance, 
11908 @file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and
11909 @file{gnu.all.SCORE} would all apply.  In short, the instances of
11910 @samp{all} in the score file names are translated into @samp{.*}, and
11911 then a regexp match is done.
11912
11913 This means that if you have some score entries that you want to apply to
11914 all groups, then you put those entries in the @file{all.SCORE} file. 
11915
11916 The score files are applied in a semi-random order, although Gnus will
11917 try to apply the more general score files before the more specific score
11918 files.  It does this by looking at the number of elements in the score
11919 file names---discarding the @samp{all} elements.
11920
11921 @item gnus-score-find-hierarchical
11922 @findex gnus-score-find-hierarchical
11923 Apply all score files from all the parent groups.  This means that you
11924 can't have score files like @file{all.SCORE}, but you can have
11925 @file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE}.
11926
11927 @end table
11928 This variable can also be a list of functions.  In that case, all these
11929 functions will be called, and all the returned lists of score files will
11930 be applied.  These functions can also return lists of score alists
11931 directly.  In that case, the functions that return these non-file score
11932 alists should probably be placed before the ``real'' score file
11933 functions, to ensure that the last score file returned is the local
11934 score file.  Phu.
11935
11936 @item gnus-score-expiry-days
11937 @vindex gnus-score-expiry-days
11938 This variable says how many days should pass before an unused score file
11939 entry is expired.  If this variable is @code{nil}, no score file entries
11940 are expired.  It's 7 by default.
11941
11942 @item gnus-update-score-entry-dates
11943 @vindex gnus-update-score-entry-dates
11944 If this variable is non-@code{nil}, matching score entries will have
11945 their dates updated.  (This is how Gnus controls expiry---all
11946 non-matching entries will become too old while matching entries will
11947 stay fresh and young.)  However, if you set this variable to @code{nil},
11948 even matching entries will grow old and will have to face that oh-so
11949 grim reaper.  
11950
11951 @item gnus-score-after-write-file-function
11952 @vindex gnus-score-after-write-file-function
11953 Function called with the name of the score file just written.
11954
11955 @end table
11956
11957
11958 @node Score File Format
11959 @section Score File Format
11960 @cindex score file format
11961
11962 A score file is an @code{emacs-lisp} file that normally contains just a
11963 single form.  Casual users are not expected to edit these files;
11964 everything can be changed from the summary buffer.
11965
11966 Anyway, if you'd like to dig into it yourself, here's an example:
11967
11968 @lisp
11969 (("from"
11970   ("Lars Ingebrigtsen" -10000)
11971   ("Per Abrahamsen")
11972   ("larsi\\|lmi" -50000 nil R))
11973  ("subject"
11974   ("Ding is Badd" nil 728373))
11975  ("xref"
11976   ("alt.politics" -1000 728372 s))
11977  ("lines"
11978   (2 -100 nil <))
11979  (mark 0)
11980  (expunge -1000)
11981  (mark-and-expunge -10)
11982  (read-only nil)
11983  (orphan -10)
11984  (adapt t)
11985  (files "/hom/larsi/News/gnu.SCORE")
11986  (exclude-files "all.SCORE")
11987  (local (gnus-newsgroup-auto-expire t)
11988         (gnus-summary-make-false-root empty))
11989  (eval (ding)))
11990 @end lisp
11991
11992 This example demonstrates most score file elements.  For a different
11993 approach, see @pxref{Advanced Scoring}.
11994
11995 Even though this looks much like lisp code, nothing here is actually
11996 @code{eval}ed.  The lisp reader is used to read this form, though, so it
11997 has to be valid syntactically, if not semantically.
11998
11999 Six keys are supported by this alist:
12000
12001 @table @code
12002
12003 @item STRING
12004 If the key is a string, it is the name of the header to perform the
12005 match on.  Scoring can only be performed on these eight headers:
12006 @code{From}, @code{Subject}, @code{References}, @code{Message-ID},
12007 @code{Xref}, @code{Lines}, @code{Chars} and @code{Date}.  In addition to
12008 these headers, there are three strings to tell Gnus to fetch the entire
12009 article and do the match on larger parts of the article: @code{Body}
12010 will perform the match on the body of the article, @code{Head} will
12011 perform the match on the head of the article, and @code{All} will
12012 perform the match on the entire article.  Note that using any of these
12013 last three keys will slow down group entry @emph{considerably}.  The
12014 final ``header'' you can score on is @code{Followup}.  These score
12015 entries will result in new score entries being added for all follow-ups
12016 to articles that matches these score entries.
12017
12018 Following this key is a arbitrary number of score entries, where each
12019 score entry has one to four elements.
12020 @enumerate
12021
12022 @item 
12023 The first element is the @dfn{match element}.  On most headers this will
12024 be a string, but on the Lines and Chars headers, this must be an
12025 integer. 
12026
12027 @item 
12028 If the second element is present, it should be a number---the @dfn{score
12029 element}.  This number should be an integer in the neginf to posinf
12030 interval.  This number is added to the score of the article if the match
12031 is successful.  If this element is not present, the
12032 @code{gnus-score-interactive-default-score} number will be used
12033 instead.  This is 1000 by default.
12034
12035 @item 
12036 If the third element is present, it should be a number---the @dfn{date
12037 element}.  This date says when the last time this score entry matched,
12038 which provides a mechanism for expiring the score entries.  It this
12039 element is not present, the score entry is permanent.  The date is
12040 represented by the number of days since December 31, 1 BCE.
12041
12042 @item 
12043 If the fourth element is present, it should be a symbol---the @dfn{type
12044 element}.  This element specifies what function should be used to see
12045 whether this score entry matches the article.  What match types that can
12046 be used depends on what header you wish to perform the match on.
12047 @table @dfn
12048
12049 @item From, Subject, References, Xref, Message-ID
12050 For most header types, there are the @code{r} and @code{R} (regexp), as
12051 well as @code{s} and @code{S} (substring) types, and @code{e} and
12052 @code{E} (exact match), and @code{w} (word match) types.  If this
12053 element is not present, Gnus will assume that substring matching should
12054 be used.  @code{R}, @code{S}, and @code{E} differ from the others in
12055 that the matches will be done in a case-sensitive manner.  All these
12056 one-letter types are really just abbreviations for the @code{regexp},
12057 @code{string}, @code{exact}, and @code{word} types, which you can use
12058 instead, if you feel like.
12059
12060 @item Lines, Chars
12061 These two headers use different match types: @code{<}, @code{>},
12062 @code{=}, @code{>=} and @code{<=}.  When matching on @code{Lines}, be
12063 careful because some backends (like @code{nndir}) do not generate
12064 @code{Lines} header, so every article ends up being marked as having 0
12065 lines.  This can lead to strange results if you happen to lower score of
12066 the articles with few lines.
12067
12068 @item Date
12069 For the Date header we have three kinda silly match types:
12070 @code{before}, @code{at} and @code{after}.  I can't really imagine this
12071 ever being useful, but, like, it would feel kinda silly not to provide
12072 this function.  Just in case.  You never know.  Better safe than sorry.
12073 Once burnt, twice shy.  Don't judge a book by its cover.  Never not have
12074 sex on a first date.  (I have been told that at least one person, and I
12075 quote, ``found this function indispensable'', however.)
12076
12077 @cindex ISO8601
12078 @cindex date
12079 A more useful match type is @code{regexp}.  With it, you can match the
12080 date string using a regular expression.  The date is normalized to
12081 ISO8601 compact format first---@var{YYYYMMDD}@code{T}@var{HHMMSS}.  If
12082 you want to match all articles that have been posted on April 1st in
12083 every year, you could use @samp{....0401.........} as a match string,
12084 for instance.  (Note that the date is kept in its original time zone, so
12085 this will match articles that were posted when it was April 1st where
12086 the article was posted from.  Time zones are such wholesome fun for the
12087 whole family, eh?)
12088
12089 @item Head, Body, All
12090 These three match keys use the same match types as the @code{From} (etc)
12091 header uses.
12092
12093 @item Followup
12094 This match key is somewhat special, in that it will match the
12095 @code{From} header, and affect the score of not only the matching
12096 articles, but also all followups to the matching articles.  This allows
12097 you e.g. increase the score of followups to your own articles, or
12098 decrease the score of followups to the articles of some known
12099 trouble-maker.  Uses the same match types as the @code{From} header
12100 uses.  (Using this match key will lead to creation of @file{ADAPT}
12101 files.) 
12102
12103 @item Thread
12104 This match key works along the same lines as the @code{Followup} match
12105 key.  If you say that you want to score on a (sub-)thread started by an article with a @code{Message-ID} @var{X}, then you add a
12106 @samp{thread} match.  This will add a new @samp{thread} match for each
12107 article that has @var{X} in its @code{References} header.  (These new
12108 @samp{thread} matches will use the @code{Message-ID}s of these matching
12109 articles.)  This will ensure that you can raise/lower the score of an
12110 entire thread, even though some articles in the thread may not have
12111 complete @code{References} headers.  Note that using this may lead to
12112 undeterministic scores of the articles in the thread.  (Using this match
12113 key will lead to creation of @file{ADAPT} files.)
12114 @end table
12115 @end enumerate
12116
12117 @cindex Score File Atoms
12118 @item mark
12119 The value of this entry should be a number.  Any articles with a score
12120 lower than this number will be marked as read.
12121
12122 @item expunge
12123 The value of this entry should be a number.  Any articles with a score
12124 lower than this number will be removed from the summary buffer.
12125
12126 @item mark-and-expunge
12127 The value of this entry should be a number.  Any articles with a score
12128 lower than this number will be marked as read and removed from the
12129 summary buffer.
12130
12131 @item thread-mark-and-expunge
12132 The value of this entry should be a number.  All articles that belong to
12133 a thread that has a total score below this number will be marked as read
12134 and removed from the summary buffer.  @code{gnus-thread-score-function}
12135 says how to compute the total score for a thread.
12136
12137 @item files
12138 The value of this entry should be any number of file names.  These files
12139 are assumed to be score files as well, and will be loaded the same way
12140 this one was.
12141
12142 @item exclude-files
12143 The clue of this entry should be any number of files.  These files will
12144 not be loaded, even though they would normally be so, for some reason or
12145 other. 
12146
12147 @item eval
12148 The value of this entry will be @code{eval}el.  This element will be
12149 ignored when handling global score files. 
12150
12151 @item read-only
12152 Read-only score files will not be updated or saved.  Global score files
12153 should feature this atom (@pxref{Global Score Files}).
12154
12155 @item orphan
12156 The value of this entry should be a number.  Articles that do not have
12157 parents will get this number added to their scores.  Imagine you follow
12158 some high-volume newsgroup, like @samp{comp.lang.c}.  Most likely you
12159 will only follow a few of the threads, also want to see any new threads.
12160
12161 You can do this with the following two score file entries:
12162
12163 @example
12164         (orphan -500)
12165         (mark-and-expunge -100)
12166 @end example
12167
12168 When you enter the group the first time, you will only see the new
12169 threads.  You then raise the score of the threads that you find
12170 interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) the
12171 rest.  Next time you enter the group, you will see new articles in the
12172 interesting threads, plus any new threads.
12173
12174 I.e.---the orphan score atom is for high-volume groups where there
12175 exist a few interesting threads which can't be found automatically by
12176 ordinary scoring rules.
12177
12178 @item adapt
12179 This entry controls the adaptive scoring.  If it is @code{t}, the
12180 default adaptive scoring rules will be used.  If it is @code{ignore}, no
12181 adaptive scoring will be performed on this group.  If it is a list, this
12182 list will be used as the adaptive scoring rules.  If it isn't present,
12183 or is something other than @code{t} or @code{ignore}, the default
12184 adaptive scoring rules will be used.  If you want to use adaptive
12185 scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to
12186 @code{t}, and insert an @code{(adapt ignore)} in the groups where you do
12187 not want adaptive scoring.  If you only want adaptive scoring in a few
12188 groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and
12189 insert @code{(adapt t)} in the score files of the groups where you want
12190 it. 
12191
12192 @item adapt-file
12193 All adaptive score entries will go to the file named by this entry.  It
12194 will also be applied when entering the group.  This atom might be handy
12195 if you want to adapt on several groups at once, using the same adaptive
12196 file for a number of groups.
12197
12198 @item local
12199 @cindex local variables
12200 The value of this entry should be a list of @code{(VAR VALUE)} pairs.
12201 Each @var{var} will be made buffer-local to the current summary buffer,
12202 and set to the value specified.  This is a convenient, if somewhat
12203 strange, way of setting variables in some groups if you don't like hooks
12204 much.  Note that the @var{value} won't be evaluated.
12205 @end table
12206
12207
12208 @node Score File Editing
12209 @section Score File Editing
12210
12211 You normally enter all scoring commands from the summary buffer, but you
12212 might feel the urge to edit them by hand as well, so we've supplied you
12213 with a mode for that.  
12214
12215 It's simply a slightly customized @code{emacs-lisp} mode, with these
12216 additional commands:
12217
12218 @table @kbd
12219
12220 @item C-c C-c
12221 @kindex C-c C-c (Score)
12222 @findex gnus-score-edit-done
12223 Save the changes you have made and return to the summary buffer
12224 (@code{gnus-score-edit-done}). 
12225
12226 @item C-c C-d
12227 @kindex C-c C-d (Score)
12228 @findex gnus-score-edit-insert-date
12229 Insert the current date in numerical format
12230 (@code{gnus-score-edit-insert-date}).  This is really the day number, if
12231 you were wondering.
12232
12233 @item C-c C-p
12234 @kindex C-c C-p (Score)
12235 @findex gnus-score-pretty-print
12236 The adaptive score files are saved in an unformatted fashion.  If you
12237 intend to read one of these files, you want to @dfn{pretty print} it
12238 first.  This command (@code{gnus-score-pretty-print}) does that for
12239 you. 
12240
12241 @end table
12242
12243 Type @kbd{M-x gnus-score-mode} to use this mode.
12244
12245 @vindex gnus-score-mode-hook
12246 @code{gnus-score-menu-hook} is run in score mode buffers.
12247
12248 In the summary buffer you can use commands like @kbd{V f} and @kbd{V
12249 e} to begin editing score files.
12250
12251
12252 @node Adaptive Scoring
12253 @section Adaptive Scoring
12254 @cindex adaptive scoring
12255
12256 If all this scoring is getting you down, Gnus has a way of making it all
12257 happen automatically---as if by magic.  Or rather, as if by artificial
12258 stupidity, to be precise.
12259
12260 @vindex gnus-use-adaptive-scoring
12261 When you read an article, or mark an article as read, or kill an
12262 article, you leave marks behind.  On exit from the group, Gnus can sniff
12263 these marks and add score elements depending on what marks it finds.
12264 You turn on this ability by setting @code{gnus-use-adaptive-scoring} to
12265 @code{t} or @code{(line)}.  If you want score adaptively on separate
12266 words appearing in the subjects, you should set this variable to
12267 @code{(word)}.  If you want to use both adaptive methods, set this
12268 variable to @code{(word line)}.
12269
12270 @vindex gnus-default-adaptive-score-alist
12271 To give you complete control over the scoring process, you can customize
12272 the @code{gnus-default-adaptive-score-alist} variable.  For instance, it
12273 might look something like this:
12274
12275 @lisp
12276 (defvar gnus-default-adaptive-score-alist
12277   '((gnus-unread-mark)
12278     (gnus-ticked-mark (from 4))
12279     (gnus-dormant-mark (from 5))
12280     (gnus-del-mark (from -4) (subject -1))
12281     (gnus-read-mark (from 4) (subject 2))
12282     (gnus-expirable-mark (from -1) (subject -1))
12283     (gnus-killed-mark (from -1) (subject -3))
12284     (gnus-kill-file-mark)
12285     (gnus-ancient-mark)
12286     (gnus-low-score-mark)
12287     (gnus-catchup-mark (from -1) (subject -1))))
12288 @end lisp
12289
12290 As you see, each element in this alist has a mark as a key (either a
12291 variable name or a ``real'' mark---a character).  Following this key is
12292 a arbitrary number of header/score pairs.  If there are no header/score
12293 pairs following the key, no adaptive scoring will be done on articles
12294 that have that key as the article mark.  For instance, articles with
12295 @code{gnus-unread-mark} in the example above will not get adaptive score
12296 entries.
12297
12298 Each article can have only one mark, so just a single of these rules
12299 will be applied to each article.
12300
12301 To take @code{gnus-del-mark} as an example---this alist says that all
12302 articles that have that mark (i.e., are marked with @samp{D}) will have a
12303 score entry added to lower based on the @code{From} header by -4, and
12304 lowered by @code{Subject} by -1.  Change this to fit your prejudices. 
12305
12306 If you have marked 10 articles with the same subject with
12307 @code{gnus-del-mark}, the rule for that mark will be applied ten times.
12308 That means that that subject will get a score of ten times -1, which
12309 should be, unless I'm much mistaken, -10.
12310
12311 If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), all
12312 the read articles will be marked with the @samp{E} mark.  This'll
12313 probably make adaptive scoring slightly impossible, so auto-expiring and
12314 adaptive scoring doesn't really mix very well.
12315
12316 The headers you can score on are @code{from}, @code{subject},
12317 @code{message-id}, @code{references}, @code{xref}, @code{lines},
12318 @code{chars} and @code{date}.  In addition, you can score on
12319 @code{followup}, which will create an adaptive score entry that matches
12320 on the @code{References} header using the @code{Message-ID} of the
12321 current article, thereby matching the following thread.  
12322
12323 You can also score on @code{thread}, which will try to score all
12324 articles that appear in a thread.  @code{thread} matches uses a
12325 @code{Message-ID} to match on the @code{References} header of the
12326 article.  If the match is made, the @code{Message-ID} of the article is
12327 added to the @code{thread} rule.  (Think about it.  I'd recommend two
12328 aspirins afterwards.)
12329
12330 If you use this scheme, you should set the score file atom @code{mark}
12331 to something small---like -300, perhaps, to avoid having small random
12332 changes result in articles getting marked as read.
12333
12334 After using adaptive scoring for a week or so, Gnus should start to
12335 become properly trained and enhance the authors you like best, and kill
12336 the authors you like least, without you having to say so explicitly. 
12337
12338 You can control what groups the adaptive scoring is to be performed on
12339 by using the score files (@pxref{Score File Format}).  This will also
12340 let you use different rules in different groups.
12341
12342 @vindex gnus-adaptive-file-suffix
12343 The adaptive score entries will be put into a file where the name is the
12344 group name with @code{gnus-adaptive-file-suffix} appended.  The default
12345 is @samp{ADAPT}.
12346
12347 @vindex gnus-score-exact-adapt-limit
12348 When doing adaptive scoring, substring or fuzzy matching would probably
12349 give you the best results in most cases.  However, if the header one
12350 matches is short, the possibility for false positives is great, so if
12351 the length of the match is less than
12352 @code{gnus-score-exact-adapt-limit}, exact matching will be used.  If
12353 this variable is @code{nil}, exact matching will always be used to avoid
12354 this problem.
12355
12356 @vindex gnus-default-adaptive-word-score-alist
12357 As mentioned above, you can adapt either on individual words or entire
12358 headers.  If you adapt on words, the
12359 @code{gnus-default-adaptive-word-score-alist} variable says what score
12360 each instance of a word should add given a mark.
12361
12362 @lisp
12363 (setq gnus-default-adaptive-word-score-alist  
12364       `((,gnus-read-mark . 30)
12365         (,gnus-catchup-mark . -10)
12366         (,gnus-killed-mark . -20)
12367         (,gnus-del-mark . -15)))
12368 @end lisp
12369
12370 This is the default value.  If you have adaption on words enabled, every
12371 word that appears in subjects of articles marked with
12372 @code{gnus-read-mark} will result in a score rule that increase the
12373 score with 30 points.
12374
12375 @vindex gnus-default-ignored-adaptive-words
12376 @vindex gnus-ignored-adaptive-words
12377 Words that appear in the @code{gnus-default-ignored-adaptive-words} list
12378 will be ignored.  If you wish to add more words to be ignored, use the
12379 @code{gnus-ignored-adaptive-words} list instead.
12380
12381 @vindex gnus-adaptive-word-syntax-table
12382 When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the
12383 syntax table in effect.  It is similar to the standard syntax table, but
12384 it considers numbers to be non-word-constituent characters.
12385
12386 After using this scheme for a while, it might be nice to write a
12387 @code{gnus-psychoanalyze-user} command to go through the rules and see
12388 what words you like and what words you don't like.  Or perhaps not.
12389
12390 Note that the adaptive word scoring thing is highly experimental and is
12391 likely to change in the future.  Initial impressions seem to indicate
12392 that it's totally useless as it stands.  Some more work (involving more
12393 rigorous statistical methods) will have to be done to make this useful. 
12394
12395
12396 @node Home Score File
12397 @section Home Score File
12398
12399 The score file where new score file entries will go is called the
12400 @dfn{home score file}.  This is normally (and by default) the score file
12401 for the group itself.  For instance, the home score file for
12402 @samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}.
12403
12404 However, this may not be what you want.  It is often convenient to share
12405 a common home score file among many groups---all @samp{emacs} groups
12406 could perhaps use the same home score file.
12407
12408 @vindex gnus-home-score-file
12409 The variable that controls this is @code{gnus-home-score-file}.  It can
12410 be:
12411
12412 @enumerate
12413 @item
12414 A string.  Then this file will be used as the home score file for all
12415 groups. 
12416
12417 @item
12418 A function. The result of this function will be used as the home score
12419 file.  The function will be called with the name of the group as the
12420 parameter. 
12421
12422 @item
12423 A list.  The elements in this list can be:
12424
12425 @enumerate
12426 @item 
12427 @var{(regexp file-name)}.  If the @var{regexp} matches the group name,
12428 the @var{file-name} will will be used as the home score file.
12429
12430 @item 
12431 A function. If the function returns non-nil, the result will be used as
12432 the home score file.
12433
12434 @item 
12435 A string.  Use the string as the home score file.
12436 @end enumerate
12437
12438 The list will be traversed from the beginning towards the end looking
12439 for matches.
12440
12441 @end enumerate
12442
12443 So, if you want to use just a single score file, you could say:
12444
12445 @lisp
12446 (setq gnus-home-score-file
12447       "my-total-score-file.SCORE")
12448 @end lisp
12449
12450 If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and
12451 @file{rec.SCORE} for all @samp{rec} groups (and so on), you can say:
12452
12453 @lisp
12454 (setq gnus-home-score-file
12455       'gnus-hierarchial-home-score-file)
12456 @end lisp
12457
12458 This is a ready-made function provided for your convenience.
12459
12460 If you want to have one score file for the @samp{emacs} groups and
12461 another for the @samp{comp} groups, while letting all other groups use
12462 their own home score files:
12463
12464 @lisp
12465 (setq gnus-home-score-file
12466       ;; All groups that match the regexp "\\.emacs"
12467       '("\\.emacs" "emacs.SCORE")
12468       ;; All the comp groups in one score file
12469        ("^comp" "comp.SCORE"))
12470 @end lisp
12471    
12472 @vindex gnus-home-adapt-file
12473 @code{gnus-home-adapt-file} works exactly the same way as
12474 @code{gnus-home-score-file}, but says what the home adaptive score file
12475 is instead.  All new adaptive file entries will go into the file
12476 specified by this variable, and the same syntax is allowed.
12477
12478 In addition to using @code{gnus-home-score-file} and
12479 @code{gnus-home-adapt-file}, you can also use group parameters
12480 (@pxref{Group Parameters}) and topic parameters (@pxref{Topic
12481 Parameters}) to achieve much the same.  Group and topic parameters take
12482 precedence over this variable.
12483
12484
12485 @node Followups To Yourself
12486 @section Followups To Yourself
12487
12488 Gnus offers two commands for picking out the @code{Message-ID} header in
12489 the current buffer.  Gnus will then add a score rule that scores using
12490 this @code{Message-ID} on the @code{References} header of other
12491 articles.  This will, in effect, increase the score of all articles that
12492 respond to the article in the current buffer.  Quite useful if you want
12493 to easily note when people answer what you've said.
12494
12495 @table @code
12496
12497 @item gnus-score-followup-article
12498 @findex gnus-score-followup-article
12499 This will add a score to articles that directly follow up your own
12500 article. 
12501
12502 @item gnus-score-followup-thread
12503 @findex gnus-score-followup-thread
12504 This will add a score to all articles that appear in a thread ``below''
12505 your own article.
12506 @end table
12507
12508 @vindex message-sent-hook
12509 These two functions are both primarily meant to be used in hooks like
12510 @code{message-sent-hook}.  
12511
12512 If you look closely at your own @code{Message-ID}, you'll notice that
12513 the first two or three characters are always the same.  Here's two of
12514 mine:  
12515
12516 @example
12517 <x6u3u47icf.fsf@@eyesore.no>
12518 <x6sp9o7ibw.fsf@@eyesore.no>
12519 @end example
12520
12521 So ``my'' ident on this machine is @samp{x6}.  This can be
12522 exploited---the following rule will raise the score on all followups to
12523 myself: 
12524
12525 @lisp
12526 ("references"
12527  ("<x6[0-9a-z]+\\.fsf\\(_-_\\)?@@.*eyesore.no>"
12528   1000 nil r))
12529 @end lisp
12530
12531 Whether it's the first two or first three characters that are ``yours''
12532 is system-dependent.
12533
12534
12535 @node Scoring Tips
12536 @section Scoring Tips
12537 @cindex scoring tips
12538
12539 @table @dfn
12540
12541 @item Crossposts
12542 @cindex crossposts
12543 @cindex scoring crossposts
12544 If you want to lower the score of crossposts, the line to match on is
12545 the @code{Xref} header.
12546 @lisp
12547 ("xref" (" talk.politics.misc:" -1000))
12548 @end lisp
12549
12550 @item Multiple crossposts
12551 If you want to lower the score of articles that have been crossposted to
12552 more than, say, 3 groups:
12553 @lisp
12554 ("xref" ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+" -1000 nil r))
12555 @end lisp
12556
12557 @item Matching on the body
12558 This is generally not a very good idea---it takes a very long time.
12559 Gnus actually has to fetch each individual article from the server.  But
12560 you might want to anyway, I guess.  Even though there are three match
12561 keys (@code{Head}, @code{Body} and @code{All}), you should choose one
12562 and stick with it in each score file.  If you use any two, each article
12563 will be fetched @emph{twice}.  If you want to match a bit on the
12564 @code{Head} and a bit on the @code{Body}, just use @code{All} for all
12565 the matches.  
12566
12567 @item Marking as read
12568 You will probably want to mark articles that has a score below a certain
12569 number as read.  This is most easily achieved by putting the following
12570 in your @file{all.SCORE} file:
12571 @lisp
12572 ((mark -100))
12573 @end lisp
12574 You may also consider doing something similar with @code{expunge}.  
12575
12576 @item Negated character classes
12577 If you say stuff like @code{[^abcd]*}, you may get unexpected results.
12578 That will match newlines, which might lead to, well, The Unknown.  Say
12579 @code{[^abcd\n]*} instead.
12580 @end table
12581
12582
12583 @node Reverse Scoring
12584 @section Reverse Scoring
12585 @cindex reverse scoring
12586
12587 If you want to keep just articles that have @samp{Sex with Emacs} in the
12588 subject header, and expunge all other articles, you could put something
12589 like this in your score file:
12590
12591 @lisp
12592 (("subject"
12593   ("Sex with Emacs" 2))
12594  (mark 1)
12595  (expunge 1))
12596 @end lisp
12597
12598 So, you raise all articles that match @samp{Sex with Emacs} and mark the
12599 rest as read, and expunge them to boot.
12600
12601
12602 @node Global Score Files
12603 @section Global Score Files
12604 @cindex global score files
12605
12606 Sure, other newsreaders have ``global kill files''.  These are usually
12607 nothing more than a single kill file that applies to all groups, stored
12608 in the user's home directory.  Bah!  Puny, weak newsreaders!
12609
12610 What I'm talking about here are Global Score Files.  Score files from
12611 all over the world, from users everywhere, uniting all nations in one
12612 big, happy score file union!  Ange-score!  New and untested!
12613
12614 @vindex gnus-global-score-files
12615 All you have to do to use other people's score files is to set the
12616 @code{gnus-global-score-files} variable.  One entry for each score file,
12617 or each score file directory.  Gnus will decide by itself what score
12618 files are applicable to which group.
12619
12620 Say you want to use the score file
12621 @file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} and
12622 all score files in the @file{/ftp@@ftp.some-where:/pub/score} directory:
12623
12624 @lisp
12625 (setq gnus-global-score-files
12626       '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE"
12627         "/ftp@@ftp.some-where:/pub/score/"))
12628 @end lisp
12629
12630 @findex gnus-score-search-global-directories
12631 Simple, eh?  Directory names must end with a @samp{/}.  These
12632 directories are typically scanned only once during each Gnus session.
12633 If you feel the need to manually re-scan the remote directories, you can
12634 use the @code{gnus-score-search-global-directories} command.
12635
12636 Note that, at present, using this option will slow down group entry
12637 somewhat.  (That is---a lot.)
12638
12639 If you want to start maintaining score files for other people to use,
12640 just put your score file up for anonymous ftp and announce it to the
12641 world.  Become a retro-moderator!  Participate in the retro-moderator
12642 wars sure to ensue, where retro-moderators battle it out for the
12643 sympathy of the people, luring them to use their score files on false
12644 premises!  Yay!  The net is saved!
12645
12646 Here are some tips for the would-be retro-moderator, off the top of my
12647 head: 
12648
12649 @itemize @bullet
12650
12651 @item 
12652 Articles heavily crossposted are probably junk. 
12653 @item
12654 To lower a single inappropriate article, lower by @code{Message-ID}.
12655 @item
12656 Particularly brilliant authors can be raised on a permanent basis. 
12657 @item
12658 Authors that repeatedly post off-charter for the group can safely be
12659 lowered out of existence.
12660 @item
12661 Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest
12662 articles completely.
12663
12664 @item 
12665 Use expiring score entries to keep the size of the file down.  You
12666 should probably have a long expiry period, though, as some sites keep
12667 old articles for a long time.
12668 @end itemize
12669
12670 ... I wonder whether other newsreaders will support global score files
12671 in the future.  @emph{Snicker}.  Yup, any day now, newsreaders like Blue
12672 Wave, xrn and 1stReader are bound to implement scoring.  Should we start
12673 holding our breath yet?
12674
12675
12676 @node Kill Files
12677 @section Kill Files
12678 @cindex kill files
12679
12680 Gnus still supports those pesky old kill files.  In fact, the kill file
12681 entries can now be expiring, which is something I wrote before Daniel
12682 Quinlan thought of doing score files, so I've left the code in there.
12683
12684 In short, kill processing is a lot slower (and I do mean @emph{a lot})
12685 than score processing, so it might be a good idea to rewrite your kill
12686 files into score files.
12687
12688 Anyway, a kill file is a normal @code{emacs-lisp} file.  You can put any
12689 forms into this file, which means that you can use kill files as some
12690 sort of primitive hook function to be run on group entry, even though
12691 that isn't a very good idea.
12692
12693 Normal kill files look like this:
12694
12695 @lisp
12696 (gnus-kill "From" "Lars Ingebrigtsen")
12697 (gnus-kill "Subject" "ding")
12698 (gnus-expunge "X")
12699 @end lisp
12700
12701 This will mark every article written by me as read, and remove the
12702 marked articles from the summary buffer.  Very useful, you'll agree.
12703
12704 Other programs use a totally different kill file syntax.  If Gnus
12705 encounters what looks like a @code{rn} kill file, it will take a stab at
12706 interpreting it. 
12707
12708 Two summary functions for editing a GNUS kill file:
12709
12710 @table @kbd
12711
12712 @item M-k
12713 @kindex M-k (Summary)
12714 @findex gnus-summary-edit-local-kill
12715 Edit this group's kill file (@code{gnus-summary-edit-local-kill}).
12716
12717 @item M-K
12718 @kindex M-K (Summary)
12719 @findex gnus-summary-edit-global-kill
12720 Edit the general kill file (@code{gnus-summary-edit-global-kill}).
12721 @end table
12722
12723 Two group mode functions for editing the kill files:
12724
12725 @table @kbd
12726
12727 @item M-k
12728 @kindex M-k (Group)
12729 @findex gnus-group-edit-local-kill
12730 Edit this group's kill file (@code{gnus-group-edit-local-kill}).
12731
12732 @item M-K
12733 @kindex M-K (Group)
12734 @findex gnus-group-edit-global-kill
12735 Edit the general kill file (@code{gnus-group-edit-global-kill}).
12736 @end table
12737
12738 Kill file variables:
12739
12740 @table @code
12741 @item gnus-kill-file-name
12742 @vindex gnus-kill-file-name
12743 A kill file for the group @samp{soc.motss} is normally called
12744 @file{soc.motss.KILL}.  The suffix appended to the group name to get
12745 this file name is detailed by the @code{gnus-kill-file-name} variable.
12746 The ``global'' kill file (not in the score file sense of ``global'', of
12747 course) is just called @file{KILL}.
12748
12749 @vindex gnus-kill-save-kill-file
12750 @item gnus-kill-save-kill-file
12751 If this variable is non-@code{nil}, Gnus will save the
12752 kill file after processing, which is necessary if you use expiring
12753 kills. 
12754
12755 @item gnus-apply-kill-hook
12756 @vindex gnus-apply-kill-hook
12757 @findex gnus-apply-kill-file-unless-scored
12758 @findex gnus-apply-kill-file
12759 A hook called to apply kill files to a group.  It is
12760 @code{(gnus-apply-kill-file)} by default.  If you want to ignore the
12761 kill file if you have a score file for the same group, you can set this
12762 hook to @code{(gnus-apply-kill-file-unless-scored)}.  If you don't want
12763 kill files to be processed, you should set this variable to @code{nil}.
12764
12765 @item gnus-kill-file-mode-hook
12766 @vindex gnus-kill-file-mode-hook
12767 A hook called in kill-file mode buffers.
12768
12769 @end table
12770
12771
12772 @node Converting Kill Files
12773 @section Converting Kill Files
12774 @cindex kill files
12775 @cindex converting kill files
12776
12777 If you have loads of old kill files, you may want to convert them into
12778 score files.  If they are ``regular'', you can use
12779 the @file{gnus-kill-to-score.el} package; if not, you'll have to do it
12780 by hand.
12781
12782 The kill to score conversion package isn't included in Gnus by default.
12783 You can fetch it from
12784 @file{http://www.ifi.uio.no/~larsi/ding-other/gnus-kill-to-score}.  
12785
12786 If your old kill files are very complex---if they contain more
12787 non-@code{gnus-kill} forms than not, you'll have to convert them by
12788 hand.  Or just let them be as they are.  Gnus will still use them as
12789 before. 
12790
12791
12792 @node GroupLens
12793 @section GroupLens
12794 @cindex GroupLens
12795
12796 GroupLens is a collaborative filtering system that helps you work
12797 together with other people to find the quality news articles out of the
12798 huge volume of news articles generated every day.
12799
12800 To accomplish this the GroupLens system combines your opinions about
12801 articles you have already read with the opinions of others who have done
12802 likewise and gives you a personalized prediction for each unread news
12803 article.  Think of GroupLens as a matchmaker.  GroupLens watches how you
12804 rate articles, and finds other people that rate articles the same way.
12805 Once it has found some people you agree with it tells you, in the form
12806 of a prediction, what they thought of the article.  You can use this
12807 prediction to help you decide whether or not you want to read the
12808 article.
12809
12810 @menu
12811 * Using GroupLens::          How to make Gnus use GroupLens.
12812 * Rating Articles::          Letting GroupLens know how you rate articles.
12813 * Displaying Predictions::   Displaying predictions given by GroupLens.
12814 * GroupLens Variables::      Customizing GroupLens.
12815 @end menu
12816
12817
12818 @node Using GroupLens
12819 @subsection Using GroupLens
12820
12821 To use GroupLens you must register a pseudonym with your local Better
12822 Bit Bureau (BBB).
12823 @samp{http://www.cs.umn.edu/Research/GroupLens/bbb.html} is the only
12824 better bit in town at the moment.
12825
12826 Once you have registered you'll need to set a couple of variables.
12827
12828 @table @code
12829
12830 @item gnus-use-grouplens
12831 @vindex gnus-use-grouplens
12832 Setting this variable to a non-@code{nil} value will make Gnus hook into
12833 all the relevant GroupLens functions.
12834
12835 @item grouplens-pseudonym
12836 @vindex grouplens-pseudonym
12837 This variable should be set to the pseudonym you got when registering
12838 with the Better Bit Bureau.
12839
12840 @item grouplens-newsgroups
12841 @vindex grouplens-newsgroups
12842 A list of groups that you want to get GroupLens predictions for. 
12843
12844 @end table
12845
12846 That's the minimum of what you need to get up and running with GroupLens.
12847 Once you've registered, GroupLens will start giving you scores for
12848 articles based on the average of what other people think.  But, to get
12849 the real benefit of GroupLens you need to start rating articles
12850 yourself.  Then the scores GroupLens gives you will be personalized for
12851 you, based on how the people you usually agree with have already rated.
12852
12853
12854 @node Rating Articles
12855 @subsection Rating Articles
12856
12857 In GroupLens, an article is rated on a scale from 1 to 5, inclusive.
12858 Where 1 means something like this article is a waste of bandwidth and 5
12859 means that the article was really good.  The basic question to ask
12860 yourself is, "on a scale from 1 to 5 would I like to see more articles
12861 like this one?"
12862
12863 There are four ways to enter a rating for an article in GroupLens.
12864
12865 @table @kbd
12866
12867 @item r
12868 @kindex r (GroupLens)
12869 @findex bbb-summary-rate-article
12870 This function will prompt you for a rating on a scale of one to five.
12871
12872 @item k
12873 @kindex k (GroupLens)
12874 @findex grouplens-score-thread
12875 This function will prompt you for a rating, and rate all the articles in
12876 the thread.  This is really useful for some of those long running giant
12877 threads in rec.humor.
12878
12879 @end table
12880
12881 The next two commands, @kbd{n} and @kbd{,} take a numerical prefix to be
12882 the score of the article you're reading.
12883
12884 @table @kbd
12885
12886 @item 1-5 n
12887 @kindex n (GroupLens)
12888 @findex grouplens-next-unread-article
12889 Rate the article and go to the next unread article.
12890
12891 @item 1-5 ,
12892 @kindex , (GroupLens)
12893 @findex grouplens-best-unread-article
12894 Rate the article and go to the next unread article with the highest score.
12895
12896 @end table
12897
12898 If you want to give the current article a score of 4 and then go to the
12899 next article, just type @kbd{4 n}.
12900
12901
12902 @node Displaying Predictions
12903 @subsection Displaying Predictions
12904
12905 GroupLens makes a prediction for you about how much you will like a
12906 news article.  The predictions from GroupLens are on a scale from 1 to
12907 5, where 1 is the worst and 5 is the best.  You can use the predictions
12908 from GroupLens in one of three ways controlled by the variable
12909 @code{gnus-grouplens-override-scoring}.
12910
12911 @vindex gnus-grouplens-override-scoring
12912 There are three ways to display predictions in grouplens.  You may
12913 choose to have the GroupLens scores contribute to, or override the
12914 regular gnus scoring mechanism. override is the default; however, some
12915 people prefer to see the Gnus scores plus the grouplens scores.  To get
12916 the separate scoring behavior you need to set
12917 @code{gnus-grouplens-override-scoring} to @code{'separate}.  To have the
12918 GroupLens predictions combined with the grouplens scores set it to
12919 @code{'override} and to combine the scores set
12920 @code{gnus-grouplens-override-scoring} to @code{'combine}.  When you use
12921 the combine option you will also want to set the values for
12922 @code{grouplens-prediction-offset} and
12923 @code{grouplens-score-scale-factor}.
12924
12925 @vindex grouplens-prediction-display
12926 In either case, GroupLens gives you a few choices for how you would like
12927 to see your predictions displayed.  The display of predictions is
12928 controlled by the @code{grouplens-prediction-display} variable.
12929
12930 The following are valid values for that variable.
12931
12932 @table @code
12933 @item prediction-spot
12934 The higher the prediction, the further to the right an @samp{*} is
12935 displayed. 
12936
12937 @item confidence-interval
12938 A numeric confidence interval.
12939
12940 @item prediction-bar
12941 The higher the prediction, the longer the bar.
12942
12943 @item confidence-bar
12944 Numerical confidence.
12945
12946 @item confidence-spot
12947 The spot gets bigger with more confidence.
12948
12949 @item prediction-num
12950 Plain-old numeric value.
12951
12952 @item confidence-plus-minus
12953 Prediction +/- confidence.
12954
12955 @end table
12956
12957
12958 @node GroupLens Variables
12959 @subsection GroupLens Variables
12960
12961 @table @code
12962
12963 @item gnus-summary-grouplens-line-format
12964 The summary line format used in GroupLens-enhanced summary buffers.  It
12965 accepts the same specs as the normal summary line format (@pxref{Summary
12966 Buffer Lines}).  The default is @samp{%U%R%z%l%I%(%[%4L: %-20,20n%]%)
12967 %s\n}.
12968
12969 @item grouplens-bbb-host
12970 Host running the bbbd server.  @samp{grouplens.cs.umn.edu} is the
12971 default.
12972
12973 @item grouplens-bbb-port
12974 Port of the host running the bbbd server.  The default is 9000.
12975
12976 @item grouplens-score-offset
12977 Offset the prediction by this value.  In other words, subtract the
12978 prediction value by this number to arrive at the effective score.  The
12979 default is 0.
12980
12981 @item grouplens-score-scale-factor 
12982 This variable allows the user to magnify the effect of GroupLens scores.
12983 The scale factor is applied after the offset.  The default is 1.
12984
12985 @end table
12986
12987
12988 @node Advanced Scoring
12989 @section Advanced Scoring
12990
12991 Scoring on Subjects and From headers is nice enough, but what if you're
12992 really interested in what a person has to say only when she's talking
12993 about a particular subject?  Or what if you really don't want to
12994 read what person A has to say when she's following up to person B, but
12995 want to read what she says when she's following up to person C?
12996
12997 By using advanced scoring rules you may create arbitrarily complex
12998 scoring patterns.
12999
13000 @menu
13001 * Advanced Scoring Syntax::     A definition.
13002 * Advanced Scoring Examples::   What they look like.
13003 * Advanced Scoring Tips::       Getting the most out of it.
13004 @end menu
13005
13006
13007 @node Advanced Scoring Syntax
13008 @subsection Advanced Scoring Syntax
13009
13010 Ordinary scoring rules have a string as the first element in the rule.
13011 Advanced scoring rules have a list as the first element.  The second
13012 element is the score to be applied if the first element evaluated to a
13013 non-@code{nil} value.
13014
13015 These lists may consist of three logical operators, one redirection
13016 operator, and various match operators.
13017
13018 Logical operators:
13019
13020 @table @code
13021 @item &
13022 @itemx and
13023 This logical operator will evaluate each of its arguments until it finds
13024 one that evaluates to @code{false}, and then it'll stop.  If all arguments
13025 evaluate to @code{true} values, then this operator will return
13026 @code{true}. 
13027
13028 @item |
13029 @itemx or
13030 This logical operator will evaluate each of its arguments until it finds
13031 one that evaluates to @code{true}.  If no arguments are @code{true},
13032 then this operator will return @code{false}.
13033
13034 @item !
13035 @itemx not
13036 @itemx Â¬
13037 This logical operator only takes a single argument.  It returns the
13038 logical negation of the value of its argument.
13039
13040 @end table
13041
13042 There is an @dfn{indirection operator} that will make its arguments
13043 apply to the ancestors of the current article being scored.  For
13044 instance, @code{1-} will make score rules apply to the parent of the
13045 current article.  @code{2-} will make score rules apply to the
13046 grandparent of the current article.  Alternatively, you can write
13047 @code{^^}, where the number of @code{^}s (carets) says how far back into
13048 the ancestry you want to go.
13049
13050 Finally, we have the match operators.  These are the ones that do the
13051 real work.  Match operators are header name strings followed by a match
13052 and a match type.  A typical match operator looks like @samp{("from"
13053 "Lars Ingebrigtsen" s)}.  The header names are the same as when using
13054 simple scoring, and the match types are also the same.
13055
13056
13057 @node Advanced Scoring Examples
13058 @subsection Advanced Scoring Examples
13059
13060 Let's say you want to increase the score of articles written by Lars
13061 when he's talking about Gnus:
13062
13063 @example
13064 ((& 
13065   ("from" "Lars Ingebrigtsen")
13066   ("subject" "Gnus"))
13067  1000)
13068 @end example
13069
13070 Quite simple, huh?
13071
13072 When he writes long articles, he sometimes has something nice to say: 
13073
13074 @example
13075 ((& 
13076   ("from" "Lars Ingebrigtsen")
13077   (|
13078    ("subject" "Gnus")
13079    ("lines" 100 >)))
13080  1000)
13081 @end example
13082
13083 However, when he responds to things written by Reig Eigil Logge, you
13084 really don't want to read what he's written:
13085
13086 @example
13087 ((&
13088   ("from" "Lars Ingebrigtsen")
13089   (1- ("from" "Reig Eigir Logge")))
13090  -100000)
13091 @end example
13092
13093 Everybody that follows up Redmondo when he writes about disappearing
13094 socks should have their scores raised, but only when they talk about
13095 white socks.  However, when Lars talks about socks, it's usually not
13096 very interesting:
13097
13098 @example
13099 ((&
13100   (1-
13101    (&
13102     ("from" "redmondo@@.*no" r)
13103     ("body" "disappearing.*socks" t)))
13104   (! ("from" "Lars Ingebrigtsen"))
13105   ("body" "white.*socks"))
13106  1000)
13107 @end example
13108
13109 The possibilities are endless.
13110
13111
13112 @node Advanced Scoring Tips
13113 @subsection Advanced Scoring Tips
13114
13115 The @code{&} and @code{|} logical operators do short-circuit logic.
13116 That is, they stop processing their arguments when it's clear what the
13117 result of the operation will be.  For instance, if one of the arguments
13118 of an @code{&} evaluates to @code{false}, there's no point in evaluating
13119 the rest of the arguments.  This means that you should put slow matches
13120 (@samp{body}, @samp{header}) last and quick matches (@samp{from},
13121 @samp{subject}) first.
13122
13123 The indirection arguments (@code{1-} and so on) will make their
13124 arguments work on previous generations of the thread.  If you say
13125 something like:
13126
13127 @example
13128 ...
13129 (1-
13130  (1-
13131   ("from" "lars")))
13132 ...
13133 @end example
13134
13135 Then that means "score on the from header of the grandparent of the
13136 current article".  An indirection is quite fast, but it's better to say:
13137
13138 @example
13139 (1-
13140  (& 
13141   ("from" "Lars")
13142   ("subject" "Gnus")))
13143 @end example
13144
13145 than it is to say:
13146
13147 @example
13148 (&
13149  (1- ("from" "Lars"))
13150  (1- ("subject" "Gnus")))
13151 @end example
13152
13153
13154 @node Score Decays
13155 @section Score Decays
13156 @cindex score decays
13157 @cindex decays
13158
13159 You may find that your scores have a tendency to grow without
13160 bounds, especially if you're using adaptive scoring.  If scores get too
13161 big, they lose all meaning---they simply max out and it's difficult to
13162 use them in any sensible way.
13163
13164 @vindex gnus-decay-scores
13165 @findex gnus-decay-score
13166 @vindex gnus-score-decay-function
13167 Gnus provides a mechanism for decaying scores to help with this problem.
13168 When score files are loaded and @code{gnus-decay-scores} is
13169 non-@code{nil}, Gnus will run the score files through the decaying
13170 mechanism thereby lowering the scores of all non-permanent score rules.
13171 The decay itself if performed by the @code{gnus-score-decay-function}
13172 function, which is @code{gnus-decay-score} by default.  Here's the
13173 definition of that function:
13174
13175 @lisp
13176 (defun gnus-decay-score (score)
13177   "Decay SCORE according to `gnus-score-decay-constant' and `gnus-score-decay-scale'."
13178   (floor
13179    (- score
13180       (* (if (< score 0) 1 -1)
13181          (min (abs score)
13182               (max gnus-score-decay-constant
13183                    (* (abs score)
13184                       gnus-score-decay-scale)))))))
13185 @end lisp
13186
13187 @vindex gnus-score-decay-scale
13188 @vindex gnus-score-decay-constant
13189 @code{gnus-score-decay-constant} is 3 by default and
13190 @code{gnus-score-decay-scale} is 0.05.  This should cause the following:
13191
13192 @enumerate
13193 @item
13194 Scores between -3 and 3 will be set to 0 when this function is called.
13195
13196 @item
13197 Scores with magnitudes between 3 and 60 will be shrunk by 3.
13198
13199 @item
13200 Scores with magnitudes greater than 60 will be shrunk by 5% of the
13201 score.
13202 @end enumerate
13203
13204 If you don't like this decay function, write your own.  It is called
13205 with the score to be decayed as its only parameter, and it should return
13206 the new score, which should be an integer.
13207
13208 Gnus will try to decay scores once a day.  If you haven't run Gnus for
13209 four days, Gnus will decay the scores four times, for instance.
13210
13211
13212 @node Various
13213 @chapter Various
13214
13215 @menu
13216 * Process/Prefix::             A convention used by many treatment commands.
13217 * Interactive::                Making Gnus ask you many questions.
13218 * Symbolic Prefixes::          How to supply some Gnus functions with options.
13219 * Formatting Variables::       You can specify what buffers should look like.
13220 * Windows Configuration::      Configuring the Gnus buffer windows.
13221 * Compilation::                How to speed Gnus up.
13222 * Mode Lines::                 Displaying information in the mode lines.
13223 * Highlighting and Menus::     Making buffers look all nice and cozy.
13224 * Buttons::                    Get tendonitis in ten easy steps!
13225 * Daemons::                    Gnus can do things behind your back.
13226 * NoCeM::                      How to avoid spam and other fatty foods.
13227 * Undo::                       Some actions can be undone.
13228 * Moderation::                 What to do if you're a moderator.
13229 * XEmacs Enhancements::        There are more pictures and stuff under XEmacs.
13230 * Fuzzy Matching::             What's the big fuzz?
13231 * Thwarting Email Spam::       A how-to on avoiding unsolited commercial email.
13232 * Various Various::            Things that are really various.
13233 @end menu
13234
13235
13236 @node Process/Prefix
13237 @section Process/Prefix
13238 @cindex process/prefix convention
13239
13240 Many functions, among them functions for moving, decoding and saving
13241 articles, use what is known as the @dfn{Process/Prefix convention}.
13242
13243 This is a method for figuring out what articles the user wants the
13244 command to be performed on.
13245
13246 It goes like this:
13247
13248 If the numeric prefix is N, perform the operation on the next N
13249 articles, starting with the current one.  If the numeric prefix is
13250 negative, perform the operation on the previous N articles, starting
13251 with the current one.
13252
13253 @vindex transient-mark-mode
13254 If @code{transient-mark-mode} in non-@code{nil} and the region is
13255 active, all articles in the region will be worked upon.
13256
13257 If there is no numeric prefix, but some articles are marked with the
13258 process mark, perform the operation on the articles marked with
13259 the process mark.
13260
13261 If there is neither a numeric prefix nor any articles marked with the
13262 process mark, just perform the operation on the current article.
13263
13264 Quite simple, really, but it needs to be made clear so that surprises
13265 are avoided.
13266
13267 Commands that react to the process mark will push the current list of
13268 process marked articles onto a stack and will then clear all process
13269 marked articles.  You can restore the previous configuration with the
13270 @kbd{M P y} command (@pxref{Setting Process Marks}).
13271
13272 @vindex gnus-summary-goto-unread
13273 One thing that seems to shock & horrify lots of people is that, for
13274 instance, @kbd{3 d} does exactly the same as @kbd{d} @kbd{d} @kbd{d}.
13275 Since each @kbd{d} (which marks the current article as read) by default
13276 goes to the next unread article after marking, this means that @kbd{3 d}
13277 will mark the next three unread articles as read, no matter what the
13278 summary buffer looks like.  Set @code{gnus-summary-goto-unread} to
13279 @code{nil} for a more straightforward action.
13280
13281
13282 @node Interactive
13283 @section Interactive
13284 @cindex interaction
13285
13286 @table @code
13287
13288 @item gnus-novice-user
13289 @vindex gnus-novice-user
13290 If this variable is non-@code{nil}, you are either a newcomer to the
13291 World of Usenet, or you are very cautious, which is a nice thing to be,
13292 really.  You will be given questions of the type ``Are you sure you want
13293 to do this?'' before doing anything dangerous.  This is @code{t} by
13294 default.
13295
13296 @item gnus-expert-user
13297 @vindex gnus-expert-user
13298 If this variable is non-@code{nil}, you will never ever be asked any
13299 questions by Gnus.  It will simply assume you know what you're doing, no
13300 matter how strange.
13301
13302 @item gnus-interactive-catchup
13303 @vindex gnus-interactive-catchup
13304 Require confirmation before catching up a group if non-@code{nil}.  It
13305 is @code{t} by default.
13306
13307 @item gnus-interactive-exit
13308 @vindex gnus-interactive-exit
13309 Require confirmation before exiting Gnus.  This variable is @code{t} by
13310 default. 
13311 @end table
13312
13313
13314 @node Symbolic Prefixes
13315 @section Symbolic Prefixes
13316 @cindex symbolic prefixes
13317
13318 Quite a lot of Emacs commands react to the (numeric) prefix.  For
13319 instance, @kbd{C-u 4 C-f} moves point four charaters forward, and
13320 @kbd{C-u 9 0 0 I s s p} adds a permanent @code{Subject} substring score
13321 rule of 900 to the current article.
13322
13323 This is all nice and well, but what if you want to give a command some
13324 additional information?  Well, what most commands do is interpret the
13325 ``raw'' prefix in some special way.  @kbd{C-u 0 C-x C-s} means that one
13326 doesn't want a backup file to be created when saving the current buffer,
13327 for instance.  But what if you want to save without making a backup
13328 file, and you want Emacs to flash lights and play a nice tune at the
13329 same time?  You can't, and you're probably perfectly happy that way.
13330
13331 @kindex M-i (Summary)
13332 @findex gnus-symbolic-argument
13333 I'm not, so I've added a second prefix---the @dfn{symbolic prefix}.  The
13334 prefix key is @kbd{M-i} (@code{gnus-symbolic-argument}), and the next
13335 character typed in is the value.  You can stack as many @kbd{M-i}
13336 prefixes as you want.  @kbd{M-i a M-C-u} means ``feed the @kbd{M-C-u}
13337 command the symbolic prefix @code{a}''.  @kbd{M-i a M-i b M-C-u} means
13338 ``feed the @kbd{M-C-u} command the symbolic prefixes @code{a} and
13339 @code{b}''.  You get the drift.
13340
13341 Typing in symbolic prefixes to commands that don't accept them doesn't
13342 hurt, but it doesn't do any good either.  Currently not many Gnus
13343 functions make use of the symbolic prefix.
13344
13345 If you're interested in how Gnus implements this, @pxref{Extended
13346 Interactive}.
13347
13348
13349 @node Formatting Variables
13350 @section Formatting Variables
13351 @cindex formatting variables
13352
13353 Throughout this manual you've probably noticed lots of variables called things like @code{gnus-group-line-format} and
13354 @code{gnus-summary-mode-line-format}.  These control how Gnus is to
13355 output lines in the various buffers.  There's quite a lot of them.
13356 Fortunately, they all use the same syntax, so there's not that much to
13357 be annoyed by.
13358
13359 Here's an example format spec (from the group buffer): @samp{%M%S%5y:
13360 %(%g%)\n}.  We see that it is indeed extremely ugly, and that there are
13361 lots of percentages everywhere.  
13362
13363 @menu 
13364 * Formatting Basics::     A formatting variable is basically a format string.
13365 * Advanced Formatting::   Modifying output in various ways.
13366 * User-Defined Specs::    Having Gnus call your own functions.
13367 * Formatting Fonts::      Making the formatting look colorful and nice.
13368 @end menu
13369
13370 Currently Gnus uses the following formatting variables:
13371 @code{gnus-group-line-format}, @code{gnus-summary-line-format},
13372 @code{gnus-server-line-format}, @code{gnus-topic-line-format},
13373 @code{gnus-group-mode-line-format},
13374 @code{gnus-summary-mode-line-format},
13375 @code{gnus-article-mode-line-format},
13376 @code{gnus-server-mode-line-format}, and
13377 @code{gnus-summary-pick-line-format}.
13378
13379 All these format variables can also be arbitrary elisp forms.  In that
13380 case, they will be @code{eval}ed to insert the required lines.
13381
13382 @kindex M-x gnus-update-format
13383 @findex gnus-update-format
13384 Gnus includes a command to help you while creating your own format
13385 specs.  @kbd{M-x gnus-update-format} will @code{eval} the current form,
13386 update the spec in question and pop you to a buffer where you can
13387 examine the resulting lisp code to be run to generate the line.  
13388
13389
13390
13391 @node Formatting Basics
13392 @subsection Formatting Basics
13393
13394 Each @samp{%} element will be replaced by some string or other when the
13395 buffer in question is generated.  @samp{%5y} means ``insert the @samp{y}
13396 spec, and pad with spaces to get a 5-character field''.
13397
13398 As with normal C and Emacs Lisp formatting strings, the numerical
13399 modifier between the @samp{%} and the formatting type character will
13400 @dfn{pad} the output so that it is always at least that long.
13401 @samp{%5y} will make the field always (at least) five characters wide by
13402 padding with spaces to the left.  If you say @samp{%-5y}, it will pad to
13403 the right instead.
13404
13405 You may also wish to limit the length of the field to protect against
13406 particularly wide values.  For that you can say @samp{%4,6y}, which
13407 means that the field will never be more than 6 characters wide and never
13408 less than 4 characters wide.
13409
13410
13411 @node Advanced Formatting
13412 @subsection Advanced Formatting
13413
13414 It is frequently useful to post-process the fields in some way.
13415 Padding, limiting, cutting off parts and suppressing certain values can
13416 be achieved by using @dfn{tilde modifiers}.  A typical tilde spec might
13417 look like @samp{%~(cut 3)~(ignore "0")y}.
13418
13419 These are the valid modifiers:
13420
13421 @table @code
13422 @item pad
13423 @itemx pad-left
13424 Pad the field to the left with spaces until it reaches the required
13425 length.
13426
13427 @item pad-right
13428 Pad the field to the right with spaces until it reaches the required
13429 length.
13430
13431 @item max
13432 @itemx max-left
13433 Cut off characters from the left until it reaches the specified length.
13434
13435 @item max-right
13436 Cut off characters from the right until it reaches the specified
13437 length. 
13438
13439 @item cut
13440 @itemx cut-left
13441 Cut off the specified number of characters from the left.
13442
13443 @item cut-right
13444 Cut off the specified number of characters from the right.
13445
13446 @item ignore
13447 Return an empty string if the field is equal to the specified value. 
13448
13449 @item form
13450 Use the specified form as the field value when the @samp{@@} spec is
13451 used. 
13452 @end table
13453
13454 Let's take an example.  The @samp{%o} spec in the summary mode lines
13455 will return a date in compact ISO8601 format---@samp{19960809T230410}.
13456 This is quite a mouthful, so we want to shave off the century number and
13457 the time, leaving us with a six-character date.  That would be
13458 @samp{%~(cut-left 2)~(max-right 6)~(pad 6)o}.  (Cutting is done before
13459 maxing, and we need the padding to ensure that the date is never less
13460 than 6 characters to make it look nice in columns.)
13461
13462 Ignoring is done first; then cutting; then maxing; and then as the very
13463 last operation, padding.  
13464
13465 If you use lots of these advanced thingies, you'll find that Gnus gets
13466 quite slow.  This can be helped enormously by running @kbd{M-x
13467 gnus-compile} when you are satisfied with the look of your lines.
13468 @xref{Compilation}. 
13469
13470
13471 @node User-Defined Specs
13472 @subsection User-Defined Specs
13473
13474 All the specs allow for inserting user defined specifiers---@samp{u}.
13475 The next character in the format string should be a letter.  Gnus
13476 will call the function @code{gnus-user-format-function-}@samp{X}, where
13477 @samp{X} is the letter following @samp{%u}.  The function will be passed
13478 a single parameter---what the parameter means depends on what buffer
13479 it's being called from.  The function should return a string, which will
13480 be inserted into the buffer just like information from any other
13481 specifier.  This function may also be called with dummy values, so it
13482 should protect against that.
13483
13484 You can also use tilde modifiers (@pxref{Advanced Formatting} to achieve
13485 much the same without defining new functions.  Here's an example:
13486 @samp{%~(form (count-lines (point-min) (point)))@@}.  The form
13487 given here will be evaluated to yield the current line number, and then
13488 inserted.
13489
13490
13491 @node Formatting Fonts
13492 @subsection Formatting Fonts
13493
13494 There are specs for highlighting, and these are shared by all the format
13495 variables.  Text inside the @samp{%(} and @samp{%)} specifiers will get
13496 the special @code{mouse-face} property set, which means that it will be
13497 highlighted (with @code{gnus-mouse-face}) when you put the mouse pointer
13498 over it.
13499
13500 Text inside the @samp{%[} and @samp{%]} specifiers will have their
13501 normal faces set using @code{gnus-face-0}, which is @code{bold} by
13502 default.  If you say @samp{%1[}, you'll get @code{gnus-face-1} instead,
13503 and so on.  Create as many faces as you wish.  The same goes for the
13504 @code{mouse-face} specs---you can say @samp{%3(hello%)} to have
13505 @samp{hello} mouse-highlighted with @code{gnus-mouse-face-3}.
13506
13507 Here's an alternative recipe for the group buffer:
13508
13509 @lisp
13510 ;; Create three face types.
13511 (setq gnus-face-1 'bold)
13512 (setq gnus-face-3 'italic)
13513
13514 ;; We want the article count to be in 
13515 ;; a bold and green face.  So we create 
13516 ;; a new face called `my-green-bold'.
13517 (copy-face 'bold 'my-green-bold)
13518 ;; Set the color.
13519 (set-face-foreground 'my-green-bold "ForestGreen")
13520 (setq gnus-face-2 'my-green-bold)
13521
13522 ;; Set the new & fancy format.
13523 (setq gnus-group-line-format 
13524       "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n")
13525 @end lisp
13526
13527 I'm sure you'll be able to use this scheme to create totally unreadable
13528 and extremely vulgar displays.  Have fun!
13529
13530 Note that the @samp{%(} specs (and friends) do not make any sense on the
13531 mode-line variables.
13532
13533
13534 @node Windows Configuration
13535 @section Windows Configuration
13536 @cindex windows configuration
13537
13538 No, there's nothing here about X, so be quiet.
13539
13540 @vindex gnus-use-full-window
13541 If @code{gnus-use-full-window} non-@code{nil}, Gnus will delete all
13542 other windows and occupy the entire Emacs screen by itself.  It is
13543 @code{t} by default.
13544
13545 @vindex gnus-buffer-configuration
13546 @code{gnus-buffer-configuration} describes how much space each Gnus
13547 buffer should be given.  Here's an excerpt of this variable:
13548
13549 @lisp
13550 ((group (vertical 1.0 (group 1.0 point)
13551                       (if gnus-carpal (group-carpal 4))))
13552  (article (vertical 1.0 (summary 0.25 point) 
13553                         (article 1.0))))
13554 @end lisp
13555
13556 This is an alist.  The @dfn{key} is a symbol that names some action or
13557 other.  For instance, when displaying the group buffer, the window
13558 configuration function will use @code{group} as the key.  A full list of
13559 possible names is listed below.
13560
13561 The @dfn{value} (i.e., the @dfn{split}) says how much space each buffer
13562 should occupy.  To take the @code{article} split as an example -
13563
13564 @lisp
13565 (article (vertical 1.0 (summary 0.25 point)
13566                        (article 1.0)))
13567 @end lisp
13568
13569 This @dfn{split} says that the summary buffer should occupy 25% of upper
13570 half of the screen, and that it is placed over the article buffer.  As
13571 you may have noticed, 100% + 25% is actually 125% (yup, I saw y'all
13572 reaching for that calculator there).  However, the special number
13573 @code{1.0} is used to signal that this buffer should soak up all the
13574 rest of the space available after the rest of the buffers have taken
13575 whatever they need.  There should be only one buffer with the @code{1.0}
13576 size spec per split.
13577
13578 Point will be put in the buffer that has the optional third element
13579 @code{point}. 
13580
13581 Here's a more complicated example:
13582
13583 @lisp
13584 (article (vertical 1.0 (group 4)
13585                        (summary 0.25 point)
13586                        (if gnus-carpal (summary-carpal 4))
13587                        (article 1.0)))
13588 @end lisp
13589
13590 If the size spec is an integer instead of a floating point number, 
13591 then that number will be used to say how many lines a buffer should
13592 occupy, not a percentage.
13593
13594 If the @dfn{split} looks like something that can be @code{eval}ed (to be
13595 precise---if the @code{car} of the split is a function or a subr), this
13596 split will be @code{eval}ed.  If the result is non-@code{nil}, it will
13597 be used as a split.  This means that there will be three buffers if
13598 @code{gnus-carpal} is @code{nil}, and four buffers if @code{gnus-carpal}
13599 is non-@code{nil}.
13600
13601 Not complicated enough for you?  Well, try this on for size:
13602
13603 @lisp
13604 (article (horizontal 1.0 
13605              (vertical 0.5
13606                  (group 1.0)
13607                  (gnus-carpal 4))
13608              (vertical 1.0
13609                  (summary 0.25 point)
13610                  (summary-carpal 4)
13611                  (article 1.0))))
13612 @end lisp
13613
13614 Whoops.  Two buffers with the mystery 100% tag.  And what's that
13615 @code{horizontal} thingie?  
13616
13617 If the first element in one of the split is @code{horizontal}, Gnus will
13618 split the window horizontally, giving you two windows side-by-side.
13619 Inside each of these strips you may carry on all you like in the normal
13620 fashion.  The number following @code{horizontal} says what percentage of
13621 the screen is to be given to this strip.
13622
13623 For each split, there @emph{must} be one element that has the 100% tag.
13624 The splitting is never accurate, and this buffer will eat any leftover
13625 lines from the splits.
13626
13627 To be slightly more formal, here's a definition of what a valid split
13628 may look like:
13629
13630 @example
13631 split       = frame | horizontal | vertical | buffer | form
13632 frame       = "(frame " size *split ")"
13633 horizontal  = "(horizontal " size *split ")"
13634 vertical    = "(vertical " size *split ")"
13635 buffer      = "(" buffer-name " " size *[ "point" ] ")"
13636 size        = number | frame-params
13637 buffer-name = group | article | summary ...
13638 @end example
13639
13640 The limitations are that the @code{frame} split can only appear as the
13641 top-level split.  @var{form} should be an Emacs Lisp form that should
13642 return a valid split.  We see that each split is fully recursive, and
13643 may contain any number of @code{vertical} and @code{horizontal} splits. 
13644
13645 @vindex gnus-window-min-width
13646 @vindex gnus-window-min-height
13647 @cindex window height
13648 @cindex window width
13649 Finding the right sizes can be a bit complicated.  No window may be less
13650 than @code{gnus-window-min-height} (default 1) characters high, and all
13651 windows must be at least @code{gnus-window-min-width} (default 1)
13652 characters wide.  Gnus will try to enforce this before applying the
13653 splits.  If you want to use the normal Emacs window width/height limit,
13654 you can just set these two variables to @code{nil}.
13655
13656 If you're not familiar with Emacs terminology, @code{horizontal} and
13657 @code{vertical} splits may work the opposite way of what you'd expect.
13658 Windows inside a @code{horizontal} split are shown side-by-side, and
13659 windows within a @code{vertical} split are shown above each other.
13660
13661 @findex gnus-configure-frame
13662 If you want to experiment with window placement, a good tip is to call
13663 @code{gnus-configure-frame} directly with a split.  This is the function
13664 that does all the real work when splitting buffers.  Below is a pretty
13665 nonsensical configuration with 5 windows; two for the group buffer and
13666 three for the article buffer.  (I said it was nonsensical.)  If you
13667 @code{eval} the statement below, you can get an idea of how that would
13668 look straight away, without going through the normal Gnus channels.
13669 Play with it until you're satisfied, and then use
13670 @code{gnus-add-configuration} to add your new creation to the buffer
13671 configuration list. 
13672
13673 @lisp
13674 (gnus-configure-frame
13675  '(horizontal 1.0
13676     (vertical 10
13677       (group 1.0)
13678       (article 0.3 point))
13679     (vertical 1.0
13680       (article 1.0)
13681       (horizontal 4
13682         (group 1.0)
13683         (article 10)))))
13684 @end lisp
13685
13686 You might want to have several frames as well.  No prob---just use the
13687 @code{frame} split:
13688
13689 @lisp
13690 (gnus-configure-frame
13691  '(frame 1.0
13692          (vertical 1.0
13693                    (summary 0.25 point)
13694                    (article 1.0))
13695          (vertical ((height . 5) (width . 15)
13696                     (user-position . t)
13697                     (left . -1) (top . 1))
13698                    (picon 1.0))))
13699
13700 @end lisp
13701
13702 This split will result in the familiar summary/article window
13703 configuration in the first (or ``main'') frame, while a small additional
13704 frame will be created where picons will be shown.  As you can see,
13705 instead of the normal @code{1.0} top-level spec, each additional split
13706 should have a frame parameter alist as the size spec.
13707 @xref{Frame Parameters, , Frame Parameters, elisp, The GNU Emacs Lisp
13708 Reference Manual}.  Under XEmacs, a frame property list will be
13709 accepted, too---for instance, @code{(height 5 width 15 left -1 top 1)}
13710 is such a plist.
13711
13712 Here's a list of all possible keys for
13713 @code{gnus-buffer-configuration}:
13714
13715 @code{group}, @code{summary}, @code{article}, @code{server},
13716 @code{browse}, @code{message}, @code{pick}, @code{info},
13717 @code{summary-faq}, @code{edit-group}, @code{edit-server},
13718 @code{edit-score}, @code{post}, @code{reply}, @code{forward},
13719 @code{reply-yank}, @code{mail-bounce}, @code{draft}, @code{pipe},
13720 @code{bug}, @code{compose-bounce}, and @code{score-trace}.
13721
13722 Note that the @code{message} key is used for both
13723 @code{gnus-group-mail} and @code{gnus-summary-mail-other-window}.  If
13724 it is desirable to distinguish between the two, something like this
13725 might be used:
13726
13727 @lisp
13728 (message (horizontal 1.0
13729                      (vertical 1.0 (message 1.0 point))
13730                      (vertical 0.24
13731                                (if (buffer-live-p gnus-summary-buffer)
13732                                    '(summary 0.5))
13733                                (group 1.0)))))
13734 @end lisp
13735
13736 @findex gnus-add-configuration
13737 Since the @code{gnus-buffer-configuration} variable is so long and
13738 complicated, there's a function you can use to ease changing the config
13739 of a single setting: @code{gnus-add-configuration}.  If, for instance,
13740 you want to change the @code{article} setting, you could say:
13741
13742 @lisp
13743 (gnus-add-configuration
13744  '(article (vertical 1.0
13745                (group 4)
13746                (summary .25 point)
13747                (article 1.0))))
13748 @end lisp
13749
13750 You'd typically stick these @code{gnus-add-configuration} calls in your
13751 @file{.gnus.el} file or in some startup hook---they should be run after
13752 Gnus has been loaded.
13753
13754 @vindex gnus-always-force-window-configuration
13755 If all windows mentioned in the configuration are already visible, Gnus
13756 won't change the window configuration.  If you always want to force the
13757 ``right'' window configuration, you can set
13758 @code{gnus-always-force-window-configuration} to non-@code{nil}.
13759
13760
13761 @node Compilation
13762 @section Compilation
13763 @cindex compilation
13764 @cindex byte-compilation
13765
13766 @findex gnus-compile
13767
13768 Remember all those line format specification variables?
13769 @code{gnus-summary-line-format}, @code{gnus-group-line-format}, and so
13770 on.  Now, Gnus will of course heed whatever these variables are, but,
13771 unfortunately, changing them will mean a quite significant slow-down.
13772 (The default values of these variables have byte-compiled functions
13773 associated with them, while the user-generated versions do not, of
13774 course.) 
13775
13776 To help with this, you can run @kbd{M-x gnus-compile} after you've
13777 fiddled around with the variables and feel that you're (kind of)
13778 satisfied.  This will result in the new specs being byte-compiled, and
13779 you'll get top speed again.  Gnus will save these compiled specs in the
13780 @file{.newsrc.eld} file.  (User-defined functions aren't compiled by
13781 this function, though---you should compile them yourself by sticking
13782 them into the @code{.gnus.el} file and byte-compiling that file.)
13783
13784
13785 @node Mode Lines
13786 @section Mode Lines
13787 @cindex mode lines
13788
13789 @vindex gnus-updated-mode-lines
13790 @code{gnus-updated-mode-lines} says what buffers should keep their mode
13791 lines updated.  It is a list of symbols.  Supported symbols include
13792 @code{group}, @code{article}, @code{summary}, @code{server},
13793 @code{browse}, and @code{tree}.  If the corresponding symbol is present,
13794 Gnus will keep that mode line updated with information that may be
13795 pertinent.  If this variable is @code{nil}, screen refresh may be
13796 quicker.
13797
13798 @cindex display-time
13799
13800 @vindex gnus-mode-non-string-length
13801 By default, Gnus displays information on the current article in the mode
13802 lines of the summary and article buffers.  The information Gnus wishes
13803 to display (e.g. the subject of the article) is often longer than the
13804 mode lines, and therefore have to be cut off at some point.  The
13805 @code{gnus-mode-non-string-length} variable says how long the other
13806 elements on the line is (i.e., the non-info part).  If you put
13807 additional elements on the mode line (e.g. a clock), you should modify
13808 this variable:
13809
13810 @c Hook written by Francesco Potorti` <pot@cnuce.cnr.it>
13811 @lisp
13812 (add-hook 'display-time-hook
13813           (lambda () (setq gnus-mode-non-string-length
13814                            (+ 21
13815                               (if line-number-mode 5 0)
13816                               (if column-number-mode 4 0)
13817                               (length display-time-string)))))
13818 @end lisp
13819
13820 If this variable is @code{nil} (which is the default), the mode line
13821 strings won't be chopped off, and they won't be padded either.  Note
13822 that the default is unlikely to be desirable, as even the percentage
13823 complete in the buffer may be crowded off the mode line; the user should
13824 configure this variable appropriately for her configuration.
13825
13826
13827 @node Highlighting and Menus
13828 @section Highlighting and Menus
13829 @cindex visual
13830 @cindex highlighting
13831 @cindex menus
13832
13833 @vindex gnus-visual
13834 The @code{gnus-visual} variable controls most of the Gnus-prettifying
13835 aspects.  If @code{nil}, Gnus won't attempt to create menus or use fancy
13836 colors or fonts.  This will also inhibit loading the @file{gnus-vis.el}
13837 file.
13838
13839 This variable can be a list of visual properties that are enabled.  The
13840 following elements are valid, and are all included by default:
13841
13842 @table @code
13843 @item group-highlight
13844 Do highlights in the group buffer.
13845 @item summary-highlight
13846 Do highlights in the summary buffer.
13847 @item article-highlight
13848 Do highlights in the article buffer.
13849 @item highlight
13850 Turn on highlighting in all buffers.
13851 @item group-menu
13852 Create menus in the group buffer.
13853 @item summary-menu
13854 Create menus in the summary buffers.
13855 @item article-menu
13856 Create menus in the article buffer.
13857 @item browse-menu
13858 Create menus in the browse buffer.
13859 @item server-menu
13860 Create menus in the server buffer.
13861 @item score-menu
13862 Create menus in the score buffers.
13863 @item menu
13864 Create menus in all buffers.
13865 @end table
13866
13867 So if you only want highlighting in the article buffer and menus in all
13868 buffers, you could say something like:
13869
13870 @lisp
13871 (setq gnus-visual '(article-highlight menu))
13872 @end lisp
13873
13874 If you want highlighting only and no menus whatsoever, you'd say:
13875
13876 @lisp
13877 (setq gnus-visual '(highlight))
13878 @end lisp
13879
13880 If @code{gnus-visual} is @code{t}, highlighting and menus will be used
13881 in all Gnus buffers.
13882
13883 Other general variables that influence the look of all buffers include:
13884
13885 @table @code
13886 @item gnus-mouse-face
13887 @vindex gnus-mouse-face
13888 This is the face (i.e., font) used for mouse highlighting in Gnus.  No
13889 mouse highlights will be done if @code{gnus-visual} is @code{nil}.
13890
13891 @end table
13892
13893 There are hooks associated with the creation of all the different menus:
13894
13895 @table @code
13896
13897 @item gnus-article-menu-hook
13898 @vindex gnus-article-menu-hook
13899 Hook called after creating the article mode menu.
13900
13901 @item gnus-group-menu-hook
13902 @vindex gnus-group-menu-hook
13903 Hook called after creating the group mode menu.
13904
13905 @item gnus-summary-menu-hook
13906 @vindex gnus-summary-menu-hook
13907 Hook called after creating the summary mode menu.
13908
13909 @item gnus-server-menu-hook
13910 @vindex gnus-server-menu-hook
13911 Hook called after creating the server mode menu.
13912
13913 @item gnus-browse-menu-hook
13914 @vindex gnus-browse-menu-hook
13915 Hook called after creating the browse mode menu.
13916
13917 @item gnus-score-menu-hook
13918 @vindex gnus-score-menu-hook
13919 Hook called after creating the score mode menu.
13920
13921 @end table
13922
13923
13924 @node Buttons
13925 @section Buttons
13926 @cindex buttons
13927 @cindex mouse
13928 @cindex click
13929
13930 Those new-fangled @dfn{mouse} contraptions is very popular with the
13931 young, hep kids who don't want to learn the proper way to do things
13932 these days.  Why, I remember way back in the summer of '89, when I was
13933 using Emacs on a Tops 20 system.  Three hundred users on one single
13934 machine, and every user was running Simula compilers.  Bah!
13935
13936 Right.
13937
13938 @vindex gnus-carpal
13939 Well, you can make Gnus display bufferfuls of buttons you can click to
13940 do anything by setting @code{gnus-carpal} to @code{t}.  Pretty simple,
13941 really.  Tell the chiropractor I sent you.
13942
13943
13944 @table @code
13945
13946 @item gnus-carpal-mode-hook
13947 @vindex gnus-carpal-mode-hook
13948 Hook run in all carpal mode buffers.
13949
13950 @item gnus-carpal-button-face
13951 @vindex gnus-carpal-button-face
13952 Face used on buttons.
13953
13954 @item gnus-carpal-header-face
13955 @vindex gnus-carpal-header-face
13956 Face used on carpal buffer headers.
13957
13958 @item gnus-carpal-group-buffer-buttons
13959 @vindex gnus-carpal-group-buffer-buttons
13960 Buttons in the group buffer.
13961
13962 @item gnus-carpal-summary-buffer-buttons
13963 @vindex gnus-carpal-summary-buffer-buttons
13964 Buttons in the summary buffer.
13965
13966 @item gnus-carpal-server-buffer-buttons
13967 @vindex gnus-carpal-server-buffer-buttons
13968 Buttons in the server buffer.
13969
13970 @item gnus-carpal-browse-buffer-buttons
13971 @vindex gnus-carpal-browse-buffer-buttons
13972 Buttons in the browse buffer.
13973 @end table
13974
13975 All the @code{buttons} variables are lists.  The elements in these list
13976 are either cons cells where the @code{car} contains a text to be displayed and
13977 the @code{cdr} contains a function symbol, or a simple string.
13978
13979
13980 @node Daemons
13981 @section Daemons
13982 @cindex demons
13983 @cindex daemons
13984
13985 Gnus, being larger than any program ever written (allegedly), does lots
13986 of strange stuff that you may wish to have done while you're not
13987 present.  For instance, you may want it to check for new mail once in a
13988 while.  Or you may want it to close down all connections to all servers
13989 when you leave Emacs idle.  And stuff like that.
13990
13991 Gnus will let you do stuff like that by defining various
13992 @dfn{handlers}.  Each handler consists of three elements:  A
13993 @var{function}, a @var{time}, and an @var{idle} parameter.
13994
13995 Here's an example of a handler that closes connections when Emacs has
13996 been idle for thirty minutes:
13997
13998 @lisp
13999 (gnus-demon-close-connections nil 30)
14000 @end lisp
14001
14002 Here's a handler that scans for PGP headers every hour when Emacs is
14003 idle: 
14004
14005 @lisp
14006 (gnus-demon-scan-pgp 60 t)
14007 @end lisp
14008
14009 This @var{time} parameter and than @var{idle} parameter work together
14010 in a strange, but wonderful fashion.  Basically, if @var{idle} is
14011 @code{nil}, then the function will be called every @var{time} minutes.
14012
14013 If @var{idle} is @code{t}, then the function will be called after
14014 @var{time} minutes only if Emacs is idle.  So if Emacs is never idle,
14015 the function will never be called.  But once Emacs goes idle, the
14016 function will be called every @var{time} minutes.
14017
14018 If @var{idle} is a number and @var{time} is a number, the function will
14019 be called every @var{time} minutes only when Emacs has been idle for
14020 @var{idle} minutes.
14021
14022 If @var{idle} is a number and @var{time} is @code{nil}, the function
14023 will be called once every time Emacs has been idle for @var{idle}
14024 minutes.  
14025
14026 And if @var{time} is a string, it should look like @samp{07:31}, and
14027 the function will then be called once every day somewhere near that
14028 time.  Modified by the @var{idle} parameter, of course.
14029
14030 @vindex gnus-demon-timestep
14031 (When I say ``minute'' here, I really mean @code{gnus-demon-timestep}
14032 seconds.  This is 60 by default.  If you change that variable,
14033 all the timings in the handlers will be affected.)
14034
14035 @vindex gnus-use-demon
14036 To set the whole thing in motion, though, you have to set
14037 @code{gnus-use-demon} to @code{t}.
14038
14039 So, if you want to add a handler, you could put something like this in
14040 your @file{.gnus} file:
14041
14042 @findex gnus-demon-add-handler
14043 @lisp
14044 (gnus-demon-add-handler 'gnus-demon-close-connections 30 t)
14045 @end lisp
14046
14047 @findex gnus-demon-add-nocem
14048 @findex gnus-demon-add-scanmail
14049 @findex gnus-demon-add-rescan
14050 @findex gnus-demon-add-scan-timestamps
14051 @findex gnus-demon-add-disconnection
14052 Some ready-made functions to do this have been created:
14053 @code{gnus-demon-add-nocem}, @code{gnus-demon-add-disconnection},
14054 @code{gnus-demon-add-nntp-close-connection}, 
14055 @code{gnus-demon-add-scan-timestamps}, @code{gnus-demon-add-rescan}, and
14056 @code{gnus-demon-add-scanmail}.  Just put those functions in your
14057 @file{.gnus} if you want those abilities.
14058
14059 @findex gnus-demon-init
14060 @findex gnus-demon-cancel
14061 @vindex gnus-demon-handlers
14062 If you add handlers to @code{gnus-demon-handlers} directly, you should
14063 run @code{gnus-demon-init} to make the changes take hold.  To cancel all
14064 daemons, you can use the @code{gnus-demon-cancel} function.
14065
14066 Note that adding daemons can be pretty naughty if you overdo it.  Adding
14067 functions that scan all news and mail from all servers every two seconds
14068 is a sure-fire way of getting booted off any respectable system.  So
14069 behave.
14070
14071
14072 @node NoCeM
14073 @section NoCeM
14074 @cindex nocem
14075 @cindex spam
14076
14077 @dfn{Spamming} is posting the same article lots and lots of times.
14078 Spamming is bad.  Spamming is evil.  
14079
14080 Spamming is usually canceled within a day or so by various anti-spamming
14081 agencies.  These agencies usually also send out @dfn{NoCeM} messages.
14082 NoCeM is pronounced ``no see-'em'', and means what the name
14083 implies---these are messages that make the offending articles, like, go
14084 away.  
14085
14086 What use are these NoCeM messages if the articles are canceled anyway?
14087 Some sites do not honor cancel messages and some sites just honor cancels
14088 from a select few people.  Then you may wish to make use of the NoCeM
14089 messages, which are distributed in the @samp{alt.nocem.misc} newsgroup.
14090
14091 Gnus can read and parse the messages in this group automatically, and
14092 this will make spam disappear.  
14093
14094 There are some variables to customize, of course:
14095
14096 @table @code
14097 @item gnus-use-nocem
14098 @vindex gnus-use-nocem
14099 Set this variable to @code{t} to set the ball rolling.  It is @code{nil}
14100 by default. 
14101
14102 @item gnus-nocem-groups
14103 @vindex gnus-nocem-groups
14104 Gnus will look for NoCeM messages in the groups in this list.  The
14105 default is @code{("news.lists.filters" "news.admin.net-abuse.bulletins"
14106 "alt.nocem.misc" "news.admin.net-abuse.announce")}. 
14107
14108 @item gnus-nocem-issuers
14109 @vindex gnus-nocem-issuers
14110 There are many people issuing NoCeM messages.  This list says what
14111 people you want to listen to.  The default is @code{("Automoose-1"
14112 "rbraver@@ohww.norman.ok.us" "clewis@@ferret.ocunix.on.ca"
14113 "jem@@xpat.com" "snowhare@@xmission.com" "red@@redpoll.mrfs.oh.us
14114 (Richard E. Depew)")}; fine, upstanding citizens all of them.
14115
14116 Known despammers that you can put in this list include:
14117
14118 @table @samp
14119 @item clewis@@ferret.ocunix.on.ca;
14120 @cindex Chris Lewis
14121 Chris Lewis---Major Canadian despammer who has probably canceled more
14122 usenet abuse than anybody else.
14123
14124 @item Automoose-1
14125 @cindex CancelMoose[tm]
14126 The CancelMoose[tm] on autopilot.  The CancelMoose[tm] is reputed to be
14127 Norwegian, and was the person(s) who invented NoCeM.  
14128
14129 @item jem@@xpat.com;
14130 @cindex Jem
14131 John Milburn---despammer located in Korea who is getting very busy these
14132 days.
14133
14134 @item red@@redpoll.mrfs.oh.us (Richard E. Depew)
14135 Richard E. Depew---lone American despammer.  He mostly cancels binary
14136 postings to non-binary groups and removes spews (regurgitated articles).
14137 @end table
14138
14139 You do not have to heed NoCeM messages from all these people---just the
14140 ones you want to listen to.  You also don't have to accept all NoCeM
14141 messages from the people you like.  Each NoCeM message has a @dfn{type}
14142 header that gives the message a (more or less, usually less) rigorous
14143 definition.  Common types are @samp{spam}, @samp{spew}, @samp{mmf},
14144 @samp{binary}, and @samp{troll}.  To specify this, you have to use
14145 @var{(issuer conditions ...)} elements in the list.  Each condition is
14146 either a string (which is a regexp that matches types you want to use)
14147 or a list on the form @code{(not STRING)}, where @var{string} is a
14148 regexp that matches types you don't want to use.
14149
14150 For instance, if you want all NoCeM messages from Chris Lewis except his
14151 @samp{troll} messages, you'd say:
14152
14153 @lisp
14154 ("clewis@@ferret.ocunix.on.ca" ".*" (not "troll"))
14155 @end lisp
14156
14157 On the other hand, if you just want nothing but his @samp{spam} and
14158 @samp{spew} messages, you'd say:
14159
14160 @lisp
14161 ("clewis@@ferret.ocunix.on.ca" (not ".*") "spew" "spam")
14162 @end lisp
14163
14164 The specs are applied left-to-right.
14165
14166
14167 @item gnus-nocem-verifyer
14168 @vindex gnus-nocem-verifyer
14169 @findex mc-verify
14170 This should be a function for verifying that the NoCeM issuer is who she
14171 says she is.  The default is @code{mc-verify}, which is a Mailcrypt
14172 function.  If this is too slow and you don't care for verification
14173 (which may be dangerous), you can set this variable to @code{nil}.
14174
14175 If you want signed NoCeM messages to be verified and unsigned messages
14176 not to be verified (but used anyway), you could do something like:
14177
14178 @lisp
14179 (setq gnus-nocem-verifyer 'my-gnus-mc-verify)
14180
14181 (defun my-gnus-mc-verify ()
14182   (not (eq 'forged
14183            (ignore-errors
14184              (if (mc-verify)
14185                  t
14186                'forged)))))
14187 @end lisp
14188
14189 This might be dangerous, though.
14190
14191 @item gnus-nocem-directory
14192 @vindex gnus-nocem-directory
14193 This is where Gnus will store its NoCeM cache files.  The default is
14194 @file{~/News/NoCeM/}. 
14195
14196 @item gnus-nocem-expiry-wait
14197 @vindex gnus-nocem-expiry-wait
14198 The number of days before removing old NoCeM entries from the cache.
14199 The default is 15.  If you make it shorter Gnus will be faster, but you
14200 might then see old spam.
14201
14202 @end table
14203
14204 Using NoCeM could potentially be a memory hog.  If you have many living
14205 (i. e., subscribed or unsubscribed groups), your Emacs process will grow
14206 big.  If this is a problem, you should kill off all (or most) of your
14207 unsubscribed groups (@pxref{Subscription Commands}).
14208
14209
14210 @node Undo
14211 @section Undo
14212 @cindex undo
14213
14214 It is very useful to be able to undo actions one has done.  In normal
14215 Emacs buffers, it's easy enough---you just push the @code{undo} button.
14216 In Gnus buffers, however, it isn't that simple.
14217
14218 The things Gnus displays in its buffer is of no value whatsoever to
14219 Gnus---it's all just data designed to look nice to the user.
14220 Killing a group in the group buffer with @kbd{C-k} makes the line
14221 disappear, but that's just a side-effect of the real action---the
14222 removal of the group in question from the internal Gnus structures.
14223 Undoing something like that can't be done by the normal Emacs
14224 @code{undo} function.
14225
14226 Gnus tries to remedy this somewhat by keeping track of what the user
14227 does and coming up with actions that would reverse the actions the user
14228 takes.  When the user then presses the @code{undo} key, Gnus will run
14229 the code to reverse the previous action, or the previous actions.
14230 However, not all actions are easily reversible, so Gnus currently offers
14231 a few key functions to be undoable.  These include killing groups,
14232 yanking groups, and changing the list of read articles of groups.
14233 That's it, really.  More functions may be added in the future, but each
14234 added function means an increase in data to be stored, so Gnus will
14235 never be totally undoable.
14236
14237 @findex gnus-undo-mode
14238 @vindex gnus-use-undo
14239 @findex gnus-undo
14240 The undoability is provided by the @code{gnus-undo-mode} minor mode.  It
14241 is used if @code{gnus-use-undo} is non-@code{nil}, which is the
14242 default.  The @kbd{M-C-_} key performs the @code{gnus-undo} command
14243 command, which should feel kinda like the normal Emacs @code{undo}
14244 command. 
14245
14246
14247 @node Moderation
14248 @section Moderation
14249 @cindex moderation
14250
14251 If you are a moderator, you can use the @file{gnus-mdrtn.el} package.
14252 It is not included in the standard Gnus package.  Write a mail to
14253 @samp{larsi@@gnus.org} and state what group you moderate, and you'll
14254 get a copy.
14255
14256 The moderation package is implemented as a minor mode for summary
14257 buffers.  Put
14258
14259 @lisp
14260 (add-hook 'gnus-summary-mode-hook 'gnus-moderate)
14261 @end lisp
14262
14263 in your @file{.gnus.el} file.
14264
14265 If you are the moderator of @samp{rec.zoofle}, this is how it's
14266 supposed to work:
14267
14268 @enumerate
14269 @item 
14270 You split your incoming mail by matching on
14271 @samp{Newsgroups:.*rec.zoofle}, which will put all the to-be-posted
14272 articles in some mail group---for instance, @samp{nnml:rec.zoofle}.
14273
14274 @item
14275 You enter that group once in a while and post articles using the @kbd{e}
14276 (edit-and-post) or @kbd{s} (just send unedited) commands.
14277
14278 @item
14279 If, while reading the @samp{rec.zoofle} newsgroup, you happen upon some
14280 articles that weren't approved by you, you can cancel them with the
14281 @kbd{c} command.
14282 @end enumerate
14283
14284 To use moderation mode in these two groups, say:
14285
14286 @lisp
14287 (setq gnus-moderated-list
14288       "^nnml:rec.zoofle$\\|^rec.zoofle$")
14289 @end lisp
14290
14291
14292 @node XEmacs Enhancements
14293 @section XEmacs Enhancements
14294 @cindex XEmacs
14295
14296 XEmacs is able to display pictures and stuff, so Gnus has taken
14297 advantage of that.
14298
14299 @menu
14300 * Picons::    How to display pictures of what your reading.
14301 * Smileys::   Show all those happy faces the way they were meant to be shown.
14302 * Toolbar::   Click'n'drool.
14303 * XVarious::  Other XEmacsy Gnusey variables.
14304 @end menu
14305
14306
14307 @node Picons
14308 @subsection Picons
14309
14310 @iftex
14311 @iflatex
14312 \gnuspicon{tmp/picons-att.ps}
14313 \gnuspicon{tmp/picons-berkeley.ps}
14314 \gnuspicon{tmp/picons-caltech.ps}
14315 \gnuspicon{tmp/picons-canada.ps}
14316 \gnuspicon{tmp/picons-cr.ps}
14317 \gnuspicon{tmp/picons-cygnus.ps}
14318 \gnuspicon{tmp/picons-gov.ps}
14319 \gnuspicon{tmp/picons-mit.ps}
14320 \gnuspicon{tmp/picons-nasa.ps}
14321 \gnuspicon{tmp/picons-qmw.ps}
14322 \gnuspicon{tmp/picons-rms.ps}
14323 \gnuspicon{tmp/picons-ruu.ps}
14324 @end iflatex
14325 @end iftex
14326
14327 So...  You want to slow down your news reader even more!  This is a
14328 good way to do so.  Its also a great way to impress people staring
14329 over your shoulder as you read news.
14330
14331 @menu
14332 * Picon Basics::           What are picons and How do I get them.
14333 * Picon Requirements::     Don't go further if you aren't using XEmacs.
14334 * Easy Picons::            Displaying Picons---the easy way.
14335 * Hard Picons::            The way you should do it.  You'll learn something.
14336 * Picon Configuration::    Other variables you can trash/tweak/munge/play with.
14337 @end menu
14338
14339
14340 @node Picon Basics
14341 @subsubsection Picon Basics
14342
14343 What are Picons?  To quote directly from the Picons Web site:
14344
14345 @quotation 
14346 @dfn{Picons} is short for ``personal icons''.  They're small,
14347 constrained images used to represent users and domains on the net,
14348 organized into databases so that the appropriate image for a given
14349 e-mail address can be found.  Besides users and domains, there are picon
14350 databases for Usenet newsgroups and weather forecasts.  The picons are
14351 in either monochrome @code{XBM} format or color @code{XPM} and
14352 @code{GIF} formats.
14353 @end quotation
14354
14355 For instructions on obtaining and installing the picons databases, point
14356 your Web browser at
14357 @file{http://www.cs.indiana.edu/picons/ftp/index.html}.
14358
14359 @vindex gnus-picons-database
14360 Gnus expects picons to be installed into a location pointed to by
14361 @code{gnus-picons-database}.
14362
14363
14364 @node Picon Requirements
14365 @subsubsection Picon Requirements
14366
14367 To have Gnus display Picons for you, you must be running XEmacs
14368 19.13 or greater since all other versions of Emacs aren't yet able to
14369 display images.
14370
14371 Additionally, you must have @code{xpm} support compiled into XEmacs.
14372
14373 @vindex gnus-picons-convert-x-face
14374 If you want to display faces from @code{X-Face} headers, you must have
14375 the @code{netpbm} utilities installed, or munge the
14376 @code{gnus-picons-convert-x-face} variable to use something else.
14377
14378
14379 @node Easy Picons
14380 @subsubsection Easy Picons
14381
14382 To enable displaying picons, simply put the following line in your
14383 @file{~/.gnus} file and start Gnus.
14384
14385 @lisp
14386 (setq gnus-use-picons t)
14387 (add-hook 'gnus-article-display-hook 'gnus-article-display-picons t)
14388 (add-hook 'gnus-summary-prepare-hook 'gnus-group-display-picons t)
14389 (add-hook 'gnus-article-display-hook 'gnus-picons-article-display-x-face)
14390 @end lisp
14391
14392
14393 @node Hard Picons
14394 @subsubsection Hard Picons 
14395
14396 Gnus can display picons for you as you enter and leave groups and
14397 articles.  It knows how to interact with three sections of the picons
14398 database.  Namely, it can display the picons newsgroup pictures,
14399 author's face picture(s), and the authors domain.  To enable this
14400 feature, you need to first decide where to display them.
14401
14402 @table @code 
14403
14404 @item gnus-picons-display-where 
14405 @vindex gnus-picons-display-where 
14406 Where the picon images should be displayed.  It is @code{picons} by
14407 default (which by default maps to the buffer @samp{*Picons*}).  Other
14408 valid places could be @code{article}, @code{summary}, or
14409 @samp{*scratch*} for all I care.  Just make sure that you've made the
14410 buffer visible using the standard Gnus window configuration
14411 routines---@pxref{Windows Configuration}.
14412
14413 @item gnus-picons-group-excluded-groups
14414 @vindex gnus-picons-group-excluded-groups
14415 Groups that are matched by this regexp won't have their group icons
14416 displayed. 
14417
14418 @end table
14419
14420 @iftex
14421 @iflatex
14422 \gnuspicon{tmp/picons-seuu.ps}
14423 \gnuspicon{tmp/picons-stanford.ps}
14424 \gnuspicon{tmp/picons-sun.ps}
14425 \gnuspicon{tmp/picons-ubc.ps}
14426 \gnuspicon{tmp/picons-ufl.ps}
14427 \gnuspicon{tmp/picons-uio.ps}
14428 \gnuspicon{tmp/picons-unit.ps}
14429 \gnuspicon{tmp/picons-upenn.ps}
14430 \gnuspicon{tmp/picons-wesleyan.ps}
14431 @end iflatex
14432 @end iftex
14433
14434 Note: If you set @code{gnus-use-picons} to @code{t}, it will set up your
14435 window configuration for you to include the @code{picons} buffer.
14436
14437 Now that you've made that decision, you need to add the following
14438 functions to the appropriate hooks so these pictures will get
14439 displayed at the right time.
14440
14441 @vindex gnus-article-display-hook
14442 @vindex gnus-picons-display-where
14443 @table @code
14444 @item gnus-article-display-picons
14445 @findex gnus-article-display-picons
14446 Looks up and displays the picons for the author and the author's domain
14447 in the @code{gnus-picons-display-where} buffer.  Should be added to the
14448 @code{gnus-article-display-hook}.
14449
14450 @item gnus-group-display-picons
14451 @findex gnus-article-display-picons
14452 Displays picons representing the current group.  This function should
14453 be added to the @code{gnus-summary-prepare-hook} or to the
14454 @code{gnus-article-display-hook} if @code{gnus-picons-display-where}
14455 is set to @code{article}.
14456
14457 @item gnus-picons-article-display-x-face
14458 @findex gnus-article-display-picons
14459 Decodes and displays the X-Face header if present.  This function
14460 should be added to @code{gnus-article-display-hook}.
14461
14462 @end table
14463
14464 Note:  You must append them to the hook, so make sure to specify 't'
14465 for the append flag of @code{add-hook}:
14466
14467 @lisp
14468 (add-hook 'gnus-article-display-hook 'gnus-article-display-picons t)
14469 @end lisp
14470
14471
14472 @node Picon Configuration
14473 @subsubsection Picon Configuration
14474
14475 The following variables offer further control over how things are
14476 done, where things are located, and other useless stuff you really
14477 don't need to worry about.
14478
14479 @table @code
14480 @item gnus-picons-database
14481 @vindex gnus-picons-database
14482 The location of the picons database.  Should point to a directory
14483 containing the @file{news}, @file{domains}, @file{users} (and so on)
14484 subdirectories.  Defaults to @file{/usr/local/faces}.
14485
14486 @item gnus-picons-news-directory
14487 @vindex gnus-picons-news-directory
14488 Sub-directory of the faces database containing the icons for
14489 newsgroups.
14490
14491 @item gnus-picons-user-directories
14492 @vindex gnus-picons-user-directories
14493 List of subdirectories to search in @code{gnus-picons-database} for user
14494 faces.  @code{("local" "users" "usenix" "misc")} is the default.
14495
14496 @item gnus-picons-domain-directories
14497 @vindex gnus-picons-domain-directories
14498 List of subdirectories to search in @code{gnus-picons-database} for
14499 domain name faces.  Defaults to @code{("domains")}.  Some people may
14500 want to add @samp{unknown} to this list.
14501
14502 @item gnus-picons-convert-x-face
14503 @vindex gnus-picons-convert-x-face
14504 The command to use to convert the @code{X-Face} header to an X bitmap
14505 (@code{xbm}).  Defaults to @code{(format "@{ echo '/* Width=48,
14506 Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s"
14507 gnus-picons-x-face-file-name)}
14508
14509 @item gnus-picons-x-face-file-name
14510 @vindex gnus-picons-x-face-file-name
14511 Names a temporary file to store the @code{X-Face} bitmap in.  Defaults
14512 to @code{(format "/tmp/picon-xface.%s.xbm" (user-login-name))}.
14513
14514 @item gnus-picons-buffer
14515 @vindex gnus-picons-buffer
14516 The name of the buffer that @code{picons} points to.  Defaults to
14517 @samp{*Icon Buffer*}.
14518
14519 @end table
14520
14521 @node Smileys
14522 @subsection Smileys
14523 @cindex smileys
14524
14525 @dfn{Smiley} is a package separate from Gnus, but since Gnus is
14526 currently the only package that uses Smiley, it is documented here.
14527
14528 In short---to use Smiley in Gnus, put the following in your
14529 @file{.gnus.el} file:
14530
14531 @lisp
14532 (add-hook 'gnus-article-display-hook 'gnus-smiley-display t)
14533 @end lisp
14534
14535 Smiley maps text smiley faces---@samp{:-)}, @samp{:-=}, @samp{:-(} and
14536 the like---to pictures and displays those instead of the text smiley
14537 faces.  The conversion is controlled by a list of regexps that matches
14538 text and maps that to file names.
14539
14540 @vindex smiley-nosey-regexp-alist
14541 @vindex smiley-deformed-regexp-alist
14542 Smiley supplies two example conversion alists by default:
14543 @code{smiley-deformed-regexp-alist} (which matches @samp{:)}, @samp{:(}
14544 and so on), and @code{smiley-nosey-regexp-alist} (which matches
14545 @samp{:-)}, @samp{:-(} and so on).
14546
14547 The alist used is specified by the @code{smiley-regexp-alist} variable,
14548 which defaults to the value of @code{smiley-deformed-regexp-alist}.
14549
14550 Here's the default value of @code{smiley-smiley-regexp-alist}:
14551
14552 @lisp
14553 (setq smiley-nosey-regexp-alist
14554       '(("\\(:-+[<«]+\\)\\W" 1 "FaceAngry.xpm")
14555         ("\\(:-+\\]+\\)\\W" 1 "FaceGoofy.xpm")
14556         ("\\(:-+D\\)\\W" 1 "FaceGrinning.xpm")
14557         ("\\(:-+[@}»]+\\)\\W" 1 "FaceHappy.xpm")
14558         ("\\(:-*)+\\)\\W" 1 "FaceHappy.xpm")        
14559         ("\\(:-+[/\\\"]+\\)\\W" 1 "FaceIronic.xpm")
14560         ("\\([8|]-+[|Oo%]\\)\\W" 1 "FaceKOed.xpm")
14561         ("\\([:|]-+#+\\)\\W" 1 "FaceNyah.xpm")
14562         ("\\(:-+[(@{]+\\)\\W" 1 "FaceSad.xpm")
14563         ("\\(:-+[Oo\*]\\)\\W" 1 "FaceStartled.xpm")
14564         ("\\(:-+|\\)\\W" 1 "FaceStraight.xpm")
14565         ("\\(:-+p\\)\\W" 1 "FaceTalking.xpm")
14566         ("\\(:-+d\\)\\W" 1 "FaceTasty.xpm")
14567         ("\\(;-+[>)@}»]+\\)\\W" 1 "FaceWinking.xpm")
14568         ("\\(:-+[Vvµ]\\)\\W" 1 "FaceWry.xpm")
14569         ("\\(][:8B]-[)>]\\)\\W" 1 "FaceDevilish.xpm")
14570         ("\\([:|]-+P\\)\\W" 1 "FaceYukky.xpm")))
14571 @end lisp
14572
14573 The first item in each element is the regexp to be matched; the second
14574 element is the regexp match group that is to be replaced by the picture;
14575 and the third element is the name of the file to be displayed.
14576
14577 The following variables customize where Smiley will look for these
14578 files, as well as the color to be used and stuff:
14579
14580 @table @code
14581
14582 @item smiley-data-directory
14583 @vindex smiley-data-directory
14584 Where Smiley will look for smiley faces files.
14585
14586 @item smiley-flesh-color
14587 @vindex smiley-flesh-color
14588 Skin color.  The default is @samp{yellow}, which is really racist.
14589
14590 @item smiley-features-color
14591 @vindex smiley-features-color
14592 Color of the features of the face.  The default is @samp{black}.
14593
14594 @item smiley-tongue-color
14595 @vindex smiley-tongue-color
14596 Color of the tongue.  The default is @samp{red}.
14597
14598 @item smiley-circle-color
14599 @vindex smiley-circle-color
14600 Color of the circle around the face.  The default is @samp{black}.
14601
14602 @item smiley-mouse-face
14603 @vindex smiley-mouse-face
14604 Face used for mouse highlighting over the smiley face.
14605
14606 @end table
14607
14608
14609 @node Toolbar
14610 @subsection Toolbar
14611
14612 @table @code
14613
14614 @item gnus-use-toolbar
14615 @vindex gnus-use-toolbar
14616 If @code{nil}, don't display toolbars.  If non-@code{nil}, it should be
14617 one of @code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar},
14618 @code{right-toolbar}, or @code{left-toolbar}.
14619
14620 @item gnus-group-toolbar
14621 @vindex gnus-group-toolbar
14622 The toolbar in the group buffer.
14623
14624 @item gnus-summary-toolbar
14625 @vindex gnus-summary-toolbar
14626 The toolbar in the summary buffer.
14627
14628 @item gnus-summary-mail-toolbar
14629 @vindex gnus-summary-mail-toolbar
14630 The toolbar in the summary buffer of mail groups.
14631
14632 @end table
14633
14634
14635 @node XVarious
14636 @subsection Various XEmacs Variables
14637
14638 @table @code
14639 @item gnus-xmas-glyph-directory
14640 @vindex gnus-xmas-glyph-directory
14641 This is where Gnus will look for pictures.  Gnus will normally
14642 auto-detect this directory, but you may set it manually if you have an
14643 unusual directory structure.
14644
14645 @item gnus-xmas-logo-color-alist
14646 @vindex gnus-xmas-logo-color-alist
14647 This is an alist where the key is a type symbol and the values are the
14648 foreground and background color of the splash page glyph.
14649
14650 @item gnus-xmas-logo-color-style
14651 @vindex gnus-xmas-logo-color-style
14652 This is the key used to look up the color in the alist described above.
14653 Legal values include @code{flame}, @code{pine}, @code{moss},
14654 @code{irish}, @code{sky}, @code{tin}, @code{velvet}, @code{grape},
14655 @code{labia}, @code{berry}, @code{neutral}, and @code{september}.
14656
14657 @item gnus-xmas-modeline-glyph
14658 @vindex gnus-xmas-modeline-glyph
14659 A glyph displayed in all Gnus mode lines.  It is a tiny gnu head by
14660 default. 
14661
14662 @end table
14663
14664
14665
14666
14667 @node Fuzzy Matching
14668 @section Fuzzy Matching
14669 @cindex fuzzy matching
14670
14671 Gnus provides @dfn{fuzzy matching} of @code{Subject} lines when doing
14672 things like scoring, thread gathering and thread comparison.  
14673
14674 As opposed to regular expression matching, fuzzy matching is very fuzzy.
14675 It's so fuzzy that there's not even a definition of what @dfn{fuzziness}
14676 means, and the implementation has changed over time.
14677
14678 Basically, it tries to remove all noise from lines before comparing.
14679 @samp{Re: }, parenthetical remarks, white space, and so on, are filtered
14680 out of the strings before comparing the results.  This often leads to
14681 adequate results---even when faced with strings generated by text
14682 manglers masquerading as newsreaders.
14683
14684
14685 @node Thwarting Email Spam
14686 @section Thwarting Email Spam
14687 @cindex email spam
14688 @cindex spam
14689 @cindex UCE
14690 @cindex unsolicited commercial email
14691
14692 In these last days of the Usenet, commercial vultures are hanging about
14693 and grepping through news like crazy to find email addresses they can
14694 foist off their scams and products to.  As a reaction to this, many
14695 people have started putting nonsense addresses into their @code{From}
14696 lines.  I think this is counterproductive---it makes it difficult for
14697 people to send you legitimate mail in response to things you write, as
14698 well as making it difficult to see who wrote what.  This rewriting may
14699 perhaps be a bigger menace than the unsolicited commercial email itself
14700 in the end.
14701
14702 The biggest problem I have with email spam is that it comes in under
14703 false pretenses.  I press @kbd{g} and Gnus merrily informs me that I
14704 have 10 new emails.  I say ``Golly gee!  Happy is me!'' and select the
14705 mail group, only to find two pyramid schemes, seven advertisements
14706 (``New!  Miracle tonic for growing full, lustrouos hair on your toes!'')
14707 and one mail asking me to repent and find some god.
14708
14709 This is annoying.
14710
14711 The way to deal with this is having Gnus split out all spam into a
14712 @samp{spam} mail group (@pxref{Splitting Mail}).
14713
14714 First, pick one (1) valid mail address that you can be reached at, and
14715 put it in your @code{From} header of all your news articles.  (I've
14716 chosen @samp{larsi@@trym.ifi.uio.no}, but for many addresses on the form
14717 @samp{larsi+usenet@@ifi.uio.no} will be a better choice.  Ask your
14718 sysadm whether your sendmail installation accepts keywords in the local
14719 part of the mail address.)
14720
14721 @lisp
14722 (setq message-default-news-headers
14723       "From: Lars Magne Ingebrigtsen <larsi@@trym.ifi.uio.no>\n")
14724 @end lisp
14725
14726 Then put the following split rule in @code{nnmail-split-fancy}
14727 (@pxref{Fancy Mail Splitting}):
14728
14729 @lisp
14730 (
14731  ...
14732  (to "larsi@@trym.ifi.uio.no"
14733       (| ("subject" "re:.*" "misc")
14734          ("references" ".*@@.*" "misc")
14735          "spam"))
14736  ...
14737 )
14738 @end lisp
14739
14740 This says that all mail to this address is suspect, but if it has a
14741 @code{Subject} that starts with a @samp{Re:} or has a @code{References}
14742 header, it's probably ok.  All the rest goes to the @samp{spam} group.
14743 (This idea probably comes from Tim Pierce.)
14744
14745 In addition, many mail spammers talk directly to your @code{smtp} server
14746 and do not include your email address explicitly in the @code{To}
14747 header.  Why they do this is unknown---perhaps it's to thwart this
14748 twarting scheme?  In any case, this is trivial to deal with---you just
14749 put anything not addressed to you in the @samp{spam} group by ending
14750 your fancy split rule in this way:
14751
14752 @lisp
14753 (
14754  ...
14755  (to "larsi" "misc")
14756  "spam")
14757 @end lisp
14758
14759 In my experience, this will sort virtually everything into the right
14760 group.  You still have to check the @samp{spam} group from time to time to
14761 check for legitimate mail, though.  If you feel like being a good net
14762 citizen, you can even send off complaints to the proper authorities on
14763 each unsolicited commercial email---at your leisure.
14764
14765 If you are also a lazy net citizen, you will probably prefer complaining
14766 automatically with the @file{gnus-junk.el} package, availiable FOR FREE
14767 at @file{<URL:http://stud2.tuwien.ac.at/~e9426626/gnus-junk.html>}.
14768 Since most e-mail spam is sent automatically, this may reconcile the
14769 cosmic balance somewhat.
14770
14771 This works for me.  It allows people an easy way to contact me (they can
14772 just press @kbd{r} in the usual way), and I'm not bothered at all with
14773 spam.  It's a win-win situation.  Forging @code{From} headers to point
14774 to non-existant domains is yucky, in my opinion.
14775
14776
14777 @node Various Various
14778 @section Various Various
14779 @cindex mode lines
14780 @cindex highlights
14781
14782 @table @code
14783
14784 @item gnus-home-directory
14785 All Gnus path variables will be initialized from this variable, which
14786 defaults to @file{~/}.
14787
14788 @item gnus-directory
14789 @vindex gnus-directory
14790 Most Gnus storage path variables will be initialized from this variable,
14791 which defaults to the @samp{SAVEDIR} environment variable, or
14792 @file{~/News/} if that variable isn't set.
14793
14794 @item gnus-default-directory
14795 @vindex gnus-default-directory
14796 Not related to the above variable at all---this variable says what the
14797 default directory of all Gnus buffers should be.  If you issue commands
14798 like @kbd{C-x C-f}, the prompt you'll get starts in the current buffer's
14799 default directory.  If this variable is @code{nil} (which is the
14800 default), the default directory will be the default directory of the
14801 buffer you were in when you started Gnus.
14802
14803 @item gnus-verbose
14804 @vindex gnus-verbose
14805 This variable is an integer between zero and ten.  The higher the value,
14806 the more messages will be displayed.  If this variable is zero, Gnus
14807 will never flash any messages, if it is seven (which is the default),
14808 most important messages will be shown, and if it is ten, Gnus won't ever
14809 shut up, but will flash so many messages it will make your head swim.
14810
14811 @item gnus-verbose-backends
14812 @vindex gnus-verbose-backends
14813 This variable works the same way as @code{gnus-verbose}, but it applies
14814 to the Gnus backends instead of Gnus proper.
14815
14816 @item nnheader-max-head-length
14817 @vindex nnheader-max-head-length
14818 When the backends read straight heads of articles, they all try to read
14819 as little as possible.  This variable (default 4096) specifies
14820 the absolute max length the backends will try to read before giving up
14821 on finding a separator line between the head and the body.  If this
14822 variable is @code{nil}, there is no upper read bound.  If it is
14823 @code{t}, the backends won't try to read the articles piece by piece,
14824 but read the entire articles.  This makes sense with some versions of
14825 @code{ange-ftp} or @code{efs}. 
14826
14827 @item nnheader-head-chop-length
14828 @vindex nnheader-head-chop-length
14829 This variable (default 2048) says how big a piece of each article to
14830 read when doing the operation described above.
14831
14832 @item nnheader-file-name-translation-alist 
14833 @vindex nnheader-file-name-translation-alist 
14834 @cindex file names
14835 @cindex invalid characters in file names
14836 @cindex characters in file names
14837 This is an alist that says how to translate characters in file names.
14838 For instance, if @samp{:} is invalid as a file character in file names
14839 on your system (you OS/2 user you), you could say something like:
14840
14841 @lisp
14842 (setq nnheader-file-name-translation-alist 
14843       '((?: . ?_)))
14844 @end lisp
14845
14846 In fact, this is the default value for this variable on OS/2 and MS
14847 Windows (phooey) systems.
14848
14849 @item gnus-hidden-properties
14850 @vindex gnus-hidden-properties
14851 This is a list of properties to use to hide ``invisible'' text.  It is
14852 @code{(invisible t intangible t)} by default on most systems, which
14853 makes invisible text invisible and intangible.
14854
14855 @item gnus-parse-headers-hook
14856 @vindex gnus-parse-headers-hook
14857 A hook called before parsing headers.  It can be used, for instance, to
14858 gather statistics on the headers fetched, or perhaps you'd like to prune
14859 some headers.  I don't see why you'd want that, though.
14860
14861 @item gnus-shell-command-separator
14862 @vindex gnus-shell-command-separator
14863 String used to separate two shell commands.  The default is @samp{;}. 
14864
14865
14866 @end table
14867
14868
14869 @node The End
14870 @chapter The End
14871
14872 Well, that's the manual---you can get on with your life now.  Keep in
14873 touch.  Say hello to your cats from me.  
14874
14875 My @strong{ghod}---I just can't stand goodbyes.  Sniffle.
14876
14877 Ol' Charles Reznikoff said it pretty well, so I leave the floor to him:
14878
14879 @quotation
14880 @strong{Te Deum}
14881
14882 @sp 1
14883 Not because of victories @*
14884 I sing,@*
14885 having none,@*
14886 but for the common sunshine,@*
14887 the breeze,@*
14888 the largess of the spring.
14889
14890 @sp 1
14891 Not for victory@*
14892 but for the day's work done@*
14893 as well as I was able;@*
14894 not for a seat upon the dais@*
14895 but at the common table.@*
14896 @end quotation
14897
14898
14899 @node Appendices
14900 @chapter Appendices
14901
14902 @menu
14903 * History::                        How Gnus got where it is today.
14904 * Terminology::                    We use really difficult, like, words here.
14905 * Customization::                  Tailoring Gnus to your needs.
14906 * Troubleshooting::                What you might try if things do not work.
14907 * A Programmers Guide to Gnus::    Rilly, rilly technical stuff.
14908 * Emacs for Heathens::             A short introduction to Emacsian terms.
14909 * Frequently Asked Questions::     A question-and-answer session.
14910 @end menu
14911
14912
14913 @node History
14914 @section History
14915
14916 @cindex history
14917 @sc{gnus} was written by Masanobu @sc{Umeda}.  When autumn crept up in
14918 '94, Lars Magne Ingebrigtsen grew bored and decided to rewrite Gnus.
14919
14920 If you want to investigate the person responsible for this outrage, you
14921 can point your (feh!) web browser to
14922 @file{http://www.ifi.uio.no/~larsi/}.  This is also the primary
14923 distribution point for the new and spiffy versions of Gnus, and is known
14924 as The Site That Destroys Newsrcs And Drives People Mad.
14925
14926 During the first extended alpha period of development, the new Gnus was
14927 called ``(ding) Gnus''.  @dfn{(ding)} is, of course, short for
14928 @dfn{ding is not Gnus}, which is a total and utter lie, but who cares?
14929 (Besides, the ``Gnus'' in this abbreviation should probably be
14930 pronounced ``news'' as @sc{Umeda} intended, which makes it a more
14931 appropriate name, don't you think?)
14932
14933 In any case, after spending all that energy on coming up with a new and
14934 spunky name, we decided that the name was @emph{too} spunky, so we
14935 renamed it back again to ``Gnus''.  But in mixed case.  ``Gnus'' vs.
14936 ``@sc{gnus}''.  New vs. old.
14937
14938 The first ``proper'' release of Gnus 5 was done in November 1995 when it
14939 was included in the Emacs 19.30 distribution (132 (ding) Gnus releases
14940 plus 15 Gnus 5.0 releases).
14941
14942 In May 1996 the next Gnus generation (aka. ``September Gnus'' (after 99
14943 releases)) was released under the name ``Gnus 5.2'' (40 releases).
14944
14945 On July 28th 1996 work on Red Gnus was begun, and it was released on
14946 January 25th 1997 (after 84 releases) as ``Gnus 5.4''.
14947
14948 If you happen upon a version of Gnus that has a prefixed name --
14949 ``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'' --
14950 don't panic.  Don't let it know that you're frightened.  Back away.
14951 Slowly.  Whatever you do, don't run.  Walk away, calmly, until you're
14952 out of its reach.  Find a proper released version of Gnus and snuggle up
14953 to that instead.
14954
14955 @menu
14956 * Why?::                What's the point of Gnus?
14957 * Compatibility::       Just how compatible is Gnus with @sc{gnus}?
14958 * Conformity::          Gnus tries to conform to all standards.
14959 * Emacsen::             Gnus can be run on a few modern Emacsen.
14960 * Contributors::        Oodles of people.  
14961 * New Features::        Pointers to some of the new stuff in Gnus.
14962 * Newest Features::     Features so new that they haven't been written yet.
14963 @end menu
14964
14965
14966 @node Why?
14967 @subsection Why?
14968
14969 What's the point of Gnus?  
14970
14971 I want to provide a ``rad'', ``happening'', ``way cool'' and ``hep''
14972 newsreader, that lets you do anything you can think of.  That was my
14973 original motivation, but while working on Gnus, it has become clear to
14974 me that this generation of newsreaders really belong in the stone age.
14975 Newsreaders haven't developed much since the infancy of the net.  If the
14976 volume continues to rise with the current rate of increase, all current
14977 newsreaders will be pretty much useless.  How do you deal with
14978 newsgroups that have thousands of new articles each day?  How do you
14979 keep track of millions of people who post?
14980
14981 Gnus offers no real solutions to these questions, but I would very much
14982 like to see Gnus being used as a testing ground for new methods of
14983 reading and fetching news.  Expanding on @sc{Umeda}-san's wise decision
14984 to separate the newsreader from the backends, Gnus now offers a simple
14985 interface for anybody who wants to write new backends for fetching mail
14986 and news from different sources.  I have added hooks for customizations
14987 everywhere I could imagine it being useful.  By doing so, I'm inviting
14988 every one of you to explore and invent.
14989
14990 May Gnus never be complete. @kbd{C-u 100 M-x all-hail-emacs} and
14991 @kbd{C-u 100 M-x all-hail-xemacs}.
14992
14993
14994 @node Compatibility
14995 @subsection Compatibility
14996
14997 @cindex compatibility
14998 Gnus was designed to be fully compatible with @sc{gnus}.  Almost all key
14999 bindings have been kept.  More key bindings have been added, of course,
15000 but only in one or two obscure cases have old bindings been changed.
15001
15002 Our motto is:
15003 @quotation
15004 @cartouche
15005 @center In a cloud bones of steel.
15006 @end cartouche
15007 @end quotation
15008
15009 All commands have kept their names.  Some internal functions have changed
15010 their names.
15011
15012 The @code{gnus-uu} package has changed drastically. @xref{Decoding
15013 Articles}. 
15014
15015 One major compatibility question is the presence of several summary
15016 buffers.  All variables relevant while reading a group are
15017 buffer-local to the summary buffer they belong in.  Although many
15018 important variables have their values copied into their global
15019 counterparts whenever a command is executed in the summary buffer, this
15020 change might lead to incorrect values being used unless you are careful.
15021
15022 All code that relies on knowledge of @sc{gnus} internals will probably
15023 fail.  To take two examples: Sorting @code{gnus-newsrc-alist} (or
15024 changing it in any way, as a matter of fact) is strictly verboten.  Gnus
15025 maintains a hash table that points to the entries in this alist (which
15026 speeds up many functions), and changing the alist directly will lead to
15027 peculiar results.
15028
15029 @cindex hilit19
15030 @cindex highlighting
15031 Old hilit19 code does not work at all.  In fact, you should probably
15032 remove all hilit code from all Gnus hooks
15033 (@code{gnus-group-prepare-hook} and @code{gnus-summary-prepare-hook}).
15034 Gnus provides various integrated functions for highlighting.  These are
15035 faster and more accurate.  To make life easier for everybody, Gnus will
15036 by default remove all hilit calls from all hilit hooks.  Uncleanliness!
15037 Away!
15038
15039 Packages like @code{expire-kill} will no longer work.  As a matter of
15040 fact, you should probably remove all old @sc{gnus} packages (and other
15041 code) when you start using Gnus.  More likely than not, Gnus already
15042 does what you have written code to make @sc{gnus} do.  (Snicker.)
15043
15044 Even though old methods of doing things are still supported, only the
15045 new methods are documented in this manual.  If you detect a new method of
15046 doing something while reading this manual, that does not mean you have
15047 to stop doing it the old way.
15048
15049 Gnus understands all @sc{gnus} startup files.
15050
15051 @kindex M-x gnus-bug
15052 @findex gnus-bug
15053 @cindex reporting bugs
15054 @cindex bugs
15055 Overall, a casual user who hasn't written much code that depends on
15056 @sc{gnus} internals should suffer no problems.  If problems occur,
15057 please let me know by issuing that magic command @kbd{M-x gnus-bug}.
15058
15059
15060 @node Conformity
15061 @subsection Conformity
15062
15063 No rebels without a clue here, ma'am.  We conform to all standards known
15064 to (wo)man.  Except for those standards and/or conventions we disagree
15065 with, of course.
15066
15067 @table @strong
15068
15069 @item RFC 822
15070 @cindex RFC 822
15071 There are no known breaches of this standard.
15072
15073 @item RFC 1036
15074 @cindex RFC 1036
15075 There are no known breaches of this standard, either.
15076
15077 @item Good Net-Keeping Seal of Approval
15078 @cindex Good Net-Keeping Seal of Approval
15079 Gnus has been through the Seal process and failed.  I think it'll pass
15080 the next inspection.
15081
15082 @item Son-of-RFC 1036
15083 @cindex Son-of-RFC 1036
15084 We do have some breaches to this one.
15085
15086 @table @emph
15087
15088 @item MIME
15089 Gnus does no MIME handling, and this standard-to-be seems to think that
15090 MIME is the bees' knees, so we have major breakage here.
15091
15092 @item X-Newsreader
15093 This is considered to be a ``vanity header'', while I consider it to be
15094 consumer information.  After seeing so many badly formatted articles
15095 coming from @code{tin} and @code{Netscape} I know not to use either of
15096 those for posting articles.  I would not have known that if it wasn't
15097 for the @code{X-Newsreader} header.
15098 @end table
15099
15100 @end table
15101
15102 If you ever notice Gnus acting non-compliant with regards to the texts
15103 mentioned above, don't hesitate to drop a note to Gnus Towers and let us
15104 know.
15105
15106
15107 @node Emacsen
15108 @subsection Emacsen
15109 @cindex Emacsen
15110 @cindex XEmacs
15111 @cindex Mule
15112 @cindex Emacs
15113
15114 Gnus should work on :
15115
15116 @itemize @bullet 
15117
15118 @item
15119 Emacs 19.32 and up.
15120
15121 @item
15122 XEmacs 19.14 and up.
15123
15124 @item 
15125 Mule versions based on Emacs 19.32 and up.
15126
15127 @end itemize
15128
15129 Gnus will absolutely not work on any Emacsen older than that.  Not
15130 reliably, at least. 
15131
15132 There are some vague differences between Gnus on the various
15133 platforms---XEmacs features more graphics (a logo and a toolbar)---but
15134 other than that, things should look pretty much the same under all
15135 Emacsen. 
15136
15137
15138 @node Contributors
15139 @subsection Contributors
15140 @cindex contributors
15141
15142 The new Gnus version couldn't have been done without the help of all the
15143 people on the (ding) mailing list.  Every day for over a year I have
15144 gotten billions of nice bug reports from them, filling me with joy,
15145 every single one of them.  Smooches.  The people on the list have been
15146 tried beyond endurance, what with my ``oh, that's a neat idea <type
15147 type>, yup, I'll release it right away <ship off> no wait, that doesn't
15148 work at all <type type>, yup, I'll ship that one off right away <ship
15149 off> no, wait, that absolutely does not work'' policy for releases.
15150 Micro$oft---bah.  Amateurs.  I'm @emph{much} worse.  (Or is that
15151 ``worser''? ``much worser''?  ``worsest''?)
15152
15153 I would like to take this opportunity to thank the Academy for...  oops,
15154 wrong show.
15155
15156 @itemize @bullet
15157
15158 @item 
15159 Masanobu @sc{Umeda}---the writer of the original @sc{gnus}.
15160
15161 @item 
15162 Per Abrahamsen---custom, scoring, highlighting and @sc{soup} code (as
15163 well as numerous other things).
15164
15165 @item 
15166 Luis Fernandes---design and graphics.
15167
15168 @item
15169 Erik Naggum---help, ideas, support, code and stuff.
15170
15171 @item 
15172 Wes Hardaker---@file{gnus-picon.el} and the manual section on
15173 @dfn{picons} (@pxref{Picons}).
15174
15175 @item
15176 Kim-Minh Kaplan---further work on the picon code.
15177
15178 @item 
15179 Brad Miller---@file{gnus-gl.el} and the GroupLens manual section
15180 (@pxref{GroupLens}).
15181
15182 @item 
15183 Sudish Joseph---innumerable bug fixes.
15184
15185 @item 
15186 Ilja Weis---@file{gnus-topic.el}.
15187
15188 @item 
15189 Steven L. Baur---lots and lots and lots of bugs detections and fixes.
15190
15191 @item 
15192 Vladimir Alexiev---the refcard and reference booklets.
15193
15194 @item 
15195 Felix Lee & Jamie Zawinsky---I stole some pieces from the XGnus
15196 distribution by Felix Lee and JWZ.
15197
15198 @item 
15199 Scott Byer---@file{nnfolder.el} enhancements & rewrite.
15200
15201 @item 
15202 Peter Mutsaers---orphan article scoring code.
15203
15204 @item 
15205 Ken Raeburn---POP mail support.
15206
15207 @item 
15208 Hallvard B Furuseth---various bits and pieces, especially dealing with
15209 .newsrc files.
15210
15211 @item 
15212 Brian Edmonds---@file{gnus-bbdb.el}.
15213
15214 @item
15215 David Moore---rewrite of @file{nnvirtual.el} and many other things. 
15216
15217 @item 
15218 Kevin Davidson---came up with the name @dfn{ding}, so blame him.
15219
15220 @item
15221 François Pinard---many, many interesting and thorough bug reports.
15222
15223 @end itemize
15224
15225 This manual was proof-read by Adrian Aichner, with Ricardo Nassif, Mark
15226 Borges, and Jost Krieger proof-reading parts of the manual.
15227
15228 The following people have contributed many patches and suggestions: 
15229
15230 Christopher Davis,
15231 Andrew Eskilsson,
15232 Kai Grossjohann,
15233 David KÃ¥gedal,
15234 Richard Pieri,
15235 Fabrice Popineau, 
15236 Daniel Quinlan, 
15237 Jason L. Tibbitts, III,
15238 and
15239 Jack Vinson.
15240
15241 Also thanks to the following for patches and stuff:
15242
15243 Adrian Aichner,
15244 Peter Arius, 
15245 Matt Armstrong,
15246 Marc Auslander,
15247 Robert Bihlmeyer,
15248 Chris Bone,
15249 Mark Borges,
15250 Mark Boyns,
15251 Lance A. Brown,
15252 Kees de Bruin,
15253 Martin Buchholz,
15254 Kevin Buhr,
15255 Alastair Burt,
15256 Joao Cachopo,
15257 Zlatko Calusic,
15258 Massimo Campostrini,
15259 Dan Christensen,
15260 Michael R. Cook,
15261 Glenn Coombs, 
15262 Frank D. Cringle, 
15263 Geoffrey T. Dairiki,
15264 Andre Deparade,
15265 Ulrik Dickow,
15266 Dave Disser,
15267 Joev Dubach,
15268 Michael Welsh Duggan,
15269 Paul Eggert,
15270 Michael Ernst,
15271 Luc Van Eycken,
15272 Sam Falkner,
15273 Nelson Jose dos Santos Ferreira,
15274 Sigbjorn Finne,
15275 Gary D. Foster,
15276 Paul Franklin, 
15277 Guy Geens,
15278 Arne Georg Gleditsch,
15279 David S. Goldberg,
15280 Michelangelo Grigni,
15281 D. Hall, 
15282 Magnus Hammerin,
15283 Raja R. Harinath,
15284 Hisashige Kenji, @c Hisashige
15285 Marc Horowitz,
15286 Gunnar Horrigmo,
15287 Brad Howes,
15288 François Felix Ingrand,
15289 Ishikawa Ichiro, @c Ishikawa
15290 Lee Iverson, 
15291 Rajappa Iyer,
15292 Andreas Jaeger,
15293 Randell Jesup,
15294 Fred Johansen, 
15295 Greg Klanderman,
15296 Karl Kleinpaste,
15297 Peter Skov Knudsen,
15298 Shuhei Kobayashi, @c Kobayashi
15299 Thor Kristoffersen,
15300 Jens Lautenbacher,
15301 Carsten Leonhardt,
15302 James LewisMoss,
15303 Christian Limpach,
15304 Markus Linnala,
15305 Dave Love,
15306 Tonny Madsen,
15307 Shlomo Mahlab,
15308 Nat Makarevitch,
15309 David Martin,
15310 Gordon Matzigkeit,
15311 Timo Metzemakers,
15312 Richard Mlynarik,
15313 Lantz Moore,
15314 Morioka Tomohiko, @c Morioka
15315 Erik Toubro Nielsen,
15316 Hrvoje Niksic,
15317 Andy Norman,
15318 C. R. Oldham,
15319 Alexandre Oliva,
15320 Ken Olstad,
15321 Masaharu Onishi, @c Onishi
15322 Hideki Ono, @c Ono
15323 William Perry,
15324 Stephen Peters,
15325 Ulrich Pfeifer,
15326 John McClary Prevost,
15327 Colin Rafferty,
15328 Bart Robinson,
15329 Jason Rumney,
15330 Jay Sachs,
15331 Dewey M. Sasser,
15332 Loren Schall,
15333 Dan Schmidt,
15334 Ralph Schleicher,
15335 Philippe Schnoebelen,
15336 Randal L. Schwartz,
15337 Justin Sheehy,
15338 Danny Siu, 
15339 Matt Simmons,
15340 Paul D. Smith,
15341 Jeff Sparkes,
15342 Toby Speight,
15343 Michael Sperber,
15344 Darren Stalder,
15345 Richard Stallman,
15346 Greg Stark, 
15347 Paul Stodghill,
15348 Kurt Swanson,
15349 Samuel Tardieu, 
15350 Teddy,
15351 Chuck Thompson,
15352 Philippe Troin,
15353 James Troup,
15354 Enami Tsugutomo, @c ?
15355 Aaron M. Ucko, 
15356 Jan Vroonhof,
15357 Barry A. Warsaw,
15358 Christoph Wedler,
15359 Joe Wells,
15360 and
15361 Katsumi Yamaoka. @c Yamaoka
15362
15363 For a full overview of what each person has done, the ChangeLogs
15364 included in the Gnus alpha distributions should give ample reading
15365 (550kB and counting).
15366
15367 Apologies to everybody that I've forgotten, of which there are many, I'm
15368 sure.  
15369
15370 Gee, that's quite a list of people.  I guess that must mean that there
15371 actually are people who are using Gnus.  Who'd'a thunk it!
15372
15373
15374 @node New Features
15375 @subsection New Features
15376 @cindex new features
15377
15378 @menu
15379 * ding Gnus::          New things in Gnus 5.0/5.1, the first new Gnus.
15380 * September Gnus::     The Thing Formally Known As Gnus 5.3/5.3.
15381 * Red Gnus::           Third time best---Gnus 5.4/5.5.
15382 @end menu
15383
15384 These lists are, of course, just @emph{short} overviews of the
15385 @emph{most} important new features.  No, really.  There are tons more.
15386 Yes, we have feeping creaturism in full effect.
15387
15388
15389 @node ding Gnus
15390 @subsubsection (ding) Gnus
15391
15392 New features in Gnus 5.0/5.1:
15393
15394 @itemize @bullet
15395
15396 @item
15397 The look of all buffers can be changed by setting format-like variables
15398 (@pxref{Group Buffer Format} and @pxref{Summary Buffer Format}). 
15399  
15400 @item 
15401 Local spool and several @sc{nntp} servers can be used at once
15402 (@pxref{Select Methods}).  
15403
15404 @item 
15405 You can combine groups into virtual groups (@pxref{Virtual Groups}).
15406
15407 @item 
15408 You can read a number of different mail formats (@pxref{Getting Mail}).
15409 All the mail backends implement a convenient mail expiry scheme
15410 (@pxref{Expiring Mail}). 
15411
15412 @item
15413 Gnus can use various strategies for gathering threads that have lost
15414 their roots (thereby gathering loose sub-threads into one thread) or it
15415 can go back and retrieve enough headers to build a complete thread
15416 (@pxref{Customizing Threading}).
15417
15418 @item 
15419 Killed groups can be displayed in the group buffer, and you can read
15420 them as well (@pxref{Listing Groups}).
15421
15422 @item 
15423 Gnus can do partial group updates---you do not have to retrieve the
15424 entire active file just to check for new articles in a few groups
15425 (@pxref{The Active File}).
15426
15427 @item 
15428 Gnus implements a sliding scale of subscribedness to groups
15429 (@pxref{Group Levels}).
15430
15431 @item 
15432 You can score articles according to any number of criteria
15433 (@pxref{Scoring}).  You can even get Gnus to find out how to score
15434 articles for you (@pxref{Adaptive Scoring}).
15435
15436 @item 
15437 Gnus maintains a dribble buffer that is auto-saved the normal Emacs
15438 manner, so it should be difficult to lose much data on what you have
15439 read if your machine should go down (@pxref{Auto Save}). 
15440
15441 @item 
15442 Gnus now has its own startup file (@file{.gnus}) to avoid cluttering up
15443 the @file{.emacs} file.
15444
15445 @item 
15446 You can set the process mark on both groups and articles and perform
15447 operations on all the marked items (@pxref{Process/Prefix}).
15448
15449 @item 
15450 You can grep through a subset of groups and create a group from the
15451 results (@pxref{Kibozed Groups}). 
15452
15453 @item 
15454 You can list subsets of groups according to, well, anything
15455 (@pxref{Listing Groups}). 
15456
15457 @item 
15458 You can browse foreign servers and subscribe to groups from those
15459 servers (@pxref{Browse Foreign Server}). 
15460
15461 @item 
15462 Gnus can fetch articles, asynchronously, on a second connection to the
15463 server (@pxref{Asynchronous Fetching}).
15464
15465 @item 
15466 You can cache articles locally (@pxref{Article Caching}). 
15467
15468 @item 
15469 The uudecode functions have been expanded and generalized
15470 (@pxref{Decoding Articles}). 
15471
15472 @item
15473 You can still post uuencoded articles, which was a little-known feature
15474 of @sc{gnus}' past (@pxref{Uuencoding and Posting}). 
15475
15476 @item
15477 Fetching parents (and other articles) now actually works without
15478 glitches (@pxref{Finding the Parent}). 
15479
15480 @item
15481 Gnus can fetch FAQs and group descriptions (@pxref{Group Information}).
15482
15483 @item
15484 Digests (and other files) can be used as the basis for groups
15485 (@pxref{Document Groups}).
15486
15487 @item 
15488 Articles can be highlighted and customized (@pxref{Customizing
15489 Articles}). 
15490
15491 @item 
15492 URLs and other external references can be buttonized (@pxref{Article
15493 Buttons}). 
15494
15495 @item
15496 You can do lots of strange stuff with the Gnus window & frame
15497 configuration (@pxref{Windows Configuration}).
15498
15499 @item
15500 You can click on buttons instead of using the keyboard
15501 (@pxref{Buttons}). 
15502
15503 @end itemize
15504
15505
15506 @node September Gnus
15507 @subsubsection September Gnus
15508
15509 New features in Gnus 5.2/5.3:
15510
15511 @itemize @bullet
15512
15513 @item
15514 A new message composition mode is used.  All old customization variables
15515 for @code{mail-mode}, @code{rnews-reply-mode} and @code{gnus-msg} are
15516 now obsolete.
15517
15518 @item
15519 Gnus is now able to generate @dfn{sparse} threads---threads where
15520 missing articles are represented by empty nodes (@pxref{Customizing
15521 Threading}). 
15522
15523 @lisp
15524 (setq gnus-build-sparse-threads 'some)
15525 @end lisp
15526
15527 @item
15528 Outgoing articles are stored on a special archive server
15529 (@pxref{Archived Messages}). 
15530
15531 @item
15532 Partial thread regeneration now happens when articles are
15533 referred. 
15534
15535 @item
15536 Gnus can make use of GroupLens predictions (@pxref{GroupLens}).
15537
15538 @item
15539 Picons (personal icons) can be displayed under XEmacs (@pxref{Picons}). 
15540
15541 @item
15542 A @code{trn}-like tree buffer can be displayed (@pxref{Tree Display}).
15543
15544 @lisp
15545 (setq gnus-use-trees t)
15546 @end lisp
15547
15548 @item
15549 An @code{nn}-like pick-and-read minor mode is available for the summary
15550 buffers (@pxref{Pick and Read}).
15551
15552 @lisp
15553 (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
15554 @end lisp
15555
15556 @item
15557 In binary groups you can use a special binary minor mode (@pxref{Binary
15558 Groups}). 
15559
15560 @item
15561 Groups can be grouped in a folding topic hierarchy (@pxref{Group
15562 Topics}).
15563
15564 @lisp
15565 (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
15566 @end lisp
15567
15568 @item
15569 Gnus can re-send and bounce mail (@pxref{Summary Mail Commands}).
15570
15571 @item
15572 Groups can now have a score, and bubbling based on entry frequency
15573 is possible (@pxref{Group Score}).
15574
15575 @lisp
15576 (add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group)
15577 @end lisp
15578
15579 @item
15580 Groups can be process-marked, and commands can be performed on
15581 groups of groups (@pxref{Marking Groups}).
15582
15583 @item
15584 Caching is possible in virtual groups.
15585
15586 @item
15587 @code{nndoc} now understands all kinds of digests, mail boxes, rnews
15588 news batches, ClariNet briefs collections, and just about everything
15589 else (@pxref{Document Groups}).
15590
15591 @item
15592 Gnus has a new backend (@code{nnsoup}) to create/read SOUP packets
15593 (@pxref{SOUP}).
15594
15595 @item
15596 The Gnus cache is much faster.
15597
15598 @item
15599 Groups can be sorted according to many criteria (@pxref{Sorting
15600 Groups}).
15601
15602 @item
15603 New group parameters have been introduced to set list-addresses and
15604 expiry times (@pxref{Group Parameters}).
15605
15606 @item
15607 All formatting specs allow specifying faces to be used
15608 (@pxref{Formatting Fonts}).
15609
15610 @item
15611 There are several more commands for setting/removing/acting on process
15612 marked articles on the @kbd{M P} submap (@pxref{Setting Process Marks}).
15613
15614 @item
15615 The summary buffer can be limited to show parts of the available
15616 articles based on a wide range of criteria.  These commands have been
15617 bound to keys on the @kbd{/} submap (@pxref{Limiting}).
15618
15619 @item
15620 Articles can be made persistent with the @kbd{*} command
15621 (@pxref{Persistent Articles}).
15622
15623 @item
15624 All functions for hiding article elements are now toggles.
15625
15626 @item
15627 Article headers can be buttonized (@pxref{Article Washing}).
15628
15629 @lisp
15630 (add-hook 'gnus-article-display-hook 
15631           'gnus-article-add-buttons-to-head)
15632 @end lisp
15633
15634 @item
15635 All mail backends support fetching articles by @code{Message-ID}.
15636
15637 @item
15638 Duplicate mail can now be treated properly (@pxref{Duplicates}).
15639
15640 @item
15641 All summary mode commands are available directly from the article
15642 buffer (@pxref{Article Keymap}). 
15643
15644 @item
15645 Frames can be part of @code{gnus-buffer-configuration} (@pxref{Windows
15646 Configuration}).
15647
15648 @item
15649 Mail can be re-scanned by a daemonic process (@pxref{Daemons}).
15650
15651 @item
15652 Gnus can make use of NoCeM files to weed out spam (@pxref{NoCeM}).
15653
15654 @lisp
15655 (setq gnus-use-nocem t)
15656 @end lisp
15657
15658 @item
15659 Groups can be made permanently visible (@pxref{Listing Groups}).
15660
15661 @lisp
15662 (setq gnus-permanently-visible-groups "^nnml:")
15663 @end lisp
15664
15665 @item
15666 Many new hooks have been introduced to make customizing easier. 
15667
15668 @item
15669 Gnus respects the @code{Mail-Copies-To} header.
15670
15671 @item
15672 Threads can be gathered by looking at the @code{References} header
15673 (@pxref{Customizing Threading}).
15674
15675 @lisp
15676 (setq gnus-summary-thread-gathering-function 
15677       'gnus-gather-threads-by-references)
15678 @end lisp
15679
15680 @item
15681 Read articles can be stored in a special backlog buffer to avoid
15682 refetching (@pxref{Article Backlog}).  
15683
15684 @lisp
15685 (setq gnus-keep-backlog 50)
15686 @end lisp
15687
15688 @item
15689 A clean copy of the current article is always stored in a separate
15690 buffer to allow easier treatment.
15691
15692 @item
15693 Gnus can suggest where to save articles (@pxref{Saving Articles}).
15694
15695 @item
15696 Gnus doesn't have to do as much prompting when saving (@pxref{Saving
15697 Articles}). 
15698
15699 @lisp
15700 (setq gnus-prompt-before-saving t)
15701 @end lisp
15702
15703 @item
15704 @code{gnus-uu} can view decoded files asynchronously while fetching
15705 articles (@pxref{Other Decode Variables}). 
15706
15707 @lisp
15708 (setq gnus-uu-grabbed-file-functions 'gnus-uu-grab-view)
15709 @end lisp
15710
15711 @item
15712 Filling in the article buffer now works properly on cited text
15713 (@pxref{Article Washing}).
15714
15715 @item
15716 Hiding cited text adds buttons to toggle hiding, and how much
15717 cited text to hide is now customizable (@pxref{Article Hiding}).
15718
15719 @lisp
15720 (setq gnus-cited-lines-visible 2)
15721 @end lisp
15722
15723 @item
15724 Boring headers can be hidden (@pxref{Article Hiding}).
15725
15726 @lisp
15727 (add-hook 'gnus-article-display-hook 
15728           'gnus-article-hide-boring-headers t)
15729 @end lisp
15730
15731 @item
15732 Default scoring values can now be set from the menu bar.
15733
15734 @item
15735 Further syntax checking of outgoing articles have been added.
15736
15737 @end itemize
15738
15739
15740 @node Red Gnus
15741 @subsubsection Red Gnus
15742
15743 New features in Gnus 5.4/5.5:
15744
15745 @itemize @bullet
15746
15747 @item
15748 @file{nntp.el} has been totally rewritten in an asynchronous fashion.
15749
15750 @item
15751 Article prefetching functionality has been moved up into 
15752 Gnus (@pxref{Asynchronous Fetching}).  
15753
15754 @item
15755 Scoring can now be performed with logical operators like @code{and},
15756 @code{or}, @code{not}, and parent redirection (@pxref{Advanced
15757 Scoring}).
15758
15759 @item
15760 Article washing status can be displayed in the
15761 article mode line (@pxref{Misc Article}).
15762
15763 @item
15764 @file{gnus.el} has been split into many smaller files.
15765
15766 @item
15767 Suppression of duplicate articles based on Message-ID can be done
15768 (@pxref{Duplicate Suppression}).
15769
15770 @lisp
15771 (setq gnus-suppress-duplicates t)
15772 @end lisp
15773
15774 @item
15775 New variables for specifying what score and adapt files are to be
15776 considered home score and adapt files (@pxref{Home Score File}) have
15777 been added.
15778
15779 @item
15780 @code{nndoc} was rewritten to be easily extendable (@pxref{Document
15781 Server Internals}). 
15782
15783 @item
15784 Groups can inherit group parameters from parent topics (@pxref{Topic
15785 Parameters}).
15786
15787 @item
15788 Article editing has been revamped and is now actually usable.
15789
15790 @item
15791 Signatures can be recognized in more intelligent fashions
15792 (@pxref{Article Signature}).
15793
15794 @item
15795 Summary pick mode has been made to look more @code{nn}-like.  Line
15796 numbers are displayed and the @kbd{.} command can be used to pick
15797 articles (@code{Pick and Read}).
15798
15799 @item
15800 Commands for moving the @file{.newsrc.eld} from one server to
15801 another have been added (@pxref{Changing Servers}).
15802
15803 @item
15804 There's a way now to specify that ``uninteresting'' fields be suppressed
15805 when generating lines in buffers (@pxref{Advanced Formatting}).
15806
15807 @item
15808 Several commands in the group buffer can be undone with @kbd{M-C-_}
15809 (@pxref{Undo}).
15810
15811 @item
15812 Scoring can be done on words using the new score type @code{w}
15813 (@pxref{Score File Format}).
15814
15815 @item
15816 Adaptive scoring can be done on a Subject word-by-word basis
15817 (@pxref{Adaptive Scoring}). 
15818
15819 @lisp
15820 (setq gnus-use-adaptive-scoring '(word))
15821 @end lisp
15822
15823 @item
15824 Scores can be decayed (@pxref{Score Decays}).
15825  
15826 @lisp
15827 (setq gnus-decay-scores t)
15828 @end lisp
15829
15830 @item
15831 Scoring can be performed using a regexp on the Date header.  The Date is
15832 normalized to compact ISO 8601 format first (@pxref{Score File Format}).
15833
15834 @item
15835 A new command has been added to remove all data on articles from
15836 the native server (@pxref{Changing Servers}).
15837
15838 @item
15839 A new command for reading collections of documents
15840 (@code{nndoc} with @code{nnvirtual} on top) has been added---@kbd{M-C-d}
15841 (@pxref{Really Various Summary Commands}). 
15842
15843 @item
15844 Process mark sets can be pushed and popped (@pxref{Setting Process
15845 Marks}).
15846
15847 @item
15848 A new mail-to-news backend makes it possible to post even when the NNTP
15849 server doesn't allow posting (@pxref{Mail-To-News Gateways}).
15850
15851 @item
15852 A new backend for reading searches from Web search engines
15853 (@dfn{DejaNews}, @dfn{Alta Vista}, @dfn{InReference}) has been added
15854 (@pxref{Web Searches}).
15855
15856 @item
15857 Groups inside topics can now be sorted using the standard sorting
15858 functions, and each topic can be sorted independently (@pxref{Topic
15859 Sorting}).
15860
15861 @item
15862 Subsets of the groups can be sorted independently (@code{Sorting
15863 Groups}).
15864
15865 @item
15866 Cached articles can be pulled into the groups (@pxref{Summary Generation
15867 Commands}).
15868   
15869 @item
15870 Score files are now applied in a more reliable order (@pxref{Score
15871 Variables}).
15872
15873 @item
15874 Reports on where mail messages end up can be generated (@pxref{Splitting
15875 Mail}).
15876
15877 @item
15878 More hooks and functions have been added to remove junk from incoming
15879 mail before saving the mail (@pxref{Washing Mail}).
15880
15881 @item
15882 Emphasized text can be properly fontisized:
15883
15884 @lisp
15885 (add-hook 'gnus-article-display-hook 'gnus-article-emphasize)
15886 @end lisp
15887  
15888 @end itemize
15889
15890
15891 @node Newest Features
15892 @subsection Newest Features
15893 @cindex todo
15894
15895 Also known as the @dfn{todo list}.  Sure to be implemented before the
15896 next millennium. 
15897
15898 Be afraid.  Be very afraid.
15899
15900 @itemize @bullet
15901 @item
15902 Native @sc{mime} support is something that should be done.  
15903 @item
15904 Really do unbinhexing.
15905 @end itemize
15906
15907 And much, much, much more.  There is more to come than has already been
15908 implemented.  (But that's always true, isn't it?)
15909
15910 @file{<URL:http://www.ifi.uio.no/~larsi/rgnus/todo>} is where the actual
15911 up-to-the-second todo list is located, so if you're really curious, you
15912 could point your Web browser over that-a-way.
15913
15914 @iftex
15915
15916 @page
15917 @node The Manual
15918 @section The Manual
15919 @cindex colophon
15920 @cindex manual
15921
15922 This manual was generated from a TeXinfo file and then run through
15923 either @code{texi2dvi}
15924 @iflatex
15925 or my own home-brewed TeXinfo to \LaTeX\ transformer,
15926 and then run through @code{latex} and @code{dvips} 
15927 @end iflatex
15928 to get what you hold in your hands now.
15929
15930 The following conventions have been used:
15931
15932 @enumerate
15933
15934 @item
15935 This is a @samp{string}
15936
15937 @item
15938 This is a @kbd{keystroke}
15939
15940 @item
15941 This is a @file{file}
15942
15943 @item 
15944 This is a @code{symbol}
15945
15946 @end enumerate
15947
15948 So if I were to say ``set @code{flargnoze} to @samp{yes}'', that would
15949 mean:
15950
15951 @lisp
15952 (setq flargnoze "yes")
15953 @end lisp
15954
15955 If I say ``set @code{flumphel} to @code{yes}'', that would mean:
15956
15957 @lisp
15958 (setq flumphel 'yes)
15959 @end lisp
15960
15961 @samp{yes} and @code{yes} are two @emph{very} different things---don't
15962 ever get them confused.
15963
15964 @iflatex
15965 @c @head
15966 Of course, everything in this manual is of vital interest, so you should
15967 read it all.  Several times.  However, if you feel like skimming the
15968 manual, look for that gnu head you should see in the margin over
15969 there---it means that what's being discussed is of more importance than
15970 the rest of the stuff.  (On the other hand, if everything is infinitely
15971 important, how can anything be more important than that?  Just one more
15972 of the mysteries of this world, I guess.)
15973 @end iflatex
15974
15975 @end iftex
15976
15977
15978 @page
15979 @node Terminology
15980 @section Terminology
15981
15982 @cindex terminology
15983 @table @dfn
15984
15985 @item news
15986 @cindex news
15987 This is what you are supposed to use this thing for---reading news.
15988 News is generally fetched from a nearby @sc{nntp} server, and is
15989 generally publicly available to everybody.  If you post news, the entire
15990 world is likely to read just what you have written, and they'll all
15991 snigger mischievously.  Behind your back.
15992
15993 @item mail
15994 @cindex mail
15995 Everything that's delivered to you personally is mail.  Some news/mail
15996 readers (like Gnus) blur the distinction between mail and news, but
15997 there is a difference.  Mail is private.  News is public.  Mailing is
15998 not posting, and replying is not following up.
15999
16000 @item reply
16001 @cindex reply
16002 Send a mail to the person who has written what you are reading.
16003
16004 @item follow up
16005 @cindex follow up
16006 Post an article to the current newsgroup responding to the article you
16007 are reading.
16008
16009 @item backend
16010 @cindex backend
16011 Gnus gets fed articles from a number of backends, both news and mail
16012 backends.  Gnus does not handle the underlying media, so to speak---this
16013 is all done by the backends.
16014
16015 @item native
16016 @cindex native
16017 Gnus will always use one method (and backend) as the @dfn{native}, or
16018 default, way of getting news.
16019
16020 @item foreign
16021 @cindex foreign
16022 You can also have any number of foreign groups active at the same time.
16023 These are groups that use non-native non-secondary backends for getting
16024 news.
16025
16026 @item secondary
16027 @cindex secondary
16028 Secondary backends are somewhere half-way between being native and being
16029 foreign, but they mostly act like they are native.
16030
16031 @item article
16032 @cindex article
16033 A message that has been posted as news.
16034
16035 @item mail message
16036 @cindex mail message
16037 A message that has been mailed.
16038
16039 @item message 
16040 @cindex message
16041 A mail message or news article
16042
16043 @item head
16044 @cindex head
16045 The top part of a message, where administrative information (etc.) is
16046 put.
16047
16048 @item body
16049 @cindex body
16050 The rest of an article.  Everything not in the head is in the
16051 body. 
16052
16053 @item header
16054 @cindex header
16055 A line from the head of an article. 
16056
16057 @item headers
16058 @cindex headers
16059 A collection of such lines, or a collection of heads.  Or even a
16060 collection of @sc{nov} lines.
16061
16062 @item @sc{nov}
16063 @cindex nov
16064 When Gnus enters a group, it asks the backend for the headers of all
16065 unread articles in the group.  Most servers support the News OverView
16066 format, which is more compact and much faster to read and parse than the
16067 normal @sc{head} format.
16068
16069 @item level
16070 @cindex levels
16071 Each group is subscribed at some @dfn{level} or other (1-9).  The ones
16072 that have a lower level are ``more'' subscribed than the groups with a
16073 higher level.  In fact, groups on levels 1-5 are considered
16074 @dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9
16075 are @dfn{killed}.  Commands for listing groups and scanning for new
16076 articles will all use the numeric prefix as @dfn{working level}.
16077
16078 @item killed groups
16079 @cindex killed groups
16080 No information on killed groups is stored or updated, which makes killed
16081 groups much easier to handle than subscribed groups.
16082
16083 @item zombie groups
16084 @cindex zombie groups
16085 Just like killed groups, only slightly less dead.
16086
16087 @item active file
16088 @cindex active file
16089 The news server has to keep track of what articles it carries, and what
16090 groups exist.  All this information in stored in the active file, which
16091 is rather large, as you might surmise.
16092
16093 @item bogus groups
16094 @cindex bogus groups
16095 A group that exists in the @file{.newsrc} file, but isn't known to the
16096 server (i.e.,  it isn't in the active file), is a @emph{bogus group}.
16097 This means that the group probably doesn't exist (any more).
16098
16099 @item server 
16100 @cindex server
16101 A machine one can connect to and get news (or mail) from.
16102
16103 @item select method
16104 @cindex select method
16105 A structure that specifies the backend, the server and the virtual
16106 server settings.
16107
16108 @item virtual server
16109 @cindex virtual server
16110 A named select method.  Since a select method defines all there is to
16111 know about connecting to a (physical) server, taking the thing as a
16112 whole is a virtual server.
16113
16114 @item washing
16115 @cindex washing
16116 Taking a buffer and running it through a filter of some sort.  The
16117 result will (more often than not) be cleaner and more pleasing than the
16118 original. 
16119
16120 @item ephemeral groups
16121 @cindex ephemeral groups
16122 Most groups store data on what articles you have read.  @dfn{Ephemeral}
16123 groups are groups that will have no data stored---when you exit the
16124 group, it'll disappear into the aether.  
16125
16126 @item solid groups
16127 @cindex solid groups
16128 This is the opposite of ephemeral groups.  All groups listed in the
16129 group buffer are solid groups.
16130
16131 @item sparse articles
16132 @cindex sparse articles
16133 These are article placeholders shown in the summary buffer when
16134 @code{gnus-build-sparse-threads} has been switched on.
16135
16136 @item threading
16137 @cindex threading
16138 To put responses to articles directly after the articles they respond
16139 to---in a hierarchical fashion.
16140
16141 @item root
16142 @cindex root
16143 @cindex thread root
16144 The first article in a thread is the root.  It is the ancestor of all
16145 articles in the thread.
16146
16147 @item parent
16148 @cindex parent
16149 An article that has responses.
16150
16151 @item child
16152 @cindex child
16153 An article that responds to a different article---its parent.
16154
16155 @item digest
16156 @cindex digest
16157 A collection of messages in one file.  The most common digest format is
16158 specified by RFC1153.
16159
16160 @end table
16161
16162
16163 @page
16164 @node Customization
16165 @section Customization
16166 @cindex general customization
16167
16168 All variables are properly documented elsewhere in this manual.  This
16169 section is designed to give general pointers on how to customize Gnus
16170 for some quite common situations.
16171
16172 @menu
16173 * Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.
16174 * Slow Terminal Connection::  You run a remote Emacs.
16175 * Little Disk Space::         You feel that having large setup files is icky.
16176 * Slow Machine::              You feel like buying a faster machine.
16177 @end menu
16178
16179
16180 @node Slow/Expensive Connection
16181 @subsection Slow/Expensive @sc{nntp} Connection
16182
16183 If you run Emacs on a machine locally, and get your news from a machine
16184 over some very thin strings, you want to cut down on the amount of data
16185 Gnus has to get from the @sc{nntp} server.
16186
16187 @table @code
16188
16189 @item gnus-read-active-file
16190 Set this to @code{nil}, which will inhibit Gnus from requesting the
16191 entire active file from the server.  This file is often v.  large.  You
16192 also have to set @code{gnus-check-new-newsgroups} and
16193 @code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus
16194 doesn't suddenly decide to fetch the active file anyway.
16195
16196 @item gnus-nov-is-evil
16197 This one has to be @code{nil}.  If not, grabbing article headers from
16198 the @sc{nntp} server will not be very fast.  Not all @sc{nntp} servers
16199 support @sc{xover}; Gnus will detect this by itself.
16200 @end table
16201
16202
16203 @node Slow Terminal Connection
16204 @subsection Slow Terminal Connection
16205
16206 Let's say you use your home computer for dialing up the system that runs
16207 Emacs and Gnus.  If your modem is slow, you want to reduce (as much as
16208 possible) the amount of data sent over the wires.
16209
16210 @table @code
16211
16212 @item gnus-auto-center-summary
16213 Set this to @code{nil} to inhibit Gnus from re-centering the summary
16214 buffer all the time.  If it is @code{vertical}, do only vertical
16215 re-centering.  If it is neither @code{nil} nor @code{vertical}, do both
16216 horizontal and vertical recentering.
16217
16218 @item gnus-visible-headers
16219 Cut down on the headers included in the articles to the
16220 minimum.  You can, in fact, make do without them altogether---most of the
16221 useful data is in the summary buffer, anyway.  Set this variable to
16222 @samp{^NEVVVVER} or @samp{From:}, or whatever you feel you need.
16223
16224 @item gnus-article-display-hook
16225 Set this hook to all the available hiding commands:
16226 @lisp
16227 (setq gnus-article-display-hook 
16228       '(gnus-article-hide-headers gnus-article-hide-signature
16229         gnus-article-hide-citation))
16230 @end lisp
16231
16232 @item gnus-use-full-window
16233 By setting this to @code{nil}, you can make all the windows smaller.
16234 While this doesn't really cut down much generally, it means that you
16235 have to see smaller portions of articles before deciding that you didn't
16236 want to read them anyway.
16237
16238 @item gnus-thread-hide-subtree
16239 If this is non-@code{nil}, all threads in the summary buffer will be
16240 hidden initially.
16241
16242 @item gnus-updated-mode-lines
16243 If this is @code{nil}, Gnus will not put information in the buffer mode
16244 lines, which might save some time.
16245 @end table
16246
16247
16248 @node Little Disk Space
16249 @subsection Little Disk Space
16250 @cindex disk space
16251
16252 The startup files can get rather large, so you may want to cut their
16253 sizes a bit if you are running out of space.
16254
16255 @table @code
16256
16257 @item gnus-save-newsrc-file
16258 If this is @code{nil}, Gnus will never save @file{.newsrc}---it will
16259 only save @file{.newsrc.eld}.  This means that you will not be able to
16260 use any other newsreaders than Gnus.  This variable is @code{t} by
16261 default. 
16262
16263 @item gnus-save-killed-list
16264 If this is @code{nil}, Gnus will not save the list of dead groups.  You
16265 should also set @code{gnus-check-new-newsgroups} to @code{ask-server}
16266 and @code{gnus-check-bogus-newsgroups} to @code{nil} if you set this
16267 variable to @code{nil}.  This variable is @code{t} by default.
16268
16269 @end table
16270
16271
16272 @node Slow Machine
16273 @subsection Slow Machine
16274 @cindex slow machine
16275
16276 If you have a slow machine, or are just really impatient, there are a
16277 few things you can do to make Gnus run faster.
16278
16279 Set @code{gnus-check-new-newsgroups} and
16280 @code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster.
16281
16282 Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and
16283 @code{gnus-nov-is-evil} to @code{nil} to make entering and exiting the
16284 summary buffer faster.
16285
16286 Set @code{gnus-article-display-hook} to @code{nil} to make article
16287 processing a bit faster.
16288
16289
16290 @page
16291 @node Troubleshooting
16292 @section Troubleshooting
16293 @cindex troubleshooting
16294
16295 Gnus works @emph{so} well straight out of the box---I can't imagine any
16296 problems, really.
16297
16298 Ahem.
16299
16300 @enumerate
16301
16302 @item
16303 Make sure your computer is switched on.
16304
16305 @item
16306 Make sure that you really load the current Gnus version.  If you have
16307 been running @sc{gnus}, you need to exit Emacs and start it up again before
16308 Gnus will work.
16309
16310 @item
16311 Try doing an @kbd{M-x gnus-version}.  If you get something that looks
16312 like @samp{Gnus v5.46; nntp 4.0} you have the right files loaded.  If,
16313 on the other hand, you get something like @samp{NNTP 3.x} or @samp{nntp
16314 flee}, you have some old @file{.el} files lying around.  Delete these.
16315
16316 @item
16317 Read the help group (@kbd{G h} in the group buffer) for a FAQ and a
16318 how-to. 
16319
16320 @item
16321 @vindex max-lisp-eval-depth
16322 Gnus works on many recursive structures, and in some extreme (and very
16323 rare) cases Gnus may recurse down ``too deeply'' and Emacs will beep at
16324 you.  If this happens to you, set @code{max-lisp-eval-depth} to 500 or
16325 something like that.
16326 @end enumerate
16327
16328 If all else fails, report the problem as a bug.
16329
16330 @cindex bugs
16331 @cindex reporting bugs
16332
16333 @kindex M-x gnus-bug
16334 @findex gnus-bug
16335 If you find a bug in Gnus, you can report it with the @kbd{M-x gnus-bug}
16336 command. @kbd{M-x set-variable RET debug-on-error RET t RET}, and send
16337 me the backtrace.  I will fix bugs, but I can only fix them if you send
16338 me a precise description as to how to reproduce the bug.
16339
16340 You really can never be too detailed in a bug report.  Always use the
16341 @kbd{M-x gnus-bug} command when you make bug reports, even if it creates
16342 a 10Kb mail each time you use it, and even if you have sent me your
16343 environment 500 times before.  I don't care.  I want the full info each
16344 time.  
16345
16346 It is also important to remember that I have no memory whatsoever.  If
16347 you send a bug report, and I send you a reply, and then you just send
16348 back ``No, it's not! Moron!'', I will have no idea what you are
16349 insulting me about.  Always over-explain everything.  It's much easier
16350 for all of us---if I don't have all the information I need, I will just
16351 mail you and ask for more info, and everything takes more time.
16352
16353 If the problem you're seeing is very visual, and you can't quite explain
16354 it, copy the Emacs window to a file (with @code{xwd}, for instance), put
16355 it somewhere it can be reached, and include the URL of the picture in
16356 the bug report.
16357
16358 If you just need help, you are better off asking on
16359 @samp{gnu.emacs.gnus}.  I'm not very helpful.
16360
16361 @cindex gnu.emacs.gnus
16362 @cindex ding mailing list
16363 You can also ask on the ding mailing list---@samp{ding@@gnus.org}.
16364 Write to @samp{ding-request@@gnus.org} to subscribe.
16365
16366
16367 @page
16368 @node A Programmers Guide to Gnus
16369 @section A Programmer@'s Guide to Gnus
16370
16371 It is my hope that other people will figure out smart stuff that Gnus
16372 can do, and that other people will write those smart things as well.  To
16373 facilitate that I thought it would be a good idea to describe the inner
16374 workings of Gnus.  And some of the not-so-inner workings, while I'm at
16375 it.
16376
16377 You can never expect the internals of a program not to change, but I
16378 will be defining (in some details) the interface between Gnus and its
16379 backends (this is written in stone), the format of the score files
16380 (ditto), data structures (some are less likely to change than others)
16381 and general methods of operation.
16382
16383 @menu 
16384 * Gnus Utility Functions::   Common functions and variable to use.
16385 * Backend Interface::        How Gnus communicates with the servers.
16386 * Score File Syntax::        A BNF definition of the score file standard.
16387 * Headers::                  How Gnus stores headers internally.
16388 * Ranges::                   A handy format for storing mucho numbers.
16389 * Group Info::               The group info format.
16390 * Extended Interactive::     Symbolic prefixes and stuff.
16391 * Emacs/XEmacs Code::        Gnus can be run under all modern Emacsen.
16392 * Various File Formats::     Formats of files that Gnus use.
16393 @end menu
16394
16395
16396 @node Gnus Utility Functions
16397 @subsection Gnus Utility Functions
16398 @cindex Gnus utility functions
16399 @cindex utility functions
16400 @cindex functions
16401 @cindex internal variables
16402
16403 When writing small functions to be run from hooks (and stuff), it's
16404 vital to have access to the Gnus internal functions and variables.
16405 Below is a list of the most common ones.
16406
16407 @table @code
16408
16409 @item gnus-newsgroup-name
16410 @vindex gnus-newsgroup-name
16411 This variable holds the name of the current newsgroup.
16412
16413 @item gnus-find-method-for-group
16414 @findex gnus-find-method-for-group
16415 A function that returns the select method for @var{group}.
16416
16417 @item gnus-group-real-name
16418 @findex gnus-group-real-name
16419 Takes a full (prefixed) Gnus group name, and returns the unprefixed
16420 name.
16421
16422 @item gnus-group-prefixed-name
16423 @findex gnus-group-prefixed-name
16424 Takes an unprefixed group name and a select method, and returns the full
16425 (prefixed) Gnus group name.
16426
16427 @item gnus-get-info
16428 @findex gnus-get-info
16429 Returns the group info list for @var{group}.
16430
16431 @item gnus-add-current-to-buffer-list
16432 @findex gnus-add-current-to-buffer-list
16433 Adds the current buffer to the list of buffers to be killed on Gnus
16434 exit.
16435
16436 @item gnus-continuum-version
16437 @findex gnus-continuum-version
16438 Takes a Gnus version string as a parameter and returns a floating point
16439 number.  Earlier versions will always get a lower number than later
16440 versions.
16441
16442 @item gnus-group-read-only-p
16443 @findex gnus-group-read-only-p
16444 Says whether @var{group} is read-only or not.
16445
16446 @item gnus-news-group-p
16447 @findex gnus-news-group-p
16448 Says whether @var{group} came from a news backend.
16449
16450 @item gnus-ephemeral-group-p
16451 @findex gnus-ephemeral-group-p
16452 Says whether @var{group} is ephemeral or not.
16453
16454 @item gnus-server-to-method
16455 @findex gnus-server-to-method
16456 Returns the select method corresponding to @var{server}.
16457
16458 @item gnus-server-equal
16459 @findex gnus-server-equal
16460 Says whether two virtual servers are equal.
16461
16462 @item gnus-group-native-p
16463 @findex gnus-group-native-p
16464 Says whether @var{group} is native or not.
16465
16466 @item gnus-group-secondary-p
16467 @findex gnus-group-secondary-p
16468 Says whether @var{group} is secondary or not.
16469
16470 @item gnus-group-foreign-p
16471 @findex gnus-group-foreign-p
16472 Says whether @var{group} is foreign or not.
16473
16474 @item group-group-find-parameter
16475 @findex group-group-find-parameter
16476 Returns the parameter list of @var{group}.  If given a second parameter,
16477 returns the value of that parameter for @var{group}.
16478
16479 @item gnus-group-set-parameter
16480 @findex gnus-group-set-parameter
16481 Takes three parameters; @var{group}, @var{parameter} and @var{value}.
16482
16483 @item gnus-narrow-to-body
16484 @findex gnus-narrow-to-body
16485 Narrows the current buffer to the body of the article.
16486
16487 @item gnus-check-backend-function
16488 @findex gnus-check-backend-function
16489 Takes two parameters, @var{function} and @var{group}.  If the backend
16490 @var{group} comes from supports @var{function}, return non-@code{nil}.
16491
16492 @lisp
16493 (gnus-check-backend-function "request-scan" "nnml:misc")
16494 => t
16495 @end lisp
16496
16497 @item gnus-read-method
16498 @findex gnus-read-method
16499 Prompts the user for a select method.
16500
16501 @end table
16502
16503
16504 @node Backend Interface
16505 @subsection Backend Interface
16506
16507 Gnus doesn't know anything about @sc{nntp}, spools, mail or virtual
16508 groups.  It only knows how to talk to @dfn{virtual servers}.  A virtual
16509 server is a @dfn{backend} and some @dfn{backend variables}.  As examples
16510 of the first, we have @code{nntp}, @code{nnspool} and @code{nnmbox}.  As
16511 examples of the latter we have @code{nntp-port-number} and
16512 @code{nnmbox-directory}.
16513
16514 When Gnus asks for information from a backend---say @code{nntp}---on
16515 something, it will normally include a virtual server name in the
16516 function parameters.  (If not, the backend should use the ``current''
16517 virtual server.)  For instance, @code{nntp-request-list} takes a virtual
16518 server as its only (optional) parameter.  If this virtual server hasn't
16519 been opened, the function should fail.
16520
16521 Note that a virtual server name has no relation to some physical server
16522 name.  Take this example:
16523
16524 @lisp
16525 (nntp "odd-one" 
16526       (nntp-address "ifi.uio.no") 
16527       (nntp-port-number 4324))
16528 @end lisp
16529
16530 Here the virtual server name is @samp{odd-one} while the name of
16531 the physical server is @samp{ifi.uio.no}. 
16532
16533 The backends should be able to switch between several virtual servers.
16534 The standard backends implement this by keeping an alist of virtual
16535 server environments that they pull down/push up when needed.  
16536
16537 There are two groups of interface functions: @dfn{required functions},
16538 which must be present, and @dfn{optional functions}, which Gnus will
16539 always check for presence before attempting to call 'em.
16540
16541 All these functions are expected to return data in the buffer
16542 @code{nntp-server-buffer} (@samp{ *nntpd*}), which is somewhat
16543 unfortunately named, but we'll have to live with it.  When I talk about
16544 @dfn{resulting data}, I always refer to the data in that buffer.  When I
16545 talk about @dfn{return value}, I talk about the function value returned by
16546 the function call.  Functions that fail should return @code{nil} as the
16547 return value.
16548
16549 Some backends could be said to be @dfn{server-forming} backends, and
16550 some might be said not to be.  The latter are backends that generally
16551 only operate on one group at a time, and have no concept of ``server''
16552 -- they have a group, and they deliver info on that group and nothing
16553 more.
16554
16555 In the examples and definitions I will refer to the imaginary backend
16556 @code{nnchoke}. 
16557
16558 @cindex @code{nnchoke}
16559
16560 @menu
16561 * Required Backend Functions::        Functions that must be implemented.
16562 * Optional Backend Functions::        Functions that need not be implemented.
16563 * Error Messaging::                   How to get messages and report errors.
16564 * Writing New Backends::              Extending old backends.
16565 * Hooking New Backends Into Gnus::    What has to be done on the Gnus end.
16566 * Mail-like Backends::                Some tips on mail backends.
16567 @end menu
16568
16569
16570 @node Required Backend Functions
16571 @subsubsection Required Backend Functions
16572
16573 @table @code
16574
16575 @item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD)
16576
16577 @var{articles} is either a range of article numbers or a list of
16578 @code{Message-ID}s.  Current backends do not fully support either---only
16579 sequences (lists) of article numbers, and most backends do not support
16580 retrieval of @code{Message-ID}s.  But they should try for both. 
16581
16582 The result data should either be HEADs or NOV lines, and the result
16583 value should either be @code{headers} or @code{nov} to reflect this.
16584 This might later be expanded to @code{various}, which will be a mixture
16585 of HEADs and NOV lines, but this is currently not supported by Gnus.  
16586
16587 If @var{fetch-old} is non-@code{nil} it says to try fetching "extra
16588 headers", in some meaning of the word.  This is generally done by
16589 fetching (at most) @var{fetch-old} extra headers less than the smallest
16590 article number in @code{articles}, and filling the gaps as well.  The
16591 presence of this parameter can be ignored if the backend finds it
16592 cumbersome to follow the request.  If this is non-@code{nil} and not a
16593 number, do maximum fetches.
16594
16595 Here's an example HEAD:
16596
16597 @example
16598 221 1056 Article retrieved.
16599 Path: ifi.uio.no!sturles
16600 From: sturles@@ifi.uio.no (Sturle Sunde)
16601 Newsgroups: ifi.discussion
16602 Subject: Re: Something very droll
16603 Date: 27 Oct 1994 14:02:57 +0100
16604 Organization: Dept. of Informatics, University of Oslo, Norway
16605 Lines: 26
16606 Message-ID: <38o8e1$a0o@@holmenkollen.ifi.uio.no>
16607 References: <38jdmq$4qu@@visbur.ifi.uio.no>
16608 NNTP-Posting-Host: holmenkollen.ifi.uio.no
16609 .
16610 @end example
16611
16612 So a @code{headers} return value would imply that there's a number of
16613 these in the data buffer.
16614
16615 Here's a BNF definition of such a buffer:
16616
16617 @example
16618 headers        = *head
16619 head           = error / valid-head
16620 error-message  = [ "4" / "5" ] 2number " " <error message> eol
16621 valid-head     = valid-message *header "." eol
16622 valid-message  = "221 " <number> " Article retrieved." eol
16623 header         = <text> eol
16624 @end example
16625
16626 If the return value is @code{nov}, the data buffer should contain
16627 @dfn{network overview database} lines.  These are basically fields
16628 separated by tabs. 
16629
16630 @example
16631 nov-buffer = *nov-line
16632 nov-line   = 8*9 [ field <TAB> ] eol
16633 field      = <text except TAB>
16634 @end example
16635
16636 For a closer look at what should be in those fields,
16637 @pxref{Headers}. 
16638
16639
16640 @item (nnchoke-open-server SERVER &optional DEFINITIONS)
16641
16642 @var{server} is here the virtual server name.  @var{definitions} is a
16643 list of @code{(VARIABLE VALUE)} pairs that define this virtual server. 
16644
16645 If the server can't be opened, no error should be signaled.  The backend
16646 may then choose to refuse further attempts at connecting to this
16647 server.  In fact, it should do so. 
16648
16649 If the server is opened already, this function should return a
16650 non-@code{nil} value.  There should be no data returned.
16651
16652
16653 @item (nnchoke-close-server &optional SERVER)
16654
16655 Close connection to @var{server} and free all resources connected
16656 to it.  Return @code{nil} if the server couldn't be closed for some
16657 reason.
16658
16659 There should be no data returned.
16660
16661
16662 @item (nnchoke-request-close)
16663
16664 Close connection to all servers and free all resources that the backend
16665 have reserved.  All buffers that have been created by that backend
16666 should be killed.  (Not the @code{nntp-server-buffer}, though.)  This
16667 function is generally only called when Gnus is shutting down.
16668
16669 There should be no data returned. 
16670
16671
16672 @item (nnchoke-server-opened &optional SERVER)
16673
16674 If @var{server} is the current virtual server, and the connection to the
16675 physical server is alive, then this function should return a
16676 non-@code{nil} vlue.  This function should under no circumstances
16677 attempt to reconnect to a server we have lost connection to.
16678
16679 There should be no data returned.
16680
16681
16682 @item (nnchoke-status-message &optional SERVER)
16683
16684 This function should return the last error message from @var{server}. 
16685
16686 There should be no data returned.
16687
16688
16689 @item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER)
16690
16691 The result data from this function should be the article specified by
16692 @var{article}.  This might either be a @code{Message-ID} or a number.
16693 It is optional whether to implement retrieval by @code{Message-ID}, but
16694 it would be nice if that were possible.
16695
16696 If @var{to-buffer} is non-@code{nil}, the result data should be returned
16697 in this buffer instead of the normal data buffer.  This is to make it
16698 possible to avoid copying large amounts of data from one buffer to
16699 another, while Gnus mainly requests articles to be inserted directly
16700 into its article buffer.
16701
16702 If it is at all possible, this function should return a cons cell where
16703 the @code{car} is the group name the article was fetched from, and the @code{cdr} is
16704 the article number.  This will enable Gnus to find out what the real
16705 group and article numbers are when fetching articles by
16706 @code{Message-ID}.  If this isn't possible, @code{t} should be returned
16707 on successful article retrieval.
16708
16709
16710 @item (nnchoke-request-group GROUP &optional SERVER FAST)
16711
16712 Get data on @var{group}.  This function also has the side effect of
16713 making @var{group} the current group. 
16714
16715 If @var{FAST}, don't bother to return useful data, just make @var{group}
16716 the current group.
16717
16718 Here's an example of some result data and a definition of the same:
16719
16720 @example
16721 211 56 1000 1059 ifi.discussion
16722 @end example
16723
16724 The first number is the status, which should be 211.  Next is the
16725 total number of articles in the group, the lowest article number, the
16726 highest article number, and finally the group name.  Note that the total
16727 number of articles may be less than one might think while just
16728 considering the highest and lowest article numbers, but some articles
16729 may have been canceled.  Gnus just discards the total-number, so
16730 whether one should take the bother to generate it properly (if that is a
16731 problem) is left as an exercise to the reader.
16732
16733 @example
16734 group-status = [ error / info ] eol
16735 error        = [ "4" / "5" ] 2<number> " " <Error message>
16736 info         = "211 " 3* [ <number> " " ] <string>
16737 @end example
16738
16739
16740 @item (nnchoke-close-group GROUP &optional SERVER)
16741
16742 Close @var{group} and free any resources connected to it.  This will be
16743 a no-op on most backends. 
16744
16745 There should be no data returned.
16746
16747
16748 @item (nnchoke-request-list &optional SERVER)
16749
16750 Return a list of all groups available on @var{server}.  And that means
16751 @emph{all}. 
16752
16753 Here's an example from a server that only carries two groups:
16754
16755 @example
16756 ifi.test 0000002200 0000002000 y
16757 ifi.discussion 3324 3300 n
16758 @end example
16759
16760 On each line we have a group name, then the highest article number in
16761 that group, the lowest article number, and finally a flag.
16762
16763 @example
16764 active-file = *active-line
16765 active-line = name " " <number> " " <number> " " flags eol
16766 name        = <string>
16767 flags       = "n" / "y" / "m" / "x" / "j" / "=" name
16768 @end example
16769
16770 The flag says whether the group is read-only (@samp{n}), is moderated
16771 (@samp{m}), is dead (@samp{x}), is aliased to some other group
16772 (@samp{=other-group}) or none of the above (@samp{y}). 
16773
16774
16775 @item (nnchoke-request-post &optional SERVER)
16776
16777 This function should post the current buffer.  It might return whether
16778 the posting was successful or not, but that's not required.  If, for
16779 instance, the posting is done asynchronously, it has generally not been
16780 completed by the time this function concludes.  In that case, this
16781 function should set up some kind of sentinel to beep the user loud and
16782 clear if the posting could not be completed.
16783
16784 There should be no result data from this function. 
16785
16786 @end table
16787
16788
16789 @node Optional Backend Functions
16790 @subsubsection Optional Backend Functions
16791
16792 @table @code
16793
16794 @item (nnchoke-retrieve-groups GROUPS &optional SERVER)
16795
16796 @var{groups} is a list of groups, and this function should request data
16797 on all those groups.  How it does it is of no concern to Gnus, but it
16798 should attempt to do this in a speedy fashion.
16799
16800 The return value of this function can be either @code{active} or
16801 @code{group}, which says what the format of the result data is.  The
16802 former is in the same format as the data from
16803 @code{nnchoke-request-list}, while the latter is a buffer full of lines
16804 in the same format as @code{nnchoke-request-group} gives.
16805
16806 @example
16807 group-buffer = *active-line / *group-status
16808 @end example
16809
16810
16811 @item (nnchoke-request-update-info GROUP INFO &optional SERVER)
16812
16813 A Gnus group info (@pxref{Group Info}) is handed to the backend for
16814 alterations.  This comes in handy if the backend really carries all the
16815 information (as is the case with virtual and imap groups).  This
16816 function should destructively alter the info to suit its needs, and
16817 should return the (altered) group info.
16818
16819 There should be no result data from this function.
16820
16821
16822 @item (nnchoke-request-type GROUP &optional ARTICLE)
16823
16824 When the user issues commands for ``sending news'' (@kbd{F} in the
16825 summary buffer, for instance), Gnus has to know whether the article the
16826 user is following up on is news or mail.  This function should return
16827 @code{news} if @var{article} in @var{group} is news, @code{mail} if it
16828 is mail and @code{unknown} if the type can't be decided.  (The
16829 @var{article} parameter is necessary in @code{nnvirtual} groups which
16830 might very well combine mail groups and news groups.)  Both @var{group}
16831 and @var{article} may be @code{nil}.
16832
16833 There should be no result data from this function.
16834
16835
16836 @item (nnchoke-request-update-mark GROUP ARTICLE MARK)
16837
16838 If the user tries to set a mark that the backend doesn't like, this
16839 function may change the mark.  Gnus will use whatever this function
16840 returns as the mark for @var{article} instead of the original
16841 @var{mark}.  If the backend doesn't care, it must return the original
16842 @var{mark}, and not @code{nil} or any other type of garbage.  
16843
16844 The only use for this I can see is what @code{nnvirtual} does with
16845 it---if a component group is auto-expirable, marking an article as read
16846 in the virtual group should result in the article being marked as
16847 expirable. 
16848
16849 There should be no result data from this function.
16850
16851
16852 @item (nnchoke-request-scan &optional GROUP SERVER)
16853
16854 This function may be called at any time (by Gnus or anything else) to
16855 request that the backend check for incoming articles, in one way or
16856 another.  A mail backend will typically read the spool file or query the
16857 POP server when this function is invoked.  The @var{group} doesn't have
16858 to be heeded---if the backend decides that it is too much work just
16859 scanning for a single group, it may do a total scan of all groups.  It
16860 would be nice, however, to keep things local if that's practical.
16861
16862 There should be no result data from this function.
16863
16864
16865 @item (nnchoke-request-group-description GROUP &optional SERVER)
16866
16867 The result data from this function should be a description of
16868 @var{group}. 
16869
16870 @example
16871 description-line = name <TAB> description eol
16872 name             = <string>
16873 description      = <text>
16874 @end example
16875
16876 @item (nnchoke-request-list-newsgroups &optional SERVER)
16877
16878 The result data from this function should be the description of all
16879 groups available on the server.
16880
16881 @example
16882 description-buffer = *description-line
16883 @end example
16884
16885
16886 @item (nnchoke-request-newgroups DATE &optional SERVER)
16887
16888 The result data from this function should be all groups that were
16889 created after @samp{date}, which is in normal human-readable date
16890 format.  The data should be in the active buffer format.
16891
16892
16893 @item (nnchoke-request-create-group GROUP &optional SERVER)
16894
16895 This function should create an empty group with name @var{group}.  
16896
16897 There should be no return data.
16898
16899
16900 @item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE)
16901
16902 This function should run the expiry process on all articles in the
16903 @var{articles} range (which is currently a simple list of article
16904 numbers.)  It is left up to the backend to decide how old articles
16905 should be before they are removed by this function.  If @var{force} is
16906 non-@code{nil}, all @var{articles} should be deleted, no matter how new
16907 they are. 
16908
16909 This function should return a list of articles that it did not/was not
16910 able to delete.
16911
16912 There should be no result data returned.
16913
16914
16915 @item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM
16916 &optional LAST)
16917
16918 This function should move @var{article} (which is a number) from
16919 @var{group} by calling @var{accept-form}.  
16920
16921 This function should ready the article in question for moving by
16922 removing any header lines it has added to the article, and generally
16923 should ``tidy up'' the article.  Then it should @code{eval}
16924 @var{accept-form} in the buffer where the ``tidy'' article is.  This
16925 will do the actual copying.  If this @code{eval} returns a
16926 non-@code{nil} value, the article should be removed.
16927
16928 If @var{last} is @code{nil}, that means that there is a high likelihood
16929 that there will be more requests issued shortly, so that allows some
16930 optimizations. 
16931
16932 The function should return a cons where the @code{car} is the group name and
16933 the @code{cdr} is the article number that the article was entered as.
16934
16935 There should be no data returned. 
16936
16937
16938 @item (nnchoke-request-accept-article GROUP &optional SERVER LAST)
16939
16940 This function takes the current buffer and inserts it into @var{group}.
16941 If @var{last} in @code{nil}, that means that there will be more calls to
16942 this function in short order.
16943
16944 The function should return a cons where the @code{car} is the group name and
16945 the @code{cdr} is the article number that the article was entered as.
16946
16947 There should be no data returned.
16948
16949
16950 @item (nnchoke-request-replace-article ARTICLE GROUP BUFFER)
16951
16952 This function should remove @var{article} (which is a number) from
16953 @var{group} and insert @var{buffer} there instead.
16954
16955 There should be no data returned.
16956
16957
16958 @item (nnchoke-request-delete-group GROUP FORCE &optional SERVER)
16959
16960 This function should delete @var{group}.  If @var{force}, it should
16961 really delete all the articles in the group, and then delete the group
16962 itself.  (If there is such a thing as ``the group itself''.)
16963
16964 There should be no data returned.
16965
16966
16967 @item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER)
16968
16969 This function should rename @var{group} into @var{new-name}.  All
16970 articles in @var{group} should move to @var{new-name}.
16971
16972 There should be no data returned.
16973
16974 @end table
16975
16976
16977 @node Error Messaging
16978 @subsubsection Error Messaging
16979
16980 @findex nnheader-report
16981 @findex nnheader-get-report
16982 The backends should use the function @code{nnheader-report} to report
16983 error conditions---they should not raise errors when they aren't able to
16984 perform a request.  The first argument to this function is the backend
16985 symbol, and the rest are interpreted as arguments to @code{format} if
16986 there are multiple of them, or just a string if there is one of them.
16987 This function must always returns @code{nil}.
16988
16989 @lisp
16990 (nnheader-report 'nnchoke "You did something totally bogus")
16991
16992 (nnheader-report 'nnchoke "Could not request group %s" group)
16993 @end lisp
16994
16995 Gnus, in turn, will call @code{nnheader-get-report} when it gets a
16996 @code{nil} back from a server, and this function returns the most
16997 recently reported message for the backend in question.  This function
16998 takes one argument---the server symbol.
16999
17000 Internally, these functions access @var{backend}@code{-status-string},
17001 so the @code{nnchoke} backend will have its error message stored in
17002 @code{nnchoke-status-string}.
17003
17004
17005 @node Writing New Backends
17006 @subsubsection Writing New Backends
17007
17008 Many backends are quite similar.  @code{nnml} is just like
17009 @code{nnspool}, but it allows you to edit the articles on the server.
17010 @code{nnmh} is just like @code{nnml}, but it doesn't use an active file,
17011 and it doesn't maintain overview databases.  @code{nndir} is just like
17012 @code{nnml}, but it has no concept of ``groups'', and it doesn't allow
17013 editing articles.
17014
17015 It would make sense if it were possible to ``inherit'' functions from
17016 backends when writing new backends.  And, indeed, you can do that if you
17017 want to.  (You don't have to if you don't want to, of course.)  
17018
17019 All the backends declare their public variables and functions by using a
17020 package called @code{nnoo}.  
17021
17022 To inherit functions from other backends (and allow other backends to
17023 inherit functions from the current backend), you should use the
17024 following macros:
17025
17026 @table @code
17027
17028 @item nnoo-declare
17029 This macro declares the first parameter to be a child of the subsequent
17030 parameters.  For instance:
17031
17032 @lisp
17033 (nnoo-declare nndir
17034   nnml nnmh)
17035 @end lisp
17036
17037 @code{nndir} has declared here that it intends to inherit functions from
17038 both @code{nnml} and @code{nnmh}.
17039
17040 @item defvoo
17041 This macro is equivalent to @code{defvar}, but registers the variable as
17042 a public server variable.  Most state-oriented variables should be
17043 declared with @code{defvoo} instead of @code{defvar}.  
17044
17045 In addition to the normal @code{defvar} parameters, it takes a list of
17046 variables in the parent backends to map the variable to when executing
17047 a function in those backends.
17048
17049 @lisp
17050 (defvoo nndir-directory nil
17051   "Where nndir will look for groups."
17052   nnml-current-directory nnmh-current-directory)
17053 @end lisp
17054
17055 This means that @code{nnml-current-directory} will be set to
17056 @code{nndir-directory} when an @code{nnml} function is called on behalf
17057 of @code{nndir}.  (The same with @code{nnmh}.)  
17058
17059 @item nnoo-define-basics
17060 This macro defines some common functions that almost all backends should
17061 have.
17062
17063 @example
17064 (nnoo-define-basics nndir)
17065 @end example
17066
17067 @item deffoo
17068 This macro is just like @code{defun} and takes the same parameters.  In
17069 addition to doing the normal @code{defun} things, it registers the
17070 function as being public so that other backends can inherit it.
17071
17072 @item nnoo-map-functions
17073 This macro allows mapping of functions from the current backend to
17074 functions from the parent backends.
17075
17076 @example
17077 (nnoo-map-functions nndir
17078   (nnml-retrieve-headers 0 nndir-current-group 0 0)
17079   (nnmh-request-article 0 nndir-current-group 0 0))
17080 @end example
17081
17082 This means that when @code{nndir-retrieve-headers} is called, the first,
17083 third, and fourth parameters will be passed on to
17084 @code{nnml-retrieve-headers}, while the second parameter is set to the
17085 value of @code{nndir-current-group}.
17086
17087 @item nnoo-import
17088 This macro allows importing functions from backends.  It should be the
17089 last thing in the source file, since it will only define functions that
17090 haven't already been defined.
17091
17092 @example
17093 (nnoo-import nndir
17094   (nnmh
17095    nnmh-request-list
17096    nnmh-request-newgroups)
17097   (nnml))
17098 @end example
17099
17100 This means that calls to @code{nndir-request-list} should just be passed
17101 on to @code{nnmh-request-list}, while all public functions from
17102 @code{nnml} that haven't been defined in @code{nndir} yet should be
17103 defined now.
17104
17105 @end table
17106
17107 Below is a slightly shortened version of the @code{nndir} backend.
17108
17109 @lisp
17110 ;;; nndir.el --- single directory newsgroup access for Gnus
17111 ;; Copyright (C) 1995,96 Free Software Foundation, Inc.
17112
17113 ;;; Code:
17114
17115 (require 'nnheader)
17116 (require 'nnmh)
17117 (require 'nnml)
17118 (require 'nnoo)
17119 (eval-when-compile (require 'cl))
17120
17121 (nnoo-declare nndir
17122   nnml nnmh)
17123
17124 (defvoo nndir-directory nil
17125   "Where nndir will look for groups."
17126   nnml-current-directory nnmh-current-directory)
17127
17128 (defvoo nndir-nov-is-evil nil
17129   "*Non-nil means that nndir will never retrieve NOV headers."
17130   nnml-nov-is-evil)
17131
17132 (defvoo nndir-current-group "" nil nnml-current-group nnmh-current-group)
17133 (defvoo nndir-top-directory nil nil nnml-directory nnmh-directory)
17134 (defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail)
17135
17136 (defvoo nndir-status-string "" nil nnmh-status-string)
17137 (defconst nndir-version "nndir 1.0")
17138
17139 ;;; Interface functions.
17140
17141 (nnoo-define-basics nndir)
17142
17143 (deffoo nndir-open-server (server &optional defs)
17144   (setq nndir-directory
17145         (or (cadr (assq 'nndir-directory defs))
17146             server))
17147   (unless (assq 'nndir-directory defs)
17148     (push `(nndir-directory ,server) defs))
17149   (push `(nndir-current-group
17150           ,(file-name-nondirectory (directory-file-name nndir-directory)))
17151         defs)
17152   (push `(nndir-top-directory
17153           ,(file-name-directory (directory-file-name nndir-directory)))
17154         defs)
17155   (nnoo-change-server 'nndir server defs))
17156
17157 (nnoo-map-functions nndir
17158   (nnml-retrieve-headers 0 nndir-current-group 0 0)
17159   (nnmh-request-article 0 nndir-current-group 0 0)
17160   (nnmh-request-group nndir-current-group 0 0)
17161   (nnmh-close-group nndir-current-group 0))
17162
17163 (nnoo-import nndir
17164   (nnmh
17165    nnmh-status-message
17166    nnmh-request-list
17167    nnmh-request-newgroups))
17168
17169 (provide 'nndir)
17170 @end lisp
17171
17172
17173 @node Hooking New Backends Into Gnus
17174 @subsubsection Hooking New Backends Into Gnus
17175
17176 @vindex gnus-valid-select-methods
17177 Having Gnus start using your new backend is rather easy---you just
17178 declare it with the @code{gnus-declare-backend} functions.  This will
17179 enter the backend into the @code{gnus-valid-select-methods} variable.
17180
17181 @code{gnus-declare-backend} takes two parameters---the backend name and
17182 an arbitrary number of @dfn{abilities}.
17183
17184 Here's an example:
17185
17186 @lisp
17187 (gnus-declare-backend "nnchoke" 'mail 'respool 'address)
17188 @end lisp
17189
17190 The abilities can be:
17191
17192 @table @code
17193 @item mail
17194 This is a mailish backend---followups should (probably) go via mail.
17195 @item post
17196 This is a newsish backend---followups should (probably) go via news. 
17197 @item post-mail
17198 This backend supports both mail and news.
17199 @item none
17200 This is neither a post nor mail backend---it's something completely
17201 different. 
17202 @item respool
17203 It supports respooling---or rather, it is able to modify its source
17204 articles and groups.
17205 @item address
17206 The name of the server should be in the virtual server name.  This is
17207 true for almost all backends.
17208 @item prompt-address
17209 The user should be prompted for an address when doing commands like
17210 @kbd{B} in the group buffer.  This is true for backends like
17211 @code{nntp}, but not @code{nnmbox}, for instance. 
17212 @end table
17213
17214
17215 @node Mail-like Backends
17216 @subsubsection Mail-like Backends
17217
17218 One of the things that separate the mail backends from the rest of the
17219 backends is the heavy dependence by the mail backends on common
17220 functions in @file{nnmail.el}.  For instance, here's the definition of
17221 @code{nnml-request-scan}: 
17222
17223 @lisp
17224 (deffoo nnml-request-scan (&optional group server)
17225   (setq nnml-article-file-alist nil)
17226   (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group))
17227 @end lisp
17228
17229 It simply calls @code{nnmail-get-new-mail} with a few parameters,
17230 and @code{nnmail} takes care of all the moving and splitting of the
17231 mail.  
17232
17233 This function takes four parameters.
17234
17235 @table @var
17236 @item method
17237 This should be a symbol to designate which backend is responsible for
17238 the call.
17239
17240 @item exit-function
17241 This function should be called after the splitting has been performed.
17242
17243 @item temp-directory
17244 Where the temporary files should be stored.
17245
17246 @item group
17247 This optional argument should be a group name if the splitting is to be
17248 performed for one group only.
17249 @end table
17250
17251 @code{nnmail-get-new-mail} will call @var{backend}@code{-save-mail} to
17252 save each article.  @var{backend}@code{-active-number} will be called to
17253 find the article number assigned to this article.  
17254
17255 The function also uses the following variables:
17256 @var{backend}@code{-get-new-mail} (to see whether to get new mail for
17257 this backend); and @var{backend}@code{-group-alist} and
17258 @var{backend}@code{-active-file} to generate the new active file.
17259 @var{backend}@code{-group-alist} should be a group-active alist, like
17260 this:
17261
17262 @example
17263 (("a-group" (1 . 10))
17264  ("some-group" (34 . 39)))
17265 @end example
17266
17267
17268 @node Score File Syntax
17269 @subsection Score File Syntax
17270
17271 Score files are meant to be easily parsable, but yet extremely
17272 mallable.   It was decided that something that had the same read syntax
17273 as an Emacs Lisp list would fit that spec.
17274
17275 Here's a typical score file:
17276
17277 @lisp
17278 (("summary"
17279   ("win95" -10000 nil s)
17280   ("Gnus"))
17281  ("from"
17282   ("Lars" -1000))
17283  (mark -100))
17284 @end lisp
17285
17286 BNF definition of a score file:
17287
17288 @example
17289 score-file       = "" / "(" *element ")"
17290 element          = rule / atom
17291 rule             = string-rule / number-rule / date-rule
17292 string-rule      = "(" quote string-header quote space *string-match ")"
17293 number-rule      = "(" quote number-header quote space *number-match ")"
17294 date-rule        = "(" quote date-header quote space *date-match ")"
17295 quote            = <ascii 34>
17296 string-header    = "subject" / "from" / "references" / "message-id" / 
17297                    "xref" / "body" / "head" / "all" / "followup"
17298 number-header    = "lines" / "chars"
17299 date-header      = "date"
17300 string-match     = "(" quote <string> quote [ "" / [ space score [ "" / 
17301                    space date [ "" / [ space string-match-t ] ] ] ] ] ")"
17302 score            = "nil" / <integer>
17303 date             = "nil" / <natural number>
17304 string-match-t   = "nil" / "s" / "substring" / "S" / "Substring" / 
17305                    "r" / "regex" / "R" / "Regex" /
17306                    "e" / "exact" / "E" / "Exact" /
17307                    "f" / "fuzzy" / "F" / "Fuzzy"
17308 number-match     = "(" <integer> [ "" / [ space score [ "" / 
17309                    space date [ "" / [ space number-match-t ] ] ] ] ] ")"
17310 number-match-t   = "nil" / "=" / "<" / ">" / ">=" / "<="
17311 date-match       = "(" quote <string> quote [ "" / [ space score [ "" / 
17312                    space date [ "" / [ space date-match-t ] ] ] ] ")"
17313 date-match-t     = "nil" / "at" / "before" / "after"
17314 atom             = "(" [ required-atom / optional-atom ] ")"
17315 required-atom    = mark / expunge / mark-and-expunge / files /
17316                    exclude-files / read-only / touched
17317 optional-atom    = adapt / local / eval 
17318 mark             = "mark" space nil-or-number
17319 nil-or-number    = "nil" / <integer>
17320 expunge          = "expunge" space nil-or-number
17321 mark-and-expunge = "mark-and-expunge" space nil-or-number
17322 files            = "files" *[ space <string> ]
17323 exclude-files    = "exclude-files" *[ space <string> ]
17324 read-only        = "read-only" [ space "nil" / space "t" ]
17325 adapt            = "adapt" [ space "ignore" / space "t" / space adapt-rule ]
17326 adapt-rule       = "(" *[ <string> *[ "(" <string> <integer> ")" ] ")"
17327 local            = "local" *[ space "(" <string> space <form> ")" ]
17328 eval             = "eval" space <form>
17329 space            = *[ " " / <TAB> / <NEWLINE> ]
17330 @end example
17331
17332 Any unrecognized elements in a score file should be ignored, but not
17333 discarded.  
17334
17335 As you can see, white space is needed, but the type and amount of white
17336 space is irrelevant.  This means that formatting of the score file is
17337 left up to the programmer---if it's simpler to just spew it all out on
17338 one looong line, then that's ok.
17339
17340 The meaning of the various atoms are explained elsewhere in this
17341 manual (@pxref{Score File Format}).
17342
17343
17344 @node Headers
17345 @subsection Headers
17346
17347 Internally Gnus uses a format for storing article headers that
17348 corresponds to the @sc{nov} format in a mysterious fashion.  One could
17349 almost suspect that the author looked at the @sc{nov} specification and
17350 just shamelessly @emph{stole} the entire thing, and one would be right.
17351
17352 @dfn{Header} is a severely overloaded term.  ``Header'' is used in
17353 RFC1036 to talk about lines in the head of an article (e.g.,
17354 @code{From}).  It is used by many people as a synonym for
17355 ``head''---``the header and the body''.  (That should be avoided, in my
17356 opinion.)  And Gnus uses a format internally that it calls ``header'',
17357 which is what I'm talking about here.  This is a 9-element vector,
17358 basically, with each header (ouch) having one slot.
17359
17360 These slots are, in order: @code{number}, @code{subject}, @code{from},
17361 @code{date}, @code{id}, @code{references}, @code{chars}, @code{lines},
17362 @code{xref}.  There are macros for accessing and setting these
17363 slots---they all have predictable names beginning with
17364 @code{mail-header-} and @code{mail-header-set-}, respectively.
17365
17366 The @code{xref} slot is really a @code{misc} slot.  Any extra info will
17367 be put in there.
17368
17369
17370 @node Ranges
17371 @subsection Ranges
17372
17373 @sc{gnus} introduced a concept that I found so useful that I've started
17374 using it a lot and have elaborated on it greatly. 
17375
17376 The question is simple: If you have a large amount of objects that are
17377 identified by numbers (say, articles, to take a @emph{wild} example)
17378 that you want to qualify as being ``included'', a normal sequence isn't
17379 very useful.  (A 200,000 length sequence is a bit long-winded.)
17380
17381 The solution is as simple as the question: You just collapse the
17382 sequence. 
17383
17384 @example
17385 (1 2 3 4 5 6 10 11 12)
17386 @end example
17387
17388 is transformed into
17389
17390 @example
17391 ((1 . 6) (10 . 12))
17392 @end example
17393
17394 To avoid having those nasty @samp{(13 . 13)} elements to denote a
17395 lonesome object, a @samp{13} is a valid element:
17396
17397 @example
17398 ((1 . 6) 7 (10 . 12))
17399 @end example
17400
17401 This means that comparing two ranges to find out whether they are equal
17402 is slightly tricky:
17403
17404 @example
17405 ((1 . 5) 7 8 (10 . 12))
17406 @end example
17407
17408 and
17409
17410 @example
17411 ((1 . 5) (7 . 8) (10 . 12))
17412 @end example
17413
17414 are equal.  In fact, any non-descending list is a range:
17415
17416 @example
17417 (1 2 3 4 5)
17418 @end example
17419
17420 is a perfectly valid range, although a pretty long-winded one.  This is
17421 also valid:
17422
17423 @example
17424 (1 . 5)
17425 @end example
17426
17427 and is equal to the previous range.
17428
17429 Here's a BNF definition of ranges.  Of course, one must remember the
17430 semantic requirement that the numbers are non-descending.  (Any number
17431 of repetition of the same number is allowed, but apt to disappear in
17432 range handling.)
17433
17434 @example
17435 range           = simple-range / normal-range
17436 simple-range    = "(" number " . " number ")"
17437 normal-range    = "(" start-contents ")"
17438 contents        = "" / simple-range *[ " " contents ] / 
17439                   number *[ " " contents ]
17440 @end example
17441
17442 Gnus currently uses ranges to keep track of read articles and article
17443 marks.  I plan on implementing a number of range operators in C if The
17444 Powers That Be are willing to let me.  (I haven't asked yet, because I
17445 need to do some more thinking on what operators I need to make life
17446 totally range-based without ever having to convert back to normal
17447 sequences.) 
17448
17449
17450 @node Group Info
17451 @subsection Group Info
17452
17453 Gnus stores all permanent info on groups in a @dfn{group info} list.
17454 This list is from three to six elements (or more) long and exhaustively
17455 describes the group.
17456
17457 Here are two example group infos; one is a very simple group while the
17458 second is a more complex one:
17459
17460 @example
17461 ("no.group" 5 (1 . 54324))
17462
17463 ("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55))
17464                 ((tick (15 . 19)) (replied 3 6 (19 . 3)))
17465                 (nnml "")
17466                 (auto-expire (to-address "ding@@gnus.org")))
17467 @end example
17468
17469 The first element is the @dfn{group name}---as Gnus knows the group,
17470 anyway.  The second element is the @dfn{subscription level}, which
17471 normally is a small integer.  The third element is a list of ranges of
17472 read articles.  The fourth element is a list of lists of article marks
17473 of various kinds.  The fifth element is the select method (or virtual
17474 server, if you like).  The sixth element is a list of @dfn{group
17475 parameters}, which is what this section is about.
17476
17477 Any of the last three elements may be missing if they are not required.
17478 In fact, the vast majority of groups will normally only have the first
17479 three elements, which saves quite a lot of cons cells.
17480
17481 Here's a BNF definition of the group info format:
17482
17483 @example
17484 info          = "(" group space level space read 
17485                 [ "" / [ space marks-list [ "" / [ space method [ "" /
17486                 space parameters ] ] ] ] ] ")" 
17487 group         = quote <string> quote
17488 level         = <integer in the range of 1 to inf>
17489 read          = range
17490 marks-lists   = nil / "(" *marks ")"
17491 marks         = "(" <string> range ")"
17492 method        = "(" <string> *elisp-forms ")"
17493 parameters    = "(" *elisp-forms ")"
17494 @end example
17495
17496 Actually that @samp{marks} rule is a fib.  A @samp{marks} is a
17497 @samp{<string>} consed on to a @samp{range}, but that's a bitch to say
17498 in pseudo-BNF.
17499
17500 If you have a Gnus info and want to access the elements, Gnus offers a
17501 series of macros for getting/setting these elements.
17502
17503 @table @code
17504 @item gnus-info-group
17505 @itemx gnus-info-set-group
17506 @findex gnus-info-group
17507 @findex gnus-info-set-group
17508 Get/set the group name.
17509
17510 @item gnus-info-rank
17511 @itemx gnus-info-set-rank
17512 @findex gnus-info-rank
17513 @findex gnus-info-set-rank
17514 Get/set the group rank.
17515
17516 @item gnus-info-level
17517 @itemx gnus-info-set-level
17518 @findex gnus-info-level
17519 @findex gnus-info-set-level
17520 Get/set the group level.
17521
17522 @item gnus-info-score
17523 @itemx gnus-info-set-score
17524 @findex gnus-info-score
17525 @findex gnus-info-set-score
17526 Get/set the group score.
17527
17528 @item gnus-info-read
17529 @itemx gnus-info-set-read
17530 @findex gnus-info-read
17531 @findex gnus-info-set-read
17532 Get/set the ranges of read articles.
17533
17534 @item gnus-info-marks
17535 @itemx gnus-info-set-marks
17536 @findex gnus-info-marks
17537 @findex gnus-info-set-marks
17538 Get/set the lists of ranges of marked articles.
17539
17540 @item gnus-info-method
17541 @itemx gnus-info-set-method
17542 @findex gnus-info-method
17543 @findex gnus-info-set-method
17544 Get/set the group select method.
17545
17546 @item gnus-info-params
17547 @itemx gnus-info-set-params
17548 @findex gnus-info-params
17549 @findex gnus-info-set-params
17550 Get/set the group parameters.
17551 @end table
17552
17553 All the getter functions take one parameter---the info list.  The setter
17554 functions take two parameters---the info list and the new value.
17555
17556 The last three elements in the group info aren't mandatory, so it may be
17557 necessary to extend the group info before setting the element.  If this
17558 is necessary, you can just pass on a non-@code{nil} third parameter to
17559 the three final setter functions to have this happen automatically.
17560
17561
17562 @node Extended Interactive
17563 @subsection Extended Interactive
17564 @cindex interactive
17565 @findex gnus-interactive
17566
17567 Gnus extends the standard Emacs @code{interactive} specification
17568 slightly to allow easy use of the symbolic prefix (@pxref{Symbolic
17569 Prefixes}).  Here's an example of how this is used:
17570
17571 @lisp
17572 (defun gnus-summary-increase-score (&optional score symp)
17573   (interactive (gnus-interactive "P\ny"))
17574   ...
17575   )
17576 @end lisp
17577
17578 The best thing to do would have been to implement
17579 @code{gnus-interactive} as a macro which would have returned an
17580 @code{interactive} form, but this isn't possible since Emacs checks
17581 whether a function is interactive or not by simply doing an @code{assq}
17582 on the lambda form.  So, instead we have @code{gnus-interactive}
17583 function that takes a string and returns values that are usable to
17584 @code{interactive}.
17585
17586 This function accepts (almost) all normal @code{interactive} specs, but
17587 adds a few more.
17588
17589 @table @samp
17590 @item y
17591 @vindex gnus-current-prefix-symbol
17592 The current symbolic prefix---the @code{gnus-current-prefix-symbol}
17593 variable.
17594
17595 @item Y
17596 @vindex gnus-current-prefix-symbols
17597 A list of the current symbolic prefixes---the
17598 @code{gnus-current-prefix-symbol} variable.
17599
17600 @item A
17601 The current article number---the @code{gnus-summary-article-number}
17602 function. 
17603
17604 @item H
17605 The current article header---the @code{gnus-summary-article-header}
17606 function. 
17607
17608 @item g
17609 The current group name---the @code{gnus-group-group-name}
17610 function. 
17611
17612 @end table
17613
17614
17615 @node Emacs/XEmacs Code
17616 @subsection Emacs/XEmacs Code
17617 @cindex XEmacs
17618 @cindex Emacsen
17619
17620 While Gnus runs under Emacs, XEmacs and Mule, I decided that one of the
17621 platforms must be the primary one.  I chose Emacs.  Not because I don't
17622 like XEmacs or Mule, but because it comes first alphabetically.
17623
17624 This means that Gnus will byte-compile under Emacs with nary a warning,
17625 while XEmacs will pump out gigabytes of warnings while byte-compiling.
17626 As I use byte-compilation warnings to help me root out trivial errors in
17627 Gnus, that's very useful.  
17628
17629 I've also consistently used Emacs function interfaces, but have used
17630 Gnusey aliases for the functions.  To take an example:  Emacs defines a
17631 @code{run-at-time} function while XEmacs defines a @code{start-itimer}
17632 function.  I then define a function called @code{gnus-run-at-time} that
17633 takes the same parameters as the Emacs @code{run-at-time}.  When running
17634 Gnus under Emacs, the former function is just an alias for the latter.
17635 However, when running under XEmacs, the former is an alias for the
17636 following function:
17637
17638 @lisp
17639 (defun gnus-xmas-run-at-time (time repeat function &rest args)
17640   (start-itimer
17641    "gnus-run-at-time"
17642    `(lambda ()
17643       (,function ,@@args))
17644    time repeat))
17645 @end lisp
17646
17647 This sort of thing has been done for bunches of functions.  Gnus does
17648 not redefine any native Emacs functions while running under XEmacs---it
17649 does this @code{defalias} thing with Gnus equivalents instead.  Cleaner
17650 all over.
17651
17652 In the cases where the XEmacs function interface was obviously cleaner,
17653 I used it instead.  For example @code{gnus-region-active-p} is an alias
17654 for @code{region-active-p} in XEmacs, whereas in Emacs it is a function.
17655
17656 Of course, I could have chosen XEmacs as my native platform and done
17657 mapping functions the other way around.  But I didn't.  The performance
17658 hit these indirections impose on Gnus under XEmacs should be slight.
17659
17660
17661 @node Various File Formats
17662 @subsection Various File Formats
17663
17664 @menu
17665 * Active File Format::      Information on articles and groups available.
17666 * Newsgroups File Format::  Group descriptions.
17667 @end menu
17668
17669
17670 @node Active File Format
17671 @subsubsection Active File Format
17672
17673 The active file lists all groups available on the server in
17674 question.  It also lists the highest and lowest current article numbers
17675 in each group.  
17676
17677 Here's an excerpt from a typical active file:
17678
17679 @example
17680 soc.motss 296030 293865 y
17681 alt.binaries.pictures.fractals 3922 3913 n
17682 comp.sources.unix 1605 1593 m
17683 comp.binaries.ibm.pc 5097 5089 y
17684 no.general 1000 900 y
17685 @end example
17686
17687 Here's a pseudo-BNF definition of this file:
17688
17689 @example
17690 active      = *group-line
17691 group-line  = group space high-number space low-number space flag <NEWLINE>
17692 group       = <non-white-space string>
17693 space       = " "
17694 high-number = <non-negative integer>
17695 low-number  = <positive integer>
17696 flag        = "y" / "n" / "m" / "j" / "x" / "=" group
17697 @end example
17698
17699
17700 @node Newsgroups File Format
17701 @subsubsection Newsgroups File Format
17702
17703 The newsgroups file lists groups along with their descriptions.  Not all
17704 groups on the server have to be listed,  and not all groups in the file
17705 have to exist on the server.  The file is meant purely as information to
17706 the user.
17707
17708 The format is quite simple; a group name, a tab, and the description.
17709 Here's the definition:
17710
17711 @example
17712 newsgroups    = *line
17713 line          = group tab description <NEWLINE>
17714 group         = <non-white-space string>
17715 tab           = <TAB>
17716 description   = <string>
17717 @end example
17718
17719
17720 @page
17721 @node Emacs for Heathens
17722 @section Emacs for Heathens
17723
17724 Believe it or not, but some people who use Gnus haven't really used
17725 Emacs much before they embarked on their journey on the Gnus Love Boat.
17726 If you are one of those unfortunates whom ``@kbd{M-C-a}'', ``kill the
17727 region'', and ``set @code{gnus-flargblossen} to an alist where the key
17728 is a regexp that is used for matching on the group name'' are magical
17729 phrases with little or no meaning, then this appendix is for you.  If
17730 you are already familiar with Emacs, just ignore this and go fondle your
17731 cat instead.
17732
17733 @menu
17734 * Keystrokes::      Entering text and executing commands.
17735 * Emacs Lisp::      The built-in Emacs programming language.
17736 @end menu
17737
17738
17739 @node Keystrokes
17740 @subsection Keystrokes
17741
17742 @itemize @bullet
17743 @item
17744 Q: What is an experienced Emacs user?
17745
17746 @item 
17747 A: A person who wishes that the terminal had pedals.
17748 @end itemize
17749
17750 Yes, when you use Emacs, you are apt to use the control key, the shift
17751 key and the meta key a lot.  This is very annoying to some people
17752 (notably @code{vi}le users), and the rest of us just love the hell out
17753 of it.  Just give up and submit.  Emacs really does stand for
17754 ``Escape-Meta-Alt-Control-Shift'', and not ``Editing Macros'', as you
17755 may have heard from other disreputable sources (like the Emacs author).
17756
17757 The shift keys are normally located near your pinky fingers, and are
17758 normally used to get capital letters and stuff.  You probably use it all
17759 the time.  The control key is normally marked ``CTRL'' or something like
17760 that.  The meta key is, funnily enough, never marked as such on any
17761 keyboard.  The one I'm currently at has a key that's marked ``Alt'',
17762 which is the meta key on this keyboard.  It's usually located somewhere
17763 to the left hand side of the keyboard, usually on the bottom row.
17764
17765 Now, us Emacs people don't say ``press the meta-control-m key'',
17766 because that's just too inconvenient.  We say ``press the @kbd{M-C-m}
17767 key''.  @kbd{M-} is the prefix that means ``meta'' and ``C-'' is the
17768 prefix that means ``control''.  So ``press @kbd{C-k}'' means ``press
17769 down the control key, and hold it down while you press @kbd{k}''.
17770 ``Press @kbd{M-C-k}'' means ``press down and hold down the meta key and
17771 the control key and then press @kbd{k}''.  Simple, ay?
17772
17773 This is somewhat complicated by the fact that not all keyboards have a
17774 meta key.  In that case you can use the ``escape'' key.  Then @kbd{M-k}
17775 means ``press escape, release escape, press @kbd{k}''.  That's much more
17776 work than if you have a meta key, so if that's the case, I respectfully
17777 suggest you get a real keyboard with a meta key.  You can't live without
17778 it.
17779
17780
17781
17782 @node Emacs Lisp
17783 @subsection Emacs Lisp
17784
17785 Emacs is the King of Editors because it's really a Lisp interpreter.
17786 Each and every key you tap runs some Emacs Lisp code snippet, and since
17787 Emacs Lisp is an interpreted language, that means that you can configure
17788 any key to run any arbitrary code.  You just, like, do it.
17789
17790 Gnus is written in Emacs Lisp, and is run as a bunch of interpreted
17791 functions.  (These are byte-compiled for speed, but it's still
17792 interpreted.)  If you decide that you don't like the way Gnus does
17793 certain things, it's trivial to have it do something a different way.
17794 (Well, at least if you know how to write Lisp code.)  However, that's
17795 beyond the scope of this manual, so we are simply going to talk about
17796 some common constructs that you normally use in your @file{.emacs} file
17797 to customize Gnus.
17798
17799 If you want to set the variable @code{gnus-florgbnize} to four (4), you
17800 write the following:
17801
17802 @lisp
17803 (setq gnus-florgbnize 4)
17804 @end lisp
17805
17806 This function (really ``special form'') @code{setq} is the one that can
17807 set a variable to some value.  This is really all you need to know.  Now
17808 you can go and fill your @code{.emacs} file with lots of these to change
17809 how Gnus works.
17810
17811 If you have put that thing in your @code{.emacs} file, it will be read
17812 and @code{eval}ed (which is lisp-ese for ``run'') the next time you
17813 start Emacs.  If you want to change the variable right away, simply say
17814 @kbd{C-x C-e} after the closing parenthesis.  That will @code{eval} the
17815 previous ``form'', which is a simple @code{setq} statement here.
17816
17817 Go ahead---just try it, if you're located at your Emacs.  After you
17818 @kbd{C-x C-e}, you will see @samp{4} appear in the echo area, which
17819 is the return value of the form you @code{eval}ed.
17820
17821 Some pitfalls:
17822
17823 If the manual says ``set @code{gnus-read-active-file} to @code{some}'',
17824 that means:
17825
17826 @lisp
17827 (setq gnus-read-active-file 'some)
17828 @end lisp
17829
17830 On the other hand, if the manual says ``set @code{gnus-nntp-server} to
17831 @samp{nntp.ifi.uio.no}'', that means:
17832
17833 @lisp
17834 (setq gnus-nntp-server "nntp.ifi.uio.no")
17835 @end lisp
17836
17837 So be careful not to mix up strings (the latter) with symbols (the
17838 former).  The manual is unambiguous, but it can be confusing.
17839
17840 @page
17841 @include gnus-faq.texi
17842
17843 @node Index
17844 @chapter Index
17845 @printindex cp
17846
17847 @node Key Index
17848 @chapter Key Index
17849 @printindex ky
17850
17851 @summarycontents
17852 @contents
17853 @bye
17854
17855 @iftex
17856 @iflatex
17857 \end{document}
17858 @end iflatex
17859 @end iftex
17860
17861 @c End:
17862