*** empty log message ***
[gnus] / texi / gnus.texi
1 \input texinfo                  @c -*-texinfo-*-
2
3 @setfilename gnus
4 @settitle Red Gnus 0.15 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]{book}
16 \usepackage[latin1]{inputenc}
17 % \usepackage{fontenc}
18 % \usepackage{babel}
19 \usepackage{pagestyle}
20 \usepackage{epsfig}
21 % \usepackage{ifitricks}
22 \fontfamily{bembo}\selectfont
23
24 \makeindex
25 \begin{document}
26
27 \newcommand{\gnuschaptername}{}
28 \newcommand{\gnussectionname}{}
29
30 \newcommand{\gnusbackslash}{/}
31
32 \newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}}
33 \newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}}
34
35 \newcommand{\gnuskindex}[1]{\index{#1}}
36 \newcommand{\gnusindex}[1]{\index{#1}}
37
38 \newcommand{\gnustt}[1]{{\textbf{\textsf{#1}}}}
39 \newcommand{\gnuscode}[1]{\gnustt{#1}}
40 \newcommand{\gnussamp}[1]{``\gnustt{#1}''}
41 \newcommand{\gnuslisp}[1]{\gnustt{#1}}
42 \newcommand{\gnuskbd}[1]{`\gnustt{#1}'}
43 \newcommand{\gnusfile}[1]{`\gnustt{#1}'}
44 \newcommand{\gnusdfn}[1]{\textit{#1}}
45 \newcommand{\gnusi}[1]{\textit{#1}}
46 \newcommand{\gnusstrong}[1]{\textbf{#1}}
47 \newcommand{\gnusemph}[1]{\textit{#1}}
48 \newcommand{\gnusvar}[1]{\textsl{\textsf{#1}}}
49 \newcommand{\gnussc}[1]{\textsc{#1}}
50 \newcommand{\gnustitle}[1]{{\huge\textbf{#1}}}
51 \newcommand{\gnusauthor}[1]{{\large\textbf{#1}}}
52
53 \newcommand{\gnusbullet}{{${\bullet}$}}
54 \newcommand{\gnusdollar}{\$}
55 \newcommand{\gnusampersand}{\&}
56 \newcommand{\gnuspercent}{\%}
57 \newcommand{\gnushash}{\#}
58 \newcommand{\gnushat}{\symbol{"5E}}
59 \newcommand{\gnusunderline}{\symbol{"5F}}
60 \newcommand{\gnustilde}{\symbol{"7E}}
61 \newcommand{\gnusless}{{$<$}}
62 \newcommand{\gnusgreater}{{$>$}}
63
64 \newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=gnus-head.eps,height=1cm}}}
65 \newcommand{\gnusinteresting}{
66 \marginpar[\hspace{2.5cm}\gnushead]{\gnushead}
67 }
68
69 \newcommand{\gnuschapter}[1]{
70 \renewcommand{\gnussectionname}{}
71 \chapter{#1}
72 \renewcommand{\gnuschaptername}{#1}
73 \thispagestyle{empty}
74 % \epsfig{figure=gnus-herd-\arabic{chapter}.eps,height=15cm}
75 \clearpage
76 }
77
78 \newcommand{\gnusitemx}[1]{\vspace{-\itemsep}\item#1}
79
80 \newcommand{\gnussection}[1]{
81 \renewcommand{\gnussectionname}{#1}
82 \section{#1}
83 }
84
85 \newenvironment{codelist}%
86 {\begin{list}{}{
87 }
88 }{\end{list}}
89
90 \newenvironment{kbdlist}%
91 {\begin{list}{}{
92 \labelwidth=0cm
93 }
94 }{\end{list}}
95
96 \newenvironment{dfnlist}%
97 {\begin{list}{}{
98 }
99 }{\end{list}}
100
101 \newenvironment{stronglist}%
102 {\begin{list}{}{
103 }
104 }{\end{list}}
105
106 \newenvironment{samplist}%
107 {\begin{list}{}{
108 }
109 }{\end{list}}
110
111 \newenvironment{varlist}%
112 {\begin{list}{}{
113 }
114 }{\end{list}}
115
116 \newenvironment{emphlist}%
117 {\begin{list}{}{
118 }
119 }{\end{list}}
120
121 \newpagestyle{gnus}%
122 {
123 {
124 \ifodd\count0
125 {
126 \hspace*{-2ex}
127 \underline{
128 \makebox[\headtextwidth]{
129 \hspace*{-2.3ex}
130 \textbf{\arabic{chapter}.\arabic{section}}
131 \textbf{\gnussectionname\hfill\arabic{page}}
132 }}
133 }
134 \else
135 {
136 \hspace*{-2.25cm}
137 \underline{
138 \hspace*{-2.3ex}
139 \makebox[\headtextwidth]{
140 \textbf{\arabic{page}\hfill\gnuschaptername}
141 }}
142 }
143 \fi
144 }
145 }
146 {
147 \ifodd\count0
148 \mbox{} \hfill 
149 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
150 \else
151 \raisebox{-0.5cm}{\epsfig{figure=gnus-big-logo.eps,height=1cm}}
152 \hfill \mbox{}
153 \fi
154 }
155 \pagestyle{gnus}
156
157 @end iflatex
158 @end iftex
159
160 @iftex
161 @iflatex
162 \begin{titlepage}
163 {
164
165 %\addtolength{\oddsidemargin}{-5cm}
166 %\addtolength{\evensidemargin}{-5cm}
167 \parindent=0cm
168 \addtolength{\textheight}{2cm}
169
170 \gnustitle{\gnustitlename}\\
171 \rule{15cm}{1mm}\\
172 \vfill
173 \hspace*{-1cm}\epsfig{figure=gnus-big-logo.eps,height=15cm}
174 \vfill
175 \rule{15cm}{1mm}\\
176 \gnusauthor{by Lars Magne Ingebrigtsen}
177 \newpage
178 }
179
180 \mbox{}
181 \vfill
182
183 \thispagestyle{empty}
184
185 Copyright \copyright{} 1995,96 Free Software Foundation, Inc. 
186
187 Permission is granted to make and distribute verbatim copies of
188 this manual provided the copyright notice and this permission notice
189 are preserved on all copies.
190
191 Permission is granted to copy and distribute modified versions of this
192 manual under the conditions for verbatim copying, provided that the
193 entire resulting derived work is distributed under the terms of a
194 permission notice identical to this one.
195
196 Permission is granted to copy and distribute translations of this manual
197 into another language, under the above conditions for modified versions.
198
199 \newpage
200 \end{titlepage}
201 @end iflatex
202 @end iftex
203
204 @ifinfo
205
206 This file documents Gnus, the GNU Emacs newsreader.
207
208 Copyright (C) 1995,96 Free Software Foundation, Inc.
209
210 Permission is granted to make and distribute verbatim copies of
211 this manual provided the copyright notice and this permission notice
212 are preserved on all copies.
213
214 @ignore
215 Permission is granted to process this file through Tex and print the
216 results, provided the printed document carries copying permission
217 notice identical to this one except for the removal of this paragraph
218 (this paragraph not being relevant to the printed manual).
219
220 @end ignore
221 Permission is granted to copy and distribute modified versions of this
222 manual under the conditions for verbatim copying, provided also that the
223 entire resulting derived work is distributed under the terms of a
224 permission notice identical to this one.
225
226 Permission is granted to copy and distribute translations of this manual
227 into another language, under the above conditions for modified versions.
228 @end ifinfo
229
230 @tex
231
232 @titlepage
233 @title Red Gnus 0.15 Manual
234
235 @author by Lars Magne Ingebrigtsen
236 @page
237
238 @vskip 0pt plus 1filll
239 Copyright @copyright{} 1995,96 Free Software Foundation, Inc. 
240
241 Permission is granted to make and distribute verbatim copies of
242 this manual provided the copyright notice and this permission notice
243 are preserved on all copies.
244
245 Permission is granted to copy and distribute modified versions of this
246 manual under the conditions for verbatim copying, provided that the
247 entire resulting derived work is distributed under the terms of a
248 permission notice identical to this one.
249
250 Permission is granted to copy and distribute translations of this manual
251 into another language, under the above conditions for modified versions.
252
253 @end titlepage
254 @page
255
256 @end tex
257
258
259 @node Top
260 @top The Red Gnus Newsreader
261
262 @ifinfo
263
264 You can read news (and mail) from within Emacs by using Gnus.  The news
265 can be gotten by any nefarious means you can think of---@sc{nntp}, local
266 spool or your mbox file.  All at the same time, if you want to push your
267 luck.
268
269 @end ifinfo
270
271 @iftex
272
273 @iflatex
274 \thispagestyle{empty}
275 @end iflatex
276
277 Gnus is the advanced, self-documenting, customizable, extensible
278 unreal-time newsreader for GNU Emacs.  
279
280 Oops.  That sounds oddly familiar, so let's start over again to avoid
281 being accused of plagiarism:
282
283 Gnus is a message-reading laboratory.  It will let you look at just
284 about anything as if it were a newsgroup.  You can read mail with it,
285 you can browse directories with it, you can @code{ftp} with it---you can
286 even read news with it!
287
288 Gnus tries to empower people who read news the same way Emacs empowers
289 people who edit text.  Gnus sets no limits to what the user should be
290 allowed to do.  Users are encouraged to extend Gnus to make it behave
291 like they want it to behave.  A program should not control people;
292 people should be empowered to do what they want by using (or abusing)
293 the program.
294
295 @end iftex
296
297
298 @menu
299 * Starting Up::           Finding news can be a pain.
300 * The Group Buffer::      Selecting, subscribing and killing groups.
301 * The Summary Buffer::    Reading, saving and posting articles.
302 * The Article Buffer::    Displaying and handling articles.
303 * Composing Messages::    Information on sending mail and news.
304 * Select Methods::        Gnus reads all messages from various select methods.
305 * Scoring::               Assigning values to articles.
306 * Various::               General purpose settings.
307 * The End::               Farewell and goodbye.
308 * Appendices::            Terminology, Emacs intro, FAQ, History, Internals.
309 * Index::                 Variable, function and concept index.
310 * Key Index::             Key Index.
311 @end menu
312
313
314
315 @node Starting Up
316 @chapter Starting Gnus
317 @cindex starting up
318
319 @kindex M-x gnus
320 @findex gnus
321 If your system administrator has set things up properly, starting Gnus
322 and reading news is extremely easy---you just type @kbd{M-x gnus} in
323 your Emacs. 
324
325 @findex gnus-other-frame
326 @kindex M-x gnus-other-frame
327 If you want to start Gnus in a different frame, you can use the command
328 @kbd{M-x gnus-other-frame} instead.
329
330 If things do not go smoothly at startup, you have to twiddle some
331 variables. 
332
333 @menu
334 * Finding the News::    Choosing a method for getting news.
335 * The First Time::      What does Gnus do the first time you start it?
336 * The Server is Down::  How can I read my mail then?
337 * Slave Gnusii::        You can have more than one Gnus active at a time.
338 * Fetching a Group::    Starting Gnus just to read a group.
339 * New Groups::          What is Gnus supposed to do with new groups?
340 * Startup Files::       Those pesky startup files---@file{.newsrc}.
341 * Auto Save::           Recovering from a crash.
342 * The Active File::     Reading the active file over a slow line Takes Time.
343 * Changing Servers::    You may want to move from one server to another.
344 * Startup Variables::   Other variables you might change.
345 @end menu
346
347
348 @node Finding the News
349 @section Finding the News
350
351 @vindex gnus-select-method
352 @c @head
353 The @code{gnus-select-method} variable says where Gnus should look for
354 news.  This variable should be a list where the first element says
355 @dfn{how} and the second element says @dfn{where}.  This method is your
356 native method.  All groups that are not fetched with this method are
357 foreign groups.
358
359 For instance, if the @samp{news.somewhere.edu} @sc{nntp} server is where
360 you want to get your daily dosage of news from, you'd say:
361
362 @lisp
363 (setq gnus-select-method '(nntp "news.somewhere.edu"))
364 @end lisp
365
366 If you want to read directly from the local spool, say:
367
368 @lisp
369 (setq gnus-select-method '(nnspool ""))
370 @end lisp
371
372 If you can use a local spool, you probably should, as it will almost
373 certainly be much faster.
374
375 @vindex gnus-nntpserver-file
376 @cindex NNTPSERVER
377 @cindex @sc{nntp} server
378 If this variable is not set, Gnus will take a look at the
379 @code{NNTPSERVER} environment variable.  If that variable isn't set,
380 Gnus will see whether @code{gnus-nntpserver-file}
381 (@file{/etc/nntpserver} by default) has any opinions on the matter.  If
382 that fails as well, Gnus will will try to use the machine that is
383 running Emacs as an @sc{nntp} server.  That's a long-shot, though.
384
385 @vindex gnus-nntp-server
386 If @code{gnus-nntp-server} is set, this variable will override
387 @code{gnus-select-method}.  You should therefore set
388 @code{gnus-nntp-server} to @code{nil}, which is what it is by default.
389
390 @vindex gnus-secondary-servers
391 You can also make Gnus prompt you interactively for the name of an
392 @sc{nntp} server.  If you give a non-numerical prefix to @code{gnus}
393 (i.e., @kbd{C-u M-x gnus}), Gnus will let you choose between the servers
394 in the @code{gnus-secondary-servers} list (if any).  You can also just
395 type in the name of any server you feel like visiting.
396
397 @findex gnus-group-browse-foreign-server
398 @kindex B (Group)
399 However, if you use one @sc{nntp} server regularly and are just
400 interested in a couple of groups from a different server, you would be
401 better served by using the @kbd{B} command in the group buffer.  It will
402 let you have a look at what groups are available, and you can subscribe
403 to any of the groups you want to.  This also makes @file{.newsrc}
404 maintenance much tidier.  @xref{Foreign Groups}.
405
406 @vindex gnus-secondary-select-methods
407 @c @head
408 A slightly different approach to foreign groups is to set the
409 @code{gnus-secondary-select-methods} variable.  The select methods
410 listed in this variable are in many ways just as native as the
411 @code{gnus-select-method} server.  They will also be queried for active
412 files during startup (if that's required), and new newsgroups that
413 appear on these servers will be subscribed (or not) just as native
414 groups are.
415
416 For instance, if you use the @code{nnmbox} backend to read your mail, you
417 would typically set this variable to
418
419 @lisp
420 (setq gnus-secondary-select-methods '((nnmbox "")))
421 @end lisp
422
423
424 @node The First Time
425 @section The First Time
426 @cindex first time usage
427
428 If no startup files exist, Gnus will try to determine what groups should
429 be subscribed by default.
430
431 @vindex gnus-default-subscribed-newsgroups
432 If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus
433 will subscribe you to just those groups in that list, leaving the rest
434 killed.  Your system administrator should have set this variable to
435 something useful.
436
437 Since she hasn't, Gnus will just subscribe you to a few arbitrarily
438 picked groups (i.e., @samp{*.newusers}).  (@dfn{Arbitrary} is here
439 defined as @dfn{whatever Lars thinks you should read}.)
440
441 You'll also be subscribed to the Gnus documentation group, which should
442 help you with most common problems.  
443
444 If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will just
445 use the normal functions for handling new groups, and not do anything
446 special.
447
448
449 @node The Server is Down
450 @section The Server is Down
451 @cindex server errors
452
453 If the default server is down, Gnus will understandably have some
454 problems starting.  However, if you have some mail groups in addition to
455 the news groups, you may want to start Gnus anyway.
456
457 Gnus, being the trusting sort of program, will ask whether to proceed
458 without a native select method if that server can't be contacted.  This
459 will happen whether the server doesn't actually exist (i.e., you have
460 given the wrong address) or the server has just momentarily taken ill
461 for some reason or other.  If you decide to continue and have no foreign
462 groups, you'll find it difficult to actually do anything in the group
463 buffer.  But, hey, that's your problem.  Blllrph!
464
465 @findex gnus-no-server
466 @kindex M-x gnus-no-server
467 @c @head
468 If you know that the server is definitely down, or you just want to read
469 your mail without bothering with the server at all, you can use the
470 @code{gnus-no-server} command to start Gnus.  That might come in handy
471 if you're in a hurry as well.  This command will not attempt to contact
472 your primary server---instead, it will just activate all groups on level
473 1 and 2.  (You should preferrably keep no native groups on those two
474 levels.) 
475
476
477 @node Slave Gnusii
478 @section Slave Gnusiï
479 @cindex slave
480
481 You might want to run more than one Emacs with more than one Gnus at the
482 same time.  If you are using different @file{.newsrc} files (eg., if you
483 are using the two different Gnusiï to read from two different servers),
484 that is no problem whatsoever.  You just do it.
485
486 The problem appears when you want to run two Gnusiï that use the same
487 @code{.newsrc} file.
488
489 To work around that problem some, we here at the Think-Tank at the Gnus
490 Towers have come up with a new concept: @dfn{Masters} and
491 @dfn{servants}.  (We have applied for a patent on this concept, and have
492 taken out a copyright on those words.  If you wish to use those words in
493 conjunction with each other, you have to send $1 per usage instance to
494 me.  Usage of the patent (@dfn{Master/Slave Relationships In Computer
495 Applications}) will be much more expensive, of course.)
496
497 Anyways, you start one Gnus up the normal way with @kbd{M-x gnus} (or
498 however you do it).  Each subsequent slave Gnusiï should be started with
499 @kbd{M-x gnus-slave}.  These slaves won't save normal @file{.newsrc}
500 files, but instead save @dfn{slave files} that contains information only
501 on what groups have been read in the slave session.  When a master Gnus
502 starts, it will read (and delete) these slave files, incorporating all
503 information from them.  (The slave files will be read in the sequence
504 they were created, so the latest changes will have precedence.)
505
506 Information from the slave files has, of course, precedence over the
507 information in the normal (i. e., master) @code{.newsrc} file.
508
509
510 @node Fetching a Group
511 @section Fetching a Group
512
513 @findex gnus-fetch-group
514 It it sometime convenient to be able to just say ``I want to read this
515 group and I don't care whether Gnus has been started or not''.  This is
516 perhaps more useful for people who write code than for users, but the
517 command @code{gnus-fetch-group} provides this functionality in any case.
518 It takes the group name as a parameter.
519
520
521 @node New Groups
522 @section New Groups
523 @cindex new groups
524
525 @vindex gnus-subscribe-newsgroup-method
526 What Gnus does when it encounters a new group is determined by the
527 @code{gnus-subscribe-newsgroup-method} variable.
528
529 This variable should contain a function.  Some handy pre-fab values
530 are:
531
532 @table @code
533
534 @item gnus-subscribe-zombies
535 @vindex gnus-subscribe-zombies
536 Make all new groups zombies.  You can browse the zombies later (with
537 @kbd{A z}) and either kill them all off properly, or subscribe to them.
538 This is the default.
539
540 @item gnus-subscribe-randomly
541 @vindex gnus-subscribe-randomly
542 Subscribe all new groups randomly.
543
544 @item gnus-subscribe-alphabetically
545 @vindex gnus-subscribe-alphabetically
546 Subscribe all new groups alphabetically.
547
548 @item gnus-subscribe-hierarchically
549 @vindex gnus-subscribe-hierarchically
550 Subscribe all new groups hierarchically.  The difference between this
551 function and @code{gnus-subscribe-alphabetically} is slight.
552 @code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly
553 alphabetical fashion, while this function will enter groups into it's
554 hierarchy.  So if you want to have the @samp{rec} hierarchy before the
555 @samp{comp} hierarchy, this function will not mess that configuration
556 up.  Or something like that.
557
558 @item gnus-subscribe-interactively
559 @vindex gnus-subscribe-interactively
560 Subscribe new groups interactively.  This means that Gnus will ask
561 you about @strong{all} new groups.
562
563 @item gnus-subscribe-killed
564 @vindex gnus-subscribe-killed
565 Kill all new groups.
566
567 @end table
568
569 @vindex gnus-subscribe-hierarchical-interactive
570 A closely related variable is
571 @code{gnus-subscribe-hierarchical-interactive}.  (That's quite a
572 mouthful.)  If this variable is non-@code{nil}, Gnus will ask you in a
573 hierarchical fashion whether to subscribe to new groups or not.  Gnus
574 will ask you for each sub-hierarchy whether you want to descend the
575 hierarchy or not.  
576
577 One common mistake is to set the variable a few paragraphs above to
578 @code{gnus-subscribe-hierarchical-interactive}.  This is an error.  This
579 will not work.  This is ga-ga.  So don't do it.
580
581 A nice and portable way to control which new newsgroups should be
582 subscribed (or ignored) is to put an @dfn{options} line at the start of
583 the @file{.newsrc} file.  Here's an example:
584
585 @example
586 options -n !alt.all !rec.all sci.all
587 @end example
588
589 @vindex gnus-subscribe-options-newsgroup-method
590 This line obviously belongs to a serious-minded intellectual scientific
591 person (or she may just be plain old boring), because it says that all
592 groups that have names beginning with @samp{alt} and @samp{rec} should
593 be ignored, and all groups with names beginning with @samp{sci} should
594 be subscribed.  Gnus will not use the normal subscription method for
595 subscribing these groups.
596 @code{gnus-subscribe-options-newsgroup-method} is used instead.  This
597 variable defaults to @code{gnus-subscribe-alphabetically}.
598
599 @vindex gnus-options-not-subscribe
600 @vindex gnus-options-subscribe
601 If you don't want to mess with your @file{.newsrc} file, you can just
602 set the two variables @code{gnus-options-subscribe} and
603 @code{gnus-options-not-subscribe}.  These two variables do exactly the
604 same as the @file{.newsrc} @samp{options -n} trick.  Both are regexps,
605 and if the the new group matches the former, it will be unconditionally
606 subscribed, and if it matches the latter, it will be ignored.
607
608 @vindex gnus-auto-subscribed-groups
609 Yet another variable that meddles here is
610 @code{gnus-auto-subscribed-groups}.  It works exactly like
611 @code{gnus-options-subscribe}, and is therefore really superfluous, but I
612 thought it would be nice to have two of these.  This variable is more
613 meant for setting some ground rules, while the other variable is used
614 more for user fiddling.  By default this variable makes all new groups
615 that come from mail backends (@code{nnml}, @code{nnbabyl},
616 @code{nnfolder}, @code{nnmbox}, and @code{nnmh}) subscribed.  If you
617 don't like that, just set this variable to @code{nil}.
618
619 @vindex gnus-check-new-newsgroups
620 If you are satisfied that you really never want to see any new groups,
621 you could set @code{gnus-check-new-newsgroups} to @code{nil}.  This will
622 also save you some time at startup.  Even if this variable is
623 @code{nil}, you can always subscribe to the new groups just by pressing
624 @kbd{U} in the group buffer (@pxref{Group Maintenance}).  This variable
625 is @code{t} by default.
626
627 Gnus normally determines whether a group is new or not by comparing the
628 list of groups from the active file(s) with the lists of subscribed and
629 dead groups.  This isn't a particularly fast method.  If
630 @code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask the
631 server for new groups since the last time.  This is both faster &
632 cheaper.  This also means that you can get rid of the list of killed
633 groups altogether, so you may set @code{gnus-save-killed-list} to
634 @code{nil}, which will save time both at startup, at exit, and all over.
635 Saves disk space, too.  Why isn't this the default, then?
636 Unfortunately, not all servers support this command. 
637
638 I bet I know what you're thinking now: How do I find out whether my
639 server supports @code{ask-server}?  No?  Good, because I don't have a
640 fail-safe answer.  I would suggest just setting this variable to
641 @code{ask-server} and see whether any new groups appear within the next
642 few days.  If any do, then it works.  If any don't, then it doesn't
643 work.  I could write a function to make Gnus guess whether the server
644 supports @code{ask-server}, but it would just be a guess.  So I won't.
645 You could @code{telnet} to the server and say @code{HELP} and see
646 whether it lists @samp{NEWGROUPS} among the commands it understands.  If
647 it does, then it might work.  (But there are servers that lists
648 @samp{NEWGROUPS} without supporting the function properly.)
649
650 This variable can also be a list of select methods.  If so, Gnus will
651 issue an @code{ask-server} command to each of the select methods, and
652 subscribe them (or not) using the normal methods.  This might be handy
653 if you are monitoring a few servers for new groups.  A side effect is
654 that startup will take much longer, so you can meditate while waiting.
655 Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss.
656
657
658 @node Changing Servers
659 @section Changing Servers
660
661 Sometimes it is necessary to move from one @sc{nntp} server to another.
662 This happens very rarely, but perhaps you change jobs, or one server is
663 very flake and you want to use another.  
664
665 Changing the server is pretty easy, right?  You just change
666 @code{gnus-select-method} to point to the new server?  
667
668 @emph{Wrong!}
669
670 Article numbers are not (in any way) kept synchronized between different
671 @sc{nntp} servers, and the only way Gnus keeps track of what articles
672 you have read is by keeping track of article numbers.  So when you
673 change @code{gnus-select-method}, your @file{.newsrc} file becomes
674 worthless.  
675
676 Gnus provides a few functions to attempt to translate a @file{.newsrc}
677 file from one server to another.  They all have one thing in
678 common---they take a looong time to run.  You don't want to use these
679 functions more than absolutely necessary.
680
681 @kindex M-x gnus-change-server
682 @findex gnus-change-server
683 If you have access to both servers, Gnus can request the headers for all
684 the articles you have read and compare @code{Message-ID}s and map
685 reads and article marks.  The @kbd{M-x gnus-change-server} command will
686 do this for all your native groups.  It will prompt for the method you
687 want to move to.
688
689 @kindex M-x gnus-group-move-group-to-server
690 @findex gnus-group-move-group-to-server
691 You can also move individual groups with the @kbd{M-x
692 gnus-group-move-group-to-server} command.  This is useful if you want to
693 move a (foreign) group from one server to another.
694
695 @kindex M-x gnus-group-clear-data-on-native-groups
696 @findex gnus-group-clear-data-on-native-groups
697 If you don't have access to both the old and new server, all your marks
698 and read ranges have become worthless.  You can use the @kbd{M-x
699 gnus-group-clear-data-on-native-groups} command to clear out all data
700 that you have on your native groups.  Use with caution.
701
702
703 @node Startup Files
704 @section Startup Files
705 @cindex startup files
706 @cindex .newsrc
707
708 Now, you all know about the @file{.newsrc} file.  All subscription
709 information is traditionally stored in this file.
710
711 Things got a bit more complicated with @sc{gnus}.  In addition to
712 keeping the @file{.newsrc} file updated, it also used a file called
713 @file{.newsrc.el} for storing all the information that didn't fit into
714 the @file{.newsrc} file.  (Actually, it also duplicated everything in
715 the @file{.newsrc} file.)  @sc{gnus} would read whichever one of these
716 files was the most recently saved, which enabled people to swap between
717 @sc{gnus} and other newsreaders.
718
719 That was kinda silly, so Gnus went one better: In addition to the
720 @file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called
721 @file{.newsrc.eld}.  It will read whichever of these files that are most
722 recent, but it will never write a @file{.newsrc.el} file.
723
724 @vindex gnus-save-newsrc-file
725 You can turn off writing the @file{.newsrc} file by setting
726 @code{gnus-save-newsrc-file} to @code{nil}, which means you can delete
727 the file and save some space, as well as making exit from Gnus faster.
728 However, this will make it impossible to use other newsreaders than
729 Gnus.  But hey, who would want to, right?
730
731 @vindex gnus-save-killed-list
732 If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus
733 will not save the list of killed groups to the startup file.  This will
734 save both time (when starting and quitting) and space (on disk).  It
735 will also means that Gnus has no record of what groups are new or old,
736 so the automatic new groups subscription methods become meaningless.
737 You should always set @code{gnus-check-new-newsgroups} to @code{nil} or
738 @code{ask-server} if you set this variable to @code{nil} (@pxref{New
739 Groups}).  This variable can also be a regular expression.  If that's
740 the case, remove all groups that do not match this regexp before
741 saving.  This can be useful in certain obscure situations that involve
742 several servers where not all servers support @code{ask-server}.
743
744 @vindex gnus-startup-file
745 The @code{gnus-startup-file} variable says where the startup files are.
746 The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup
747 file being whatever that one is with a @samp{.eld} appended.
748
749 @vindex gnus-save-newsrc-hook
750 @vindex gnus-save-quick-newsrc-hook
751 @vindex gnus-save-standard-newsrc-hook
752 @code{gnus-save-newsrc-hook} is called before saving any of the newsrc
753 files, while @code{gnus-save-quick-newsrc-hook} is called just before
754 saving the @file{.newsrc.eld} file, and
755 @code{gnus-save-standard-newsrc-hook} is called just before saving the
756 @file{.newsrc} file.  The latter two are commonly used to turn version
757 control on or off.  Version control is off by default when saving the
758 startup files.
759
760 @vindex gnus-init-file
761 When Gnus starts, it will read the @code{gnus-site-init-file} (default
762 @file{.../site-lisp/gnus.el}) and @code{gnus-init-file} (default
763 @file{~/.gnus.el}) files.  These are normal Emacs Lisp files and can be
764 used to avoid cluttering your @file{.emacs} and @file{site-init} files
765 with Gnus stuff.
766
767
768 @node Auto Save
769 @section Auto Save
770 @cindex dribble file
771 @cindex auto-save
772
773 Whenever you do something that changes the Gnus data (reading articles,
774 catching up, killing/subscribing groups), the change is added to a
775 special @dfn{dribble buffer}.  This buffer is auto-saved the normal
776 Emacs way.  If your Emacs should crash before you have saved the
777 @file{.newsrc} files, all changes you have made can be recovered from
778 this file.
779
780 If Gnus detects this file at startup, it will ask the user whether to
781 read it.  The auto save file is deleted whenever the real startup file is
782 saved.
783
784 @vindex gnus-use-dribble-file
785 If @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create and
786 maintain a dribble buffer.  The default is @code{t}.
787
788 @vindex gnus-dribble-directory
789 Gnus will put the dribble file(s) in @code{gnus-dribble-directory}.  If
790 this variable is @code{nil}, which it is by default, Gnus will dribble
791 into the directory where the @file{.newsrc} file is located.  (This is
792 normally the user's home directory.)  The dribble file will get the same
793 file permissions as the @code{.newsrc} file.
794
795
796 @node The Active File
797 @section The Active File
798 @cindex active file
799 @cindex ignored groups
800
801 When Gnus starts, or indeed whenever it tries to determine whether new
802 articles have arrived, it reads the active file.  This is a very large
803 file that lists all the active groups and articles on the server.
804
805 @vindex gnus-ignored-newsgroups
806 Before examining the active file, Gnus deletes all lines that match the
807 regexp @code{gnus-ignored-newsgroups}.  This is done primarily to reject
808 any groups with bogus names, but you can use this variable to make Gnus
809 ignore hierarchies you aren't ever interested in.  However, this is not
810 recommended.  In fact, it's highly discouraged.  Instead, @pxref{New
811 Groups} for an overview of other variables that can be used instead.
812
813 @c This variable is
814 @c @code{nil} by default, and will slow down active file handling somewhat
815 @c if you set it to anything else.
816
817 @vindex gnus-read-active-file
818 @c @head
819 The active file can be rather Huge, so if you have a slow network, you
820 can set @code{gnus-read-active-file} to @code{nil} to prevent Gnus from
821 reading the active file.  This variable is @code{t} by default.
822
823 Gnus will try to make do by getting information just on the groups that
824 you actually subscribe to.
825
826 Note that if you subscribe to lots and lots of groups, setting this
827 variable to @code{nil} will probably make Gnus slower, not faster.  At
828 present, having this variable @code{nil} will slow Gnus down
829 considerably, unless you read news over a 2400 baud modem.  
830
831 This variable can also have the value @code{some}.  Gnus will then
832 attempt to read active info only on the subscribed groups.  On some
833 servers this is quite fast (on sparkling, brand new INN servers that
834 support the @code{LIST ACTIVE group} command), on others this isn't fast
835 at all.  In any case, @code{some} should be faster than @code{nil}, and
836 is certainly faster than @code{t} over slow lines.
837
838 If this variable is @code{nil}, Gnus will ask for group info in total
839 lock-step, which isn't very fast.  If it is @code{some} and you use an
840 @sc{nntp} server, Gnus will pump out commands as fast as it can, and
841 read all the replies in one swoop.  This will normally result in better
842 performance, but if the server does not support the aforementioned
843 @code{LIST ACTIVE group} command, this isn't very nice to the server.
844
845 In any case, if you use @code{some} or @code{nil}, you should definitely
846 kill all groups that you aren't interested in to speed things up.
847
848
849 @node Startup Variables
850 @section Startup Variables
851
852 @table @code
853
854 @item gnus-load-hook
855 @vindex gnus-load-hook
856 A hook that is run while Gnus is being loaded.  Note that this hook will
857 normally be run just once in each Emacs session, no matter how many
858 times you start Gnus.
859
860 @item gnus-startup-hook
861 @vindex gnus-startup-hook
862 A hook that is run after starting up Gnus successfully.
863
864 @item gnus-check-bogus-newsgroups
865 @vindex gnus-check-bogus-newsgroups
866 If non-@code{nil}, Gnus will check for and delete all bogus groups at
867 startup.  A @dfn{bogus group} is a group that you have in your
868 @file{.newsrc} file, but doesn't exist on the news server.  Checking for
869 bogus groups can take quite a while, so to save time and resources it's
870 best to leave this option off, and do the checking for bogus groups once
871 in a while from the group buffer instead (@pxref{Group Maintenance}).
872
873 @item gnus-inhibit-startup-message
874 @vindex gnus-inhibit-startup-message
875 If non-@code{nil}, the startup message won't be displayed.  That way,
876 your boss might not notice that you are reading news instead of doing
877 your job as easily.
878
879 @item gnus-no-groups-message
880 @vindex gnus-no-groups-message
881 Message displayed by Gnus when no groups are available.
882 @end table
883
884
885 @node The Group Buffer
886 @chapter The Group Buffer
887 @cindex group buffer
888
889 The @dfn{group buffer} lists all (or parts) of the available groups.  It
890 is the first buffer shown when Gnus starts, and will never be killed as
891 long as Gnus is active.
892
893 @menu
894 * Group Buffer Format::    Information listed and how you can change it.
895 * Group Maneuvering::      Commands for moving in the group buffer.
896 * Selecting a Group::      Actually reading news.
897 * Subscription Commands::  Unsubscribing, killing, subscribing.
898 * Group Levels::           Levels? What are those, then?
899 * Group Score::            A mechanism for finding out what groups you like.
900 * Marking Groups::         You can mark groups for later processing.
901 * Foreign Groups::         Creating and editing groups.
902 * Group Parameters::       Each group may have different parameters set.
903 * Listing Groups::         Gnus can list various subsets of the groups.
904 * Sorting Groups::         Re-arrange the group order.
905 * Group Maintenance::      Maintaining a tidy @file{.newsrc} file.
906 * Browse Foreign Server::  You can browse a server.  See what it has to offer.
907 * Exiting Gnus::           Stop reading news and get some work done.
908 * Group Topics::           A folding group mode divided into topics.
909 * Misc Group Stuff::       Other stuff that you can to do.
910 @end menu
911
912
913 @node Group Buffer Format
914 @section Group Buffer Format
915 @cindex group buffer format
916
917 @menu 
918 * Group Line Specification::       Deciding how the group buffer is to look.
919 * Group Modeline Specification::   The group buffer modeline.
920 * Group Highlighting::             Having nice colors in the group buffer.
921 @end menu
922
923
924 @node Group Line Specification
925 @subsection Group Line Specification
926
927 The default format of the group buffer is nice and dull, but you can
928 make it as exciting and ugly as you feel like.
929
930 Here's a couple of example group lines:
931
932 @example
933      25: news.announce.newusers
934  *    0: alt.fan.andrea-dworkin
935 @end example
936
937 Quite simple, huh?
938
939 You can see that there are 25 unread articles in
940 @samp{news.announce.newusers}.  There are no unread articles, but some
941 ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little
942 asterisk at the beginning of the line?)
943
944 @vindex gnus-group-line-format
945 You can change that format to whatever you want by fiddling with the
946 @code{gnus-group-line-format} variable.  This variable works along the
947 lines of a @code{format} specification, which is pretty much the same as
948 a @code{printf} specifications, for those of you who use (feh!) C.
949 @xref{Formatting Variables}. 
950
951 The default value that produced those lines above is 
952 @samp{%M%S%5y: %(%g%)\n}.
953
954 There should always be a colon on the line; the cursor always moves to
955 the colon after performing an operation.  Nothing else is required---not
956 even the group name.  All displayed text is just window dressing, and is
957 never examined by Gnus.  Gnus stores all real information it needs using
958 text properties.
959
960 (Note that if you make a really strange, wonderful, spreadsheet-like
961 layout, everybody will believe you are hard at work with the accounting
962 instead of wasting time reading news.)
963
964 Here's a list of all available format characters:
965
966 @table @samp
967
968 @item M    
969 Only marked articles.
970
971 @item S
972 Whether the group is subscribed.
973
974 @item L    
975 Level of subscribedness.
976
977 @item N
978 Number of unread articles.
979
980 @item I
981 Number of dormant articles.
982
983 @item T
984 Number of ticked articles.
985
986 @item R
987 Number of read articles.
988
989 @item t
990 Estimated total number of articles.  (This is really @var{max-number}
991 minus @var{min-number} plus 1.)
992
993 @item y
994 Number of unread, unticked, non-dormant articles.
995
996 @item i
997 Number of ticked and dormant articles.
998
999 @item g
1000 Full group name.
1001
1002 @item G
1003 Group name.
1004
1005 @item D
1006 Newsgroup description.
1007
1008 @item o
1009 @samp{m} if moderated.
1010
1011 @item O
1012 @samp{(m)} if moderated.
1013
1014 @item s
1015 Select method.
1016
1017 @item n
1018 Select from where.
1019
1020 @item z
1021 A string that looks like @samp{<%s:%n>} if a foreign select method is
1022 used.
1023
1024 @item P
1025 Indentation based on the level of the topic (@pxref{Group Topics}). 
1026
1027 @item c
1028 @vindex gnus-group-uncollapsed-levels
1029 Short (collapsed) group name.  The @code{gnus-group-uncollapsed-levels}
1030 variable says how many levels to leave at the end of the group name.
1031 The default is @code{1}.
1032
1033 @item u
1034 User defined specifier.  The next character in the format string should
1035 be a letter.  @sc{gnus} will call the function
1036 @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
1037 following @samp{%u}.  The function will be passed the current headers as
1038 argument.  The function should return a string, which will be inserted
1039 into the buffer just like information from any other specifier.
1040 @end table
1041
1042 @cindex *
1043 All the ``number-of'' specs will be filled with an asterisk (@samp{*})
1044 if no info is available---for instance, if it is a non-activated foreign
1045 group, or a bogus (or semi-bogus) native group.
1046
1047
1048 @node Group Modeline Specification
1049 @subsection Group Modeline Specification
1050
1051 @vindex gnus-group-mode-line-format
1052 The mode line can be changed by setting
1053 @code{gnus-group-mode-line-format} (@pxref{Formatting Variables}).  It
1054 doesn't understand that many format specifiers:
1055
1056 @table @samp
1057 @item S
1058 The native news server.
1059 @item M
1060 The native select method.
1061 @end table
1062
1063
1064 @node Group Highlighting
1065 @subsection Group Highlighting
1066
1067 @vindex gnus-group-highlight
1068 Highlighting in the group buffer is controlled by the
1069 @code{gnus-group-highlight} variable.  This is an alist with elements
1070 that look like @var{(form . face)}.  If @var{form} evaluates to
1071 something non-@code{nil}, the @var{face} will be used on the line.
1072
1073 Here's an example value for this variable that might look nice if the
1074 background is dark:
1075
1076 @lisp
1077 (setq gnus-group-highlight
1078     `(((> unread 200) . 
1079        ,(custom-face-lookup "Red" nil nil t nil nil))
1080       ((and (< level 3) (zerop unread)) . 
1081        ,(custom-face-lookup "SeaGreen" nil nil t nil nil))
1082       ((< level 3) . 
1083        ,(custom-face-lookup "SpringGreen" nil nil t nil nil))
1084       ((zerop unread) . 
1085        ,(custom-face-lookup "SteelBlue" nil nil t nil nil))
1086       (t . 
1087        ,(custom-face-lookup "SkyBlue" nil nil t nil nil))
1088       ))
1089 @end lisp
1090
1091 Variables that are dynamically bound when the forms are evaluated
1092 include:
1093
1094 @table @code
1095 @item group
1096 The group name.
1097 @item unread
1098 The number of unread articles in the group.
1099 @item method
1100 The select method.
1101 @item mailp
1102 Whether the group is a mail group.
1103 @item level
1104 The level of the group.
1105 @item score
1106 The score of the group.
1107 @item ticked 
1108 The number of ticked articles in the group.
1109 @item total
1110 The total number of articles in the group.  Or rather, MAX-NUMBER minus
1111 MIN-NUMBER.
1112 @item topic
1113 When using the topic minor mode, this variable is bound to the current
1114 topic being inserted.
1115 @end table
1116
1117 When the forms are @code{eval}ed, point is at the beginning of the line
1118 of the group in question, so you can use many of the normal Gnus
1119 functions for snarfing info on the group.
1120
1121 @vindex gnus-group-update-hook
1122 @findex gnus-group-highlight-line
1123 @code{gnus-group-update-hook} is called when a group line is changed.
1124 It will not be called when @code{gnus-visual} is @code{nil}.  This hook
1125 calls @code{gnus-group-highlight-line} by default.
1126
1127
1128 @node Group Maneuvering
1129 @section Group Maneuvering
1130 @cindex group movement
1131
1132 All movement commands understand the numeric prefix and will behave as
1133 expected, hopefully. 
1134
1135 @table @kbd
1136
1137 @item n
1138 @kindex n (Group)
1139 @findex gnus-group-next-unread-group
1140 Go to the next group that has unread articles
1141 (@code{gnus-group-next-unread-group}).
1142
1143 @item p
1144
1145 @itemx DEL
1146 @kindex DEL (Group)
1147 @kindex p (Group)
1148 @findex gnus-group-prev-unread-group
1149 Go to the previous group group that has unread articles
1150 (@code{gnus-group-prev-unread-group}).
1151
1152 @item N
1153 @kindex N (Group)
1154 @findex gnus-group-next-group
1155 Go to the next group (@code{gnus-group-next-group}).
1156
1157 @item P
1158 @kindex P (Group)
1159 @findex gnus-group-prev-group
1160 Go to the previous group (@code{gnus-group-prev-group}).
1161
1162 @item M-p
1163 @kindex M-p (Group)
1164 @findex gnus-group-next-unread-group-same-level
1165 Go to the next unread group on the same level (or lower)
1166 (@code{gnus-group-next-unread-group-same-level}). 
1167
1168 @item M-n
1169 @kindex M-n (Group)
1170 @findex gnus-group-prev-unread-group-same-level
1171 Go to the previous unread group on the same level (or lower)
1172 (@code{gnus-group-prev-unread-group-same-level}). 
1173 @end table
1174
1175 Three commands for jumping to groups:
1176
1177 @table @kbd
1178
1179 @item j
1180 @kindex j (Group)
1181 @findex gnus-group-jump-to-group
1182 Jump to a group (and make it visible if it isn't already)
1183 (@code{gnus-group-jump-to-group}).  Killed groups can be jumped to, just
1184 like living groups.
1185
1186 @item ,
1187 @kindex , (Group)
1188 @findex gnus-group-best-unread-group
1189 Jump to the unread group with the lowest level
1190 (@code{gnus-group-best-unread-group}). 
1191
1192 @item .
1193 @kindex . (Group)
1194 @findex gnus-group-first-unread-group
1195 Jump to the first group with unread articles
1196 (@code{gnus-group-first-unread-group}).  
1197 @end table
1198
1199 @vindex gnus-group-goto-unread
1200 If @code{gnus-group-goto-unread} is @code{nil}, all the movement
1201 commands will move to the next group, not the next unread group.  Even
1202 the commands that say they move to the next unread group.  The default
1203 is @code{t}.
1204
1205
1206 @node Selecting a Group
1207 @section Selecting a Group
1208 @cindex group selection
1209
1210 @table @kbd
1211
1212 @item SPACE
1213 @kindex SPACE (Group)
1214 @findex gnus-group-read-group
1215 Select the current group, switch to the summary buffer and display the
1216 first unread article (@code{gnus-group-read-group}).  If there are no
1217 unread articles in the group, or if you give a non-numerical prefix to
1218 this command, Gnus will offer to fetch all the old articles in this
1219 group from the server.  If you give a numerical prefix @var{N}, Gnus
1220 will fetch @var{N} number of articles.  If @var{N} is positive, fetch
1221 the @var{N} newest articles, if @var{N} is negative, fetch the
1222 @var{abs(N)} oldest articles.
1223
1224 @item RET
1225 @kindex RET (Group)
1226 @findex gnus-group-select-group
1227 Select the current group and switch to the summary buffer
1228 (@code{gnus-group-select-group}).  Takes the same arguments as
1229 @code{gnus-group-read-group}---the only difference is that this command
1230 does not display the first unread article automatically upon group
1231 entry. 
1232
1233 @item M-RET
1234 @kindex M-RET (Group)
1235 @findex gnus-group-quick-select-group
1236 This does the same as the command above, but tries to do it with the
1237 minimum amount off fuzz (@code{gnus-group-quick-select-group}).  No
1238 scoring/killing will be performed, there will be no highlights and no
1239 expunging.  This might be useful if you're in a real hurry and have to
1240 enter some humongous group.
1241
1242 @item M-SPACE
1243 @kindex M-RET (Group)
1244 @findex gnus-group-visible-select-group
1245 This is yet one more command that does the same as the one above, but
1246 this one does it without expunging and hiding dormants
1247 (@code{gnus-group-visible-select-group}).  
1248
1249 @item c
1250 @kindex c (Group)
1251 @findex gnus-group-catchup-current
1252 @vindex gnus-group-catchup-group-hook
1253 Mark all unticked articles in this group as read
1254 (@code{gnus-group-catchup-current}).
1255 @code{gnus-group-catchup-group-hook} is when catching up a group from
1256 the group buffer.
1257
1258 @item C
1259 @kindex C (Group)
1260 @findex gnus-group-catchup-current-all
1261 Mark all articles in this group, even the ticked ones, as read
1262 (@code{gnus-group-catchup-current-all}).   
1263
1264 @item M-c
1265 @kindex M-c (Group)
1266 @findex gnus-group-clear-data
1267 Clear the data from the current group---nix out marks and the list of
1268 read articles (@code{gnus-group-clear-data}).
1269
1270 @item M-x gnus-group-clear-data-on-native-groups
1271 @kindex M-x gnus-group-clear-data-on-native-groups
1272 @findex gnus-group-clear-data-on-native-groups
1273 If you have switced from one @sc{nntp} server to another, all your marks
1274 and read ranges have become worthless.  You can use this command to
1275 clear out all data that you have on your native groups.  Use with
1276 caution. 
1277
1278 @end table
1279
1280 @vindex gnus-large-newsgroup
1281 The @code{gnus-large-newsgroup} variable says what Gnus should consider
1282 to be a big group.  This is 200 by default.  If the group has more
1283 unread articles than this, Gnus will query the user before entering the
1284 group.  The user can then specify how many articles should be fetched
1285 from the server.  If the user specifies a negative number (@code{-n}),
1286 the @code{n} oldest articles will be fetched.  If it is positive, the
1287 @code{n} articles that have arrived most recently will be fetched.
1288
1289 @vindex gnus-select-group-hook
1290 @vindex gnus-auto-select-first
1291 @code{gnus-auto-select-first} control whether any articles are selected
1292 automatically when entering a group.  
1293
1294 @table @code
1295
1296 @item nil
1297 Don't select any articles when entering the group.  Just display the
1298 full summary buffer.
1299
1300 @item t
1301 Select the first unread article when entering the group.  
1302
1303 @item best
1304 Select the most high-scored article in the group when entering the
1305 group. 
1306 @end table
1307         
1308 If you want to prevent automatic selection in some group (say, in a
1309 binary group with Huge articles) you can set this variable to @code{nil}
1310 in @code{gnus-select-group-hook}, which is called when a group is
1311 selected.
1312
1313
1314 @node Subscription Commands
1315 @section Subscription Commands
1316 @cindex subscribing
1317
1318 @table @kbd
1319
1320 @item S t
1321 @itemx u
1322 @kindex S t (Group)
1323 @kindex u (Group)
1324 @findex gnus-group-unsubscribe-current-group
1325 Toggle subscription to the current group
1326 (@code{gnus-group-unsubscribe-current-group}).  
1327
1328 @item S s
1329 @itemx U
1330 @kindex S s (Group)
1331 @kindex U (Group)
1332 @findex gnus-group-unsubscribe-group
1333 Prompt for a group to subscribe, and then subscribe it.  If it was
1334 subscribed already, unsubscribe it instead
1335 (@code{gnus-group-unsubscribe-group}).
1336
1337 @item S k
1338 @itemx C-k
1339 @kindex S k (Group)
1340 @kindex C-k (Group)
1341 @findex gnus-group-kill-group
1342 Kill the current group (@code{gnus-group-kill-group}).
1343
1344 @item S y
1345 @itemx C-y
1346 @kindex S y (Group)
1347 @kindex C-y (Group)
1348 @findex gnus-group-yank-group
1349 Yank the last killed group (@code{gnus-group-yank-group}).
1350
1351 @item C-x C-t
1352 @kindex C-x C-t (Group)
1353 @findex gnus-group-transpose-groups
1354 Transpose two groups (@code{gnus-group-transpose-groups}).  This isn't
1355 really a subscription command, but you can use it instead of a
1356 kill-and-yank sequence sometimes.
1357
1358 @item S w
1359 @itemx C-w
1360 @kindex S w (Group)
1361 @kindex C-w (Group)
1362 @findex gnus-group-kill-region
1363 Kill all groups in the region (@code{gnus-group-kill-region}). 
1364
1365 @item S z
1366 @kindex S z (Group)
1367 @findex gnus-group-kill-all-zombies
1368 Kill all zombie groups (@code{gnus-group-kill-all-zombies}).
1369
1370 @item S C-k
1371 @kindex S C-k (Group)
1372 @findex gnus-group-kill-level
1373 Kill all groups on a certain level (@code{gnus-group-kill-level}).
1374 These groups can't be yanked back after killing, so this command should
1375 be used with some caution.  The only thing where this command comes in
1376 really handy is when you have a @file{.newsrc} with lots of unsubscribed
1377 groups that you want to get rid off.  @kbd{S C-k} on level @code{7} will
1378 kill off all unsubscribed groups that do not have message numbers in the
1379 @file{.newsrc} file.  
1380
1381 @end table
1382
1383 Also @pxref{Group Levels}.
1384
1385
1386 @node Group Levels
1387 @section Group Levels
1388 @cindex group level
1389
1390 All groups have a level of @dfn{subscribedness}.  For instance, if a
1391 group is on level 2, it is more subscribed than a group on level 5.  You
1392 can ask Gnus to just list groups on a given level or lower
1393 (@pxref{Listing Groups}), or to just check for new articles in groups on
1394 a given level or lower (@pxref{Scanning New Messages}).
1395
1396 Remember:  The higher the level of the group, the less important it is. 
1397
1398 @table @kbd
1399
1400 @item S l
1401 @kindex S l (Group)
1402 @findex gnus-group-set-current-level
1403 Set the level of the current group.  If a numeric prefix is given, the
1404 next @var{n} groups will have their levels set.  The user will be
1405 prompted for a level.
1406 @end table
1407
1408 @vindex gnus-level-killed
1409 @vindex gnus-level-zombie
1410 @vindex gnus-level-unsubscribed
1411 @vindex gnus-level-subscribed
1412 Gnus considers groups on between levels 1 and
1413 @code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed,
1414 @code{gnus-level-subscribed} (exclusive) and
1415 @code{gnus-level-unsubscribed} (inclusive) (default 7) to be
1416 unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead)
1417 (default 8) and @code{gnus-level-killed} to be killed (default 9),
1418 completely dead.  Gnus treats subscribed and unsubscribed groups exactly
1419 the same, but zombie and killed groups have no information on what
1420 articles you have read, etc, stored.  This distinction between dead and
1421 living groups isn't done because it is nice or clever, it is done purely
1422 for reasons of efficiency.
1423
1424 It is recommended that you keep all your mail groups (if any) on quite
1425 low levels (eg. 1 or 2).
1426
1427 If you want to play with the level variables, you should show some care.
1428 Set them once, and don't touch them ever again.  Better yet, don't touch
1429 them at all unless you know exactly what you're doing.
1430
1431 @vindex gnus-level-default-unsubscribed
1432 @vindex gnus-level-default-subscribed
1433 Two closely related variables are @code{gnus-level-default-subscribed}
1434 (default 3) and @code{gnus-level-default-unsubscribed} (default 6),
1435 which are the levels that new groups will be put on if they are
1436 (un)subscribed.  These two variables should, of course, be inside the
1437 relevant legal ranges.
1438
1439 @vindex gnus-keep-same-level
1440 If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands
1441 will only move to groups that are of the same level (or lower).  In
1442 particular, going from the last article in one group to the next group
1443 will go to the next group of the same level (or lower).  This might be
1444 handy if you want to read the most important groups before you read the
1445 rest.
1446
1447 @vindex gnus-group-default-list-level
1448 All groups with a level less than or equal to
1449 @code{gnus-group-default-list-level} will be listed in the group buffer
1450 by default.
1451
1452 @vindex gnus-group-list-inactive-groups
1453 If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active
1454 groups will be listed along with the unread groups.  This variable is
1455 @code{t} by default.  If it is @code{nil}, inactive groups won't be
1456 listed. 
1457
1458 @vindex gnus-group-use-permanent-levels
1459 If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you
1460 give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
1461 use this level as the ``work'' level.
1462
1463 @vindex gnus-activate-level
1464 Gnus will normally just activate groups that are on level
1465 @code{gnus-activate-level} or less.  If you don't want to activate
1466 unsubscribed groups, for instance, you might set this variable to
1467 @code{5}. 
1468
1469
1470 @node Group Score
1471 @section Group Score
1472 @cindex group score
1473
1474 You would normally keep important groups on high levels, but that scheme
1475 is somewhat restrictive.  Don't you wish you could have Gnus sort the
1476 group buffer according to how often you read groups, perhaps?  Within
1477 reason?  
1478
1479 This is what @dfn{group score} is for.  You can assign a score to each
1480 group.  You can then sort the group buffer based on this score.
1481 Alternatively, you can sort on score and then level.  (Taken together,
1482 the level and the score is called the @dfn{rank} of the group.  A group
1483 that is on level 4 and has a score of 1 has a higher rank than a group
1484 on level 5 that has a score of 300.  (The level is the most significant
1485 part and the score is the least significant part.)
1486
1487 @findex gnus-summary-bubble-group
1488 If you want groups you read often to get higher scores than groups you
1489 read seldom you can add the @code{gnus-summary-bubble-group} function to
1490 the @code{gnus-summary-exit-hook} hook.  This will result (after
1491 sorting) in a bubbling sort of action.  If you want to see that in
1492 action after each summary exit, you can add
1493 @code{gnus-group-sort-groups-by-rank} or
1494 @code{gnus-group-sort-groups-by-score} to the same hook, but that will
1495 slow things down somewhat.
1496
1497
1498 @node Marking Groups
1499 @section Marking Groups
1500 @cindex marking groups
1501
1502 If you want to perform some command on several groups, and they appear
1503 subsequently in the group buffer, you would normally just give a
1504 numerical prefix to the command.  Most group commands will then do your
1505 bidding on those groups.
1506
1507 However, if the groups are not in sequential order, you can still
1508 perform a command on several groups.  You simply mark the groups first
1509 with the process mark and then execute the command.
1510
1511 @table @kbd
1512
1513 @item #
1514 @kindex # (Group)
1515 @itemx M m
1516 @kindex M m (Group)
1517 @findex gnus-group-mark-group
1518 Set the mark on the current group (@code{gnus-group-mark-group}). 
1519
1520 @item M-#
1521 @kindex M-# (Group)
1522 @itemx M u
1523 @kindex M u (Group)
1524 @findex gnus-group-unmark-group
1525 Remove the mark from the current group
1526 (@code{gnus-group-unmark-group}). 
1527
1528 @item M U
1529 @kindex M U (Group)
1530 @findex gnus-group-unmark-all-groups
1531 Remove the mark from all groups (@code{gnus-group-unmark-all-groups}). 
1532
1533 @item M w
1534 @kindex M w (Group)
1535 @findex gnus-group-mark-region
1536 Mark all groups between point and mark (@code{gnus-group-mark-region}). 
1537
1538 @item M b
1539 @kindex M b (Group)
1540 @findex gnus-group-mark-buffer
1541 Mark all groups in the buffer (@code{gnus-group-mark-buffer}). 
1542
1543 @item M r
1544 @kindex M r (Group)
1545 @findex gnus-group-mark-regexp
1546 Mark all groups that match some regular expression
1547 (@code{gnus-group-mark-regexp}).  
1548 @end table
1549
1550 Also @pxref{Process/Prefix}.
1551
1552 @findex gnus-group-universal-argument
1553 If you want to execute some command on all groups that have been marked
1554 with the process mark, you can use the @kbd{M-&}
1555 (@code{gnus-group-universal-argument}) command.  It will prompt you for
1556 the command to be executed.
1557
1558
1559 @node Foreign Groups
1560 @section Foreign Groups
1561
1562 Below are some group mode commands for making and editing general foreign
1563 groups, as well as commands to ease the creation of a few
1564 special-purpose groups.  All these commands insert the newly created
1565 groups under point---@code{gnus-subscribe-newsgroup-method} is not
1566 consulted.
1567
1568 @table @kbd
1569
1570 @item G m
1571 @kindex G m (Group)
1572 @findex gnus-group-make-group
1573 Make a new group (@code{gnus-group-make-group}).  Gnus will prompt you
1574 for a name, a method and possibly an @dfn{address}.  For an easier way
1575 to subscribe to @sc{nntp} groups, @pxref{Browse Foreign Server}.
1576
1577 @item G r
1578 @kindex G r (Group)
1579 @findex gnus-group-rename-group
1580 Rename the current group to something else
1581 (@code{gnus-group-rename-group}).  This is legal only on some
1582 groups---mail groups mostly.  This command might very well be quite slow
1583 on some backends.
1584
1585 @item G e
1586 @kindex G e (Group)
1587 @findex gnus-group-edit-group-method
1588 Enter a buffer where you can edit the select method of the current
1589 group (@code{gnus-group-edit-group-method}).
1590
1591 @item G p
1592 @kindex G p (Group)
1593 @findex gnus-group-edit-group-parameters
1594 Enter a buffer where you can edit the group parameters
1595 (@code{gnus-group-edit-group-parameters}). 
1596
1597 @item G E
1598 @kindex G E (Group)
1599 @findex gnus-group-edit-group
1600 Enter a buffer where you can edit the group info
1601 (@code{gnus-group-edit-group}).
1602
1603 @item G d
1604 @kindex G d (Group)
1605 @findex gnus-group-make-directory-group
1606 Make a directory group (@pxref{Directory Groups}).  You will be prompted
1607 for a directory name (@code{gnus-group-make-directory-group}).
1608
1609 @item G h 
1610 @kindex G h (Group)
1611 @findex gnus-group-make-help-group
1612 Make the Gnus help group (@code{gnus-group-make-help-group}).
1613
1614 @item G a
1615 @kindex G a (Group)
1616 @findex gnus-group-make-archive-group
1617 @vindex gnus-group-archive-directory
1618 @vindex gnus-group-recent-archive-directory
1619 Make a Gnus archive group (@code{gnus-group-make-archive-group}).  By
1620 default a group pointing to the most recent articles will be created
1621 (@code{gnus-group-recent-archive-directory}), but given a prefix, a full
1622 group will be created from @code{gnus-group-archive-directory}.
1623
1624 @item G k
1625 @kindex G k (Group)
1626 @findex gnus-group-make-kiboze-group
1627 Make a kiboze group.  You will be prompted for a name, for a regexp to
1628 match groups to be ``included'' in the kiboze group, and a series of
1629 strings to match on headers (@code{gnus-group-make-kiboze-group}).
1630 @xref{Kibozed Groups}
1631
1632 @item G D
1633 @kindex G D (Group)
1634 @findex gnus-group-enter-directory
1635 Read an arbitrary directory as if with were a newsgroup with the
1636 @code{nneething} backend (@code{gnus-group-enter-directory}).
1637 @xref{Anything Groups}. 
1638
1639 @item G f
1640 @kindex G f (Group)
1641 @findex gnus-group-make-doc-group
1642 @cindex ClariNet Briefs
1643 Make a group based on some file or other
1644 (@code{gnus-group-make-doc-group}).  If you give a prefix to this
1645 command, you will be prompted for a file name and a file type.
1646 Currently supported types are @code{babyl}, @code{mbox}, @code{digest},
1647 @code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs}, and
1648 @code{forward}.  If you run this command without a prefix, Gnus will
1649 guess at the file type.  @xref{Document Groups}.
1650
1651 @item G n
1652 @kindex G n (Group)
1653 @findex gnus-group-make-web-group
1654 @cindex DejaNews
1655 @cindex Alta Vista
1656 @cindex InReference
1657 Make an ephemeral group based on a web search
1658 (@code{gnus-group-make-web-group}).  If you give a prefix to this
1659 command, make a solid group instead.  You will be prompted for the
1660 search engine type and the search string.  Legal search engine types
1661 include @code{dejanews}, @code{altavista} and @code{reference}.
1662 @xref{Web Searches}.
1663
1664 @item G DEL
1665 @kindex G DEL (Group)
1666 @findex gnus-group-delete-group
1667 This function will delete the current group
1668 (@code{gnus-group-delete-group}).  If given a prefix, this function will
1669 actually delete all the articles in the group, and forcibly remove the
1670 group itself from the face of the Earth.  Use a prefix only if you are
1671 absolutely sure of what you are doing.
1672
1673 @item G V
1674 @kindex G V (Group)
1675 @findex gnus-group-make-empty-virtual
1676 Make a new, fresh, empty @code{nnvirtual} group
1677 (@code{gnus-group-make-empty-virtual}).  @xref{Virtual Groups}.
1678
1679 @item G v
1680 @kindex G v (Group)
1681 @findex gnus-group-add-to-virtual
1682 Add the current group to an @code{nnvirtual} group
1683 (@code{gnus-group-add-to-virtual}).  Uses the process/prefix convention.
1684 @end table
1685
1686 @xref{Select Methods} for more information on the various select
1687 methods. 
1688
1689 @vindex gnus-activate-foreign-newsgroups
1690 If the @code{gnus-activate-foreign-newsgroups} is a positive number,
1691 Gnus will check all foreign groups with this level or lower at startup.
1692 This might take quite a while, especially if you subscribe to lots of
1693 groups from different @sc{nntp} servers.
1694
1695
1696 @node Group Parameters
1697 @section Group Parameters
1698 @cindex group parameters
1699
1700 Gnus stores all information on a group in a list that is usually known
1701 as the @dfn{group info}.  This list has from three to six elements.
1702 Here's an example info.
1703
1704 @lisp
1705 ("nnml:mail.ding" 3 ((1 . 232) 244 (256 . 270)) ((tick 246 249))
1706                   (nnml "private") ((to-address . "ding@@ifi.uio.no")))
1707 @end lisp
1708
1709 The first element is the @dfn{group name}, as Gnus knows the group,
1710 anyway.  The second element is the @dfn{subscription level}, which
1711 normally is a small integer.  The third element is a list of ranges of
1712 read articles.  The fourth element is a list of lists of article marks
1713 of various kinds.  The fifth element is the select method (or virtual
1714 server, if you like).  The sixth element is a list of @dfn{group
1715 parameters}, which is what this section is about.
1716
1717 Any of the last three elements may be missing if they are not required.
1718 In fact, the vast majority of groups will normally only have the first
1719 three elements, which saves quite a lot of cons cells.
1720
1721 The group parameters store information local to a particular group:
1722
1723 @table @code
1724 @item to-address
1725 @cindex to-address
1726 If the group parameter list contains an element that looks like
1727 @code{(to-address .  "some@@where.com")}, that address will be used by
1728 the backend when doing followups and posts.  This is primarily useful in
1729 mail groups that represent closed mailing lists---mailing lists where
1730 it's expected that everybody that writes to the mailing list is
1731 subscribed to it.  Since using this parameter ensures that the mail only
1732 goes to the mailing list itself, it means that members won't receive two
1733 copies of your followups.
1734
1735 Using @code{to-address} will actually work whether the group is foreign
1736 or not.  Let's say there's a group on the server that is called
1737 @samp{fa.4ad-l}.  This is a real newsgroup, but the server has gotten
1738 the articles from a mail-to-news gateway.  Posting directly to this
1739 group is therefore impossible---you have to send mail to the mailing
1740 list address instead. 
1741
1742 @item to-list
1743 @cindex to-list
1744 If the group parameter list has an element that looks like
1745 @code{(to-list . "some@@where.com")}, that address will be used when
1746 doing a @kbd{a} in any group.  It is totally ignored when doing a
1747 followup---except that if it is present in a news group, you'll get mail
1748 group semantics when doing @kbd{f}.
1749
1750 @item broken-reply-to
1751 @cindex broken-reply-to
1752 Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
1753 headers in this group are to be ignored.  This can be useful if you're
1754 reading a mailing list group where the listserv has inserted
1755 @code{Reply-To} headers that point back to the listserv itself.  This is
1756 broken behavior.  So there!
1757
1758 @item to-group
1759 @cindex to-group
1760 If the group parameter list contains an element like @code{(to-group
1761 . "some.group.name")}, all posts will be sent to that group.
1762
1763 @item gcc-self
1764 @cindex gcc-self
1765 If this symbol is present in the group parameter list, new composed
1766 messages will be @code{Gcc}'d to the current group.  
1767
1768 @item auto-expire
1769 @cindex auto-expire
1770 If this symbol is present in the group parameter list, all articles that
1771 are read will be marked as expirable.  For an alternative approach,
1772 @pxref{Expiring Mail}.
1773
1774 @item total-expire
1775 @cindex total-expire
1776 If this symbol is present, all read articles will be put through the
1777 expiry process, even if they are not marked as expirable.  Use with
1778 caution. 
1779
1780 @item expiry-wait
1781 @cindex expiry-wait
1782 @vindex nnmail-expiry-wait-function
1783 If the group parameter has an element that looks like @code{(expiry-wait
1784 . 10)}, this value will override any @code{nnmail-expiry-wait} and
1785 @code{nnmail-expiry-wait-function} when expiring expirable messages.
1786 The value can either be a number of days (not necessarily an integer) or
1787 the symbols @code{never} or @code{immediate}.
1788
1789 @item score-file
1790 @cindex score file group parameter
1791 Elements that look like @code{(score-file . "file")} will make
1792 @file{file} into the current score file for the group in question.  This
1793 means that all score commands you issue will end up in that file. 
1794
1795 @item adapt-file
1796 @cindex adapt file group parameter
1797 Elements that look like @code{(adapt-file . "file")} will make
1798 @file{file} into the current adaptive file for the group in question.
1799 All adaptive score entries will be put into this file.
1800
1801 @item admin-address
1802 When unsubscribing to a mailing list you should never send the
1803 unsubscription notice to the mailing list itself.  Instead, you'd send
1804 messages to the administrative address.  This parameter allows you to
1805 put the admin address somewhere convenient.
1806
1807 @item display
1808 Elements that look like @code{(display . MODE)} says which articles to
1809 display on entering the group.  Legal values are:
1810
1811 @table @code
1812 @item all
1813 Display all articles, both read and unread.
1814
1815 @item default
1816 Display the default visible articles, which normally includes unread and
1817 ticked articles.
1818 @end table
1819
1820 @item comment
1821 This parameter allows you to enter a arbitrary comment on the group.
1822
1823 @item @var{(variable form)}
1824 You can use the group parameters to set variables local to the group you
1825 are entering.  Say you want to turn threading off in
1826 @samp{news.answers}.  You'd then put @code{(gnus-show-threads nil)} in
1827 the group parameters of that group.  @code{gnus-show-threads} will be
1828 made into a local variable in the summary buffer you enter, and the form
1829 @code{nil} will be @code{eval}ed there.  
1830
1831 This can also be used as a group-specific hook function, if you'd like.
1832 If you want to hear a beep when you enter the group
1833 @samp{alt.binaries.pictures.furniture}, you could put something like
1834 @code{(dummy-variable (ding))} in the parameters of that group.
1835 @code{dummy-variable} will be set to the result of the @code{(ding)}
1836 form, but who cares?
1837
1838 @end table
1839
1840 Use the @kbd{G p} command to edit group parameters of a group.
1841
1842 Also @xref{Topic Parameters}.
1843
1844
1845 @node Listing Groups
1846 @section Listing Groups
1847 @cindex group listing
1848
1849 These commands all list various slices of the groups that are available.
1850
1851 @table @kbd
1852
1853 @item l
1854 @itemx A s
1855 @kindex A s (Group)
1856 @kindex l (Group)
1857 @findex gnus-group-list-groups
1858 List all groups that have unread articles
1859 (@code{gnus-group-list-groups}).  If the numeric prefix is used, this
1860 command will list only groups of level ARG and lower.  By default, it
1861 only lists groups of level five or lower (i.e., just subscribed groups).
1862
1863 @item L
1864 @itemx A u
1865 @kindex A u (Group)
1866 @kindex L (Group)
1867 @findex gnus-group-list-all-groups
1868 List all groups, whether they have unread articles or not
1869 (@code{gnus-group-list-all-groups}).  If the numeric prefix is used,
1870 this command will list only groups of level ARG and lower.  By default,
1871 it lists groups of level seven or lower (i.e., just subscribed and
1872 unsubscribed groups).
1873
1874 @item A l
1875 @kindex A l (Group)
1876 @findex gnus-group-list-level
1877 List all unread groups on a specific level
1878 (@code{gnus-group-list-level}).  If given a prefix, also list the groups
1879 with no unread articles.
1880
1881 @item A k
1882 @kindex A k (Group)
1883 @findex gnus-group-list-killed
1884 List all killed groups (@code{gnus-group-list-killed}).  If given a
1885 prefix argument, really list all groups that are available, but aren't
1886 currently (un)subscribed.  This could entail reading the active file
1887 from the server.
1888
1889 @item A z
1890 @kindex A z (Group)
1891 @findex gnus-group-list-zombies
1892 List all zombie groups (@code{gnus-group-list-zombies}).
1893
1894 @item A m
1895 @kindex A m (Group)
1896 @findex gnus-group-list-matching
1897 List all unread, subscribed groups with names that match a regexp
1898 (@code{gnus-group-list-matching}). 
1899
1900 @item A M
1901 @kindex A M (Group)
1902 @findex gnus-group-list-all-matching
1903 List groups that match a regexp (@code{gnus-group-list-all-matching}).
1904
1905 @item A A
1906 @kindex A A (Group)
1907 @findex gnus-group-list-active
1908 List absolutely all groups that are in the active file(s) of the
1909 server(s) you are connected to (@code{gnus-group-list-active}).  This
1910 might very well take quite a while.  It might actually be a better idea
1911 to do a @kbd{A m} to list all matching, and just give @samp{.} as the
1912 thing to match on.  Also note that this command may list group that
1913 don't exist (yet)---these will be listed as if they are killed groups.
1914 Take the output with some grains of salt.
1915
1916 @item A a
1917 @kindex A a (Group)
1918 @findex gnus-group-apropos
1919 List all groups that have names that match a regexp
1920 (@code{gnus-group-apropos}).
1921
1922 @item A d
1923 @kindex A d (Group)
1924 @findex gnus-group-description-apropos
1925 List all groups that have names or descriptions that match a regexp
1926 (@code{gnus-group-description-apropos}).
1927
1928 @end table
1929
1930 @vindex gnus-permanently-visible-groups
1931 @cindex visible group parameter
1932 Groups that match the @code{gnus-permanently-visible-groups} regexp will
1933 always be shown, whether they have unread articles or not.  You can also
1934 add the @code{visible} element to the group parameters in question to
1935 get the same effect.
1936
1937 @vindex gnus-list-groups-with-ticked-articles
1938 Groups that have just ticked articles in it are normally listed in the
1939 group buffer.  If @code{gnus-list-groups-with-ticked-articles} is
1940 @code{nil}, these groups will be treated just like totally empty
1941 groups.  It is @code{t} by default.
1942
1943
1944 @node Sorting Groups
1945 @section Sorting Groups
1946 @cindex sorting groups
1947
1948 @kindex C-c C-s (Group)
1949 @findex gnus-group-sort-groups
1950 @vindex gnus-group-sort-function
1951 The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the
1952 group buffer according to the function(s) given by the
1953 @code{gnus-group-sort-function} variable.  Available sorting functions
1954 include: 
1955
1956 @table @code
1957
1958 @item gnus-group-sort-by-alphabet
1959 @findex gnus-group-sort-by-alphabet
1960 Sort the group names alphabetically.  This is the default.
1961
1962 @item gnus-group-sort-by-real-name
1963 @findex gnus-group-sort-by-real-name
1964 Sort the group alphabetically on the real (unprefixed) group names.
1965
1966 @item gnus-group-sort-by-level
1967 @findex gnus-group-sort-by-level
1968 Sort by group level.
1969
1970 @item gnus-group-sort-by-score
1971 @findex gnus-group-sort-by-score
1972 Sort by group score.
1973
1974 @item gnus-group-sort-by-rank
1975 @findex gnus-group-sort-by-rank
1976 Sort by group score and then the group level.  The level and the score
1977 are, when taken together, the group's @dfn{rank}. 
1978
1979 @item gnus-group-sort-by-unread
1980 @findex gnus-group-sort-by-unread
1981 Sort by number of unread articles.
1982
1983 @item gnus-group-sort-by-method
1984 @findex gnus-group-sort-by-method
1985 Sort by alphabetically on the select method.
1986
1987
1988 @end table
1989
1990 @code{gnus-group-sort-function} can also be a list of sorting
1991 functions.  In that case, the most significant sort key function must be
1992 the last one.
1993
1994
1995 There are also a number of commands for sorting directly according to
1996 some sorting criteria:
1997
1998 @table @kbd
1999 @item G S a
2000 @kindex G S a (Group)
2001 @findex gnus-group-sort-groups-by-alphabet
2002 Sort the group buffer alphabetically by group name
2003 (@code{gnus-group-sort-groups-by-alphabet}). 
2004
2005 @item G S u
2006 @kindex G S u (Group)
2007 @findex gnus-group-sort-groups-by-unread
2008 Sort the group buffer by the number of unread articles
2009 (@code{gnus-group-sort-groups-by-unread}).
2010
2011 @item G S l
2012 @kindex G S l (Group)
2013 @findex gnus-group-sort-groups-by-level
2014 Sort the group buffer by group level
2015 (@code{gnus-group-sort-groups-by-level}). 
2016
2017 @item G S v
2018 @kindex G S v (Group)
2019 @findex gnus-group-sort-groups-by-score
2020 Sort the group buffer by group score
2021 (@code{gnus-group-sort-groups-by-score}). 
2022
2023 @item G S r
2024 @kindex G S r (Group)
2025 @findex gnus-group-sort-groups-by-rank
2026 Sort the group buffer by group level
2027 (@code{gnus-group-sort-groups-by-rank}). 
2028
2029 @item G S m
2030 @kindex G S m (Group)
2031 @findex gnus-group-sort-groups-by-method
2032 Sort the group buffer alphabetically by backend name
2033 (@code{gnus-group-sort-groups-by-method}). 
2034
2035 @end table
2036
2037 When given a prefix, all these commands will sort in reverse order. 
2038
2039
2040 @node Group Maintenance
2041 @section Group Maintenance
2042 @cindex bogus groups
2043
2044 @table @kbd
2045 @item b
2046 @kindex b (Group)
2047 @findex gnus-group-check-bogus-groups
2048 Find bogus groups and delete them
2049 (@code{gnus-group-check-bogus-groups}).
2050
2051 @item F
2052 @kindex F (Group)
2053 @findex gnus-find-new-newsgroups
2054 Find new groups and process them (@code{gnus-find-new-newsgroups}).  If
2055 given a prefix, use the @code{ask-server} method to query the server for
2056 new groups.
2057
2058 @item C-c C-x
2059 @kindex C-c C-x (Group)
2060 @findex gnus-group-expire-articles
2061 Run all expirable articles in the current group through the expiry
2062 process (if any) (@code{gnus-group-expire-articles}).
2063
2064 @item C-c M-C-x
2065 @kindex C-c M-C-x (Group)
2066 @findex gnus-group-expire-all-groups
2067 Run all articles in all groups through the expiry process
2068 (@code{gnus-group-expire-all-groups}).
2069
2070 @end table
2071
2072
2073 @node Browse Foreign Server
2074 @section Browse Foreign Server
2075 @cindex foreign servers
2076 @cindex browsing servers
2077
2078 @table @kbd
2079 @item B
2080 @kindex B (Group)
2081 @findex gnus-group-browse-foreign-server
2082 You will be queried for a select method and a server name.  Gnus will
2083 then attempt to contact this server and let you browse the groups there
2084 (@code{gnus-group-browse-foreign-server}).
2085 @end table
2086
2087 @findex gnus-browse-mode
2088 A new buffer with a list of available groups will appear.  This buffer
2089 will be use the @code{gnus-browse-mode}.  This buffer looks a bit
2090 (well, a lot) like a normal group buffer, but with one major difference
2091 - you can't enter any of the groups.  If you want to read any of the
2092 news available on that server, you have to subscribe to the groups you
2093 think may be interesting, and then you have to exit this buffer.  The
2094 new groups will be added to the group buffer, and then you can read them
2095 as you would any other group.
2096
2097 Future versions of Gnus may possibly permit reading groups straight from
2098 the browse buffer.
2099
2100 Here's a list of keystrokes available in the browse mode:
2101
2102 @table @kbd
2103 @item n
2104 @kindex n (Browse)
2105 @findex gnus-group-next-group
2106 Go to the next group (@code{gnus-group-next-group}).
2107
2108 @item p
2109 @kindex p (Browse)
2110 @findex gnus-group-prev-group
2111 Go to the previous group (@code{gnus-group-prev-group}).
2112
2113 @item SPACE
2114 @kindex SPACE (Browse)
2115 @findex gnus-browse-read-group
2116 Enter the current group and display the first article
2117 (@code{gnus-browse-read-group}). 
2118
2119 @item RET
2120 @kindex RET (Browse)
2121 @findex gnus-browse-select-group
2122 Enter the current group (@code{gnus-browse-select-group}). 
2123
2124 @item u
2125 @kindex u (Browse)
2126 @findex gnus-browse-unsubscribe-current-group
2127 Unsubscribe to the current group, or, as will be the case here,
2128 subscribe to it (@code{gnus-browse-unsubscribe-current-group}). 
2129
2130 @item l
2131 @itemx q
2132 @kindex q (Browse)
2133 @kindex l (Browse)
2134 @findex gnus-browse-exit
2135 Exit browse mode (@code{gnus-browse-exit}).
2136
2137 @item ?
2138 @kindex ? (Browse)
2139 @findex gnus-browse-describe-briefly
2140 Describe browse mode briefly (well, there's not much to describe, is
2141 there) (@code{gnus-browse-describe-briefly}).
2142 @end table
2143
2144
2145 @node Exiting Gnus
2146 @section Exiting Gnus
2147 @cindex exiting Gnus
2148
2149 Yes, Gnus is ex(c)iting.
2150
2151 @table @kbd
2152 @item z
2153 @kindex z (Group)
2154 @findex gnus-group-suspend
2155 Suspend Gnus (@code{gnus-group-suspend}).  This doesn't really exit Gnus,
2156 but it kills all buffers except the Group buffer.  I'm not sure why this
2157 is a gain, but then who am I to judge?
2158
2159 @item q
2160 @kindex q (Group)
2161 @findex gnus-group-exit
2162 Quit Gnus (@code{gnus-group-exit}).
2163
2164 @item Q
2165 @kindex Q (Group)
2166 @findex gnus-group-quit
2167 Quit Gnus without saving any startup files (@code{gnus-group-quit}).
2168 @end table
2169
2170 @vindex gnus-exit-gnus-hook
2171 @vindex gnus-suspend-gnus-hook
2172 @code{gnus-suspend-gnus-hook} is called when you suspend Gnus and
2173 @code{gnus-exit-gnus-hook} is called when you quit Gnus, while
2174 @code{gnus-after-exiting-gnus-hook} is called as the final item when
2175 exiting Gnus.
2176
2177 @findex gnus-unload
2178 @cindex unloading
2179 If you wish to completely unload Gnus and all its adherents, you can use
2180 the @code{gnus-unload} command.  This command is also very handy when
2181 trying to customize meta-variables.
2182
2183 Note:
2184
2185 @quotation
2186 Miss Lisa Cannifax, while sitting in English class, feels her feet go
2187 numbly heavy and herself fall into a hazy trance as the boy sitting
2188 behind her drew repeated lines with his pencil across the back of her
2189 plastic chair.
2190 @end quotation
2191
2192
2193 @node Group Topics
2194 @section Group Topics
2195 @cindex topics
2196
2197 If you read lots and lots of groups, it might be convenient to group
2198 them hierarchically according to topics.  You put your Emacs groups over
2199 here, your sex groups over there, and the rest (what, two groups or so?)
2200 you put in some misc section that you never bother with anyway.  You can
2201 even group the Emacs sex groups as a sub-topic to either the Emacs
2202 groups or the sex groups---or both!  Go wild!
2203
2204 @findex gnus-topic-mode
2205 @kindex t (Group)
2206 To get this @emph{fab} functionality you simply turn on (ooh!) the
2207 @code{gnus-topic} minor mode---type @kbd{t} in the group buffer.  (This
2208 is a toggling command.)
2209
2210 Go ahead, just try it.  I'll still be here when you get back.  La de
2211 dum...  Nice tune, that...  la la la...  What, you're back? Yes, and now
2212 press @kbd{l}.  There.  All your groups are now listed under
2213 @samp{misc}.  Doesn't that make you feel all warm and fuzzy?  Hot and
2214 bothered?
2215
2216 If you want this permanently enabled, you should add that minor mode to
2217 the hook for the group mode:
2218
2219 @lisp
2220 (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
2221 @end lisp
2222
2223 @menu 
2224 * Topic Variables::    How to customize the topics the Lisp Way.
2225 * Topic Commands::     Interactive E-Z commands.
2226 * Topic Topology::     A map of the world.
2227 * Topic Parameters::   Parameters that apply to all groups in a topic.
2228 @end menu
2229
2230
2231 @node Topic Variables
2232 @subsection Topic Variables
2233 @cindex topic variables
2234
2235 Now, if you select a topic, if will fold/unfold that topic, which is
2236 really neat, I think.
2237
2238 @vindex gnus-topic-line-format
2239 The topic lines themselves are created according to the
2240 @code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
2241 Legal elements are:
2242
2243 @table @samp
2244 @item i
2245 Indentation.
2246 @item n
2247 Topic name.
2248 @item v
2249 Visibility.
2250 @item l
2251 Level.
2252 @item g
2253 Number of groups in the topic.
2254 @item a
2255 Number of unread articles in the topic.
2256 @item A 
2257 Number of unread articles in the topic and all its subtopics. 
2258 @end table
2259
2260 @vindex gnus-topic-indent-level
2261 Each sub-topic (and the groups in the sub-topics) will be indented with
2262 @code{gnus-topic-indent-level} times the topic level number of spaces.
2263 The default is @code{2}.
2264
2265 @vindex gnus-topic-mode-hook
2266 @code{gnus-topic-mode-hook} is called in topic minor mode buffers. 
2267
2268 @vindex gnus-topic-display-empty-topics
2269 The @code{gnus-topic-display-empty-topics} says whether to display even
2270 topics that have no unread articles in them.  The default is @code{t}.
2271
2272
2273 @node Topic Commands
2274 @subsection Topic Commands
2275 @cindex topic commands
2276
2277 When the topic minor mode is turned on, a new @kbd{T} submap will be
2278 available.  In addition, a few of the standard keys change their
2279 definitions slightly.
2280
2281 @table @kbd
2282
2283 @item T n
2284 @kindex T n (Topic)
2285 @findex gnus-topic-create-topic
2286 Prompt for a new topic name and create it 
2287 (@code{gnus-topic-create-topic}). 
2288
2289 @item T m
2290 @kindex T m (Topic)
2291 @findex gnus-topic-move-group
2292 Move the current group to some other topic
2293 (@code{gnus-topic-move-group}).  This command understands the
2294 process/prefix convention (@pxref{Process/Prefix}).
2295
2296 @item T c
2297 @kindex T c (Topic)
2298 @findex gnus-topic-copy-group
2299 Copy the current group to some other topic
2300 (@code{gnus-topic-copy-group}).  This command understands the
2301 process/prefix convention (@pxref{Process/Prefix}).
2302
2303 @item T D
2304 @kindex T D (Topic)
2305 @findex gnus-topic-remove-group
2306 Remove a group from the current topic (@code{gnus-topic-remove-group}).
2307 This command understands the process/prefix convention
2308 (@pxref{Process/Prefix}).
2309
2310 @item T M
2311 @kindex T M (Topic)
2312 @findex gnus-topic-move-matching
2313 Move all groups that match some regular expression to a topic
2314 (@code{gnus-topic-move-matching}). 
2315
2316 @item T C
2317 @kindex T C (Topic)
2318 @findex gnus-topic-copy-matching
2319 Copy all groups that match some regular expression to a topic
2320 (@code{gnus-topic-copy-matching}). 
2321
2322 @item T #
2323 @kindex T # (Topic)
2324 @findex gnus-topic-mark-topic
2325 Mark all groups in the current topic with the process mark
2326 (@code{gnus-topic-mark-topic}). 
2327
2328 @item T M-#
2329 @kindex T M-# (Topic)
2330 @findex gnus-topic-unmark-topic
2331 Remove the process mark from all groups in the current topic
2332 (@code{gnus-topic-unmark-topic}). 
2333
2334 @item RET
2335 @kindex RET (Topic)
2336 @findex gnus-topic-select-group
2337 @itemx SPACE
2338 Either select a group or fold a topic (@code{gnus-topic-select-group}).
2339 When you perform this command on a group, you'll enter the group, as
2340 usual.  When done on a topic line, the topic will be folded (if it was
2341 visible) or unfolded (if it was folded already).  So it's basically a
2342 toggling command on topics.  In addition, if you give a numerical
2343 prefix, group on that level (and lower) will be displayed.
2344
2345 @item T TAB
2346 @kindex T TAB (Topic)
2347 @findex gnus-topic-indent
2348 ``Indent'' the current topic so that it becomes a sub-topic of the
2349 previous topic (@code{gnus-topic-indent}).  If given a prefix,
2350 ``un-indent'' the topic instead.
2351
2352 @item C-k
2353 @kindex C-k (Topic)
2354 @findex gnus-topic-kill-group
2355 Kill a group or topic (@code{gnus-topic-kill-group}).  
2356
2357 @item C-y
2358 @kindex C-y (Topic)
2359 @findex gnus-topic-yank-group
2360 Yank the previously killed group or topic (@code{gnus-topic-yank-group}).
2361 Note that all topics will be yanked before all groups.
2362
2363 @item T r
2364 @kindex T r (Topic)
2365 @findex gnus-topic-rename
2366 Rename a topic (@code{gnus-topic-rename}). 
2367
2368 @item T DEL
2369 @kindex T DEL (Topic)
2370 @findex gnus-topic-delete
2371 Delete an empty topic (@code{gnus-topic-delete}). 
2372
2373 @item A T
2374 @kindex A T (Topic)
2375 @findex gnus-topic-list-active
2376 List all groups that Gnus knows about in a topics-ified way
2377 (@code{gnus-topic-list-active}).
2378
2379 @item G p
2380 @kindex G p (Topic)
2381 @findex gnus-topic-edit-parameters
2382 @cindex group parameters
2383 @cindex topic parameters
2384 @cindex parameters
2385 Edit the topic parameters (@code{gnus-topic-edit-parameters}).
2386 @xref{Topic Parameters}.
2387
2388 @end table
2389
2390
2391 @node Topic Topology
2392 @subsection Topic Topology
2393 @cindex topic topology
2394 @cindex topology
2395
2396 So, let's have a look at an example group buffer:
2397
2398 @example
2399 Gnus
2400   Emacs -- I wuw it!
2401      3: comp.emacs
2402      2: alt.religion.emacs
2403     Naughty Emacs
2404      452: alt.sex.emacs
2405        0: comp.talk.emacs.recovery
2406   Misc
2407      8: comp.binaries.fractals
2408     13: comp.sources.unix
2409 @end example
2410
2411 So, here we have one top-level topic, two topics under that, and one
2412 sub-topic under one of the sub-topics.  (There is always just one (1)
2413 top-level topic).  This topology can be expressed as follows:
2414
2415 @lisp
2416 (("Gnus" visible)
2417  (("Emacs -- I wuw it!" visible) 
2418   (("Naughty Emacs" visible)))
2419  (("Misc" visible)))
2420 @end lisp
2421
2422 @vindex gnus-topic-topology
2423 This is in fact how the variable @code{gnus-topic-topology} would look
2424 for the display above.  That variable is saved in the @file{.newsrc.eld}
2425 file, and shouldn't be messed with manually---unless you really want
2426 to.  Since this variable is read from the @file{.newsrc.eld} file,
2427 setting it in any other startup files will have no effect.  
2428
2429 This topology shows what topics are sub-topics of what topics (right),
2430 and which topics are visible.  Two settings are currently
2431 allowed---@code{visible} and @code{invisible}.
2432
2433
2434 @node Topic Parameters
2435 @subsection Topic Parameters
2436
2437 All groups in a topic will inherit group parameters from the parent (and
2438 ancestor) topic parameters.  All legal group parameters are legal topic
2439 parameters (@pxref{Group Parameters}).  
2440
2441 Group parameters (of course) override topic parameters, and topic
2442 parameters in sub-topics override topic parameters in super-topics.  You
2443 know.  Normal inheretance rules.  (@dfn{Rules} is here a noun, not a
2444 verb, although you may feel free to disagree with me here.)
2445
2446 @example
2447 Gnus
2448   Emacs
2449      3: comp.emacs
2450      2: alt.religion.emacs
2451    452: alt.sex.emacs
2452     Relief
2453      452: alt.sex.emacs
2454        0: comp.talk.emacs.recovery
2455   Misc
2456      8: comp.binaries.fractals
2457     13: comp.sources.unix
2458    452: alt.sex.emacs
2459 @end example
2460
2461 Now, the @samp{Emacs} topic has the topic parameter 
2462 @code{(score-file . "emacs.SCORE")}; the @samp{Relief} topic has the topic
2463 parameter @code{(score-file . "relief.SCORE")}; and the @samp{Misc}
2464 topic has the topic parameter @code{(score-file . "emacs.SCORE")}.  In
2465 addition, @samp{alt.religion.emacs} has the group parameter
2466 @code{(score-file . "religion.SCORE")}.
2467
2468 Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you
2469 will get the @file{relief.SCORE} home score file.  If you enter the same
2470 group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home
2471 score file.  If you enter @samp{alt.religion.emacs}, you'll get the
2472 @file{religion.SCORE} home score file.  
2473
2474 This seems rather simple and self-evident, doesn't it?  Well, yes.  But
2475 there are some problems, especially with the @code{total-expiry}
2476 parameter.  Say you have a mail group in two topics; one with
2477 @code{total-expiry} and one without.  What happens when you do @kbd{M-x
2478 gnus-expire-all-expirable-groups}?  Gnus has no way of telling which one
2479 of these topics you mean to expire articles from, so anything may
2480 happen.  In fact, I hereby declare that it is @dfn{undefined} what
2481 happens.  You just have to be careful if you do stuff like that.
2482
2483
2484 @node Misc Group Stuff
2485 @section Misc Group Stuff
2486
2487 @menu
2488 * Scanning New Messages:: Asking Gnus to see whether new messages have arrived.
2489 * Group Information::     Information and help on groups and Gnus.
2490 * File Commands::         Reading and writing the Gnus files.
2491 @end menu
2492
2493 @table @kbd
2494
2495 @item ^
2496 @kindex ^ (Group)
2497 @findex gnus-group-enter-server-mode
2498 Enter the server buffer (@code{gnus-group-enter-server-mode}). @xref{The
2499 Server Buffer}.
2500
2501 @item a
2502 @kindex a (Group)
2503 @findex gnus-group-post-news
2504 Post an article to a group (@code{gnus-group-post-news}).  The current
2505 group name will be used as the default.
2506
2507 @item m
2508 @kindex m (Group)
2509 @findex gnus-group-mail
2510 Mail a message somewhere (@code{gnus-group-mail}).
2511
2512 @end table
2513
2514 Variables for the group buffer:
2515
2516 @table @code
2517
2518 @item gnus-group-mode-hook
2519 @vindex gnus-group-mode-hook
2520 @code{gnus-group-mode-hook} is called after the group buffer has been
2521 created. 
2522
2523 @item gnus-group-prepare-hook
2524 @vindex gnus-group-prepare-hook
2525 @code{gnus-group-prepare-hook} is called after the group buffer is
2526 generated.  It may be used to modify the buffer in some strange,
2527 unnatural way.
2528
2529 @item gnus-permanently-visible-groups
2530 @vindex gnus-permanently-visible-groups
2531 Groups matching this regexp will always be listed in the group buffer,
2532 whether they are empty or not.
2533
2534 @end table
2535
2536
2537 @node Scanning New Messages
2538 @subsection Scanning New Messages
2539 @cindex new messages
2540 @cindex scanning new news
2541
2542 @table @kbd
2543
2544 @item g
2545 @kindex g (Group)
2546 @findex gnus-group-get-new-news
2547 Check the server(s) for new articles.  If the numerical prefix is used,
2548 this command will check only groups of level @var{arg} and lower
2549 (@code{gnus-group-get-new-news}).  If given a non-numerical prefix, this
2550 command will force a total rereading of the active file(s) from the
2551 backend(s).
2552
2553 @item M-g
2554 @kindex M-g (Group)
2555 @findex gnus-group-get-new-news-this-group
2556 @vindex gnus-goto-next-group-when-activating
2557 Check whether new articles have arrived in the current group
2558 (@code{gnus-group-get-new-news-this-group}).  The
2559 @code{gnus-goto-next-group-when-activating} variable controls whether
2560 this command is to move point to the next group or not.  It is @code{t}
2561 by default.
2562
2563 @findex gnus-activate-all-groups
2564 @cindex activating groups
2565 @item C-c M-g
2566 @kindex C-c M-g (Group)
2567 Activate absolutely all groups (@code{gnus-activate-all-groups}). 
2568
2569 @item R
2570 @kindex R (Group)
2571 @cindex restarting
2572 @findex gnus-group-restart
2573 Restart Gnus (@code{gnus-group-restart}).
2574
2575 @end table
2576
2577 @vindex gnus-get-new-news-hook
2578 @code{gnus-get-new-news-hook} is run just before checking for new news. 
2579
2580 @vindex gnus-after-getting-new-news-hook
2581 @code{gnus-after-getting-new-news-hook} is run after checking for new
2582 news.
2583
2584
2585 @node Group Information
2586 @subsection Group Information
2587 @cindex group information
2588 @cindex information on groups
2589
2590 @table @kbd
2591
2592 @item M-f
2593 @kindex M-f (Group)
2594 @findex gnus-group-fetch-faq
2595 @vindex gnus-group-faq-directory
2596 @cindex FAQ
2597 @cindex ange-ftp
2598 Try to fetch the FAQ for the current group
2599 (@code{gnus-group-fetch-faq}).  Gnus will try to get the FAQ from
2600 @code{gnus-group-faq-directory}, which is usually a directory on a
2601 remote machine.  This variable can also be a list of directories.  In
2602 that case, giving a prefix to this command will allow you to choose
2603 between the various sites.  @code{ange-ftp} will be used for fetching
2604 the file.  
2605
2606 If fetching from the first site is unsuccessful, Gnus will attempt to go
2607 through @code{gnus-group-faq-directory} and try to open them one by one.
2608
2609 @item D
2610 @kindex D (Group)
2611 @cindex describing groups
2612 @cindex group description
2613 @findex gnus-group-describe-group
2614 Describe the current group (@code{gnus-group-describe-group}).  If given
2615 a prefix, force Gnus to re-read the description from the server.
2616
2617 @item M-d
2618 @kindex M-d (Group)
2619 @findex gnus-group-describe-all-groups
2620 Describe all groups (@code{gnus-group-describe-all-groups}).  If given a
2621 prefix, force Gnus to re-read the description file from the server.
2622
2623 @item V
2624 @kindex V (Group)
2625 @cindex version
2626 @findex gnus-version
2627 Display current Gnus version numbers (@code{gnus-version}).
2628
2629 @item ?
2630 @kindex ? (Group)
2631 @findex gnus-group-describe-briefly
2632 Give a very short help message (@code{gnus-group-describe-briefly}).
2633
2634 @item C-c C-i
2635 @kindex C-c C-i (Group)
2636 @cindex info
2637 @cindex manual
2638 @findex gnus-info-find-node
2639 Go to the Gnus info node (@code{gnus-info-find-node}).
2640 @end table
2641
2642
2643 @node File Commands
2644 @subsection File Commands
2645 @cindex file commands
2646
2647 @table @kbd
2648
2649 @item r
2650 @kindex r (Group)
2651 @findex gnus-group-read-init-file
2652 @vindex gnus-init-file
2653 @cindex reading init file
2654 Read the init file (@code{gnus-init-file}, which defaults to
2655 @file{~/.gnus}) (@code{gnus-group-read-init-file}).
2656
2657 @item s
2658 @kindex s (Group)
2659 @findex gnus-group-save-newsrc
2660 @cindex saving .newsrc
2661 Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted)
2662 (@code{gnus-group-save-newsrc}).  If given a prefix, force saving the
2663 file(s) whether Gnus thinks it is necessary or not.
2664
2665 @c @item Z
2666 @c @kindex Z (Group)
2667 @c @findex gnus-group-clear-dribble
2668 @c Clear the dribble buffer (@code{gnus-group-clear-dribble}).
2669
2670 @end table
2671
2672
2673 @node The Summary Buffer
2674 @chapter The Summary Buffer
2675 @cindex summary buffer
2676
2677 A line for each article is displayed in the summary buffer.  You can
2678 move around, read articles, post articles and reply to articles.
2679
2680 @menu
2681 * Summary Buffer Format::       Deciding how the summary buffer is to look.
2682 * Summary Maneuvering::         Moving around the summary buffer.
2683 * Choosing Articles::           Reading articles.
2684 * Paging the Article::          Scrolling the current article.
2685 * Reply Followup and Post::     Posting articles.
2686 * Canceling and Superseding::   ``Whoops, I shouldn't have called him that.''
2687 * Marking Articles::            Marking articles as read, expirable, etc.
2688 * Limiting::                    You can limit the summary buffer.
2689 * Threading::                   How threads are made.
2690 * Sorting::                     How articles and threads are sorted.
2691 * Asynchronous Fetching::       Gnus might be able to pre-fetch articles.
2692 * Article Caching::             You may store articles in a cache.
2693 * Persistent Articles::         Making articles expiry-resistant.
2694 * Article Backlog::             Having already read articles hang around.
2695 * Saving Articles::             Ways of customizing article saving.
2696 * Decoding Articles::           Gnus can treat series of (uu)encoded articles.
2697 * Article Treatment::           The article buffer can be mangled at will.
2698 * Summary Sorting::             Sorting the summary buffer in various ways.
2699 * Finding the Parent::          No child support? Get the parent.
2700 * Alternative Approaches::      Reading using non-default summaries.
2701 * Tree Display::                A more visual display of threads.
2702 * Mail Group Commands::         Some commands can only be used in mail groups.
2703 * Various Summary Stuff::       What didn't fit anywhere else.
2704 * Exiting the Summary Buffer::  Returning to the Group buffer.
2705 * Crosspost Handling::          How crossposted articles are dealt with.
2706 * Duplicate Suppression::       An alternative when crosspost handling fails.
2707 @end menu
2708
2709
2710 @node Summary Buffer Format
2711 @section Summary Buffer Format
2712 @cindex summary buffer format
2713
2714 @menu
2715 * Summary Buffer Lines::     You can specify how summary lines should look.
2716 * Summary Buffer Mode Line:: You can say how the mode line should look.
2717 * Summary Highlighting::     Making the summary buffer all pretty and nice.
2718 @end menu
2719
2720 @findex mail-extract-address-components
2721 @findex gnus-extract-address-components
2722 @vindex gnus-extract-address-components
2723 Gnus will use the value of the @code{gnus-extract-address-components}
2724 variable as a function for getting the name and address parts of a
2725 @code{From} header.  Two pre-defined function exist:
2726 @code{gnus-extract-address-components}, which is the default, quite
2727 fast, and too simplistic solution; and
2728 @code{mail-extract-address-components}, which works very nicely, but is
2729 slower.  The default function will return the wrong answer in 5% of the
2730 cases.  If this is unacceptable to you, use the other function instead.
2731
2732 @vindex gnus-summary-same-subject
2733 @code{gnus-summary-same-subject} is a string indicating that the current
2734 article has the same subject as the previous.  This string will be used
2735 with those specs that require it.  The default is @samp{}.
2736
2737
2738 @node Summary Buffer Lines
2739 @subsection Summary Buffer Lines
2740
2741 @vindex gnus-summary-line-format
2742 You can change the format of the lines in the summary buffer by changing
2743 the @code{gnus-summary-line-format} variable.  It works along the same
2744 lines a a normal @code{format} string, with some extensions
2745 (@pxref{Formatting Variables}).
2746
2747 The default string is @samp{%U%R%z%I%(%[%4L: %-20,20n%]%) %s\n}.
2748
2749 The following format specification characters are understood:
2750
2751 @table @samp
2752 @item N 
2753 Article number.
2754 @item S
2755 Subject string.
2756 @item s
2757 Subject if the article is the root or the previous article had a
2758 different subject, @code{gnus-summary-same-subject} otherwise.
2759 (@code{gnus-summary-same-subject} defaults to @samp{}.)
2760 @item F
2761 Full @code{From} header.
2762 @item n
2763 The name (from the @code{From} header).
2764 @item a
2765 The name (from the @code{From} header).  This differs from the @code{n}
2766 spec in that it uses @code{gnus-extract-address-components}, which is
2767 slower, but may be more thorough.
2768 @item A
2769 The address (from the @code{From} header).  This works the same way as
2770 the @code{a} spec.
2771 @item L
2772 Number of lines in the article.
2773 @item c
2774 Number of characters in the article.
2775 @item I
2776 Indentation based on thread level (@pxref{Customizing Threading}).
2777 @item T
2778 Nothing if the article is a root and lots of spaces if it isn't (it
2779 pushes everything after it off the screen).
2780 @item \[
2781 Opening bracket, which is normally @samp{\[}, but can also be @samp{<}
2782 for adopted articles (@pxref{Customizing Threading}).
2783 @item \]
2784 Closing bracket, which is normally @samp{\]}, but can also be @samp{>}
2785 for adopted articles.
2786 @item >
2787 One space for each thread level.
2788 @item <
2789 Twenty minus thread level spaces.
2790 @item U
2791 Unread.
2792 @item R
2793 Replied.
2794 @item i
2795 Score as a number.
2796 @item z
2797 @vindex gnus-summary-zcore-fuzz
2798 Zcore, @samp{+} if above the default level and @samp{-} if below the
2799 default level.  If the difference between
2800 @code{gnus-summary-default-level} and the score is less than
2801 @code{gnus-summary-zcore-fuzz}, this spec will not be used.
2802 @item V
2803 Total thread score.
2804 @item x
2805 @code{Xref}.
2806 @item D
2807 @code{Date}.
2808 @item d
2809 The @code{Date} in @code{YY-MMM} format.
2810 @item o
2811 The @code{Date} in @code{YYYYMMDDTHHMMSS} format.
2812 @item M
2813 @code{Message-ID}.
2814 @item r
2815 @code{References}.
2816 @item t
2817 Number of articles in the current sub-thread.  Using this spec will slow
2818 down summary buffer generation somewhat.
2819 @item e
2820 A single character will be displayed if the article has any children. 
2821 @item P
2822 The line number.
2823 @item u
2824 User defined specifier.  The next character in the format string should
2825 be a letter.  @sc{gnus} will call the function
2826 @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
2827 following @samp{%u}.  The function will be passed the current header as
2828 argument.  The function should return a string, which will be inserted
2829 into the summary just like information from any other summary specifier.
2830 @end table
2831
2832 The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs
2833 have to be handled with care.  For reasons of efficiency, Gnus will
2834 compute what column these characters will end up in, and ``hard-code''
2835 that.  This means that it is illegal to have these specs after a
2836 variable-length spec.  Well, you might not be arrested, but your summary
2837 buffer will look strange, which is bad enough.
2838
2839 The smart choice is to have these specs as far to the left as possible.
2840 (Isn't that the case with everything, though?  But I digress.)
2841
2842 This restriction may disappear in later versions of Gnus.
2843
2844
2845 @node Summary Buffer Mode Line
2846 @subsection Summary Buffer Mode Line
2847
2848 @vindex gnus-summary-mode-line-format
2849 You can also change the format of the summary mode bar.  Set
2850 @code{gnus-summary-mode-line-format} to whatever you like.  Here are the
2851 elements you can play with:
2852
2853 @table @samp
2854 @item G
2855 Group name.
2856 @item p
2857 Unprefixed group name.
2858 @item A
2859 Current article number.
2860 @item V
2861 Gnus version.
2862 @item U
2863 Number of unread articles in this group.
2864 @item e
2865 Number of unselected articles in this group.
2866 @item Z
2867 A string with the number of unread and unselected articles represented
2868 either as @samp{<%U(+%u) more>} if there are both unread and unselected
2869 articles, and just as @samp{<%U more>} if there are just unread articles
2870 and no unselected ones.
2871 @item g
2872 Shortish group name.  For instance, @samp{rec.arts.anime} will be
2873 shortened to @samp{r.a.anime}. 
2874 @item S
2875 Subject of the current article.
2876 @item u
2877 Used-defined spec.
2878 @item s
2879 Name of the current score file.
2880 @item d
2881 Number of dormant articles.
2882 @item t
2883 Number of ticked articles.
2884 @item r
2885 Number of articles that have been marked as read in this session. 
2886 @item E
2887 Number of articles expunged by the score files.
2888 @end table
2889
2890
2891 @node Summary Highlighting
2892 @subsection Summary Highlighting
2893
2894 @table @code
2895
2896 @item gnus-visual-mark-article-hook
2897 @vindex gnus-visual-mark-article-hook
2898 This hook is run after selecting an article.  It is meant to be used for
2899 highlighting the article in some way.  It is not run if
2900 @code{gnus-visual} is @code{nil}.
2901
2902 @item gnus-summary-update-hook
2903 @vindex gnus-summary-update-hook
2904 This hook is called when a summary line is changed.  It is not run if
2905 @code{gnus-visual} is @code{nil}.
2906
2907 @item gnus-summary-selected-face
2908 @vindex gnus-summary-selected-face
2909 This is the face (or @dfn{font} as some people call it) that is used to
2910 highlight the current article in the summary buffer.
2911
2912 @item gnus-summary-highlight
2913 @vindex gnus-summary-highlight
2914 Summary lines are highlighted according to this variable, which is a
2915 list where the elements are on the format @code{(FORM . FACE)}.  If you
2916 would, for instance, like ticked articles to be italic and high-scored
2917 articles to be bold, you could set this variable to something like
2918 @lisp
2919 (((eq mark gnus-ticked-mark) . italic)
2920  ((> score default) . bold))
2921 @end lisp
2922 As you may have guessed, if @var{FORM} returns a non-@code{nil} value,
2923 @var{FACE} will be applied to the line.
2924 @end table
2925
2926
2927 @node Summary Maneuvering
2928 @section Summary Maneuvering
2929 @cindex summary movement
2930
2931 All the straight movement commands understand the numeric prefix and
2932 behave pretty much as you'd expect. 
2933
2934 None of these commands select articles.
2935
2936 @table @kbd
2937 @item G M-n
2938 @itemx M-n
2939 @kindex M-n (Summary)
2940 @kindex G M-n (Summary)
2941 @findex gnus-summary-next-unread-subject
2942 Go to the next summary line of an unread article
2943 (@code{gnus-summary-next-unread-subject}). 
2944
2945 @item G M-p
2946 @itemx M-p
2947 @kindex M-p (Summary)
2948 @kindex G M-p (Summary)
2949 @findex gnus-summary-prev-unread-subject
2950 Go to the previous summary line of an unread article
2951 (@code{gnus-summary-prev-unread-subject}). 
2952
2953 @item G j
2954 @itemx j
2955 @kindex j (Summary)
2956 @kindex G j (Summary)
2957 @findex gnus-summary-goto-article
2958 Ask for an article number and then go that article
2959 (@code{gnus-summary-goto-article}). 
2960
2961 @item G g
2962 @kindex G g (Summary)
2963 @findex gnus-summary-goto-subject
2964 Ask for an article number and then go the summary line of that article
2965 (@code{gnus-summary-goto-subject}).
2966 @end table
2967
2968 If Gnus asks you to press a key to confirm going to the next group, you
2969 can use the @kbd{C-n} and @kbd{C-p} keys to move around the group
2970 buffer, searching for the next group to read without actually returning
2971 to the group buffer.
2972
2973 Variables related to summary movement:
2974
2975 @table @code
2976
2977 @vindex gnus-auto-select-next
2978 @item gnus-auto-select-next
2979 If you are at the end of the group and issue one of the movement
2980 commands, Gnus will offer to go to the next group.  If this variable is
2981 @code{t} and the next group is empty, Gnus will exit summary mode and
2982 return to the group buffer.  If this variable is neither @code{t} nor
2983 @code{nil}, Gnus will select the next group, no matter whether it has
2984 any unread articles or not.  As a special case, if this variable is
2985 @code{quietly}, Gnus will select the next group without asking for
2986 confirmation.  If this variable is @code{almost-quietly}, the same will
2987 happen only if you are located on the last article in the group.
2988 Finally, if this variable is @code{slightly-quietly}, the @kbd{Z n}
2989 command will go to the next group without confirmation.  Also
2990 @pxref{Group Levels}.
2991
2992 @item gnus-auto-select-same
2993 @vindex gnus-auto-select-same
2994 If non-@code{nil}, all the movement commands will try to go to the next
2995 article with the same subject as the current.  (@dfn{Same} here might
2996 mean @dfn{roughly equal}.  See @code{gnus-summary-gather-subject-limit}
2997 for details (@pxref{Customizing Threading}).)  This variable is not
2998 particularly useful if you use a threaded display.
2999
3000 @item gnus-summary-check-current
3001 @vindex gnus-summary-check-current
3002 If non-@code{nil}, all the ``unread'' movement commands will not proceed
3003 to the next (or previous) article if the current article is unread.
3004 Instead, they will choose the current article.
3005
3006 @item gnus-auto-center-summary
3007 @vindex gnus-auto-center-summary
3008 If non-@code{nil}, Gnus will keep the point in the summary buffer
3009 centered at all times.  This makes things quite tidy, but if you have a
3010 slow network connection, or simply do not like this un-Emacsism, you can
3011 set this variable to @code{nil} to get the normal Emacs scrolling
3012 action.  This will also inhibit horizontal re-centering of the summary
3013 buffer, which might make it more inconvenient to read extremely long
3014 threads.
3015
3016 @end table
3017
3018
3019 @node Choosing Articles
3020 @section Choosing Articles
3021 @cindex selecting articles
3022
3023 None of the following movement commands understand the numeric prefix,
3024 and they all select and display an article.
3025
3026 @table @kbd
3027 @item SPACE
3028 @kindex SPACE (Summary)
3029 @findex gnus-summary-next-page
3030 Select the current article, or, if that one's read already, the next
3031 unread article (@code{gnus-summary-next-page}).
3032
3033 @item G n
3034 @itemx n
3035 @kindex n (Summary)
3036 @kindex G n (Summary)
3037 @findex gnus-summary-next-unread-article
3038 Go to next unread article (@code{gnus-summary-next-unread-article}).
3039
3040 @item G p
3041 @itemx p
3042 @kindex p (Summary)
3043 @findex gnus-summary-prev-unread-article
3044 Go to previous unread article (@code{gnus-summary-prev-unread-article}).
3045
3046 @item G N
3047 @itemx N
3048 @kindex N (Summary)
3049 @kindex G N (Summary)
3050 @findex gnus-summary-next-article
3051 Go to the next article (@code{gnus-summary-next-article}).
3052
3053 @item G P
3054 @itemx P
3055 @kindex P (Summary)
3056 @kindex G P (Summary)
3057 @findex gnus-summary-prev-article
3058 Go to the previous article (@code{gnus-summary-prev-article}).
3059
3060 @item G C-n
3061 @kindex G C-n (Summary)
3062 @findex gnus-summary-next-same-subject
3063 Go to the next article with the same subject
3064 (@code{gnus-summary-next-same-subject}). 
3065
3066 @item G C-p
3067 @kindex G C-p (Summary)
3068 @findex gnus-summary-prev-same-subject
3069 Go to the previous article with the same subject
3070 (@code{gnus-summary-prev-same-subject}). 
3071
3072 @item G f
3073 @itemx .
3074 @kindex G f  (Summary)
3075 @kindex .  (Summary)
3076 @findex gnus-summary-first-unread-article
3077 Go to the first unread article
3078 (@code{gnus-summary-first-unread-article}).
3079
3080 @item G b
3081 @itemx ,
3082 @kindex G b (Summary)
3083 @kindex , (Summary)
3084 @findex gnus-summary-best-unread-article
3085 Go to the article with the highest score
3086 (@code{gnus-summary-best-unread-article}). 
3087
3088 @item G l
3089 @itemx l
3090 @kindex l (Summary)
3091 @kindex G l (Summary)
3092 @findex gnus-summary-goto-last-article
3093 Go to the previous article read (@code{gnus-summary-goto-last-article}).
3094
3095 @item G p
3096 @kindex G p (Summary)
3097 @findex gnus-summary-pop-article
3098 Pop an article off the summary history and go to this article
3099 (@code{gnus-summary-pop-article}).  This command differs from the
3100 command above in that you can pop as many previous articles off the
3101 history as you like.
3102 @end table
3103
3104 Some variables that are relevant for moving and selecting articles:
3105
3106 @table @code
3107 @item gnus-auto-extend-newsgroup
3108 @vindex gnus-auto-extend-newsgroup
3109 All the movement commands will try to go to the previous (or next)
3110 article, even if that article isn't displayed in the Summary buffer if
3111 this variable is non-@code{nil}.  Gnus will then fetch the article from
3112 the server and display it in the article buffer.
3113
3114 @item gnus-select-article-hook
3115 @vindex gnus-select-article-hook
3116 This hook is called whenever an article is selected.  By default it
3117 exposes any threads hidden under the selected article.
3118
3119 @item gnus-mark-article-hook
3120 @vindex gnus-mark-article-hook
3121 @findex gnus-summary-mark-unread-as-read
3122 @findex gnus-summary-mark-read-and-unread-as-read
3123 @findex gnus-unread-mark
3124 This hook is called whenever an article is selected.  It is intended to
3125 be used for marking articles as read.  The default value is
3126 @code{gnus-summary-mark-read-and-unread-as-read}, and will change the
3127 mark of almost any article you read to @code{gnus-unread-mark}.  The
3128 only articles not affected by this function are ticked, dormant, and
3129 expirable articles.  If you'd instead like to just have unread articles
3130 marked as read, you can use @code{gnus-summary-mark-unread-as-read}
3131 instead.  It will leave marks like @code{gnus-low-score-mark},
3132 @code{gnus-del-mark} (and so on) alone.
3133
3134 @end table
3135
3136
3137 @node Paging the Article
3138 @section Scrolling the Article
3139 @cindex article scrolling
3140
3141 @table @kbd
3142
3143 @item SPACE
3144 @kindex SPACE (Summary)
3145 @findex gnus-summary-next-page
3146 Pressing @kbd{SPACE} will scroll the current article forward one page,
3147 or, if you have come to the end of the current article, will choose the
3148 next article (@code{gnus-summary-next-page}).
3149
3150 @item DEL
3151 @kindex DEL (Summary)
3152 @findex gnus-summary-prev-page
3153 Scroll the current article back one page (@code{gnus-summary-prev-page}). 
3154
3155 @item RET
3156 @kindex RET (Summary)
3157 @findex gnus-summary-scroll-up
3158 Scroll the current article one line forward
3159 (@code{gnus-summary-scroll-up}).
3160
3161 @item A g
3162 @itemx g
3163 @kindex A g (Summary)
3164 @kindex g (Summary)
3165 @findex gnus-summary-show-article
3166 (Re)fetch the current article (@code{gnus-summary-show-article}).  If
3167 given a prefix, fetch the current article, but don't run any of the
3168 article treatment functions.  This will give you a ``raw'' article, just
3169 the way it came from the server.
3170
3171 @item A <
3172 @itemx <
3173 @kindex < (Summary)
3174 @kindex A < (Summary)
3175 @findex gnus-summary-beginning-of-article
3176 Scroll to the beginning of the article
3177 (@code{gnus-summary-beginning-of-article}).
3178
3179 @item A >
3180 @itemx >
3181 @kindex > (Summary)
3182 @kindex A > (Summary)
3183 @findex gnus-summary-end-of-article
3184 Scroll to the end of the article (@code{gnus-summary-end-of-article}).
3185
3186 @item A s 
3187 @kindex A s (Summary)
3188 @findex gnus-summary-isearch-article
3189 Perform an isearch in the article buffer
3190 (@code{gnus-summary-isearch-article}). 
3191
3192 @end table
3193
3194
3195 @node Reply Followup and Post
3196 @section Reply, Followup and Post
3197
3198 @menu
3199 * Summary Mail Commands::            Sending mail.
3200 * Summary Post Commands::            Sending news.
3201 @end menu
3202
3203
3204 @node Summary Mail Commands
3205 @subsection Summary Mail Commands
3206 @cindex mail
3207 @cindex composing mail
3208
3209 Commands for composing a mail message:
3210
3211 @table @kbd
3212
3213 @item S r
3214 @itemx r
3215 @kindex S r (Summary)
3216 @kindex r (Summary)
3217 @findex gnus-summary-reply
3218 Mail a reply to the author of the current article
3219 (@code{gnus-summary-reply}). 
3220
3221 @item S R
3222 @itemx R
3223 @kindex R (Summary)
3224 @kindex S R (Summary)
3225 @findex gnus-summary-reply-with-original
3226 Mail a reply to the author of the current article and include the
3227 original message (@code{gnus-summary-reply-with-original}).  This
3228 command uses the process/prefix convention.
3229
3230 @item S o m
3231 @kindex S o m (Summary)
3232 @findex gnus-summary-mail-forward
3233 Forward the current article to some other person
3234 (@code{gnus-summary-mail-forward}). 
3235
3236 @item S o p
3237 @kindex S o p (Summary)
3238 @findex gnus-summary-post-forward
3239 Forward the current article to a newsgroup
3240 (@code{gnus-summary-post-forward}).
3241
3242 @item S m
3243 @itemx m
3244 @kindex m (Summary)
3245 @kindex S m (Summary)
3246 @findex gnus-summary-mail-other-window
3247 Send a mail to some other person
3248 (@code{gnus-summary-mail-other-window}).
3249
3250 @item S D b
3251 @kindex S D b (Summary)
3252 @findex gnus-summary-resend-bounced-mail
3253 @cindex bouncing mail
3254 If you have sent a mail, but the mail was bounced back to you for some
3255 reason (wrong address, transient failure), you can use this command to
3256 resend that bounced mail (@code{gnus-summary-resend-bounced-mail}).  You
3257 will be popped into a mail buffer where you can edit the headers before
3258 sending the mail off again.  If you give a prefix to this command, and
3259 the bounced mail is a reply to some other mail, Gnus will try to fetch
3260 that mail and display it for easy perusal of its headers.  This might
3261 very well fail, though.
3262
3263 @item S D r
3264 @kindex S D r (Summary)
3265 @findex gnus-summary-resend-message
3266 Not to be confused with the previous command,
3267 @code{gnus-summary-resend-message} will prompt you for an address to
3268 send the current message off to, and then send it to that place.  The
3269 headers of the message won't be altered---but lots of headers that say
3270 @code{Resent-To}, @code{Resent-From} and so on will be added.  This
3271 means that you actually send a mail to someone that has a @code{To}
3272 header that (probably) points to yourself.  This will confuse people.
3273 So, natcherly you'll only do that if you're really eVIl.  
3274
3275 This command is mainly used if you have several accounts and want to
3276 ship a mail to a different account of yours.  (If you're both
3277 @code{root} and @code{postmaster} and get a mail for @code{postmaster}
3278 to the @code{root} account, you may want to resend it to
3279 @code{postmaster}.  Ordnung muss sein!
3280
3281 @item S O m
3282 @kindex S O m (Summary)
3283 @findex gnus-uu-digest-mail-forward
3284 Digest the current series and forward the result using mail
3285 (@code{gnus-uu-digest-mail-forward}).  This command uses the
3286 process/prefix convention (@pxref{Process/Prefix}). 
3287
3288 @item S O p
3289 @kindex S O p (Summary)
3290 @findex gnus-uu-digest-post-forward
3291 Digest the current series and forward the result to a newsgroup
3292 (@code{gnus-uu-digest-mail-forward}).  
3293
3294 @item S M-c
3295 @kindex S M-c (Summary)
3296 @findex gnus-summary-mail-crosspost-complaint
3297 @cindex crossposting
3298 @cindex excessive crossposting
3299 Send a complaint about excessive crossposting to the author of the
3300 current article (@code{gnus-summary-mail-crosspost-complaint}).  
3301
3302 @findex gnus-crosspost-complaint
3303 This command is provided as a way to fight back agains the current
3304 crossposting pandemic that's sweeping Usenet.  It will compose a reply
3305 using the @code{gnus-crosspost-complaint} variable as a preamble.  This
3306 command understands the process/prefix convention
3307 (@pxref{Process/Prefix}) and will prompt you before sending each mail.
3308
3309 @end table
3310
3311
3312 @node Summary Post Commands
3313 @subsection Summary Post Commands
3314 @cindex post
3315 @cindex composing news
3316
3317 Commands for posting an article:
3318
3319 @table @kbd
3320 @item S p
3321 @itemx a
3322 @kindex a (Summary)
3323 @kindex S p (Summary)
3324 @findex gnus-summary-post-news
3325 Post an article to the current group
3326 (@code{gnus-summary-post-news}).
3327
3328 @item S f
3329 @itemx f
3330 @kindex f (Summary)
3331 @kindex S f (Summary)
3332 @findex gnus-summary-followup
3333 Post a followup to the current article (@code{gnus-summary-followup}).
3334
3335 @item S F
3336 @itemx F
3337 @kindex S F (Summary)
3338 @kindex F (Summary)
3339 @findex gnus-summary-followup-with-original
3340 Post a followup to the current article and include the original message
3341 (@code{gnus-summary-followup-with-original}).   This command uses the
3342 process/prefix convention.
3343
3344 @item S u
3345 @kindex S u (Summary)
3346 @findex gnus-uu-post-news
3347 Uuencode a file, split it into parts, and post it as a series
3348 (@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}). 
3349 @end table
3350
3351
3352 @node Canceling and Superseding
3353 @section Canceling Articles
3354 @cindex canceling articles
3355 @cindex superseding articles
3356
3357 Have you ever written something, and then decided that you really,
3358 really, really wish you hadn't posted that?
3359
3360 Well, you can't cancel mail, but you can cancel posts.
3361
3362 @findex gnus-summary-cancel-article
3363 @kindex C (Summary)
3364 Find the article you wish to cancel (you can only cancel your own
3365 articles, so don't try any funny stuff).  Then press @kbd{C} or @kbd{S
3366 c} (@code{gnus-summary-cancel-article}).  Your article will be
3367 canceled---machines all over the world will be deleting your article. 
3368
3369 Be aware, however, that not all sites honor cancels, so your article may
3370 live on here and there, while most sites will delete the article in
3371 question.
3372
3373 If you discover that you have made some mistakes and want to do some
3374 corrections, you can post a @dfn{superseding} article that will replace
3375 your original article.
3376
3377 @findex gnus-summary-supersede-article
3378 @kindex S (Summary)
3379 Go to the original article and press @kbd{S s}
3380 (@code{gnus-summary-supersede-article}).  You will be put in a buffer
3381 where you can edit the article all you want before sending it off the
3382 usual way.
3383
3384 The same goes for superseding as for canceling, only more so: Some
3385 sites do not honor superseding.  On those sites, it will appear that you
3386 have posted almost the same article twice.
3387
3388 If you have just posted the article, and change your mind right away,
3389 there is a trick you can use to cancel/supersede the article without
3390 waiting for the article to appear on your site first.  You simply return
3391 to the post buffer (which is called @code{*post-buf*}).  There you will
3392 find the article you just posted, with all the headers intact.  Change
3393 the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes}
3394 header by substituting one of those words for @code{Message-ID}.  Then
3395 just press @kbd{C-c C-c} to send the article as you would do normally.
3396 The previous article will be canceled/superseded.
3397
3398 Just remember, kids: There is no 'c' in 'supersede'.
3399
3400
3401 @node Marking Articles
3402 @section Marking Articles
3403 @cindex article marking
3404 @cindex article ticking
3405 @cindex marks
3406
3407 There are several marks you can set on an article. 
3408
3409 You have marks that decide the @dfn{readedness} (whoo, neato-keano
3410 neologism ohoy!) of the article.  Alphabetic marks generally mean
3411 @dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.
3412
3413 In addition, you also have marks that do not affect readedness.
3414
3415 @menu
3416 * Unread Articles::      Marks for unread articles.
3417 * Read Articles::        Marks for read articles.
3418 * Other Marks::          Marks that do not affect readedness.
3419 @end menu
3420
3421 @ifinfo
3422 There's a plethora of commands for manipulating these marks:
3423 @end ifinfo
3424
3425 @menu
3426 * Setting Marks::           How to set and remove marks.
3427 * Setting Process Marks::   How to mark articles for later processing.
3428 @end menu
3429
3430
3431 @node Unread Articles
3432 @subsection Unread Articles
3433
3434 The following marks mark articles as unread, in one form or other.
3435
3436 @vindex gnus-dormant-mark
3437 @vindex gnus-ticked-mark
3438 @table @samp
3439 @item !
3440 @dfn{Ticked articles} are articles that will remain visible always.  If
3441 you see an article that you find interesting, or you want to put off
3442 reading it, or replying to it, until sometime later, you'd typically
3443 tick it.  However, articles can be expired, so if you want to keep an
3444 article forever, you'll have to save it.  Ticked articles have a
3445 @samp{!} (@code{gnus-ticked-mark}) in the first column.
3446
3447 @item ?
3448 @vindex gnus-dormant-mark
3449 A @dfn{dormant} article is marked with a @samp{?}
3450 (@code{gnus-dormant-mark}), and will only appear in the summary buffer
3451 if there are followups to it.
3452
3453 @item SPACE
3454 @vindex gnus-unread-mark
3455 An @dfn{unread} article is marked with a @samp{SPACE}
3456 (@code{gnus-unread-mark}).  These are articles that haven't been read at
3457 all yet.
3458 @end table
3459
3460
3461 @node Read Articles
3462 @subsection Read Articles
3463 @cindex expirable mark
3464
3465 All the following marks mark articles as read.
3466
3467 @table @samp
3468
3469 @item r
3470 @vindex gnus-del-mark
3471 Articles that are marked as read.  They have a @samp{r}
3472 (@code{gnus-del-mark}) in the first column.  These are articles that the
3473 user has marked as read more or less manually.
3474
3475 @item R
3476 @vindex gnus-read-mark
3477 Articles that are actually read are marked with @samp{R}
3478 (@code{gnus-read-mark}). 
3479
3480 @item O
3481 @vindex gnus-ancient-mark
3482 Articles that were marked as read in previous sessions are now
3483 @dfn{old} and marked with @samp{O} (@code{gnus-ancient-mark}). 
3484
3485 @item K
3486 @vindex gnus-killed-mark
3487 Marked as killed (@code{gnus-killed-mark}).
3488
3489 @item X
3490 @vindex gnus-kill-file-mark
3491 Marked as killed by kill files (@code{gnus-kill-file-mark}).
3492
3493 @item Y
3494 @vindex gnus-low-score-mark
3495 Marked as read by having a too low score (@code{gnus-low-score-mark}).
3496
3497 @item C
3498 @vindex gnus-catchup-mark
3499 Marked as read by a catchup (@code{gnus-catchup-mark}).
3500
3501 @item G
3502 @vindex gnus-canceled-mark
3503 Canceled article (@code{gnus-canceled-mark})
3504
3505 @item F
3506 @vindex gnus-souped-mark
3507 @sc{SOUP}ed article (@code{gnus-souped-mark}).  @xref{SOUP}
3508
3509 @item Q
3510 @vindex gnus-sparse-mark
3511 Sparsely reffed article (@code{gnus-sparse-mark}).  @xref{Customizing
3512 Threading} 
3513
3514 @item M
3515 @vindex gnus-duplicate-mark
3516 Article marked as read by duplicate suppression
3517 (@code{gnus-duplicated-mark}).  @xref{Duplicate Suppression}
3518
3519 @end table
3520
3521 All these marks just mean that the article is marked as read, really.
3522 They are interpreted differently by the adaptive scoring scheme,
3523 however.
3524
3525 One more special mark, though:
3526
3527 @table @samp
3528 @item E
3529 @vindex gnus-expirable-mark
3530 You can also mark articles as @dfn{expirable} (or have them marked as
3531 such automatically).  That doesn't make much sense in normal groups,
3532 because a user does not control the expiring of news articles, but in
3533 mail groups, for instance, articles that are marked as @dfn{expirable}
3534 can be deleted by Gnus at any time.  Expirable articles are marked with
3535 @samp{E} (@code{gnus-expirable-mark}).
3536 @end table
3537
3538
3539 @node Other Marks
3540 @subsection Other Marks
3541 @cindex process mark
3542 @cindex bookmarks
3543
3544 There are some marks that have nothing to do with whether the article is
3545 read or not.
3546
3547 @itemize @bullet
3548
3549 @item 
3550 You can set a bookmark in the current article.  Say you are reading a
3551 long thesis on cats' urinary tracts, and have to go home for dinner
3552 before you've finished reading the thesis.  You can then set a bookmark
3553 in the article, and Gnus will jump to this bookmark the next time it
3554 encounters the article.
3555
3556 @item
3557 @vindex gnus-replied-mark
3558 All articles that you have replied to or made a followup to (i.e., have
3559 answered) will be marked with an @samp{A} in the second column
3560 (@code{gnus-replied-mark}).
3561
3562 @item 
3563 @vindex gnus-cached-mark
3564 Articles that are stored in the article cache will be marked with an
3565 @samp{*} in the second column (@code{gnus-cached-mark}).
3566
3567 @item 
3568 @vindex gnus-saved-mark
3569 Articles that are ``saved'' (in some manner or other; not necessarily
3570 religiously) are marked with an @samp{S} in the second column
3571 (@code{gnus-saved-mark}.
3572
3573 @item 
3574 @vindex gnus-not-empty-thread-mark
3575 @vindex gnus-empty-thread-mark
3576 It the @samp{%e} spec is used, the presence of threads or not will be
3577 marked with @code{gnus-not-empty-thread-mark} and
3578 @code{gnus-empty-thread-mark} in the third column, respectively.
3579
3580 @item 
3581 @vindex gnus-process-mark
3582 Finally we have the @dfn{process mark} (@code{gnus-process-mark}.  A
3583 variety of commands react to the presence of the process mark.  For
3584 instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view
3585 all articles that have been marked with the process mark.  Articles
3586 marked with the process mark have a @samp{#} in the second column.
3587
3588 @end itemize
3589
3590 You might have noticed that most of these ``non-readedness'' marks
3591 appear in the second column by default.  So if you have a cached, saved,
3592 replied article that you have process-marked, what will that look like?
3593
3594 Nothing much.  The precedence rules go as follows: process -> cache ->
3595 replied -> saved.  So if the article is in the cache and is replied,
3596 you'll only see the cache mark and not the replied mark.
3597
3598
3599 @node Setting Marks
3600 @subsection Setting Marks
3601 @cindex setting marks
3602
3603 All the marking commands understand the numeric prefix.
3604
3605 @table @kbd
3606 @item M t
3607 @itemx !
3608 @kindex ! (Summary)
3609 @kindex M t (Summary)
3610 @findex gnus-summary-tick-article-forward
3611 Tick the current article (@code{gnus-summary-tick-article-forward}).
3612
3613 @item M ?
3614 @itemx ?
3615 @kindex ? (Summary)
3616 @kindex M ? (Summary)
3617 @findex gnus-summary-mark-as-dormant
3618 Mark the current article as dormant
3619 (@code{gnus-summary-mark-as-dormant}).
3620
3621 @item M d
3622 @itemx d
3623 @kindex M d (Summary)
3624 @kindex d (Summary)
3625 @findex gnus-summary-mark-as-read-forward
3626 Mark the current article as read
3627 (@code{gnus-summary-mark-as-read-forward}).
3628
3629 @item D
3630 @kindex D (Summary)
3631 @findex gnus-summary-mark-as-read-backward
3632 Mark the current article as read and move point to the previous line
3633 (@code{gnus-summary-mark-as-read-backward}).
3634
3635 @item M k
3636 @itemx k
3637 @kindex k (Summary)
3638 @kindex M k (Summary)
3639 @findex gnus-summary-kill-same-subject-and-select
3640 Mark all articles that have the same subject as the current one as read,
3641 and then select the next unread article
3642 (@code{gnus-summary-kill-same-subject-and-select}).
3643
3644 @item M K
3645 @itemx C-k
3646 @kindex M K (Summary)
3647 @kindex C-k (Summary)
3648 @findex gnus-summary-kill-same-subject
3649 Mark all articles that have the same subject as the current one as read
3650 (@code{gnus-summary-kill-same-subject}).  
3651
3652 @item M C
3653 @kindex M C (Summary)
3654 @findex gnus-summary-catchup
3655 Mark all unread articles in the group as read
3656 (@code{gnus-summary-catchup}).
3657
3658 @item M C-c
3659 @kindex M C-c (Summary)
3660 @findex gnus-summary-catchup-all
3661 Mark all articles in the group as read---even the ticked and dormant
3662 articles (@code{gnus-summary-catchup-all}).
3663
3664 @item M H
3665 @kindex M H (Summary)
3666 @findex gnus-summary-catchup-to-here
3667 Catchup the current group to point
3668 (@code{gnus-summary-catchup-to-here}). 
3669
3670 @item C-w
3671 @kindex C-w (Summary)
3672 @findex gnus-summary-mark-region-as-read
3673 Mark all articles between point and mark as read
3674 (@code{gnus-summary-mark-region-as-read}). 
3675
3676 @item M V k
3677 @kindex M V k (Summary)
3678 @findex gnus-summary-kill-below
3679 Kill all articles with scores below the default score (or below the
3680 numeric prefix) (@code{gnus-summary-kill-below}).
3681
3682 @item M c
3683 @itemx M-u
3684 @kindex M c (Summary)
3685 @kindex M-u (Summary)
3686 @findex gnus-summary-clear-mark-forward
3687 Clear all readedness-marks from the current article
3688 (@code{gnus-summary-clear-mark-forward}).
3689
3690 @item M e
3691 @itemx E
3692 @kindex M e (Summary)
3693 @kindex E (Summary)
3694 @findex gnus-summary-mark-as-expirable
3695 Mark the current article as expirable
3696 (@code{gnus-summary-mark-as-expirable}).
3697
3698 @item M b
3699 @kindex M b (Summary)
3700 @findex gnus-summary-set-bookmark
3701 Set a bookmark in the current article
3702 (@code{gnus-summary-set-bookmark}).
3703
3704 @item M B
3705 @kindex M B (Summary)
3706 @findex gnus-summary-remove-bookmark
3707 Remove the bookmark from the current article
3708 (@code{gnus-summary-remove-bookmark}).
3709
3710 @item M V c
3711 @kindex M V c (Summary)
3712 @findex gnus-summary-clear-above
3713 Clear all marks from articles with scores over the default score (or
3714 over the numeric prefix) (@code{gnus-summary-clear-above}).
3715
3716 @item M V u
3717 @kindex M V u (Summary)
3718 @findex gnus-summary-tick-above
3719 Tick all articles with scores over the default score (or over the
3720 numeric prefix) (@code{gnus-summary-tick-above}).
3721
3722 @item M V m
3723 @kindex M V m (Summary)
3724 @findex gnus-summary-mark-above
3725 Prompt for a mark, and mark all articles with scores over the default
3726 score (or over the numeric prefix) with this mark
3727 (@code{gnus-summary-clear-above}).
3728 @end table
3729
3730 @vindex gnus-summary-goto-unread
3731 The @code{gnus-summary-goto-unread} variable controls what action should
3732 be taken after setting a mark.  If non-@code{nil}, point will move to
3733 the next/previous unread article.  If @code{nil}, point will just move
3734 one line up or down.  As a special case, if this variable is
3735 @code{never}, all the marking commands as well as other commands (like
3736 @kbd{SPACE}) will move to the next article, whether it is unread or not.
3737 The default is @code{t}.
3738
3739
3740 @node Setting Process Marks
3741 @subsection Setting Process Marks
3742 @cindex setting process marks
3743
3744 @table @kbd
3745
3746 @item M P p
3747 @itemx #
3748 @kindex # (Summary)
3749 @kindex M P p (Summary)
3750 @findex gnus-summary-mark-as-processable
3751 Mark the current article with the process mark
3752 (@code{gnus-summary-mark-as-processable}). 
3753 @findex gnus-summary-unmark-as-processable
3754
3755 @item M P u 
3756 @itemx M-#
3757 @kindex M P u (Summary)
3758 @kindex M-# (Summary)
3759 Remove the process mark, if any, from the current article
3760 (@code{gnus-summary-unmark-as-processable}).
3761
3762 @item M P U
3763 @kindex M P U (Summary)
3764 @findex gnus-summary-unmark-all-processable
3765 Remove the process mark from all articles
3766 (@code{gnus-summary-unmark-all-processable}). 
3767
3768 @item M P R
3769 @kindex M P R (Summary)
3770 @findex gnus-uu-mark-by-regexp
3771 Mark articles by a regular expression (@code{gnus-uu-mark-by-regexp}). 
3772
3773 @item M P r
3774 @kindex M P r (Summary)
3775 @findex gnus-uu-mark-region
3776 Mark articles in region (@code{gnus-uu-mark-region}).
3777
3778 @item M P t
3779 @kindex M P t (Summary)
3780 @findex gnus-uu-mark-thread
3781 Mark all articles in the current (sub)thread
3782 (@code{gnus-uu-mark-thread}).
3783
3784 @item M P T
3785 @kindex M P T (Summary)
3786 @findex gnus-uu-unmark-thread
3787 Unmark all articles in the current (sub)thread
3788 (@code{gnus-uu-unmark-thread}).
3789
3790 @item M P v
3791 @kindex M P v (Summary)
3792 @findex gnus-uu-mark-over
3793 Mark all articles that have a score above the prefix argument
3794 (@code{gnus-uu-mark-over}).
3795
3796 @item M P s
3797 @kindex M P s (Summary)
3798 @findex gnus-uu-mark-series
3799 Mark all articles in the current series (@code{gnus-uu-mark-series}).
3800
3801 @item M P S
3802 @kindex M P S (Summary)
3803 @findex gnus-uu-mark-sparse
3804 Mark all series that have already had some articles marked
3805 (@code{gnus-uu-mark-sparse}).
3806
3807 @item M P a
3808 @kindex M P a (Summary)
3809 @findex gnus-uu-mark-all
3810 Mark all articles in series order (@code{gnus-uu-mark-series}).
3811
3812 @item M P b
3813 @kindex M P b (Summary)
3814 @findex gnus-uu-mark-buffer
3815 Mark all articles in the buffer in the order they appear
3816 (@code{gnus-uu-mark-buffer}). 
3817
3818 @item M P k
3819 @kindex M P k (Summary)
3820 @findex gnus-summary-kill-process-mark
3821 Push the current process mark set onto the stack and unmark all articles
3822 (@code{gnus-summary-kill-process-mark}).
3823
3824 @item M P y
3825 @kindex M P y (Summary)
3826 @findex gnus-summary-yank-process-mark
3827 Pop the previous process mark set from the stack and restore it
3828 (@code{gnus-summary-yank-process-mark}).
3829
3830 @item M P w
3831 @kindex M P w (Summary)
3832 @findex gnus-summary-save-process-mark
3833 Push the current process mark set onto the stack
3834 (@code{gnus-summary-save-process-mark}).
3835
3836 @end table
3837
3838
3839 @node Limiting
3840 @section Limiting
3841 @cindex limiting
3842
3843 It can be convenient to limit the summary buffer to just show some
3844 subset of the articles currently in the group.  The effect most limit
3845 commands have is to remove a few (or many) articles from the summary
3846 buffer. 
3847
3848 @table @kbd
3849
3850 @item / /
3851 @itemx / s
3852 @kindex / / (Summary)
3853 @findex gnus-summary-limit-to-subject
3854 Limit the summary buffer to articles that match some subject
3855 (@code{gnus-summary-limit-to-subject}). 
3856
3857 @item / a
3858 @kindex / a (Summary)
3859 @findex gnus-summary-limit-to-author
3860 Limit the summary buffer to articles that match some author
3861 (@code{gnus-summary-limit-to-author}).
3862
3863 @item / u
3864 @itemx x
3865 @kindex / u (Summary)
3866 @kindex x (Summary)
3867 @findex gnus-summary-limit-to-unread
3868 Limit the summary buffer to articles that are not marked as read
3869 (@code{gnus-summary-limit-to-unread}).  If given a prefix, limit the
3870 buffer to articles that are strictly unread.  This means that ticked and
3871 dormant articles will also be excluded.
3872
3873 @item / m
3874 @kindex / m (Summary)
3875 @findex gnus-summary-limit-to-marks
3876 Ask for a mark and then limit to all articles that have not been marked
3877 with that mark (@code{gnus-summary-limit-to-marks}).
3878
3879 @item / n
3880 @kindex / n (Summary)
3881 @findex gnus-summary-limit-to-articles
3882 Limit the summary buffer to the current article
3883 (@code{gnus-summary-limit-to-articles}).  Uses the process/prefix
3884 convention (@pxref{Process/Prefix}).
3885
3886 @item / w
3887 @kindex / w (Summary)
3888 @findex gnus-summary-pop-limit
3889 Pop the previous limit off the stack and restore it
3890 (@code{gnus-summary-pop-limit}).  If given a prefix, pop all limits off
3891 the stack.
3892
3893 @item / v
3894 @kindex / v (Summary)
3895 @findex gnus-summary-limit-to-score
3896 Limit the summary buffer to articles that have a score at or above some
3897 score (@code{gnus-summary-limit-to-score}).
3898
3899 @item / E
3900 @itemx M S
3901 @kindex M S (Summary)
3902 @kindex / E (Summary)
3903 @findex gnus-summary-limit-include-expunged
3904 Display all expunged articles
3905 (@code{gnus-summary-limit-include-expunged}). 
3906
3907 @item / D
3908 @kindex / D (Summary)
3909 @findex gnus-summary-limit-include-dormant
3910 Display all dormant articles (@code{gnus-summary-limit-include-dormant}).
3911
3912 @item / d
3913 @kindex / d (Summary)
3914 @findex gnus-summary-limit-exclude-dormant
3915 Hide all dormant articles (@code{gnus-summary-limit-exclude-dormant}).
3916
3917 @item / c
3918 @kindex / c (Summary)
3919 @findex gnus-summary-limit-exclude-childless-dormant
3920 Hide all dormant articles that have no children
3921 (@code{gnus-summary-limit-exclude-childless-dormant}). 
3922
3923 @item / C
3924 @kindex / C (Summary)
3925 @findex gnus-summary-limit-mark-excluded-as-read
3926 Mark all excluded unread articles as read
3927 (@code{gnus-summary-limit-mark-excluded-as-read}).   If given a prefix,
3928 also mark excluded ticked and dormant articles as read.
3929
3930 @end table
3931
3932
3933 @node Threading
3934 @section Threading
3935 @cindex threading
3936 @cindex article threading
3937
3938 Gnus threads articles by default.  @dfn{To thread} is to put replies to
3939 articles directly after the articles they reply to---in a hierarchical
3940 fashion.
3941
3942 @menu
3943 * Customizing Threading::     Variables you can change to affect the threading.
3944 * Thread Commands::           Thread based commands in the summary buffer.
3945 @end menu
3946
3947
3948 @node Customizing Threading
3949 @subsection Customizing Threading
3950 @cindex customizing threading
3951 @cindex <
3952 @cindex >
3953
3954 @table @code
3955
3956 @item gnus-show-threads
3957 @vindex gnus-show-threads
3958 If this variable is @code{nil}, no threading will be done, and all of
3959 the rest of the variables here will have no effect.  Turning threading
3960 off will speed group selection up a bit, but it is sure to make reading
3961 slower and more awkward.
3962
3963 @item gnus-fetch-old-headers
3964 @vindex gnus-fetch-old-headers
3965 If non-@code{nil}, Gnus will attempt to build old threads by fetching
3966 more old headers---headers to articles that are marked as read.  If you
3967 would like to display as few summary lines as possible, but still
3968 connect as many loose threads as possible, you should set this variable
3969 to @code{some} or a number.  If you set it to a number, no more than
3970 that number of extra old headers will be fetched.  In either case,
3971 fetching old headers only works if the backend you are using carries
3972 overview files---this would normally be @code{nntp}, @code{nnspool} and
3973 @code{nnml}.  Also remember that if the root of the thread has been
3974 expired by the server, there's not much Gnus can do about that.
3975
3976 @item gnus-build-sparse-threads
3977 @vindex gnus-build-sparse-threads
3978 Fetching old headers can be slow.  A low-rent similar effect can be
3979 gotten by setting this variable to @code{some}.  Gnus will then look at
3980 the complete @code{References} headers of all articles and try to string
3981 articles that belong in the same thread together.  This will leave
3982 @dfn{gaps} in the threading display where Gnus guesses that an article
3983 is missing from the thread.  (These gaps appear like normal summary
3984 lines.  If you select a gap, Gnus will try to fetch the article in
3985 question.)  If this variable is @code{t}, Gnus will display all these
3986 ``gaps'' without regard for whether they are useful for completing the
3987 thread or not.  Finally, if this variable is @code{more}, Gnus won't cut
3988 off sparse leaf nodes that don't lead anywhere.  This variable is
3989 @code{nil} by default.
3990
3991 @item gnus-summary-gather-subject-limit
3992 @vindex gnus-summary-gather-subject-limit
3993 Loose threads are gathered by comparing subjects of articles.  If this
3994 variable is @code{nil}, Gnus requires an exact match between the
3995 subjects of the loose threads before gathering them into one big
3996 super-thread.  This might be too strict a requirement, what with the
3997 presence of stupid newsreaders that chop off long subjects lines.  If
3998 you think so, set this variable to, say, 20 to require that only the
3999 first 20 characters of the subjects have to match.  If you set this
4000 variable to a really low number, you'll find that Gnus will gather
4001 everything in sight into one thread, which isn't very helpful.
4002
4003 @cindex fuzzy article gathering
4004 If you set this variable to the special value @code{fuzzy}, Gnus will
4005 use a fuzzy string comparison algorithm on the subjects.
4006
4007 @item gnus-simplify-subject-fuzzy-regexp
4008 @vindex gnus-simplify-subject-fuzzy-regexp
4009 This can either be a regular expression or list of regular expressions
4010 that match strings that will be removed from subjects if fuzzy subject
4011 simplification is used.
4012
4013 @item gnus-simplify-ignored-prefixes
4014 @vindex gnus-simplify-ignored-prefixes
4015 If you set @code{gnus-summary-gather-subject-limit} to something as low
4016 as 10, you might consider setting this variable to something sensible:
4017
4018 @c Written by Michael Ernst <mernst@cs.rice.edu>
4019 @lisp
4020 (setq gnus-simplify-ignored-prefixes
4021       (concat 
4022        "\\`\\[?\\("
4023        (mapconcat 'identity
4024                   '("looking"
4025                      "wanted" "followup" "summary\\( of\\)?"
4026                      "help" "query" "problem" "question" 
4027                      "answer" "reference" "announce"
4028                      "How can I" "How to" "Comparison of"
4029                      ;; ...
4030                      )
4031                   "\\|")
4032                   "\\)\\s *\\("
4033                   (mapconcat 'identity
4034                              '("for" "for reference" "with" "about")
4035                              "\\|")
4036                   "\\)?\\]?:?[ \t]*"))
4037 @end lisp
4038
4039 All words that match this regexp will be removed before comparing two
4040 subjects. 
4041
4042 @item gnus-summary-gather-exclude-subject
4043 @vindex gnus-summary-gather-exclude-subject
4044 Since loose thread gathering is done on subjects only, that might lead
4045 to many false hits, especially with certain common subjects like
4046 @samp{} and @samp{(none)}.  To make the situation slightly better,
4047 you can use the regexp @code{gnus-summary-gather-exclude-subject} to say
4048 what subjects should be excluded from the gathering process.  The
4049 default is @samp{^ *$\\|^(none)$}.  
4050
4051 @item gnus-summary-thread-gathering-function
4052 @vindex gnus-summary-thread-gathering-function
4053 Gnus gathers threads by looking at @code{Subject} headers.  This means
4054 that totally unrelated articles may end up in the same ``thread'', which
4055 is confusing.  An alternate approach is to look at all the
4056 @code{Message-ID}s in all the @code{References} headers to find matches.
4057 This will ensure that no gathered threads ever includes unrelated
4058 articles, but it's also means that people who have posted with broken
4059 newsreaders won't be gathered properly.  The choice is yours---plague or
4060 cholera:
4061
4062 @table @code
4063 @item gnus-gather-threads-by-subject
4064 @findex gnus-gather-threads-by-subject
4065 This function is the default gathering function and looks at
4066 @code{Subject}s exclusively.
4067
4068 @item gnus-gather-threads-by-references
4069 @findex gnus-gather-threads-by-references
4070 This function looks at @code{References} headers exclusively.
4071 @end table
4072
4073 If you want to test gathering by @code{References}, you could say
4074 something like:
4075
4076 @lisp
4077 (setq gnus-summary-thread-gathering-function
4078       'gnus-gather-threads-by-references)
4079 @end lisp
4080
4081 @item gnus-summary-make-false-root
4082 @vindex gnus-summary-make-false-root
4083 If non-@code{nil}, Gnus will gather all loose subtrees into one big tree
4084 and create a dummy root at the top.  (Wait a minute.  Root at the top?
4085 Yup.)  Loose subtrees occur when the real root has expired, or you've
4086 read or killed the root in a previous session.
4087
4088 When there is no real root of a thread, Gnus will have to fudge
4089 something.  This variable says what fudging method Gnus should use.
4090 There are four possible values:
4091
4092 @cindex adopting articles
4093
4094 @table @code
4095
4096 @item adopt
4097 Gnus will make the first of the orphaned articles the parent.  This
4098 parent will adopt all the other articles.  The adopted articles will be
4099 marked as such by pointy brackets (@samp{<>}) instead of the standard
4100 square brackets (@samp{[]}).  This is the default method.
4101
4102 @item dummy
4103 @vindex gnus-summary-dummy-line-format
4104 Gnus will create a dummy summary line that will pretend to be the
4105 parent.  This dummy line does not correspond to any real article, so
4106 selecting it will just select the first real article after the dummy
4107 article.  @code{gnus-summary-dummy-line-format} is used to specify the
4108 format of the dummy roots.  It accepts only one format spec:  @samp{S},
4109 which is the subject of the article.  @xref{Formatting Variables}.
4110
4111 @item empty
4112 Gnus won't actually make any article the parent, but simply leave the
4113 subject field of all orphans except the first empty.  (Actually, it will
4114 use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
4115 Buffer Format}).)
4116
4117 @item none
4118 Don't make any article parent at all.  Just gather the threads and
4119 display them after one another.
4120
4121 @item nil
4122 Don't gather loose threads.
4123 @end table
4124
4125 @item gnus-thread-hide-subtree
4126 @vindex gnus-thread-hide-subtree
4127 If non-@code{nil}, all threads will be hidden when the summary buffer is
4128 generated.
4129
4130 @item gnus-thread-hide-killed
4131 @vindex gnus-thread-hide-killed
4132 if you kill a thread and this variable is non-@code{nil}, the subtree
4133 will be hidden.
4134
4135 @item gnus-thread-ignore-subject
4136 @vindex gnus-thread-ignore-subject
4137 Sometimes somebody changes the subject in the middle of a thread.  If
4138 this variable is non-@code{nil}, the subject change is ignored.  If it
4139 is @code{nil}, which is the default, a change in the subject will result
4140 in a new thread.
4141
4142 @item gnus-thread-indent-level
4143 @vindex gnus-thread-indent-level
4144 This is a number that says how much each sub-thread should be indented.
4145 The default is @code{4}.
4146 @end table
4147
4148
4149 @node Thread Commands
4150 @subsection Thread Commands
4151 @cindex thread commands
4152
4153 @table @kbd
4154
4155 @item T k
4156 @itemx M-C-k
4157 @kindex T k (Summary)
4158 @kindex M-C-k (Summary)
4159 @findex gnus-summary-kill-thread
4160 Mark all articles in the current sub-thread as read
4161 (@code{gnus-summary-kill-thread}).  If the prefix argument is positive,
4162 remove all marks instead.  If the prefix argument is negative, tick
4163 articles instead.
4164
4165 @item T l
4166 @itemx M-C-l
4167 @kindex T l (Summary)
4168 @kindex M-C-l (Summary)
4169 @findex gnus-summary-lower-thread
4170 Lower the score of the current thread
4171 (@code{gnus-summary-lower-thread}). 
4172
4173 @item T i
4174 @kindex T i (Summary)
4175 @findex gnus-summary-raise-thread
4176 Increase the score of the current thread
4177 (@code{gnus-summary-raise-thread}).
4178
4179 @item T #
4180 @kindex T # (Summary)
4181 @findex gnus-uu-mark-thread
4182 Set the process mark on the current thread
4183 (@code{gnus-uu-mark-thread}).
4184
4185 @item T M-#
4186 @kindex T M-# (Summary)
4187 @findex gnus-uu-unmark-thread
4188 Remove the process mark from the current thread
4189 (@code{gnus-uu-unmark-thread}).
4190
4191 @item T T
4192 @kindex T T (Summary)
4193 @findex gnus-summary-toggle-threads
4194 Toggle threading (@code{gnus-summary-toggle-threads}).
4195
4196 @item T s
4197 @kindex T s (Summary)
4198 @findex gnus-summary-show-thread
4199 Expose the thread hidden under the current article, if any
4200 (@code{gnus-summary-show-thread}).
4201
4202 @item T h
4203 @kindex T h (Summary)
4204 @findex gnus-summary-hide-thread
4205 Hide the current (sub)thread (@code{gnus-summary-hide-thread}).
4206
4207 @item T S
4208 @kindex T S (Summary)
4209 @findex gnus-summary-show-all-threads
4210 Expose all hidden threads (@code{gnus-summary-show-all-threads}).
4211
4212 @item T H
4213 @kindex T H (Summary)
4214 @findex gnus-summary-hide-all-threads
4215 Hide all threads (@code{gnus-summary-hide-all-threads}).
4216
4217 @item T t
4218 @kindex T t (Summary)
4219 @findex gnus-summary-rethread-current
4220 Re-thread the thread the current article is part of
4221 (@code{gnus-summary-rethread-current}).  This works even when the
4222 summary buffer is otherwise unthreaded.
4223
4224 @item T ^
4225 @kindex T ^ (Summary)
4226 @findex gnus-summary-reparent-thread
4227 Make the current article the child of the marked (or previous) article
4228 (@code{gnus-summary-reparent-thread}.
4229
4230 @end table
4231
4232 The following commands are thread movement commands.  They all
4233 understand the numeric prefix.
4234
4235 @table @kbd
4236
4237 @item T n
4238 @kindex T n (Summary)
4239 @findex gnus-summary-next-thread
4240 Go to the next thread (@code{gnus-summary-next-thread}).
4241
4242 @item T p
4243 @kindex T p (Summary)
4244 @findex gnus-summary-prev-thread
4245 Go to the previous thread (@code{gnus-summary-prev-thread}).
4246
4247 @item T d
4248 @kindex T d (Summary)
4249 @findex gnus-summary-down-thread
4250 Descend the thread (@code{gnus-summary-down-thread}).
4251
4252 @item T u
4253 @kindex T u (Summary)
4254 @findex gnus-summary-up-thread
4255 Ascend the thread (@code{gnus-summary-up-thread}).
4256
4257 @item T o
4258 @kindex T o (Summary)
4259 @findex gnus-summary-top-thread
4260 Go to the top of the thread (@code{gnus-summary-top-thread}).
4261 @end table
4262
4263 @vindex gnus-thread-operation-ignore-subject 
4264 If you ignore subject while threading, you'll naturally end up with
4265 threads that have several different subjects in them.  If you then issue
4266 a command like `T k' (@code{gnus-summary-kill-thread}) you might not
4267 wish to kill the entire thread, but just those parts of the thread that
4268 have the same subject as the current article.  If you like this idea,
4269 you can fiddle with @code{gnus-thread-operation-ignore-subject}.  If is
4270 is non-@code{nil} (which it is by default), subjects will be ignored
4271 when doing thread commands.  If this variable is @code{nil}, articles in
4272 the same thread with different subjects will not be included in the
4273 operation in question.  If this variable is @code{fuzzy}, only articles
4274 that have subjects that are fuzzily equal will be included.
4275
4276
4277 @node Sorting
4278 @section Sorting
4279
4280 @findex gnus-thread-sort-by-total-score
4281 @findex gnus-thread-sort-by-date
4282 @findex gnus-thread-sort-by-score
4283 @findex gnus-thread-sort-by-subject
4284 @findex gnus-thread-sort-by-author
4285 @findex gnus-thread-sort-by-number
4286 @vindex gnus-thread-sort-functions
4287 If you are using a threaded summary display, you can sort the threads by
4288 setting @code{gnus-thread-sort-functions}, which is a list of functions.
4289 By default, sorting is done on article numbers.  Ready-made sorting
4290 predicate functions include @code{gnus-thread-sort-by-number},
4291 @code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject},
4292 @code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score}, and
4293 @code{gnus-thread-sort-by-total-score}.
4294
4295 Each function takes two threads and return non-@code{nil} if the first
4296 thread should be sorted before the other.  Note that sorting really is
4297 normally done by looking only at the roots of each thread.  If you use
4298 more than one function, the primary sort key should be the last function
4299 in the list.  You should probably always include
4300 @code{gnus-thread-sort-by-number} in the list of sorting
4301 functions---preferably first.  This will ensure that threads that are
4302 equal with respect to the other sort criteria will be displayed in
4303 ascending article order.
4304
4305 If you would like to sort by score, then by subject, and finally by
4306 number, you could do something like:
4307
4308 @lisp
4309 (setq gnus-thread-sort-functions 
4310       '(gnus-thread-sort-by-number
4311         gnus-thread-sort-by-subject
4312         gnus-thread-sort-by-score))
4313 @end lisp
4314
4315 The threads that have highest score will be displayed first in the
4316 summary buffer.  When threads have the same score, they will be sorted
4317 alphabetically.  The threads that have the same score and the same
4318 subject will be sorted by number, which is (normally) the sequence in
4319 which the articles arrived.
4320
4321 If you want to sort by score and then reverse arrival order, you could
4322 say something like:
4323
4324 @lisp
4325 (setq gnus-thread-sort-functions
4326       '((lambda (t1 t2) 
4327           (not (gnus-thread-sort-by-number t1 t2)))
4328         gnus-thread-sort-by-score))
4329 @end lisp
4330
4331 @vindex gnus-thread-score-function
4332 The function in the @code{gnus-thread-score-function} variable (default
4333 @code{+}) is used for calculating the total score of a thread.  Useful
4334 functions might be @code{max}, @code{min}, or squared means, or whatever
4335 tickles your fancy.
4336
4337 @findex gnus-article-sort-functions
4338 @findex gnus-article-sort-by-date
4339 @findex gnus-article-sort-by-score
4340 @findex gnus-article-sort-by-subject
4341 @findex gnus-article-sort-by-author
4342 @findex gnus-article-sort-by-number
4343 If you are using an unthreaded display for some strange reason or other,
4344 you have to fiddle with the @code{gnus-article-sort-functions} variable.
4345 It is very similar to the @code{gnus-thread-sort-functions}, except that
4346 is uses slightly different functions for article comparison.  Available
4347 sorting predicate functions are @code{gnus-article-sort-by-number},
4348 @code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject},
4349 @code{gnus-article-sort-by-date}, and @code{gnus-article-sort-by-score}.
4350
4351 If you want to sort an unthreaded summary display by subject, you could
4352 say something like:
4353
4354 @lisp
4355 (setq gnus-article-sort-functions 
4356       '(gnus-article-sort-by-number
4357         gnus-article-sort-by-subject))
4358 @end lisp
4359
4360
4361
4362 @node Asynchronous Fetching
4363 @section Asynchronous Article Fetching
4364 @cindex asynchronous article fetching
4365
4366 If you read your news from an @sc{nntp} server that's far away, the
4367 network latencies may make reading articles a chore.  You have to wait
4368 for a while after pressing @kbd{n} to go to the next article before the
4369 article appears.  Why can't Gnus just go ahead and fetch the article
4370 while you are reading the previous one? Why not, indeed.
4371
4372 First, some caveats.  There are some pitfalls to using asynchronous
4373 article fetching, especially the way Gnus does it.  
4374
4375 Let's say you are reading article 1, which is short, and article 2 is
4376 quite long, and you are not interested in reading that.  Gnus does not
4377 know this, so it goes ahead and fetches article 2.  You decide to read
4378 article 3, but since Gnus is in the process of fetching article 2, the
4379 connection is blocked.
4380
4381 To avoid these situations, Gnus will open two (count 'em two)
4382 connections to the server.  Some people may think this isn't a very nice
4383 thing to do, but I don't see any real alternatives.  Setting up that
4384 extra connection takes some time, so Gnus startup will be slower.
4385
4386 Gnus will fetch more articles than you will read.  This will mean that
4387 the link between your machine and the @sc{nntp} server will become more
4388 loaded than if you didn't use article pre-fetch.  The server itself will
4389 also become more loaded---both with the extra article requests, and the
4390 extra connection.
4391
4392 Ok, so now you know that you shouldn't really use this thing...  unless
4393 you really want to.
4394
4395 @vindex gnus-asynchronous
4396 Here's how:  Set @code{gnus-asynchronous} to @code{t}.  The rest should
4397 happen automatically.
4398
4399 @vindex nntp-async-number
4400 You can control how many articles that are to be pre-fetched by setting
4401 @code{nntp-async-number}.  This is five by default, which means that when
4402 you read an article in the group, @code{nntp} will pre-fetch the next
4403 five articles.  If this variable is @code{t}, @code{nntp} will pre-fetch
4404 all the articles that it can without bound.  If it is @code{nil}, no
4405 pre-fetching will be made.
4406
4407 @vindex gnus-asynchronous-article-function
4408 You may wish to create some sort of scheme for choosing which articles
4409 that @code{nntp} should consider as candidates for pre-fetching.  For
4410 instance, you may wish to pre-fetch all articles with high scores, and
4411 not pre-fetch low-scored articles.  You can do that by setting the
4412 @code{gnus-asynchronous-article-function}, which will be called with an
4413 alist where the keys are the article numbers.  Your function should
4414 return an alist where the articles you are not interested in have been
4415 removed.  You could also do sorting on article score and the like. 
4416
4417
4418 @node Article Caching
4419 @section Article Caching
4420 @cindex article caching
4421 @cindex caching
4422
4423 If you have an @emph{extremely} slow @sc{nntp} connection, you may
4424 consider turning article caching on.  Each article will then be stored
4425 locally under your home directory.  As you may surmise, this could
4426 potentially use @emph{huge} amounts of disk space, as well as eat up all
4427 your inodes so fast it will make your head swim.  In vodka.
4428
4429 Used carefully, though, it could be just an easier way to save articles.
4430
4431 @vindex gnus-use-long-file-name
4432 @vindex gnus-cache-directory
4433 @vindex gnus-use-cache
4434 To turn caching on, set @code{gnus-use-cache} to @code{t}.  By default,
4435 all articles that are ticked or marked as dormant will then be copied
4436 over to your local cache (@code{gnus-cache-directory}).  Whether this
4437 cache is flat or hierarchal is controlled by the
4438 @code{gnus-use-long-file-name} variable, as usual.
4439
4440 When re-select a ticked or dormant article, it will be fetched from the
4441 cache instead of from the server.  As articles in your cache will never
4442 expire, this might serve as a method of saving articles while still
4443 keeping them where they belong.  Just mark all articles you want to save
4444 as dormant, and don't worry.
4445
4446 When an article is marked as read, is it removed from the cache.
4447
4448 @vindex gnus-cache-remove-articles
4449 @vindex gnus-cache-enter-articles
4450 The entering/removal of articles from the cache is controlled by the
4451 @code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}
4452 variables.  Both are lists of symbols.  The first is @code{(ticked
4453 dormant)} by default, meaning that ticked and dormant articles will be
4454 put in the cache.  The latter is @code{(read)} by default, meaning that
4455 articles that are marked as read are removed from the cache.  Possibly
4456 symbols in these two lists are @code{ticked}, @code{dormant},
4457 @code{unread} and @code{read}.
4458
4459 @findex gnus-jog-cache
4460 So where does the massive article-fetching and storing come into the
4461 picture?  The @code{gnus-jog-cache} command will go through all
4462 subscribed newsgroups, request all unread articles, and store them in
4463 the cache.  You should only ever, ever ever ever, use this command if 1)
4464 your connection to the @sc{nntp} server is really, really, really slow
4465 and 2) you have a really, really, really huge disk.  Seriously.
4466
4467 @vindex gnus-uncacheable-groups
4468 It is likely that you do not want caching on some groups.  For instance,
4469 if your @code{nnml} mail is located under your home directory, it makes no
4470 sense to cache it somewhere else under your home directory.  Unless you
4471 feel that it's neat to use twice as much space.  To limit the caching,
4472 you could set the @code{gnus-uncacheable-groups} regexp to
4473 @samp{^nnml}, for instance.  This variable is @code{nil} by
4474 default.
4475
4476 @findex gnus-cache-generate-nov-databases
4477 @findex gnus-cache-generate-active
4478 @vindex gnus-cache-active-file
4479 The cache stores information on what articles it contains in its active
4480 file (@code{gnus-cache-active-file}).  If this file (or any other parts
4481 of the cache) becomes all messed up for some reason or other, Gnus
4482 offers two functions that will try to set things right.  @kbd{M-x
4483 gnus-cache-generate-nov-databases} will (re)build all the @sc{nov}
4484 files, and @kbd{gnus-cache-generate-active} will (re)generate the active
4485 file.
4486
4487
4488 @node Persistent Articles
4489 @section Persistent Articles
4490 @cindex persistent articles
4491
4492 Closely related to article caching, we have @dfn{persistent articles}.
4493 In fact, it's just a different way of looking at caching, and much more
4494 useful in my opinion.
4495
4496 Say you're reading a newsgroup, and you happen on to some valuable gem
4497 that you want to keep and treasure forever.  You'd normally just save it
4498 (using one of the many saving commands) in some file.  The problem with
4499 that is that it's just, well, yucky.  Ideally you'd prefer just having
4500 the article remain in the group where you found it forever; untouched by
4501 the expiry going on at the news server.
4502
4503 This is what a @dfn{persistent article} is---an article that just won't
4504 be deleted.  It's implemented using the normal cache functions, but
4505 you use two explicit commands for managing persistent articles:
4506
4507 @table @kbd
4508
4509 @item *
4510 @kindex * (Summary)
4511 @findex gnus-cache-enter-article
4512 Make the current article persistent (@code{gnus-cache-enter-article}). 
4513
4514 @item M-*
4515 @kindex M-* (Summary)
4516 @findex gnus-cache-remove-article
4517 Remove the current article from the persistent articles
4518 (@code{gnus-cache-remove-article}).  This will normally delete the
4519 article. 
4520 @end table
4521
4522 Both these commands understand the process/prefix convention. 
4523
4524 To avoid having all ticked articles (and stuff) entered into the cache,
4525 you should set @code{gnus-use-cache} to @code{passive} if you're just
4526 interested in persistent articles:
4527
4528 @lisp
4529 (setq gnus-use-cache 'passive)
4530 @end lisp
4531
4532
4533 @node Article Backlog
4534 @section Article Backlog
4535 @cindex backlog
4536 @cindex article backlog
4537
4538 If you have a slow connection, but the idea of using caching seems
4539 unappealing to you (and it is, really), you can help the situation some
4540 by switching on the @dfn{backlog}.  This is where Gnus will buffer
4541 already read articles so that it doesn't have to re-fetch articles
4542 you've already read.  This only helps if you are in the habit of
4543 re-selecting articles you've recently read, of course.  If you never do
4544 that, turning the backlog on will slow Gnus down a little bit, and
4545 increase memory usage some.
4546
4547 @vindex gnus-keep-backlog
4548 If you set @code{gnus-keep-backlog} to a number @var{n}, Gnus will store
4549 at most @var{n} old articles in a buffer for later re-fetching.  If this
4550 variable is non-@code{nil} and is not a number, Gnus will store
4551 @emph{all} read articles, which means that your Emacs will grow without
4552 bound before exploding and taking your machine down with you.  I put
4553 that in there just to keep y'all on your toes.  
4554
4555 This variable is @code{nil} by default.
4556
4557
4558 @node Saving Articles
4559 @section Saving Articles
4560 @cindex saving articles
4561
4562 Gnus can save articles in a number of ways.  Below is the documentation
4563 for saving articles in a fairly straight-forward fashion (i.e., little
4564 processing of the article is done before it is saved).  For a different
4565 approach (uudecoding, unsharing) you should use @code{gnus-uu}
4566 (@pxref{Decoding Articles}).
4567
4568 @vindex gnus-save-all-headers
4569 If @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not delete
4570 unwanted headers before saving the article.
4571
4572 @vindex gnus-saved-headers
4573 If the preceding variable is @code{nil}, all headers that match the
4574 @code{gnus-saved-headers} regexp will be kept, while the rest will be
4575 deleted before saving.
4576
4577 @table @kbd
4578
4579 @item O o
4580 @itemx o
4581 @kindex O o (Summary)
4582 @kindex o (Summary)
4583 @findex gnus-summary-save-article
4584 Save the current article using the default article saver
4585 (@code{gnus-summary-save-article}). 
4586
4587 @item O m
4588 @kindex O m (Summary)
4589 @findex gnus-summary-save-article-mail
4590 Save the current article in mail format
4591 (@code{gnus-summary-save-article-mail}). 
4592
4593 @item O r
4594 @kindex O r (Summary)
4595 @findex gnus-summary-save-article-rmail
4596 Save the current article in rmail format
4597 (@code{gnus-summary-save-article-rmail}). 
4598
4599 @item O f
4600 @kindex O f (Summary)
4601 @findex gnus-summary-save-article-file
4602 Save the current article in plain file format
4603 (@code{gnus-summary-save-article-file}). 
4604
4605 @item O b
4606 @kindex O b (Summary)
4607 @findex gnus-summary-save-article-body-file
4608 Save the current article body in plain file format
4609 (@code{gnus-summary-save-article-body-file}). 
4610
4611 @item O h
4612 @kindex O h (Summary)
4613 @findex gnus-summary-save-article-folder
4614 Save the current article in mh folder format
4615 (@code{gnus-summary-save-article-folder}). 
4616
4617 @item O v
4618 @kindex O v (Summary)
4619 @findex gnus-summary-save-article-vm
4620 Save the current article in a VM folder
4621 (@code{gnus-summary-save-article-vm}).
4622
4623 @item O p
4624 @kindex O p (Summary)
4625 @findex gnus-summary-pipe-output
4626 Save the current article in a pipe.  Uhm, like, what I mean is---Pipe
4627 the current article to a process (@code{gnus-summary-pipe-output}).
4628 @end table
4629
4630 @vindex gnus-prompt-before-saving
4631 All these commands use the process/prefix convention
4632 (@pxref{Process/Prefix}).  If you save bunches of articles using these
4633 functions, you might get tired of being prompted for files to save each
4634 and every article in.  The prompting action is controlled by
4635 the @code{gnus-prompt-before-saving} variable, which is @code{always} by
4636 default, giving you that excessive prompting action you know and
4637 loathe.  If you set this variable to @code{t} instead, you'll be prompted
4638 just once for each series of articles you save.  If you like to really
4639 have Gnus do all your thinking for you, you can even set this variable
4640 to @code{nil}, which means that you will never be prompted for files to
4641 save articles in.  Gnus will simply save all the articles in the default
4642 files. 
4643
4644
4645 @vindex gnus-default-article-saver
4646 You can customize the @code{gnus-default-article-saver} variable to make
4647 Gnus do what you want it to.  You can use any of the four ready-made
4648 functions below, or you can create your own.
4649
4650 @table @code
4651
4652 @item gnus-summary-save-in-rmail
4653 @findex gnus-summary-save-in-rmail
4654 @vindex gnus-rmail-save-name
4655 @findex gnus-plain-save-name
4656 This is the default format, @dfn{babyl}.  Uses the function in the
4657 @code{gnus-rmail-save-name} variable to get a file name to save the
4658 article in.  The default is @code{gnus-plain-save-name}.
4659
4660 @item gnus-summary-save-in-mail
4661 @findex gnus-summary-save-in-mail
4662 @vindex gnus-mail-save-name
4663 Save in a Unix mail (mbox) file.  Uses the function in the
4664 @code{gnus-mail-save-name} variable to get a file name to save the
4665 article in.  The default is @code{gnus-plain-save-name}.
4666
4667 @item gnus-summary-save-in-file
4668 @findex gnus-summary-save-in-file
4669 @vindex gnus-file-save-name
4670 @findex gnus-numeric-save-name
4671 Append the article straight to an ordinary file.  Uses the function in
4672 the @code{gnus-file-save-name} variable to get a file name to save the
4673 article in.  The default is @code{gnus-numeric-save-name}.
4674
4675 @item gnus-summary-save-body-in-file
4676 @findex gnus-summary-save-body-in-file
4677 Append the article body to an ordinary file.  Uses the function in the
4678 @code{gnus-file-save-name} variable to get a file name to save the
4679 article in.  The default is @code{gnus-numeric-save-name}.
4680
4681 @item gnus-summary-save-in-folder
4682 @findex gnus-summary-save-in-folder
4683 @findex gnus-folder-save-name
4684 @findex gnus-Folder-save-name
4685 @vindex gnus-folder-save-name
4686 @cindex rcvstore
4687 @cindex MH folders
4688 Save the article to an MH folder using @code{rcvstore} from the MH
4689 library.  Uses the function in the @code{gnus-folder-save-name} variable
4690 to get a file name to save the article in.  The default is
4691 @code{gnus-folder-save-name}, but you can also use
4692 @code{gnus-Folder-save-name}.  The former creates capitalized names, and
4693 the latter does not.
4694
4695 @item gnus-summary-save-in-vm
4696 @findex gnus-summary-save-in-vm
4697 Save the article in a VM folder.  You have to have the VM mail
4698 reader to use this setting.
4699 @end table
4700
4701 @vindex gnus-article-save-directory
4702 All of these functions, except for the last one, will save the article
4703 in the @code{gnus-article-save-directory}, which is initialized from the
4704 @code{SAVEDIR} environment variable.  This is @file{~/News/} by
4705 default. 
4706
4707 As you can see above, the functions use different functions to find a
4708 suitable name of a file to save the article in.  Below is a list of
4709 available functions that generate names:
4710
4711 @table @code
4712
4713 @item gnus-Numeric-save-name
4714 @findex gnus-Numeric-save-name
4715 Generates file names that look like @file{~/News/Alt.andrea-dworkin/45}.
4716
4717 @item gnus-numeric-save-name
4718 @findex gnus-numeric-save-name
4719 Generates file names that look like @file{~/News/alt.andrea-dworkin/45}.
4720
4721 @item gnus-Plain-save-name
4722 @findex gnus-Plain-save-name
4723 Generates file names that look like @file{~/News/Alt.andrea-dworkin}.
4724
4725 @item gnus-plain-save-name
4726 @findex gnus-plain-save-name
4727 Generates file names that look like @file{~/News/alt.andrea-dworkin}.
4728 @end table
4729
4730 @vindex gnus-split-methods
4731 You can have Gnus suggest where to save articles by plonking a regexp into
4732 the @code{gnus-split-methods} alist.  For instance, if you would like to
4733 save articles related to Gnus in the file @file{gnus-stuff}, and articles
4734 related to VM in @code{vm-stuff}, you could set this variable to something
4735 like:
4736
4737 @lisp
4738 (("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff")
4739  ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff")
4740  (my-choosing-function "../other-dir/my-stuff")
4741  ((equal gnus-newsgroup-name "mail.misc") "mail-stuff"))
4742 @end lisp
4743
4744 We see that this is a list where each element is a list that has two
4745 elements---the @dfn{match} and the @dfn{file}.  The match can either be
4746 a string (in which case it is used as a regexp to match on the article
4747 head); it can be a symbol (which will be called as a function with the
4748 group name as a parameter); or it can be a list (which will be
4749 @code{eval}ed).  If any of these actions have a non-@code{nil} result,
4750 the @dfn{file} will be used as a default prompt.  In addition, the
4751 result of the operation itself will be used if the function or form
4752 called returns a string or a list of strings.
4753
4754 You basically end up with a list of file names that might be used when
4755 saving the current article.  (All ``matches'' will be used.)  You will
4756 then be prompted for what you really want to use as a name, with file
4757 name completion over the results from applying this variable.
4758
4759 This variable is @code{((gnus-article-archive-name))} by default, which
4760 means that Gnus will look at the articles it saves for an
4761 @code{Archive-name} line and use that as a suggestion for the file
4762 name. 
4763
4764 @vindex gnus-use-long-file-name
4765 Finally, you have the @code{gnus-use-long-file-name} variable.  If it is
4766 @code{nil}, all the preceding functions will replace all periods
4767 (@samp{.}) in the group names with slashes (@samp{/})---which means that
4768 the functions will generate hierarchies of directories instead of having
4769 all the files in the toplevel directory
4770 (@file{~/News/alt/andrea-dworkin} instead of
4771 @file{~/News/alt.andrea-dworkin}.)  This variable is @code{t} by default
4772 on most systems.  However, for historical reasons, this is @code{nil} on
4773 Xenix and usg-unix-v machines by default.
4774
4775 This function also affects kill and score file names.  If this variable
4776 is a list, and the list contains the element @code{not-score}, long file
4777 names will not be used for score files, if it contains the element
4778 @code{not-save}, long file names will not be used for saving, and if it
4779 contains the element @code{not-kill}, long file names will not be used
4780 for kill files.
4781
4782 If you'd like to save articles in a hierarchy that looks something like
4783 a spool, you could
4784
4785 @lisp
4786 (setq gnus-use-long-file-name '(not-save)) ; to get a hierarchy
4787 (setq gnus-default-article-save 'gnus-summary-save-in-file) ; no encoding
4788 @end lisp
4789
4790 Then just save with @kbd{o}.  You'd then read this hierarchy with
4791 ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and
4792 the toplevel directory as the argument (@file{~/News/}).  Then just walk
4793 around to the groups/directories with @code{nneething}.
4794
4795
4796 @node Decoding Articles
4797 @section Decoding Articles
4798 @cindex decoding articles
4799
4800 Sometime users post articles (or series of articles) that have been
4801 encoded in some way or other.  Gnus can decode them for you.
4802
4803 @menu 
4804 * Uuencoded Articles::    Uudecode articles.
4805 * Shared Articles::       Unshar articles.
4806 * PostScript Files::      Split PostScript.
4807 * Decoding Variables::    Variables for a happy decoding.
4808 * Viewing Files::         You want to look at the result of the decoding?
4809 @end menu
4810
4811 All these functions use the process/prefix convention
4812 (@pxref{Process/Prefix}) for finding out what articles to work on, with
4813 the extension that a ``single article'' means ``a single series''.  Gnus
4814 can find out by itself what articles belong to a series, decode all the
4815 articles and unpack/view/save the resulting file(s).
4816
4817 Gnus guesses what articles are in the series according to the following
4818 simplish rule: The subjects must be (nearly) identical, except for the
4819 last two numbers of the line.  (Spaces are largely ignored, however.)
4820
4821 For example: If you choose a subject called @samp{cat.gif (2/3)}, Gnus
4822 will find all the articles that match the regexp @samp{^cat.gif
4823 ([0-9]+/[0-9]+).*$}.  
4824
4825 Subjects that are nonstandard, like @samp{cat.gif (2/3) Part 6 of a
4826 series}, will not be properly recognized by any of the automatic viewing
4827 commands, and you have to mark the articles manually with @kbd{#}.
4828
4829
4830 @node Uuencoded Articles
4831 @subsection Uuencoded Articles
4832 @cindex uudecode
4833 @cindex uuencoded articles
4834
4835 @table @kbd
4836
4837 @item X u
4838 @kindex X u (Summary)
4839 @findex gnus-uu-decode-uu
4840 Uudecodes the current series (@code{gnus-uu-decode-uu}).
4841
4842 @item X U
4843 @kindex X U (Summary)
4844 @findex gnus-uu-decode-uu-and-save
4845 Uudecodes and saves the current series
4846 (@code{gnus-uu-decode-uu-and-save}).
4847
4848 @item X v u
4849 @kindex X v u (Summary)
4850 @findex gnus-uu-decode-uu-view
4851 Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}).
4852
4853 @item X v U
4854 @kindex X v U (Summary)
4855 @findex gnus-uu-decode-uu-and-save-view
4856 Uudecodes, views and saves the current series
4857 (@code{gnus-uu-decode-uu-and-save-view}). 
4858 @end table
4859
4860 Remember that these all react to the presence of articles marked with
4861 the process mark.  If, for instance, you'd like to decode and save an
4862 entire newsgroup, you'd typically do @kbd{M P a}
4863 (@code{gnus-uu-mark-all}) and then @kbd{X U}
4864 (@code{gnus-uu-decode-uu-and-save}).
4865
4866 All this is very much different from how @code{gnus-uu} worked with
4867 @sc{gnus 4.1}, where you had explicit keystrokes for everything under
4868 the sun.  This version of @code{gnus-uu} generally assumes that you mark
4869 articles in some way (@pxref{Setting Process Marks}) and then press
4870 @kbd{X u}.
4871
4872 @vindex gnus-uu-notify-files
4873 Note: When trying to decode articles that have names matching
4874 @code{gnus-uu-notify-files}, which is hard-coded to
4875 @samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will
4876 automatically post an article on @samp{comp.unix.wizards} saying that
4877 you have just viewed the file in question.  This feature can't be turned
4878 off.
4879
4880
4881 @node Shared Articles
4882 @subsection Shared Articles
4883 @cindex unshar
4884 @cindex shared articles
4885
4886 @table @kbd
4887
4888 @item X s
4889 @kindex X s (Summary)
4890 @findex gnus-uu-decode-unshar
4891 Unshars the current series (@code{gnus-uu-decode-unshar}).
4892
4893 @item X S
4894 @kindex X S (Summary)
4895 @findex gnus-uu-decode-unshar-and-save
4896 Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}).
4897
4898 @item X v s
4899 @kindex X v s (Summary)
4900 @findex gnus-uu-decode-unshar-view
4901 Unshars and views the current series (@code{gnus-uu-decode-unshar-view}).
4902
4903 @item X v S
4904 @kindex X v S (Summary)
4905 @findex gnus-uu-decode-unshar-and-save-view
4906 Unshars, views and saves the current series
4907 (@code{gnus-uu-decode-unshar-and-save-view}). 
4908 @end table
4909
4910
4911 @node PostScript Files
4912 @subsection PostScript Files
4913 @cindex PostScript
4914
4915 @table @kbd
4916
4917 @item X p
4918 @kindex X p (Summary)
4919 @findex gnus-uu-decode-postscript
4920 Unpack the current PostScript series (@code{gnus-uu-decode-postscript}).
4921
4922 @item X P
4923 @kindex X P (Summary)
4924 @findex gnus-uu-decode-postscript-and-save
4925 Unpack and save the current PostScript series
4926 (@code{gnus-uu-decode-postscript-and-save}).
4927
4928 @item X v p
4929 @kindex X v p (Summary)
4930 @findex gnus-uu-decode-postscript-view
4931 View the current PostScript series
4932 (@code{gnus-uu-decode-postscript-view}).
4933
4934 @item X v P
4935 @kindex X v P (Summary)
4936 @findex gnus-uu-decode-postscript-and-save-view
4937 View and save the current PostScript series
4938 (@code{gnus-uu-decode-postscript-and-save-view}). 
4939 @end table
4940
4941
4942 @node Decoding Variables
4943 @subsection Decoding Variables
4944
4945 Adjective, not verb.
4946
4947 @menu 
4948 * Rule Variables::          Variables that say how a file is to be viewed.
4949 * Other Decode Variables::  Other decode variables.
4950 * Uuencoding and Posting::  Variables for customizing uuencoding.
4951 @end menu
4952
4953
4954 @node Rule Variables
4955 @subsubsection Rule Variables
4956 @cindex rule variables
4957
4958 Gnus uses @dfn{rule variables} to decide how to view a file.  All these
4959 variables are on the form
4960   
4961 @lisp
4962       (list '(regexp1 command2)
4963             '(regexp2 command2)
4964             ...)
4965 @end lisp
4966
4967 @table @code
4968
4969 @item gnus-uu-user-view-rules
4970 @vindex gnus-uu-user-view-rules
4971 @cindex sox
4972 This variable is consulted first when viewing files.  If you wish to use,
4973 for instance, @code{sox} to convert an @samp{.au} sound file, you could
4974 say something like:
4975 @lisp
4976        (setq gnus-uu-user-view-rules
4977          (list '(\"\\\\.au$\" \"sox %s -t .aiff > /dev/audio\")))
4978 @end lisp
4979
4980 @item gnus-uu-user-view-rules-end
4981 @vindex gnus-uu-user-view-rules-end
4982 This variable is consulted if Gnus couldn't make any matches from the
4983 user and default view rules.
4984
4985 @item gnus-uu-user-archive-rules
4986 @vindex gnus-uu-user-archive-rules
4987 This variable can be used to say what commands should be used to unpack
4988 archives.
4989 @end table
4990
4991
4992 @node Other Decode Variables
4993 @subsubsection Other Decode Variables
4994
4995 @table @code
4996 @vindex gnus-uu-grabbed-file-functions
4997
4998 @item gnus-uu-grabbed-file-functions
4999 All functions in this list will be called right each file has been
5000 successfully decoded---so that you can move or view files right away,
5001 and don't have to wait for all files to be decoded before you can do
5002 anything.  Ready-made functions you can put in this list are:
5003
5004 @table @code
5005
5006 @item gnus-uu-grab-view
5007 @findex gnus-uu-grab-view
5008 View the file.
5009
5010 @item gnus-uu-grab-move
5011 @findex gnus-uu-grab-move
5012 Move the file (if you're using a saving function.)
5013 @end table
5014
5015 @item gnus-uu-ignore-files-by-name
5016 @vindex gnus-uu-ignore-files-by-name
5017 Files with name matching this regular expression won't be viewed.
5018
5019 @item gnus-uu-ignore-files-by-type
5020 @vindex gnus-uu-ignore-files-by-type
5021 Files with a @sc{mime} type matching this variable won't be viewed.
5022 Note that Gnus tries to guess what type the file is based on the name.
5023 @code{gnus-uu} is not a @sc{mime} package (yet), so this is slightly
5024 kludgey.
5025
5026 @item gnus-uu-tmp-dir
5027 @vindex gnus-uu-tmp-dir
5028 Where @code{gnus-uu} does its work.
5029
5030 @item gnus-uu-do-not-unpack-archives
5031 @vindex gnus-uu-do-not-unpack-archives
5032 Non-@code{nil} means that @code{gnus-uu} won't peek inside archives
5033 looking for files to display.
5034
5035 @item gnus-uu-view-and-save
5036 @vindex gnus-uu-view-and-save
5037 Non-@code{nil} means that the user will always be asked to save a file
5038 after viewing it.
5039
5040 @item gnus-uu-ignore-default-view-rules
5041 @vindex gnus-uu-ignore-default-view-rules
5042 Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing
5043 rules.
5044
5045 @item gnus-uu-ignore-default-archive-rules
5046 @vindex gnus-uu-ignore-default-archive-rules
5047 Non-@code{nil} means that @code{gnus-uu} will ignore the default archive
5048 unpacking commands.
5049
5050 @item gnus-uu-kill-carriage-return
5051 @vindex gnus-uu-kill-carriage-return
5052 Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns
5053 from articles.
5054
5055 @item gnus-uu-unmark-articles-not-decoded
5056 @vindex gnus-uu-unmark-articles-not-decoded
5057 Non-@code{nil} means that @code{gnus-uu} will mark articles that were
5058 unsuccessfully decoded as unread.
5059
5060 @item gnus-uu-correct-stripped-uucode
5061 @vindex gnus-uu-correct-stripped-uucode
5062 Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix
5063 uuencoded files that have had trailing spaces deleted.
5064
5065 @item gnus-uu-view-with-metamail
5066 @vindex gnus-uu-view-with-metamail
5067 @cindex metamail
5068 Non-@code{nil} means that @code{gnus-uu} will ignore the viewing
5069 commands defined by the rule variables and just fudge a @sc{mime}
5070 content type based on the file name.  The result will be fed to
5071 @code{metamail} for viewing.
5072
5073 @item gnus-uu-save-in-digest
5074 @vindex gnus-uu-save-in-digest
5075 Non-@code{nil} means that @code{gnus-uu}, when asked to save without
5076 decoding, will save in digests.  If this variable is @code{nil},
5077 @code{gnus-uu} will just save everything in a file without any
5078 embellishments.  The digesting almost conforms to RFC1153---no easy way
5079 to specify any meaningful volume and issue numbers were found, so I
5080 simply dropped them.
5081
5082 @end table
5083
5084
5085 @node Uuencoding and Posting
5086 @subsubsection Uuencoding and Posting
5087
5088 @table @code
5089
5090 @item gnus-uu-post-include-before-composing
5091 @vindex gnus-uu-post-include-before-composing
5092 Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode
5093 before you compose the article.  If this variable is @code{t}, you can
5094 either include an encoded file with @kbd{C-c C-i} or have one included
5095 for you when you post the article.
5096
5097 @item gnus-uu-post-length
5098 @vindex gnus-uu-post-length
5099 Maximum length of an article.  The encoded file will be split into how
5100 many articles it takes to post the entire file.
5101
5102 @item gnus-uu-post-threaded
5103 @vindex gnus-uu-post-threaded
5104 Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a
5105 thread.  This may not be smart, as no other decoder I have seen are able
5106 to follow threads when collecting uuencoded articles.  (Well, I have
5107 seen one package that does that---@code{gnus-uu}, but somehow, I don't
5108 think that counts...) Default is @code{nil}.
5109
5110 @item gnus-uu-post-separate-description
5111 @vindex gnus-uu-post-separate-description
5112 Non-@code{nil} means that the description will be posted in a separate
5113 article.  The first article will typically be numbered (0/x).  If this
5114 variable is @code{nil}, the description the user enters will be included
5115 at the beginning of the first article, which will be numbered (1/x).
5116 Default is @code{t}.
5117
5118 @end table
5119
5120
5121 @node Viewing Files
5122 @subsection Viewing Files
5123 @cindex viewing files
5124 @cindex pseudo-articles
5125
5126 After decoding, if the file is some sort of archive, Gnus will attempt
5127 to unpack the archive and see if any of the files in the archive can be
5128 viewed.  For instance, if you have a gzipped tar file @file{pics.tar.gz}
5129 containing the files @file{pic1.jpg} and @file{pic2.gif}, Gnus will
5130 uncompress and de-tar the main file, and then view the two pictures.
5131 This unpacking process is recursive, so if the archive contains archives
5132 of archives, it'll all be unpacked.
5133
5134 Finally, Gnus will normally insert a @dfn{pseudo-article} for each
5135 extracted file into the summary buffer.  If you go to these
5136 ``articles'', you will be prompted for a command to run (usually Gnus
5137 will make a suggestion), and then the command will be run.
5138
5139 @vindex gnus-view-pseudo-asynchronously
5140 If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait
5141 until the viewing is done before proceeding.
5142
5143 @vindex gnus-view-pseudos
5144 If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert
5145 the pseudo-articles into the summary buffer, but view them
5146 immediately.  If this variable is @code{not-confirm}, the user won't even
5147 be asked for a confirmation before viewing is done.
5148
5149 @vindex gnus-view-pseudos-separately 
5150 If @code{gnus-view-pseudos-separately} is non-@code{nil}, one
5151 pseudo-article will be created for each file to be viewed.  If
5152 @code{nil}, all files that use the same viewing command will be given as
5153 a list of parameters to that command.
5154
5155 @vindex gnus-insert-pseudo-articles
5156 If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert
5157 pseudo-articles when decoding.  It is @code{t} by default.
5158
5159 So; there you are, reading your @emph{pseudo-articles} in your
5160 @emph{virtual newsgroup} from the @emph{virtual server}; and you think:
5161 Why isn't anything real anymore? How did we get here?
5162
5163
5164 @node Article Treatment
5165 @section Article Treatment
5166
5167 Reading through this huge manual, you may have quite forgotten that the
5168 object of newsreaders are to actually, like, read what people have
5169 written.  Reading articles.  Unfortunately, people are quite bad at
5170 writing, so there are tons of functions and variables to make reading
5171 these articles easier.
5172
5173 @menu
5174 * Article Highlighting::    You want to make the article look like fruit salad.
5175 * Article Hiding::          You also want to make certain info go away.
5176 * Article Washing::         Lots of way-neat functions to make life better.
5177 * Article Buttons::         Click on URLs, Message-IDs, addresses and the like.
5178 * Article Date::            Grumble, UT!
5179 * Article Signature::       What is a signature?
5180 @end menu
5181
5182
5183 @node Article Highlighting
5184 @subsection Article Highlighting
5185 @cindex highlight
5186
5187 Not only do you want your article buffer to look like fruit salad, but
5188 you want it to look like technicolor fruit salad.
5189
5190 @table @kbd
5191
5192 @item W H a
5193 @kindex W H a (Summary)
5194 @findex gnus-article-highlight
5195 Highlight the current article (@code{gnus-article-highlight}).
5196
5197 @item W H h
5198 @kindex W H h (Summary)
5199 @findex gnus-article-highlight-headers
5200 @vindex gnus-header-face-alist
5201 Highlight the headers (@code{gnus-article-highlight-headers}).  The
5202 highlighting will be done according to the @code{gnus-header-face-alist}
5203 variable, which is a list where each element has the form @var{(regexp
5204 name content)}.  @var{regexp} is a regular expression for matching the
5205 header, @var{name} is the face used for highlighting the header name and
5206 @var{content} is the face for highlighting the header value.  The first
5207 match made will be used.  Note that @var{regexp} shouldn't have @samp{^}
5208 prepended---Gnus will add one.
5209
5210 @item W H c
5211 @kindex W H c (Summary)
5212 @findex gnus-article-highlight-citation
5213 Highlight cited text (@code{gnus-article-highlight-citation}). 
5214
5215 Some variables to customize the citation highlights:
5216
5217 @table @code
5218 @vindex gnus-cite-parse-max-size
5219
5220 @item gnus-cite-parse-max-size
5221 If the article size if bigger than this variable (which is 25000 by
5222 default), no citation highlighting will be performed.  
5223
5224 @item gnus-cite-prefix-regexp
5225 @vindex gnus-cite-prefix-regexp
5226 Regexp matching the longest possible citation prefix on a line. 
5227
5228 @item gnus-cite-max-prefix
5229 @vindex gnus-cite-max-prefix
5230 Maximum possible length for a citation prefix (default 20).
5231
5232 @item gnus-cite-face-list
5233 @vindex gnus-cite-face-list
5234 List of faces used for highlighting citations.  When there are citations
5235 from multiple articles in the same message, Gnus will try to give each
5236 citation from each article its own face.  This should make it easier to
5237 see who wrote what.
5238
5239 @item gnus-supercite-regexp
5240 @vindex gnus-supercite-regexp
5241 Regexp matching normal Supercite attribution lines.  
5242
5243 @item gnus-supercite-secondary-regexp
5244 @vindex gnus-supercite-secondary-regexp
5245 Regexp matching mangled Supercite attribution lines.
5246
5247 @item gnus-cite-minimum-match-count
5248 @vindex gnus-cite-minimum-match-count
5249 Minimum number of identical prefixes we have to see before we believe
5250 that it's a citation.
5251
5252 @item gnus-cite-attribution-prefix
5253 @vindex gnus-cite-attribution-prefix
5254 Regexp matching the beginning of an attribution line.
5255
5256 @item gnus-cite-attribution-suffix
5257 @vindex gnus-cite-attribution-suffix
5258 Regexp matching the end of an attribution line.
5259
5260 @item gnus-cite-attribution-face
5261 @vindex gnus-cite-attribution-face
5262 Face used for attribution lines.  It is merged with the face for the
5263 cited text belonging to the attribution.
5264
5265 @end table
5266
5267
5268 @item W H s
5269 @kindex W H s (Summary)
5270 @vindex gnus-signature-separator
5271 @vindex gnus-signature-face
5272 @findex gnus-article-highlight-signature
5273 Highlight the signature (@code{gnus-article-highlight-signature}).
5274 Everything after @code{gnus-signature-separator} (@pxref{Article
5275 Signature}) in an article will be considered a signature and will be
5276 highlighted with @code{gnus-signature-face}, which is @code{italic} by
5277 default.
5278
5279 @end table
5280
5281
5282 @node Article Hiding
5283 @subsection Article Hiding
5284 @cindex article hiding
5285
5286 Or rather, hiding certain things in each article.  There usually is much
5287 too much cruft in most articles.  
5288
5289 @table @kbd
5290
5291 @item W W a
5292 @kindex W W a (Summary)
5293 @findex gnus-article-hide
5294 Do maximum hiding on the summary buffer (@kbd{gnus-article-hide}). 
5295
5296 @item W W h
5297 @kindex W W h (Summary)
5298 @findex gnus-article-hide-headers
5299 Hide headers (@code{gnus-article-hide-headers}).  @xref{Hiding
5300 Headers}. 
5301
5302 @item W W b
5303 @kindex W W b (Summary)
5304 @findex gnus-article-hide-boring-headers
5305 Hide headers that aren't particularly interesting
5306 (@code{gnus-article-hide-boring-headers}).  @xref{Hiding Headers}.
5307
5308 @item W W s
5309 @kindex W W s (Summary)
5310 @findex gnus-article-hide-signature
5311 Hide signature (@code{gnus-article-hide-signature}).  @xref{Article
5312 Signature}. 
5313
5314 @item W W p
5315 @kindex W W p (Summary)
5316 @findex gnus-article-hide-pgp
5317 Hide @sc{pgp} signatures (@code{gnus-article-hide-pgp}). 
5318
5319 @item W W P
5320 @kindex W W P (Summary)
5321 @findex gnus-article-hide-pem
5322 Hide @sc{pem} (privacy enhavnced hessages) gruft
5323 (@code{gnus-article-hide-pem}).
5324
5325 @item W W c
5326 @kindex W W c (Summary)
5327 @findex gnus-article-hide-citation
5328 Hide citation (@code{gnus-article-hide-citation}).  Some variables for
5329 customizing the hiding:
5330
5331 @table @code
5332
5333 @item gnus-cite-hide-percentage
5334 @vindex gnus-cite-hide-percentage
5335 If the cited text is of a bigger percentage than this variable (default
5336 50), hide the cited text.
5337
5338 @item gnus-cite-hide-absolute
5339 @vindex gnus-cite-hide-absolute
5340 The cited text must be have at least this length (default 10) before it
5341 is hidden.
5342
5343 @item gnus-cited-text-button-line-format
5344 @vindex gnus-cited-text-button-line-format
5345 Gnus adds buttons show where the cited text has been hidden, and to
5346 allow toggle hiding the text.  The format of the variable is specified
5347 by this format-like variable (@pxref{Formatting Variables}).  These
5348 specs are legal:
5349
5350 @table @samp
5351 @item b
5352 Start point of the hidden text.
5353 @item e
5354 End point of the hidden text.
5355 @item l
5356 Length of the hidden text.
5357 @end table
5358
5359 @item gnus-cited-lines-visible
5360 @vindex gnus-cited-lines-visible
5361 The number of lines at the beginning of the cited text to leave shown. 
5362
5363 @end table
5364
5365 @item W W C
5366 @kindex W W C (Summary)
5367 @findex gnus-article-hide-citation-in-followups
5368 Hide cited text in articles that aren't roots
5369 (@code{gnus-article-hide-citation-in-followups}).  This isn't very
5370 useful as an interactive command, but might be a handy function to stick
5371 in @code{gnus-article-display-hook} (@pxref{Customizing Articles}). 
5372
5373 @end table
5374
5375 All these ``hiding'' commands are toggles, but if you give a negative
5376 prefix to these commands, they will show what they have previously
5377 hidden.  If you give a positive prefix, they will always hide.
5378
5379 Also @pxref{Article Highlighting} for further variables for
5380 citation customization.
5381
5382
5383 @node Article Washing
5384 @subsection Article Washing
5385 @cindex washing
5386 @cindex article washing
5387
5388 We call this ``article washing'' for a really good reason.  Namely, the
5389 @kbd{A} key was taken, so we had to use the @kbd{W} key instead.
5390
5391 @dfn{Washing} is defined by us as ``changing something from something to
5392 something else'', but normally results in something looking better.
5393 Cleaner, perhaps.
5394
5395 @table @kbd
5396
5397 @item W l
5398 @kindex W l (Summary)
5399 @findex gnus-summary-stop-page-breaking
5400 Remove page breaks from the current article
5401 (@code{gnus-summary-stop-page-breaking}).
5402
5403 @item W r
5404 @kindex W r (Summary)
5405 @findex gnus-summary-caesar-message
5406 Do a Caesar rotate (rot13) on the article buffer
5407 (@code{gnus-summary-caesar-message}). 
5408
5409 @item W t
5410 @kindex W t (Summary)
5411 @findex gnus-summary-toggle-header
5412 Toggle whether to display all headers in the article buffer
5413 (@code{gnus-summary-toggle-header}). 
5414
5415 @item W v
5416 @kindex W v (Summary)
5417 @findex gnus-summary-verbose-header
5418 Toggle whether to display all headers in the article buffer permanently
5419 (@code{gnus-summary-verbose-header}).
5420
5421 @item W m
5422 @kindex W m (Summary)
5423 @findex gnus-summary-toggle-mime
5424 Toggle whether to run the article through @sc{mime} before displaying
5425 (@code{gnus-summary-toggle-mime}).
5426
5427 @item W o
5428 @kindex W o (Summary)
5429 @findex gnus-article-treat-overstrike
5430 Treat overstrike (@code{gnus-article-treat-overstrike}).
5431
5432 @item W w
5433 @kindex W w (Summary)
5434 @findex gnus-article-fill-cited-article
5435 Do word wrap (@code{gnus-article-fill-cited-article}).  If you use this
5436 function in @code{gnus-article-display-hook}, it should be run fairly
5437 late and certainly after any highlighting.
5438
5439 @item W c
5440 @kindex W c (Summary)
5441 @findex gnus-article-remove-cr
5442 Remove CR (@code{gnus-article-remove-cr}).
5443
5444 @item W q
5445 @kindex W q (Summary)
5446 @findex gnus-article-de-quoted-unreadable
5447 Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}).
5448
5449 @item W f
5450 @kindex W f (Summary)
5451 @cindex x-face
5452 @findex gnus-article-display-x-face
5453 @findex gnus-article-x-face-command
5454 @vindex gnus-article-x-face-command
5455 @vindex gnus-article-x-face-too-ugly
5456 Look for and display any X-Face headers
5457 (@code{gnus-article-display-x-face}).  The command executed by this
5458 function is given by the @code{gnus-article-x-face-command} variable.
5459 If this variable is a string, this string will be executed in a
5460 sub-shell.  If it is a function, this function will be called with the
5461 face as the argument.  If the @code{gnus-article-x-face-too-ugly} (which
5462 is a regexp) matches the @code{From} header, the face will not be shown.
5463 The default action under Emacs is to fork off an @code{xv} to view the
5464 face; under XEmacs the default action is to display the face before the
5465 @code{From} header.  (It's nicer if XEmacs has been compiled with X-Face
5466 support---that will make display somewhat faster.  If there's no native
5467 X-Face support, Gnus will try to convert the @code{X-Face} header using
5468 external programs from the @code{pbmplus} package and friends.)  If you
5469 want to have this function in the display hook, it should probably come
5470 last.
5471
5472 @item W b
5473 @kindex W b (Summary)
5474 @findex gnus-article-add-buttons
5475 Add clickable buttons to the article (@code{gnus-article-add-buttons}). 
5476
5477 @item W B
5478 @kindex W B (Summary)
5479 @findex gnus-article-add-buttons-to-head
5480 Add clickable buttons to the article headers
5481 (@code{gnus-article-add-buttons-to-head}).  
5482
5483 @item W E l
5484 @kindex W E l (Summary)
5485 @findex gnus-article-strip-leading-blank-lines
5486 Remove all blank lines from the beginning of the article
5487 (@code{gnus-article-strip-leading-blank-lines}).
5488
5489 @item W E m
5490 @kindex W E m (Summary)
5491 @findex gnus-article-strip-multiple-blank-lines
5492 Replace all blank lines with empty lines and then all multiple empty
5493 lines with a single empty line.
5494 (@code{gnus-article-strip-multiple-blank-lines}).
5495
5496 @item W E t
5497 @kindex W E t (Summary)
5498 @findex gnus-article-remove-trailing-blank-lines
5499 Remove all blank lines at the end of the article
5500 (@code{gnus-article-remove-trailing-blank-lines}).
5501
5502 @item W E a
5503 @kindex W E a (Summary)
5504 @findex gnus-article-strip-blank-lines
5505 Do all the three commands above
5506 (@code{gnus-article-strip-blank-lines}).
5507
5508 @end table
5509
5510
5511 @node Article Buttons
5512 @subsection Article Buttons
5513 @cindex buttons
5514
5515 People often include references to other stuff in articles, and it would
5516 be nice if Gnus could just fetch whatever it is that people talk about
5517 with the minimum of fuzz.
5518
5519 Gnus adds @dfn{buttons} to certain standard references by default:
5520 Well-formed URLs, mail addresses and Message-IDs.  This is controlled by
5521 two variables, one that handles article bodies and one that handles
5522 article heads:
5523
5524 @table @code
5525
5526 @item gnus-button-alist
5527 @vindex gnus-button-alist
5528 This is an alist where each entry has this form:
5529
5530 @lisp
5531 (REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
5532 @end lisp
5533
5534 @table @var
5535
5536 @item regexp
5537 All text that match this regular expression will be considered an
5538 external reference.  Here's a typical regexp that match embedded URLs:
5539 @samp{<URL:\\([^\n\r>]*\\)>}. 
5540
5541 @item button-par
5542 Gnus has to know which parts of the match is to be highlighted.  This is
5543 a number that says what sub-expression of the regexp that is to be
5544 highlighted.  If you want it all highlighted, you use @code{0} here.
5545
5546 @item use-p
5547 This form will be @code{eval}ed, and if the result is non-@code{nil},
5548 this is considered a match.  This is useful if you want extra sifting to
5549 avoid false matches.
5550
5551 @item function
5552 This function will be called when you click on this button.
5553
5554 @item data-par
5555 As with @var{button-par}, this is a sub-expression number, but this one
5556 says which part of the match is to be sent as data to @var{function}. 
5557
5558 @end table
5559
5560 So the full entry for buttonizing URLs is then
5561
5562 @lisp
5563 ("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)
5564 @end lisp
5565
5566 @item gnus-header-button-alist
5567 @vindex gnus-header-button-alist
5568 This is just like the other alist, except that it is applied to the
5569 article head only, and that each entry has an additional element that is
5570 used to say what headers to apply the buttonize coding to:
5571
5572 @lisp
5573 (HEADER REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR)
5574 @end lisp
5575
5576 @var{header} is a regular expression.
5577
5578 @item gnus-button-url-regexp
5579 @vindex gnus-button-url-regexp
5580 A regular expression that matches embedded URLs.  It is used in the
5581 default values of the variables above.
5582
5583 @item gnus-article-button-face
5584 @vindex gnus-article-button-face
5585 Face used on bottons.
5586
5587 @item gnus-article-mouse-face
5588 @vindex gnus-article-mouse-face
5589 Face is used when the mouse cursor is over a button.
5590
5591 @end table
5592
5593
5594 @node Article Date
5595 @subsection Article Date
5596
5597 The date is most likely generated in some obscure timezone you've never
5598 heard of, so it's quite nice to be able to find out what the time was
5599 when the article was sent.
5600
5601 @table @kbd
5602
5603 @item W T u
5604 @kindex W T u (Summary)
5605 @findex gnus-article-date-ut
5606 Display the date in UT (aka. GMT, aka ZULU)
5607 (@code{gnus-article-date-ut}). 
5608
5609 @item W T l
5610 @kindex W T l (Summary)
5611 @findex gnus-article-date-local
5612 Display the date in the local timezone (@code{gnus-article-date-local}).
5613
5614 @item W T e
5615 @kindex W T e (Summary)
5616 @findex gnus-article-date-lapsed
5617 Say how much time has (e)lapsed between the article was posted and now
5618 (@code{gnus-article-date-lapsed}).
5619
5620 @item W T o
5621 @kindex W T o (Summary)
5622 @findex gnus-article-date-original
5623 Display the original date (@code{gnus-article-date-original}).  This can
5624 be useful if you normally use some other conversion function and is
5625 worried that it might be doing something totally wrong.  Say, claiming
5626 that the article was posted in 1854.  Although something like that is
5627 @emph{totally} impossible.  Don't you trust me? *titter*
5628
5629 @end table
5630
5631
5632 @node Article Signature
5633 @subsection Article Signature
5634 @cindex signatures
5635 @cindex article signature
5636
5637 @vindex gnus-signature-separator
5638 Each article is divided into two parts---the head and the body.  The
5639 body can be divided into a signature part and a text part.  The variable
5640 that says what is to be considered a signature is
5641 @code{gnus-signature-separator}.  This is normally the standard
5642 @samp{"^-- $"} as mandated by son-of-RFC 1036.  However, many people use
5643 non-standard signature separators, so this variable can also be a list
5644 of regular expressions to be tested, one by one.  (Searches are done
5645 from the end of the body towards the beginning.)  One likely value is:
5646
5647 @lisp
5648 (setq gnus-signature-separator
5649       '("^-- $"         ; The standard
5650         "^-- *$"        ; A common mangling
5651         "^-------*$"    ; Many people just use a looong 
5652                         ; line of dashes.  Shame!
5653         "^ *--------*$" ; Double-shame!
5654         "^________*$"   ; Underscores are also popular
5655         "^========*$")) ; Pervert!
5656 @end lisp
5657
5658 The more permissive you are, the more likely it is that you'll get false
5659 positives.
5660
5661 @vindex gnus-signature-limit
5662 @code{gnus-signature-limit} provides a limit to what is considered a
5663 signature. 
5664
5665 @enumerate
5666 @item 
5667 If it is an integer, no signature may be longer (in characters) than
5668 that integer.
5669 @item 
5670 If it is a floating point number, no signature may be longer (in lines)
5671 than that number.
5672 @item 
5673 If it is a function, the function will be called without any parameters,
5674 and if it returns @code{nil}, there is no signature in the buffer.
5675 @item
5676 If it is a string, it will be used as a regexp.  If it matches, the text
5677 in question is not a signature.
5678 @end enumerate
5679
5680 This variable can also be a list where the elements may be of the types
5681 listed above.  
5682
5683
5684 @node Summary Sorting
5685 @section Summary Sorting
5686 @cindex summary sorting
5687
5688 You can have the summary buffer sorted in various ways, even though I
5689 can't really see why you'd want that.
5690
5691 @table @kbd
5692
5693 @item C-c C-s C-n
5694 @kindex C-c C-s C-n (Summary)
5695 @findex gnus-summary-sort-by-number
5696 Sort by article number (@code{gnus-summary-sort-by-number}).
5697
5698 @item C-c C-s C-a
5699 @kindex C-c C-s C-a (Summary)
5700 @findex gnus-summary-sort-by-author
5701 Sort by author (@code{gnus-summary-sort-by-author}).
5702
5703 @item C-c C-s C-s
5704 @kindex C-c C-s C-s (Summary)
5705 @findex gnus-summary-sort-by-subject
5706 Sort by subject (@code{gnus-summary-sort-by-subject}).
5707
5708 @item C-c C-s C-d
5709 @kindex C-c C-s C-d (Summary)
5710 @findex gnus-summary-sort-by-date
5711 Sort by date (@code{gnus-summary-sort-by-date}).
5712
5713 @item C-c C-s C-i
5714 @kindex C-c C-s C-i (Summary)
5715 @findex gnus-summary-sort-by-score
5716 Sort by score (@code{gnus-summary-sort-by-score}).
5717 @end table
5718
5719 These functions will work both when you use threading and when you don't
5720 use threading.  In the latter case, all summary lines will be sorted,
5721 line by line.  In the former case, sorting will be done on a
5722 root-by-root basis, which might not be what you were looking for.  To
5723 toggle whether to use threading, type @kbd{T T} (@pxref{Thread
5724 Commands}).
5725
5726
5727 @node Finding the Parent
5728 @section Finding the Parent
5729 @cindex parent articles
5730 @cindex referring articles
5731
5732 @findex gnus-summary-refer-parent-article
5733 @kindex ^ (Summary)
5734 If you'd like to read the parent of the current article, and it is not
5735 displayed in the summary buffer, you might still be able to.  That is,
5736 if the current group is fetched by @sc{nntp}, the parent hasn't expired
5737 and the @code{References} in the current article are not mangled, you
5738 can just press @kbd{^} or @kbd{A r}
5739 (@code{gnus-summary-refer-parent-article}).  If everything goes well,
5740 you'll get the parent.  If the parent is already displayed in the
5741 summary buffer, point will just move to this article.
5742
5743 If given a positive numerical prefix, fetch that many articles back into
5744 the ancestry.  If given a negative numerical prefix, fetch just that
5745 ancestor.  So if you say @kbd{3 ^}, Gnus will fetch the parent, the
5746 grandparent and the grandgrandparent of the current article.  If you say
5747 @kbd{-3 ^}, Gnus will only fetch the grandgrandparent of the current
5748 article. 
5749
5750 @findex gnus-summary-refer-references
5751 @kindex A R (Summary)
5752 You can have Gnus fetch all articles mentioned in the @code{References}
5753 header of the article by pushing @kbd{A R}
5754 (@code{gnus-summary-refer-references}). 
5755
5756 @findex gnus-summary-refer-article
5757 @kindex M-^ (Summary)
5758 You can also ask the @sc{nntp} server for an arbitrary article, no
5759 matter what group it belongs to.  @kbd{M-^}
5760 (@code{gnus-summary-refer-article}) will ask you for a
5761 @code{Message-ID}, which is one of those long thingies that look
5762 something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}.  You have to get
5763 it all exactly right.  No fuzzy searches, I'm afraid.
5764
5765 @vindex gnus-refer-article-method
5766 If the group you are reading is located on a backend that does not
5767 support fetching by @code{Message-ID} very well (like @code{nnspool}),
5768 you can set @code{gnus-refer-article-method} to an @sc{nntp} method.  It
5769 would, perhaps, be best if the @sc{nntp} server you consult is the same
5770 as the one that keeps the spool you are reading from updated, but that's
5771 not really necessary.
5772
5773 Most of the mail backends support fetching by @code{Message-ID}, but do
5774 not do a particularly excellent job of it.  That is, @code{nnmbox} and
5775 @code{nnbabyl} are able to locate articles from any groups, while
5776 @code{nnml} and @code{nnfolder} are only able to locate articles that
5777 have been posted to the current group.  (Anything else would be too time
5778 consuming.)  @code{nnmh} does not support this at all.
5779
5780
5781 @node Alternative Approaches
5782 @section Alternative Approaches
5783
5784 Different people like to read news using different methods.  This being
5785 Gnus, we offer a small selection of minor modes for the summary buffers.
5786
5787 @menu
5788 * Pick and Read::               First mark articles and then read them.
5789 * Binary Groups::               Auto-decode all articles.
5790 @end menu
5791
5792
5793 @node Pick and Read
5794 @subsection Pick and Read
5795 @cindex pick and read
5796
5797 Some newsreaders (like @code{nn} and, uhm, @code{nn}) use a two-phased
5798 reading interface.  The user first marks the articles she wants to read
5799 from a summary buffer.  Then she starts reading the articles with just
5800 an article buffer displayed.
5801
5802 @findex gnus-pick-mode
5803 @kindex M-x gnus-pick-mode
5804 Gnus provides a summary buffer minor mode that allows
5805 this---@code{gnus-pick-mode}.  This basically means that a few process
5806 mark commands become one-keystroke commands to allow easy marking, and
5807 it makes one additional command for switching to the summary buffer
5808 available. 
5809
5810 Here are the available keystrokes when using pick mode:
5811
5812 @table @kbd
5813 @item .
5814 @kindex . (Pick)
5815 @findex gnus-summary-mark-as-processable
5816 Pick the article on the current line
5817 (@code{gnus-summary-mark-as-processable}).  If given a numerical prefix,
5818 go to the article on that line and pick that article.  (The line number
5819 is normally displayed on the beginning of the summary pick lines.)
5820
5821 @item SPACE
5822 @kindex SPACE (Pick)
5823 @findex gnus-pick-next-page
5824 Scroll the summary buffer up one page (@code{gnus-pick-next-page}).  If
5825 at the end of the buffer, start reading the picked articles.
5826
5827 @item u
5828 @kindex u (Pick)
5829 @findex gnus-summary-unmark-as-processable
5830 Unpick the article (@code{gnus-summary-unmark-as-processable}). 
5831
5832 @item U
5833 @kindex U (Pick)
5834 @findex gnus-summary-unmark-all-processable
5835 Unpick all articles (@code{gnus-summary-unmark-all-processable}). 
5836
5837 @item t
5838 @kindex t (Pick)
5839 @findex gnus-uu-mark-thread
5840 Pick the thread (@code{gnus-uu-mark-thread}). 
5841
5842 @item T
5843 @kindex T (Pick)
5844 @findex gnus-uu-unmark-thread
5845 Unpick the thread (@code{gnus-uu-unmark-thread}). 
5846
5847 @item r
5848 @kindex r (Pick)
5849 @findex gnus-uu-mark-region
5850 Pick the region (@code{gnus-uu-mark-region}). 
5851
5852 @item R
5853 @kindex R (Pick)
5854 @findex gnus-uu-unmark-region
5855 Unpick the region (@code{gnus-uu-unmark-region}). 
5856
5857 @item e
5858 @kindex e (Pick)
5859 @findex gnus-uu-mark-by-regexp
5860 Pick articles that match a regexp (@code{gnus-uu-mark-by-regexp}). 
5861
5862 @item E
5863 @kindex E (Pick)
5864 @findex gnus-uu-unmark-by-regexp
5865 Unpick articles that match a regexp (@code{gnus-uu-unmark-by-regexp}). 
5866
5867 @item b
5868 @kindex b (Pick)
5869 @findex gnus-uu-mark-buffer
5870 Pick the buffer (@code{gnus-uu-mark-buffer}). 
5871
5872 @item B
5873 @kindex B (Pick)
5874 @findex gnus-uu-unmark-buffer
5875 Unpick the buffer (@code{gnus-uu-unmark-buffer}). 
5876
5877 @item RET
5878 @kindex RET (Pick)
5879 @findex gnus-pick-start-reading
5880 @vindex gnus-pick-display-summary
5881 Start reading the picked articles (@code{gnus-pick-start-reading}).  If
5882 given a prefix, mark all unpicked articles as read first.  If
5883 @code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer
5884 will still be visible when you are reading.
5885
5886 @end table
5887
5888 If this sounds like a good idea to you, you could say:
5889
5890 @lisp
5891 (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
5892 @end lisp
5893
5894 @vindex gnus-pick-mode-hook
5895 @code{gnus-pick-mode-hook} is run in pick minor mode buffers.
5896
5897 @vindex gnus-mark-unpicked-articles-as-read
5898 If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark
5899 all unpicked articles as read.  The default is @code{nil}.
5900
5901 @vindex gnus-summary-pick-line-format
5902 The summary line format in pick mode is slightly different than the
5903 standard format.  At the beginning of each line the line number is
5904 displayed.  The pick mode line format is controlled by the
5905 @code{gnus-summary-pick-line-format} variable (@pxref{Formatting
5906 Variables}).  It accepts the same format specs that
5907 @code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}). 
5908
5909
5910 @node Binary Groups
5911 @subsection Binary Groups
5912 @cindex binary groups
5913
5914 @findex gnus-binary-mode
5915 @kindex M-x gnus-binary-mode
5916 If you spend much time in binary groups, you may grow tired of hitting
5917 @kbd{X u}, @kbd{n}, @kbd{RET} all the time.  @kbd{M-x gnus-binary-mode}
5918 is a minor mode for summary buffers that makes all ordinary Gnus article
5919 selection functions uudecode series of articles and display the result
5920 instead of just displaying the articles the normal way.  
5921
5922 @kindex g (Binary)
5923 @findex gnus-binary-show-article
5924 In fact, the only way to see the actual articles if you have turned this
5925 mode on is the @kbd{g} command (@code{gnus-binary-show-article}). 
5926
5927 @vindex gnus-binary-mode-hook
5928 @code{gnus-binary-mode-hook} is called in binary minor mode buffers.
5929
5930
5931 @node Tree Display
5932 @section Tree Display
5933 @cindex trees
5934
5935 @vindex gnus-use-trees
5936 If you don't like the normal Gnus summary display, you might try setting
5937 @code{gnus-use-trees} to @code{t}.  This will create (by default) an
5938 additional @dfn{tree buffer}.  You can execute all summary mode commands
5939 in the tree buffer.  
5940
5941 There are a few variables to customize the tree display, of course:
5942
5943 @table @code
5944 @item gnus-tree-mode-hook
5945 @vindex gnus-tree-mode-hook
5946 A hook called in all tree mode buffers.
5947
5948 @item gnus-tree-mode-line-format
5949 @vindex gnus-tree-mode-line-format
5950 A format string for the mode bar in the tree mode buffers.  The default
5951 is @samp{Gnus: %%b [%A] %Z}.  For a list of legal specs, @pxref{Summary
5952 Buffer Mode Line}. 
5953
5954 @item gnus-selected-tree-face
5955 @vindex gnus-selected-tree-face
5956 Face used for highlighting the selected article in the tree buffer.  The
5957 default is @code{modeline}.
5958
5959 @item gnus-tree-line-format
5960 @vindex gnus-tree-line-format
5961 A format string for the tree nodes.  The name is a bit of a misnomer,
5962 though---it doesn't define a line, but just the node.  The default value
5963 is @samp{%(%[%3,3n%]%)}, which displays the first three characters of
5964 the name of the poster.  It is vital that all nodes are of the same
5965 length, so you @emph{must} use @samp{%4,4n}-like specifiers.
5966
5967 Legal specs are:
5968
5969 @table @samp
5970 @item n
5971 The name of the poster.
5972 @item f
5973 The @code{From} header.
5974 @item N
5975 The number of the article.
5976 @item [
5977 The opening bracket.
5978 @item ] 
5979 The closing bracket.
5980 @item s
5981 The subject.
5982 @end table
5983
5984 @xref{Formatting Variables}.
5985
5986 Variables related to the display are:
5987
5988 @table @code
5989 @item gnus-tree-brackets
5990 @vindex gnus-tree-brackets
5991 This is used for differentiating between ``real'' articles and
5992 ``sparse'' articles.  The format is @var{((real-open . real-close)
5993 (sparse-open . sparse-close) (dummy-open . dummy-close))}, and the
5994 default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}))}.
5995
5996 @item gnus-tree-parent-child-edges
5997 @vindex gnus-tree-parent-child-edges
5998 This is a list that contains the characters used for connecting parent
5999 nodes to their children.  The default is @code{(?- ?\\ ?|)}. 
6000
6001 @end table
6002
6003 @item gnus-tree-minimize-window
6004 @vindex gnus-tree-minimize-window
6005 If this variable is non-@code{nil}, Gnus will try to keep the tree
6006 buffer as small as possible to allow more room for the other Gnus
6007 windows.  If this variable is a number, the tree buffer will never be
6008 higher than that number.  The default is @code{t}.
6009
6010 @item gnus-generate-tree-function
6011 @vindex gnus-generate-tree-function
6012 @findex gnus-generate-horizontal-tree
6013 @findex gnus-generate-vertical-tree
6014 The function that actually generates the thread tree.  Two predefined
6015 functions are available: @code{gnus-generate-horizontal-tree} and
6016 @code{gnus-generate-vertical-tree} (which is the default).
6017
6018 @end table
6019
6020 Here's and example from a horizontal tree buffer:
6021
6022 @example
6023 @{***@}-(***)-[odd]-[Gun]
6024      |     \[Jan]
6025      |     \[odd]-[Eri]
6026      |     \(***)-[Eri]
6027      |           \[odd]-[Paa]
6028      \[Bjo]
6029      \[Gun]
6030      \[Gun]-[Jor]
6031 @end example
6032
6033 Here's the same thread displayed in a vertical tree buffer:
6034
6035 @example
6036 @{***@}
6037   |--------------------------\-----\-----\
6038 (***)                         [Bjo] [Gun] [Gun]
6039   |--\-----\-----\                          |
6040 [odd] [Jan] [odd] (***)                   [Jor]
6041   |           |     |--\
6042 [Gun]       [Eri] [Eri] [odd]
6043                           |
6044                         [Paa]
6045 @end example
6046
6047
6048 @node Mail Group Commands
6049 @section Mail Group Commands
6050 @cindex mail group commands
6051
6052 Some commands only make sense in mail groups.  If these commands are
6053 illegal in the current group, they will raise a hell and let you know.
6054
6055 All these commands (except the expiry and edit commands) use the
6056 process/prefix convention (@pxref{Process/Prefix}).
6057
6058 @table @kbd
6059
6060 @item B e
6061 @kindex B e (Summary)
6062 @findex gnus-summary-expire-articles
6063 Expire all expirable articles in the group
6064 (@code{gnus-summary-expire-articles}).
6065
6066 @item B M-C-e
6067 @kindex B M-C-e (Summary)
6068 @findex gnus-summary-expire-articles-now
6069 Expunge all the expirable articles in the group
6070 (@code{gnus-summary-expire-articles-now}).  This means that @strong{all}
6071 articles that are eligible for expiry in the current group will
6072 disappear forever into that big @file{/dev/null} in the sky.
6073
6074 @item B DEL
6075 @kindex B DEL (Summary)
6076 @findex gnus-summary-delete-article
6077 Delete the mail article.  This is ``delete'' as in ``delete it from your
6078 disk forever and ever, never to return again.'' Use with caution.
6079 (@code{gnus-summary-delete-article}).
6080
6081 @item B m
6082 @kindex B m (Summary)
6083 @cindex move mail
6084 @findex gnus-summary-move-article
6085 Move the article from one mail group to another
6086 (@code{gnus-summary-move-article}). 
6087
6088 @item B c
6089 @kindex B c (Summary)
6090 @cindex copy mail
6091 @findex gnus-summary-copy-article
6092 Copy the article from one group (mail group or not) to a mail group
6093 (@code{gnus-summary-copy-article}).
6094
6095 @item B C
6096 @kindex B C (Summary)
6097 @cindex crosspost mail
6098 @findex gnus-summary-crosspost-article
6099 Crosspost the current article to some other group
6100 (@code{gnus-summary-crosspost-article}).  This will create a new copy of
6101 the article in the other group, and the Xref headers of the article will
6102 be properly updated.
6103
6104 @item B i
6105 @kindex B i (Summary)
6106 @findex gnus-summary-import-article
6107 Import an arbitrary file into the current mail newsgroup
6108 (@code{gnus-summary-import-article}).  You will be prompted for a file
6109 name, a @code{From} header and a @code{Subject} header.
6110
6111 @item B r
6112 @kindex B r (Summary)
6113 @findex gnus-summary-respool-article
6114 Respool the mail article (@code{gnus-summary-move-article}).
6115
6116 @item B w
6117 @itemx e
6118 @kindex B w (Summary)
6119 @kindex e (Summary)
6120 @findex gnus-summary-edit-article
6121 @kindex C-c C-c (Article)
6122 Edit the current article (@code{gnus-summary-edit-article}).  To finish
6123 editing and make the changes permanent, type @kbd{C-c C-c}
6124 (@kbd{gnus-summary-edit-article-done}).
6125
6126 @item B q
6127 @kindex B q (Summary)
6128 @findex gnus-summary-respool-query
6129 If you want to re-spool an article, you might be curious as to what group
6130 the article will end up in before you do the re-spooling.  This command
6131 will tell you (@code{gnus-summary-respool-query}). 
6132
6133 @item B p
6134 @kindex B p (Summary)
6135 @findex gnus-summary-article-posted-p
6136 Some people have a tendency to send you "courtesy" copies when they
6137 follow up to articles you have posted.  These usually have a
6138 @code{Newsgroups} header in them, but not always.  This command
6139 (@code{gnus-summary-article-posted-p}) will try to fetch the current
6140 article from your news server (or rather, from
6141 @code{gnus-refer-article-method} or @code{gnus-select-method}) and will
6142 report back whether it found the article or not.  Even if it says that
6143 it didn't find the article, it may have been posted anyway---mail
6144 propagation is much faster than news propagation, and the news copy may
6145 just not have arrived yet.
6146
6147 @end table
6148
6149 @vindex gnus-move-split-methods
6150 @cindex moving articles
6151 If you move (or copy) articles regularly, you might wish to have Gnus
6152 suggest where to put the articles.  @code{gnus-move-split-methods} is a
6153 variable that uses the same syntax as @code{gnus-split-methods}
6154 (@pxref{Saving Articles}).  You may customize that variable to create
6155 suggestions you find reasonable.
6156
6157
6158 @node Various Summary Stuff
6159 @section Various Summary Stuff
6160
6161 @menu
6162 * Summary Group Information::         Information oriented commands.
6163 * Searching for Articles::            Multiple article commands.
6164 * Really Various Summary Commands::   Those pesky non-conformant commands.
6165 @end menu
6166
6167 @table @code
6168 @vindex gnus-summary-mode-hook
6169 @item gnus-summary-mode-hook
6170 This hook is called when creating a summary mode buffer.
6171
6172 @vindex gnus-summary-generate-hook
6173 @item gnus-summary-generate-hook
6174 This is called as the last thing before doing the threading and the
6175 generation of the summary buffer.  It's quite convenient for customizing
6176 the threading variables based on what data the newsgroup has.  This hook
6177 is called from the summary buffer after most summary buffer variables
6178 has been set.
6179
6180 @vindex gnus-summary-prepare-hook
6181 @item gnus-summary-prepare-hook
6182 Is is called after the summary buffer has been generated.  You might use
6183 it to, for instance, highlight lines or modify the look of the buffer in
6184 some other ungodly manner.  I don't care.
6185
6186 @end table
6187
6188
6189 @node Summary Group Information
6190 @subsection Summary Group Information
6191
6192 @table @kbd
6193
6194 @item H f
6195 @kindex H f (Summary)
6196 @findex gnus-summary-fetch-faq
6197 @vindex gnus-group-faq-directory
6198 Try to fetch the FAQ (list of frequently asked questions) for the
6199 current group (@code{gnus-summary-fetch-faq}).  Gnus will try to get the
6200 FAQ from @code{gnus-group-faq-directory}, which is usually a directory
6201 on a remote machine.  This variable can also be a list of directories.
6202 In that case, giving a prefix to this command will allow you to choose
6203 between the various sites.  @code{ange-ftp} probably will be used for
6204 fetching the file.
6205
6206 @item H d
6207 @kindex H d (Summary)
6208 @findex gnus-summary-describe-group
6209 Give a brief description of the current group
6210 (@code{gnus-summary-describe-group}).  If given a prefix, force
6211 rereading the description from the server.
6212
6213 @item H h
6214 @kindex H h (Summary)
6215 @findex gnus-summary-describe-briefly
6216 Give a very brief description of the most important summary keystrokes
6217 (@code{gnus-summary-describe-briefly}). 
6218
6219 @item H i
6220 @kindex H i (Summary)
6221 @findex gnus-info-find-node
6222 Go to the Gnus info node (@code{gnus-info-find-node}).
6223 @end table
6224
6225
6226 @node Searching for Articles
6227 @subsection Searching for Articles
6228
6229 @table @kbd
6230
6231 @item M-s
6232 @kindex M-s (Summary)
6233 @findex gnus-summary-search-article-forward
6234 Search through all subsequent articles for a regexp
6235 (@code{gnus-summary-search-article-forward}). 
6236
6237 @item M-r
6238 @kindex M-r (Summary)
6239 @findex gnus-summary-search-article-backward
6240 Search through all previous articles for a regexp
6241 (@code{gnus-summary-search-article-backward}). 
6242
6243 @item &
6244 @kindex & (Summary)
6245 @findex gnus-summary-execute-command
6246 This command will prompt you for a header field, a regular expression to
6247 match on this field, and a command to be executed if the match is made
6248 (@code{gnus-summary-execute-command}).
6249
6250 @item M-&
6251 @kindex M-& (Summary)
6252 @findex gnus-summary-universal-argument
6253 Perform any operation on all articles that have been marked with
6254 the process mark (@code{gnus-summary-universal-argument}).
6255 @end table
6256
6257
6258 @node Really Various Summary Commands
6259 @subsection Really Various Summary Commands
6260
6261 @table @kbd
6262
6263 @item C-d
6264 @kindex C-d (Summary)
6265 @findex gnus-summary-enter-digest-group
6266 If the current article is a collection of other articles (for instance,
6267 a digest), you might use this command to enter a group based on the that
6268 article (@code{gnus-summary-enter-digest-group}).  Gnus will try to
6269 guess what article type is currently displayed unless you give a prefix
6270 to this command, which forces a ``digest'' interpretation.  Basically,
6271 whenever you see a message that is a collection of other messages on
6272 some format, you @kbd{C-d} and read these messages in a more convenient
6273 fashion.
6274
6275 @item M-C-d
6276 @kindex M-C-d (Summary)
6277 @findex gnus-summary-read-document
6278 This command is very similar to the one above, but lets you gather
6279 several documents into one biiig group
6280 (@code{gnus-summary-read-document}).  It does this by opening several
6281 @code{nndoc} groups for each document, and then opening an
6282 @code{nnvirtual} group on top of these @code{nndoc} groups.  This
6283 command understands the process/prefix convention
6284 (@pxref{Process/Prefix}). 
6285
6286 @item C-t
6287 @kindex C-t (Summary)
6288 @findex gnus-summary-toggle-truncation
6289 Toggle truncation of summary lines
6290 (@code{gnus-summary-toggle-truncation}).  This will probably confuse the
6291 line centering function in the summary buffer, so it's not a good idea
6292 to have truncation switched off while reading articles.
6293
6294 @item =
6295 @kindex = (Summary)
6296 @findex gnus-summary-expand-window
6297 Expand the summary buffer window (@code{gnus-summary-expand-window}).
6298 If given a prefix, force an @code{article} window configuration. 
6299 @end table
6300
6301
6302 @node Exiting the Summary Buffer
6303 @section Exiting the Summary Buffer
6304 @cindex summary exit
6305 @cindex exiting groups
6306
6307 Exiting from the summary buffer will normally update all info on the
6308 group and return you to the group buffer. 
6309
6310 @table @kbd
6311
6312 @item Z Z
6313 @itemx q
6314 @kindex Z Z (Summary)
6315 @kindex q (Summary)
6316 @findex gnus-summary-exit
6317 @vindex gnus-summary-exit-hook
6318 @vindex gnus-summary-prepare-exit-hook
6319 Exit the current group and update all information on the group
6320 (@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} is
6321 called before doing much of the exiting, and calls
6322 @code{gnus-summary-expire-articles} by default.
6323 @code{gnus-summary-exit-hook} is called after finishing the exiting
6324 process. 
6325
6326 @item Z E
6327 @itemx Q
6328 @kindex Z E (Summary)
6329 @kindex Q (Summary)
6330 @findex gnus-summary-exit-no-update
6331 Exit the current group without updating any information on the group
6332 (@code{gnus-summary-exit-no-update}).
6333
6334 @item Z c
6335 @itemx c
6336 @kindex Z c (Summary)
6337 @kindex c (Summary)
6338 @findex gnus-summary-catchup-and-exit
6339 Mark all unticked articles in the group as read and then exit
6340 (@code{gnus-summary-catchup-and-exit}).
6341
6342 @item Z C
6343 @kindex Z C (Summary)
6344 @findex gnus-summary-catchup-all-and-exit
6345 Mark all articles, even the ticked ones, as read and then exit
6346 (@code{gnus-summary-catchup-all-and-exit}).
6347
6348 @item Z n
6349 @kindex Z n (Summary)
6350 @findex gnus-summary-catchup-and-goto-next-group
6351 Mark all articles as read and go to the next group
6352 (@code{gnus-summary-catchup-and-goto-next-group}). 
6353
6354 @item Z R
6355 @kindex Z R (Summary)
6356 @findex gnus-summary-reselect-current-group
6357 Exit this group, and then enter it again
6358 (@code{gnus-summary-reselect-current-group}).  If given a prefix, select
6359 all articles, both read and unread.
6360
6361 @item Z G
6362 @itemx M-g
6363 @kindex Z G (Summary)
6364 @kindex M-g (Summary)
6365 @findex gnus-summary-rescan-group
6366 Exit the group, check for new articles in the group, and select the
6367 group (@code{gnus-summary-rescan-group}).  If given a prefix, select all
6368 articles, both read and unread.
6369
6370 @item Z N
6371 @kindex Z N (Summary)
6372 @findex gnus-summary-next-group
6373 Exit the group and go to the next group
6374 (@code{gnus-summary-next-group}). 
6375
6376 @item Z P
6377 @kindex Z P (Summary)
6378 @findex gnus-summary-prev-group
6379 Exit the group and go to the previous group
6380 (@code{gnus-summary-prev-group}). 
6381 @end table
6382
6383 @vindex gnus-exit-group-hook
6384 @code{gnus-exit-group-hook} is called when you exit the current
6385 group.  
6386
6387 @findex gnus-summary-wake-up-the-dead
6388 @findex gnus-dead-summary-mode
6389 @vindex gnus-kill-summary-on-exit
6390 If you're in the habit of exiting groups, and then changing your mind
6391 about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}.
6392 If you do that, Gnus won't kill the summary buffer when you exit it.
6393 (Quelle surprise!)  Instead it will change the name of the buffer to
6394 something like @samp{*Dead Summary ... *} and install a minor mode
6395 called @code{gnus-dead-summary-mode}.  Now, if you switch back to this
6396 buffer, you'll find that all keys are mapped to a function called
6397 @code{gnus-summary-wake-up-the-dead}.  So tapping any keys in a dead
6398 summary buffer will result in a live, normal summary buffer.  
6399
6400 There will never be more than one dead summary buffer at any one time. 
6401
6402 @vindex gnus-use-cross-reference
6403 The data on the current group will be updated (which articles you have
6404 read, which articles you have replied to, etc.) when you exit the
6405 summary buffer.  If the @code{gnus-use-cross-reference} variable is
6406 @code{t} (which is the default), articles that are cross-referenced to
6407 this group and are marked as read, will also be marked as read in the
6408 other subscribed groups they were cross-posted to.  If this variable is
6409 neither @code{nil} nor @code{t}, the article will be marked as read in
6410 both subscribed and unsubscribed groups (@pxref{Crosspost Handling}).
6411
6412
6413 @node Crosspost Handling
6414 @section Crosspost Handling
6415
6416 @cindex velveeta
6417 @cindex spamming
6418 Marking cross-posted articles as read ensures that you'll never have to
6419 read the same article more than once.  Unless, of course, somebody has
6420 posted it to several groups separately.  Posting the same article to
6421 several groups (not cross-posting) is called @dfn{spamming}, and you are
6422 by law required to send nasty-grams to anyone who perpetrates such a
6423 heinous crime.  You may want to try NoCeM handling to filter out spam
6424 (@pxref{NoCeM}). 
6425
6426 Remember: Cross-posting is kinda ok, but posting the same article
6427 separately to several groups is not.  Massive cross-posting (aka.
6428 @dfn{velveeta}) is to be avoided at all costs, and you can even use the
6429 @code{gnus-summary-mail-crosspost-complaint} command to complain about
6430 excessive crossposting (@pxref{Summary Mail Commands}).
6431
6432 @cindex cross-posting
6433 @cindex Xref
6434 @cindex @sc{nov}
6435 One thing that may cause Gnus to not do the cross-posting thing
6436 correctly is if you use an @sc{nntp} server that supports @sc{xover}
6437 (which is very nice, because it speeds things up considerably) which
6438 does not include the @code{Xref} header in its @sc{nov} lines.  This is
6439 Evil, but all too common, alas, alack.  Gnus tries to Do The Right Thing
6440 even with @sc{xover} by registering the @code{Xref} lines of all
6441 articles you actually read, but if you kill the articles, or just mark
6442 them as read without reading them, Gnus will not get a chance to snoop
6443 the @code{Xref} lines out of these articles, and will be unable to use
6444 the cross reference mechanism.
6445
6446 @cindex LIST overview.fmt
6447 @cindex overview.fmt
6448 To check whether your @sc{nntp} server includes the @code{Xref} header
6449 in its overview files, try @samp{telnet your.nntp.server nntp},
6450 @samp{MODE READER} on @code{inn} servers, and then say @samp{LIST
6451 overview.fmt}.  This may not work, but if it does, and the last line you
6452 get does not read @samp{Xref:full}, then you should shout and whine at
6453 your news admin until she includes the @code{Xref} header in the
6454 overview files.
6455
6456 @vindex gnus-nov-is-evil
6457 If you want Gnus to get the @code{Xref}s right all the time, you have to
6458 set @code{gnus-nov-is-evil} to @code{t}, which slows things down
6459 considerably.
6460
6461 C'est la vie.
6462
6463 For an alternative approach, @xref{Duplicate Suppression}.
6464
6465
6466 @node Duplicate Suppression
6467 @section Duplicate Suppression
6468
6469 By default, Gnus tries to make sure that you don't have to read the same
6470 article more than once by utilizing the crossposing mechanism
6471 (@pxref{Crosspost Handling}).  However, that simple and efficient
6472 approach may not work satisfactorily for some users for various
6473 reasons.  
6474
6475 @enumerate
6476 @item 
6477 The @sc{nntp} server may fail to generate the @code{Xref} header.  This
6478 is evil and not very common.
6479
6480 @item 
6481 The @sc{nntp} server may fail to include the @code{Xref} header in the
6482 @file{.overview} data bases.  This is evil and all too common, alas.
6483
6484 @item
6485 You may be reading the same group (or several related groups) from
6486 different @sc{nntp} servers.
6487
6488 @item
6489 You may be getting mail that duplicates articles posted to groups.
6490 @end enumerate
6491
6492 I'm sure there are other situations that @code{Xref} handling fails as
6493 well, but these four are the most common situations.
6494
6495 If, and only if, @code{Xref} handling fails for you, then you may
6496 consider switching on @dfn{duplicate suppression}.  If you do so, Gnus
6497 will remember the @code{Message-ID}s of all articles you have read or
6498 otherwise marked as read, and then, as if by magic, mark them as read
6499 all subsequent times you see them---in @emph{all} groups.  Using this
6500 mechanism is quite likely to be somewhat inefficient, but not overly
6501 so.  It's certainly preferrable to reading the same articles more than
6502 once.
6503
6504 Duplicate suppression is not a very subtle instrument.  It's more like a
6505 sledge hammer than anything else.  It works in a very simple
6506 fashion---if you have marked an article as read, it adds this Message-ID
6507 to a cache.  The next time it sees this Message-ID, it will mark the
6508 article as read the the @samp{M} mark.  It doesn't care what group it
6509 saw the article in.
6510
6511 @table @code
6512 @item gnus-suppress-duplicates
6513 @vindex gnus-suppress-duplicates
6514 If non-@code{nil}, suppress duplicates.
6515
6516 @item gnus-save-duplicate-list
6517 @vindex gnus-save-duplicate-list
6518 If non-@code{nil}, save the list of duplicates to a file.  This will
6519 make startup and shutdown take longer, so the default is @code{nil}.
6520 However, this means that only duplicate articles that is read in a
6521 single Gnus session are suppressed.  
6522
6523 @item gnus-duplicate-list-length
6524 @vindex gnus-duplicate-list-length
6525 This variables says how many @code{Message-ID}s to keep in the duplicate
6526 suppression list.  The default is 10000.  
6527
6528 @item gnus-duplicate-file
6529 @vindex gnus-duplicate-file
6530 The name of the file to store the duplicate suppression list.  The
6531 default is @file{~/News/suppression}.
6532 @end table
6533
6534 If you have a tendency to stop and start Gnus often, setting
6535 @code{gnus-save-duplicate-list} to @code{t} is probably a good idea.  If
6536 you leave Gnus running for weeks on end, you may have it @code{nil}.  On
6537 the other hand, saving the list makes startup and shutdown much slower,
6538 so that means that if you stop and start Gnus often, you should set
6539 @code{gnus-save-duplicate-list} to @code{nil}.  Uhm.  I'll leave this up
6540 to you to figure out, I think.
6541
6542
6543 @node The Article Buffer
6544 @chapter The Article Buffer
6545 @cindex article buffer
6546
6547 The articles are displayed in the article buffer, of which there is only
6548 one.  All the summary buffers share the same article buffer unless you
6549 tell Gnus otherwise.
6550
6551 @menu
6552 * Hiding Headers::        Deciding what headers should be displayed.
6553 * Using MIME::            Pushing articles through @sc{mime} before reading them.
6554 * Customizing Articles::  Tailoring the look of the articles.
6555 * Article Keymap::        Keystrokes available in the article buffer
6556 * Misc Article::          Other stuff.
6557 @end menu
6558
6559
6560 @node Hiding Headers
6561 @section Hiding Headers
6562 @cindex hiding headers
6563 @cindex deleting headers
6564
6565 The top section of each article is the @dfn{head}.  (The rest is the
6566 @dfn{body}, but you may have guessed that already.)
6567
6568 @vindex gnus-show-all-headers
6569 There is a lot of useful information in the head: the name of the person
6570 who wrote the article, the date it was written and the subject of the
6571 article.  That's well and nice, but there's also lots of information
6572 most people do not want to see---what systems the article has passed
6573 through before reaching you, the @code{Message-ID}, the
6574 @code{References}, etc. ad nauseum---and you'll probably want to get rid
6575 of some of those lines.  If you want to keep all those lines in the
6576 article buffer, you can set @code{gnus-show-all-headers} to @code{t}.
6577
6578 Gnus provides you with two variables for sifting headers:
6579
6580 @table @code
6581
6582 @item gnus-visible-headers
6583 @vindex gnus-visible-headers
6584 If this variable is non-@code{nil}, it should be a regular expression
6585 that says what headers you wish to keep in the article buffer.  All
6586 headers that do not match this variable will be hidden.
6587
6588 For instance, if you only want to see the name of the person who wrote
6589 the article and the subject, you'd say:
6590
6591 @lisp
6592 (setq gnus-visible-headers "^From:\\|^Subject:")
6593 @end lisp
6594
6595 This variable can also be a list of regexps to match headers that are to
6596 remain visible.
6597
6598 @item gnus-ignored-headers
6599 @vindex gnus-ignored-headers
6600 This variable is the reverse of @code{gnus-visible-headers}.  If this
6601 variable is set (and @code{gnus-visible-headers} is @code{nil}), it
6602 should be a regular expression that matches all lines that you want to
6603 hide.  All lines that do not match this variable will remain visible.
6604
6605 For instance, if you just want to get rid of the @code{References} line
6606 and the @code{Xref} line, you might say:
6607
6608 @lisp
6609 (setq gnus-ignored-headers "^References:\\|^Xref:")
6610 @end lisp
6611
6612 This variable can also be a list of regexps to match headers that are to
6613 be removed.
6614
6615 Note that if @code{gnus-visible-headers} is non-@code{nil}, this
6616 variable will have no effect.
6617
6618 @end table
6619
6620 @vindex gnus-sorted-header-list
6621 Gnus can also sort the headers for you.  (It does this by default.)  You
6622 can control the sorting by setting the @code{gnus-sorted-header-list}
6623 variable.  It is a list of regular expressions that says in what order
6624 the headers are to be displayed.
6625
6626 For instance, if you want the name of the author of the article first,
6627 and then the subject, you might say something like:
6628
6629 @lisp
6630 (setq gnus-sorted-header-list '("^From:" "^Subject:"))
6631 @end lisp
6632
6633 Any headers that are to remain visible, but are not listed in this
6634 variable, will be displayed in random order after all the headers that
6635 are listed in this variable.
6636
6637 @findex gnus-article-hide-boring-headers
6638 @vindex gnus-article-display-hook
6639 @vindex gnus-boring-article-headers
6640 You can hide further boring headers by entering
6641 @code{gnus-article-hide-boring-headers} into
6642 @code{gnus-article-display-hook}.  What this function does depends on
6643 the @code{gnus-boring-article-headers} variable.  It's a list, but this
6644 list doesn't actually contain header names.  Instead is lists various
6645 @dfn{boring conditions} that Gnus can check and remove from sight.
6646
6647 These conditions are:
6648 @table @code
6649 @item empty
6650 Remove all empty headers.
6651 @item newsgroups
6652 Remove the @code{Newsgroups} header if it only contains the current group
6653 name. 
6654 @item followup-to
6655 Remove the @code{Followup-To} header if it is identical to the
6656 @code{Newsgroups} header.
6657 @item reply-to
6658 Remove the @code{Reply-To} header if it lists the same address as the
6659 @code{From} header.
6660 @item date
6661 Remove the @code{Date} header if the article is less than three days
6662 old. 
6663 @end table
6664
6665 To include the four first elements, you could say something like;
6666
6667 @lisp
6668 (setq gnus-boring-article-headers 
6669       '(empty newsgroups followup-to reply-to))
6670 @end lisp
6671
6672 This is also the default value for this variable.
6673
6674
6675 @node Using MIME
6676 @section Using @sc{mime}
6677 @cindex @sc{mime}
6678
6679 Mime is a standard for waving your hands through the air, aimlessly,
6680 while people stand around yawning.
6681
6682 @sc{mime}, however, is a standard for encoding your articles, aimlessly,
6683 while all newsreaders die of fear.
6684
6685 @sc{mime} may specify what character set the article uses, the encoding
6686 of the characters, and it also makes it possible to embed pictures and
6687 other naughty stuff in innocent-looking articles.
6688
6689 @vindex gnus-show-mime
6690 @vindex gnus-show-mime-method
6691 @vindex gnus-strict-mime
6692 @findex metamail-buffer
6693 Gnus handles @sc{mime} by shoving the articles through
6694 @code{gnus-show-mime-method}, which is @code{metamail-buffer} by
6695 default.  Set @code{gnus-show-mime} to @code{t} if you want to use
6696 @sc{mime} all the time.  However, if @code{gnus-strict-mime} is
6697 non-@code{nil}, the @sc{mime} method will only be used if there are
6698 @sc{mime} headers in the article.
6699
6700 It might be best to just use the toggling functions from the summary
6701 buffer to avoid getting nasty surprises. (For instance, you enter the
6702 group @samp{alt.sing-a-long} and, before you know it, @sc{mime} has
6703 decoded the sound file in the article and some horrible sing-a-long song
6704 comes streaming out out your speakers, and you can't find the volume
6705 button, because there isn't one, and people are starting to look at you,
6706 and you try to stop the program, but you can't, and you can't find the
6707 program to control the volume, and everybody else in the room suddenly
6708 decides to look at you disdainfully, and you'll feel rather stupid.)
6709
6710 Any similarity to real events and people is purely coincidental.  Ahem.
6711
6712
6713 @node Customizing Articles
6714 @section Customizing Articles
6715 @cindex article customization
6716
6717 @vindex gnus-article-display-hook
6718 The @code{gnus-article-display-hook} is called after the article has
6719 been inserted into the article buffer.  It is meant to handle all
6720 treatment of the article before it is displayed. 
6721
6722 @findex gnus-article-maybe-highlight
6723 By default it contains @code{gnus-article-hide-headers},
6724 @code{gnus-article-treat-overstrike}, and
6725 @code{gnus-article-maybe-highlight}, but there are thousands, nay
6726 millions, of functions you can put in this hook.  For an overview of
6727 functions @pxref{Article Highlighting}, @pxref{Article Hiding},
6728 @pxref{Article Washing}, @pxref{Article Buttons} and @pxref{Article
6729 Date}.
6730
6731 You can, of course, write your own functions.  The functions are called
6732 from the article buffer, and you can do anything you like, pretty much.
6733 There is no information that you have to keep in the buffer---you can
6734 change everything.  However, you shouldn't delete any headers.  Instead
6735 make them invisible if you want to make them go away.
6736
6737
6738 @node Article Keymap
6739 @section Article Keymap
6740
6741 Most of the keystrokes in the summary buffer can also be used in the
6742 article buffer.  They should behave as if you typed them in the summary
6743 buffer, which means that you don't actually have to have a summary
6744 buffer displayed while reading.  You can do it all from the article
6745 buffer.
6746
6747 A few additional keystrokes are available:
6748
6749 @table @kbd
6750
6751 @item SPACE
6752 @kindex SPACE (Article)
6753 @findex gnus-article-next-page
6754 Scroll forwards one page (@code{gnus-article-next-page}).
6755
6756 @item DEL
6757 @kindex DEL (Article)
6758 @findex gnus-article-prev-page
6759 Scroll backwards one page (@code{gnus-article-prev-page}).
6760
6761 @item C-c ^
6762 @kindex C-c ^ (Article)
6763 @findex gnus-article-refer-article
6764 If point is in the neighborhood of a @code{Message-ID} and you press
6765 @kbd{r}, Gnus will try to get that article from the server
6766 (@code{gnus-article-refer-article}).
6767
6768 @item C-c C-m
6769 @kindex C-c C-m (Article)
6770 @findex gnus-article-mail
6771 Send a reply to the address near point (@code{gnus-article-mail}).  If
6772 given a prefix, include the mail.
6773
6774 @item s
6775 @kindex s (Article)
6776 @findex gnus-article-show-summary
6777 Reconfigure the buffers so that the summary buffer becomes visible
6778 (@code{gnus-article-show-summary}).
6779
6780 @item ?
6781 @kindex ? (Article)
6782 @findex gnus-article-describe-briefly
6783 Give a very brief description of the available keystrokes
6784 (@code{gnus-article-describe-briefly}). 
6785
6786 @item TAB
6787 @kindex TAB (Article)
6788 @findex gnus-article-next-button
6789 Go to the next button, if any (@code{gnus-article-next-button}.  This
6790 only makes sense if you have buttonizing turned on.
6791
6792 @item M-TAB
6793 @kindex M-TAB (Article)
6794 @findex gnus-article-prev-button
6795 Go to the previous button, if any (@code{gnus-article-prev-button}.  
6796
6797 @end table
6798
6799
6800 @node Misc Article
6801 @section Misc Article
6802
6803 @table @code
6804
6805 @item gnus-single-article-buffer
6806 @vindex gnus-single-article-buffer
6807 If non-@code{nil}, use the same article buffer for all the groups.
6808 (This is the default.)  If @code{nil}, each group will have its own
6809 article buffer.
6810
6811 @vindex gnus-article-prepare-hook
6812 @item gnus-article-prepare-hook
6813 This hook is called right after the article has been inserted into the
6814 article buffer.  It is mainly intended for functions that do something
6815 depending on the contents; it should probably not be used for changing
6816 the contents of the article buffer.
6817
6818 @vindex gnus-article-display-hook
6819 @item gnus-article-display-hook
6820 This hook is called as the last thing when displaying an article, and is
6821 intended for modifying the contents of the buffer, doing highlights,
6822 hiding headers, and the like.
6823
6824 @item gnus-article-mode-hook
6825 @vindex gnus-article-mode-hook
6826 Hook called in article mode buffers.
6827
6828 @vindex gnus-article-mode-line-format
6829 @item gnus-article-mode-line-format
6830 This variable is a format string along the same lines as
6831 @code{gnus-summary-mode-line-format}.  It accepts the same
6832 format specifications as that variable, with one extension:
6833
6834 @table @samp
6835 @item w
6836 The @dfn{wash status} of the article.  This is a short string with one
6837 character for each possible article wash operation that may have been
6838 performed. 
6839 @end table
6840
6841 @vindex gnus-break-pages
6842
6843 @item gnus-break-pages
6844 Controls whether @dfn{page breaking} is to take place.  If this variable
6845 is non-@code{nil}, the articles will be divided into pages whenever a
6846 page delimiter appears in the article.  If this variable is @code{nil},
6847 paging will not be done.
6848
6849 @item gnus-page-delimiter
6850 @vindex gnus-page-delimiter
6851 This is the delimiter mentioned above.  By default, it is @samp{^L}
6852 (form linefeed).
6853 @end table
6854
6855
6856 @node Composing Messages
6857 @chapter Composing Messages
6858 @cindex reply
6859 @cindex followup
6860 @cindex post
6861
6862 @kindex C-c C-c (Post)
6863 All commands for posting and mailing will put you in a message buffer
6864 where you can edit the article all you like, before you send the article
6865 by pressing @kbd{C-c C-c}.  @xref{Top, , Top, message, The Message
6866 Manual}.  If you are in a foreign news group, and you wish to post the
6867 article using the foreign server, you can give a prefix to @kbd{C-c C-c}
6868 to make Gnus try to post using the foreign server.
6869
6870 @menu 
6871 * Mail::                 Mailing and replying.
6872 * Post::                 Posting and following up.
6873 * Posting Server::       What server should you post via?
6874 * Mail and Post::        Mailing and posting at the same time.
6875 * Archived Messages::    Where Gnus stores the messages you've sent.
6876 @c * Posting Styles::       An easier way to configure some key elements.
6877 @c * Drafts::               Postponing messages and rejected messages.
6878 @c * Rejected Articles::    What happens if the server doesn't like your article?
6879 @end menu
6880
6881 Also see @pxref{Canceling and Superseding} for information on how to
6882 remove articles you shouldn't have posted.
6883
6884
6885 @node Mail
6886 @section Mail
6887
6888 Variables for customizing outgoing mail:
6889
6890 @table @code
6891 @item gnus-uu-digest-headers
6892 @vindex gnus-uu-digest-headers
6893 List of regexps to match headers included in digested messages.  The
6894 headers will be included in the sequence they are matched.
6895
6896 @end table
6897
6898
6899 @node Post
6900 @section Post
6901
6902 Variables for composing news articles:
6903
6904 @table @code
6905 @item gnus-sent-message-ids-file
6906 @vindex gnus-sent-message-ids-file
6907 Gnus will keep a @code{Message-ID} history file of all the mails it has
6908 sent.  If it discovers that it has already sent a mail, it will ask the
6909 user whether to re-send the mail.  (This is primarily useful when
6910 dealing with @sc{soup} packets and the like where one is apt to sent the
6911 same packet multiple times.)  This variable says what the name of this
6912 history file is.  It is @file{~/News/Sent-Message-IDs} by default.  Set
6913 this variable to @code{nil} if you don't want Gnus to keep a history
6914 file.
6915
6916 @item gnus-sent-message-ids-length
6917 @vindex gnus-sent-message-ids-length
6918 This variable says how many @code{Message-ID}s to keep in the history
6919 file.  It is 1000 by default.
6920
6921 @end table
6922
6923
6924 @node Posting Server
6925 @section Posting Server
6926
6927 When you press those magical @kbd{C-c C-c} keys to ship off your latest
6928 (extremely intelligent, of course) article, where does it go?
6929
6930 Thank you for asking.  I hate you.
6931
6932 @vindex gnus-post-method
6933
6934 It can be quite complicated.  Normally, Gnus will use the same native
6935 server.  However.  If your native server doesn't allow posting, just
6936 reading, you probably want to use some other server to post your
6937 (extremely intelligent and fabulously interesting) articles.  You can
6938 then set the @code{gnus-post-method} to some other method:
6939
6940 @lisp
6941 (setq gnus-post-method '(nnspool ""))
6942 @end lisp
6943
6944 Now, if you've done this, and then this server rejects your article, or
6945 this server is down, what do you do then?  To override this variable you
6946 can use a non-zero prefix to the @kbd{C-c C-c} command to force using
6947 the ``current'' server for posting.
6948
6949 If you give a zero prefix (i. e., @kbd{C-u 0 C-c C-c}) to that command,
6950 Gnus will prompt you for what method to use for posting.  
6951
6952 You can also set @code{gnus-post-method} to a list of select methods.
6953 If that's the case, Gnus will always prompt you for what method to use
6954 for posting. 
6955
6956
6957 @node Mail and Post
6958 @section Mail and Post
6959
6960 Here's a list of variables that are relevant to both mailing and
6961 posting:
6962
6963 @table @code
6964 @item gnus-mailing-list-groups
6965 @findex gnus-mailing-list-groups
6966 @cindex mailing lists
6967
6968 If your news server offers groups that are really mailing lists that are
6969 gatewayed to the @sc{nntp} server, you can read those groups without
6970 problems, but you can't post/followup to them without some difficulty.
6971 One solution is to add a @code{to-address} to the group parameters
6972 (@pxref{Group Parameters}).  An easier thing to do is set the
6973 @code{gnus-mailing-list-groups} to a regexp that match the groups that
6974 really are mailing lists.  Then, at least, followups to the mailing
6975 lists will work most of the time.  Posting to these groups (@kbd{a}) is
6976 still a pain, though.
6977
6978 @end table
6979
6980 You may want to do spell-checking on messages that you send out.  Or, if
6981 you don't want to spell-check by hand, you could add automatic
6982 spell-checking via the @code{ispell} package:
6983
6984 @cindex ispell
6985 @findex ispell-message
6986 @lisp
6987 (add-hook 'message-send-hook 'ispell-message) 
6988 @end lisp
6989
6990
6991 @node Archived Messages
6992 @section Archived Messages
6993 @cindex archived messages
6994 @cindex sent messages
6995
6996 Gnus provides a few different methods for storing the mail you send.
6997 The default method is to use the @dfn{archive virtual server} to store
6998 the mail.  If you want to disable this completely, you should set
6999 @code{gnus-message-archive-group} to @code{nil}.
7000
7001 @vindex gnus-message-archive-method
7002 @code{gnus-message-archive-method} says what virtual server Gnus is to
7003 use to store sent messages.  It is @code{(nnfolder "archive"
7004 (nnfolder-directory "~/Mail/archive/"))} by default, but you can use any
7005 mail select method (@code{nnml}, @code{nnmbox}, etc.).  However,
7006 @code{nnfolder} is a quite likeable select method for doing this sort of
7007 thing.  If you don't like the default directory chosen, you could say
7008 something like:
7009
7010 @lisp
7011 (setq gnus-message-archive-method
7012       '(nnfolder "archive" 
7013                  (nnfolder-inhibit-expiry t)
7014                  (nnfolder-active-file "~/News/sent-mail/active")
7015                  (nnfolder-directory "~/News/sent-mail/")))
7016 @end lisp
7017
7018 @vindex gnus-message-archive-group
7019 @cindex Gcc
7020 Gnus will insert @code{Gcc} headers in all outgoing messages that point
7021 to one or more group(s) on that server.  Which group to use is
7022 determined by the @code{gnus-message-archive-group} variable.  
7023
7024 This variable can be:
7025
7026 @itemize @bullet
7027 @item a string
7028 Messages will be saved in that group.
7029 @item a list of strings
7030 Messages will be saved in all those groups.
7031 @item an alist of regexps, functions and forms
7032 When a key ``matches'', the result is used.
7033 @item @code{nil}
7034 No message archiving will take place.  This is the default.
7035 @end itemize
7036
7037 Let's illustrate:
7038
7039 Just saving to a single group called @samp{MisK}:
7040 @lisp
7041 (setq gnus-message-archive-group "MisK")
7042 @end lisp
7043
7044 Saving to two groups, @samp{MisK} and @samp{safe}:
7045 @lisp
7046 (setq gnus-message-archive-group '("MisK" "safe"))
7047 @end lisp
7048
7049 Save to different groups based on what group you are in:
7050 @lisp
7051 (setq gnus-message-archive-group 
7052       '(("^alt" "sent-to-alt")
7053         ("mail" "sent-to-mail")
7054         (".*" "sent-to-misc")))
7055 @end lisp
7056
7057 More complex stuff:
7058 @lisp
7059 (setq gnus-message-archive-group 
7060       '((if (message-news-p)
7061             "misc-news" 
7062           "misc-mail")))
7063 @end lisp       
7064
7065 How about storing all news messages in one file, but storing all mail
7066 messages in one file per month:
7067
7068 @lisp
7069 (setq gnus-message-archive-group
7070       '((if (message-news-p)
7071             "misc-news" 
7072           (concat "mail." (format-time-string 
7073                            "%Y-%m" (current-time))))))
7074 @end lisp
7075
7076 Now, when you send a message off, it will be stored in the appropriate
7077 group.  (If you want to disable storing for just one particular message,
7078 you can just remove the @code{Gcc} header that has been inserted.)  The
7079 archive group will appear in the group buffer the next time you start
7080 Gnus, or the next time you press @kbd{F} in the group buffer.  You can
7081 enter it and read the articles in it just like you'd read any other
7082 group.  If the group gets really big and annoying, you can simply rename
7083 if (using @kbd{G r} in the group buffer) to something
7084 nice---@samp{misc-mail-september-1995}, or whatever.  New messages will
7085 continue to be stored in the old (now empty) group.
7086
7087 That's the default method of archiving sent mail.  Gnus also offers two
7088 other variables for the people who don't like the default method.  In
7089 that case you should set @code{gnus-message-archive-group} to
7090 @code{nil}; this will disable archiving.
7091
7092 XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to
7093 use a different value for @code{gnus-message-archive-group} there.
7094
7095
7096 @table @code
7097 @item gnus-outgoing-message-group 
7098 @vindex gnus-outgoing-message-group 
7099 All outgoing messages will be put in this group.  If you want to store
7100 all your outgoing mail and articles in the group @samp{nnml:archive},
7101 you set this variable to that value.  This variable can also be a list of
7102 group names.
7103
7104 If you want to have greater control over what group to put each
7105 message in, you can set this variable to a function that checks the
7106 current newsgroup name and then returns a suitable group name (or list
7107 of names).
7108 @end table
7109
7110
7111 @c @node Posting Styles
7112 @c @section Posting Styles
7113 @c @cindex posting styles
7114 @c @cindex styles
7115 @c 
7116 @c All them variables, they make my head swim.  
7117 @c 
7118 @c So what if you want a different @code{Organization} and signature based
7119 @c on what groups you post to?  And you post both from your home machine
7120 @c and your work machine, and you want different @code{From} lines, and so
7121 @c on? 
7122 @c 
7123 @c @vindex gnus-posting-styles
7124 @c One way to do stuff like that is to write clever hooks that change the
7125 @c variables you need to have changed.  That's a bit boring, so somebody
7126 @c came up with the bright idea of letting the user specify these things in
7127 @c a handy alist.  Here's an example of a @code{gnus-posting-styles}
7128 @c variable: 
7129 @c 
7130 @c @lisp
7131 @c ((".*" 
7132 @c   (signature . "Peace and happiness")
7133 @c   (organization . "What me?"))
7134 @c  ("^comp" 
7135 @c   (signature . "Death to everybody"))
7136 @c  ("comp.emacs.i-love-it" 
7137 @c   (organization . "Emacs is it")))
7138 @c @end lisp
7139 @c 
7140 @c As you might surmise from this example, this alist consists of several
7141 @c @dfn{styles}.  Each style will be applicable if the first element
7142 @c ``matches'', in some form or other.  The entire alist will be iterated
7143 @c over, from the beginning towards the end, and each match will be
7144 @c applied, which means that attributes in later styles that match override
7145 @c the same attributes in earlier matching styles.  So
7146 @c @samp{comp.programming.literate} will have the @samp{Death to everybody}
7147 @c signature and the @samp{What me?} @code{Organization} header.
7148 @c 
7149 @c The first element in each style is called the @code{match}.  If it's a
7150 @c string, then Gnus will try to regexp match it against the group name.
7151 @c If it's a function symbol, that function will be called with no
7152 @c arguments.  If it's a variable symbol, then the variable will be
7153 @c referenced.  If it's a list, then that list will be @code{eval}ed.  In
7154 @c any case, if this returns a non-@code{nil} value, then the style is said
7155 @c to @dfn{match}.
7156 @c 
7157 @c Each style may contain a arbitrary amount of @dfn{attributes}.  Each
7158 @c attribute consists of a @var{(name . value)} pair.  The attribute name
7159 @c can be one of @code{signature}, @code{organization} or @code{from}.  The
7160 @c attribute name can also be a string.  In that case, this will be used as
7161 @c a header name, and the value will be inserted in the headers of the
7162 @c article.
7163 @c 
7164 @c The attribute value can be a string (used verbatim), a function (the
7165 @c return value will be used), a variable (its value will be used) or a
7166 @c list (it will be @code{eval}ed and the return value will be used).
7167 @c 
7168 @c So here's a new example:
7169 @c 
7170 @c @lisp
7171 @c (setq gnus-posting-styles
7172 @c       '((".*" 
7173 @c           (signature . "~/.signature") 
7174 @c           (from . "user@@foo (user)")
7175 @c           ("X-Home-Page" . (getenv "WWW_HOME"))
7176 @c           (organization . "People's Front Against MWM"))
7177 @c         ("^rec.humor" 
7178 @c           (signature . my-funny-signature-randomizer))
7179 @c         ((equal (system-name) "gnarly")
7180 @c           (signature . my-quote-randomizer))
7181 @c         (posting-from-work-p
7182 @c           (signature . "~/.work-signature")
7183 @c           (from . "user@@bar.foo (user)")
7184 @c           (organization . "Important Work, Inc"))
7185 @c         ("^nn.+:" 
7186 @c           (signature . "~/.mail-signature"))))
7187 @c @end lisp
7188
7189 @c @node Drafts
7190 @c @section Drafts
7191 @c @cindex drafts
7192 @c 
7193 @c If you are writing a message (mail or news) and suddenly remember that
7194 @c you have a steak in the oven (or some pesto in the food processor, you
7195 @c craazy vegetarians), you'll probably wish there was a method to save the
7196 @c message you are writing so that you can continue editing it some other
7197 @c day, and send it when you feel its finished.
7198 @c 
7199 @c Well, don't worry about it.  Whenever you start composing a message of
7200 @c some sort using the Gnus mail and post commands, the buffer you get will
7201 @c automatically associate to an article in a special @dfn{draft} group.
7202 @c If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the
7203 @c article will be saved there.  (Auto-save files also go to the draft
7204 @c group.) 
7205 @c 
7206 @c @cindex nndraft
7207 @c @vindex gnus-draft-group-directory
7208 @c The draft group is a special group (which is implemented as an
7209 @c @code{nndraft} group, if you absolutely have to know) called
7210 @c @samp{nndraft:drafts}.  The variable @code{gnus-draft-group-directory}
7211 @c controls both the name of the group and the location---the leaf element
7212 @c in the path will be used as the name of the group.  What makes this
7213 @c group special is that you can't tick any articles in it or mark any
7214 @c articles as read---all articles in the group are permanently unread.
7215 @c 
7216 @c If the group doesn't exist, it will be created and you'll be subscribed
7217 @c to it.
7218 @c 
7219 @c @findex gnus-dissociate-buffer-from-draft
7220 @c @kindex C-c M-d (Mail)
7221 @c @kindex C-c M-d (Post)
7222 @c @findex gnus-associate-buffer-with-draft
7223 @c @kindex C-c C-d (Mail)
7224 @c @kindex C-c C-d (Post)
7225 @c If you're writing some super-secret message that you later want to
7226 @c encode with PGP before sending, you may wish to turn the auto-saving
7227 @c (and association with the draft group) off.  You never know who might be
7228 @c interested in reading all your extremely valuable and terribly horrible
7229 @c and interesting secrets.  The @kbd{C-c M-d}
7230 @c (@code{gnus-dissociate-buffer-from-draft}) command does that for you.
7231 @c If you change your mind and want to turn the auto-saving back on again,
7232 @c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that.
7233 @c 
7234 @c @vindex gnus-use-draft
7235 @c To leave association with the draft group off by default, set
7236 @c @code{gnus-use-draft} to @code{nil}.  It is @code{t} by default. 
7237 @c 
7238 @c @findex gnus-summary-send-draft
7239 @c @kindex S D c (Summary)
7240 @c When you want to continue editing the article, you simply enter the
7241 @c draft group and push @kbd{S D c} (@code{gnus-summary-send-draft}) to do
7242 @c that.  You will be placed in a buffer where you left off.
7243 @c 
7244 @c Rejected articles will also be put in this draft group (@pxref{Rejected
7245 @c Articles}).
7246 @c 
7247 @c @findex gnus-summary-send-all-drafts
7248 @c If you have lots of rejected messages you want to post (or mail) without
7249 @c doing further editing, you can use the @kbd{S D a} command
7250 @c (@code{gnus-summary-send-all-drafts}).  This command understands the
7251 @c process/prefix convention (@pxref{Process/Prefix}).  
7252 @c 
7253 @c 
7254 @c @node Rejected Articles
7255 @c @section Rejected Articles
7256 @c @cindex rejected articles
7257 @c 
7258 @c Sometimes a news server will reject an article.  Perhaps the server
7259 @c doesn't like your face.  Perhaps it just feels miserable.  Perhaps
7260 @c @emph{there be demons}.  Perhaps you have included too much cited text.
7261 @c Perhaps the disk is full.  Perhaps the server is down.
7262 @c 
7263 @c These situations are, of course, totally beyond the control of Gnus.
7264 @c (Gnus, of course, loves the way you look, always feels great, has angels
7265 @c fluttering around inside of it, doesn't care about how much cited text
7266 @c you include, never runs full and never goes down.)  So Gnus saves these
7267 @c articles until some later time when the server feels better.
7268 @c 
7269 @c The rejected articles will automatically be put in a special draft group
7270 @c (@pxref{Drafts}).  When the server comes back up again, you'd then
7271 @c typically enter that group and send all the articles off.
7272 @c 
7273
7274 @node Select Methods
7275 @chapter Select Methods
7276 @cindex foreign groups
7277 @cindex select methods
7278
7279 A @dfn{foreign group} is a group that is not read by the usual (or
7280 default) means.  It could be, for instance, a group from a different
7281 @sc{nntp} server, it could be a virtual group, or it could be your own
7282 personal mail group.
7283
7284 A foreign group (or any group, really) is specified by a @dfn{name} and
7285 a @dfn{select method}.  To take the latter first, a select method is a
7286 list where the first element says what backend to use (eg. @code{nntp},
7287 @code{nnspool}, @code{nnml}) and the second element is the @dfn{server
7288 name}.  There may be additional elements in the select method, where the
7289 value may have special meaning for the backend in question.
7290
7291 One could say that a select method defines a @dfn{virtual server}---so
7292 we do just that (@pxref{The Server Buffer}).
7293
7294 The @dfn{name} of the group is the name the backend will recognize the
7295 group as.
7296
7297 For instance, the group @samp{soc.motss} on the @sc{nntp} server
7298 @samp{some.where.edu} will have the name @samp{soc.motss} and select
7299 method @code{(nntp "some.where.edu")}.  Gnus will call this group, in
7300 all circumstances, @samp{nntp+some.where.edu:soc.motss}, even though the
7301 @code{nntp} backend just knows this group as @samp{soc.motss}.
7302
7303 The different methods all have their peculiarities, of course.
7304
7305 @menu
7306 * The Server Buffer::     Making and editing virtual servers.
7307 * Getting News::          Reading USENET news with Gnus.
7308 * Getting Mail::          Reading your personal mail with Gnus.
7309 * Other Sources::         Reading directories, files, SOUP packets.
7310 * Combined Groups::       Combining groups into one group.
7311 @end menu
7312
7313
7314 @node The Server Buffer
7315 @section The Server Buffer
7316
7317 Traditionally, a @dfn{server} is a machine or a piece of software that
7318 one connects to, and then requests information from.  Gnus does not
7319 connect directly to any real servers, but does all transactions through
7320 one backend or other.  But that's just putting one layer more between
7321 the actual media and Gnus, so we might just as well say that each
7322 backend represents a virtual server.
7323
7324 For instance, the @code{nntp} backend may be used to connect to several
7325 different actual @sc{nntp} servers, or, perhaps, to many different ports
7326 on the same actual @sc{nntp} server.  You tell Gnus which backend to
7327 use, and what parameters to set by specifying a @dfn{select method}.
7328
7329 These select methods specifications can sometimes become quite
7330 complicated---say, for instance, that you want to read from the
7331 @sc{nntp} server @samp{news.funet.fi} on port number @code{13}, which
7332 hangs if queried for @sc{nov} headers and has a buggy select.  Ahem.
7333 Anyways, if you had to specify that for each group that used this
7334 server, that would be too much work, so Gnus offers a way of naming
7335 select methods, which is what you do in the server buffer.
7336
7337 To enter the server buffer, user the @kbd{^}
7338 (@code{gnus-group-enter-server-mode}) command in the group buffer.
7339
7340 @menu
7341 * Server Buffer Format::      You can customize the look of this buffer.
7342 * Server Commands::           Commands to manipulate servers.
7343 * Example Methods::           Examples server specifications.
7344 * Creating a Virtual Server:: An example session.
7345 * Servers and Methods::       You can use server names as select methods.
7346 * Unavailable Servers::       Some servers you try to contact may be down.
7347 @end menu
7348
7349 @vindex gnus-server-mode-hook
7350 @code{gnus-server-mode-hook} is run when creating the server buffer.
7351
7352
7353 @node Server Buffer Format
7354 @subsection Server Buffer Format
7355 @cindex server buffer format
7356
7357 @vindex gnus-server-line-format
7358 You can change the look of the server buffer lines by changing the
7359 @code{gnus-server-line-format} variable.  This is a @code{format}-like
7360 variable, with some simple extensions:
7361
7362 @table @samp
7363
7364 @item h 
7365 How the news is fetched---the backend name.
7366
7367 @item n
7368 The name of this server.
7369
7370 @item w
7371 Where the news is to be fetched from---the address.
7372
7373 @item s
7374 The opened/closed/denied status of the server.
7375 @end table
7376
7377 @vindex gnus-server-mode-line-format
7378 The mode line can also be customized by using the
7379 @code{gnus-server-mode-line-format} variable.  The following specs are
7380 understood: 
7381
7382 @table @samp
7383 @item S
7384 Server name.
7385
7386 @item M
7387 Server method.
7388 @end table
7389
7390 Also @pxref{Formatting Variables}.
7391
7392
7393 @node Server Commands
7394 @subsection Server Commands
7395 @cindex server commands
7396
7397 @table @kbd
7398
7399 @item a
7400 @kindex a (Server)
7401 @findex gnus-server-add-server
7402 Add a new server (@code{gnus-server-add-server}).
7403
7404 @item e
7405 @kindex e (Server)
7406 @findex gnus-server-edit-server
7407 Edit a server (@code{gnus-server-edit-server}).
7408
7409 @item SPACE
7410 @kindex SPACE (Server)
7411 @findex gnus-server-read-server
7412 Browse the current server (@code{gnus-server-read-server}).
7413
7414 @item q
7415 @kindex q (Server)
7416 @findex gnus-server-exit
7417 Return to the group buffer (@code{gnus-server-exit}).
7418
7419 @item k
7420 @kindex k (Server)
7421 @findex gnus-server-kill-server
7422 Kill the current server (@code{gnus-server-kill-server}).
7423
7424 @item y
7425 @kindex y (Server)
7426 @findex gnus-server-yank-server
7427 Yank the previously killed server (@code{gnus-server-yank-server}).
7428
7429 @item c
7430 @kindex c (Server)
7431 @findex gnus-server-copy-server
7432 Copy the current server (@code{gnus-server-copy-server}).
7433
7434 @item l
7435 @kindex l (Server)
7436 @findex gnus-server-list-servers
7437 List all servers (@code{gnus-server-list-servers}).
7438
7439 @end table
7440
7441
7442 @node Example Methods
7443 @subsection Example Methods
7444
7445 Most select methods are pretty simple and self-explanatory: 
7446
7447 @lisp
7448 (nntp "news.funet.fi")
7449 @end lisp
7450
7451 Reading directly from the spool is even simpler:
7452
7453 @lisp
7454 (nnspool "")
7455 @end lisp
7456
7457 As you can see, the first element in a select method is the name of the
7458 backend, and the second is the @dfn{address}, or @dfn{name}, if you
7459 will. 
7460
7461 After these two elements, there may be a arbitrary number of
7462 @var{(variable form)} pairs.
7463
7464 To go back to the first example---imagine that you want to read from
7465 port @code{15} from that machine.  This is what the select method should
7466 look like then:
7467
7468 @lisp
7469 (nntp "news.funet.fi" (nntp-port-number 15))
7470 @end lisp
7471
7472 You should read the documentation to each backend to find out what
7473 variables are relevant, but here's an @code{nnmh} example. 
7474
7475 @code{nnmh} is a mail backend that reads a spool-like structure.  Say
7476 you have two structures that you wish to access: One is your private
7477 mail spool, and the other is a public one.  Here's the possible spec for
7478 you private mail:
7479
7480 @lisp
7481 (nnmh "private" (nnmh-directory "~/private/mail/"))
7482 @end lisp
7483
7484 (This server is then called @samp{private}, but you may have guessed
7485 that.)
7486
7487 Here's the method for a public spool:
7488
7489 @lisp
7490 (nnmh "public" 
7491       (nnmh-directory "/usr/information/spool/") 
7492       (nnmh-get-new-mail nil))
7493 @end lisp
7494
7495
7496 @node Creating a Virtual Server
7497 @subsection Creating a Virtual Server
7498
7499 If you're saving lots of articles in the cache by using persistent
7500 articles, you may want to create a virtual server to read the cache.
7501
7502 First you need to add a new server.  The @kbd{a} command does that.  It
7503 would probably be best to use @code{nnspool} to read the cache.  You
7504 could also use @code{nnml} or @code{nnmh}, though.
7505
7506 Type @kbd{a nnspool RET cache RET}.
7507
7508 You should now have a brand new @code{nnspool} virtual server called
7509 @samp{cache}.  You now need to edit it to have the right definitions.
7510 Type @kbd{e} to edit the server.  You'll be entered into a buffer that
7511 will contain the following:
7512
7513 @lisp
7514 (nnspool "cache")
7515 @end lisp
7516
7517 Change that to:
7518
7519 @lisp
7520 (nnspool "cache"
7521          (nnspool-spool-directory "~/News/cache/")
7522          (nnspool-nov-directory "~/News/cache/")
7523          (nnspool-active-file "~/News/cache/active"))
7524 @end lisp
7525
7526 Type @kbd{C-c C-c} to return to the server buffer.  If you now press
7527 @kbd{RET} over this virtual server, you should be entered into a browse
7528 buffer, and you should be able to enter any of the groups displayed.
7529
7530
7531 @node Servers and Methods
7532 @subsection Servers and Methods
7533
7534 Wherever you would normally use a select method
7535 (eg. @code{gnus-secondary-select-method}, in the group select method,
7536 when browsing a foreign server) you can use a virtual server name
7537 instead.  This could potentially save lots of typing.  And it's nice all
7538 over.
7539
7540
7541 @node Unavailable Servers
7542 @subsection Unavailable Servers
7543
7544 If a server seems to be unreachable, Gnus will mark that server as
7545 @code{denied}.  That means that any subsequent attempt to make contact
7546 with that server will just be ignored.  ``It can't be opened,'' Gnus
7547 will tell you, without making the least effort to see whether that is
7548 actually the case or not.
7549
7550 That might seem quite naughty, but it does make sense most of the time.
7551 Let's say you have 10 groups subscribed to the server
7552 @samp{nepholococcygia.com}.  This server is located somewhere quite far
7553 away from you, the machine is quite, so it takes 1 minute just to find
7554 out that it refuses connection from you today.  If Gnus were to attempt
7555 to do that 10 times, you'd be quite annoyed, so Gnus won't attempt to do
7556 that.  Once it has gotten a single ``connection refused'', it will
7557 regard that server as ``down''.
7558
7559 So, what happens if the machine was only feeling unwell temporarily?
7560 How do you test to see whether the machine has come up again?
7561
7562 You jump to the server buffer (@pxref{The Server Buffer}) and poke it
7563 with the following commands:
7564
7565 @table @kbd
7566
7567 @item O
7568 @kindex O (Server)
7569 @findex gnus-server-open-server
7570 Try to establish connection to the server on the current line
7571 (@code{gnus-server-open-server}).
7572
7573 @item C
7574 @kindex C (Server)
7575 @findex gnus-server-close-server
7576 Close the connection (if any) to the server
7577 (@code{gnus-server-close-server}).
7578
7579 @item D
7580 @kindex D (Server)
7581 @findex gnus-server-deny-server
7582 Mark the current server as unreachable
7583 (@code{gnus-server-deny-server}). 
7584
7585 @item M-o
7586 @kindex M-o (Server)
7587 @findex gnus-server-open-all-servers
7588 Open the connections to all servers in the buffer
7589 (@code{gnus-server-open-all-servers}). 
7590
7591 @item M-c
7592 @kindex M-c (Server)
7593 @findex gnus-server-close-all-servers
7594 Close the connections to all servers in the buffer
7595 (@code{gnus-server-close-all-servers}). 
7596
7597 @item R
7598 @kindex R (Server)
7599 @findex gnus-server-remove-denials
7600 Remove all marks to whether Gnus was denied connection from all servers
7601 (@code{gnus-server-remove-denials}). 
7602
7603 @end table
7604
7605
7606 @node Getting News
7607 @section Getting News
7608 @cindex reading news
7609 @cindex news backends
7610
7611 A newsreader is normally used for reading news.  Gnus currently provides
7612 only two methods of getting news---it can read from an @sc{nntp} server,
7613 or it can read from a local spool.
7614
7615 @menu
7616 * NNTP::               Reading news from an @sc{nntp} server.
7617 * News Spool::         Reading news from the local spool.
7618 @end menu
7619
7620
7621 @node NNTP
7622 @subsection @sc{nntp}
7623 @cindex nntp
7624
7625 Subscribing to a foreign group from an @sc{nntp} server is rather easy.
7626 You just specify @code{nntp} as method and the address of the @sc{nntp}
7627 server as the, uhm, address.
7628
7629 If the @sc{nntp} server is located at a non-standard port, setting the
7630 third element of the select method to this port number should allow you
7631 to connect to the right port.  You'll have to edit the group info for
7632 that (@pxref{Foreign Groups}).
7633
7634 The name of the foreign group can be the same as a native group.  In
7635 fact, you can subscribe to the same group from as many different servers
7636 you feel like.  There will be no name collisions.
7637
7638 The following variables can be used to create a virtual @code{nntp}
7639 server: 
7640
7641 @table @code
7642
7643 @item nntp-server-opened-hook
7644 @vindex nntp-server-opened-hook
7645 @cindex @sc{mode reader}
7646 @cindex authinfo
7647 @cindex authentification
7648 @cindex nntp authentification
7649 @findex nntp-send-authinfo
7650 @findex nntp-send-mode-reader
7651 @code{nntp-server-opened-hook} is run after a connection has been made.
7652 It can be used to send commands to the @sc{nntp} server after it has
7653 been contacted.  By default is sends the command @code{MODE READER} to
7654 the server with the @code{nntp-send-mode-reader} function. 
7655
7656 @item nntp-authinfo-function 
7657 @vindex nntp-authinfo-function 
7658 This function will be used to send @samp{AUTHINFO} to the @sc{nntp}
7659 server.  Available functions include:
7660
7661 @table @code
7662 @item nntp-send-authinfo
7663 @findex nntp-send-authinfo
7664 This function will used you current login name as the user name and will
7665 prompt you for the password.  This is the default.
7666
7667 @item nntp-send-nosy-authinfo
7668 @findex nntp-send-nosy-authinfo
7669 This function will prompt you for both user name and password.
7670
7671 @item nntp-send-authinfo-from-file
7672 @findex nntp-send-authinfo-from-file
7673 This function will use your current login name as the user name and will
7674 read the @sc{nntp} password from @file{~/.nntp-authinfo}.
7675 @end table
7676
7677 @item nntp-server-action-alist 
7678 @vindex nntp-server-action-alist 
7679 This is an list of regexps to match on server types and actions to be
7680 taken when matches are made.  For instance, if you want Gnus to beep
7681 every time you connect to innd, you could say something like:
7682
7683 @lisp
7684 (setq nntp-server-action-alist
7685       '(("innd" (ding))))
7686 @end lisp
7687
7688 You probably don't want to do that, though.
7689
7690 The default value is
7691
7692 @lisp
7693   '(("nntpd 1\\.5\\.11t" 
7694      (remove-hook 'nntp-server-opened-hook nntp-send-mode-reader)))
7695 @end lisp
7696
7697 This ensures that Gnus doesn't send the @code{MODE READER} command to
7698 nntpd 1.5.11t, since that command chokes that server, I've been told. 
7699
7700 @item nntp-maximum-request
7701 @vindex nntp-maximum-request
7702 If the @sc{nntp} server doesn't support @sc{nov} headers, this backend
7703 will collect headers by sending a series of @code{head} commands.  To
7704 speed things up, the backend sends lots of these commands without
7705 waiting for reply, and then reads all the replies.  This is controlled
7706 by the @code{nntp-maximum-request} variable, and is 400 by default.  If
7707 your network is buggy, you should set this to 1.
7708
7709 @item nntp-connection-timeout
7710 @vindex nntp-connection-timeout
7711 If you have lots of foreign @code{nntp} groups that you connect to
7712 regularly, you're sure to have problems with @sc{nntp} servers not
7713 responding properly, or being too loaded to reply within reasonable
7714 time.  This is can lead to awkward problems, which can be helped
7715 somewhat by setting @code{nntp-connection-timeout}.  This is an integer
7716 that says how many seconds the @code{nntp} backend should wait for a
7717 connection before giving up.  If it is @code{nil}, which is the default,
7718 no timeouts are done.
7719
7720 @item nntp-command-timeout
7721 @vindex nntp-command-timeout
7722 @cindex PPP connections
7723 @cindex dynamic IP addresses
7724 If you're running Gnus on a machine that has a dynamically assigned
7725 address, Gnus may become confused.  If the address of your machine
7726 changes after connecting to the @sc{nntp} server, Gnus will simply sit
7727 waiting forever for replies from the server.  To help with this
7728 unfortunate problem, you can set this command to a number.  Gnus will
7729 then, if it sits waiting longer than that number of seconds for a reply
7730 from the server, shut down the connection, start a new one, and resend
7731 the command.  This should hopefully be transparent to the user.  A
7732 likely number is 30 seconds. 
7733
7734 @item nntp-retry-on-break
7735 @vindex nntp-retry-on-break
7736 If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus
7737 hangs.  This will have much the same effect as the command timeout
7738 described above.
7739
7740 @item nntp-server-hook
7741 @vindex nntp-server-hook
7742 This hook is run as the last step when connecting to an @sc{nntp}
7743 server.
7744
7745 @findex nntp-open-rlogin
7746 @findex nntp-open-network-stream
7747 @item nntp-open-server-function
7748 @vindex nntp-open-server-function
7749 This function is used to connect to the remote system.  Two pre-made
7750 functions are @code{nntp-open-network-stream}, which is the default, and
7751 simply connects to some port or other on the remote system.  The other
7752 is @code{nntp-open-rlogin}, which does an rlogin on the remote system,
7753 and then does a telnet to the @sc{nntp} server available there.
7754
7755 @item nntp-rlogin-parameters
7756 @vindex nntp-rlogin-parameters
7757 If you use @code{nntp-open-rlogin} as the
7758 @code{nntp-open-server-function}, this list will be used as the
7759 parameter list given to @code{rsh}.
7760
7761 @item nntp-end-of-line
7762 @vindex nntp-end-of-line
7763 String to use as end-of-line markers when talking to the @sc{nntp}
7764 server.  This is @samp{\r\n} by default, but should be @samp{\n} when
7765 using @code{rlogin} to talk to the server.
7766
7767 @item nntp-rlogin-user-name
7768 @vindex nntp-rlogin-user-name
7769 User name on the remote system when using the @code{rlogin} connect
7770 function. 
7771
7772 @item nntp-address
7773 @vindex nntp-address
7774 The address of the remote system running the @sc{nntp} server.
7775
7776 @item nntp-port-number
7777 @vindex nntp-port-number
7778 Port number to connect to when using the @code{nntp-open-network-stream}
7779 connect function.
7780
7781 @item nntp-buggy-select
7782 @vindex nntp-buggy-select
7783 Set this to non-@code{nil} if your select routine is buggy.
7784
7785 @item nntp-nov-is-evil 
7786 @vindex nntp-nov-is-evil 
7787 If the @sc{nntp} server does not support @sc{nov}, you could set this
7788 variable to @code{t}, but @code{nntp} usually checks whether @sc{nov}
7789 can be used automatically.
7790
7791 @item nntp-xover-commands
7792 @vindex nntp-xover-commands
7793 @cindex nov
7794 @cindex XOVER
7795 List of strings that are used as commands to fetch @sc{nov} lines from a
7796 server.  The default value of this variable is @code{("XOVER"
7797 "XOVERVIEW")}. 
7798
7799 @item nntp-nov-gap
7800 @vindex nntp-nov-gap
7801 @code{nntp} normally sends just one big request for @sc{nov} lines to
7802 the server.  The server responds with one huge list of lines.  However,
7803 if you have read articles 2-5000 in the group, and only want to read
7804 article 1 and 5001, that means that @code{nntp} will fetch 4999 @sc{nov}
7805 lines that you do not want, and will not use.  This variable says how
7806 big a gap between two consecutive articles is allowed to be before the
7807 @code{XOVER} request is split into several request.  Note that if your
7808 network is fast, setting this variable to a really small number means
7809 that fetching will probably be slower.  If this variable is @code{nil},
7810 @code{nntp} will never split requests.
7811
7812 @item nntp-prepare-server-hook
7813 @vindex nntp-prepare-server-hook
7814 A hook run before attempting to connect to an @sc{nntp} server.
7815
7816 @item nntp-async-number
7817 @vindex nntp-async-number
7818 How many articles should be pre-fetched when in asynchronous mode.  If
7819 this variable is @code{t}, @code{nntp} will pre-fetch all the articles
7820 that it can without bound.  If it is @code{nil}, no pre-fetching will be
7821 made.
7822
7823 @item nntp-warn-about-losing-connection
7824 @vindex nntp-warn-about-losing-connection
7825 If this variable is non-@code{nil}, some noise will be made when a
7826 server closes connection.
7827
7828 @end table
7829
7830
7831 @node News Spool
7832 @subsection News Spool
7833 @cindex nnspool
7834 @cindex news spool
7835
7836 Subscribing to a foreign group from the local spool is extremely easy,
7837 and might be useful, for instance, to speed up reading groups like
7838 @samp{alt.binaries.pictures.furniture}.
7839
7840 Anyways, you just specify @code{nnspool} as the method and @samp{} (or
7841 anything else) as the address.
7842
7843 If you have access to a local spool, you should probably use that as the
7844 native select method (@pxref{Finding the News}).  It is normally faster
7845 than using an @code{nntp} select method, but might not be.  It depends.
7846 You just have to try to find out what's best at your site.
7847
7848 @table @code
7849
7850 @item nnspool-inews-program
7851 @vindex nnspool-inews-program
7852 Program used to post an article.
7853
7854 @item nnspool-inews-switches
7855 @vindex nnspool-inews-switches
7856 Parameters given to the inews program when posting an article. 
7857
7858 @item nnspool-spool-directory
7859 @vindex nnspool-spool-directory
7860 Where @code{nnspool} looks for the articles.  This is normally
7861 @file{/usr/spool/news/}.
7862
7863 @item nnspool-nov-directory 
7864 @vindex nnspool-nov-directory 
7865 Where @code{nnspool} will look for @sc{nov} files.  This is normally
7866 @file{/usr/spool/news/over.view/}.
7867
7868 @item nnspool-lib-dir
7869 @vindex nnspool-lib-dir
7870 Where the news lib dir is (@file{/usr/lib/news/} by default).
7871
7872 @item nnspool-active-file
7873 @vindex nnspool-active-file
7874 The path of the active file.
7875
7876 @item nnspool-newsgroups-file
7877 @vindex nnspool-newsgroups-file
7878 The path of the group descriptions file.
7879
7880 @item nnspool-history-file
7881 @vindex nnspool-history-file
7882 The path of the news history file.
7883
7884 @item nnspool-active-times-file
7885 @vindex nnspool-active-times-file
7886 The path of the active date file.
7887
7888 @item nnspool-nov-is-evil
7889 @vindex nnspool-nov-is-evil
7890 If non-@code{nil}, @code{nnspool} won't try to use any @sc{nov} files
7891 that it finds.
7892
7893 @item nnspool-sift-nov-with-sed
7894 @vindex nnspool-sift-nov-with-sed
7895 @cindex sed
7896 If non-@code{nil}, which is the default, use @code{sed} to get the
7897 relevant portion from the overview file.  If nil, @code{nnspool} will
7898 load the entire file into a buffer and process it there.
7899
7900 @end table
7901
7902
7903 @node Getting Mail
7904 @section Getting Mail
7905 @cindex reading mail
7906 @cindex mail
7907
7908 Reading mail with a newsreader---isn't that just plain WeIrD? But of
7909 course.
7910
7911 @menu
7912 * Getting Started Reading Mail:: A simple cookbook example.
7913 * Splitting Mail::               How to create mail groups.
7914 * Mail Backend Variables::       Variables for customizing mail handling.
7915 * Fancy Mail Splitting::         Gnus can do hairy splitting of incoming mail.
7916 * Mail and Procmail::            Reading mail groups that procmail create.
7917 * Incorporating Old Mail::       What about the old mail you have?
7918 * Expiring Mail::                Getting rid of unwanted mail.
7919 * Duplicates::                   Dealing with duplicated mail.
7920 * Not Reading Mail::             Using mail backends for reading other files.
7921 * Choosing a Mail Backend::      Gnus can read a variety of mail formats.
7922 @end menu
7923
7924
7925 @node Getting Started Reading Mail
7926 @subsection Getting Started Reading Mail
7927
7928 It's quite easy to use Gnus to read your new mail.  You just plonk the
7929 mail backend of your choice into @code{gnus-secondary-select-methods},
7930 and things will happen automatically.
7931
7932 For instance, if you want to use @code{nnml} (which is a one file per
7933 mail backend), you could put the following in your @file{.gnus} file:
7934
7935 @lisp
7936 (setq gnus-secondary-select-methods
7937       '((nnml "private")))
7938 @end lisp
7939
7940 Now, the next time you start Gnus, this backend will be queried for new
7941 articles, and it will move all the messages in your spool file to its
7942 directory, which is @code{~/Mail/} by default.  The new group that will
7943 be created (@samp{mail.misc}) will be subscribed, and you can read it
7944 like any other group.
7945
7946 You will probably want to split the mail into several groups, though:
7947
7948 @lisp
7949 (setq nnmail-split-methods
7950   '(("junk" "^From:.*Lars Ingebrigtsen")
7951     ("crazy" "^Subject:.*die\\|^Organization:.*flabby")
7952     ("other" "")))
7953 @end lisp
7954
7955 This will result in three new mail groups being created:
7956 @samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}.  All the
7957 mail that doesn't fit into the first two groups will be placed in the
7958 latter group.
7959
7960 This should be sufficient for reading mail with Gnus.  You might want to
7961 give the other sections in this part of the manual a perusal, though,
7962 especially @pxref{Choosing a Mail Backend} and @pxref{Expiring Mail}. 
7963
7964
7965 @node Splitting Mail
7966 @subsection Splitting Mail
7967 @cindex splitting mail
7968 @cindex mail splitting
7969
7970 @vindex nnmail-split-methods
7971 The @code{nnmail-split-methods} variable says how the incoming mail is
7972 to be split into groups.
7973
7974 @lisp
7975 (setq nnmail-split-methods
7976   '(("mail.junk" "^From:.*Lars Ingebrigtsen")
7977     ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby")
7978     ("mail.other" "")))
7979 @end lisp
7980
7981 This variable is a list of lists, where the first element of each of
7982 these lists is the name of the mail group (they do not have to be called
7983 something beginning with @samp{mail}, by the way), and the second
7984 element is a regular expression used on the header of each mail to
7985 determine if it belongs in this mail group.
7986
7987 If the first element is the special symbol @code{junk}, then messages
7988 that match the regexp will disappear into the aether.  Use with
7989 extreme caution. 
7990
7991 The second element can also be a function.  In that case, it will be
7992 called narrowed to the headers with the first element of the rule as the
7993 argument.  It should return a non-@code{nil} value if it thinks that the
7994 mail belongs in that group.
7995
7996 The last of these groups should always be a general one, and the regular
7997 expression should @emph{always} be @samp{} so that it matches any
7998 mails that haven't been matched by any of the other regexps.
7999
8000 If you like to tinker with this yourself, you can set this variable to a
8001 function of your choice.  This function will be called without any
8002 arguments in a buffer narrowed to the headers of an incoming mail
8003 message.  The function should return a list of groups names that it
8004 thinks should carry this mail message.
8005
8006 Note that the mail backends are free to maul the poor, innocent
8007 incoming headers all they want to.  They all add @code{Lines} headers;
8008 some add @code{X-Gnus-Group} headers; most rename the Unix mbox
8009 @code{From<SPACE>} line to something else.
8010
8011 @vindex nnmail-crosspost
8012 The mail backends all support cross-posting.  If several regexps match,
8013 the mail will be ``cross-posted'' to all those groups.
8014 @code{nnmail-crosspost} says whether to use this mechanism or not.  Note
8015 that no articles are crossposted to the general (@samp{}) group.
8016
8017 @vindex nnmail-crosspost-link-function
8018 @cindex crosspost
8019 @cindex links
8020 @code{nnmh} and @code{nnml} makes crossposts by creating hard links to
8021 the crossposted articles.  However, not all files systems support hard
8022 links.  If that's the case for you, set
8023 @code{nnmail-crosspost-link-function} to @code{copy-file}.  (This
8024 variable is @code{add-name-to-file} by default.)  
8025
8026 Gnus gives you all the opportunity you could possibly want for shooting
8027 yourself in the foot.  Let's say you create a group that will contain
8028 all the mail you get from your boss.  And then you accidentally
8029 unsubscribe from the group.  Gnus will still put all the mail from your
8030 boss in the unsubscribed group, and so, when your boss mails you ``Have
8031 that report ready by Monday or you're fired!'', you'll never see it and,
8032 come Tuesday, you'll still believe that you're gainfully employed while
8033 you really should be out collecting empty bottles to save up for next
8034 month's rent money.
8035
8036
8037 @node Mail Backend Variables
8038 @subsection Mail Backend Variables
8039
8040 These variables are (for the most part) pertinent to all the various
8041 mail backends.
8042
8043 @table @code
8044 @vindex nnmail-read-incoming-hook
8045 @item nnmail-read-incoming-hook
8046 The mail backends all call this hook after reading new mail.  You can
8047 use this hook to notify any mail watch programs, if you want to.
8048
8049 @vindex nnmail-spool-file
8050 @item nnmail-spool-file
8051 @cindex POP mail
8052 @cindex MAILHOST
8053 @cindex movemail
8054 @vindex nnmail-pop-password
8055 @vindex nnmail-pop-password-required
8056 The backends will look for new mail in this file.  If this variable is
8057 @code{nil}, the mail backends will never attempt to fetch mail by
8058 themselves.  If you are using a POP mail server and your name is
8059 @samp{larsi}, you should set this variable to @samp{po:larsi}.  If
8060 your name is not @samp{larsi}, you should probably modify that
8061 slightly, but you may have guessed that already, you smart & handsome
8062 devil!  You can also set this variable to @code{pop}, and Gnus will try
8063 to figure out the POP mail string by itself.  In any case, Gnus will
8064 call @code{movemail} which will contact the POP server named in the
8065 @code{MAILHOST} environment variable.  If the POP server needs a
8066 password, you can either set @code{nnmail-pop-password-required} to
8067 @code{t} and be prompted for the password, or set
8068 @code{nnmail-pop-password} to the password itself.
8069
8070 When you use a mail backend, Gnus will slurp all your mail from your
8071 inbox and plonk it down in your home directory.  Gnus doesn't move any
8072 mail if you're not using a mail backend---you have to do a lot of magic
8073 invocations first.  At the time when you have finished drawing the
8074 pentagram, lightened the candles, and sacrificed the goat, you really
8075 shouldn't be too surprised when Gnus moves your mail.
8076
8077 @vindex nnmail-use-procmail
8078 @vindex nnmail-procmail-suffix
8079 @item nnmail-use-procmail
8080 If non-@code{nil}, the mail backends will look in
8081 @code{nnmail-procmail-directory} for incoming mail.  All the files in
8082 that directory that have names ending in @code{nnmail-procmail-suffix}
8083 will be considered incoming mailboxes, and will be searched for new
8084 mail.
8085
8086 @vindex nnmail-crash-box
8087 @item nnmail-crash-box
8088 When the mail backends read a spool file, it is first moved to this
8089 file, which is @file{~/.gnus-crash-box} by default.  If this file
8090 already exists, it will always be read (and incorporated) before any
8091 other spool files.
8092
8093 @vindex nnmail-prepare-incoming-hook
8094 @item nnmail-prepare-incoming-hook
8095 This is run in a buffer that holds all the new incoming mail, and can be
8096 used for, well, anything, really.
8097
8098 @vindex nnmail-split-hook
8099 @item nnmail-split-hook
8100 @findex article-decode-rfc1522
8101 @findex RFC1522 decoding
8102 Hook run in the buffer where the mail headers of each message is kept
8103 just before the splitting based on these headers is done.  The hook is
8104 free to modify the buffer contents in any way it sees fit---the buffer
8105 is discarded after the splitting has been done, and no changes perfromed
8106 in the buffer will show up in any files.  @code{article-decode-rfc1522}
8107 is one likely function to add to this hook.
8108
8109 @vindex nnmail-pre-get-new-mail-hook
8110 @vindex nnmail-post-get-new-mail-hook
8111 @item nnmail-pre-get-new-mail-hook
8112 @itemx nnmail-post-get-new-mail-hook
8113 These are two useful hooks executed when treating new incoming
8114 mail---@code{nnmail-pre-get-new-mail-hook} (is called just before
8115 starting to handle the new mail) and
8116 @code{nnmail-post-get-new-mail-hook} (is called when the mail handling
8117 is done).  Here's and example of using these two hooks to change the
8118 default file modes the new mail files get:
8119
8120 @lisp
8121 (add-hook 'gnus-pre-get-new-mail-hook 
8122           (lambda () (set-default-file-modes 511)))
8123
8124 (add-hook 'gnus-post-get-new-mail-hook 
8125           (lambda () (set-default-file-modes 551)))
8126 @end lisp
8127
8128 @item nnmail-tmp-directory
8129 @vindex nnmail-tmp-directory
8130 This variable says where to move the incoming mail to while processing
8131 it.  This is usually done in the same directory that the mail backend
8132 inhabits (i.e., @file{~/Mail/}), but if this variable is non-@code{nil},
8133 it will be used instead.
8134
8135 @item nnmail-movemail-program
8136 @vindex nnmail-movemail-program
8137 This program is executed to move mail from the user's inbox to her home
8138 directory.  The default is @samp{movemail}.
8139
8140 @item nnmail-delete-incoming
8141 @vindex nnmail-delete-incoming
8142 @cindex incoming mail files
8143 @cindex deleting incoming files
8144 If non-@code{nil}, the mail backends will delete the temporary incoming
8145 file after splitting mail into the proper groups.  This is @code{nil} by
8146 default for reasons of security.
8147
8148 Since Red Gnus is an alpha release, it is to be expected to lose mail.
8149 (No Gnus release since (ding) Gnus 0.10 (or something like that) have
8150 lost mail, I think, but that's not the point.)  By not deleting the
8151 Incoming* files, one can be sure to not lose mail -- if Gnus totally
8152 whacks out, one can always recover what was lost.
8153
8154 Delete the @file{Incoming*} files at will.
8155
8156 @item nnmail-use-long-file-names
8157 @vindex nnmail-use-long-file-names
8158 If non-@code{nil}, the mail backends will use long file and directory
8159 names.  Groups like @samp{mail.misc} will end up in directories like
8160 @file{mail.misc/}.  If it is @code{nil}, the same group will end up in
8161 @file{mail/misc/}.
8162
8163 @item nnmail-delete-file-function
8164 @vindex nnmail-delete-file-function
8165 @findex delete-file
8166 Function called to delete files.  It is @code{delete-file} by default. 
8167
8168 @end table
8169
8170
8171 @node Fancy Mail Splitting
8172 @subsection Fancy Mail Splitting
8173 @cindex mail splitting
8174 @cindex fancy mail splitting
8175
8176 @vindex nnmail-split-fancy
8177 @findex nnmail-split-fancy
8178 If the rather simple, standard method for specifying how to split mail
8179 doesn't allow you to do what you want, you can set
8180 @code{nnmail-split-methods} to @code{nnmail-split-fancy}.  Then you can
8181 play with the @code{nnmail-split-fancy} variable.
8182
8183 Let's look at an example value of this variable first:
8184
8185 @lisp
8186 ;; Messages from the mailer daemon are not crossposted to any of
8187 ;; the ordinary groups.  Warnings are put in a separate group
8188 ;; from real errors.
8189 (| ("from" mail (| ("subject" "warn.*" "mail.warning")
8190                    "mail.misc"))
8191    ;; Non-error messages are crossposted to all relevant
8192    ;; groups, but we don't crosspost between the group for the
8193    ;; (ding) list and the group for other (ding) related mail.
8194    (& (| (any "ding@@ifi\\.uio\\.no" "ding.list")
8195          ("subject" "ding" "ding.misc"))
8196       ;; Other mailing lists...
8197       (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list")
8198       (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list")
8199       ;; People...
8200       (any "larsi@@ifi\\.uio\\.no" "people.Lars Magne Ingebrigtsen"))
8201    ;; Unmatched mail goes to the catch all group.
8202    "misc.misc"))")
8203 @end lisp
8204
8205 This variable has the format of a @dfn{split}.  A split is a (possibly)
8206 recursive structure where each split may contain other splits.  Here are
8207 the five possible split syntaxes:
8208
8209 @table @dfn
8210
8211 @item GROUP 
8212 If the split is a string, that will be taken as a group name. 
8213
8214 @item (FIELD VALUE SPLIT)
8215 If the split is a list, and the first element is a string, then that
8216 means that if header FIELD (a regexp) contains VALUE (also a regexp),
8217 then store the message as specified by SPLIT.
8218
8219 @item (| SPLIT...)
8220 If the split is a list, and the first element is @code{|} (vertical
8221 bar), then process each SPLIT until one of them matches.  A SPLIT is
8222 said to match if it will cause the mail message to be stored in one or
8223 more groups.
8224
8225 @item (& SPLIT...)
8226 If the split is a list, and the first element is @code{&}, then process
8227 all SPLITs in the list.
8228
8229 @item junk
8230 Junk this article.
8231 @end table
8232
8233 In these splits, FIELD must match a complete field name.  VALUE must
8234 match a complete word according to the fundamental mode syntax table.
8235 You can use @code{.*} in the regexps to match partial field names or
8236 words.
8237
8238 @vindex nnmail-split-abbrev-alist
8239 FIELD and VALUE can also be lisp symbols, in that case they are expanded
8240 as specified by the variable @code{nnmail-split-abbrev-alist}.  This is
8241 an alist of cons cells, where the car of the cells contains the key, and
8242 the cdr contains a string.
8243
8244 @vindex nnmail-split-fancy-syntax-table
8245 @code{nnmail-split-fancy-syntax-table} is the syntax table in effect
8246 when all this splitting is performed.
8247
8248
8249 @node Mail and Procmail
8250 @subsection Mail and Procmail
8251 @cindex procmail
8252
8253 @cindex slocal
8254 @cindex elm
8255 Many people use @code{procmail} (or some other mail filter program or
8256 external delivery agent---@code{slocal}, @code{elm}, etc) to split
8257 incoming mail into groups.  If you do that, you should set
8258 @code{nnmail-spool-file} to @code{procmail} to ensure that the mail
8259 backends never ever try to fetch mail by themselves.
8260
8261 This also means that you probably don't want to set
8262 @code{nnmail-split-methods} either, which has some, perhaps, unexpected
8263 side effects.
8264
8265 When a mail backend is queried for what groups it carries, it replies
8266 with the contents of that variable, along with any groups it has figured
8267 out that it carries by other means.  None of the backends (except
8268 @code{nnmh}) actually go out to the disk and check what groups actually
8269 exist.  (It's not trivial to distinguish between what the user thinks is
8270 a basis for a newsgroup and what is just a plain old file or directory.)
8271
8272 This means that you have to tell Gnus (and the backends) what groups
8273 exist by hand.
8274
8275 Let's take the @code{nnmh} backend as an example. 
8276
8277 The folders are located in @code{nnmh-directory}, say, @file{~/Mail/}.
8278 There are three folders, @file{foo}, @file{bar} and @file{mail.baz}.
8279
8280 Go to the group buffer and type @kbd{G m}.  When prompted, answer
8281 @samp{foo} for the name and @samp{nnmh} for the method.  Repeat
8282 twice for the two other groups, @samp{bar} and @samp{mail.baz}.  Be sure
8283 to include all your mail groups.
8284
8285 That's it.  You are now set to read your mail.  An active file for this
8286 method will be created automatically.
8287
8288 @vindex nnmail-procmail-suffix
8289 @vindex nnmail-procmail-directory
8290 If you use @code{nnfolder} or any other backend that store more than a
8291 single article in each file, you should never have procmail add mails to
8292 the file that Gnus sees.  Instead, procmail should put all incoming mail
8293 in @code{nnmail-procmail-directory}.  To arrive at the file name to put
8294 the incoming mail in, append @code{nnmail-procmail-suffix} to the group
8295 name.  The mail backends will read the mail from these files.
8296
8297 @vindex nnmail-resplit-incoming
8298 When Gnus reads a file called @file{mail.misc.spool}, this mail will be
8299 put in the @code{mail.misc}, as one would expect.  However, if you want
8300 Gnus to split the mail the normal way, you could set
8301 @code{nnmail-resplit-incoming} to @code{t}.
8302
8303 @vindex nnmail-keep-last-article
8304 If you use @code{procmail} to split things directory into an @code{nnmh}
8305 directory (which you shouldn't do), you should set
8306 @code{nnmail-keep-last-article} to non-@code{nil} to prevent Gnus from
8307 ever expiring the final article in a mail newsgroup.  This is quite,
8308 quite important.
8309
8310
8311 @node Incorporating Old Mail
8312 @subsection Incorporating Old Mail
8313
8314 Most people have lots of old mail stored in various file formats.  If
8315 you have set up Gnus to read mail using one of the spiffy Gnus mail
8316 backends, you'll probably wish to have that old mail incorporated into
8317 your mail groups.
8318
8319 Doing so can be quite easy.
8320
8321 To take an example: You're reading mail using @code{nnml}
8322 (@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a
8323 satisfactory value (@pxref{Splitting Mail}).  You have an old Unix mbox
8324 file filled with important, but old, mail.  You want to move it into
8325 your @code{nnml} groups.
8326
8327 Here's how:
8328
8329 @enumerate
8330 @item
8331 Go to the group buffer.
8332
8333 @item 
8334 Type `G f' and give the path of the mbox file when prompted to create an
8335 @code{nndoc} group from the mbox file (@pxref{Foreign Groups}).
8336
8337 @item 
8338 Type `SPACE' to enter the newly created group.
8339
8340 @item
8341 Type `M P b' to process-mark all articles in this group (@pxref{Setting
8342 Process Marks}).
8343
8344 @item 
8345 Type `B r' to respool all the process-marked articles, and answer
8346 @samp{nnml} when prompted (@pxref{Mail Group Commands}).
8347 @end enumerate
8348
8349 All the mail messages in the mbox file will now also be spread out over
8350 all your @code{nnml} groups.  Try entering them and check whether things
8351 have gone without a glitch.  If things look ok, you may consider
8352 deleting the mbox file, but I wouldn't do that unless I was absolutely
8353 sure that all the mail has ended up where it should be.
8354
8355 Respooling is also a handy thing to do if you're switching from one mail
8356 backend to another.  Just respool all the mail in the old mail groups
8357 using the new mail backend.
8358
8359
8360 @node Expiring Mail
8361 @subsection Expiring Mail
8362 @cindex article expiry
8363
8364 Traditional mail readers have a tendency to remove mail articles when
8365 you mark them as read, in some way.  Gnus takes a fundamentally
8366 different approach to mail reading.
8367
8368 Gnus basically considers mail just to be news that has been received in
8369 a rather peculiar manner.  It does not think that it has the power to
8370 actually change the mail, or delete any mail messages.  If you enter a
8371 mail group, and mark articles as ``read'', or kill them in some other
8372 fashion, the mail articles will still exist on the system.  I repeat:
8373 Gnus will not delete your old, read mail.  Unless you ask it to, of
8374 course.
8375
8376 To make Gnus get rid of your unwanted mail, you have to mark the
8377 articles as @dfn{expirable}.  This does not mean that the articles will
8378 disappear right away, however.  In general, a mail article will be
8379 deleted from your system if, 1) it is marked as expirable, AND 2) it is
8380 more than one week old.  If you do not mark an article as expirable, it
8381 will remain on your system until hell freezes over.  This bears
8382 repeating one more time, with some spurious capitalizations: IF you do
8383 NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES.
8384
8385 @vindex gnus-auto-expirable-newsgroups
8386 You do not have to mark articles as expirable by hand.  Groups that
8387 match the regular expression @code{gnus-auto-expirable-newsgroups} will
8388 have all articles that you read marked as expirable automatically.  All
8389 articles that are marked as expirable have an @samp{E} in the first
8390 column in the summary buffer.
8391
8392 Let's say you subscribe to a couple of mailing lists, and you want the
8393 articles you have read to disappear after a while:
8394
8395 @lisp
8396 (setq gnus-auto-expirable-newsgroups 
8397       "mail.nonsense-list\\|mail.nice-list")
8398 @end lisp
8399
8400 Another way to have auto-expiry happen is to have the element
8401 @code{auto-expire} in the group parameters of the group. 
8402
8403 @vindex nnmail-expiry-wait
8404 The @code{nnmail-expiry-wait} variable supplies the default time an
8405 expirable article has to live.  The default is seven days.  
8406
8407 Gnus also supplies a function that lets you fine-tune how long articles
8408 are to live, based on what group they are in.  Let's say you want to
8409 have one month expiry period in the @samp{mail.private} group, a one day
8410 expiry period in the @samp{mail.junk} group, and a six day expiry period
8411 everywhere else:
8412
8413 @vindex nnmail-expiry-wait-function
8414 @lisp
8415 (setq nnmail-expiry-wait-function
8416       (lambda (group)
8417        (cond ((string= group "mail.private")
8418                31)
8419              ((string= group "mail.junk")
8420                1)
8421              ((string= group "important")
8422                'never)
8423              (t
8424                6))))
8425 @end lisp
8426
8427 The group names that this function is fed are ``unadorned'' group
8428 names---no @samp{nnml:} prefixes and the like.
8429
8430 The @code{nnmail-expiry-wait} variable and
8431 @code{nnmail-expiry-wait-function} function can be either a number (not
8432 necessarily an integer) or the symbols @code{immediate} or
8433 @code{never}.  
8434
8435 You can also use the @code{expiry-wait} group parameter to selectively
8436 change the expiry period (@pxref{Group Parameters}).
8437
8438 @vindex nnmail-keep-last-article
8439 If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never
8440 expire the final article in a mail newsgroup.  This is to make life
8441 easier for procmail users.
8442
8443 @vindex gnus-total-expirable-newsgroups
8444 By the way, that line up there about Gnus never expiring non-expirable
8445 articles is a lie.  If you put @code{total-expire} in the group
8446 parameters, articles will not be marked as expirable, but all read
8447 articles will be put through the expiry process.  Use with extreme
8448 caution.  Even more dangerous is the
8449 @code{gnus-total-expirable-newsgroups} variable.  All groups that match
8450 this regexp will have all read articles put through the expiry process,
8451 which means that @emph{all} old mail articles in the groups in question
8452 will be deleted after a while.  Use with extreme caution, and don't come
8453 crying to me when you discover that the regexp you used matched the
8454 wrong group and all your important mail has disappeared.  Be a
8455 @emph{man}!  Or a @emph{woman}!  Whatever you feel more comfortable
8456 with!  So there!
8457
8458
8459 @node Duplicates
8460 @subsection Duplicates
8461
8462 @vindex nnmail-treat-duplicates
8463 @vindex nnmail-message-id-cache-length
8464 @vindex nnmail-message-id-cache-file
8465 @cindex duplicate mails
8466 If you are a member of a couple of mailing list, you will sometime
8467 receive two copies of the same mail.  This can be quite annoying, so
8468 @code{nnmail} checks for and treats any duplicates it might find.  To do
8469 this, it keeps a cache of old @code{Message-ID}s -
8470 @code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by
8471 default.  The approximate maximum number of @code{Message-ID}s stored
8472 there is controlled by the @code{nnmail-message-id-cache-length}
8473 variable, which is 1000 by default. (So 1000 @code{Message-ID}s will be
8474 stored.) If all this sounds scary to you, you can set
8475 @code{nnmail-treat-duplicates} to @code{warn} (which is what it is by
8476 default), and @code{nnmail} won't delete duplicate mails.  Instead it
8477 will generate a brand new @code{Message-ID} for the mail and insert a
8478 warning into the head of the mail saying that it thinks that this is a
8479 duplicate of a different message.  
8480
8481 This variable can also be a function.  If that's the case, the function
8482 will be called from a buffer narrowed to the message in question with
8483 the @code{Message-ID} as a parameter.  The function must return either
8484 @code{nil}, @code{warn}, or @code{delete}.
8485
8486 You can turn this feature off completely by setting the variable to
8487 @code{nil}.
8488
8489 If you want all the duplicate mails to be put into a special
8490 @dfn{duplicates} group, you could do that using the normal mail split
8491 methods:
8492
8493 @lisp
8494 (setq nnmail-split-fancy
8495       '(| ;; Messages duplicates go to a separate group.
8496           ("gnus-warning" "duplication of message" "duplicate")
8497           ;; Message from daemons, postmaster, and the like to another.
8498           (any mail "mail.misc")
8499           ;; Other rules.
8500           [ ... ] ))
8501 @end lisp
8502
8503 Or something like:
8504 @lisp
8505 (setq nnmail-split-methods 
8506       '(("duplicates" "^Gnus-Warning:")
8507         ;; Other rules.
8508         [...]))
8509 @end lisp
8510
8511 Here's a neat feature: If you know that the recipient reads her mail
8512 with Gnus, and that she has @code{nnmail-treat-duplicates} set to
8513 @code{delete}, you can send her as many insults as you like, just by
8514 using a @code{Message-ID} of a mail that you know that she's already
8515 received.  Think of all the fun!  She'll never see any of it!  Whee!
8516
8517
8518 @node Not Reading Mail
8519 @subsection Not Reading Mail
8520
8521 If you start using any of the mail backends, they have the annoying
8522 habit of assuming that you want to read mail with them.  This might not
8523 be unreasonable, but it might not be what you want.
8524
8525 If you set @code{nnmail-spool-file} to @code{nil}, none of the backends
8526 will ever attempt to read incoming mail, which should help.
8527
8528 @vindex nnbabyl-get-new-mail
8529 @vindex nnmbox-get-new-mail
8530 @vindex nnml-get-new-mail
8531 @vindex nnmh-get-new-mail
8532 @vindex nnfolder-get-new-mail
8533 This might be too much, if, for instance, you are reading mail quite
8534 happily with @code{nnml} and just want to peek at some old @sc{rmail}
8535 file you have stashed away with @code{nnbabyl}.  All backends have
8536 variables called backend-@code{get-new-mail}.  If you want to disable
8537 the @code{nnbabyl} mail reading, you edit the virtual server for the
8538 group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}.
8539
8540 All the mail backends will call @code{nn}*@code{-prepare-save-mail-hook}
8541 narrowed to the article to be saved before saving it when reading
8542 incoming mail.
8543
8544
8545 @node Choosing a Mail Backend
8546 @subsection Choosing a Mail Backend
8547
8548 Gnus will read the mail spool when you activate a mail group.  The mail
8549 file is first copied to your home directory.  What happens after that
8550 depends on what format you want to store your mail in.
8551
8552 @menu
8553 * Unix Mail Box::               Using the (quite) standard Un*x mbox.
8554 * Rmail Babyl::                 Emacs programs use the rmail babyl format.
8555 * Mail Spool::                  Store your mail in a private spool?
8556 * MH Spool::                    An mhspool-like backend.
8557 * Mail Folders::                Having one file for each group.
8558 @end menu
8559
8560
8561 @node Unix Mail Box
8562 @subsubsection Unix Mail Box
8563 @cindex nnmbox
8564 @cindex unix mail box
8565
8566 @vindex nnmbox-active-file
8567 @vindex nnmbox-mbox-file
8568 The @dfn{nnmbox} backend will use the standard Un*x mbox file to store
8569 mail.  @code{nnmbox} will add extra headers to each mail article to say
8570 which group it belongs in.
8571
8572 Virtual server settings:
8573
8574 @table @code
8575 @item nnmbox-mbox-file
8576 @vindex nnmbox-mbox-file
8577 The name of the mail box in the user's home directory. 
8578
8579 @item nnmbox-active-file
8580 @vindex nnmbox-active-file
8581 The name of the active file for the mail box.
8582
8583 @item nnmbox-get-new-mail
8584 @vindex nnmbox-get-new-mail
8585 If non-@code{nil}, @code{nnmbox} will read incoming mail and split it
8586 into groups.
8587 @end table
8588
8589
8590 @node Rmail Babyl
8591 @subsubsection Rmail Babyl
8592 @cindex nnbabyl
8593 @cindex rmail mbox
8594
8595 @vindex nnbabyl-active-file
8596 @vindex nnbabyl-mbox-file
8597 The @dfn{nnbabyl} backend will use a babyl mail box (aka. @dfn{rmail
8598 mbox}) to store mail. @code{nnbabyl} will add extra headers to each mail
8599 article to say which group it belongs in.
8600
8601 Virtual server settings:
8602
8603 @table @code
8604 @item nnbabyl-mbox-file
8605 @vindex nnbabyl-mbox-file
8606 The name of the rmail mbox file.
8607
8608 @item nnbabyl-active-file
8609 @vindex nnbabyl-active-file
8610 The name of the active file for the rmail box.
8611
8612 @item nnbabyl-get-new-mail
8613 @vindex nnbabyl-get-new-mail
8614 If non-@code{nil}, @code{nnbabyl} will read incoming mail. 
8615 @end table
8616
8617
8618 @node Mail Spool
8619 @subsubsection Mail Spool
8620 @cindex nnml
8621 @cindex mail @sc{nov} spool
8622
8623 The @dfn{nnml} spool mail format isn't compatible with any other known
8624 format.  It should be used with some caution.
8625
8626 @vindex nnml-directory
8627 If you use this backend, Gnus will split all incoming mail into files;
8628 one file for each mail, and put the articles into the correct
8629 directories under the directory specified by the @code{nnml-directory}
8630 variable.  The default value is @file{~/Mail/}.
8631
8632 You do not have to create any directories beforehand; Gnus will take
8633 care of all that.
8634
8635 If you have a strict limit as to how many files you are allowed to store
8636 in your account, you should not use this backend.  As each mail gets its
8637 own file, you might very well occupy thousands of inodes within a few
8638 weeks.  If this is no problem for you, and it isn't a problem for you
8639 having your friendly systems administrator walking around, madly,
8640 shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should
8641 know that this is probably the fastest format to use.  You do not have
8642 to trudge through a big mbox file just to read your new mail.
8643
8644 @code{nnml} is probably the slowest backend when it comes to article
8645 splitting.  It has to create lots of files, and it also generates
8646 @sc{nov} databases for the incoming mails.  This makes is the fastest
8647 backend when it comes to reading mail.
8648
8649 Virtual server settings:
8650
8651 @table @code
8652 @item nnml-directory
8653 @vindex nnml-directory
8654 All @code{nnml} directories will be placed under this directory. 
8655
8656 @item nnml-active-file
8657 @vindex nnml-active-file
8658 The active file for the @code{nnml} server.
8659
8660 @item nnml-newsgroups-file
8661 @vindex nnml-newsgroups-file
8662 The @code{nnml} group descriptions file.  @xref{Newsgroups File
8663 Format}. 
8664
8665 @item nnml-get-new-mail
8666 @vindex nnml-get-new-mail
8667 If non-@code{nil}, @code{nnml} will read incoming mail.
8668
8669 @item nnml-nov-is-evil
8670 @vindex nnml-nov-is-evil
8671 If non-@code{nil}, this backend will ignore any @sc{nov} files.  
8672
8673 @item nnml-nov-file-name
8674 @vindex nnml-nov-file-name
8675 The name of the @sc{nov} files.  The default is @file{.overview}. 
8676
8677 @item nnml-prepare-save-mail-hook
8678 @vindex nnml-prepare-save-mail-hook
8679 Hook run narrowed to an article before saving.
8680
8681 @end table
8682
8683 @findex nnml-generate-nov-databases
8684 If your @code{nnml} groups and @sc{nov} files get totally out of whack,
8685 you can do a complete update by typing @kbd{M-x
8686 nnml-generate-nov-databases}.  This command will trawl through the
8687 entire @code{nnml} hierarchy, looking at each and every article, so it
8688 might take a while to complete.
8689
8690
8691 @node MH Spool
8692 @subsubsection MH Spool
8693 @cindex nnmh
8694 @cindex mh-e mail spool
8695
8696 @code{nnmh} is just like @code{nnml}, except that is doesn't generate
8697 @sc{nov} databases and it doesn't keep an active file.  This makes
8698 @code{nnmh} a @emph{much} slower backend than @code{nnml}, but it also
8699 makes it easier to write procmail scripts for.
8700
8701 Virtual server settings:
8702
8703 @table @code
8704 @item nnmh-directory
8705 @vindex nnmh-directory
8706 All @code{nnmh} directories will be located under this directory.
8707
8708 @item nnmh-get-new-mail
8709 @vindex nnmh-get-new-mail
8710 If non-@code{nil}, @code{nnmh} will read incoming mail.
8711
8712 @item nnmh-be-safe
8713 @vindex nnmh-be-safe
8714 If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make
8715 sure that the articles in the folder are actually what Gnus thinks they
8716 are.  It will check date stamps and stat everything in sight, so
8717 setting this to @code{t} will mean a serious slow-down.  If you never
8718 use anything but Gnus to read the @code{nnmh} articles, you do not have
8719 to set this variable to @code{t}.
8720 @end table
8721
8722
8723 @node Mail Folders
8724 @subsubsection Mail Folders
8725 @cindex nnfolder
8726 @cindex mbox folders
8727 @cindex mail folders
8728
8729 @code{nnfolder} is a backend for storing each mail group in a separate
8730 file.  Each file is in the standard Un*x mbox format.  @code{nnfolder}
8731 will add extra headers to keep track of article numbers and arrival
8732 dates.
8733
8734 Virtual server settings:
8735
8736 @table @code
8737 @item nnfolder-directory
8738 @vindex nnfolder-directory
8739 All the @code{nnfolder} mail boxes will be stored under this directory. 
8740
8741 @item nnfolder-active-file
8742 @vindex nnfolder-active-file
8743 The name of the active file.
8744
8745 @item nnfolder-newsgroups-file
8746 @vindex nnfolder-newsgroups-file
8747 The name of the group descriptions file.  @xref{Newsgroups File Format}.
8748
8749 @item nnfolder-get-new-mail
8750 @vindex nnfolder-get-new-mail
8751 If non-@code{nil}, @code{nnfolder} will read incoming mail.
8752 @end table
8753
8754 @findex nnfolder-generate-active-file
8755 @kindex M-x nnfolder-generate-active-file
8756 If you have lots of @code{nnfolder}-like files you'd like to read with
8757 @code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file}
8758 command to make @code{nnfolder} aware of all likely files in
8759 @code{nnfolder-directory}.
8760
8761
8762 @node Other Sources
8763 @section Other Sources
8764
8765 Gnus can do more than just read news or mail.  The methods described
8766 below allow Gnus to view directories and files as if they were
8767 newsgroups.
8768
8769 @menu
8770 * Directory Groups::      You can read a directory as if it was a newsgroup.
8771 * Anything Groups::       Dired?  Who needs dired?
8772 * Document Groups::       Single files can be the basis of a group.
8773 * SOUP::                  Reading @sc{SOUP} packets ``offline''.
8774 * Web Searches::          Creating groups from articles that match a string.
8775 * Mail-To-News Gateways:: Posting articles via mail-to-news gateways.
8776 @end menu
8777
8778
8779 @node Directory Groups
8780 @subsection Directory Groups
8781 @cindex nndir
8782 @cindex directory groups
8783
8784 If you have a directory that has lots of articles in separate files in
8785 it, you might treat it as a newsgroup.  The files have to have numerical
8786 names, of course.
8787
8788 This might be an opportune moment to mention @code{ange-ftp}, that most
8789 wonderful of all wonderful Emacs packages.  When I wrote @code{nndir}, I
8790 didn't think much about it---a backend to read directories.  Big deal.
8791
8792 @code{ange-ftp} changes that picture dramatically.  For instance, if you
8793 enter @file{"/ftp.hpc.uh.edu:/pub/emacs/ding-list/"} as the the
8794 directory name, ange-ftp will actually allow you to read this directory
8795 over at @samp{sina} as a newsgroup.  Distributed news ahoy!
8796
8797 @code{nndir} will use @sc{nov} files if they are present.
8798
8799 @code{nndir} is a ``read-only'' backend---you can't delete or expire
8800 articles with this method.  You can use @code{nnmh} or @code{nnml} for
8801 whatever you use @code{nndir} for, so you could switch to any of those
8802 methods if you feel the need to have a non-read-only @code{nndir}.
8803
8804
8805 @node Anything Groups
8806 @subsection Anything Groups
8807 @cindex nneething
8808
8809 From the @code{nndir} backend (which reads a single spool-like
8810 directory), it's just a hop and a skip to @code{nneething}, which
8811 pretends that any arbitrary directory is a newsgroup.  Strange, but
8812 true.
8813
8814 When @code{nneething} is presented with a directory, it will scan this
8815 directory and assign article numbers to each file.  When you enter such
8816 a group, @code{nneething} must create ``headers'' that Gnus can use.
8817 After all, Gnus is a newsreader, in case you're
8818 forgetting. @code{nneething} does this in a two-step process.  First, it
8819 snoops each file in question.  If the file looks like an article (i.e.,
8820 the first few lines look like headers), it will use this as the head.
8821 If this is just some arbitrary file without a head (eg. a C source
8822 file), @code{nneething} will cobble up a header out of thin air.  It
8823 will use file ownership, name and date and do whatever it can with these
8824 elements.
8825
8826 All this should happen automatically for you, and you will be presented
8827 with something that looks very much like a newsgroup.  Totally like a
8828 newsgroup, to be precise.  If you select an article, it will be displayed
8829 in the article buffer, just as usual.
8830
8831 If you select a line that represents a directory, Gnus will pop you into
8832 a new summary buffer for this @code{nneething} group.  And so on.  You can
8833 traverse the entire disk this way, if you feel like, but remember that
8834 Gnus is not dired, really, and does not intend to be, either.
8835
8836 There are two overall modes to this action---ephemeral or solid.  When
8837 doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus
8838 will not store information on what files you have read, and what files
8839 are new, and so on.  If you create a solid @code{nneething} group the
8840 normal way with @kbd{G m}, Gnus will store a mapping table between
8841 article numbers and file names, and you can treat this group like any
8842 other groups.  When you activate a solid @code{nneething} group, you will
8843 be told how many unread articles it contains, etc., etc.
8844
8845 Some variables:
8846
8847 @table @code
8848 @item nneething-map-file-directory
8849 @vindex nneething-map-file-directory
8850 All the mapping files for solid @code{nneething} groups will be stored
8851 in this directory, which defaults to @file{~/.nneething/}.
8852
8853 @item nneething-exclude-files
8854 @vindex nneething-exclude-files
8855 All files that match this regexp will be ignored.  Nice to use to exclude
8856 auto-save files and the like, which is what it does by default.
8857
8858 @item nneething-map-file
8859 @vindex nneething-map-file
8860 Name of the map files.
8861 @end table
8862
8863
8864 @node Document Groups
8865 @subsection Document Groups
8866 @cindex nndoc
8867 @cindex documentation group
8868 @cindex help group
8869
8870 @code{nndoc} is a cute little thing that will let you read a single file
8871 as a newsgroup.  Several files types are supported:
8872
8873 @table @code
8874 @cindex babyl
8875 @cindex rmail mbox
8876
8877 @item babyl
8878 The babyl (rmail) mail box.
8879 @cindex mbox
8880 @cindex Unix mbox
8881
8882 @item mbox
8883 The standard Unix mbox file.
8884
8885 @cindex MMDF mail box
8886 @item mmdf
8887 The MMDF mail box format.
8888
8889 @item news
8890 Several news articles appended into a file.
8891
8892 @item rnews
8893 @cindex rnews batch files
8894 The rnews batch transport format.
8895 @cindex forwarded messages
8896
8897 @item forward
8898 Forwarded articles.
8899
8900 @item mime-digest
8901 @cindex digest
8902 @cindex MIME digest
8903 @cindex 1153 digest
8904 @cindex RFC 1153 digest
8905 @cindex RFC 341 digest
8906 MIME (RFC 1341) digest format.
8907
8908 @item standard-digest
8909 The standard (RFC 1153) digest format.
8910
8911 @item slack-digest
8912 Non-standard digest format---matches most things, but does it badly. 
8913 @end table
8914
8915 You can also use the special ``file type'' @code{guess}, which means
8916 that @code{nndoc} will try to guess what file type it is looking at.
8917 @code{digest} means that @code{nndoc} should guess what digest type the
8918 file is.
8919
8920 @code{nndoc} will not try to change the file or insert any extra headers into
8921 it---it will simply, like, let you use the file as the basis for a
8922 group.  And that's it.
8923
8924 If you have some old archived articles that you want to insert into your
8925 new & spiffy Gnus mail backend, @code{nndoc} can probably help you with
8926 that.  Say you have an old @file{RMAIL} file with mail that you now want
8927 to split into your new @code{nnml} groups.  You look at that file using
8928 @code{nndoc} (using the @kbd{G f} command in the group buffer
8929 (@pxref{Foreign Groups})), set the process mark on all the articles in
8930 the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r})
8931 using @code{nnml}.  If all goes well, all the mail in the @file{RMAIL}
8932 file is now also stored in lots of @code{nnml} directories, and you can
8933 delete that pesky @file{RMAIL} file.  If you have the guts!
8934
8935 Virtual server variables:
8936
8937 @table @code
8938 @item nndoc-article-type
8939 @vindex nndoc-article-type
8940 This should be one of @code{mbox}, @code{babyl}, @code{digest},
8941 @code{mmdf}, @code{forward}, @code{news}, @code{rnews},
8942 @code{mime-digest}, @code{clari-briefs}, or @code{guess}.
8943
8944 @item nndoc-post-type
8945 @vindex nndoc-post-type
8946 This variable says whether Gnus is to consider the group a news group or
8947 a mail group.  There are two legal values:  @code{mail} (the default)
8948 and @code{news}.
8949 @end table
8950
8951 @menu
8952 * Document Server Internals::   How to add your own document types.
8953 @end menu
8954
8955
8956 @node Document Server Internals
8957 @subsubsection Document Server Internals
8958
8959 Adding new document types to be recognized by @code{nndoc} isn't
8960 difficult.  You just have to whip up a definition of what the document
8961 looks like, write a predicate function to recognize that document type,
8962 and then hook into @code{nndoc}.
8963
8964 First, here's an example document type definition:
8965
8966 @example
8967 (mmdf 
8968  (article-begin .  "^\^A\^A\^A\^A\n")
8969  (body-end .  "^\^A\^A\^A\^A\n"))
8970 @end example
8971
8972 The definition is simply a unique @dfn{name} followed by a series of
8973 regexp pseudo-variable settings.  Below are the possible
8974 variables---don't be daunted by the number of variables; most document
8975 types can be defined with very few settings:
8976
8977 @table @code
8978 @item first-article
8979 If present, @code{nndoc} will skip past all text until it finds
8980 something that match this regexp.  All text before this will be
8981 totally ignored. 
8982
8983 @item article-begin
8984 This setting has to be present in all document type definitions.  It
8985 says what the beginning of each article looks like.
8986
8987 @item head-begin-function
8988 If present, this should be a function that moves point to the head of
8989 the article.
8990
8991 @item nndoc-head-begin
8992 If present, this should be a regexp that matches the head of the
8993 article. 
8994
8995 @item nndoc-head-end
8996 This should match the end of the head of the article.  It defaults to
8997 @samp{"^$"}---the empty line.
8998
8999 @item body-begin-function
9000 If present, this function should move point to the beginning of the body
9001 of the article.
9002
9003 @item body-begin
9004 This should match the beginning of the body of the article.  It defaults
9005 to @samp{^\n}.
9006
9007 @item body-end-function
9008 If present, this function should move point to the end of the body of
9009 the article.
9010
9011 @item body-end
9012 If present, this should match the end of the body of the article.
9013
9014 @item nndoc-file-end
9015 If present, this should match the end of the file.  All text after this
9016 regexp will be totally ignored. 
9017
9018 @end table
9019
9020 So, using these variables @code{nndoc} is able to dissect a document
9021 file into a series of articles, each with a head and a body.  However, a
9022 few more variables are needed since not all document types are all that
9023 news-like---variables needed to transform the head or the body into
9024 something that's palatable for Gnus:
9025
9026 @table @code
9027 @item prepare-body-function
9028 If present, this function will be called when requesting an article.  It
9029 will be called with point at the start of the body, and is useful if the
9030 document has encoded some parts of its contents. 
9031
9032 @item article-transform-function
9033 If present, this function is called when requesting an article.  It's
9034 meant to be used how more wide-ranging transformation of both head and
9035 body of the article.
9036
9037 @item generate-head-function
9038 If present, this function is called to generate a head that Gnus can
9039 understand.  It is called with the article number as a parameter, and is
9040 expected to generate a nice head for the article in question.  It is
9041 called when requesting the headers of all articles.
9042
9043 @end table
9044
9045 Let's look at the most complicated example I can come up with---standard
9046 digests:
9047
9048 @example
9049 (standard-digest
9050  (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+"))
9051  (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+"))
9052  (prepare-body-function . nndoc-unquote-dashes)
9053  (body-end-function . nndoc-digest-body-end)
9054  (head-end . "^ ?$")
9055  (body-begin . "^ ?\n")
9056  (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
9057  (subtype digest guess))
9058 @end example
9059
9060 We see that all text before a 70-width line of dashes is ignored; all
9061 text after a line that starts with that @samp{^End of} is also ignored;
9062 each article begins with a 30-width line of dashes; the line separating
9063 the head from the body may contain a single spcae; and that the body is
9064 run through @code{nndoc-unquote-dashes} before being delivered.
9065
9066 To hook your own document definition into @code{nndoc}, use the
9067 @code{nndoc-add-type} function.  It takes two parameters---the first is
9068 the definition itself and the second (optional) parameter says where in
9069 the document type definition alist to put this definition.  The alist is
9070 traversed sequentially, and @code{nndoc-TYPE-type-p} is called for each
9071 type.  So @code{nndoc-mmdf-type-p} is called to see whether a document
9072 is of @code{mmdf} type, and so on.  These type predicates should return
9073 @code{nil} if the document is not of the correct type; @code{t} if it is
9074 of the correct type; and a number if the document might be of the
9075 correct type.  A high number means high probability; a low number means
9076 low probability with @samp{0} being the lowest legal number.
9077
9078
9079 @node SOUP
9080 @subsection SOUP
9081 @cindex SOUP
9082 @cindex offline
9083
9084 In the PC world people often talk about ``offline'' newsreaders.  These
9085 are thingies that are combined reader/news transport monstrosities.
9086 With built-in modem programs.  Yecchh!
9087
9088 Of course, us Unix Weenie types of human beans use things like
9089 @code{uucp} and, like, @code{nntpd} and set up proper news and mail
9090 transport things like Ghod intended.  And then we just use normal
9091 newsreaders.  
9092
9093 However, it can sometimes be convenient to do something a that's a bit
9094 easier on the brain if you have a very slow modem, and you're not really
9095 that interested in doing things properly.  
9096
9097 A file format called @sc{soup} has been developed for transporting news
9098 and mail from servers to home machines and back again.  It can be a bit
9099 fiddly.
9100
9101 @enumerate
9102
9103 @item
9104 You log in on the server and create a @sc{soup} packet.  You can either
9105 use a dedicated @sc{soup} thingie, or you can use Gnus to create the
9106 packet with the @kbd{O s} command.
9107
9108 @item 
9109 You transfer the packet home.  Rail, boat, car or modem will do fine.
9110
9111 @item
9112 You put the packet in your home directory.
9113
9114 @item
9115 You fire up Gnus using the @code{nnsoup} backend as the native server.
9116
9117 @item
9118 You read articles and mail and answer and followup to the things you
9119 want.
9120
9121 @item 
9122 You do the @kbd{G s r} command to pack these replies into a @sc{soup}
9123 packet.
9124
9125 @item 
9126 You transfer this packet to the server.  
9127
9128 @item
9129 You use Gnus to mail this packet out with the @kbd{G s s} command.
9130
9131 @item
9132 You then repeat until you die.
9133
9134 @end enumerate
9135
9136 So you basically have a bipartite system---you use @code{nnsoup} for
9137 reading and Gnus for packing/sending these @sc{soup} packets.
9138
9139 @menu
9140 * SOUP Commands::     Commands for creating and sending @sc{soup} packets
9141 * SOUP Groups::       A backend for reading @sc{soup} packets.
9142 * SOUP Replies::      How to enable @code{nnsoup} to take over mail and news.
9143 @end menu
9144
9145
9146 @node SOUP Commands
9147 @subsubsection SOUP Commands
9148
9149 @table @kbd
9150 @item G s b
9151 @kindex G s b (Group)
9152 @findex gnus-group-brew-soup
9153 Pack all unread articles in the current group
9154 (@code{gnus-group-brew-soup}).  This command understands the
9155 process/prefix convention.
9156
9157 @item G s w
9158 @kindex G s w (Group)
9159 @findex gnus-soup-save-areas
9160 Save all data files (@code{gnus-soup-save-areas}).
9161
9162 @item G s s
9163 @kindex G s s (Group)
9164 @findex gnus-soup-send-replies
9165 Send all replies from the replies packet
9166 (@code{gnus-soup-send-replies}). 
9167
9168 @item G s p
9169 @kindex G s p (Group)
9170 @findex gnus-soup-pack-packet
9171 Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}). 
9172
9173 @item G s r
9174 @kindex G s r (Group)
9175 @findex nnsoup-pack-replies
9176 Pack all replies into a replies packet (@code{nnsoup-pack-replies}). 
9177
9178 @item O s
9179 @kindex O s (Summary)
9180 @findex gnus-soup-add-article
9181 This summary-mode command adds the current article to a @sc{soup} packet
9182 (@code{gnus-soup-add-article}).  It understands the process/prefix
9183 convention. 
9184
9185 @end table
9186
9187
9188 There are a few variables to customize where Gnus will put all these
9189 thingies:  
9190
9191 @table @code
9192
9193 @item gnus-soup-directory
9194 @vindex gnus-soup-directory
9195 Directory where Gnus will save intermediate files while composing
9196 @sc{soup} packets.  The default is @file{~/SoupBrew/}. 
9197
9198 @item gnus-soup-replies-directory
9199 @vindex gnus-soup-replies-directory
9200 This is what Gnus will use as a temporary directory while sending our
9201 reply packets.  The default is @file{~/SoupBrew/SoupReplies/}. 
9202
9203 @item gnus-soup-prefix-file
9204 @vindex gnus-soup-prefix-file
9205 Name of the file where Gnus stores the last used prefix.  The default is
9206 @samp{gnus-prefix}. 
9207
9208 @item gnus-soup-packer
9209 @vindex gnus-soup-packer
9210 A format string command for packing a @sc{soup} packet.  The default is
9211 @samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}. 
9212
9213 @item gnus-soup-unpacker
9214 @vindex gnus-soup-unpacker
9215 Format string command for unpacking a @sc{soup} packet.  The default is
9216 @samp{gunzip -c %s | tar xvf -}.
9217
9218 @item gnus-soup-packet-directory
9219 @vindex gnus-soup-packet-directory
9220 Where Gnus will look for reply packets.  The default is @file{~/}. 
9221
9222 @item gnus-soup-packet-regexp
9223 @vindex gnus-soup-packet-regexp
9224 Regular expression matching @sc{soup} reply packets in
9225 @code{gnus-soup-packet-directory}. 
9226
9227 @end table
9228  
9229
9230 @node SOUP Groups
9231 @subsubsection @sc{soup} Groups
9232 @cindex nnsoup
9233
9234 @code{nnsoup} is the backend for reading @sc{soup} packets.  It will
9235 read incoming packets, unpack them, and put them in a directory where
9236 you can read them at leisure.
9237
9238 These are the variables you can use to customize its behavior:
9239
9240 @table @code
9241
9242 @item nnsoup-tmp-directory
9243 @vindex nnsoup-tmp-directory
9244 When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this
9245 directory.  (@file{/tmp/} by default.)  
9246
9247 @item nnsoup-directory
9248 @vindex nnsoup-directory
9249 @code{nnsoup} then moves each message and index file to this directory.
9250 The default is @file{~/SOUP/}.
9251
9252 @item nnsoup-replies-directory 
9253 @vindex nnsoup-replies-directory 
9254 All replies will stored in this directory before being packed into a
9255 reply packet.  The default is @file{~/SOUP/replies/"}.
9256
9257 @item nnsoup-replies-format-type
9258 @vindex nnsoup-replies-format-type
9259 The @sc{soup} format of the replies packets.  The default is @samp{?n}
9260 (rnews), and I don't think you should touch that variable.  I probably
9261 shouldn't even have documented it.  Drats!  Too late!
9262
9263 @item nnsoup-replies-index-type
9264 @vindex nnsoup-replies-index-type
9265 The index type of the replies packet.  The is @samp{?n}, which means
9266 ``none''.  Don't fiddle with this one either!
9267
9268 @item nnsoup-active-file
9269 @vindex nnsoup-active-file
9270 Where @code{nnsoup} stores lots of information.  This is not an ``active
9271 file'' in the @code{nntp} sense; it's an Emacs Lisp file.  If you lose
9272 this file or mess it up in any way, you're dead.  The default is
9273 @file{~/SOUP/active}.
9274
9275 @item nnsoup-packer
9276 @vindex nnsoup-packer
9277 Format string command for packing a reply @sc{soup} packet.  The default
9278 is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}. 
9279
9280 @item nnsoup-unpacker
9281 @vindex nnsoup-unpacker
9282 Format string command for unpacking incoming @sc{soup} packets.  The
9283 default is @samp{gunzip -c %s | tar xvf -}. 
9284
9285 @item nnsoup-packet-directory
9286 @vindex nnsoup-packet-directory
9287 Where @code{nnsoup} will look for incoming packets.  The default is
9288 @file{~/}.  
9289
9290 @item nnsoup-packet-regexp
9291 @vindex nnsoup-packet-regexp
9292 Regular expression matching incoming @sc{soup} packets.  The default is
9293 @samp{Soupout}. 
9294
9295 @end table
9296
9297
9298 @node SOUP Replies
9299 @subsubsection SOUP Replies
9300
9301 Just using @code{nnsoup} won't mean that your postings and mailings end
9302 up in @sc{soup} reply packets automagically.  You have to work a bit
9303 more for that to happen.
9304
9305 @findex nnsoup-set-variables
9306 The @code{nnsoup-set-variables} command will set the appropriate
9307 variables to ensure that all your followups and replies end up in the
9308 @sc{soup} system.
9309
9310 In specific, this is what it does:
9311
9312 @lisp
9313 (setq message-send-news-function 'nnsoup-request-post)
9314 (setq message-send-mail-function 'nnsoup-request-mail)
9315 @end lisp
9316
9317 And that's it, really.  If you only want news to go into the @sc{soup}
9318 system you just use the first line.  If you only want mail to be
9319 @sc{soup}ed you use the second.
9320
9321
9322 @node Web Searches
9323 @subsection Web Searches
9324 @cindex nnweb
9325 @cindex DejaNews
9326 @cindex Alta Vista
9327 @cindex InReference
9328 @cindex Usenet searches
9329 @cindex searching the Usenet
9330
9331 It's, like, too neat to search the Usenet for articles that match a
9332 string, but it, like, totally @emph{sucks}, like, totally, to use one of
9333 those, like, Web browsers, and you, like, have to, rilly, like, look at
9334 the commercials, so, like, with Gnus you can do @emph{rad}, rilly,
9335 searches without having to use a browser.
9336
9337 The @code{nnweb} backend allows an easy interface to the mighty search
9338 engine.  You create an @code{nnweb} group, enter a search pattern, and
9339 then enter the group and read the articles like you would any normal
9340 group.  The @kbd{G n} command in the group buffer (@pxref{Foreign
9341 Groups}) will do this in an easy-to-use fashion.
9342
9343 @code{nnweb} groups don't really lend themselves to being solid
9344 groups---they have a very fleeting idea of article numbers.  In fact,
9345 each time you enter an @code{nnweb} group (not even changing the search
9346 pattern), you are likely to get the articles ordered in a different
9347 manner.  Not even using duplicate suppression (@code{Duplicate
9348 Suppression}) will help, since @code{nnweb} doesn't even know the
9349 @code{Message-ID} of the articles before reading them using some search
9350 engines (DejaNews, for instance).  The only possible way to keep track
9351 of which articles you've read is by scoring on the @code{Date}
9352 header---mark all articles that were posted before the last date you
9353 read the group as read.
9354
9355 If the search engine changes its output substantially, @code{nnweb}
9356 won't be able to parse it and will fail.  One could hardly fault the Web
9357 providers if they were to do this---their @emph{raison d'etre} is to
9358 make money off of advertisements, not to provide services to the
9359 community.  Since @code{nnweb} washes the ads off all the articles, one
9360 might think that the providers might be somewhat miffed.  We'll see.
9361
9362 You must have the @code{url} and @code{w3} package installed to be able
9363 to use @code{nnweb}.
9364
9365 Virtual server variables:
9366
9367 @table @code
9368 @item nnweb-type
9369 @vindex nnweb-type
9370 What search engine type is being used.  The currently supported types
9371 are @code{dejanews}, @code{altavista} and @code{reference}.
9372
9373 @item nnweb-search
9374 @vindex nnweb-search
9375 The search string to feed to the search engine.
9376
9377 @item nnweb-max-hits
9378 @vindex nnweb-max-hits
9379 Advisory maximum number of hits per search to display.  The default is
9380 100.
9381
9382 @item nnweb-type-definition
9383 @vindex nnweb-type-definition
9384 Type-to-definition alist.  This alist says what @code{nnweb} should do
9385 with the various search engine types.  The following elements must be
9386 present: 
9387
9388 @table @code
9389 @item article
9390 Function to decode the article and provide something that Gnus
9391 understands. 
9392
9393 @item map
9394 Function to create an article number to message header and URL alist. 
9395
9396 @item search
9397 Function to send the search string to the search engine.
9398
9399 @item address
9400 The address the aforementioned function should send the search string
9401 to. 
9402
9403 @item id
9404 Format string URL to fetch an article by @code{Message-ID}.
9405 @end table
9406
9407 @end table
9408
9409
9410
9411 @node Mail-To-News Gateways
9412 @subsection Mail-To-News Gateways
9413 @cindex mail-to-news gateways
9414 @cindex gateways
9415
9416 If your local @code{nntp} server doesn't allow posting, for some reason
9417 or other, you can post using one of the numerous mail-to-news gateways.
9418 The @code{nngateway} backend provides the interface.
9419
9420 Note that you can't read anything from this backend---it can only be
9421 used to post with.
9422
9423 Server variables:
9424
9425 @table @code
9426 @item nngateway-address 
9427 @vindex nngateway-address 
9428 This is the address of the mail-to-news gateway.
9429
9430 @item nngateway-header-transformation
9431 @vindex nngateway-header-transformation
9432 News headers have often have to be transformed in some odd way or other
9433 for the mail-to-news gateway to accept it.  This variable says what 
9434 transformation should be called, and defaults to
9435 @code{nngateway-simple-header-transformation}.  The function is called
9436 narrowed to the headers to be transformed and with one parameter---the
9437 gateway address.
9438
9439 This default function just inserts a new @code{To} header based on the
9440 @code{Newsgroups} header and the gateway address---an article with this
9441 @code{Newsgroups} header:
9442
9443 @example
9444 Newsgroups: alt.religion.emacs
9445 @end example
9446
9447 will get this @code{From} header inserted:
9448
9449 @example
9450 To: alt-religion-emacs@@GATEWAY
9451 @end example
9452
9453 @end table
9454
9455 So, to use this, simply say something like:
9456
9457 @lisp
9458 (setq gnus-post-method '(nngateway "GATEWAY.ADDRESS"))
9459 @end lisp
9460
9461
9462 @node Combined Groups
9463 @section Combined Groups
9464
9465 Gnus allows combining a mixture of all the other group types into bigger
9466 groups.
9467
9468 @menu
9469 * Virtual Groups::     Combining articles from many groups.
9470 * Kibozed Groups::     Looking through parts of the newsfeed for articles.
9471 @end menu
9472
9473
9474 @node Virtual Groups
9475 @subsection Virtual Groups
9476 @cindex nnvirtual
9477 @cindex virtual groups
9478
9479 An @dfn{nnvirtual group} is really nothing more than a collection of
9480 other groups.
9481
9482 For instance, if you are tired of reading many small group, you can
9483 put them all in one big group, and then grow tired of reading one
9484 big, unwieldy group.  The joys of computing!
9485
9486 You specify @code{nnvirtual} as the method.  The address should be a
9487 regexp to match component groups.
9488
9489 All marks in the virtual group will stick to the articles in the
9490 component groups.  So if you tick an article in a virtual group, the
9491 article will also be ticked in the component group from whence it came.
9492 (And vice versa---marks from the component groups will also be shown in
9493 the virtual group.)
9494
9495 Here's an example @code{nnvirtual} method that collects all Andrea Dworkin
9496 newsgroups into one, big, happy newsgroup:
9497
9498 @lisp
9499 (nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*")
9500 @end lisp
9501
9502 The component groups can be native or foreign; everything should work
9503 smoothly, but if your computer explodes, it was probably my fault.
9504
9505 Collecting the same group from several servers might actually be a good
9506 idea if users have set the Distribution header to limit distribution.
9507 If you would like to read @samp{soc.motss} both from a server in Japan
9508 and a server in Norway, you could use the following as the group regexp:
9509
9510 @example
9511 "^nntp+some.server.jp:soc.motss$\\|^nntp+some.server.no:soc.motss$"
9512 @end example
9513
9514 This should work kinda smoothly---all articles from both groups should
9515 end up in this one, and there should be no duplicates.  Threading (and
9516 the rest) will still work as usual, but there might be problems with the
9517 sequence of articles.  Sorting on date might be an option here
9518 (@pxref{Selecting a Group}.
9519
9520 One limitation, however---all groups that are included in a virtual
9521 group has to be alive (i.e., subscribed or unsubscribed).  Killed or
9522 zombie groups can't be component groups for @code{nnvirtual} groups.
9523
9524 @vindex nnvirtual-always-rescan
9525 If the @code{nnvirtual-always-rescan} is non-@code{nil},
9526 @code{nnvirtual} will always scan groups for unread articles when
9527 entering a virtual group.  If this variable is @code{nil} (which is the
9528 default) and you read articles in a component group after the virtual
9529 group has been activated, the read articles from the component group
9530 will show up when you enter the virtual group.  You'll also see this
9531 effect if you have two virtual groups that contain the same component
9532 group.  If that's the case, you should set this variable to @code{t}.
9533 Or you can just tap @code{M-g} on the virtual group every time before
9534 you enter it---it'll have much the same effect.
9535
9536
9537 @node Kibozed Groups
9538 @subsection Kibozed Groups
9539 @cindex nnkiboze
9540 @cindex kibozing
9541
9542 @dfn{Kibozing} is defined by @sc{oed} as ``grepping through (parts of)
9543 the news feed''.  @code{nnkiboze} is a backend that will do this for
9544 you.  Oh joy!  Now you can grind any @sc{nntp} server down to a halt
9545 with useless requests!  Oh happiness!
9546
9547 @kindex G k (Group)
9548 To create a kibozed group, use the @kbd{G k} command in the group
9549 buffer. 
9550
9551 The address field of the @code{nnkiboze} method is, as with
9552 @code{nnvirtual}, a regexp to match groups to be ``included'' in the
9553 @code{nnkiboze} group.  There most similarities between @code{nnkiboze}
9554 and @code{nnvirtual} ends.
9555
9556 In addition to this regexp detailing component groups, an @code{nnkiboze} group
9557 must have a score file to say what articles that are to be included in
9558 the group (@pxref{Scoring}).
9559
9560 @kindex M-x nnkiboze-generate-groups
9561 @findex nnkiboze-generate-groups
9562 You must run @kbd{M-x nnkiboze-generate-groups} after creating the
9563 @code{nnkiboze} groups you want to have.  This command will take time.  Lots of
9564 time.  Oodles and oodles of time.  Gnus has to fetch the headers from
9565 all the articles in all the components groups and run them through the
9566 scoring process to determine if there are any articles in the groups
9567 that are to be part of the @code{nnkiboze} groups.
9568
9569 Please limit the number of component groups by using restrictive
9570 regexps.  Otherwise your sysadmin may become annoyed with you, and the
9571 @sc{nntp} site may throw you off and never let you back in again.
9572 Stranger things have happened.
9573
9574 @code{nnkiboze} component groups do not have to be alive---they can be dead,
9575 and they can be foreign.  No restrictions.
9576
9577 @vindex nnkiboze-directory
9578 The generation of an @code{nnkiboze} group means writing two files in
9579 @code{nnkiboze-directory}, which is @file{~/News/} by default.  One
9580 contains the @sc{nov} header lines for all the articles in the group,
9581 and the other is an additional @file{.newsrc} file to store information
9582 on what groups that have been searched through to find component
9583 articles.
9584
9585 Articles that are marked as read in the @code{nnkiboze} group will have their
9586 @sc{nov} lines removed from the @sc{nov} file.
9587
9588
9589 @node Scoring
9590 @chapter Scoring
9591 @cindex scoring
9592
9593 Other people use @dfn{kill files}, but we here at Gnus Towers like
9594 scoring better than killing, so we'd rather switch than fight.  They do
9595 something completely different as well, so sit up straight and pay
9596 attention!
9597
9598 @vindex gnus-summary-mark-below
9599 All articles have a default score (@code{gnus-summary-default-score}),
9600 which is 0 by default.  This score may be raised or lowered either
9601 interactively or by score files.  Articles that have a score lower than
9602 @code{gnus-summary-mark-below} are marked as read.
9603
9604 Gnus will read any @dfn{score files} that apply to the current group
9605 before generating the summary buffer.
9606
9607 There are several commands in the summary buffer that insert score
9608 entries based on the current article.  You can, for instance, ask Gnus to
9609 lower or increase the score of all articles with a certain subject.
9610
9611 There are two sorts of scoring entries: Permanent and temporary.
9612 Temporary score entries are self-expiring entries.  Any entries that are
9613 temporary and have not been used for, say, a week, will be removed
9614 silently to help keep the sizes of the score files down.
9615
9616 @menu 
9617 * Summary Score Commands::   Adding score entries for the current group.
9618 * Group Score Commands::     General score commands.
9619 * Score Variables::          Customize your scoring.  (My, what terminology).
9620 * Score File Format::        What a score file may contain.
9621 * Score File Editing::       You can edit score files by hand as well.
9622 * Adaptive Scoring::         Big Sister Gnus @emph{knows} what you read.
9623 * Home Score File::          How to say where new score entries are to go.
9624 * Followups To Yourself::    Having Gnus notice when people answer you.
9625 * Scoring Tips::             How to score effectively.
9626 * Reverse Scoring::          That problem child of old is not problem.
9627 * Global Score Files::       Earth-spanning, ear-splitting score files.
9628 * Kill Files::               They are still here, but they can be ignored.
9629 * GroupLens::                Getting predictions on what you like to read.
9630 * Advanced Scoring::         Using logical expressions to build score rules.
9631 * Score Decays::             It can be useful to let scores wither away.
9632 @end menu
9633
9634
9635 @node Summary Score Commands
9636 @section Summary Score Commands
9637 @cindex score commands
9638
9639 The score commands that alter score entries do not actually modify real
9640 score files.  That would be too inefficient.  Gnus maintains a cache of
9641 previously loaded score files, one of which is considered the
9642 @dfn{current score file alist}.  The score commands simply insert
9643 entries into this list, and upon group exit, this list is saved.
9644
9645 The current score file is by default the group's local score file, even
9646 if no such score file actually exists.  To insert score commands into
9647 some other score file (eg. @file{all.SCORE}), you must first make this
9648 score file the current one.
9649
9650 General score commands that don't actually change the score file:
9651
9652 @table @kbd
9653
9654 @item V s
9655 @kindex V s (Summary)
9656 @findex gnus-summary-set-score
9657 Set the score of the current article (@code{gnus-summary-set-score}).  
9658
9659 @item V S
9660 @kindex V S (Summary)
9661 @findex gnus-summary-current-score
9662 Display the score of the current article
9663 (@code{gnus-summary-current-score}).   
9664
9665 @item V t
9666 @kindex V t (Summary)
9667 @findex gnus-score-find-trace
9668 Display all score rules that have been used on the current article
9669 (@code{gnus-score-find-trace}).   
9670
9671 @item V R
9672 @cindex V R (Summary)
9673 @findex gnus-summary-rescore
9674 Run the current summary through the scoring process
9675 (@code{gnus-summary-rescore}).  This might be useful if you're playing
9676 around with your score files behind Gnus' back and want to see the
9677 effect you're having.
9678
9679 @item V a
9680 @kindex V a (Summary)
9681 @findex gnus-summary-score-entry
9682 Add a new score entry, and allow specifying all elements 
9683 (@code{gnus-summary-score-entry}).
9684
9685 @item V c
9686 @kindex V c (Summary)
9687 @findex gnus-score-change-score-file
9688 Make a different score file the current
9689 (@code{gnus-score-change-score-file}). 
9690
9691 @item V e
9692 @kindex V e (Summary)
9693 @findex gnus-score-edit-current-scores
9694 Edit the current score file (@code{gnus-score-edit-current-scores}).
9695 You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score
9696 File Editing}).
9697
9698 @item V f
9699 @kindex V f (Summary)
9700 @findex gnus-score-edit-file
9701 Edit a score file and make this score file the current one
9702 (@code{gnus-score-edit-file}).
9703
9704 @item V F
9705 @kindex V F (Summary)
9706 @findex gnus-score-flush-cache
9707 Flush the score cahe (@code{gnus-score-flush-cache}).  This is useful
9708 after editing score files.
9709
9710 @item V C
9711 @kindex V C (Summary)
9712 @findex gnus-score-customize
9713 Customize a score file in a visually pleasing manner
9714 (@code{gnus-score-customize}). 
9715
9716 @item I C-i
9717 @kindex I C-i (Summary)
9718 @findex gnus-summary-raise-score
9719 Increase the score of the current article
9720 (@code{gnus-summary-raise-score}).
9721
9722 @item L C-l
9723 @kindex L C-l (Summary)
9724 @findex gnus-summary-lower-score
9725 Lower the score of the current article
9726 (@code{gnus-summary-lower-score}). 
9727 @end table
9728
9729 The rest of these commands modify the local score file.
9730
9731 @table @kbd
9732
9733 @item V m
9734 @kindex V m (Summary)
9735 @findex gnus-score-set-mark-below
9736 Prompt for a score, and mark all articles with a score below this as
9737 read (@code{gnus-score-set-mark-below}).
9738
9739 @item V x
9740 @kindex V x (Summary)
9741 @findex gnus-score-set-expunge-below
9742 Prompt for a score, and add a score rule to the current score file to
9743 expunge all articles below this score
9744 (@code{gnus-score-set-expunge-below}).
9745 @end table
9746
9747 The keystrokes for actually making score entries follow a very regular
9748 pattern, so there's no need to list all the commands.  (Hundreds of
9749 them.)  
9750
9751 @enumerate
9752 @item
9753 The first key is either @kbd{I} (upper case i) for increasing the score
9754 or @kbd{L} for lowering the score. 
9755 @item
9756 The second key says what header you want to score on.  The following
9757 keys are available:
9758 @table @kbd
9759
9760 @item a
9761 Score on the author name.
9762
9763 @item s
9764 Score on the subject line.
9765
9766 @item x
9767 Score on the Xref line---i.e., the cross-posting line.
9768
9769 @item t
9770 Score on thread---the References line.
9771
9772 @item d
9773 Score on the date.
9774
9775 @item l
9776 Score on the number of lines.
9777
9778 @item i
9779 Score on the Message-ID.
9780
9781 @item f
9782 Score on followups.
9783
9784 @item b
9785 Score on the body.
9786
9787 @item h
9788 Score on the head.
9789 @end table
9790
9791 @item
9792 The third key is the match type.  Which match types are legal depends on
9793 what headers you are scoring on.
9794
9795 @table @code
9796
9797 @item strings 
9798
9799 @table @kbd
9800
9801 @item e
9802 Exact matching.
9803
9804 @item s
9805 Substring matching.
9806
9807 @item f
9808 Fuzzy matching.
9809
9810 @item r
9811 Regexp matching
9812 @end table
9813
9814 @item date
9815 @table @kbd
9816
9817 @item b
9818 Before date.
9819
9820 @item a
9821 At date.
9822
9823 @item n
9824 This date.
9825 @end table
9826
9827 @item number
9828 @table @kbd
9829
9830 @item <
9831 Less than number.
9832
9833 @item =
9834 Equal to number.
9835
9836 @item >
9837 Greater than number.
9838 @end table
9839 @end table
9840
9841 @item 
9842 The fourth and final key says whether this is a temporary (i.e., expiring)
9843 score entry, or a permanent (i.e., non-expiring) score entry, or whether
9844 it is to be done immediately, without adding to the score file.
9845 @table @kbd
9846
9847 @item t
9848 Temporary score entry.
9849
9850 @item p
9851 Permanent score entry.
9852
9853 @item i
9854 Immediately scoring.
9855 @end table
9856
9857 @end enumerate
9858
9859 So, let's say you want to increase the score on the current author with
9860 exact matching permanently: @kbd{I a e p}.  If you want to lower the
9861 score based on the subject line, using substring matching, and make a
9862 temporary score entry: @kbd{L s s t}.  Pretty easy.
9863
9864 To make things a bit more complicated, there are shortcuts.  If you use
9865 a capital letter on either the second or third keys, Gnus will use
9866 defaults for the remaining one or two keystrokes.  The defaults are
9867 ``substring'' and ``temporary''.  So @kbd{I A} is the same as @kbd{I a s
9868 t}, and @kbd{I a R} is the same as @kbd{I a r t}.
9869
9870 @vindex gnus-score-mimic-keymap
9871 The @code{gnus-score-mimic-keymap} says whether these commands will
9872 pretend they are keymaps or not.
9873
9874
9875 @node Group Score Commands
9876 @section Group Score Commands
9877 @cindex group score commands
9878
9879 There aren't many of these as yet, I'm afraid.
9880
9881 @table @kbd
9882
9883 @item W f
9884 @kindex W f (Group)
9885 @findex gnus-score-flush-cache
9886 Gnus maintains a cache of score alists to avoid having to reload them
9887 all the time.  This command will flush the cache
9888 (@code{gnus-score-flush-cache}). 
9889
9890 @end table
9891
9892
9893 @node Score Variables
9894 @section Score Variables
9895 @cindex score variables
9896
9897 @table @code
9898
9899 @item gnus-use-scoring
9900 @vindex gnus-use-scoring
9901 If @code{nil}, Gnus will not check for score files, and will not, in
9902 general, do any score-related work.  This is @code{t} by default.
9903
9904 @item gnus-kill-killed
9905 @vindex gnus-kill-killed
9906 If this variable is @code{nil}, Gnus will never apply score files to
9907 articles that have already been through the kill process.  While this
9908 may save you lots of time, it also means that if you apply a kill file
9909 to a group, and then change the kill file and want to run it over you
9910 group again to kill more articles, it won't work.  You have to set this
9911 variable to @code{t} to do that.  (It is @code{t} by default.)
9912
9913 @item gnus-kill-files-directory
9914 @vindex gnus-kill-files-directory
9915 All kill and score files will be stored in this directory, which is
9916 initialized from the @code{SAVEDIR} environment variable by default.
9917 This is @file{~/News/} by default.
9918
9919 @item gnus-score-file-suffix
9920 @vindex gnus-score-file-suffix
9921 Suffix to add to the group name to arrive at the score file name
9922 (@samp{SCORE} by default.)
9923
9924 @item gnus-score-uncacheable-files
9925 @vindex gnus-score-uncacheable-files
9926 @cindex score cache
9927 All score files are normally cached to avoid excessive re-loading of
9928 score files.  However, if this might make you Emacs grow big and
9929 bloated, so this regexp can be used to weed out score files that are
9930 unlikely to be needed again.  It would be a bad idea to deny caching of
9931 @file{all.SCORE}, while it might be a good idea to not cache
9932 @file{comp.infosystems.www.authoring.misc.ADAPT}.  In fact, this
9933 variable is @samp{ADAPT$} by default, so no adaptive score files will
9934 be cached.
9935
9936 @item gnus-save-score
9937 @vindex gnus-save-score
9938 If you have really complicated score files, and do lots of batch
9939 scoring, then you might set this variable to @code{t}.  This will make
9940 Gnus save the scores into the @file{.newsrc.eld} file.
9941
9942 @item gnus-score-interactive-default-score
9943 @vindex gnus-score-interactive-default-score
9944 Score used by all the interactive raise/lower commands to raise/lower
9945 score with.  Default is 1000, which may seem excessive, but this is to
9946 ensure that the adaptive scoring scheme gets enough room to play with.
9947 We don't want the small changes from the adaptive scoring to overwrite
9948 manually entered data.
9949
9950 @item gnus-summary-default-score
9951 @vindex gnus-summary-default-score
9952 Default score of an article, which is 0 by default.
9953
9954 @item gnus-score-over-mark
9955 @vindex gnus-score-over-mark
9956 Mark (in the third column) used for articles with a score over the
9957 default.  Default is @samp{+}.
9958
9959 @item gnus-score-below-mark
9960 @vindex gnus-score-below-mark
9961 Mark (in the third column) used for articles with a score below the
9962 default.  Default is @samp{-}.
9963
9964 @item gnus-score-find-score-files-function
9965 @vindex gnus-score-find-score-files-function
9966 Function used to find score files for the current group.  This function
9967 is called with the name of the group as the argument. 
9968
9969 Predefined functions available are:
9970 @table @code
9971
9972 @item gnus-score-find-single
9973 @findex gnus-score-find-single
9974 Only apply the group's own score file.
9975
9976 @item gnus-score-find-bnews
9977 @findex gnus-score-find-bnews
9978 Apply all score files that match, using bnews syntax.  This is the
9979 default.  For instance, if the current group is @samp{gnu.emacs.gnus},
9980 @file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and
9981 @file{gnu.all.SCORE} would all apply.  In short, the instances of
9982 @samp{all} in the score file names are translated into @samp{.*}, and
9983 then a regexp match is done.
9984
9985 This means that if you have some score entries that you want to apply to
9986 all groups, then you put those entries in the @file{all.SCORE} file. 
9987
9988 @item gnus-score-find-hierarchical
9989 @findex gnus-score-find-hierarchical
9990 Apply all score files from all the parent groups.  This means that you
9991 can't have score files like @file{all.SCORE} or @file{all.emacs.SCORE},
9992 but you can have @file{SCORE},  @file{comp.SCORE} and
9993 @file{comp.emacs.SCORE}. 
9994
9995 @end table
9996 This variable can also be a list of functions.  In that case, all these
9997 functions will be called, and all the returned lists of score files will
9998 be applied.  These functions can also return lists of score alists
9999 directly.  In that case, the functions that return these non-file score
10000 alists should probably be placed before the ``real'' score file
10001 functions, to ensure that the last score file returned is the local
10002 score file.  Phu.
10003
10004 @item gnus-score-expiry-days
10005 @vindex gnus-score-expiry-days
10006 This variable says how many days should pass before an unused score file
10007 entry is expired.  If this variable is @code{nil}, no score file entries
10008 are expired.  It's 7 by default.
10009
10010 @item gnus-update-score-entry-dates
10011 @vindex gnus-update-score-entry-dates
10012 If this variable is non-@code{nil}, matching score entries will have
10013 their dates updated.  (This is how Gnus controls expiry---all
10014 non-matching entries will become too old while matching entries will
10015 stay fresh and young.)  However, if you set this variable to @code{nil},
10016 even matching entries will grow old and will have to face that oh-so
10017 grim reaper.  
10018
10019 @item gnus-score-after-write-file-function
10020 @vindex gnus-score-after-write-file-function
10021 Function called with the name of the score file just written.
10022
10023 @end table
10024
10025
10026 @node Score File Format
10027 @section Score File Format
10028 @cindex score file format
10029
10030 A score file is an @code{emacs-lisp} file that normally contains just a
10031 single form.  Casual users are not expected to edit these files;
10032 everything can be changed from the summary buffer.
10033
10034 Anyway, if you'd like to dig into it yourself, here's an example:
10035
10036 @lisp
10037 (("from"
10038   ("Lars Ingebrigtsen" -10000)
10039   ("Per Abrahamsen")
10040   ("larsi\\|lmi" -50000 nil R))
10041  ("subject"
10042   ("Ding is Badd" nil 728373))
10043  ("xref"
10044   ("alt.politics" -1000 728372 s))
10045  ("lines"
10046   (2 -100 nil <))
10047  (mark 0)
10048  (expunge -1000)
10049  (mark-and-expunge -10)
10050  (read-only nil)
10051  (orphan -10)
10052  (adapt t)
10053  (files "/hom/larsi/News/gnu.SCORE")
10054  (exclude-files "all.SCORE")
10055  (local (gnus-newsgroup-auto-expire t)
10056         (gnus-summary-make-false-root 'empty))
10057  (eval (ding)))
10058 @end lisp
10059
10060 This example demonstrates absolutely everything about a score file. 
10061
10062 Even though this looks much like lisp code, nothing here is actually
10063 @code{eval}ed.  The lisp reader is used to read this form, though, so it
10064 has to be legal syntactically, if not semantically.
10065
10066 Six keys are supported by this alist:
10067
10068 @table @code
10069
10070 @item STRING
10071 If the key is a string, it is the name of the header to perform the
10072 match on.  Scoring can only be performed on these eight headers:
10073 @code{From}, @code{Subject}, @code{References}, @code{Message-ID},
10074 @code{Xref}, @code{Lines}, @code{Chars} and @code{Date}.  In addition to
10075 these headers, there are three strings to tell Gnus to fetch the entire
10076 article and do the match on larger parts of the article: @code{Body}
10077 will perform the match on the body of the article, @code{Head} will
10078 perform the match on the head of the article, and @code{All} will
10079 perform the match on the entire article.  Note that using any of these
10080 last three keys will slow down group entry @emph{considerably}.  The
10081 final ``header'' you can score on is @code{Followup}.  These score
10082 entries will result in new score entries being added for all follow-ups
10083 to articles that matches these score entries.
10084
10085 Following this key is a arbitrary number of score entries, where each
10086 score entry has one to four elements.
10087 @enumerate
10088
10089 @item 
10090 The first element is the @dfn{match element}.  On most headers this will
10091 be a string, but on the Lines and Chars headers, this must be an
10092 integer. 
10093
10094 @item 
10095 If the second element is present, it should be a number---the @dfn{score
10096 element}.  This number should be an integer in the neginf to posinf
10097 interval.  This number is added to the score of the article if the match
10098 is successful.  If this element is not present, the
10099 @code{gnus-score-interactive-default-score} number will be used
10100 instead.  This is 1000 by default.
10101
10102 @item 
10103 If the third element is present, it should be a number---the @dfn{date
10104 element}.  This date says when the last time this score entry matched,
10105 which provides a mechanism for expiring the score entries.  It this
10106 element is not present, the score entry is permanent.  The date is
10107 represented by the number of days since December 31, 1 ce.
10108
10109 @item 
10110 If the fourth element is present, it should be a symbol---the @dfn{type
10111 element}.  This element specifies what function should be used to see
10112 whether this score entry matches the article.  What match types that can
10113 be used depends on what header you wish to perform the match on.
10114 @table @dfn
10115
10116 @item From, Subject, References, Xref, Message-ID
10117 For most header types, there are the @code{r} and @code{R} (regexp), as
10118 well as @code{s} and @code{S} (substring) types, and @code{e} and
10119 @code{E} (exact match), and @code{w} (word match) types.  If this
10120 element is not present, Gnus will assume that substring matching should
10121 be used.  @code{R}, @code{S}, and @code{E} differ from the others in
10122 that the matches will be done in a case-sensitive manner.  All these
10123 one-letter types are really just abbreviations for the @code{regexp},
10124 @code{string}, @code{exact}, and @code{word} types, which you can use
10125 instead, if you feel like.
10126
10127 @item Lines, Chars
10128 These two headers use different match types: @code{<}, @code{>},
10129 @code{=}, @code{>=} and @code{<=}.
10130
10131 @item Date
10132 For the Date header we have three kinda silly match types:
10133 @code{before}, @code{at} and @code{after}.  I can't really imagine this
10134 ever being useful, but, like, it would feel kinda silly not to provide
10135 this function.  Just in case.  You never know.  Better safe than sorry.
10136 Once burnt, twice shy.  Don't judge a book by its cover.  Never not have
10137 sex on a first date.  (I have been told that at least one person, and I
10138 quote, ``found this function indispensable'', however.)
10139
10140 A more useful match type is @code{regexp}.  With it, you can match the
10141 date string using a regular expression.  The date is normalized to
10142 ISO8601 compact format first, which looks like @samp{YYYYMMDDTHHMMSS}.
10143 If you want to match all articles that have been posted on April 1st in
10144 every year, you could use @samp{....0401.........} as a match string,
10145 for instance.  (Note that the date is kept in its original time zone, so
10146 this will match articles that were posted when it was April 1st where
10147 the article was posted from.  Time zones are such wholesome fun for the
10148 whole family, eh?)
10149
10150 @item Head, Body, All
10151 These three match keys use the same match types as the @code{From} (etc)
10152 header uses.
10153
10154 @item Followup
10155 This match key will add a score entry on all articles that followup to
10156 some author.  Uses the same match types as the @code{From} header uses.
10157
10158 @item Thread
10159 This match key will add a score entry on all articles that are part of
10160 a thread.  Uses the same match types as the @code{References} header
10161 uses.
10162 @end table
10163 @end enumerate
10164
10165 @item mark
10166 The value of this entry should be a number.  Any articles with a score
10167 lower than this number will be marked as read.
10168
10169 @item expunge
10170 The value of this entry should be a number.  Any articles with a score
10171 lower than this number will be removed from the summary buffer.
10172
10173 @item mark-and-expunge
10174 The value of this entry should be a number.  Any articles with a score
10175 lower than this number will be marked as read and removed from the
10176 summary buffer.
10177
10178 @item thread-mark-and-expunge
10179 The value of this entry should be a number.  All articles that belong to
10180 a thread that has a total score below this number will be marked as read
10181 and removed from the summary buffer.  @code{gnus-thread-score-function}
10182 says how to compute the total score for a thread.
10183
10184 @item files
10185 The value of this entry should be any number of file names.  These files
10186 are assumed to be score files as well, and will be loaded the same way
10187 this one was.
10188
10189 @item exclude-files
10190 The clue of this entry should be any number of files.  This files will
10191 not be loaded, even though they would normally be so, for some reason or
10192 other. 
10193
10194 @item eval
10195 The value of this entry will be @code{eval}el.  This element will be
10196 ignored when handling global score files. 
10197
10198 @item read-only
10199 Read-only score files will not be updated or saved.  Global score files
10200 should feature this atom (@pxref{Global Score Files}).
10201
10202 @item orphan
10203 The value of this entry should be a number.  Articles that do not have
10204 parents will get this number added to their scores.  Imagine you follow
10205 some high-volume newsgroup, like @samp{comp.lang.c}.  Most likely you
10206 will only follow a few of the threads, also want to see any new threads.
10207
10208 You can do this with the following two score file entries:
10209
10210 @example
10211         (orphan -500)
10212         (mark-and-expunge -100)
10213 @end example
10214
10215 When you enter the group the first time, you will only see the new
10216 threads.  You then raise the score of the threads that you find
10217 interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) the
10218 rest.  Next time you enter the group, you will see new articles in the
10219 interesting threads, plus any new threads.
10220
10221 I.e.---the orphan score atom is for high-volume groups where there
10222 exist a few interesting threads which can't be found automatically by
10223 ordinary scoring rules.
10224
10225 @item adapt
10226 This entry controls the adaptive scoring.  If it is @code{t}, the
10227 default adaptive scoring rules will be used.  If it is @code{ignore}, no
10228 adaptive scoring will be performed on this group.  If it is a list, this
10229 list will be used as the adaptive scoring rules.  If it isn't present,
10230 or is something other than @code{t} or @code{ignore}, the default
10231 adaptive scoring rules will be used.  If you want to use adaptive
10232 scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to
10233 @code{t}, and insert an @code{(adapt ignore)} in the groups where you do
10234 not want adaptive scoring.  If you only want adaptive scoring in a few
10235 groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and
10236 insert @code{(adapt t)} in the score files of the groups where you want
10237 it. 
10238
10239 @item adapt-file
10240 All adaptive score entries will go to the file named by this entry.  It
10241 will also be applied when entering the group.  This atom might be handy
10242 if you want to adapt on several groups at once, using the same adaptive
10243 file for a number of groups.
10244
10245 @item local
10246 @cindex local variables
10247 The value of this entry should be a list of @code{(VAR VALUE)} pairs.
10248 Each @var{var} will be made buffer-local to the current summary buffer,
10249 and set to the value specified.  This is a convenient, if somewhat
10250 strange, way of setting variables in some groups if you don't like hooks
10251 much.
10252 @end table
10253
10254
10255 @node Score File Editing
10256 @section Score File Editing
10257
10258 You normally enter all scoring commands from the summary buffer, but you
10259 might feel the urge to edit them by hand as well, so we've supplied you
10260 with a mode for that.  
10261
10262 It's simply a slightly customized @code{emacs-lisp} mode, with these
10263 additional commands:
10264
10265 @table @kbd
10266
10267 @item C-c C-c
10268 @kindex C-c C-c (Score)
10269 @findex gnus-score-edit-done
10270 Save the changes you have made and return to the summary buffer
10271 (@code{gnus-score-edit-done}). 
10272
10273 @item C-c C-d
10274 @kindex C-c C-d (Score)
10275 @findex gnus-score-edit-insert-date
10276 Insert the current date in numerical format
10277 (@code{gnus-score-edit-insert-date}).  This is really the day number, if
10278 you were wondering.
10279
10280 @item C-c C-p
10281 @kindex C-c C-p (Score)
10282 @findex gnus-score-pretty-print
10283 The adaptive score files are saved in an unformatted fashion.  If you
10284 intend to read one of these files, you want to @dfn{pretty print} it
10285 first.  This command (@code{gnus-score-pretty-print}) does that for
10286 you. 
10287
10288 @end table
10289
10290 Type @kbd{M-x gnus-score-mode} to use this mode.
10291
10292 @vindex gnus-score-mode-hook
10293 @code{gnus-score-menu-hook} is run in score mode buffers.
10294
10295 In the summary buffer you can use commands like @kbd{V f} and @kbd{V
10296 e} to begin editing score files.
10297
10298
10299 @node Adaptive Scoring
10300 @section Adaptive Scoring
10301 @cindex adaptive scoring
10302
10303 If all this scoring is getting you down, Gnus has a way of making it all
10304 happen automatically---as if by magic.  Or rather, as if by artificial
10305 stupidity, to be precise.
10306
10307 @vindex gnus-use-adaptive-scoring
10308 When you read an article, or mark an article as read, or kill an
10309 article, you leave marks behind.  On exit from the group, Gnus can sniff
10310 these marks and add score elements depending on what marks it finds.
10311 You turn on this ability by setting @code{gnus-use-adaptive-scoring} to
10312 @code{t} or @code{(line)}.  If you want score adaptively on separate
10313 words appearing in the subjects, you should set this variable to
10314 @code{(word)}.  If you want to use both adaptive methods, set this
10315 variable to @code{(word line)}.
10316
10317 @vindex gnus-default-adaptive-score-alist
10318 To give you complete control over the scoring process, you can customize
10319 the @code{gnus-default-adaptive-score-alist} variable.  For instance, it
10320 might look something like this:
10321
10322 @lisp
10323 (defvar gnus-default-adaptive-score-alist
10324   '((gnus-unread-mark)
10325     (gnus-ticked-mark (from 4))
10326     (gnus-dormant-mark (from 5))
10327     (gnus-del-mark (from -4) (subject -1))
10328     (gnus-read-mark (from 4) (subject 2))
10329     (gnus-expirable-mark (from -1) (subject -1))
10330     (gnus-killed-mark (from -1) (subject -3))
10331     (gnus-kill-file-mark)
10332     (gnus-ancient-mark)
10333     (gnus-low-score-mark)
10334     (gnus-catchup-mark (from -1) (subject -1))))
10335 @end lisp
10336
10337 As you see, each element in this alist has a mark as a key (either a
10338 variable name or a ``real'' mark---a character).  Following this key is
10339 a arbitrary number of header/score pairs.  If there are no header/score
10340 pairs following the key, no adaptive scoring will be done on articles
10341 that have that key as the article mark.  For instance, articles with
10342 @code{gnus-unread-mark} in the example above will not get adaptive score
10343 entries.
10344
10345 Each article can have only one mark, so just a single of these rules
10346 will be applied to each article.
10347
10348 To take @code{gnus-del-mark} as an example---this alist says that all
10349 articles that have that mark (i.e., are marked with @samp{D}) will have a
10350 score entry added to lower based on the @code{From} header by -4, and
10351 lowered by @code{Subject} by -1.  Change this to fit your prejudices. 
10352
10353 If you have marked 10 articles with the same subject with
10354 @code{gnus-del-mark}, the rule for that mark will be applied ten times.
10355 That means that that subject will get a score of ten times -1, which
10356 should be, unless I'm much mistaken, -10.
10357
10358 The headers you can score on are @code{from}, @code{subject},
10359 @code{message-id}, @code{references}, @code{xref}, @code{lines},
10360 @code{chars} and @code{date}.  In addition, you can score on
10361 @code{followup}, which will create an adaptive score entry that matches
10362 on the @code{References} header using the @code{Message-ID} of the
10363 current article, thereby matching the following thread.  
10364
10365 You can also score on @code{thread}, which will try to score all
10366 articles that appear in a thread.  @code{thread} matches uses a
10367 @code{Message-ID} to match on the @code{References} header of the
10368 article.  If the match is made, the @code{Message-ID} of the article is
10369 added to the @code{thread} rule.  (Think about it.  I'd recommend two
10370 aspirins afterwards.)
10371
10372 If you use this scheme, you should set the score file atom @code{mark}
10373 to something small---like -300, perhaps, to avoid having small random
10374 changes result in articles getting marked as read.
10375
10376 After using adaptive scoring for a week or so, Gnus should start to
10377 become properly trained and enhance the authors you like best, and kill
10378 the authors you like least, without you having to say so explicitly. 
10379
10380 You can control what groups the adaptive scoring is to be performed on
10381 by using the score files (@pxref{Score File Format}).  This will also
10382 let you use different rules in different groups.
10383
10384 @vindex gnus-adaptive-file-suffix
10385 The adaptive score entries will be put into a file where the name is the
10386 group name with @code{gnus-adaptive-file-suffix} appended.  The default
10387 is @samp{ADAPT}.
10388
10389 @vindex gnus-score-exact-adapt-limit
10390 When doing adaptive scoring, substring or fuzzy matching would probably
10391 give you the best results in most cases.  However, if the header one
10392 matches is short, the possibility for false positives is great, so if
10393 the length of the match is less than
10394 @code{gnus-score-exact-adapt-limit}, exact matching will be used.  If
10395 this variable is @code{nil}, exact matching will always be used to avoid
10396 this problem.
10397
10398 @vindex gnus-default-adaptive-word-score-alist
10399 As mentioned above, you can adapt either on individual words or entire
10400 headers.  If you adapt on words, the
10401 @code{gnus-default-adaptive-word-score-alist} variable says what score
10402 each instance of a word should add given a mark.
10403
10404 @lisp
10405 (setq gnus-default-adaptive-word-score-alist  
10406       `((,gnus-read-mark . 30)
10407         (,gnus-catchup-mark . -10)
10408         (,gnus-killed-mark . -20)
10409         (,gnus-del-mark . -15)))
10410 @end lisp
10411
10412 This is the default value.  If you have adaption on words enabled, every
10413 word that appears in subjects of articles that are marked with
10414 @code{gnus-read-mark} will result in a score rule that increase the
10415 score with 30 points.
10416
10417 @vindex gnus-default-ignored-adaptive-words
10418 @vindex gnus-ignored-adaptive-words
10419 Words that appear in the @code{gnus-default-ignored-adaptive-words} list
10420 will be ignored.  If you wish to add more words to be ignored, use the
10421 @code{gnus-ignored-adaptive-words} list instead.
10422
10423 @vindex gnus-adaptive-word-syntax-table
10424 When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the
10425 syntax table in effect.  It is similar to the standard syntax table, but
10426 it considers numbers to be non-word-consituant characters.
10427
10428 After using this scheme for a while, it might be nice to write a
10429 @code{gnus-psychoanalyze-user} command to go through the rules and see
10430 what words you like and what words you don't like.  Or perhaps not.
10431
10432
10433 @node Home Score File
10434 @section Home Score File
10435
10436 The score file where new score file entries will go is called the
10437 @dfn{home score file}.  This is normally (and by default) the score file
10438 for the group itself.  For instance, the home score file for
10439 @samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}.
10440
10441 However, this may not be what you want.  It is often convenient to share
10442 a common home score file among many groups---all @samp{emacs} groups
10443 could perhaps use the same home score file.
10444
10445 @vindex gnus-home-score-file
10446 The variable that controls this is @code{gnus-home-score-file}.  It can
10447 be:
10448
10449 @enumerate
10450 @item
10451 A string.  Then this file will be used as the home score file for all
10452 groups. 
10453
10454 @item
10455 A function. The result of this function will be used as the home score
10456 file.  The function will be called with the name of the group as the
10457 parameter. 
10458
10459 @item
10460 A list.  The elements in this list can be:
10461
10462 @enumerate
10463 @item 
10464 @var{(regexp file-name)}.  If the @var{regexp} matches the group name,
10465 the @var{file-name} will will be used as the home score file.
10466
10467 @item 
10468 A function. If the function returns non-nil, the result will be used as
10469 the home score file.
10470
10471 @item 
10472 A string.  Use the string as the home score file.
10473 @end enumerate
10474
10475 The list will be traversed from the beginning towards the end looking
10476 for matches.
10477
10478 @end enumerate
10479
10480 So, if you want to use just a single score file, you could say:
10481
10482 @lisp
10483 (setq gnus-home-score-file
10484       "my-total-score-file.SCORE")
10485 @end lisp
10486
10487 If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and
10488 @file{rec.SCORE} for all @samp{rec} groups (and so on), you can say:
10489
10490 @lisp
10491 (setq gnus-home-score-file
10492       'gnus-hierarchial-home-score-file)
10493 @end lisp
10494
10495 This is a ready-made function provided for your convenience.
10496
10497 If you want to have one score file for the @samp{emacs} groups and
10498 another for the @samp{comp} groups, while letting all other groups use
10499 their own home score files:
10500
10501 @lisp
10502 (setq gnus-home-score-file
10503       ;; All groups that match the regexp "\\.emacs"
10504       '("\\.emacs" "emacs.SCORE")
10505       ;; All the comp groups in one score file
10506        ("^comp" "comp.SCORE"))
10507 @end lisp
10508    
10509 @vindex gnus-home-adapt-file
10510 @code{gnus-home-adapt-file} works exactly the same way as
10511 @code{gnus-home-score-file}, but says what the home adaptive score file
10512 is instead.  All new adaptive file entries will go into the file
10513 specified by this variable, and the same syntax is allowed.
10514
10515 In addition to using @code{gnus-home-score-file} and
10516 @code{gnus-home-adapt-file}, you can also use group parameters
10517 (@pxref{Group Parameters}) and topic parameters (@pxref{Topic
10518 Parameters}) to achieve much the same.  Group and topic parameters take
10519 presedence over this variable.
10520
10521
10522 @node Followups To Yourself
10523 @section Followups To Yourself
10524
10525 Gnus offers two commands for picking out the @code{Message-ID} header in
10526 the current buffer.  Gnus will then add a score rule that scores using
10527 this @code{Message-ID} on the @code{References} header of other
10528 articles.  This will, in effect, increase the score of all articles that
10529 respond to the article in the current buffer.  Quite useful if you want
10530 to easily note when people answer what you've said.
10531
10532 @table @code
10533
10534 @item gnus-score-followup-article
10535 @findex gnus-score-followup-article
10536 This will add a score to articles that directly follow up your own
10537 article. 
10538
10539 @item gnus-score-followup-thread
10540 @findex gnus-score-followup-thread
10541 This will add a score to all articles that appear in a thread ``below''
10542 your own article.
10543 @end table
10544
10545 @vindex message-sent-hook
10546 These two functions are both primarily meant to be used in hooks like
10547 @code{message-sent-hook}.  
10548
10549 If you look closely at your own @code{Message-ID}, you'll notice that
10550 the first two or three characters are always the same.  Here's two of
10551 mine:  
10552
10553 @example
10554 <x6u3u47icf.fsf@@eyesore.no>
10555 <x6sp9o7ibw.fsf@@eyesore.no>
10556 @end example
10557
10558 So ``my'' ident on this machine is @samp{x6}.  This can be
10559 exploited---the following rule will raise the score on all followups to
10560 myself: 
10561
10562 @lisp
10563 ("references" 
10564  "<x6[0-9a-z]+\\.fsf@.*eyesore.no>" 1000 nil r)
10565 @end lisp
10566
10567 Whether it's the first two or first three characters that are ``yours''
10568 is system-dependent.
10569
10570
10571 @node Scoring Tips
10572 @section Scoring Tips
10573 @cindex scoring tips
10574
10575 @table @dfn
10576
10577 @item Crossposts
10578 @cindex crossposts
10579 @cindex scoring crossposts
10580 If you want to lower the score of crossposts, the line to match on is
10581 the @code{Xref} header.
10582 @lisp
10583 ("xref" (" talk.politics.misc:" -1000))
10584 @end lisp
10585
10586 @item Multiple crossposts
10587 If you want to lower the score of articles that have been crossposted to
10588 more than, say, 3 groups:
10589 @lisp
10590 ("xref" ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+" -1000 nil r))
10591 @end lisp
10592
10593 @item Matching on the body
10594 This is generally not a very good idea---it takes a very long time.
10595 Gnus actually has to fetch each individual article from the server.  But
10596 you might want to anyway, I guess.  Even though there are three match
10597 keys (@code{Head}, @code{Body} and @code{All}), you should choose one
10598 and stick with it in each score file.  If you use any two, each article
10599 will be fetched @emph{twice}.  If you want to match a bit on the
10600 @code{Head} and a bit on the @code{Body}, just use @code{All} for all
10601 the matches.  
10602
10603 @item Marking as read
10604 You will probably want to mark articles that has a score below a certain
10605 number as read.  This is most easily achieved by putting the following
10606 in your @file{all.SCORE} file:
10607 @lisp
10608 ((mark -100))
10609 @end lisp
10610 You may also consider doing something similar with @code{expunge}.  
10611
10612 @item Negated character classes
10613 If you say stuff like @code{[^abcd]*}, you may get unexpected results.
10614 That will match newlines, which might lead to, well, The Unknown.  Say
10615 @code{[^abcd\n]*} instead.
10616 @end table
10617
10618
10619 @node Reverse Scoring
10620 @section Reverse Scoring
10621 @cindex reverse scoring
10622
10623 If you want to keep just articles that have @samp{Sex with Emacs} in the
10624 subject header, and expunge all other articles, you could put something
10625 like this in your score file:
10626
10627 @lisp
10628 (("subject"
10629   ("Sex with Emacs" 2))
10630  (mark 1)
10631  (expunge 1))
10632 @end lisp
10633
10634 So, you raise all articles that match @samp{Sex with Emacs} and mark the
10635 rest as read, and expunge them to boot.
10636
10637
10638 @node Global Score Files
10639 @section Global Score Files
10640 @cindex global score files
10641
10642 Sure, other newsreaders have ``global kill files''.  These are usually
10643 nothing more than a single kill file that applies to all groups, stored
10644 in the user's home directory.  Bah!  Puny, weak newsreaders!
10645
10646 What I'm talking about here are Global Score Files.  Score files from
10647 all over the world, from users everywhere, uniting all nations in one
10648 big, happy score file union!  Ange-score!  New and untested!
10649
10650 @vindex gnus-global-score-files
10651 All you have to do to use other people's score files is to set the
10652 @code{gnus-global-score-files} variable.  One entry for each score file,
10653 or each score file directory.  Gnus will decide by itself what score
10654 files are applicable to which group.
10655
10656 Say you want to use all score files in the
10657 @file{/ftp@@ftp.some-where:/pub/score} directory and the single score
10658 file @file{/ftp@@ftp.ifi.uio.no:/pub/larsi/ding/score/soc.motss.SCORE}:
10659
10660 @lisp
10661 (setq gnus-global-score-files
10662       '("/ftp@@ftp.ifi.uio.no:/pub/larsi/ding/score/soc.motss.SCORE"
10663         "/ftp@@ftp.some-where:/pub/score/"))
10664 @end lisp
10665
10666 @findex gnus-score-search-global-directories
10667 Simple, eh?  Directory names must end with a @samp{/}.  These
10668 directories are typically scanned only once during each Gnus session.
10669 If you feel the need to manually re-scan the remote directories, you can
10670 use the @code{gnus-score-search-global-directories} command.
10671
10672 Note that, at present, using this option will slow down group entry
10673 somewhat.  (That is---a lot.)
10674
10675 If you want to start maintaining score files for other people to use,
10676 just put your score file up for anonymous ftp and announce it to the
10677 world.  Become a retro-moderator!  Participate in the retro-moderator
10678 wars sure to ensue, where retro-moderators battle it out for the
10679 sympathy of the people, luring them to use their score files on false
10680 premises!  Yay!  The net is saved!
10681
10682 Here are some tips for the would-be retro-moderator, off the top of my
10683 head: 
10684
10685 @itemize @bullet
10686
10687 @item 
10688 Articles that are heavily crossposted are probably junk. 
10689 @item
10690 To lower a single inappropriate article, lower by @code{Message-ID}.
10691 @item
10692 Particularly brilliant authors can be raised on a permanent basis. 
10693 @item
10694 Authors that repeatedly post off-charter for the group can safely be
10695 lowered out of existence.
10696 @item
10697 Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest
10698 articles completely.
10699
10700 @item 
10701 Use expiring score entries to keep the size of the file down.  You
10702 should probably have a long expiry period, though, as some sites keep
10703 old articles for a long time.
10704 @end itemize
10705
10706 ... I wonder whether other newsreaders will support global score files
10707 in the future.  @emph{Snicker}.  Yup, any day now, newsreaders like Blue
10708 Wave, xrn and 1stReader are bound to implement scoring.  Should we start
10709 holding our breath yet?
10710
10711
10712 @node Kill Files
10713 @section Kill Files
10714 @cindex kill files
10715
10716 Gnus still supports those pesky old kill files.  In fact, the kill file
10717 entries can now be expiring, which is something I wrote before Daniel
10718 Quinlan thought of doing score files, so I've left the code in there.
10719
10720 In short, kill processing is a lot slower (and I do mean @emph{a lot})
10721 than score processing, so it might be a good idea to rewrite your kill
10722 files into score files.
10723
10724 Anyway, a kill file is a normal @code{emacs-lisp} file.  You can put any
10725 forms into this file, which means that you can use kill files as some
10726 sort of primitive hook function to be run on group entry, even though
10727 that isn't a very good idea.
10728
10729 XCNormal kill files look like this:
10730
10731 @lisp
10732 (gnus-kill "From" "Lars Ingebrigtsen")
10733 (gnus-kill "Subject" "ding")
10734 (gnus-expunge "X")
10735 @end lisp
10736
10737 This will mark every article written by me as read, and remove them from
10738 the summary buffer.  Very useful, you'll agree.
10739
10740 Other programs use a totally different kill file syntax.  If Gnus
10741 encounters what looks like a @code{rn} kill file, it will take a stab at
10742 interpreting it. 
10743
10744 Two summary functions for editing a GNUS kill file:
10745
10746 @table @kbd
10747
10748 @item M-k
10749 @kindex M-k (Summary)
10750 @findex gnus-summary-edit-local-kill
10751 Edit this group's kill file (@code{gnus-summary-edit-local-kill}).
10752
10753 @item M-K
10754 @kindex M-K (Summary)
10755 @findex gnus-summary-edit-global-kill
10756 Edit the general kill file (@code{gnus-summary-edit-global-kill}).
10757 @end table
10758
10759 Two group mode functions for editing the kill files:
10760
10761 @table @kbd
10762
10763 @item M-k
10764 @kindex M-k (Group)
10765 @findex gnus-group-edit-local-kill
10766 Edit this group's kill file (@code{gnus-group-edit-local-kill}).
10767
10768 @item M-K
10769 @kindex M-K (Group)
10770 @findex gnus-group-edit-global-kill
10771 Edit the general kill file (@code{gnus-group-edit-global-kill}).
10772 @end table
10773
10774 Kill file variables:
10775
10776 @table @code
10777 @item gnus-kill-file-name
10778 @vindex gnus-kill-file-name
10779 A kill file for the group @samp{soc.motss} is normally called
10780 @file{soc.motss.KILL}.  The suffix appended to the group name to get
10781 this file name is detailed by the @code{gnus-kill-file-name} variable.
10782 The ``global'' kill file (not in the score file sense of ``global'', of
10783 course) is called just @file{KILL}.
10784
10785 @vindex gnus-kill-save-kill-file
10786 @item gnus-kill-save-kill-file
10787 If this variable is non-@code{nil}, Gnus will save the
10788 kill file after processing, which is necessary if you use expiring
10789 kills. 
10790
10791 @item gnus-apply-kill-hook
10792 @vindex gnus-apply-kill-hook
10793 @findex gnus-apply-kill-file-unless-scored
10794 @findex gnus-apply-kill-file
10795 A hook called to apply kill files to a group.  It is
10796 @code{(gnus-apply-kill-file)} by default.  If you want to ignore the
10797 kill file if you have a score file for the same group, you can set this
10798 hook to @code{(gnus-apply-kill-file-unless-scored)}.  If you don't want
10799 kill files to be processed, you should set this variable to @code{nil}.
10800
10801 @item gnus-kill-file-mode-hook
10802 @vindex gnus-kill-file-mode-hook
10803 A hook called in kill-file mode buffers.
10804
10805 @end table
10806
10807
10808 @node GroupLens
10809 @section GroupLens
10810 @cindex GroupLens
10811
10812 GroupLens is a collaborative filtering system that helps you work
10813 together with other people to find the quality news articles out of the
10814 huge volume of news articles generated every day.
10815
10816 To accomplish this the GroupLens system combines your opinions about
10817 articles you have already read with the opinions of others who have done
10818 likewise and gives you a personalized prediction for each unread news
10819 article.  Think of GroupLens as a matchmaker.  GroupLens watches how you
10820 rate articles, and finds other people that rate articles the same way.
10821 Once it has found for you some people you agree with it tells you, in
10822 the form of a prediction, what they thought of the article.  You can use
10823 this prediction to help you decide whether or not you want to read the
10824 article.
10825
10826 @menu
10827 * Using GroupLens::          How to make Gnus use GroupLens.
10828 * Rating Articles::          Letting GroupLens know how you rate articles.
10829 * Displaying Predictions::   Displaying predictions given by GroupLens.
10830 * GroupLens Variables::      Customizing GroupLens.
10831 @end menu
10832
10833
10834 @node Using GroupLens
10835 @subsection Using GroupLens
10836
10837 To use GroupLens you must register a pseudonym with your local Better
10838 Bit Bureau (BBB).  At the moment the only better bit in town is at
10839 @samp{http://www.cs.umn.edu/Research/GroupLens/bbb.html}.
10840
10841 Once you have registered you'll need to set a couple of variables.
10842
10843 @table @code
10844
10845 @item gnus-use-grouplens
10846 @vindex gnus-use-grouplens
10847 Setting this variable to a non-@code{nil} value will make Gnus hook into
10848 all the relevant GroupLens functions.
10849
10850 @item grouplens-pseudonym
10851 @vindex grouplens-pseudonym
10852 This variable should be set to the pseudonum you got when registering
10853 with the Better Bit Bureau.
10854
10855 @item grouplens-newsgroups
10856 @vindex grouplens-newsgroups
10857 A list of groups that you want to get GroupLens predictions for. 
10858
10859 @end table
10860
10861 Thats the minimum of what you need to get up and running with GroupLens.
10862 Once you've registered, GroupLens will start giving you scores for
10863 articles based on the average of what other people think.  But, to get
10864 the real benefit of GroupLens you need to start rating articles
10865 yourself.  Then the scores GroupLens gives you will be personalized for
10866 you, based on how the people you usually agree with have already rated.
10867
10868
10869 @node Rating Articles
10870 @subsection Rating Articles
10871
10872 In GroupLens, an article is rated on a scale from 1 to 5, inclusive.
10873 Where 1 means something like this article is a waste of bandwidth and 5
10874 means that the article was really good.  The basic question to ask
10875 yourself is, "on a scale from 1 to 5 would I like to see more articles
10876 like this one?"
10877
10878 There are four ways to enter a rating for an article in GroupLens.
10879
10880 @table @kbd
10881
10882 @item r
10883 @kindex r (GroupLens)
10884 @findex bbb-summary-rate-article
10885 This function will prompt you for a rating on a scale of one to five.
10886
10887 @item k
10888 @kindex k (GroupLens)
10889 @findex grouplens-score-thread
10890 This function will prompt you for a rating, and rate all the articles in
10891 the thread.  This is really useful for some of those long running giant
10892 threads in rec.humor.
10893
10894 @end table
10895
10896 The next two commands, @kbd{n} and @kbd{,} take a numerical prefix to be
10897 the score of the article you're reading.
10898
10899 @table @kbd
10900
10901 @item 1-5 n
10902 @kindex n (GroupLens)
10903 @findex grouplens-next-unread-article
10904 Rate the article and go to the next unread article.
10905
10906 @item 1-5 ,
10907 @kindex , (GroupLens)
10908 @findex grouplens-best-unread-article
10909 Rate the article and go to the next unread article with the highest score.
10910
10911 @end table
10912
10913 If you want to give the current article a score of 4 and then go to the
10914 next article, just type @kbd{4 n}.
10915
10916
10917 @node Displaying Predictions
10918 @subsection Displaying Predictions
10919
10920 GroupLens makes a prediction for you about how much you will like a
10921 news article.  The predictions from GroupLens are on a scale from 1 to
10922 5, where 1 is the worst and 5 is the best.  You can use the predictions
10923 from GroupLens in one of three ways controlled by the variable
10924 @code{gnus-grouplens-override-scoring}.
10925
10926 @vindex gnus-grouplens-override-scoring
10927 There are three ways to display predictions in grouplens.  You may
10928 choose to have the GroupLens scores contribute to, or override the
10929 regular gnus scoring mechanism. override is the default; however, some
10930 people prefer to see the Gnus scores plus the grouplens scores.  To get
10931 the separate scoring behavior you need to set
10932 @code{gnus-grouplens-override-scoring} to @code{'separate}.  To have the
10933 GroupLens predictions combined with the grouplens scores set it to
10934 @code{'override} and to combine the scores set
10935 @code{gnus-grouplens-override-scoring} to @code{'combine}.  When you use
10936 the combine option you will also want to set the values for
10937 @code{grouplens-prediction-offset} and
10938 @code{grouplens-score-scale-factor}.
10939
10940 @vindex grouplens-prediction-display
10941 In either case, GroupLens gives you a few choices for how you would like
10942 to see your predictions displayed.  The display of predictions is
10943 controlled by the @code{grouplens-prediction-display} variable.
10944
10945 The following are legal values for that variable.
10946
10947 @table @code
10948 @item prediction-spot
10949 The higher the prediction, the further to the right an @samp{*} is
10950 displayed. 
10951
10952 @item confidence-interval
10953 A numeric confidence interval.
10954
10955 @item prediction-bar
10956 The higher the prediction, the longer the bar.
10957
10958 @item confidence-bar
10959 Numerical confidence.
10960
10961 @item confidence-spot
10962 The spot gets bigger with more confidence.
10963
10964 @item prediction-num
10965 Plain-old numeric value.
10966
10967 @item confidence-plus-minus
10968 Prediction +/i confidence.
10969
10970 @end table
10971
10972
10973 @node GroupLens Variables
10974 @subsection GroupLens Variables
10975
10976 @table @code
10977
10978 @item gnus-summary-grouplens-line-format
10979 The summary line format used in summary buffers that are GroupLens
10980 enhanced.  It accepts the same specs as the normal summary line format
10981 (@pxref{Summary Buffer Lines}).  The default is
10982 @samp{%U%R%z%l%I%(%[%4L: %-20,20n%]%) %s\n}.
10983
10984 @item grouplens-bbb-host
10985 Host running the bbbd server.  The default is
10986 @samp{grouplens.cs.umn.edu}. 
10987
10988 @item grouplens-bbb-port
10989 Port of the host running the bbbd server.  The default is 9000.
10990
10991 @item grouplens-score-offset
10992 Offset the prediction by this value.  In other words, subtract the
10993 prediction value by this number to arrive at the effective score.  The
10994 default is 0.
10995
10996 @item grouplens-score-scale-factor 
10997 This variable allows the user to magnify the effect of GroupLens scores.
10998 The scale factor is applied after the offset.  The default is 1.
10999
11000 @end table
11001
11002
11003 @node Advanced Scoring
11004 @section Advanced Scoring
11005
11006 Scoring on Subjects and From headers is nice enough, but what if you're
11007 really interested in what a person has to say only when she's talking
11008 about a particular subject?  Or what about if you really don't want to
11009 read what person A has to say when she's following up to person B, but
11010 want to read what she says when she's following up to person C?
11011
11012 By using advanced scoring rules you may create arbitrarily complex
11013 scoring patterns.
11014
11015 @menu
11016 * Advanced Scoring Syntax::     A definition.
11017 * Advanced Scoring Examples::   What they look like.
11018 * Advanced Scoring Tips::       Getting the most out of it.
11019 @end menu
11020
11021
11022 @node Advanced Scoring Syntax
11023 @subsection Advanced Scoring Syntax
11024
11025 Ordinary scoring rules have a string as the first element in the rule.
11026 Advanced scoring rules have a list as the first element.  The second
11027 element is the score to be applied if the first element evaluated to a
11028 non-@code{nil} value.
11029
11030 These lists may consist of three logical operators, one redirection
11031 operator, and various match operators.
11032
11033 Logical operators:
11034
11035 @table @code
11036 @item &
11037 @itemx and
11038 This logical operator will evaluate each of its arguments until it finds
11039 one that evaluates to @code{false}, and then it'll stop.  If all arguments
11040 evaluate to @code{true} values, then this operator will return
11041 @code{true}. 
11042
11043 @item |
11044 @itemx or
11045 This logical operator will evaluate each of its arguments until it finds
11046 one that evaluates to @code{true}.  If no arguments are @code{true},
11047 then this operator will return @code{false}.
11048
11049 @item !
11050 @itemx not
11051 @itemx Â¬
11052 This logical operator only takes a single argument.  It returns the
11053 inverse of the value of its argument.
11054
11055 @end table
11056
11057 There is an @dfn{indirection operator} that will make its arguments
11058 apply to the ancenstors of the current article being scored.  For
11059 instance, @code{1-} will make score rules apply to the parent of the
11060 current article.  @code{2-} will make score fules apply to the
11061 grandparent of the current article.  Alternatively, you can write
11062 @code{^^}, where the number of @code{^}s (carets) say how far back into
11063 the ancestry you want to go.
11064
11065 Finally, we have the match operators.  These are the ones that do the
11066 real work.  Match operators are header name strings followed by a match
11067 and a match type.  A typical match operator looks like @samp{("from"
11068 "Lars Ingebrigtsen" s)}.  The header names are the same as when using
11069 simple scoring, and the match types are also the same.
11070
11071
11072 @node Advanced Scoring Examples
11073 @subsection Advanced Scoring Examples
11074
11075 Let's say you want to increase the score of articles written by Lars
11076 when he's talking about Gnus:
11077
11078 @example
11079 ((& 
11080   ("from" "Lars Ingebrigtsen")
11081   ("subject" "Gnus"))
11082  1000)
11083 @end example
11084
11085 Quite simple, huh?
11086
11087 When he writes long articles, he sometimes has something nice to say: 
11088
11089 @example
11090 ((& 
11091   ("from" "Lars Ingebrigtsen")
11092   (|
11093    ("subject" "Gnus")
11094    ("lines" 100 >)))
11095  1000)
11096 @end example
11097
11098 However, when he responds to things written by Reig Eigil Logge, you
11099 really don't want to read what he's written:
11100
11101 @example
11102 ((&
11103   ("from" "Lars Ingebrigtsen")
11104   (1- ("from" "Reig Eigir Logge")))
11105  -100000)
11106 @end example
11107
11108 Everybody that follows up Redmondo when he writes about disappearing
11109 socks should have their scores raised, but only when they talk about
11110 white socks.  However, when Lars talks about socks, it's usually not
11111 very interesting:
11112
11113 @example
11114 ((&
11115   (1-
11116    (&
11117     ("from" "redmondo@@.*no" r)
11118     ("body" "disappearing.*socks" t)))
11119   (! ("from" "Lars Ingebrigtsen"))
11120   ("body" "white.*socks"))
11121  1000)
11122 @end example
11123
11124 The possibilities are endless.
11125
11126
11127 @node Advanced Scoring Tips
11128 @subsection Advanced Scoring Tips
11129
11130 The @code{&} and @code{|} logical operators do short-circuit logic.
11131 That is, they stop processing their arguments when it's clear what the
11132 result of the operation will be.  For instance, if one of the arguments
11133 of an @code{&} evaluates to @code{false}, there's no point in evaluating
11134 the rest of the arguments.  This means that you should put slow matches
11135 (@samp{body}, @code{header}) last and quick matches (@samp{from},
11136 @samp{subject}) first.
11137
11138 The indirection arguments (@code{1-} and so on) will make their
11139 arguments work on previous generations of the thread.  If you say
11140 something like:
11141
11142 @example
11143 ...
11144 (1-
11145  (1-
11146   ("from" "lars")))
11147 ...
11148 @end example
11149
11150 Then that means "score on the from header of the grandparent of the
11151 current article".  An indirection is quite fast, but it's better to say:
11152
11153 @example
11154 (1-
11155  (& 
11156   ("from" "Lars")
11157   ("subject" "Gnus")))
11158 @end example
11159
11160 than it is to say:
11161
11162 @example
11163 (&
11164  (1- ("from" "Lars"))
11165  (1- ("subject" "Gnus")))
11166 @end example
11167
11168
11169 @node Score Decays
11170 @section Score Decays
11171 @cindex score decays
11172 @cindex decays
11173
11174 You may find that your scores have a tendency to grow without
11175 bounds, especially if you're using adaptive scoring.  If scores get too
11176 big, they lose all meaning---they simply max out and it's difficult to
11177 use them in any sensible way.
11178
11179 @vindex gnus-decay-scores
11180 @findex gnus-decay-score
11181 @vindex gnus-score-decay-function
11182 Gnus provides a mechanism for decaying scores to help with this problem.
11183 When score files are loaded and @code{gnus-decay-scores} is
11184 non-@code{nil}, Gnus will run the score files through the decaying
11185 mechanism thereby lowering the scores of all non-permanent score rules.
11186 The decay itself if performed by the @code{gnus-score-decay-function}
11187 function, which is @code{gnus-decay-score} by default.  Here's the
11188 definition of that function:
11189
11190 @lisp
11191 (defun gnus-decay-score (score)
11192   (floor
11193    (- score
11194       (* (if (< score 0) 1 -1)
11195          (min score
11196               (max gnus-score-decay-constant
11197                    (* (abs score)
11198                       gnus-score-decay-scale)))))))
11199 @end lisp
11200
11201 @vindex gnus-score-decay-scale
11202 @vindex gnus-score-decay-constant
11203 @code{gnus-score-decay-constant} is 3 by default and
11204 @code{gnus-score-decay-scale} is 0.05.  This should cause the following:
11205
11206 @enumerate
11207 @item
11208 Scores between -3 and 3 will be set to 0 when this function is called.
11209
11210 @item
11211 Scores with magnitudes between 3 and 60 will be shrunk by 3.
11212
11213 @item
11214 Scores with magnutudes greater than 60 will be shrunk by 5% of the
11215 score.
11216 @end enumerate
11217
11218 If you don't like this decay function, write your own.  It is called
11219 with the score to be decayed as its only parameter, and it should return
11220 the new score, which should be an integer.
11221
11222 Gnus will try to decay scores once a day.  If you haven't run Gnus for
11223 four days, Gnus will decay the scores four times, for instance.
11224
11225
11226 @node Various
11227 @chapter Various
11228
11229 @menu
11230 * Process/Prefix::             A convention used by many treatment commands.
11231 * Interactive::                Making Gnus ask you many questions.
11232 * Formatting Variables::       You can specify what buffers should look like.
11233 * Windows Configuration::      Configuring the Gnus buffer windows.
11234 * Compilation::                How to speed Gnus up.
11235 * Mode Lines::                 Displaying information in the mode lines.
11236 * Highlighting and Menus::     Making buffers look all nice and cozy.
11237 * Buttons::                    Get tendonitis in ten easy steps!
11238 * Daemons::                    Gnus can do things behind your back.
11239 * NoCeM::                      How to avoid spam and other fatty foods.
11240 * Picons::                     How to display pictures of what your reading.
11241 * Moderation::                 What to do if you're a moderator.
11242 * Various Various::            Things that are really various.
11243 @end menu
11244
11245
11246 @node Process/Prefix
11247 @section Process/Prefix
11248 @cindex process/prefix convention
11249
11250 Many functions, among them functions for moving, decoding and saving
11251 articles, use what is known as the @dfn{Process/Prefix convention}.
11252
11253 This is a method for figuring out what articles that the user wants the
11254 command to be performed on.
11255
11256 It goes like this:
11257
11258 If the numeric prefix is N, perform the operation on the next N
11259 articles, starting with the current one.  If the numeric prefix is
11260 negative, perform the operation on the previous N articles, starting
11261 with the current one.
11262
11263 @vindex transient-mark-mode
11264 If @code{transient-mark-mode} in non-@code{nil} and the region is
11265 active, all articles in the region will be worked upon.
11266
11267 If there is no numeric prefix, but some articles are marked with the
11268 process mark, perform the operation on the articles that are marked with
11269 the process mark.
11270
11271 If there is neither a numeric prefix nor any articles marked with the
11272 process mark, just perform the operation on the current article.
11273
11274 Quite simple, really, but it needs to be made clear so that surprises
11275 are avoided.
11276
11277 Commands that react to the process mark will push the current list of
11278 process marked articles onto a stack and will then clear all process
11279 marked articles.  You can restore the previous configuration with the
11280 @kbd{M P y} command (@pxref{Setting Process Marks}).
11281
11282 @vindex gnus-summary-goto-unread
11283 One thing that seems to shock & horrify lots of people is that, for
11284 instance, @kbd{3 d} does exactly the same as @kbd{d} @kbd{d} @kbd{d}.
11285 Since each @kbd{d} (which marks the current article as read) by default
11286 goes to the next unread article after marking, this means that @kbd{3 d}
11287 will mark the next three unread articles as read, no matter what the
11288 summary buffer looks like.  Set @code{gnus-summary-goto-unread} to
11289 @code{nil} for a more straightforward action.
11290
11291
11292 @node Interactive
11293 @section Interactive
11294 @cindex interaction
11295
11296 @table @code
11297
11298 @item gnus-novice-user
11299 @vindex gnus-novice-user
11300 If this variable is non-@code{nil}, you are either a newcomer to the
11301 World of Usenet, or you are very cautious, which is a nice thing to be,
11302 really.  You will be given questions of the type ``Are you sure you want
11303 to do this?'' before doing anything dangerous.  This is @code{t} by
11304 default.
11305
11306 @item gnus-expert-user
11307 @vindex gnus-expert-user
11308 If this variable is non-@code{nil}, you will never ever be asked any
11309 questions by Gnus.  It will simply assume you know what you're doing, no
11310 matter how strange.
11311
11312 @item gnus-interactive-catchup
11313 @vindex gnus-interactive-catchup
11314 Require confirmation before catching up a group if non-@code{nil}.  It
11315 is @code{t} by default.
11316
11317 @item gnus-interactive-exit
11318 @vindex gnus-interactive-exit
11319 Require confirmation before exiting Gnus.  This variable is @code{t} by
11320 default. 
11321 @end table
11322
11323
11324 @node Formatting Variables
11325 @section Formatting Variables
11326 @cindex formatting variables
11327
11328 Throughout this manual you've probably noticed lots of variables that
11329 are called things like @code{gnus-group-line-format} and
11330 @code{gnus-summary-mode-line-format}.  These control how Gnus is to
11331 output lines in the various buffers.  There's quite a lot of them.
11332 Fortunately, they all use the same syntax, so there's not that much to
11333 be annoyed by.
11334
11335 Here's an example format spec (from the group buffer): @samp{%M%S%5y:
11336 %(%g%)\n}.  We see that it is indeed extremely ugly, and that there are
11337 lots of percentages everywhere.  
11338
11339 @menu 
11340 * Formatting Basics::     A formatting variable is basically a format string.
11341 * Advanced Formatting::   Modifying output in various ways.
11342 * User-Defined Specs::    Having Gnus call your own functions.
11343 * Formatting Fonts::      Making the formatting look colorful and nice.
11344 @end menu
11345
11346 Currently Gnus uses the following formatting variables:
11347 @code{gnus-group-line-format}, @code{gnus-summary-line-format},
11348 @code{gnus-server-line-format}, @code{gnus-topic-line-format},
11349 @code{gnus-group-mode-line-format},
11350 @code{gnus-summary-mode-line-format},
11351 @code{gnus-article-mode-line-format},
11352 @code{gnus-server-mode-line-format}, and
11353 @code{gnus-summary-pick-line-format}.
11354
11355 All these format variables can also be arbitrary elisp forms.  In that
11356 case, they will be @code{eval}ed to insert the required lines.
11357
11358 @kindex M-x gnus-update-format
11359 @findex gnus-update-format
11360 Gnus includes a command to help you while creating your own format
11361 specs.  @kbd{M-x gnus-update-format} will @code{eval} the current form,
11362 update the spec in question and pop you to a buffer where you can
11363 examine the resulting lisp code to be run to generate the line.  
11364
11365
11366
11367 @node Formatting Basics
11368 @subsection Formatting Basics
11369
11370 Each @samp{%} element will be replaced by some string or other when the
11371 buffer in question is generated.  @samp{%5y} means ``insert the @samp{y}
11372 spec, and pad with spaces to get a 5-character field''.
11373
11374 As with normal C and Emacs Lisp formatting strings, the numerical
11375 modifier between the @samp{%} and the formatting type character will
11376 @dfn{pad} the output so that it is always at least that long.
11377 @samp{%5y} will make the field always (at least) five characters wide by
11378 padding with spaces to the left.  If you say @samp{%-5y}, it will pad to
11379 the right instead.
11380
11381 You may also wish to limit the length of the field to protect against
11382 particularly wide values.  For that you can say @samp{%4,6y}, which
11383 means that the field will never be more than 6 characters wide and never
11384 less than 4 characters wide.
11385
11386
11387 @node Advanced Formatting
11388 @subsection Advanced Formatting
11389
11390 It is frequently useful to post-process the fields in some way.
11391 Padding, limiting, cutting off parts and suppressing certain values can
11392 be achieved by using @dfn{tilde modifiers}.  A typical tilde spec might
11393 look like @samp{%~(cut 3)~(ignore "0")y}.
11394
11395 These are the legal modifiers:
11396
11397 @table @code
11398 @item pad
11399 @itemx pad-left
11400 Pad the field to the left with spaces until it reaches the required
11401 length.
11402
11403 @item pad-right
11404 Pad the field to the right with spaces until it reaches the required
11405 length.
11406
11407 @item max
11408 @itemx max-left
11409 Cut off characters from the left until it reaches the specified length.
11410
11411 @item max-right
11412 Cut off characters from the right until it reaches the specified
11413 length. 
11414
11415 @item cut
11416 @itemx cut-left
11417 Cut off the specified number of characters from the left.
11418
11419 @item cut-right
11420 Cut off the specified number of characters from the right.
11421
11422 @item ignore
11423 Return an empty string if the field is equal to the specified value. 
11424
11425 @item form
11426 Use the specified form as the field value when the @samp{@@} spec is
11427 used. 
11428 @end table
11429
11430 Let's take an example.  The @samp{%o} spec in the summary mode lines
11431 will return a date in compact ISO8601 format---@samp{19960809T230410}.
11432 This is quite a mouthful, so we want to shave off the century number and
11433 the time, leaving us with a six-character date.  That would be
11434 @samp{%~(cut-left 2)~(max-right 6)~(pad 6)o}.  (Cutting is done before
11435 maxing, and we need the padding to ensure that the date is never less
11436 than 6 characters to make it look nice in columns.)
11437
11438 Ignoring is done first; then cutting; then maxing; and then as the very
11439 last operation, padding.  
11440
11441 If you use lots of these advanced thingies, you'll find that Gnus gets
11442 quite slow.  This can be helped enourmously by running @kbd{M-x
11443 gnus-compile} when you are setisfied with the look of your lines.
11444 @xref{Compilation}. 
11445
11446
11447 @node User-Defined Specs
11448 @subsection User-Defined Specs
11449
11450 All the specs allow for inserting user defined specifiers---@samp{u}.
11451 The next character in the format string should be a letter.  Gnus
11452 will call the function @code{gnus-user-format-function-}@samp{X}, where
11453 @samp{X} is the letter following @samp{%u}.  The function will be passed
11454 a single parameter---what the parameter means depends on what buffer
11455 it's being called from.  The function should return a string, which will
11456 be inserted into the buffer just like information from any other
11457 specifier.  This function may also be called with dummy values, so it
11458 should protect against that.
11459
11460 You can also use tilde modifiers (@pxref{Advanced Formatting} to achieve
11461 much the same without defining new functions.  Here's an example:
11462 @samp{%~(form (count-lines (point-min) (point)))@@}.  The form
11463 given here will be evaluated to yield the current line number, and then
11464 inserted.
11465
11466
11467 @node Formatting Fonts
11468 @subsection Formatting Fonts
11469
11470 There are specs for highlighting, and these are shared by all the format
11471 variables.  Text inside the @samp{%(} and @samp{%)} specifiers will get
11472 the special @code{mouse-face} property set, which means that it will be
11473 highlighted (with @code{gnus-mouse-face}) when you put the mouse pointer
11474 over it.
11475
11476 Text inside the @samp{%[} and @samp{%]} specifiers will have their
11477 normal faces set using @code{gnus-face-0}, which is @code{bold} by
11478 default.  If you say @samp{%1[} instead, you'll get @code{gnus-face-1}
11479 instead, and so on.  Create as many faces as you wish.  The same goes
11480 for the @code{mouse-face} specs---you can say @samp{%3(hello%)} to have
11481 @samp{hello} mouse-highlighted with @code{gnus-mouse-face-3}.
11482
11483 Here's an alternative recipe for the group buffer:
11484
11485 @lisp
11486 ;; Create three face types.
11487 (setq gnus-face-1 'bold)
11488 (setq gnus-face-3 'italic)
11489
11490 ;; We want the article count to be in 
11491 ;; a bold and green face.  So we create 
11492 ;; a new face called `my-green-bold'.
11493 (copy-face 'bold 'my-green-bold)
11494 ;; Set the color.
11495 (set-face-foreground 'my-green-bold "ForestGreen")
11496 (setq gnus-face-2 'my-green-bold)
11497
11498 ;; Set the new & fancy format.
11499 (setq gnus-group-line-format 
11500       "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n")
11501 @end lisp
11502
11503 I'm sure you'll be able to use this scheme to create totally unreadable
11504 and extremely vulgar displays.  Have fun!
11505
11506 Note that the @samp{%(} specs (and friends) do not make any sense on the
11507 mode-line variables.
11508
11509
11510 @node Windows Configuration
11511 @section Windows Configuration
11512 @cindex windows configuration
11513
11514 No, there's nothing here about X, so be quiet.
11515
11516 @vindex gnus-use-full-window
11517 If @code{gnus-use-full-window} non-@code{nil}, Gnus will delete all
11518 other windows and occupy the entire Emacs screen by itself.  It is
11519 @code{t} by default.
11520
11521 @vindex gnus-buffer-configuration
11522 @code{gnus-buffer-configuration} describes how much space each Gnus
11523 buffer should be given.  Here's an excerpt of this variable:
11524
11525 @lisp
11526 ((group (vertical 1.0 (group 1.0 point)
11527                       (if gnus-carpal (group-carpal 4))))
11528  (article (vertical 1.0 (summary 0.25 point) 
11529                         (article 1.0))))
11530 @end lisp
11531
11532 This is an alist.  The @dfn{key} is a symbol that names some action or
11533 other.  For instance, when displaying the group buffer, the window
11534 configuration function will use @code{group} as the key.  A full list of
11535 possible names is listed below.
11536
11537 The @dfn{value} (i. e., the @dfn{split}) says how much space each buffer
11538 should occupy.  To take the @code{article} split as an example -
11539
11540 @lisp
11541 (article (vertical 1.0 (summary 0.25 point)
11542                        (article 1.0)))
11543 @end lisp
11544
11545 This @dfn{split} says that the summary buffer should occupy 25% of upper
11546 half of the screen, and that it is placed over the article buffer.  As
11547 you may have noticed, 100% + 25% is actually 125% (yup, I saw y'all
11548 reaching for that calculator there).  However, the special number
11549 @code{1.0} is used to signal that this buffer should soak up all the
11550 rest of the space available after the rest of the buffers have taken
11551 whatever they need.  There should be only one buffer with the @code{1.0}
11552 size spec per split.
11553
11554 Point will be put in the buffer that has the optional third element
11555 @code{point}. 
11556
11557 Here's a more complicated example:
11558
11559 @lisp
11560 (article (vertical 1.0 (group 4)
11561                        (summary 0.25 point)
11562                        (if gnus-carpal (summary-carpal 4))
11563                        (article 1.0)))
11564 @end lisp
11565
11566 If the size spec is an integer instead of a floating point number, 
11567 then that number will be used to say how many lines a buffer should
11568 occupy, not a percentage.
11569
11570 If the @dfn{split} looks like something that can be @code{eval}ed (to be
11571 precise---if the @code{car} of the split is a function or a subr), this
11572 split will be @code{eval}ed.  If the result is non-@code{nil}, it will
11573 be used as a split.  This means that there will be three buffers if
11574 @code{gnus-carpal} is @code{nil}, and four buffers if @code{gnus-carpal}
11575 is non-@code{nil}.
11576
11577 Not complicated enough for you?  Well, try this on for size:
11578
11579 @lisp
11580 (article (horizontal 1.0 
11581              (vertical 0.5
11582                  (group 1.0)
11583                  (gnus-carpal 4))
11584              (vertical 1.0
11585                  (summary 0.25 point)
11586                  (summary-carpal 4)
11587                  (article 1.0))))
11588 @end lisp
11589
11590 Whoops.  Two buffers with the mystery 100% tag.  And what's that
11591 @code{horizontal} thingie?  
11592
11593 If the first element in one of the split is @code{horizontal}, Gnus will
11594 split the window horizontally, giving you two windows side-by-side.
11595 Inside each of these strips you may carry on all you like in the normal
11596 fashion.  The number following @code{horizontal} says what percentage of
11597 the screen is to be given to this strip.
11598
11599 For each split, there @emph{must} be one element that has the 100% tag.
11600 The splitting is never accurate, and this buffer will eat any leftover
11601 lines from the splits.
11602
11603 To be slightly more formal, here's a definition of what a legal split
11604 may look like:
11605
11606 @example
11607 split       = frame | horizontal | vertical | buffer | form
11608 frame       = "(frame " size *split ")"
11609 horizontal  = "(horizontal " size *split ")"
11610 vertical    = "(vertical " size *split ")"
11611 buffer      = "(" buffer-name " " size *[ "point" ] ")"
11612 size        = number | frame-params
11613 buffer-name = group | article | summary ...
11614 @end example
11615
11616 The limitations are that the @code{frame} split can only appear as the
11617 top-level split.  @var{form} should be an Emacs Lisp form that should
11618 return a valid split.  We see that each split is fully recursive, and
11619 may contain any number of @code{vertical} and @code{horizontal} splits. 
11620
11621 @vindex gnus-window-min-width
11622 @vindex gnus-window-min-height
11623 @cindex window height
11624 @cindex window width
11625 Finding the right sizes can be a bit complicated.  No window may be less
11626 than @code{gnus-window-min-height} (default 1) characters high, and all
11627 windows must be at least @code{gnus-window-min-width} (default 1)
11628 characters wide.  Gnus will try to enforce this before applying the
11629 splits.  If you want to use the normal Emacs window width/height limit,
11630 you can just set these two variables to @code{nil}.
11631
11632 If you're not familiar with Emacs terminology, @code{horizontal} and
11633 @code{vertical} splits may work the opposite way of what you'd expect.
11634 Windows inside a @code{horizontal} split are shown side-by-side, and
11635 windows within a @code{vertical} split are shown above each other.
11636
11637 @findex gnus-configure-frame
11638 If you want to experiment with window placement, a good tip is to call
11639 @code{gnus-configure-frame} directly with a split.  This is the function
11640 that does all the real work when splitting buffers.  Below is a pretty
11641 nonsensical configuration with 5 windows; two for the group buffer and
11642 three for the article buffer.  (I said it was nonsensical.)  If you
11643 @code{eval} the statement below, you can get an idea of how that would
11644 look straight away, without going through the normal Gnus channels.
11645 Play with it until you're satisfied, and then use
11646 @code{gnus-add-configuration} to add your new creation to the buffer
11647 configuration list. 
11648
11649 @lisp
11650 (gnus-configure-frame
11651  '(horizontal 1.0
11652     (vertical 10
11653       (group 1.0)
11654       (article 0.3 point))
11655     (vertical 1.0
11656       (article 1.0)
11657       (horizontal 4
11658         (group 1.0)
11659         (article 10)))))
11660 @end lisp
11661
11662 You might want to have several frames as well.  No prob---just use the
11663 @code{frame} split:
11664
11665 @lisp
11666 (gnus-configure-frame
11667  '(frame 1.0
11668          (vertical 1.0
11669                    (summary 0.25 point)
11670                    (article 1.0))
11671          (vertical ((height . 5) (width . 15)
11672                     (user-position . t)
11673                     (left . -1) (top . 1))
11674                    (picon 1.0))))
11675
11676 @end lisp
11677
11678 This split will result in the familiar summary/article window
11679 configuration in the first (or ``main'') frame, while a small additional
11680 frame will be created where picons will be shown.  As you can see,
11681 instead of the normal @code{1.0} top-level spec, each additional split
11682 should have a frame parameter alist as the size spec.
11683 @xref{Frame Parameters, , Frame Parameters, elisp, The GNU Emacs Lisp
11684 Reference Manual}.
11685
11686 Here's a list of all possible keys for
11687 @code{gnus-buffer-configuration}:
11688
11689 @code{group}, @code{summary}, @code{article}, @code{server},
11690 @code{browse}, @code{message}, @code{pick}, @code{info},
11691 @code{summary-faq}, @code{edit-group}, @code{edit-server},
11692 @code{edit-score}, @code{post}, @code{reply}, @code{forward},
11693 @code{reply-yank}, @code{mail-bounce}, @code{draft},
11694 @code{pipe}, @code{bug}, @code{compose-bounce}.  
11695
11696 Note that the @code{message} key is used for both
11697 @code{gnus-group-mail} and @code{gnus-summary-mail-other-window}.  If
11698 it is desireable to distinguish between the two, something like this
11699 might be used:
11700
11701 @lisp
11702 (message (horizontal 1.0
11703                      (vertical 1.0 (message 1.0 point))
11704                      (vertical 0.24
11705                                (if (buffer-live-p gnus-summary-buffer)
11706                                    '(summary 0.5))
11707                                (group 1.0)))))
11708 @end lisp
11709
11710 @findex gnus-add-configuration
11711 Since the @code{gnus-buffer-configuration} variable is so long and
11712 complicated, there's a function you can use to ease changing the config
11713 of a single setting: @code{gnus-add-configuration}.  If, for instance,
11714 you want to change the @code{article} setting, you could say:
11715
11716 @lisp
11717 (gnus-add-configuration
11718  '(article (vertical 1.0
11719                (group 4)
11720                (summary .25 point)
11721                (article 1.0))))
11722 @end lisp
11723
11724 You'd typically stick these @code{gnus-add-configuration} calls in your
11725 @file{.gnus} file or in some startup hook---they should be run after
11726 Gnus has been loaded.
11727
11728
11729 @node Compilation
11730 @section Compilation
11731 @cindex compilation
11732 @cindex byte-compilation
11733
11734 @findex gnus-compile
11735
11736 Remember all those line format specification variables?
11737 @code{gnus-summary-line-format}, @code{gnus-group-line-format}, and so
11738 on.  Now, Gnus will of course heed whatever these variables are, but,
11739 unfortunately, changing them will mean a quite significant slow-down.
11740 (The default values of these variables have byte-compiled functions
11741 associated with them, while the user-generated versions do not, of
11742 course.) 
11743
11744 To help with this, you can run @kbd{M-x gnus-compile} after you've
11745 fiddled around with the variables and feel that you're (kind of)
11746 satisfied.  This will result in the new specs being byte-compiled, and
11747 you'll get top speed again.  Gnus will save these compiled specs in the
11748 @file{.newsrc.eld} file.  (User-defined functions aren't compiled by
11749 this function, though---you should compile them yourself by sticking
11750 them into the @code{.gnus.el} file and byte-compiling that file.)
11751
11752
11753 @node Mode Lines
11754 @section Mode Lines
11755 @cindex mode lines
11756
11757 @vindex gnus-updated-mode-lines
11758 @code{gnus-updated-mode-lines} says what buffers should keep their mode
11759 lines updated.  It is a list of symbols.  Supported symbols include
11760 @code{group}, @code{article}, @code{summary}, @code{server},
11761 @code{browse}, and @code{tree}.  If the corresponding symbol is present,
11762 Gnus will keep that mode line updated with information that may be
11763 pertinent.  If this variable is @code{nil}, screen refresh may be
11764 quicker.
11765
11766 @cindex display-time
11767
11768 @vindex gnus-mode-non-string-length
11769 By default, Gnus displays information on the current article in the mode
11770 lines of the summary and article buffers.  The information Gnus wishes
11771 to display (eg. the subject of the article) is often longer than the
11772 mode lines, and therefore have to be cut off at some point.  The
11773 @code{gnus-mode-non-string-length} variable says how long the other
11774 elements on the line is (i.e., the non-info part).  If you put
11775 additional elements on the mode line (eg. a clock), you should modify
11776 this variable:
11777
11778 @c Hook written by Francesco Potorti` <pot@cnuce.cnr.it>
11779 @lisp
11780 (add-hook 'display-time-hook
11781           (lambda () (setq gnus-mode-non-string-length
11782                            (+ 21
11783                               (if line-number-mode 5 0)
11784                               (if column-number-mode 4 0)
11785                               (length display-time-string)))))
11786 @end lisp
11787
11788 If this variable is @code{nil} (which is the default), the mode line
11789 strings won't be chopped off, and they won't be padded either.
11790
11791
11792 @node Highlighting and Menus
11793 @section Highlighting and Menus
11794 @cindex visual
11795 @cindex highlighting
11796 @cindex menus
11797
11798 @vindex gnus-visual
11799 The @code{gnus-visual} variable controls most of the prettifying Gnus
11800 aspects.  If @code{nil}, Gnus won't attempt to create menus or use fancy
11801 colors or fonts.  This will also inhibit loading the @file{gnus-vis.el}
11802 file.
11803
11804 This variable can be a list of visual properties that are enabled.  The
11805 following elements are legal, and are all included by default:
11806
11807 @table @code
11808 @item group-highlight
11809 Do highlights in the group buffer.
11810 @item summary-highlight
11811 Do highlights in the summary buffer.
11812 @item article-highlight
11813 Do highlights in the article buffer.
11814 @item highlight
11815 Turn on highlighting in all buffers.
11816 @item group-menu
11817 Create menus in the group buffer.
11818 @item summary-menu
11819 Create menus in the summary buffers.
11820 @item article-menu
11821 Create menus in the article buffer.
11822 @item browse-menu
11823 Create menus in the browse buffer.
11824 @item server-menu
11825 Create menus in the server buffer.
11826 @item score-menu
11827 Create menus in the score buffers.
11828 @item menu
11829 Create menus in all buffers.
11830 @end table
11831
11832 So if you only want highlighting in the article buffer and menus in all
11833 buffers, you could say something like:
11834
11835 @lisp
11836 (setq gnus-visual '(article-highlight menu))
11837 @end lisp
11838
11839 If you want only highlighting and no menus whatsoever, you'd say:
11840
11841 @lisp
11842 (setq gnus-visual '(highlight))
11843 @end lisp
11844
11845 If @code{gnus-visual} is @code{t}, highlighting and menus will be used
11846 in all Gnus buffers.
11847
11848 Other general variables that influence the look of all buffers include:
11849
11850 @table @code
11851 @item gnus-mouse-face
11852 @vindex gnus-mouse-face
11853 This is the face (i.e., font) used for mouse highlighting in Gnus.  No
11854 mouse highlights will be done if @code{gnus-visual} is @code{nil}.
11855
11856 @item gnus-display-type
11857 @vindex gnus-display-type
11858 This variable is symbol indicating the display type Emacs is running
11859 under.  The symbol should be one of @code{color}, @code{grayscale} or
11860 @code{mono}.  If Gnus guesses this display attribute wrongly, either set
11861 this variable in your @file{~/.emacs} or set the resource
11862 @code{Emacs.displayType} in your @file{~/.Xdefaults}.
11863
11864 @item gnus-background-mode 
11865 @vindex gnus-background-mode 
11866 This is a symbol indicating the Emacs background brightness.  The symbol
11867 should be one of @code{light} or @code{dark}.  If Gnus guesses this
11868 frame attribute wrongly, either set this variable in your @file{~/.emacs} or
11869 set the resource @code{Emacs.backgroundMode} in your @file{~/.Xdefaults}. 
11870 `gnus-display-type'.
11871 @end table
11872
11873 There are hooks associated with the creation of all the different menus:
11874
11875 @table @code
11876
11877 @item gnus-article-menu-hook
11878 @vindex gnus-article-menu-hook
11879 Hook called after creating the article mode menu.
11880
11881 @item gnus-group-menu-hook
11882 @vindex gnus-group-menu-hook
11883 Hook called after creating the group mode menu.
11884
11885 @item gnus-summary-menu-hook
11886 @vindex gnus-summary-menu-hook
11887 Hook called after creating the summary mode menu.
11888
11889 @item gnus-server-menu-hook
11890 @vindex gnus-server-menu-hook
11891 Hook called after creating the server mode menu.
11892
11893 @item gnus-browse-menu-hook
11894 @vindex gnus-browse-menu-hook
11895 Hook called after creating the browse mode menu.
11896
11897 @item gnus-score-menu-hook
11898 @vindex gnus-score-menu-hook
11899 Hook called after creating the score mode menu.
11900
11901 @end table
11902
11903
11904 @node Buttons
11905 @section Buttons
11906 @cindex buttons
11907 @cindex mouse
11908 @cindex click
11909
11910 Those new-fangled @dfn{mouse} contraptions is very popular with the
11911 young, hep kids who don't want to learn the proper way to do things
11912 these days.  Why, I remember way back in the summer of '89, when I was
11913 using Emacs on a Tops 20 system.  Three hundred users on one single
11914 machine, and every user was running Simula compilers.  Bah!
11915
11916 Right.
11917
11918 @vindex gnus-carpal
11919 Well, you can make Gnus display bufferfuls of buttons you can click to
11920 do anything by setting @code{gnus-carpal} to @code{t}.  Pretty simple,
11921 really.  Tell the chiropractor I sent you.
11922
11923
11924 @table @code
11925
11926 @item gnus-carpal-mode-hook
11927 @vindex gnus-carpal-mode-hook
11928 Hook run in all carpal mode buffers.
11929
11930 @item gnus-carpal-button-face
11931 @vindex gnus-carpal-button-face
11932 Face used on buttons.
11933
11934 @item gnus-carpal-header-face
11935 @vindex gnus-carpal-header-face
11936 Face used on carpal buffer headers.
11937
11938 @item gnus-carpal-group-buffer-buttons
11939 @vindex gnus-carpal-group-buffer-buttons
11940 Buttons in the group buffer.
11941
11942 @item gnus-carpal-summary-buffer-buttons
11943 @vindex gnus-carpal-summary-buffer-buttons
11944 Buttons in the summary buffer.
11945
11946 @item gnus-carpal-server-buffer-buttons
11947 @vindex gnus-carpal-server-buffer-buttons
11948 Buttons in the server buffer.
11949
11950 @item gnus-carpal-browse-buffer-buttons
11951 @vindex gnus-carpal-browse-buffer-buttons
11952 Buttons in the browse buffer.
11953 @end table
11954
11955 All the @code{buttons} variables are lists.  The elements in these list
11956 is either a cons cell where the car contains a text to be displayed and
11957 the cdr contains a function symbol, or a simple string.
11958
11959
11960 @node Daemons
11961 @section Daemons
11962 @cindex demons
11963 @cindex daemons
11964
11965 Gnus, being larger than any program ever written (allegedly), does lots
11966 of strange stuff that you may wish to have done while you're not
11967 present.  For instance, you may want it to check for new mail once in a
11968 while.  Or you may want it to close down all connections to all servers
11969 when you leave Emacs idle.  And stuff like that.
11970
11971 Gnus will let you do stuff like that by defining various
11972 @dfn{handlers}.  Each handler consists of three elements:  A
11973 @var{function}, a @var{time}, and an @var{idle} parameter.
11974
11975 Here's an example of a handler that closes connections when Emacs has
11976 been idle for thirty minutes:
11977
11978 @lisp
11979 (gnus-demon-close-connections nil 30)
11980 @end lisp
11981
11982 Here's a handler that scans for PGP headers every hour when Emacs is
11983 idle: 
11984
11985 @lisp
11986 (gnus-demon-scan-pgp 60 t)
11987 @end lisp
11988
11989 This @var{time} parameter and than @var{idle} parameter works together
11990 in a strange, but wonderful fashion.  Basically, if @var{idle} is
11991 @code{nil}, then the function will be called every @var{time} minutes.
11992
11993 If @var{idle} is @code{t}, then the function will be called after
11994 @var{time} minutes only if Emacs is idle.  So if Emacs is never idle,
11995 the function will never be called.  But once Emacs goes idle, the
11996 function will be called every @var{time} minutes.
11997
11998 If @var{idle} is a number and @var{time} is a number, the function will
11999 be called every @var{time} minutes only when Emacs has been idle for
12000 @var{idle} minutes.
12001
12002 If @var{idle} is a number and @var{time} is @code{nil}, the function
12003 will be called once every time Emacs has been idle for @var{idle}
12004 minutes.  
12005
12006 And if @var{time} is a string, it should look like @samp{07:31}, and
12007 the function will then be called once every day somewhere near that
12008 time.  Modified by the @var{idle} parameter, of course.
12009
12010 @vindex gnus-demon-timestep
12011 (When I say ``minute'' here, I really mean @code{gnus-demon-timestep}
12012 seconds.  This is @code{60} by default.  If you change that variable,
12013 all the timings in the handlers will be affected.)
12014
12015 @vindex gnus-use-demon
12016 To set the whole thing in motion, though, you have to set
12017 @code{gnus-use-demon} to @code{t}.
12018
12019 So, if you want to add a handler, you could put something like this in
12020 your @file{.gnus} file:
12021
12022 @findex gnus-demon-add-handler
12023 @lisp
12024 (gnus-demon-add-handler 'gnus-demon-close-connections nil 30)
12025 @end lisp
12026
12027 @findex gnus-demon-add-nocem
12028 @findex gnus-demon-add-scanmail
12029 @findex gnus-demon-add-disconnection
12030 Some ready-made functions to do this has been created:
12031 @code{gnus-demon-add-nocem}, @code{gnus-demon-add-disconnection}, and
12032 @code{gnus-demon-add-scanmail}.  Just put those functions in your
12033 @file{.gnus} if you want those abilities.
12034
12035 @findex gnus-demon-init
12036 @findex gnus-demon-cancel
12037 @vindex gnus-demon-handlers
12038 If you add handlers to @code{gnus-demon-handlers} directly, you should
12039 run @code{gnus-demon-init} to make the changes take hold.  To cancel all
12040 daemons, you can use the @code{gnus-demon-cancel} function.
12041
12042 Note that adding daemons can be pretty naughty if you overdo it.  Adding
12043 functions that scan all news and mail from all servers every two seconds
12044 is a sure-fire way of getting booted off any respectable system.  So
12045 behave. 
12046
12047
12048 @node NoCeM
12049 @section NoCeM
12050 @cindex nocem
12051 @cindex spam
12052
12053 @dfn{Spamming} is posting the same article lots and lots of times.
12054 Spamming is bad.  Spamming is evil.  
12055
12056 Spamming is usually canceled within a day or so by various anti-spamming
12057 agencies.  These agencies usually also send out @dfn{NoCeM} messages.
12058 NoCeM is pronounced ``no see-'em'', and means what the name
12059 implies---these are messages that make the offending articles, like, go
12060 away.  
12061
12062 What use are these NoCeM messages if the articles are canceled anyway?
12063 Some sites do not honor cancel messages and some sites just honor cancels
12064 from a select few people.  Then you may wish to make use of the NoCeM
12065 messages, which are distributed in the @samp{alt.nocem.misc} newsgroup.
12066
12067 Gnus can read and parse the messages in this group automatically, and
12068 this will make spam disappear.  
12069
12070 There are some variables to customize, of course:
12071
12072 @table @code
12073 @item gnus-use-nocem
12074 @vindex gnus-use-nocem
12075 Set this variable to @code{t} to set the ball rolling.  It is @code{nil}
12076 by default. 
12077
12078 @item gnus-nocem-groups
12079 @vindex gnus-nocem-groups
12080 Gnus will look for NoCeM messages in the groups in this list.  The
12081 default is @code{("alt.nocem.misc" "news.admin.net-abuse.announce")}. 
12082
12083 @item gnus-nocem-issuers
12084 @vindex gnus-nocem-issuers
12085 There are many people issuing NoCeM messages.  This list says what
12086 people you want to listen to.  The default is @code{("Automoose-1"
12087 "clewis@@ferret.ocunix.on.ca;" "jem@@xpat.com;" "red@@redpoll.mrfs.oh.us
12088 (Richard E. Depew)")}; fine, upstanding citizens all of them.
12089
12090 Known despammers that you can put in this list include:
12091
12092 @table @samp
12093 @item clewis@@ferret.ocunix.on.ca;
12094 @cindex Chris Lewis
12095 Chris Lewis---Major Canadian despammer who has probably canceled more
12096 usenet abuse than anybody else.
12097
12098 @item Automoose-1
12099 @cindex CancelMoose[tm]
12100 The CancelMoose[tm] on autopilot.  The CancelMoose[tm] is reputed to be
12101 Norwegian, and was the person(s) who invented NoCeM.  
12102
12103 @item jem@@xpat.com;
12104 @cindex Jem
12105 Jem---Korean despammer who is getting very busy these days.
12106
12107 @item red@@redpoll.mrfs.oh.us (Richard E. Depew)
12108 Richard E. Depew---lone American despammer.  He mostly cancels binary
12109 postings to non-binary groups and removes spews (regurgitated articles).
12110 @end table
12111
12112 You do not have to heed NoCeM messages from all these people---just the
12113 ones you want to listen to.
12114
12115 @item gnus-nocem-directory
12116 @vindex gnus-nocem-directory
12117 This is where Gnus will store its NoCeM cache files.  The default is
12118 @file{~/News/NoCeM/}. 
12119
12120 @item gnus-nocem-expiry-wait
12121 @vindex gnus-nocem-expiry-wait
12122 The number of days before removing old NoCeM entries from the cache.
12123 The default is 15.  If you make it shorter Gnus will be faster, but you
12124 might then see old spam.
12125
12126 @end table
12127
12128
12129 @node Picons
12130 @section Picons
12131
12132 So...  You want to slow down your news reader even more!  This is a
12133 good way to do so.  Its also a great way to impress people staring
12134 over your shoulder as you read news.
12135
12136 @menu
12137 * Picon Basics::           What are picons and How do I get them.
12138 * Picon Requirements::     Don't go further if you aren't using XEmacs.
12139 * Easy Picons::            Displaying Picons---the easy way.
12140 * Hard Picons::            The way you should do it.  You'll learn something.
12141 * Picon Configuration::    Other variables you can trash/tweak/munge/play with.
12142 @end menu
12143
12144
12145 @node Picon Basics
12146 @subsection Picon Basics
12147
12148 What are Picons?  To quote directly from the Picons Web site
12149 (@samp{http://www.cs.indiana.edu/picons/ftp/index.html}):
12150
12151 @quotation 
12152 @dfn{Picons} is short for ``personal icons''.  They're small,
12153 constrained images used to represent users and domains on the net,
12154 organized into databases so that the appropriate image for a given
12155 e-mail address can be found.  Besides users and domains, there are picon
12156 databases for Usenet newsgroups and weather forecasts.  The picons are
12157 in either monochrome @code{XBM} format or color @code{XPM} and
12158 @code{GIF} formats.
12159 @end quotation
12160
12161 Please see the above mentioned web site for instructions on obtaining
12162 and installing the picons databases, or the following ftp site:
12163 @samp{http://www.cs.indiana.edu/picons/ftp/index.html}.
12164
12165 @vindex gnus-picons-database
12166 Gnus expects picons to be installed into a location pointed to by
12167 @code{gnus-picons-database}.
12168
12169
12170 @node Picon Requirements
12171 @subsection Picon Requirements
12172
12173 To use have Gnus display Picons for you, you must be running XEmacs
12174 19.13 or greater since all other versions of Emacs aren't yet able to
12175 display images.
12176
12177 Additionally, you must have @code{xpm} support compiled into XEmacs.
12178
12179 @vindex gnus-picons-convert-x-face
12180 If you want to display faces from @code{X-Face} headers, you must have
12181 the @code{netpbm} utilities installed, or munge the
12182 @code{gnus-picons-convert-x-face} variable to use something else.
12183
12184
12185 @node Easy Picons
12186 @subsection Easy Picons
12187
12188 To enable displaying picons, simply put the following line in your
12189 @file{~/.gnus} file and start Gnus.
12190
12191 @lisp
12192 (setq gnus-use-picons t)
12193 (add-hook 'gnus-article-display-hook 'gnus-article-display-picons t)
12194 (add-hook 'gnus-summary-prepare-hook 'gnus-group-display-picons t)
12195 (add-hook 'gnus-article-display-hook 'gnus-picons-article-display-x-face)
12196 @end lisp
12197
12198
12199 @node Hard Picons
12200 @subsection Hard Picons 
12201
12202 Gnus can display picons for you as you enter and leave groups and
12203 articles.  It knows how to interact with three sections of the picons
12204 database.  Namely, it can display the picons newsgroup pictures,
12205 author's face picture(s), and the authors domain.  To enable this
12206 feature, you need to first decide where to display them.
12207
12208 @table @code 
12209
12210 @item gnus-picons-display-where 
12211 @vindex gnus-picons-display-where 
12212 Where the picon images should be displayed.  It is @code{picons} by
12213 default (which by default maps to the buffer @samp{*Picons*}).  Other
12214 valid places could be @code{article}, @code{summary}, or
12215 @samp{"*scratch*"} for all I care.  Just make sure that you've made the
12216 buffer visible using the standard Gnus window configuration
12217 routines---@xref{Windows Configuration}.
12218
12219 @end table
12220
12221 Note: If you set @code{gnus-use-picons} to @code{t}, it will set up your
12222 window configuration for you to include the @code{picons} buffer.
12223
12224 Now that you've made that decision, you need to add the following
12225 functions to the appropriate hooks so these pictures will get
12226 displayed at the right time.
12227
12228 @vindex gnus-article-display-hook
12229 @vindex gnus-picons-display-where
12230 @table @code
12231 @item gnus-article-display-picons
12232 @findex gnus-article-display-picons
12233 Looks up and display the picons for the author and the author's domain
12234 in the @code{gnus-picons-display-where} buffer.  Should be added to
12235 the @code{gnus-article-display-hook}.
12236
12237 @item gnus-group-display-picons
12238 @findex gnus-article-display-picons
12239 Displays picons representing the current group.  This function should
12240 be added to the @code{gnus-summary-prepare-hook} or to the
12241 @code{gnus-article-display-hook} if @code{gnus-picons-display-where}
12242 is set to @code{article}.
12243
12244 @item gnus-picons-article-display-x-face
12245 @findex gnus-article-display-picons
12246 Decodes and displays the X-Face header if present.  This function
12247 should be added to @code{gnus-article-display-hook}.
12248
12249 @end table
12250
12251 Note:  You must append them to the hook, so make sure to specify 't'
12252 to the append flag of @code{add-hook}:
12253
12254 @lisp
12255 (add-hook 'gnus-article-display-hook 'gnus-article-display-picons t)
12256 @end lisp
12257
12258
12259 @node Picon Configuration
12260 @subsection Picon Configuration
12261
12262 The following variables offer further control over how things are
12263 done, where things are located, and other useless stuff you really
12264 don't need to worry about.
12265
12266 @table @code
12267 @item gnus-picons-database
12268 @vindex gnus-picons-database
12269 The location of the picons database.  Should point to a directory
12270 containing the @file{news}, @file{domains}, @file{users} (and so on)
12271 subdirectories.  Defaults to @file{/usr/local/faces}.
12272
12273 @item gnus-picons-news-directory
12274 @vindex gnus-picons-news-directory
12275 Sub-directory of the faces database containing the icons for
12276 newsgroups.
12277
12278 @item gnus-picons-user-directories
12279 @vindex gnus-picons-user-directories
12280 List of subdirectories to search in @code{gnus-picons-database} for user
12281 faces.  Defaults to @code{("local" "users" "usenix" "misc/MISC")}.
12282
12283 @item gnus-picons-domain-directories
12284 @vindex gnus-picons-domain-directories
12285 List of subdirectories to search in @code{gnus-picons-database} for
12286 domain name faces.  Defaults to @code{("domains")}.  Some people may
12287 want to add @samp{unknown} to this list.
12288
12289 @item gnus-picons-convert-x-face
12290 @vindex gnus-picons-convert-x-face
12291 The command to use to convert the @code{X-Face} header to an X bitmap
12292 (@code{xbm}).  Defaults to @code{(format "@{ echo '/* Width=48,
12293 Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s"
12294 gnus-picons-x-face-file-name)}
12295
12296 @item gnus-picons-x-face-file-name
12297 @vindex gnus-picons-x-face-file-name
12298 Names a temporary file to store the @code{X-Face} bitmap in.  Defaults
12299 to @code{(format "/tmp/picon-xface.%s.xbm" (user-login-name))}.
12300
12301 @item gnus-picons-buffer
12302 @vindex gnus-picons-buffer
12303 The name of the buffer that @code{picons} points to.  Defaults to
12304 @samp{*Icon Buffer*}.
12305
12306 @end table
12307
12308
12309 @node Moderation
12310 @section Moderation
12311 @cindex moderation
12312
12313 If you are a moderator, you can use the @file{gnus-mdrtn.el} package.
12314 It is not included in the standard Gnus package.  Write a mail to
12315 @samp{larsi@@ifi.uio.no} and state what group you moderate, and you'll
12316 get a copy.
12317
12318 The moderation package is implemented as a minor mode for summary
12319 buffers.  Put
12320
12321 @lisp
12322 (add-hook 'gnus-summary-mode-hook 'gnus-moderate)
12323 @end lisp
12324
12325 in your @file{.gnus.el} file.
12326
12327 If you are the moderation of @samp{rec.zoofle}, this is how it's
12328 supposed to work:
12329
12330 @enumerate
12331 @item 
12332 You split your incoming mail by matching on
12333 @samp{Newsgroups:.*rec.zoofle}, which will put all the to-be-posted
12334 articles in some mail group---@samp{nnml:rec.zoofle}, for instance.
12335
12336 @item
12337 You enter that group once in a while and post articles using the @kbd{e}
12338 (edit-and-post) or @kbd{s} (just send unedited) commands.
12339
12340 @item
12341 If, while reading the @samp{rec.zoofle} newsgroup, you happen upon some
12342 articles that weren't approved by you, you can cancel them with the
12343 @kbd{c} command.
12344 @end enumerate
12345
12346 To use moderation mode in these two groups, say:
12347
12348 @lisp
12349 (setq gnus-moderatated-groups 
12350       "^nnml:rec.zoofle$\\|^rec.zoofle$")
12351 @end lisp
12352
12353
12354 @node Various Various
12355 @section Various Various
12356 @cindex mode lines
12357 @cindex highlights
12358
12359 @table @code
12360
12361 @item gnus-directory
12362 @vindex gnus-directory
12363 All Gnus directories will be initialized from this variable, which
12364 defaults to the @samp{SAVEDIR} environment variable, or @file{~/News/}
12365 if that variable isn't set.
12366
12367 @item gnus-default-directory
12368 @vindex gnus-default-directory
12369 Not related to the above variable at all---this variable says what the
12370 default directory of all Gnus buffers should be.  If you issue commands
12371 like @kbd{C-x C-f}, the prompt you'll get starts in the current buffer's
12372 default directory.  If this variable is @code{nil} (which is the
12373 default), the default directory will be the default directory of the
12374 buffer you were in when you started Gnus.
12375
12376 @item gnus-verbose
12377 @vindex gnus-verbose
12378 This variable is an integer between zero and ten.  The higher the value,
12379 the more messages will be displayed.  If this variable is zero, Gnus
12380 will never flash any messages, if it is seven (which is the default),
12381 most important messages will be shown, and if it is ten, Gnus won't ever
12382 shut up, but will flash so many messages it will make your head swim.
12383
12384 @item gnus-verbose-backends
12385 @vindex gnus-verbose-backends
12386 This variable works the same way as @code{gnus-verbose}, but it applies
12387 to the Gnus backends instead of Gnus proper.
12388
12389 @item nnheader-max-head-length
12390 @vindex nnheader-max-head-length
12391 When the backends read straight heads of articles, they all try to read
12392 as little as possible.  This variable (default @code{4096}) specifies
12393 the absolute max length the backends will try to read before giving up
12394 on finding a separator line between the head and the body.  If this
12395 variable is @code{nil}, there is no upper read bound.  If it is
12396 @code{t}, the backends won't try to read the articles piece by piece,
12397 but read the entire articles.  This makes sense with some versions of
12398 @code{ange-ftp}. 
12399
12400 @item nnheader-file-name-translation-alist 
12401 @vindex nnheader-file-name-translation-alist 
12402 @cindex file names
12403 @cindex illegal characters in file names
12404 @cindex characters in file names
12405 This is an alist that says how to translate characters in file names.
12406 For instance, if @samp{:} is illegal as a file character in file names
12407 on your system (you OS/2 user you), you could say something like:
12408
12409 @lisp
12410 (setq nnheader-file-name-translation-alist 
12411       '((?: . ?_)))
12412 @end lisp
12413
12414 In fact, this is the default value for this variable on OS/2 and MS
12415 Windows (phooey) systems.
12416
12417 @item gnus-hidden-properties
12418 @vindex gnus-hidden-properties
12419 This is a list of properties to use to hide ``invisible'' text.  It is
12420 @code{(invisible t intangible t)} by default on most systems, which
12421 makes invisible text invisible and intangible.
12422
12423 @item gnus-parse-headers-hook
12424 @vindex gnus-parse-headers-hook
12425 A hook called before parsing headers.  It can be used, for instance, to
12426 gather statistics on the headers fetched, or perhaps you'd like to prune
12427 some headers.  I don't see why you'd want that, though.
12428
12429 @item gnus-shell-command-separator
12430 @vindex gnus-shell-command-separator
12431 String used to separate to shell commands.  The default is @samp{;}. 
12432
12433
12434 @end table
12435
12436
12437 @node The End
12438 @chapter The End
12439
12440 Well, that's the manual---you can get on with your life now.  Keep in
12441 touch.  Say hello to your cats from me.  
12442
12443 My @strong{ghod}---I just can't stand goodbyes.  Sniffle.
12444
12445 Ol' Charles Reznikoff said it pretty well, so I leave the floor to him:
12446
12447 @quotation
12448 @strong{Te Deum}
12449 @sp 1
12450 Not because of victories @*
12451 I sing,@*
12452 having none,@*
12453 but for the common sunshine,@*
12454 the breeze,@*
12455 the largess of the spring.
12456 @sp 1
12457 Not for victory@*
12458 but for the day's work done@*
12459 as well as I was able;@*
12460 not for a seat upon the dais@*
12461 but at the common table.@*
12462 @end quotation
12463
12464
12465 @node Appendices
12466 @chapter Appendices
12467
12468 @menu
12469 * History::                        How Gnus got where it is today.
12470 * Terminology::                    We use really difficult, like, words here.
12471 * Customization::                  Tailoring Gnus to your needs.
12472 * Troubleshooting::                What you might try if things do not work.
12473 * A Programmers Guide to Gnus::    Rilly, rilly technical stuff.
12474 * Emacs for Heathens::             A short introduction to Emacsian terms.
12475 * Frequently Asked Questions::     A question-and-answer session.
12476 @end menu
12477
12478
12479 @node History
12480 @section History
12481
12482 @cindex history
12483 @sc{gnus} was written by Masanobu @sc{Umeda}.  When autumn crept up in
12484 '94, Lars Magne Ingebrigtsen grew bored and decided to rewrite Gnus.
12485
12486 If you want to investigate the person responsible for this outrage, you
12487 can point your (feh!) web browser to
12488 @file{http://www.ifi.uio.no/~larsi/}.  This is also the primary
12489 distribution point for the new and spiffy versions of Gnus, and is known
12490 as The Site That Destroys Newsrcs And Drives People Mad.
12491
12492 During the first extended alpha period of development, the new Gnus was
12493 called ``(ding) Gnus''.  @dfn{(ding)}, is, of course, short for
12494 @dfn{ding is not Gnus}, which is a total and utter lie, but who cares?
12495 (Besides, the ``Gnus'' in this abbreviation should probably be
12496 pronounced ``news'' as @sc{Umeda} intended, which makes it a more
12497 appropriate name, don't you think?)
12498
12499 In any case, after spending all that energy on coming up with a new and
12500 spunky name, we decided that the name was @emph{too} spunky, so we
12501 renamed it back again to ``Gnus''.  But in mixed case.  ``Gnus'' vs.
12502 ``@sc{gnus}''.  New vs. old.
12503
12504 The first ``proper'' release of Gnus 5 was done in November 1995 when it
12505 was included in the Emacs 19.30 distribution.
12506
12507 In May 1996 the next Gnus generation (aka.  ``September Gnus'') was
12508 released under the name ``Gnus 5.2''.  
12509
12510 On July 28th 1996 work on Red Gnus was begun.
12511
12512 @menu
12513 * Why?::                What's the point of Gnus?
12514 * Compatibility::       Just how compatible is Gnus with @sc{gnus}?
12515 * Conformity::          Gnus tries to conform to all standards.
12516 * Emacsen::             Gnus can be run on a few modern Emacsen.
12517 * Contributors::        Oodles of people.  
12518 * New Features::        Pointers to some of the new stuff in Gnus.
12519 * Newest Features::     Features so new that they haven't been written yet.
12520 @end menu
12521
12522
12523 @node Why?
12524 @subsection Why?
12525
12526 What's the point of Gnus?  
12527
12528 I want to provide a ``rad'', ``happening'', ``way cool'' and ``hep''
12529 newsreader, that lets you do anything you can think of.  That was my
12530 original motivation, but while working on Gnus, it has become clear to
12531 me that this generation of newsreaders really belong in the stone age.
12532 Newsreaders haven't developed much since the infancy of the net.  If the
12533 volume continues to rise with the current rate of increase, all current
12534 newsreaders will be pretty much useless.  How do you deal with
12535 newsgroups that have thousands of new articles each day?  How do you
12536 keep track of millions of people who post?
12537
12538 Gnus offers no real solutions to these questions, but I would very much
12539 like to see Gnus being used as a testing ground for new methods of
12540 reading and fetching news.  Expanding on @sc{Umeda}-san's wise decision
12541 to separate the newsreader from the backends, Gnus now offers a simple
12542 interface for anybody who wants to write new backends for fetching mail
12543 and news from different sources.  I have added hooks for customizations
12544 everywhere I could imagine useful.  By doing so, I'm inviting every one
12545 of you to explore and invent.
12546
12547 May Gnus never be complete. @kbd{C-u 100 M-x hail-emacs}. 
12548
12549
12550 @node Compatibility
12551 @subsection Compatibility
12552
12553 @cindex compatibility
12554 Gnus was designed to be fully compatible with @sc{gnus}.  Almost all key
12555 bindings have been kept.  More key bindings have been added, of course,
12556 but only in one or two obscure cases have old bindings been changed.
12557
12558 Our motto is:
12559 @quotation
12560 @cartouche
12561 @center In a cloud bones of steel.
12562 @end cartouche
12563 @end quotation
12564
12565 All commands have kept their names.  Some internal functions have changed
12566 their names.
12567
12568 The @code{gnus-uu} package has changed drastically. @pxref{Decoding
12569 Articles}. 
12570
12571 One major compatibility question is the presence of several summary
12572 buffers.  All variables that are relevant while reading a group are
12573 buffer-local to the summary buffer they belong in.  Although many
12574 important variables have their values copied into their global
12575 counterparts whenever a command is executed in the summary buffer, this
12576 change might lead to incorrect values being used unless you are careful.
12577
12578 All code that relies on knowledge of @sc{gnus} internals will probably
12579 fail.  To take two examples: Sorting @code{gnus-newsrc-alist} (or
12580 changing it in any way, as a matter of fact) is strictly verboten.  Gnus
12581 maintains a hash table that points to the entries in this alist (which
12582 speeds up many functions), and changing the alist directly will lead to
12583 peculiar results.
12584
12585 @cindex hilit19
12586 @cindex highlighting
12587 Old hilit19 code does not work at all.  In fact, you should probably
12588 remove all hilit code from all Gnus hooks
12589 (@code{gnus-group-prepare-hook} and @code{gnus-summary-prepare-hook}).
12590 Gnus provides various integrated functions for highlighting.  These are
12591 faster and more accurate.  To make life easier for everybody, Gnus will
12592 by default remove all hilit calls from all hilit hooks.  Uncleanliness!
12593 Away!
12594
12595 Packages like @code{expire-kill} will no longer work.  As a matter of
12596 fact, you should probably remove all old @sc{gnus} packages (and other
12597 code) when you start using Gnus.  More likely than not, Gnus already
12598 does what you have written code to make @sc{gnus} do.  (Snicker.)
12599
12600 Even though old methods of doing things are still supported, only the
12601 new methods are documented in this manual.  If you detect a new method of
12602 doing something while reading this manual, that does not mean you have
12603 to stop doing it the old way.
12604
12605 Gnus understands all @sc{gnus} startup files.
12606
12607 @kindex M-x gnus-bug
12608 @findex gnus-bug
12609 @cindex reporting bugs
12610 @cindex bugs
12611 Overall, a casual user who hasn't written much code that depends on
12612 @sc{gnus} internals should suffer no problems.  If problems occur,
12613 please let me know by issuing that magic command @kbd{M-x gnus-bug}.
12614
12615
12616 @node Conformity
12617 @subsection Conformity
12618
12619 No rebels without a clue here, ma'am.  We conform to all standards known
12620 to (wo)man.  Except for those standards and/or conventions we disagree
12621 with, of course.
12622
12623 @table @strong
12624
12625 @item RFC 822
12626 @cindex RFC 822
12627 There are no known breaches of this standard.
12628
12629 @item RFC 1036
12630 @cindex RFC 1036
12631 There are no known breaches of this standard, either.
12632
12633 @item Good Net-Keeping Seal of Approval
12634 @cindex Good Net-Keeping Seal of Approval
12635 Gnus has been through the Seal process and failed.  I think it'll pass
12636 the next inspection.
12637
12638 @item Son-of-RFC 1036
12639 @cindex Son-of-RFC 1036
12640 We do have some breaches to this one.
12641
12642 @table @emph
12643
12644 @item MIME
12645 Gnus does no MIME handling, and this standard-to-be seems to think that
12646 MIME is the bees' knees, so we have major breakage here.
12647
12648 @item X-Newsreader
12649 This is considered to be a ``vanity header'', while I consider it to be
12650 consumer information.  After seeing so many badly formatted articles
12651 coming from @code{tin} and @code{Netscape} I know not to use either of
12652 those for posting articles.  I would not have known that if it wasn't
12653 for the @code{X-Newsreader} header.
12654
12655 @item References
12656 Gnus does line breaking on this header.  I infer from RFC1036 that being
12657 conservative in what you output is not creating 5000-character lines, so
12658 it seems like a good idea to me.  However, this standard-to-be says that
12659 whitespace in the @code{References} header is to be preserved, so...  It
12660 doesn't matter one way or the other to Gnus, so if somebody tells me
12661 what The Way is, I'll change it.  Or not.
12662 @end table
12663
12664 @end table
12665
12666 If you ever notice Gnus acting non-compliantly with regards to the texts
12667 mentioned above, don't hesitate to drop a note to Gnus Towers and let us
12668 know.
12669
12670
12671 @node Emacsen
12672 @subsection Emacsen
12673 @cindex Emacsen
12674 @cindex XEmacs
12675 @cindex Mule
12676 @cindex Emacs
12677
12678 Gnus should work on :
12679
12680 @itemize @bullet 
12681
12682 @item
12683 Emacs 19.30 and up.
12684
12685 @item
12686 XEmacs 19.13 and up.
12687
12688 @item 
12689 Mule versions based on Emacs 19.30 and up.
12690
12691 @end itemize
12692
12693 Gnus will absolutely not work on any Emacsen older than that.  Not
12694 reliably, at least. 
12695
12696 There are some vague differences between Gnus on the various platforms: 
12697
12698 @itemize @bullet
12699
12700 @item
12701 The mouse-face on Gnus lines under Emacs and Mule is delimited to
12702 certain parts of the lines while they cover the entire line under
12703 XEmacs. 
12704
12705 @item 
12706 The same with current-article marking---XEmacs puts an underline under
12707 the entire summary line while Emacs and Mule are nicer and kinder.
12708
12709 @item
12710 XEmacs features more graphics---a logo and a toolbar.
12711
12712 @item
12713 Citation highlighting us better under Emacs and Mule than under XEmacs.
12714
12715 @item
12716 Emacs 19.26-19.28 have tangible hidden headers, which can be a bit
12717 confusing. 
12718
12719 @end itemize
12720
12721
12722 @node Contributors
12723 @subsection Contributors
12724 @cindex contributors
12725
12726 The new Gnus version couldn't have been done without the help of all the
12727 people on the (ding) mailing list.  Every day for over a year I have
12728 gotten billions of nice bug reports from them, filling me with joy,
12729 every single one of them.  Smooches.  The people on the list have been
12730 tried beyond endurance, what with my ``oh, that's a neat idea <type
12731 type>, yup, I'll release it right away <ship off> no wait, that doesn't
12732 work at all <type type>, yup, I'll ship that one off right away <ship
12733 off> no, wait, that absolutely does not work'' policy for releases.
12734 Micro$oft---bah.  Amateurs.  I'm @emph{much} worse.  (Or is that
12735 ``worser''? ``much worser''?  ``worsest''?)
12736
12737 I would like to take this opportunity to thank the Academy for...  oops,
12738 wrong show.
12739
12740 @itemize @bullet
12741
12742 @item Masanobu @sc{Umeda}
12743 The writer of the original @sc{gnus}.
12744
12745 @item Per Abrahamsen
12746 Custom, scoring, highlighting and @sc{soup} code (as well as numerous
12747 other things).
12748
12749 @item Luis Fernandes
12750 Design and graphics.
12751
12752 @item Wes Hardaker
12753 @file{gnus-picon.el} and the manual section on @dfn{picons}
12754 (@pxref{Picons}). 
12755
12756 @item Brad Miller
12757 @file{gnus-gl.el} and the GroupLens manual section (@pxref{GroupLens}). 
12758
12759 @item Sudish Joseph
12760 Innumerable bug fixes.
12761
12762 @item Ilja Weis
12763 @file{gnus-topic.el}.
12764
12765 @item Steven L. Baur
12766 Lots and lots of bugs detections and fixes.
12767
12768 @item Vladimir Alexiev
12769 The refcard and reference booklets.
12770
12771 @item Felix Lee & JWZ
12772 I stole some pieces from the XGnus distribution by Felix Lee and JWZ.
12773
12774 @item Scott Byer
12775 @file{nnfolder.el} enhancements & rewrite.
12776
12777 @item Peter Mutsaers
12778 Orphan article scoring code.
12779
12780 @item Ken Raeburn
12781 POP mail support.
12782
12783 @item Hallvard B Furuseth
12784 Various bits and pieces, especially dealing with .newsrc files.
12785
12786 @item Brian Edmonds
12787 @file{gnus-bbdb.el}.
12788
12789 @item Ricardo Nassif and Mark Borges
12790 Proof-reading.
12791
12792 @item Kevin Davidson
12793 Came up with the name @dfn{ding}, so blame him.
12794
12795 @end itemize
12796
12797 Peter Arius, Stainless Steel Rat, Ulrik Dickow, Jack Vinson, Daniel
12798 Quinlan, Frank D. Cringle, Geoffrey T. Dairiki, Fabrice Popineau and
12799 Andrew Eskilsson have all contributed code and suggestions.
12800
12801
12802 @node New Features
12803 @subsection New Features
12804 @cindex new features
12805
12806 @itemize @bullet
12807
12808 @item
12809 The look of all buffers can be changed by setting format-like variables
12810 (@pxref{Group Buffer Format} and @pxref{Summary Buffer Format}). 
12811  
12812 @item 
12813 Local spool and several @sc{nntp} servers can be used at once
12814 (@pxref{Select Methods}).  
12815
12816 @item 
12817 You can combine groups into virtual groups (@pxref{Virtual Groups}).
12818
12819 @item 
12820 You can read a number of different mail formats (@pxref{Getting Mail}).
12821 All the mail backends implement a convenient mail expiry scheme
12822 (@pxref{Expiring Mail}). 
12823
12824 @item
12825 Gnus can use various strategies for gathering threads that have lost
12826 their roots (thereby gathering loose sub-threads into one thread) or it
12827 can go back and retrieve enough headers to build a complete thread
12828 (@pxref{Customizing Threading}).
12829
12830 @item 
12831 Killed groups can be displayed in the group buffer, and you can read
12832 them as well (@pxref{Listing Groups}).
12833
12834 @item 
12835 Gnus can do partial group updates---you do not have to retrieve the
12836 entire active file just to check for new articles in a few groups
12837 (@pxref{The Active File}).
12838
12839 @item 
12840 Gnus implements a sliding scale of subscribedness to groups
12841 (@pxref{Group Levels}).
12842
12843 @item 
12844 You can score articles according to any number of criteria
12845 (@pxref{Scoring}).  You can even get Gnus to find out how to score
12846 articles for you (@pxref{Adaptive Scoring}).
12847
12848 @item 
12849 Gnus maintains a dribble buffer that is auto-saved the normal Emacs
12850 manner, so it should be difficult to lose much data on what you have
12851 read if your machine should go down (@pxref{Auto Save}). 
12852
12853 @item 
12854 Gnus now has its own startup file (@file{.gnus}) to avoid cluttering up
12855 the @file{.emacs} file.
12856
12857 @item 
12858 You can set the process mark on both groups and articles and perform
12859 operations on all the marked items (@pxref{Process/Prefix}).
12860
12861 @item 
12862 You can grep through a subset of groups and create a group from the
12863 results (@pxref{Kibozed Groups}). 
12864
12865 @item 
12866 You can list subsets of groups according to, well, anything
12867 (@pxref{Listing Groups}). 
12868
12869 @item 
12870 You can browse foreign servers and subscribe to groups from those
12871 servers (@pxref{Browse Foreign Server}). 
12872
12873 @item 
12874 Gnus can fetch articles asynchronously on a second connection to the
12875 server (@pxref{Asynchronous Fetching}).
12876
12877 @item 
12878 You can cache articles locally (@pxref{Article Caching}). 
12879
12880 @item 
12881 The uudecode functions have been expanded and generalized
12882 (@pxref{Decoding Articles}). 
12883
12884 @item
12885 You can still post uuencoded articles, which was a little-known feature
12886 of @sc{gnus}' past (@pxref{Uuencoding and Posting}). 
12887
12888 @item
12889 Fetching parents (and other articles) now actually works without
12890 glitches (@pxref{Finding the Parent}). 
12891
12892 @item
12893 Gnus can fetch FAQs and group descriptions (@pxref{Group Information}).
12894
12895 @item
12896 Digests (and other files) can be used as the basis for groups
12897 (@pxref{Document Groups}).
12898
12899 @item 
12900 Articles can be highlighted and customized (@pxref{Customizing
12901 Articles}). 
12902
12903 @item 
12904 URLs and other external references can be buttonized (@pxref{Article
12905 Buttons}). 
12906
12907 @item
12908 You can do lots of strange stuff with the Gnus window & frame
12909 configuration (@pxref{Windows Configuration}).
12910
12911 @item
12912 You can click on buttons instead of using the keyboard
12913 (@pxref{Buttons}). 
12914
12915 @item 
12916 Gnus can use NoCeM files to weed out spam (@pxref{NoCeM}). 
12917
12918 @end itemize
12919
12920 This is, of course, just a @emph{short} overview of the @emph{most}
12921 important new features.  No, really.  There are tons more.  Yes, we have
12922 feeping creaturism in full effect, but nothing too gratuitous, I would
12923 hope. 
12924
12925
12926 @node Newest Features
12927 @subsection Newest Features
12928 @cindex todo
12929
12930 Also known as the @dfn{todo list}.  Sure to be implemented before the
12931 next millennium. 
12932
12933 Be afraid.  Be very afraid.
12934
12935 @itemize @bullet
12936 @item
12937 Native @sc{mime} support is something that should be done.  
12938 @item
12939 A better and simpler method for specifying mail composing methods. 
12940 @item
12941 Allow posting through mail-to-news gateways.
12942 @item
12943 Really do unbinhexing.
12944 @end itemize
12945
12946 And much, much, much more.  There is more to come than has already been
12947 implemented.  (But that's always true, isn't it?)
12948
12949 @code{<URL:http://www.ifi.uio.no/~larsi/sgnus/todo>} is where the actual
12950 up-to-the-second todo list is located, so if you're really curious, you
12951 could point your Web browser over that-a-way.
12952
12953
12954 @node Terminology
12955 @section Terminology
12956
12957 @cindex terminology
12958 @table @dfn
12959
12960 @item news
12961 @cindex news
12962 This is what you are supposed to use this thing for---reading news.
12963 News is generally fetched from a nearby @sc{nntp} server, and is
12964 generally publicly available to everybody.  If you post news, the entire
12965 world is likely to read just what you have written, and they'll all
12966 snigger mischievously.  Behind your back.
12967
12968 @item mail
12969 @cindex mail
12970 Everything that's delivered to you personally is mail.  Some news/mail
12971 readers (like Gnus) blur the distinction between mail and news, but
12972 there is a difference.  Mail is private.  News is public.  Mailing is
12973 not posting, and replying is not following up.
12974
12975 @item reply
12976 @cindex reply
12977 Send a mail to the person who has written what you are reading.
12978
12979 @item follow up
12980 @cindex follow up
12981 Post an article to the current newsgroup responding to the article you
12982 are reading.
12983
12984 @item backend
12985 @cindex backend
12986 Gnus gets fed articles from a number of backends, both news and mail
12987 backends.  Gnus does not handle the underlying media, so to speak---this
12988 is all done by the backends.
12989
12990 @item native
12991 @cindex native
12992 Gnus will always use one method (and backend) as the @dfn{native}, or
12993 default, way of getting news.
12994
12995 @item foreign
12996 @cindex foreign
12997 You can also have any number of foreign groups active at the same time.
12998 These are groups that use different backends for getting news.
12999
13000 @item secondary
13001 @cindex secondary
13002 Secondary backends are somewhere half-way between being native and being
13003 foreign, but they mostly act like they are native.
13004
13005 @item article
13006 @cindex article
13007 A nessage that has been posted as news.
13008
13009 @item mail message
13010 @cindex mail message
13011 A message that has been mailed.
13012
13013 @item message 
13014 @cindex message
13015 A mail message or news article
13016
13017 @item head
13018 @cindex head
13019 The top part of a message, where administrative information (etc.) is
13020 put.
13021
13022 @item body
13023 @cindex body
13024 The rest of an article.  Everything that is not in the head is in the
13025 body. 
13026
13027 @item header
13028 @cindex header
13029 A line from the head of an article. 
13030
13031 @item headers
13032 @cindex headers
13033 A collection of such lines, or a collection of heads.  Or even a
13034 collection of @sc{nov} lines.
13035
13036 @item @sc{nov}
13037 @cindex nov
13038 When Gnus enters a group, it asks the backend for the headers of all
13039 unread articles in the group.  Most servers support the News OverView
13040 format, which is more compact and much faster to read and parse than the
13041 normal @sc{head} format.
13042
13043 @item level
13044 @cindex levels
13045 Each group is subscribed at some @dfn{level} or other (1-9).  The ones
13046 that have a lower level are ``more'' subscribed than the groups with a
13047 higher level.  In fact, groups on levels 1-5 are considered
13048 @dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9
13049 are @dfn{killed}.  Commands for listing groups and scanning for new
13050 articles will all use the numeric prefix as @dfn{working level}.
13051
13052 @item killed groups
13053 @cindex killed groups
13054 No information on killed groups is stored or updated, which makes killed
13055 groups much easier to handle than subscribed groups.
13056
13057 @item zombie groups
13058 @cindex zombie groups
13059 Just like killed groups, only slightly less dead.
13060
13061 @item active file
13062 @cindex active file
13063 The news server has to keep track of what articles it carries, and what
13064 groups exist.  All this information in stored in the active file, which
13065 is rather large, as you might surmise.
13066
13067 @item bogus groups
13068 @cindex bogus groups
13069 A group that exists in the @file{.newsrc} file, but isn't known to the
13070 server (i. e.,  it isn't in the active file), is a @emph{bogus group}.
13071 This means that the group probably doesn't exist (any more).
13072
13073 @item server 
13074 @cindex server
13075 A machine than one can connect to and get news (or mail) from.
13076
13077 @item select method
13078 @cindex select method
13079 A structure that specifies the backend, the server and the virtual
13080 server parameters.
13081
13082 @item virtual server
13083 @cindex virtual server
13084 A named select method.  Since a select methods defines all there is to
13085 know about connecting to a (physical) server, taking the who things as a
13086 whole is a virtual server.
13087
13088 @end table
13089
13090
13091 @node Customization
13092 @section Customization
13093 @cindex general customization
13094
13095 All variables are properly documented elsewhere in this manual.  This
13096 section is designed to give general pointers on how to customize Gnus
13097 for some quite common situations.
13098
13099 @menu
13100 * Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere.
13101 * Slow Terminal Connection::  You run a remote Emacs.
13102 * Little Disk Space::         You feel that having large setup files is icky.
13103 * Slow Machine::              You feel like buying a faster machine.
13104 @end menu
13105
13106
13107 @node Slow/Expensive Connection
13108 @subsection Slow/Expensive @sc{nntp} Connection
13109
13110 If you run Emacs on a machine locally, and get your news from a machine
13111 over some very thin strings, you want to cut down on the amount of data
13112 Gnus has to get from the @sc{nntp} server.
13113
13114 @table @code
13115
13116 @item gnus-read-active-file
13117 Set this to @code{nil}, which will inhibit Gnus from requesting the
13118 entire active file from the server.  This file is often v.  large.  You
13119 also have to set @code{gnus-check-new-news} and
13120 @code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus
13121 doesn't suddenly decide to fetch the active file anyway.
13122
13123 @item gnus-nov-is-evil
13124 This one has to be @code{nil}.  If not, grabbing article headers from
13125 the @sc{nntp} server will not be very fast.  Not all @sc{nntp} servers
13126 support @sc{xover}; Gnus will detect this by itself.
13127 @end table
13128
13129
13130 @node Slow Terminal Connection
13131 @subsection Slow Terminal Connection
13132
13133 Let's say you use your home computer for dialing up the system that
13134 runs Emacs and Gnus.  If your modem is slow, you want to reduce the
13135 amount of data that is sent over the wires as much as possible.
13136
13137 @table @code
13138
13139 @item gnus-auto-center-summary
13140 Set this to @code{nil} to inhibit Gnus from re-centering the summary
13141 buffer all the time.  If it is @code{vertical}, do only vertical
13142 re-centering.  If it is neither @code{nil} nor @code{vertical}, do both
13143 horizontal and vertical recentering.
13144
13145 @item gnus-visible-headers
13146 Cut down on the headers that are included in the articles to the
13147 minimum.  You can, in fact, make do without them altogether---most of the
13148 useful data is in the summary buffer, anyway.  Set this variable to
13149 @samp{^NEVVVVER} or @samp{From:}, or whatever you feel you need.
13150
13151 @item gnus-article-display-hook
13152 Set this hook to all the available hiding commands:
13153 @lisp
13154 (setq gnus-article-display-hook 
13155       '(gnus-article-hide-headers gnus-article-hide-signature
13156         gnus-article-hide-citation))
13157 @end lisp
13158
13159 @item gnus-use-full-window
13160 By setting this to @code{nil}, you can make all the windows smaller.
13161 While this doesn't really cut down much generally, it means that you
13162 have to see smaller portions of articles before deciding that you didn't
13163 want to read them anyway.
13164
13165 @item gnus-thread-hide-subtree
13166 If this is non-@code{nil}, all threads in the summary buffer will be
13167 hidden initially.
13168
13169 @item gnus-updated-mode-lines
13170 If this is @code{nil}, Gnus will not put information in the buffer mode
13171 lines, which might save some time.
13172 @end table
13173
13174
13175 @node Little Disk Space
13176 @subsection Little Disk Space
13177 @cindex disk space
13178
13179 The startup files can get rather large, so you may want to cut their
13180 sizes a bit if you are running out of space.
13181
13182 @table @code
13183
13184 @item gnus-save-newsrc-file
13185 If this is @code{nil}, Gnus will never save @file{.newsrc}---it will
13186 only save @file{.newsrc.eld}.  This means that you will not be able to
13187 use any other newsreaders than Gnus.  This variable is @code{t} by
13188 default. 
13189
13190 @item gnus-save-killed-list
13191 If this is @code{nil}, Gnus will not save the list of dead groups.  You
13192 should also set @code{gnus-check-new-newsgroups} to @code{ask-server}
13193 and @code{gnus-check-bogus-newsgroups} to @code{nil} if you set this
13194 variable to @code{nil}.  This variable is @code{t} by default.
13195
13196 @end table
13197
13198
13199 @node Slow Machine
13200 @subsection Slow Machine
13201 @cindex slow machine
13202
13203 If you have a slow machine, or are just really impatient, there are a
13204 few things you can do to make Gnus run faster.
13205
13206 Set@code{gnus-check-new-newsgroups} and
13207 @code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster.
13208
13209 Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and
13210 @code{gnus-nov-is-evil} to @code{nil} to make entering and exiting the
13211 summary buffer faster.
13212
13213 Set @code{gnus-article-display-hook} to @code{nil} to make article
13214 processing a bit faster.
13215
13216
13217 @node Troubleshooting
13218 @section Troubleshooting
13219 @cindex troubleshooting
13220
13221 Gnus works @emph{so} well straight out of the box---I can't imagine any
13222 problems, really.
13223
13224 Ahem.
13225
13226 @enumerate
13227
13228 @item
13229 Make sure your computer is switched on.
13230
13231 @item
13232 Make sure that you really load the current Gnus version.  If you have
13233 been running @sc{gnus}, you need to exit Emacs and start it up again before
13234 Gnus will work.
13235
13236 @item
13237 Try doing an @kbd{M-x gnus-version}.  If you get something that looks
13238 like @samp{Gnus v5.46; nntp 4.0} you have the right files loaded.  If,
13239 on the other hand, you get something like @samp{NNTP 3.x} or @samp{nntp
13240 flee}, you have some old @file{.el} files lying around.  Delete these.
13241
13242 @item
13243 Read the help group (@kbd{G h} in the group buffer) for a FAQ and a
13244 how-to. 
13245
13246 @item
13247 @vindex max-lisp-eval-depth
13248 Gnus works on many recursive structures, and in some extreme (and very
13249 rare) cases Gnus may recurse down ``too deeply'' and Emacs will beep at
13250 you.  If this happens to you, set @code{max-lisp-eval-depth} to 500 or
13251 something like that.
13252 @end enumerate
13253
13254 If all else fails, report the problem as a bug.
13255
13256 @cindex bugs
13257 @cindex reporting bugs
13258
13259 @kindex M-x gnus-bug
13260 @findex gnus-bug
13261 If you find a bug in Gnus, you can report it with the @kbd{M-x gnus-bug}
13262 command. @kbd{M-x set-variable RET debug-on-error RET t RET}, and send
13263 me the backtrace.  I will fix bugs, but I can only fix them if you send
13264 me a precise description as to how to reproduce the bug.
13265
13266 You really can never be too detailed in a bug report.  Always use the
13267 @kbd{M-x gnus-bug} command when you make bug reports, even if it creates
13268 a 10Kb mail each time you use it, and even if you have sent me your
13269 environment 500 times before.  I don't care.  I want the full info each
13270 time.  
13271
13272 It is also important to remember that I have no memory whatsoever.  If
13273 you send a bug report, and I send you a reply, and then you send back
13274 just ``No, it's not! Moron!'', I will have no idea what you are
13275 insulting me about.  Always over-explain everything.  It's much easier
13276 for all of us---if I don't have all the information I need, I will just
13277 mail you and ask for more info, and everything takes more time.
13278
13279 If the problem you're seeing is very visual, and you can't quite explain
13280 it, copy the Emacs window to a file (with @code{xwd}, for instance), put
13281 it somewhere it can be reached, and include the URL of the picture in
13282 the bug report.a
13283
13284 If you just need help, you are better off asking on
13285 @samp{gnu.emacs.gnus}.  I'm not very helpful.
13286
13287 @cindex gnu.emacs.gnus
13288 @cindex ding mailing list
13289 You can also ask on the ding mailing list---@samp{ding@@ifi.uio.no}.
13290 Write to @samp{ding-request@@ifi.uio.no} to subscribe.
13291
13292
13293 @node A Programmers Guide to Gnus
13294 @section A Programmer's Guide to Gnus
13295
13296 It is my hope that other people will figure out smart stuff that Gnus
13297 can do, and that other people will write those smart things as well.  To
13298 facilitate that I thought it would be a good idea to describe the inner
13299 workings of Gnus.  And some of the not-so-inner workings, while I'm at
13300 it.
13301
13302 You can never expect the internals of a program not to change, but I
13303 will be defining (in some details) the interface between Gnus and its
13304 backends (this is written in stone), the format of the score files
13305 (ditto), data structures (some are less likely to change than others)
13306 and general method of operations.
13307
13308 @menu 
13309 * Backend Interface::        How Gnus communicates with the servers.
13310 * Score File Syntax::        A BNF definition of the score file standard.
13311 * Headers::                  How Gnus stores headers internally.
13312 * Ranges::                   A handy format for storing mucho numbers.
13313 * Group Info::               The group info format.
13314 * Emacs/XEmacs Code::        Gnus can be run under all modern Emacsen.
13315 * Various File Formats::     Formats of files that Gnus use.
13316 @end menu
13317
13318
13319 @node Backend Interface
13320 @subsection Backend Interface
13321
13322 Gnus doesn't know anything about @sc{nntp}, spools, mail or virtual
13323 groups.  It only knows how to talk to @dfn{virtual servers}.  A virtual
13324 server is a @dfn{backend} and some @dfn{backend variables}.  As examples
13325 of the first, we have @code{nntp}, @code{nnspool} and @code{nnmbox}.  As
13326 examples of the latter we have @code{nntp-port-number} and
13327 @code{nnmbox-directory}.
13328
13329 When Gnus asks for information from a backend---say @code{nntp}---on
13330 something, it will normally include a virtual server name in the
13331 function parameters.  (If not, the backend should use the ``current''
13332 virtual server.)  For instance, @code{nntp-request-list} takes a virtual
13333 server as its only (optional) parameter.  If this virtual server hasn't
13334 been opened, the function should fail.
13335
13336 Note that a virtual server name has no relation to some physical server
13337 name.  Take this example:
13338
13339 @lisp
13340 (nntp "odd-one" 
13341       (nntp-address "ifi.uio.no") 
13342       (nntp-port-number 4324))
13343 @end lisp
13344
13345 Here the virtual server name is @samp{odd-one} while the name of
13346 the physical server is @samp{ifi.uio.no}. 
13347
13348 The backends should be able to switch between several virtual servers.
13349 The standard backends implement this by keeping an alist of virtual
13350 server environments that it pulls down/pushes up when needed.  
13351
13352 There are two groups of interface functions: @dfn{required functions},
13353 which must be present, and @dfn{optional functions}, which Gnus will
13354 always check whether are present before attempting to call.
13355
13356 All these functions are expected to return data in the buffer
13357 @code{nntp-server-buffer} (@samp{ *nntpd*}), which is somewhat
13358 unfortunately named, but we'll have to live with it.  When I talk about
13359 @dfn{resulting data}, I always refer to the data in that buffer.  When I
13360 talk about @dfn{return value}, I talk about the function value returned by
13361 the function call.  Functions that fail should return @code{nil} as the
13362 return value.
13363
13364 Some backends could be said to be @dfn{server-forming} backends, and
13365 some might be said to not be.  The latter are backends that generally
13366 only operate on one group at a time, and have no concept of ``server''
13367 -- they have a group, and they deliver info on that group and nothing
13368 more.
13369
13370 In the examples and definitions I will refer to the imaginary backend
13371 @code{nnchoke}. 
13372
13373 @cindex @code{nnchoke}
13374
13375 @menu
13376 * Required Backend Functions::        Functions that must be implemented.
13377 * Optional Backend Functions::        Functions that need not be implemented.
13378 * Error Messaging::                   How to get messages and report errors.
13379 * Writing New Backends::              Extending old backends.
13380 * Hooking New Backends Into Gnus::    What has to be done on the Gnus end.
13381 @end menu
13382
13383
13384 @node Required Backend Functions
13385 @subsubsection Required Backend Functions
13386
13387 @table @code
13388
13389 @item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD)
13390
13391 @var{articles} is either a range of article numbers or a list of
13392 @code{Message-ID}s.  Current backends do not fully support either---only
13393 sequences (lists) of article numbers, and most backends do not support
13394 retrieval of @code{Message-ID}s.  But they should try for both. 
13395
13396 The result data should either be HEADs or NOV lines, and the result
13397 value should either be @code{headers} or @code{nov} to reflect this.
13398 This might later be expanded to @code{various}, which will be a mixture
13399 of HEADs and NOV lines, but this is currently not supported by Gnus.  
13400
13401 If @var{fetch-old} is non-@code{nil} it says to try to fetch "extra
13402 headers, in some meaning of the word.  This is generally done by
13403 fetching (at most) @var{fetch-old} extra headers less than the smallest
13404 article number in @code{articles}, and fill in the gaps as well.  The
13405 presence of this parameter can be ignored if the backend finds it
13406 cumbersome to follow the request.  If this is non-@code{nil} and not a
13407 number, do maximum fetches.
13408
13409 Here's an example HEAD:
13410
13411 @example
13412 221 1056 Article retrieved.
13413 Path: ifi.uio.no!sturles
13414 From: sturles@@ifi.uio.no (Sturle Sunde)
13415 Newsgroups: ifi.discussion
13416 Subject: Re: Something very droll
13417 Date: 27 Oct 1994 14:02:57 +0100
13418 Organization: Dept. of Informatics, University of Oslo, Norway
13419 Lines: 26
13420 Message-ID: <38o8e1$a0o@@holmenkollen.ifi.uio.no>
13421 References: <38jdmq$4qu@@visbur.ifi.uio.no>
13422 NNTP-Posting-Host: holmenkollen.ifi.uio.no
13423 .
13424 @end example
13425
13426 So a @code{headers} return value would imply that there's a number of
13427 these in the data buffer.
13428
13429 Here's a BNF definition of such a buffer:
13430
13431 @example
13432 headers        = *head
13433 head           = error / valid-head
13434 error-message  = [ "4" / "5" ] 2number " " <error message> eol
13435 valid-head     = valid-message *header "." eol
13436 valid-message  = "221 " <number> " Article retrieved." eol
13437 header         = <text> eol
13438 @end example
13439
13440 If the return value is @code{nov}, the data buffer should contain
13441 @dfn{network overview database} lines.  These are basically fields
13442 separated by tabs. 
13443
13444 @example
13445 nov-buffer = *nov-line
13446 nov-line   = 8*9 [ field <TAB> ] eol
13447 field      = <text except TAB>
13448 @end example
13449
13450 For a closer explanation what should be in those fields,
13451 @pxref{Headers}. 
13452
13453
13454 @item (nnchoke-open-server SERVER &optional DEFINITIONS)
13455
13456 @var{server} is here the virtual server name.  @var{definitions} is a
13457 list of @code{(VARIABLE VALUE)} pairs that defines this virtual server. 
13458
13459 If the server can't be opened, no error should be signaled.  The backend
13460 may then choose to refuse further attempts at connecting to this
13461 server.  In fact, it should do so. 
13462
13463 If the server is opened already, this function should return a
13464 non-@code{nil} value.  There should be no data returned.
13465
13466
13467 @item (nnchoke-close-server &optional SERVER)
13468
13469 Close connection to @var{server} and free all resources connected
13470 to it.  Return @code{nil} if the server couldn't be closed for some
13471 reason.
13472
13473 There should be no data returned.
13474
13475
13476 @item (nnchoke-request-close)
13477
13478 Close connection to all servers and free all resources that the backend
13479 have reserved.  All buffers that have been created by that backend
13480 should be killed.  (Not the @code{nntp-server-buffer}, though.)  This
13481 function is generally only called when Gnus is shutting down.
13482
13483 There should be no data returned. 
13484
13485
13486 @item (nnchoke-server-opened &optional SERVER)
13487
13488 If @var{server} is the current virtual server, and the connection to the
13489 physical server is alive, then this function should return a
13490 non-@code{nil} vlue.  This function should under no circumstances
13491 attempt to reconnect to a server that is has lost connection to.
13492
13493 There should be no data returned.
13494
13495
13496 @item (nnchoke-status-message &optional SERVER)
13497
13498 This function should return the last error message from @var{server}. 
13499
13500 There should be no data returned.
13501
13502
13503 @item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER)
13504
13505 The result data from this function should be the article specified by
13506 @var{article}.  This might either be a @code{Message-ID} or a number.
13507 It is optional whether to implement retrieval by @code{Message-ID}, but
13508 it would be nice if that were possible.
13509
13510 If @var{to-buffer} is non-@code{nil}, the result data should be returned
13511 in this buffer instead of the normal data buffer.  This is to make it
13512 possible to avoid copying large amounts of data from one buffer to
13513 another, and Gnus mainly request articles to be inserted directly into
13514 its article buffer.
13515
13516 If it is at all possible, this function should return a cons cell where
13517 the car is the group name the article was fetched from, and the cdr is
13518 the article number.  This will enable Gnus to find out what the real
13519 group and article numbers are when fetching articles by
13520 @code{Message-ID}.  If this isn't possible, @code{t} should be returned
13521 on successful article retrievement.
13522
13523
13524 @item (nnchoke-open-group GROUP &optional SERVER)
13525
13526 Make @var{group} the current group.  
13527
13528 There should be no data returned by this function.
13529
13530
13531 @item (nnchoke-request-group GROUP &optional SERVER FAST)
13532
13533 Get data on @var{group}.  This function also has the side effect of
13534 making @var{group} the current group. 
13535
13536 If @var{FAST}, don't bother to return useful data, just make @var{group}
13537 the current group.
13538
13539 Here's an example of some result data and a definition of the same:
13540
13541 @example
13542 211 56 1000 1059 ifi.discussion
13543 @end example
13544
13545 The first number is the status, which should be @code{211}.  Next is the
13546 total number of articles in the group, the lowest article number, the
13547 highest article number, and finally the group name.  Note that the total
13548 number of articles may be less than one might think while just
13549 considering the highest and lowest article numbers, but some articles
13550 may have been canceled.  Gnus just discards the total-number, so
13551 whether one should take the bother to generate it properly (if that is a
13552 problem) is left as an exercise to the reader.
13553
13554 @example
13555 group-status = [ error / info ] eol
13556 error        = [ "4" / "5" ] 2<number> " " <Error message>
13557 info         = "211 " 3* [ <number> " " ] <string>
13558 @end example
13559
13560
13561 @item (nnchoke-close-group GROUP &optional SERVER)
13562
13563 Close @var{group} and free any resources connected to it.  This will be
13564 a no-op on most backends. 
13565
13566 There should be no data returned.
13567
13568
13569 @item (nnchoke-request-list &optional SERVER)
13570
13571 Return a list of all groups available on @var{server}.  And that means
13572 @emph{all}. 
13573
13574 Here's an example from a server that only carries two groups:
13575
13576 @example
13577 ifi.test 0000002200 0000002000 y
13578 ifi.discussion 3324 3300 n
13579 @end example
13580
13581 On each line we have a group name, then the highest article number in
13582 that group, the lowest article number, and finally a flag.
13583
13584 @example
13585 active-file = *active-line
13586 active-line = name " " <number> " " <number> " " flags eol
13587 name        = <string>
13588 flags       = "n" / "y" / "m" / "x" / "j" / "=" name
13589 @end example
13590
13591 The flag says whether the group is read-only (@samp{n}), is moderated
13592 (@samp{m}), is dead (@samp{x}), is aliased to some other group
13593 (@samp{=other-group} or none of the above (@samp{y}). 
13594
13595
13596 @item (nnchoke-request-post &optional SERVER)
13597
13598 This function should post the current buffer.  It might return whether
13599 the posting was successful or not, but that's not required.  If, for
13600 instance, the posting is done asynchronously, it has generally not been
13601 completed by the time this function concludes.  In that case, this
13602 function should set up some kind of sentinel to beep the user loud and
13603 clear if the posting could not be completed.
13604
13605 There should be no result data from this function. 
13606
13607 @end table
13608
13609
13610 @node Optional Backend Functions
13611 @subsubsection Optional Backend Functions
13612
13613 @table @code
13614
13615 @item (nnchoke-retrieve-groups GROUPS &optional SERVER)
13616
13617 @var{groups} is a list of groups, and this function should request data
13618 on all those groups.  How it does it is of no concern to Gnus, but it
13619 should attempt to do this in a speedy fashion.
13620
13621 The return value of this function can be either @code{active} or
13622 @code{group}, which says what the format of the result data is.  The
13623 former is in the same format as the data from
13624 @code{nnchoke-request-list}, while the latter is a buffer full of lines
13625 in the same format as @code{nnchoke-request-group} gives.
13626
13627 @example
13628 group-buffer = *active-line / *group-status
13629 @end example
13630
13631
13632 @item (nnchoke-request-update-info GROUP INFO &optional SERVER)
13633
13634 A Gnus group info (@pxref{Group Info}) is handed to the backend for
13635 alterations.  This comes in handy if the backend really carries all the
13636 information (as is the case with virtual an imap groups).  This function
13637 may alter the info in any manner it sees fit, and should return the
13638 (altered) group info.  This function may alter the group info
13639 destructively, so no copying is needed before boogeying. 
13640
13641 There should be no result data from this function.
13642
13643
13644 @item (nnchoke-request-type GROUP &optional ARTICLE)
13645
13646 When the user issues commands for ``sending news'' (@kbd{F} in the
13647 summary buffer, for instance), Gnus has to know whether the article the
13648 user is following up is news or mail.  This function should return
13649 @code{news} if @var{article} in @var{group} is news, @code{mail} if it
13650 is mail and @code{unknown} if the type can't be decided.  (The
13651 @var{article} parameter is necessary in @code{nnvirtual} groups which
13652 might very well combine mail groups and news groups.)  Both @var{group}
13653 and @var{article} may be @code{nil}.
13654
13655 There should be no result data from this function.
13656
13657
13658 @item (nnchoke-request-update-mark GROUP ARTICLE MARK)
13659
13660 If the user tries to set a mark that the backend doesn't like, this
13661 function may change the mark.  Gnus will use whatever this function
13662 returns as the mark for @var{article} instead of the original
13663 @var{mark}.  If the backend doesn't care, it must return the original
13664 @var{mark}, and not @code{nil} or any other type of garbage.  
13665
13666 The only use for this that I can see is what @code{nnvirtual} does with
13667 it---if a component group is auto-expirable, marking an article as read
13668 in the virtual group should result in the article being marked as
13669 expirable. 
13670
13671 There should be no result data from this function.
13672
13673
13674 @item (nnchoke-request-scan &optional GROUP SERVER)
13675
13676 This function may be called at any time (by Gnus or anything else) to
13677 request that the backend check for incoming articles, in one way or
13678 another.  A mail backend will typically read the spool file or query the
13679 POP server when this function is invoked.  The @var{group} doesn't have
13680 to be heeded---if the backend decides that it is too much work just
13681 scanning for a single group, it may do a total scan of all groups.  It
13682 would be nice, however, to keep things local if that's practical.
13683
13684 There should be no result data from this function.
13685
13686
13687 @item (nnchoke-request-asynchronous GROUP &optional SERVER ARTICLES)
13688
13689 This is a request to fetch articles asynchronously later.
13690 @var{articles} is an alist of @var{(article-number line-number)}.  One
13691 would generally expect that if one later fetches article number 4, for
13692 instance, some sort of asynchronous fetching of the articles after 4
13693 (which might be 5, 6, 7 or 11, 3, 909 depending on the order in that
13694 alist) would be fetched asynchronously, but that is left up to the
13695 backend.  Gnus doesn't care.
13696
13697 There should be no result data from this function.
13698  
13699
13700 @item (nnchoke-request-group-description GROUP &optional SERVER)
13701
13702 The result data from this function should be a description of
13703 @var{group}. 
13704
13705 @example
13706 description-line = name <TAB> description eol
13707 name             = <string>
13708 description      = <text>
13709 @end example
13710
13711 @item (nnchoke-request-list-newsgroups &optional SERVER)
13712
13713 The result data from this function should be the description of all
13714 groups available on the server.
13715
13716 @example
13717 description-buffer = *description-line
13718 @end example
13719
13720
13721 @item (nnchoke-request-newgroups DATE &optional SERVER)
13722
13723 The result data from this function should be all groups that were
13724 created after @samp{date}, which is in normal human-readable date
13725 format.  The data should be in the active buffer format.
13726
13727
13728 @item (nnchoke-request-create-group GROUP &optional SERVER)
13729
13730 This function should create an empty group with name @var{group}.  
13731
13732 There should be no return data.
13733
13734
13735 @item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE)
13736
13737 This function should run the expiry process on all articles in the
13738 @var{articles} range (which is currently a simple list of article
13739 numbers.)  It is left up to the backend to decide how old articles
13740 should be before they are removed by this function.  If @var{force} is
13741 non-@code{nil}, all @var{articles} should be deleted, no matter how new
13742 they are. 
13743
13744 This function should return a list of articles that it did not/was not
13745 able to delete.
13746
13747 There should be no result data returned.
13748
13749
13750 @item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM
13751 &optional LAST)
13752
13753 This function should move @var{article} (which is a number) from
13754 @var{group} by calling @var{accept-form}.  
13755
13756 This function should ready the article in question for moving by
13757 removing any header lines it has added to the article, and generally
13758 should ``tidy up'' the article.  Then it should @code{eval}
13759 @var{accept-form} in the buffer where the ``tidy'' article is.  This
13760 will do the actual copying.  If this @code{eval} returns a
13761 non-@code{nil} value, the article should be removed.
13762
13763 If @var{last} is @code{nil}, that means that there is a high likelihood
13764 that there will be more requests issued shortly, so that allows some
13765 optimizations. 
13766
13767 The function should return a cons where the car is the group name and
13768 the cdr is the article number that the article was entered as.
13769
13770 There should be no data returned. 
13771
13772
13773 @item (nnchoke-request-accept-article GROUP &optional SERVER LAST)
13774
13775 This function takes the current buffer and inserts it into @var{group}.
13776 If @var{last} in @code{nil}, that means that there will be more calls to
13777 this function in short order.
13778
13779 The function should return a cons where the car is the group name and
13780 the cdr is the article number that the article was entered as.
13781
13782 There should be no data returned.
13783
13784
13785 @item (nnchoke-request-replace-article ARTICLE GROUP BUFFER)
13786
13787 This function should remove @var{article} (which is a number) from
13788 @var{group} and insert @var{buffer} there instead.
13789
13790 There should be no data returned.
13791
13792
13793 @item (nnchoke-request-delete-group GROUP FORCE &optional SERVER)
13794
13795 This function should delete @var{group}.  If @var{force}, it should
13796 really delete all the articles in the group, and then delete the group
13797 itself.  (If there is such a thing as ``the group itself''.)
13798
13799 There should be no data returned.
13800
13801
13802 @item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER)
13803
13804 This function should rename @var{group} into @var{new-name}.  All
13805 articles that are in @var{group} should move to @var{new-name}.
13806
13807 There should be no data returned.
13808
13809 @end table
13810
13811
13812 @node Error Messaging
13813 @subsubsection Error Messaging
13814
13815 @findex nnheader-report
13816 @findex nnheader-get-report
13817 The backends should use the function @code{nnheader-report} to report
13818 error conditions---they should not raise errors when they aren't able to
13819 perform a request.  The first argument to this function is the backend
13820 symbol, and the rest are interpreted as arguments to @code{format} if
13821 there are many of them, or just a string if there is one of them.
13822 This function always returns @code{nil}.
13823
13824 @lisp
13825 (nnheader-report 'nnchoke "You did something totally bogus")
13826
13827 (nnheader-report 'nnchoke "Could not request group %s" group)
13828 @end lisp
13829
13830 Gnus, in turn, will call @code{nnheader-get-report} when it gets a
13831 @code{nil} back from a server, and this function returns the most
13832 recently reported message for the backend in question.  This function
13833 takes one argument---the server symbol.
13834
13835 Internally, these function access @var{backend}@code{-status-string}, so
13836 the @code{nnchoke} backend will have its error message stored in
13837 @code{nnchoke-status-string}. 
13838
13839
13840 @node Writing New Backends
13841 @subsubsection Writing New Backends
13842
13843 Many backends are quite similar.  @code{nnml} is just like
13844 @code{nnspool}, but it allows you to edit the articles on the server.
13845 @code{nnmh} is just like @code{nnml}, but it doesn't use an active file,
13846 and it doesn't maintain overview databases.  @code{nndir} is just like
13847 @code{nnml}, but it has no concept of ``groups'', and it doesn't allow
13848 editing articles.
13849
13850 It would make sense if it were possible to ``inherit'' functions from
13851 backends when writing new backends.  And, indeed, you can do that if you
13852 want to.  (You don't have to if you don't want to, of course.)  
13853
13854 All the backends declare their public variables and functions by using a
13855 package called @code{nnoo}.  
13856
13857 To inherit functions from other backends (and allow other backends to
13858 inherit functions from the current backend), you should use the
13859 following macros:
13860 following. 
13861
13862 @table @code
13863
13864 @item nnoo-declare
13865 This macro declares the first parameter to be a child of the subsequent
13866 parameters.  For instance:
13867
13868 @lisp
13869 (nnoo-declare nndir
13870   nnml nnmh)
13871 @end lisp
13872
13873 @code{nndir} has here declared that it intends to inherit functions from
13874 both @code{nnml} and @code{nnmh}.
13875
13876 @item defvoo
13877 This macro is equivalent to @code{defvar}, but registers the variable as
13878 a public server variable.  Most state-oriented variables should be
13879 declared with @code{defvoo} instead of @code{defvar}.  
13880
13881 In addition to the normal @code{defvar} parameters, it takes a list of
13882 variables in the parent backends to map the variable to when executing
13883 a function in those backends.
13884
13885 @lisp
13886 (defvoo nndir-directory nil
13887   "Where nndir will look for groups."
13888   nnml-current-directory nnmh-current-directory)
13889 @end lisp
13890
13891 This means that @code{nnml-current-directory} will be set to
13892 @code{nndir-directory} when an @code{nnml} function is called on behalf
13893 of @code{nndir}.  (The same with @code{nnmh}.)  
13894
13895 @item nnoo-define-basics
13896 This macro defines some common functions that almost all backends should
13897 have.
13898
13899 @example
13900 (nnoo-define-basics nndir)
13901 @end example
13902
13903 @item deffoo
13904 This macro is just like @code{defun} and takes the same parameters.  In
13905 addition to doing the normal @code{defun} things, it registers the
13906 function as being public so that other backends can inherit it.
13907
13908 @item nnoo-map-functions
13909 This macro allows mapping of functions from the current backend to
13910 functions from the parent backends.
13911
13912 @example
13913 (nnoo-map-functions nndir
13914   (nnml-retrieve-headers 0 nndir-current-group 0 0)
13915   (nnmh-request-article 0 nndir-current-group 0 0))
13916 @end example
13917
13918 This means that when @code{nndir-retrieve-headers} is called, the first,
13919 third, and fourth parameters will be passed on to
13920 @code{nnml-retrieve-headers}, while the second parameter is set to the
13921 value of @code{nndir-current-group}.
13922
13923 @item nnoo-import
13924 This macro allows importing functions from backends.  It should be the
13925 last thing in the source file, since it will only define functions that
13926 haven't already been defined.
13927
13928 @example
13929 (nnoo-import nndir
13930   (nnmh
13931    nnmh-request-list
13932    nnmh-request-newgroups)
13933   (nnml))
13934 @end example
13935
13936 This means that calls to @code{nndir-request-list} should just be passed
13937 on to @code{nnmh-request-list}, while all public functions from
13938 @code{nnml} that haven't been defined in @code{nndir} yet should be
13939 defined now.
13940
13941 @end table
13942
13943 Below is a slightly shortened version of the @code{nndir} backend.
13944
13945 @lisp
13946 ;;; nndir.el --- single directory newsgroup access for Gnus
13947 ;; Copyright (C) 1995,96 Free Software Foundation, Inc.
13948
13949 ;;; Code:
13950
13951 (require 'nnheader)
13952 (require 'nnmh)
13953 (require 'nnml)
13954 (require 'nnoo)
13955 (eval-when-compile (require 'cl))
13956
13957 (nnoo-declare nndir
13958   nnml nnmh)
13959
13960 (defvoo nndir-directory nil
13961   "Where nndir will look for groups."
13962   nnml-current-directory nnmh-current-directory)
13963
13964 (defvoo nndir-nov-is-evil nil
13965   "*Non-nil means that nndir will never retrieve NOV headers."
13966   nnml-nov-is-evil)
13967
13968 (defvoo nndir-current-group "" nil nnml-current-group nnmh-current-group)
13969 (defvoo nndir-top-directory nil nil nnml-directory nnmh-directory)
13970 (defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail)
13971
13972 (defvoo nndir-status-string "" nil nnmh-status-string)
13973 (defconst nndir-version "nndir 1.0")
13974
13975 ;;; Interface functions.
13976
13977 (nnoo-define-basics nndir)
13978
13979 (deffoo nndir-open-server (server &optional defs)
13980   (setq nndir-directory
13981         (or (cadr (assq 'nndir-directory defs))
13982             server))
13983   (unless (assq 'nndir-directory defs)
13984     (push `(nndir-directory ,server) defs))
13985   (push `(nndir-current-group
13986           ,(file-name-nondirectory (directory-file-name nndir-directory)))
13987         defs)
13988   (push `(nndir-top-directory
13989           ,(file-name-directory (directory-file-name nndir-directory)))
13990         defs)
13991   (nnoo-change-server 'nndir server defs))
13992
13993 (nnoo-map-functions nndir
13994   (nnml-retrieve-headers 0 nndir-current-group 0 0)
13995   (nnmh-request-article 0 nndir-current-group 0 0)
13996   (nnmh-request-group nndir-current-group 0 0)
13997   (nnmh-close-group nndir-current-group 0))
13998
13999 (nnoo-import nndir
14000   (nnmh
14001    nnmh-status-message
14002    nnmh-request-list
14003    nnmh-request-newgroups))
14004
14005 (provide 'nndir)
14006 @end lisp
14007
14008
14009 @node Hooking New Backends Into Gnus
14010 @subsubsection Hooking New Backends Into Gnus
14011
14012 @vindex gnus-valid-select-methods
14013 Having Gnus start using your new backend is rather easy---you just
14014 declare it with the @code{gnus-declare-backend} functions.  This will
14015 enter the backend into the @code{gnus-valid-select-methods} variable.
14016
14017 @code{gnus-declare-backend} takes two parameters---the backend name and
14018 an arbitrary number of @dfn{abilities}.
14019
14020 Here's an example:
14021
14022 @lisp
14023 (gnus-declare-backend "nnchoke" 'mail 'respool 'address)
14024 @end lisp
14025
14026 The abilities can be:
14027
14028 @table @code
14029 @item mail
14030 This is a mailish backend---followups should (probably) go via mail.
14031 @item post
14032 This is a newsish backend---followups should (probably) go via news. 
14033 @item post-mail
14034 This backend supports both mail and news.
14035 @item none
14036 This is neither a post or mail backend---it's something completely
14037 different. 
14038 @item respool
14039 It supports respooling---or rather, it is able to modify its source
14040 articles and groups.
14041 @item address
14042 The name of the server should be in the virtual server name.  This is
14043 true for almost all backends.
14044 @item prompt-address
14045 The user should be prompted for an address when doing commands like
14046 @kbd{B} in the group buffer.  This is true for backends like
14047 @code{nntp}, but not @code{nnmbox}, for instance. 
14048 @end table
14049
14050
14051
14052 @node Score File Syntax
14053 @subsection Score File Syntax
14054
14055 Score files are meant to be easily parsable, but yet extremely
14056 mallable.   It was decided that something that had the same read syntax
14057 as an Emacs Lisp list would fit that spec.
14058
14059 Here's a typical score file:
14060
14061 @lisp
14062 (("summary"
14063   ("win95" -10000 nil s)
14064   ("Gnus"))
14065  ("from"
14066   ("Lars" -1000))
14067  (mark -100))
14068 @end lisp
14069
14070 BNF definition of a score file:
14071
14072 @example
14073 score-file       = "" / "(" *element ")"
14074 element          = rule / atom
14075 rule             = string-rule / number-rule / date-rule
14076 string-rule      = "(" quote string-header quote space *string-match ")"
14077 number-rule      = "(" quote number-header quote space *number-match ")"
14078 date-rule        = "(" quote date-header quote space *date-match ")"
14079 quote            = <ascii 34>
14080 string-header    = "subject" / "from" / "references" / "message-id" / 
14081                    "xref" / "body" / "head" / "all" / "followup"
14082 number-header    = "lines" / "chars"
14083 date-header      = "date"
14084 string-match     = "(" quote <string> quote [ "" / [ space score [ "" / 
14085                    space date [ "" / [ space string-match-t ] ] ] ] ] ")"
14086 score            = "nil" / <integer>
14087 date             = "nil" / <natural number>
14088 string-match-t   = "nil" / "s" / "substring" / "S" / "Substring" / 
14089                    "r" / "regex" / "R" / "Regex" /
14090                    "e" / "exact" / "E" / "Exact" /
14091                    "f" / "fuzzy" / "F" / "Fuzzy"
14092 number-match     = "(" <integer> [ "" / [ space score [ "" / 
14093                    space date [ "" / [ space number-match-t ] ] ] ] ] ")"
14094 number-match-t   = "nil" / "=" / "<" / ">" / ">=" / "<="
14095 date-match       = "(" quote <string> quote [ "" / [ space score [ "" / 
14096                    space date [ "" / [ space date-match-t ] ] ] ] ")"
14097 date-match-t     = "nil" / "at" / "before" / "after"
14098 atom             = "(" [ required-atom / optional-atom ] ")"
14099 required-atom    = mark / expunge / mark-and-expunge / files /
14100                    exclude-files / read-only / touched
14101 optional-atom    = adapt / local / eval 
14102 mark             = "mark" space nil-or-number
14103 nil-or-number    = "nil" / <integer>
14104 expunge          = "expunge" space nil-or-number
14105 mark-and-expunge = "mark-and-expunge" space nil-or-number
14106 files            = "files" *[ space <string> ]
14107 exclude-files    = "exclude-files" *[ space <string> ]
14108 read-only        = "read-only" [ space "nil" / space "t" ]
14109 adapt            = "adapt" [ space "nil" / space "t" / space adapt-rule ]
14110 adapt-rule       = "(" *[ <string> *[ "(" <string> <integer> ")" ] ")"
14111 local            = "local" *[ space "(" <string> space <form> ")" ]
14112 eval             = "eval" space <form>
14113 space            = *[ " " / <TAB> / <NEWLINE> ]
14114 @end example
14115
14116 Any unrecognized elements in a score file should be ignored, but not
14117 discarded.  
14118
14119 As you can see, white space is needed, but the type and amount of white
14120 space is irrelevant.  This means that formatting of the score file is
14121 left up to the programmer---if it's simpler to just spew it all out on
14122 one looong line, then that's ok.
14123
14124 The meaning of the various atoms are explained elsewhere in this
14125 manual. 
14126
14127
14128 @node Headers
14129 @subsection Headers
14130
14131 Gnus uses internally a format for storing article headers that
14132 corresponds to the @sc{nov} format in a mysterious fashion.  One could
14133 almost suspect that the author looked at the @sc{nov} specification and
14134 just shamelessly @emph{stole} the entire thing, and one would be right.
14135
14136 @dfn{Header} is a severely overloaded term.  ``Header'' is used in
14137 RFC1036 to talk about lines in the head of an article (eg.,
14138 @code{From}).  It is used by many people as a synonym for
14139 ``head''---``the header and the body''.  (That should be avoided, in my
14140 opinion.)  And Gnus uses a format internally that it calls ``header'',
14141 which is what I'm talking about here.  This is a 9-element vector,
14142 basically, with each header (ouch) having one slot.
14143
14144 These slots are, in order: @code{number}, @code{subject}, @code{from},
14145 @code{date}, @code{id}, @code{references}, @code{chars}, @code{lines},
14146 @code{xref}.  There are macros for accessing and setting these
14147 slots---they all have predictable names beginning with
14148 @code{mail-header-} and @code{mail-header-set-}, respectively.
14149
14150 The @code{xref} slot is really a @code{misc} slot.  Any extra info will
14151 be put in there.
14152
14153
14154 @node Ranges
14155 @subsection Ranges
14156
14157 @sc{gnus} introduced a concept that I found so useful that I've started
14158 using it a lot and have elaborated on it greatly. 
14159
14160 The question is simple: If you have a large amount of objects that are
14161 identified by numbers (say, articles, to take a @emph{wild} example)
14162 that you want to callify as being ``included'', a normal sequence isn't
14163 very useful.  (A 200,000 length sequence is a bit long-winded.)
14164
14165 The solution is as simple as the question: You just collapse the
14166 sequence. 
14167
14168 @example
14169 (1 2 3 4 5 6 10 11 12)
14170 @end example
14171
14172 is transformed into
14173
14174 @example
14175 ((1 . 6) (10 . 12))
14176 @end example
14177
14178 To avoid having those nasty @samp{(13 . 13)} elements to denote a
14179 lonesome object, a @samp{13} is a valid element:
14180
14181 @example
14182 ((1 . 6) 7 (10 . 12))
14183 @end example
14184
14185 This means that comparing two ranges to find out whether they are equal
14186 is slightly tricky:
14187
14188 @example
14189 ((1 . 5) 7 8 (10 . 12))
14190 @end example
14191
14192 and
14193
14194 @example
14195 ((1 . 5) (7 . 8) (10 . 12))
14196 @end example
14197
14198 are equal.  In fact, any non-descending list is a range:
14199
14200 @example
14201 (1 2 3 4 5)
14202 @end example
14203
14204 is a perfectly valid range, although a pretty long-winded one.  This is
14205 also legal:
14206
14207 @example
14208 (1 . 5)
14209 @end example
14210
14211 and is equal to the previous range.
14212
14213 Here's a BNF definition of ranges.  Of course, one must remember the
14214 semantic requirement that the numbers are non-descending.  (Any number
14215 of repetition of the same number is allowed, but apt to disappear in
14216 range handling.)
14217
14218 @example
14219 range           = simple-range / normal-range
14220 simple-range    = "(" number " . " number ")"
14221 normal-range    = "(" start-contents ")"
14222 contents        = "" / simple-range *[ " " contents ] / 
14223                   number *[ " " contents ]
14224 @end example
14225
14226 Gnus currently uses ranges to keep track of read articles and article
14227 marks.  I plan on implementing a number of range operators in C if The
14228 Powers That Be are willing to let me.  (I haven't asked yet, because I
14229 need to do some more thinking on what operators I need to make life
14230 totally range-based without ever having to convert back to normal
14231 sequences.) 
14232
14233
14234 @node Group Info
14235 @subsection Group Info
14236
14237 Gnus stores all permanent info on groups in a @dfn{group info} list.
14238 This list is from three to six elements (or more) long and exhaustively
14239 describes the group.
14240
14241 Here are two example group infos; one is a very simple group while the
14242 second is a more complex one:
14243
14244 @example
14245 ("no.group" 5 (1 . 54324))
14246
14247 ("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55))
14248                 ((tick (15 . 19)) (replied 3 6 (19 . 3)))
14249                 (nnml "")
14250                 (auto-expire (to-address "ding@@ifi.uio.no")))
14251 @end example
14252
14253 The first element is the group name as Gnus knows the group; the second
14254 is the group level; the third is the read articles in range format; the
14255 fourth is a list of article marks lists; the fifth is the select method;
14256 and the sixth contains the group parameters.
14257
14258 Here's a BNF definition of the group info format:
14259
14260 @example
14261 info          = "(" group space level space read 
14262                 [ "" / [ space marks-list [ "" / [ space method [ "" /
14263                 space parameters ] ] ] ] ] ")" 
14264 group         = quote <string> quote
14265 level         = <integer in the range of 1 to inf>
14266 read          = range
14267 marks-lists   = nil / "(" *marks ")"
14268 marks         = "(" <string> range ")"
14269 method        = "(" <string> *elisp-forms ")"
14270 parameters    = "(" *elisp-forms ")"
14271 @end example
14272
14273 Actually that @samp{marks} rule is a fib.  A @samp{marks} is a
14274 @samp{<string>} consed on to a @samp{range}, but that's a bitch to say
14275 in pseudo-BNF.
14276
14277
14278 @node Emacs/XEmacs Code
14279 @subsection Emacs/XEmacs Code
14280 @cindex XEmacs
14281 @cindex Emacsen
14282
14283 While Gnus runs under Emacs, XEmacs and Mule, I decided that one of the
14284 platforms must be the primary one.  I chose Emacs.  Not because I don't
14285 like XEmacs or Mule, but because it comes first alphabetically.
14286
14287 This means that Gnus will byte-compile under Emacs with nary a warning,
14288 while XEmacs will pump out gigabytes of warnings while byte-compiling.
14289 As I use byte-compilation warnings to help me root out trivial errors in
14290 Gnus, that's very useful.  
14291
14292 I've also consistently used Emacs function interfaces, but have used
14293 Gnusey aliases for the functions.  To take an example:  Emacs defines a
14294 @code{run-at-time} function while XEmacs defines a @code{start-itimer}
14295 function.  I then define a function called @code{gnus-run-at-time} that
14296 takes the same parameters as the Emacs @code{run-at-time}.  When running
14297 Gnus under Emacs, the former function is just an alias for the latter.
14298 However, when running under XEmacs, the former is an alias for the
14299 following function:
14300
14301 @lisp
14302 (defun gnus-xmas-run-at-time (time repeat function &rest args)
14303   (start-itimer
14304    "gnus-run-at-time"
14305    `(lambda ()
14306       (,function ,@@args))
14307    time repeat))
14308 @end lisp
14309
14310 This sort of thing has been done for bunches of functions.  Gnus does
14311 not redefine any native Emacs functions while running under XEmacs---it
14312 does this @code{defalias} thing with Gnus equivalents instead.  Cleaner
14313 all over.
14314
14315 Of course, I could have chosen XEmacs as my native platform and done
14316 mapping functions the other way around.  But I didn't.  The performance
14317 hit these indirections impose on Gnus under XEmacs should be slight.
14318
14319
14320 @node Various File Formats
14321 @subsection Various File Formats
14322
14323 @menu
14324 * Active File Format::      Information on articles and groups available.
14325 * Newsgroups File Format::  Group descriptions.
14326 @end menu
14327
14328
14329 @node Active File Format
14330 @subsubsection Active File Format
14331
14332 The active file lists all groups that are available on the server in
14333 question.  It also lists the highest and lowest current article numbers
14334 in each group.  
14335
14336 Here's an excerpt from a typical active file:
14337
14338 @example
14339 soc.motss 296030 293865 y
14340 alt.binaries.pictures.fractals 3922 3913 n
14341 comp.sources.unix 1605 1593 m
14342 comp.binaries.ibm.pc 5097 5089 y
14343 no.general 1000 900 y
14344 @end example
14345
14346 Here's a pseudo-BNF definition of this file:
14347
14348 @example
14349 active      = *group-line
14350 group-line  = group space high-number space low-number space flag <NEWLINE>
14351 group       = <non-white-space string>
14352 space       = " "
14353 high-number = <non-negative integer>
14354 low-number  = <positive integer>
14355 flag        = "y" / "n" / "m" / "j" / "x" / "=" group
14356 @end example
14357
14358
14359 @node Newsgroups File Format
14360 @subsubsection Newsgroups File Format
14361
14362 The newsgroups file lists groups along with their descriptions.  Not all
14363 groups on the server have to be listed,  and not all groups in the file
14364 have to exist on the server.  The file is meant purely as information to
14365 the user.
14366
14367 The format is quite simple; a group name, a tab, and the description.
14368 Here's the definition:
14369
14370 @example
14371 newsgroups    = *line
14372 line          = group tab description <NEWLINE>
14373 group         = <non-white-space string>
14374 tab           = <TAB>
14375 description   = <string>
14376 @end example
14377
14378
14379 @node Emacs for Heathens
14380 @section Emacs for Heathens
14381
14382 Believe it or not, but some people who use Gnus haven't really used
14383 Emacs much before they embarked on their journey on the Gnus Love Boat.
14384 If you are one of those unfortunates whom ``@kbd{M-C-a}'', ``kill the
14385 region'', and ``set @code{gnus-flargblossen} to an alist where the key
14386 is a regexp that is used for matching on the group name'' are magical
14387 phrases with little or no meaning, then this appendix is for you.  If
14388 you are already familiar with Emacs, just ignore this and go fondle your
14389 cat instead.
14390
14391 @menu
14392 * Keystrokes::      Entering text and executing commands.
14393 * Emacs Lisp::      The built-in Emacs programming language.
14394 @end menu
14395
14396
14397 @node Keystrokes
14398 @subsection Keystrokes
14399
14400 @itemize @bullet
14401 @item
14402 Q: What is an experienced Emacs user?
14403
14404 @item 
14405 A: A person who wishes that the terminal had pedals.
14406 @end itemize
14407
14408 Yes, when you use Emacs, you are apt to use the control key, the shift
14409 key and the meta key a lot.  This is very annoying to some people
14410 (notably @code{vi}le users), and the rest of us just love the hell out
14411 of it.  Just give up and submit.  Emacs really does stand for
14412 ``Escape-Meta-Alt-Control-Shift'', and not ``Editing Macros'', as you
14413 may have heard from other disreputable sources (like the Emacs author).
14414
14415 The shift key is normally located near your pinky fingers, and are
14416 normally used to get capital letters and stuff.  You probably use it all
14417 the time.  The control key is normally marked ``CTRL'' or something like
14418 that.  The meta key is, funnily enough, never marked as such on any
14419 keyboards.  The one I'm currently at has a key that's marked ``Alt'',
14420 which is the meta key on this keyboard.  It's usually located somewhere
14421 to the left hand side of the keyboard, usually on the bottom row.
14422
14423 Now, us Emacs people doesn't say ``press the meta-control-m key'',
14424 because that's just too inconvenient.  We say ``press the @kbd{M-C-m}
14425 key''.  @kbd{M-} is the prefix that means ``meta'' and ``C-'' is the
14426 prefix that means ``control''.  So ``press @kbd{C-k}'' means ``press
14427 down the control key, and hold it down while you press @kbd{k}''.
14428 ``Press @kbd{M-C-k}'' means ``press down and hold down the meta key and
14429 the control key and then press @kbd{k}''.  Simple, ay?
14430
14431 This is somewhat complicated by the fact that not all keyboards have a
14432 meta key.  In that case you can use the ``escape'' key.  Then @kbd{M-k}
14433 means ``press escape, release escape, press @kbd{k}''.  That's much more
14434 work than if you have a meta key, so if that's the case, I respectfully
14435 suggest you get a real keyboard with a meta key.  You can't live without
14436 it.
14437
14438
14439
14440 @node Emacs Lisp
14441 @subsection Emacs Lisp
14442
14443 Emacs is the King of Editors because it's really a Lisp interpreter.
14444 Each and every key you tap runs some Emacs Lisp code snippet, and since
14445 Emacs Lisp is an interpreted language, that means that you can configure
14446 any key to run any arbitrary code.  You just, like, do it.
14447
14448 Gnus is written in Emacs Lisp, and is run as a bunch of interpreted
14449 functions.  (These are byte-compiled for speed, but it's still
14450 interpreted.)  If you decide that you don't like the way Gnus does
14451 certain things, it's trivial to have it do something a different way.
14452 (Well, at least if you know how to write Lisp code.)  However, that's
14453 beyond the scope of this manual, so we are simply going to talk about
14454 some common constructs that you normally use in your @file{.emacs} file
14455 to customize Gnus.
14456
14457 If you want to set the variable @code{gnus-florgbnize} to four (4), you
14458 write the following:
14459
14460 @lisp
14461 (setq gnus-florgbnize 4)
14462 @end lisp
14463
14464 This function (really ``special form'') @code{setq} is the one that can
14465 set a variable to some value.  This is really all you need to know.  Now
14466 you can go and fill your @code{.emacs} file with lots of these to change
14467 how Gnus works.
14468
14469 If you have put that thing in your @code{.emacs} file, it will be read
14470 and @code{eval}ed (which is lisp-ese for ``run'') the next time you
14471 start Emacs.  If you want to change the variable right away, simply say
14472 @kbd{C-x C-e} after the closing parenthesis.  That will @code{eval} the
14473 previous ``form'', which here is a simple @code{setq} statement.
14474
14475 Go ahead---just try it, if you're located at your Emacs.  After you
14476 @kbd{C-x C-e}, you will see @samp{4} appear in the echo area, which
14477 is the return value of the form you @code{eval}ed.
14478
14479 Some pitfalls:
14480
14481 If the manual says ``set @code{gnus-read-active-file} to @code{some}'',
14482 that means:
14483
14484 @lisp
14485 (setq gnus-read-active-file 'some)
14486 @end lisp
14487
14488 On the other hand, if the manual says ``set @code{gnus-nntp-server} to
14489 @samp{nntp.ifi.uio.no}'', that means:
14490
14491 @lisp
14492 (setq gnus-nntp-server "nntp.ifi.uio.no")
14493 @end lisp
14494
14495 So be careful not to mix up strings (the latter) with symbols (the
14496 former).  The manual is unambiguous, but it can be confusing.
14497
14498
14499 @include gnus-faq.texi
14500
14501 @node Index
14502 @chapter Index
14503 @printindex cp
14504
14505 @node Key Index
14506 @chapter Key Index
14507 @printindex ky
14508
14509 @summarycontents
14510 @contents
14511 @bye
14512
14513 @iftex
14514 @iflatex
14515 \end{document}
14516 @end iflatex
14517 @end iftex
14518
14519 @c End:
14520